From 1430e0a292679a86e5a100ebf7cfd0a21dc43dfb Mon Sep 17 00:00:00 2001 From: Stefan Eissing Date: Thu, 23 Sep 2021 09:53:01 +0000 Subject: [PATCH] * merging test/modules from trunk git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1893546 13f79535-47bb-0310-9956-ffa450edef68 --- test/modules/http2/.gitignore | 3 + test/modules/http2/Makefile.in | 20 + test/modules/http2/conf/httpd.conf.template | 53 + test/modules/http2/conf/mime.types | 1588 ++++++++++++ test/modules/http2/conf/test.conf | 1 + test/modules/http2/config.ini.in | 29 + test/modules/http2/conftest.py | 52 + .../http2/data/nghttp-output-100k-1.txt | 1153 +++++++++ .../http2/data/nghttp-output-10k-1.txt | 166 ++ .../modules/http2/data/nghttp-output-1k-1.txt | 68 + test/modules/http2/h2_certs.py | 444 ++++ test/modules/http2/h2_conf.py | 147 ++ test/modules/http2/h2_env.py | 608 +++++ test/modules/http2/h2_nghttp.py | 288 +++ test/modules/http2/h2_result.py | 71 + test/modules/http2/htdocs/alive.json | 4 + test/modules/http2/htdocs/cgi/echo.py | 14 + test/modules/http2/htdocs/cgi/echohd.py | 23 + test/modules/http2/htdocs/cgi/env.py | 39 + test/modules/http2/htdocs/cgi/files/empty.txt | 0 test/modules/http2/htdocs/cgi/hecho.py | 46 + test/modules/http2/htdocs/cgi/hello.py | 15 + test/modules/http2/htdocs/cgi/mnot164.py | 21 + test/modules/http2/htdocs/cgi/necho.py | 54 + test/modules/http2/htdocs/cgi/upload.py | 62 + test/modules/http2/htdocs/forbidden.html | 11 + test/modules/http2/htdocs/index.html | 9 + test/modules/http2/htdocs/noh2/alive.json | 5 + test/modules/http2/htdocs/noh2/index.html | 9 + test/modules/http2/htdocs/test1/001.html | 10 + test/modules/http2/htdocs/test1/002.jpg | Bin 0 -> 90364 bytes test/modules/http2/htdocs/test1/003.html | 11 + .../http2/htdocs/test1/003/003_img.jpg | Bin 0 -> 90364 bytes test/modules/http2/htdocs/test1/004.html | 23 + .../http2/htdocs/test1/004/gophertiles.jpg | Bin 0 -> 742 bytes test/modules/http2/htdocs/test1/006.html | 23 + test/modules/http2/htdocs/test1/006/006.css | 21 + test/modules/http2/htdocs/test1/006/006.js | 31 + .../http2/htdocs/test1/006/header.html | 1 + test/modules/http2/htdocs/test1/007.html | 21 + test/modules/http2/htdocs/test1/007/007.py | 29 + test/modules/http2/htdocs/test1/009.py | 21 + test/modules/http2/htdocs/test1/alive.json | 5 + .../htdocs/test1/apache.org-files/ant.jpg | Bin 0 -> 6437 bytes .../test1/apache.org-files/asf_logo.png | Bin 0 -> 29982 bytes .../test1/apache.org-files/async-ads.js | 278 ++ .../test1/apache.org-files/async-ads.js.br | Bin 0 -> 50272 bytes .../htdocs/test1/apache.org-files/cse.js | 0 .../htdocs/test1/apache.org-files/css.css | 0 .../htdocs/test1/apache.org-files/default.css | 676 +++++ .../test1/apache.org-files/defaulten.css | 2284 +++++++++++++++++ .../test1/apache.org-files/defaulten.js | 674 +++++ .../htdocs/test1/apache.org-files/jquery-2.js | 4 + .../htdocs/test1/apache.org-files/jsapi.js | 0 .../htdocs/test1/apache.org-files/min.css | 1 + .../htdocs/test1/apache.org-files/min.css.br | Bin 0 -> 10116 bytes .../htdocs/test1/apache.org-files/mrunit.jpg | Bin 0 -> 4460 bytes .../apache.org-files/search_box_icon.png | Bin 0 -> 1018 bytes .../test1/apache.org-files/small-logo.png | Bin 0 -> 1499 bytes .../htdocs/test1/apache.org-files/styles.css | 131 + .../htdocs/test1/apache.org-files/synapse.jpg | Bin 0 -> 4396 bytes .../http2/htdocs/test1/apache.org.html | 899 +++++++ test/modules/http2/htdocs/test1/index.html | 46 + test/modules/http2/htdocs/test2/alive.json | 4 + test/modules/http2/mod_h2test/mod_h2test.c | 165 ++ test/modules/http2/mod_h2test/mod_h2test.h | 21 + test/modules/http2/test_000_infra.py | 17 + test/modules/http2/test_001_httpd_alive.py | 28 + test/modules/http2/test_002_curl_basics.py | 68 + test/modules/http2/test_003_get.py | 213 ++ test/modules/http2/test_004_post.py | 217 ++ test/modules/http2/test_005_status.py | 70 + test/modules/http2/test_006_assets.py | 74 + test/modules/http2/test_100_conn_reuse.py | 56 + test/modules/http2/test_101_ssl_reneg.py | 126 + test/modules/http2/test_102_require.py | 38 + test/modules/http2/test_103_upgrade.py | 119 + test/modules/http2/test_104_padding.py | 100 + test/modules/http2/test_105_timeout.py | 96 + test/modules/http2/test_106_shutdown.py | 45 + test/modules/http2/test_200_header_invalid.py | 177 ++ .../http2/test_201_header_conditional.py | 69 + test/modules/http2/test_202_trailer.py | 81 + test/modules/http2/test_300_interim.py | 39 + test/modules/http2/test_400_push.py | 199 ++ test/modules/http2/test_401_early_hints.py | 46 + test/modules/http2/test_500_proxy.py | 119 + test/modules/http2/test_600_h2proxy.py | 27 + test/modules/http2/test_700_load_get.py | 54 + .../http2/test_710_load_post_static.py | 62 + test/modules/http2/test_711_load_post_cgi.py | 70 + test/modules/http2/test_712_buffering.py | 175 ++ 92 files changed, 12767 insertions(+) create mode 100644 test/modules/http2/.gitignore create mode 100644 test/modules/http2/Makefile.in create mode 100644 test/modules/http2/conf/httpd.conf.template create mode 100644 test/modules/http2/conf/mime.types create mode 100644 test/modules/http2/conf/test.conf create mode 100644 test/modules/http2/config.ini.in create mode 100644 test/modules/http2/conftest.py create mode 100644 test/modules/http2/data/nghttp-output-100k-1.txt create mode 100644 test/modules/http2/data/nghttp-output-10k-1.txt create mode 100644 test/modules/http2/data/nghttp-output-1k-1.txt create mode 100644 test/modules/http2/h2_certs.py create mode 100644 test/modules/http2/h2_conf.py create mode 100644 test/modules/http2/h2_env.py create mode 100644 test/modules/http2/h2_nghttp.py create mode 100644 test/modules/http2/h2_result.py create mode 100644 test/modules/http2/htdocs/alive.json create mode 100644 test/modules/http2/htdocs/cgi/echo.py create mode 100644 test/modules/http2/htdocs/cgi/echohd.py create mode 100644 test/modules/http2/htdocs/cgi/env.py create mode 100644 test/modules/http2/htdocs/cgi/files/empty.txt create mode 100644 test/modules/http2/htdocs/cgi/hecho.py create mode 100644 test/modules/http2/htdocs/cgi/hello.py create mode 100644 test/modules/http2/htdocs/cgi/mnot164.py create mode 100644 test/modules/http2/htdocs/cgi/necho.py create mode 100644 test/modules/http2/htdocs/cgi/upload.py create mode 100644 test/modules/http2/htdocs/forbidden.html create mode 100644 test/modules/http2/htdocs/index.html create mode 100644 test/modules/http2/htdocs/noh2/alive.json create mode 100644 test/modules/http2/htdocs/noh2/index.html create mode 100644 test/modules/http2/htdocs/test1/001.html create mode 100644 test/modules/http2/htdocs/test1/002.jpg create mode 100644 test/modules/http2/htdocs/test1/003.html create mode 100644 test/modules/http2/htdocs/test1/003/003_img.jpg create mode 100644 test/modules/http2/htdocs/test1/004.html create mode 100644 test/modules/http2/htdocs/test1/004/gophertiles.jpg create mode 100644 test/modules/http2/htdocs/test1/006.html create mode 100644 test/modules/http2/htdocs/test1/006/006.css create mode 100644 test/modules/http2/htdocs/test1/006/006.js create mode 100644 test/modules/http2/htdocs/test1/006/header.html create mode 100644 test/modules/http2/htdocs/test1/007.html create mode 100644 test/modules/http2/htdocs/test1/007/007.py create mode 100644 test/modules/http2/htdocs/test1/009.py create mode 100644 test/modules/http2/htdocs/test1/alive.json create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/ant.jpg create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/async-ads.js create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/async-ads.js.br create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/cse.js create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/css.css create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/default.css create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/defaulten.css create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/defaulten.js create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/jquery-2.js create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/jsapi.js create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/min.css create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/min.css.br create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/mrunit.jpg create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/search_box_icon.png create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/small-logo.png create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/styles.css create mode 100644 test/modules/http2/htdocs/test1/apache.org-files/synapse.jpg create mode 100644 test/modules/http2/htdocs/test1/apache.org.html create mode 100644 test/modules/http2/htdocs/test1/index.html create mode 100644 test/modules/http2/htdocs/test2/alive.json create mode 100644 test/modules/http2/mod_h2test/mod_h2test.c create mode 100644 test/modules/http2/mod_h2test/mod_h2test.h create mode 100644 test/modules/http2/test_000_infra.py create mode 100644 test/modules/http2/test_001_httpd_alive.py create mode 100644 test/modules/http2/test_002_curl_basics.py create mode 100644 test/modules/http2/test_003_get.py create mode 100644 test/modules/http2/test_004_post.py create mode 100644 test/modules/http2/test_005_status.py create mode 100644 test/modules/http2/test_006_assets.py create mode 100644 test/modules/http2/test_100_conn_reuse.py create mode 100644 test/modules/http2/test_101_ssl_reneg.py create mode 100644 test/modules/http2/test_102_require.py create mode 100644 test/modules/http2/test_103_upgrade.py create mode 100644 test/modules/http2/test_104_padding.py create mode 100644 test/modules/http2/test_105_timeout.py create mode 100644 test/modules/http2/test_106_shutdown.py create mode 100644 test/modules/http2/test_200_header_invalid.py create mode 100644 test/modules/http2/test_201_header_conditional.py create mode 100644 test/modules/http2/test_202_trailer.py create mode 100644 test/modules/http2/test_300_interim.py create mode 100644 test/modules/http2/test_400_push.py create mode 100644 test/modules/http2/test_401_early_hints.py create mode 100644 test/modules/http2/test_500_proxy.py create mode 100644 test/modules/http2/test_600_h2proxy.py create mode 100644 test/modules/http2/test_700_load_get.py create mode 100644 test/modules/http2/test_710_load_post_static.py create mode 100644 test/modules/http2/test_711_load_post_cgi.py create mode 100644 test/modules/http2/test_712_buffering.py diff --git a/test/modules/http2/.gitignore b/test/modules/http2/.gitignore new file mode 100644 index 00000000000..d68cd09332f --- /dev/null +++ b/test/modules/http2/.gitignore @@ -0,0 +1,3 @@ +gen +config.ini +__pycache__ diff --git a/test/modules/http2/Makefile.in b/test/modules/http2/Makefile.in new file mode 100644 index 00000000000..15d404d208d --- /dev/null +++ b/test/modules/http2/Makefile.in @@ -0,0 +1,20 @@ + +# no targets: we don't want to build anything by default. if you want the +# test programs, then "make test" +TARGETS = + +bin_PROGRAMS = + +PROGRAM_LDADD = $(EXTRA_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) +PROGRAM_DEPENDENCIES = \ + $(top_srcdir)/srclib/apr-util/libaprutil.la \ + $(top_srcdir)/srclib/apr/libapr.la + +include $(top_builddir)/build/rules.mk + +test: $(bin_PROGRAMS) + +# example for building a test proggie +# dbu_OBJECTS = dbu.lo +# dbu: $(dbu_OBJECTS) +# $(LINK) $(dbu_OBJECTS) $(PROGRAM_LDADD) diff --git a/test/modules/http2/conf/httpd.conf.template b/test/modules/http2/conf/httpd.conf.template new file mode 100644 index 00000000000..bd0606b4025 --- /dev/null +++ b/test/modules/http2/conf/httpd.conf.template @@ -0,0 +1,53 @@ +ServerName localhost +ServerRoot "${server_dir}" + +Include "conf/modules.conf" + +DocumentRoot "${server_dir}/htdocs" + + + LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %k" combined + LogFormat "%h %l %u %t \"%r\" %>s %b" common + CustomLog "logs/access_log" combined + + + +TypesConfig "${gen_dir}/apache/conf/mime.types" + +Listen ${http_port} +Listen ${https_port} + +# Insert our test specific configuration before the first vhost, +# so that its vhosts can be the default one. This is relevant in +# certain behaviours, such as protocol selection during SSL ALPN +# negotiation. +# +Include "conf/test.conf" + +RequestReadTimeout header=10 body=10 + + + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css + + + AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css + + + + ServerName not-forbidden.org + ServerAlias www.not-forbidden.org + + DocumentRoot "${server_dir}/htdocs" + + + + Options Indexes FollowSymLinks + AllowOverride None + Require all granted + + AddHandler cgi-script .py + AddHandler cgi-script .cgi + Options +ExecCGI + + + diff --git a/test/modules/http2/conf/mime.types b/test/modules/http2/conf/mime.types new file mode 100644 index 00000000000..b90b1658761 --- /dev/null +++ b/test/modules/http2/conf/mime.types @@ -0,0 +1,1588 @@ +# This file maps Internet media types to unique file extension(s). +# Although created for httpd, this file is used by many software systems +# and has been placed in the public domain for unlimited redisribution. +# +# The table below contains both registered and (common) unregistered types. +# A type that has no unique extension can be ignored -- they are listed +# here to guide configurations toward known types and to make it easier to +# identify "new" types. File extensions are also commonly used to indicate +# content languages and encodings, so choose them carefully. +# +# Internet media types should be registered as described in RFC 4288. +# The registry is at . +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpp-ims+xml +# application/activemessage +application/andrew-inset ez +# application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomicmail +application/atomsvc+xml atomsvc +# application/auth-policy+xml +# application/batch-smtp +# application/beep+xml +# application/calendar+xml +# application/cals-1840 +# application/ccmp+xml +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cnrp+xml +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csta+xml +# application/cstadata+xml +application/cu-seeme cu +# application/cybercash +application/davmount+xml davmount +# application/dca-rft +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +application/emma+xml emma +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +application/jsonml+json jsonml +# application/kpml-request+xml +# application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +# application/mathml-content+xml +# application/mathml-presentation+xml +application/mathml+xml mathml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media_control+xml +application/mediaservercontrol+xml mscml +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/tve-trigger +# application/ulpfec +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.collection+json +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +application/vnd.ds-keypoint kpxx +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.fints +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +# application/vnd.fujixerox.hbpl +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printing.printticket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.quobject-quoxdocument +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +application/vnd.palm pdb pqa oprc +# application/vnd.paos.xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +# application/vnd.sun.wadl+xml +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.wsc +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +application/x-conference nsc +# application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +application/x-font-woff woff +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info-diff+xml +# application/xcon-conference-info+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/example +# audio/fwdred +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu-wb +# audio/pcmu +# audio/prs.sid +# audio/qcelp +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv0 +# audio/smv-qcp +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.dvb.subtitle sub +image/vnd.djvu djvu djv +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +image/webp webp +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# model/example +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +model/vnd.mts mts +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/directory +# text/dns +# text/ecmascript +# text/enriched +# text/example +# text/fwdred +text/html html htm +# text/javascript +text/n3 n3 +# text/parityfec +text/plain txt text conf def list log in +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/vnd.radisys.msml-basic-layout +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.scurl scurl +text/vnd.curl.mcurl mcurl +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-opml opml +text/x-pascal p pas +text/x-nfo nfo +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raw +# video/rtp-enc-aescm128 +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/test/modules/http2/conf/test.conf b/test/modules/http2/conf/test.conf new file mode 100644 index 00000000000..7534af6c870 --- /dev/null +++ b/test/modules/http2/conf/test.conf @@ -0,0 +1 @@ +# empty placeholder for test specific configurations diff --git a/test/modules/http2/config.ini.in b/test/modules/http2/config.ini.in new file mode 100644 index 00000000000..3135a7ec815 --- /dev/null +++ b/test/modules/http2/config.ini.in @@ -0,0 +1,29 @@ +[global] +curl_bin = curl +nghttp = nghttp +h2load = h2load + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +sbindir = @sbindir@ +libdir = @libdir@ +libexecdir = @libexecdir@ + +apr_bindir = @APR_BINDIR@ +apxs = @bindir@/apxs +apachectl = @sbindir@/apachectl +dso_modules = @DSO_MODULES@ + +[httpd] +version = @HTTPD_VERSION@ +name = @progname@ + +[test] +http_port = 40001 +https_port = 40002 +http_tld = tests.httpd.apache.org +test_dir = @abs_srcdir@ +test_src_dir = @abs_srcdir@ +server_dir = @abs_srcdir@/gen/apache +gen_dir = @abs_srcdir@/gen diff --git a/test/modules/http2/conftest.py b/test/modules/http2/conftest.py new file mode 100644 index 00000000000..2b8bb057f28 --- /dev/null +++ b/test/modules/http2/conftest.py @@ -0,0 +1,52 @@ +import logging +import os + +import pytest + +from h2_certs import CertificateSpec, H2TestCA +from h2_env import H2TestEnv + + +class Dummy: + pass + + +def pytest_report_header(config, startdir): + env = H2TestEnv() + return "mod_h2 [apache: {aversion}({prefix}), mpm: {mpm}]".format( + prefix=env.prefix, + aversion=env.get_httpd_version(), + mpm=env.mpm_type + ) + + +@pytest.fixture(scope="session") +def env(pytestconfig) -> H2TestEnv: + level = logging.INFO + console = logging.StreamHandler() + console.setLevel(level) + console.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) + logging.getLogger('').addHandler(console) + logging.getLogger('').setLevel(level=level) + env = H2TestEnv(pytestconfig=pytestconfig) + env.apache_error_log_clear() + cert_specs = [ + CertificateSpec(domains=env.domains, key_type='rsa4096'), + CertificateSpec(domains=env.domains_noh2, key_type='rsa2048'), + ] + ca = H2TestCA.create_root(name=env.http_tld, + store_dir=os.path.join(env.server_dir, 'ca'), key_type="rsa4096") + ca.issue_certs(cert_specs) + env.set_ca(ca) + return env + + +@pytest.fixture(autouse=True, scope="session") +def _session_scope(env): + yield + assert env.apache_stop() == 0 + errors, warnings = env.apache_errors_and_warnings() + assert (len(errors), len(warnings)) == (0, 0),\ + f"apache logged {len(errors)} errors and {len(warnings)} warnings: \n"\ + "{0}\n{1}\n".format("\n".join(errors), "\n".join(warnings)) + diff --git a/test/modules/http2/data/nghttp-output-100k-1.txt b/test/modules/http2/data/nghttp-output-100k-1.txt new file mode 100644 index 00000000000..1889877e6ec --- /dev/null +++ b/test/modules/http2/data/nghttp-output-100k-1.txt @@ -0,0 +1,1153 @@ +execute: /usr/bin/nghttp -v --header=host: cgi.tests.httpd.apache.org:42002 --data=/home/ylavic/src/apache/mod_h2/test/gen/data-100k https://127.0.0.1:42002//echo.py +stderr: [WARNING] Certificate verification failed: unable to verify the first certificate + +stdout: [ 0.001] Connected +The negotiated protocol: h2 +[ 0.003] send SETTINGS frame + (niv=2) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] + [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] +[ 0.003] send PRIORITY frame + (dep_stream_id=0, weight=201, exclusive=0) +[ 0.003] send PRIORITY frame + (dep_stream_id=0, weight=101, exclusive=0) +[ 0.003] send PRIORITY frame + (dep_stream_id=0, weight=1, exclusive=0) +[ 0.003] send PRIORITY frame + (dep_stream_id=7, weight=1, exclusive=0) +[ 0.003] send PRIORITY frame + (dep_stream_id=3, weight=1, exclusive=0) +[ 0.003] send HEADERS frame + ; END_HEADERS | PRIORITY + (padlen=0, dep_stream_id=11, weight=16, exclusive=0) + ; Open new stream + :method: POST + :path: //echo.py + :scheme: https + :authority: 127.0.0.1:42002 + accept: */* + accept-encoding: gzip, deflate + user-agent: nghttp2/1.36.0 + content-length: 100000 + host: cgi.tests.httpd.apache.org:42002 +[ 0.003] send DATA frame +[ 0.003] send DATA frame +[ 0.003] send DATA frame +[ 0.003] send DATA frame +[ 0.006] recv SETTINGS frame + (niv=1) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] +[ 0.006] recv SETTINGS frame + ; ACK + (niv=0) +[ 0.006] recv WINDOW_UPDATE frame + (window_size_increment=2147418112) +[ 0.006] send SETTINGS frame + ; ACK + (niv=0) +[ 0.007] recv WINDOW_UPDATE frame + (window_size_increment=65535) +[ 0.007] recv WINDOW_UPDATE frame + (window_size_increment=65536) +[ 0.007] send DATA frame +[ 0.007] send DATA frame +[ 0.007] send DATA frame + ; END_STREAM +[ 0.023] recv (stream_id=13) :status: 200 +[ 0.023] recv (stream_id=13) date: Wed, 13 Feb 2019 17:42:49 GMT +[ 0.023] recv (stream_id=13) server: Apache/2.5.1-dev (Unix) OpenSSL/1.1.1a +[ 0.023] recv (stream_id=13) content-type: application/data +[ 0.023] recv HEADERS frame + ; END_HEADERS + (padlen=0) + ; First response header +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.023] recv DATA frame +12345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.023] recv DATA frame +23456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.023] recv DATA frame +34567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123[ 0.023] recv DATA frame +45678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234[ 0.024] recv DATA frame +56789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345[ 0.024] recv DATA frame +67890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456[ 0.024] recv DATA frame +78901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567[ 0.024] recv DATA frame +89012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678[ 0.024] recv DATA frame +90123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789[ 0.024] recv DATA frame +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0[ 0.024] recv DATA frame +12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.025] recv DATA frame +2345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456789012[ 0.025] recv DATA frame +3456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123[ 0.025] recv DATA frame +4567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234[ 0.025] recv DATA frame +5678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345[ 0.025] recv DATA frame +6789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456[ 0.025] recv DATA frame +7890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567[ 0.025] recv DATA frame +8901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678[ 0.025] recv DATA frame +9012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789[ 0.025] recv DATA frame +0123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890[ 0.025] recv DATA frame +1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01[ 0.025] recv DATA frame +2345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012[ 0.025] recv DATA frame +345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123[ 0.025] recv DATA frame +456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.025] recv DATA frame +567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345[ 0.026] recv DATA frame +[ 0.026] send WINDOW_UPDATE frame + (window_size_increment=33566) +[ 0.026] send WINDOW_UPDATE frame + (window_size_increment=33566) +678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456[ 0.026] recv DATA frame +789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567[ 0.026] recv DATA frame +890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678[ 0.026] recv DATA frame +901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789[ 0.026] recv DATA frame +012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890[ 0.026] recv DATA frame +123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901[ 0.026] recv DATA frame +234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012[ 0.026] recv DATA frame +345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123[ 0.026] recv DATA frame +45678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.026] recv DATA frame +56789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345[ 0.026] recv DATA frame +67890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456[ 0.026] recv DATA frame +78901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567[ 0.026] recv DATA frame +89012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678[ 0.026] recv DATA frame +90123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789[ 0.026] recv DATA frame +01234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890[ 0.026] recv DATA frame +12345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901[ 0.026] recv DATA frame +23456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012[ 0.027] recv DATA frame +34567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123[ 0.027] recv DATA frame +45678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234[ 0.027] recv DATA frame +5678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345[ 0.027] recv DATA frame +6789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567890123456[ 0.027] recv DATA frame +7890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678901234567[ 0.027] recv DATA frame +8901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789012345678[ 0.027] recv DATA frame +9012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234567890123456789[ 0.027] recv DATA frame +0123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345678901234[ 0.028] recv DATA frame +5678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012345[ 0.028] recv DATA frame +6789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456789012[ 0.028] send WINDOW_UPDATE frame + (window_size_increment=33260) +[ 0.028] send WINDOW_UPDATE frame + (window_size_increment=33260) +3456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567890123456[ 0.028] recv DATA frame +7890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +01234567[ 0.028] recv DATA frame +8901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678[ 0.028] recv DATA frame + +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789[ 0.028] recv DATA frame +012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.028] recv DATA frame +123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901[ 0.028] recv DATA frame +234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012[ 0.028] recv DATA frame +345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123[ 0.028] recv DATA frame +456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234[ 0.028] recv DATA frame +567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345[ 0.028] recv DATA frame +678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456[ 0.029] recv DATA frame +789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567[ 0.029] recv DATA frame +890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678[ 0.029] recv DATA frame +901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +[ 0.029] recv DATA frame +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.029] recv DATA frame +12345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.029] recv DATA frame +23456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.029] recv DATA frame +34567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123[ 0.029] recv DATA frame +45678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234[ 0.029] recv DATA frame +56789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345[ 0.029] recv DATA frame +67890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456[ 0.029] recv DATA frame +78901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567[ 0.029] recv DATA frame +89012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678[ 0.029] recv DATA frame +90123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789[ 0.029] recv DATA frame +01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0[ 0.029] recv DATA frame +12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +[ 0.029] recv DATA frame + ; END_STREAM +[ 0.029] send GOAWAY frame + (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) + diff --git a/test/modules/http2/data/nghttp-output-10k-1.txt b/test/modules/http2/data/nghttp-output-10k-1.txt new file mode 100644 index 00000000000..fe19b46fbbe --- /dev/null +++ b/test/modules/http2/data/nghttp-output-10k-1.txt @@ -0,0 +1,166 @@ +stderr: [WARNING] Certificate verification failed: unable to verify the first certificate + +stdout: [ 0.002] Connected +The negotiated protocol: h2 +[ 0.004] send SETTINGS frame + (niv=2) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] + [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] +[ 0.004] send PRIORITY frame + (dep_stream_id=0, weight=201, exclusive=0) +[ 0.004] send PRIORITY frame + (dep_stream_id=0, weight=101, exclusive=0) +[ 0.004] send PRIORITY frame + (dep_stream_id=0, weight=1, exclusive=0) +[ 0.004] send PRIORITY frame + (dep_stream_id=7, weight=1, exclusive=0) +[ 0.004] send PRIORITY frame + (dep_stream_id=3, weight=1, exclusive=0) +[ 0.004] send HEADERS frame + ; END_HEADERS | PRIORITY + (padlen=0, dep_stream_id=11, weight=16, exclusive=0) + ; Open new stream + :method: POST + :path: //echo.py + :scheme: https + :authority: 127.0.0.1:42002 + accept: */* + accept-encoding: gzip, deflate + user-agent: nghttp2/1.33.0 + content-length: 10000 + host: cgi.tests.httpd.apache.org:42002 +[ 0.004] send DATA frame + ; END_STREAM +[ 0.005] recv SETTINGS frame + (niv=1) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] +[ 0.005] recv SETTINGS frame + ; ACK + (niv=0) +[ 0.005] recv WINDOW_UPDATE frame + (window_size_increment=2147418112) +[ 0.005] send SETTINGS frame + ; ACK + (niv=0) +[ 0.038] recv (stream_id=13) :status: 200 +[ 0.038] recv (stream_id=13) date: Thu, 14 Feb 2019 11:50:20 GMT +[ 0.038] recv (stream_id=13) server: Apache/2.4.39-dev (Unix) OpenSSL/1.1.1 +[ 0.038] recv (stream_id=13) content-type: application/data +[ 0.038] recv HEADERS frame + ; END_HEADERS + (padlen=0) + ; First response header +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890[ 0.038] recv DATA frame +12345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012345678901[ 0.038] recv DATA frame +23456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123456789012[ 0.038] recv DATA frame +34567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234567890123[ 0.038] recv DATA frame +45678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345678901234[ 0.038] recv DATA frame +56789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +0123456789012345678901234567890123456789012345[ 0.038] recv DATA frame +67890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567[ 0.038] recv DATA frame +890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678[ 0.039] recv DATA frame +901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +[ 0.039] recv DATA frame +[ 0.039] recv DATA frame + ; END_STREAM +[ 0.039] send GOAWAY frame + (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) + diff --git a/test/modules/http2/data/nghttp-output-1k-1.txt b/test/modules/http2/data/nghttp-output-1k-1.txt new file mode 100644 index 00000000000..de9964c7ca2 --- /dev/null +++ b/test/modules/http2/data/nghttp-output-1k-1.txt @@ -0,0 +1,68 @@ +stderr: [WARNING] Certificate verification failed: unable to verify the first certificate + +stdout: [ 0.002] Connected +The negotiated protocol: h2 +[ 0.004] send SETTINGS frame + (niv=2) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] + [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] +[ 0.004] send PRIORITY frame + (dep_stream_id=0, weight=201, exclusive=0) +[ 0.004] send PRIORITY frame + (dep_stream_id=0, weight=101, exclusive=0) +[ 0.004] send PRIORITY frame + (dep_stream_id=0, weight=1, exclusive=0) +[ 0.004] send PRIORITY frame + (dep_stream_id=7, weight=1, exclusive=0) +[ 0.004] send PRIORITY frame + (dep_stream_id=3, weight=1, exclusive=0) +[ 0.004] send HEADERS frame + ; END_HEADERS | PRIORITY + (padlen=0, dep_stream_id=11, weight=16, exclusive=0) + ; Open new stream + :method: POST + :path: //echo.py + :scheme: https + :authority: 127.0.0.1:42002 + accept: */* + accept-encoding: gzip, deflate + user-agent: nghttp2/1.33.0 + content-length: 1000 + host: cgi.tests.httpd.apache.org:42002 +[ 0.004] send DATA frame + ; END_STREAM +[ 0.005] recv SETTINGS frame + (niv=1) + [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] +[ 0.005] recv SETTINGS frame + ; ACK + (niv=0) +[ 0.005] recv WINDOW_UPDATE frame + (window_size_increment=2147418112) +[ 0.005] send SETTINGS frame + ; ACK + (niv=0) +[ 0.048] recv (stream_id=13) :status: 200 +[ 0.048] recv (stream_id=13) date: Thu, 14 Feb 2019 11:48:18 GMT +[ 0.048] recv (stream_id=13) server: Apache/2.4.39-dev (Unix) OpenSSL/1.1.1 +[ 0.048] recv (stream_id=13) content-type: application/data +[ 0.048] recv HEADERS frame + ; END_HEADERS + (padlen=0) + ; First response header +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 +[ 0.048] recv DATA frame +[ 0.048] recv DATA frame + ; END_STREAM +[ 0.048] send GOAWAY frame + (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[]) + diff --git a/test/modules/http2/h2_certs.py b/test/modules/http2/h2_certs.py new file mode 100644 index 00000000000..82c6b5020a4 --- /dev/null +++ b/test/modules/http2/h2_certs.py @@ -0,0 +1,444 @@ +import os +import re +from datetime import timedelta, datetime +from typing import List, Any, Optional + +from cryptography import x509 +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.asymmetric import ec, rsa +from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePrivateKey +from cryptography.hazmat.primitives.asymmetric.rsa import RSAPrivateKey +from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption, load_pem_private_key +from cryptography.x509 import ExtendedKeyUsageOID, NameOID + + +EC_SUPPORTED = {} +EC_SUPPORTED.update([(curve.name.upper(), curve) for curve in [ + ec.SECP192R1, + ec.SECP224R1, + ec.SECP256R1, + ec.SECP384R1, +]]) + + +def _private_key(key_type): + if isinstance(key_type, str): + key_type = key_type.upper() + m = re.match(r'^(RSA)?(\d+)$', key_type) + if m: + key_type = int(m.group(2)) + + if isinstance(key_type, int): + return rsa.generate_private_key( + public_exponent=65537, + key_size=key_type, + backend=default_backend() + ) + if not isinstance(key_type, ec.EllipticCurve) and key_type in EC_SUPPORTED: + key_type = EC_SUPPORTED[key_type] + return ec.generate_private_key( + curve=key_type, + backend=default_backend() + ) + + +class CertificateSpec: + + def __init__(self, name: str = None, domains: List[str] = None, + email: str = None, + key_type: str = None, single_file: bool = False, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + client: bool = False, + sub_specs: List['CertificateSpec'] = None): + self._name = name + self.domains = domains + self.client = client + self.email = email + self.key_type = key_type + self.single_file = single_file + self.valid_from = valid_from + self.valid_to = valid_to + self.sub_specs = sub_specs + + @property + def name(self) -> Optional[str]: + if self._name: + return self._name + elif self.domains: + return self.domains[0] + return None + + +class Credentials: + + def __init__(self, name: str, cert: Any, pkey: Any): + self._name = name + self._cert = cert + self._pkey = pkey + self._cert_file = None + self._pkey_file = None + self._store = None + + @property + def name(self) -> str: + return self._name + + @property + def subject(self) -> x509.Name: + return self._cert.subject + + @property + def key_type(self): + if isinstance(self._pkey, RSAPrivateKey): + return f"rsa{self._pkey.key_size}" + elif isinstance(self._pkey, EllipticCurvePrivateKey): + return f"{self._pkey.curve.name}" + else: + raise Exception(f"unknown key type: {self._pkey}") + + @property + def private_key(self) -> Any: + return self._pkey + + @property + def certificate(self) -> Any: + return self._cert + + @property + def cert_pem(self) -> bytes: + return self._cert.public_bytes(Encoding.PEM) + + @property + def pkey_pem(self) -> bytes: + return self._pkey.private_bytes( + Encoding.PEM, + PrivateFormat.TraditionalOpenSSL if self.key_type.startswith('rsa') else PrivateFormat.PKCS8, + NoEncryption()) + + def set_store(self, store: 'CertStore'): + self._store = store + + def set_files(self, cert_file: str, pkey_file: str = None): + self._cert_file = cert_file + self._pkey_file = pkey_file + + @property + def cert_file(self) -> str: + return self._cert_file + + @property + def pkey_file(self) -> Optional[str]: + return self._pkey_file + + def get_first(self, name) -> Optional['Credentials']: + creds = self._store.get_credentials_for_name(name) if self._store else [] + return creds[0] if len(creds) else None + + def get_credentials_for_name(self, name) -> List['Credentials']: + return self._store.get_credentials_for_name(name) if self._store else [] + + def issue_certs(self, specs: List[CertificateSpec], + chain: List['Credentials'] = None) -> List['Credentials']: + return [self.issue_cert(spec=spec, chain=chain) for spec in specs] + + def issue_cert(self, spec: CertificateSpec, chain: List['Credentials'] = None) -> 'Credentials': + key_type = spec.key_type if spec.key_type else self.key_type + creds = self._store.load_credentials(name=spec.name, key_type=key_type, single_file=spec.single_file) \ + if self._store else None + if creds is None: + creds = H2TestCA.create_credentials(spec=spec, issuer=self, key_type=key_type, + valid_from=spec.valid_from, valid_to=spec.valid_to) + if self._store: + self._store.save(creds, single_file=spec.single_file) + + if spec.sub_specs: + if self._store: + sub_store = CertStore(fpath=os.path.join(self._store.path, creds.name)) + creds.set_store(sub_store) + subchain = chain.copy() if chain else [] + subchain.append(self) + creds.issue_certs(spec.sub_specs, chain=subchain) + return creds + + +class CertStore: + + def __init__(self, fpath: str): + self._store_dir = fpath + if not os.path.exists(self._store_dir): + os.makedirs(self._store_dir) + self._creds_by_name = {} + + @property + def path(self) -> str: + return self._store_dir + + def save(self, creds: Credentials, name: str = None, + chain: List[Credentials] = None, + single_file: bool = False) -> None: + name = name if name is not None else creds.name + cert_file = self.get_cert_file(name=name, key_type=creds.key_type) + pkey_file = self.get_pkey_file(name=name, key_type=creds.key_type) + if single_file: + pkey_file = None + with open(cert_file, "wb") as fd: + fd.write(creds.cert_pem) + if chain: + for c in chain: + fd.write(c.cert_pem) + if pkey_file is None: + fd.write(creds.pkey_pem) + if pkey_file is not None: + with open(pkey_file, "wb") as fd: + fd.write(creds.pkey_pem) + creds.set_files(cert_file, pkey_file) + self._add_credentials(name, creds) + + def _add_credentials(self, name: str, creds: Credentials): + if name not in self._creds_by_name: + self._creds_by_name[name] = [] + self._creds_by_name[name].append(creds) + + def get_credentials_for_name(self, name) -> List[Credentials]: + return self._creds_by_name[name] if name in self._creds_by_name else [] + + def get_cert_file(self, name: str, key_type=None) -> str: + key_infix = ".{0}".format(key_type) if key_type is not None else "" + return os.path.join(self._store_dir, f'{name}{key_infix}.cert.pem') + + def get_pkey_file(self, name: str, key_type=None) -> str: + key_infix = ".{0}".format(key_type) if key_type is not None else "" + return os.path.join(self._store_dir, f'{name}{key_infix}.pkey.pem') + + def load_pem_cert(self, fpath: str) -> x509.Certificate: + with open(fpath) as fd: + return x509.load_pem_x509_certificate("".join(fd.readlines()).encode()) + + def load_pem_pkey(self, fpath: str): + with open(fpath) as fd: + return load_pem_private_key("".join(fd.readlines()).encode(), password=None) + + def load_credentials(self, name: str, key_type=None, single_file: bool = False): + cert_file = self.get_cert_file(name=name, key_type=key_type) + pkey_file = cert_file if single_file else self.get_pkey_file(name=name, key_type=key_type) + if os.path.isfile(cert_file) and os.path.isfile(pkey_file): + cert = self.load_pem_cert(cert_file) + pkey = self.load_pem_pkey(pkey_file) + creds = Credentials(name=name, cert=cert, pkey=pkey) + creds.set_store(self) + creds.set_files(cert_file, pkey_file) + self._add_credentials(name, creds) + return creds + return None + + +class H2TestCA: + + @classmethod + def create_root(cls, name: str, store_dir: str, key_type: str = "rsa2048") -> Credentials: + store = CertStore(fpath=store_dir) + creds = store.load_credentials(name="ca", key_type=key_type) + if creds is None: + creds = H2TestCA._make_ca_credentials(name=name, key_type=key_type) + store.save(creds, name="ca") + creds.set_store(store) + return creds + + @staticmethod + def create_credentials(spec: CertificateSpec, issuer: Credentials, key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + """Create a certificate signed by this CA for the given domains. + :returns: the certificate and private key PEM file paths + """ + if spec.domains and len(spec.domains): + creds = H2TestCA._make_server_credentials(name=spec.name, domains=spec.domains, + issuer=issuer, valid_from=valid_from, + valid_to=valid_to, key_type=key_type) + elif spec.client: + creds = H2TestCA._make_client_credentials(name=spec.name, issuer=issuer, + email=spec.email, valid_from=valid_from, + valid_to=valid_to, key_type=key_type) + elif spec.name: + creds = H2TestCA._make_ca_credentials(name=spec.name, issuer=issuer, + valid_from=valid_from, valid_to=valid_to, + key_type=key_type) + else: + raise Exception(f"unrecognized certificate specification: {spec}") + return creds + + @staticmethod + def _make_x509_name(org_name: str = None, common_name: str = None, parent: x509.Name = None) -> x509.Name: + name_pieces = [] + if org_name: + oid = NameOID.ORGANIZATIONAL_UNIT_NAME if parent else NameOID.ORGANIZATION_NAME + name_pieces.append(x509.NameAttribute(oid, org_name)) + elif common_name: + name_pieces.append(x509.NameAttribute(NameOID.COMMON_NAME, common_name)) + if parent: + name_pieces.extend([rdn for rdn in parent]) + return x509.Name(name_pieces) + + @staticmethod + def _make_csr( + subject: x509.Name, + pkey: Any, + issuer_subject: Optional[Credentials], + valid_from_delta: timedelta = None, + valid_until_delta: timedelta = None + ): + pubkey = pkey.public_key() + issuer_subject = issuer_subject if issuer_subject is not None else subject + + valid_from = datetime.now() + if valid_until_delta is not None: + valid_from += valid_from_delta + valid_until = datetime.now() + if valid_until_delta is not None: + valid_until += valid_until_delta + + return ( + x509.CertificateBuilder() + .subject_name(subject) + .issuer_name(issuer_subject) + .public_key(pubkey) + .not_valid_before(valid_from) + .not_valid_after(valid_until) + .serial_number(x509.random_serial_number()) + .add_extension( + x509.SubjectKeyIdentifier.from_public_key(pubkey), + critical=False, + ) + ) + + @staticmethod + def _add_ca_usages(csr: Any) -> Any: + return csr.add_extension( + x509.BasicConstraints(ca=True, path_length=9), + critical=True, + ).add_extension( + x509.KeyUsage( + digital_signature=True, + content_commitment=False, + key_encipherment=False, + data_encipherment=False, + key_agreement=False, + key_cert_sign=True, + crl_sign=True, + encipher_only=False, + decipher_only=False), + critical=True + ).add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.CLIENT_AUTH, + ExtendedKeyUsageOID.SERVER_AUTH, + ExtendedKeyUsageOID.CODE_SIGNING, + ]), + critical=True + ) + + @staticmethod + def _add_leaf_usages(csr: Any, domains: List[str], issuer: Credentials) -> Any: + return csr.add_extension( + x509.BasicConstraints(ca=False, path_length=None), + critical=True, + ).add_extension( + x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier( + issuer.certificate.extensions.get_extension_for_class( + x509.SubjectKeyIdentifier).value), + critical=False + ).add_extension( + x509.SubjectAlternativeName([x509.DNSName(domain) for domain in domains]), + critical=True, + ).add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.SERVER_AUTH, + ]), + critical=True + ) + + @staticmethod + def _add_client_usages(csr: Any, issuer: Credentials, rfc82name: str = None) -> Any: + cert = csr.add_extension( + x509.BasicConstraints(ca=False, path_length=None), + critical=True, + ).add_extension( + x509.AuthorityKeyIdentifier.from_issuer_subject_key_identifier( + issuer.certificate.extensions.get_extension_for_class( + x509.SubjectKeyIdentifier).value), + critical=False + ) + if rfc82name: + cert.add_extension( + x509.SubjectAlternativeName([x509.RFC822Name(rfc82name)]), + critical=True, + ) + cert.add_extension( + x509.ExtendedKeyUsage([ + ExtendedKeyUsageOID.CLIENT_AUTH, + ]), + critical=True + ) + return cert + + @staticmethod + def _make_ca_credentials(name, key_type: Any, + issuer: Credentials = None, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + pkey = _private_key(key_type=key_type) + if issuer is not None: + issuer_subject = issuer.certificate.subject + issuer_key = issuer.private_key + else: + issuer_subject = None + issuer_key = pkey + subject = H2TestCA._make_x509_name(org_name=name, parent=issuer.subject if issuer else None) + csr = H2TestCA._make_csr(subject=subject, + issuer_subject=issuer_subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = H2TestCA._add_ca_usages(csr) + cert = csr.sign(private_key=issuer_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey) + + @staticmethod + def _make_server_credentials(name: str, domains: List[str], issuer: Credentials, + key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + name = name + pkey = _private_key(key_type=key_type) + subject = H2TestCA._make_x509_name(common_name=name, parent=issuer.subject) + csr = H2TestCA._make_csr(subject=subject, + issuer_subject=issuer.certificate.subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = H2TestCA._add_leaf_usages(csr, domains=domains, issuer=issuer) + cert = csr.sign(private_key=issuer.private_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey) + + @staticmethod + def _make_client_credentials(name: str, + issuer: Credentials, email: Optional[str], + key_type: Any, + valid_from: timedelta = timedelta(days=-1), + valid_to: timedelta = timedelta(days=89), + ) -> Credentials: + pkey = _private_key(key_type=key_type) + subject = H2TestCA._make_x509_name(common_name=name, parent=issuer.subject) + csr = H2TestCA._make_csr(subject=subject, + issuer_subject=issuer.certificate.subject, pkey=pkey, + valid_from_delta=valid_from, valid_until_delta=valid_to) + csr = H2TestCA._add_client_usages(csr, issuer=issuer, rfc82name=email) + cert = csr.sign(private_key=issuer.private_key, + algorithm=hashes.SHA256(), + backend=default_backend()) + return Credentials(name=name, cert=cert, pkey=pkey) diff --git a/test/modules/http2/h2_conf.py b/test/modules/http2/h2_conf.py new file mode 100644 index 00000000000..743ccc8c43c --- /dev/null +++ b/test/modules/http2/h2_conf.py @@ -0,0 +1,147 @@ +import os + + +class HttpdConf(object): + + def __init__(self, env, path=None): + self.env = env + self._lines = [] + self._has_ssl_vhost = False + + def install(self): + if not self._has_ssl_vhost: + self.add_vhost_test1() + self.env.install_test_conf(self._lines) + + def add(self, line): + if isinstance(line, list): + self._lines.extend(line) + else: + self._lines.append(line) + return self + + def add_vhost(self, port, name, aliases=None, doc_root="htdocs", with_ssl=True): + self.start_vhost(port, name, aliases, doc_root, with_ssl) + self.end_vhost() + return self + + def start_vhost(self, port, name, aliases=None, doc_root="htdocs", with_ssl=True): + server_domain = f"{name}.{self.env.http_tld}" + lines = [ + f"", + f" ServerName {server_domain}" + ] + if aliases: + lines.extend([ + f" ServerAlias {alias}.{self.env.http_tld}" for alias in aliases]) + lines.append(f" DocumentRoot {doc_root}") + if with_ssl: + self._has_ssl_vhost = True + lines.append(" SSLEngine on") + for cred in self.env.get_credentials_for_name(server_domain): + lines.extend([ + f"SSLCertificateFile {cred.cert_file}", + f"SSLCertificateKeyFile {cred.pkey_file}", + ]) + return self.add(lines) + + def end_vhost(self): + self.add("") + return self + + def add_proxies(self, host, proxy_self=False, h2proxy_self=False): + if proxy_self or h2proxy_self: + self.add(" ProxyPreserveHost on") + if proxy_self: + self.add(f""" + ProxyPass /proxy/ http://127.0.0.1:{self.env.http_port}/ + ProxyPassReverse /proxy/ http://{host}.{self.env.http_tld}:{self.env.http_port}/ + """) + if h2proxy_self: + self.add(f""" + ProxyPass /h2proxy/ h2://127.0.0.1:{self.env.https_port}/ + ProxyPassReverse /h2proxy/ https://{host}.{self.env.http_tld}:self.env.https_port/ + """) + return self + + def add_vhost_test1(self, proxy_self=False, h2proxy_self=False, extras=None): + domain = f"test1.{self.env.http_tld}" + if extras and 'base' in extras: + self.add(extras['base']) + self.start_vhost( + self.env.http_port, "test1", aliases=["www1"], doc_root="htdocs/test1", with_ssl=False + ).add( + " Protocols h2c http/1.1" + ).end_vhost() + self.start_vhost( + self.env.https_port, "test1", aliases=["www1"], doc_root="htdocs/test1", with_ssl=True) + self.add(f""" + Protocols h2 http/1.1 + + Options +Indexes + HeaderName /006/header.html + + {extras[domain] if extras and domain in extras else ""} + """) + self.add_proxies("test1", proxy_self, h2proxy_self) + self.end_vhost() + return self + + def add_vhost_test2(self): + self.start_vhost(self.env.http_port, "test2", aliases=["www2"], doc_root="htdocs/test2", with_ssl=False) + self.add(" Protocols http/1.1 h2c") + self.end_vhost() + self.start_vhost(self.env.https_port, "test2", aliases=["www2"], doc_root="htdocs/test2", with_ssl=True) + self.add(""" + Protocols http/1.1 h2 + + Options +Indexes + HeaderName /006/header.html + """) + self.end_vhost() + return self + + def add_vhost_cgi(self, proxy_self=False, h2proxy_self=False): + if proxy_self: + self.add_proxy_setup() + if h2proxy_self: + self.add(" SSLProxyEngine on") + self.add(" SSLProxyCheckPeerName off") + self.start_vhost(self.env.https_port, "cgi", aliases=["cgi-alias"], doc_root="htdocs/cgi", with_ssl=True) + self.add(""" + Protocols h2 http/1.1 + SSLOptions +StdEnvVars + AddHandler cgi-script .py + + SetHandler http2-status + """) + self.add_proxies("cgi", proxy_self, h2proxy_self) + self.add(" ") + self.add(" SetHandler h2test-echo") + self.add(" ") + self.end_vhost() + self.start_vhost(self.env.http_port, "cgi", aliases=["cgi-alias"], doc_root="htdocs/cgi", with_ssl=False) + self.add(" AddHandler cgi-script .py") + self.end_vhost() + self.add(" LogLevel proxy:info") + self.add(" LogLevel proxy_http:info") + return self + + def add_vhost_noh2(self): + self.start_vhost(self.env.https_port, "noh2", aliases=["noh2-alias"], doc_root="htdocs/noh2", with_ssl=True) + self.add(f""" + Protocols http/1.1 + SSLOptions +StdEnvVars""") + self.end_vhost() + self.start_vhost(self.env.http_port, "noh2", aliases=["noh2-alias"], doc_root="htdocs/noh2", with_ssl=False) + self.add(" Protocols http/1.1") + self.add(" SSLOptions +StdEnvVars") + self.end_vhost() + return self + + def add_proxy_setup(self): + self.add("ProxyStatus on") + self.add("ProxyTimeout 5") + self.add("SSLProxyEngine on") + self.add("SSLProxyVerify none") + return self diff --git a/test/modules/http2/h2_env.py b/test/modules/http2/h2_env.py new file mode 100644 index 00000000000..ba0c870c67b --- /dev/null +++ b/test/modules/http2/h2_env.py @@ -0,0 +1,608 @@ +import inspect +import logging +import re +import os +import shutil +import stat +import subprocess +import sys +import time +from datetime import datetime, timedelta +from string import Template +from typing import List + +import requests + +from configparser import ConfigParser, ExtendedInterpolation +from urllib.parse import urlparse + +from h2_certs import Credentials +from h2_nghttp import Nghttp +from h2_result import ExecResult + + +log = logging.getLogger(__name__) + + +class Dummy: + pass + + +class H2TestSetup: + + # the modules we want to load + MODULES = [ + "log_config", + "logio", + "unixd", + "version", + "watchdog", + "authn_core", + "authz_host", + "authz_groupfile", + "authz_user", + "authz_core", + "access_compat", + "auth_basic", + "cache", + "cache_disk", + "cache_socache", + "socache_shmcb", + "dumpio", + "reqtimeout", + "filter", + "mime", + "env", + "headers", + "setenvif", + "slotmem_shm", + "ssl", + "status", + "autoindex", + "cgid", + "dir", + "alias", + "rewrite", + "deflate", + "proxy", + "proxy_http", + "proxy_balancer", + "proxy_hcheck", + ] + + def __init__(self, env: 'H2TestEnv'): + self.env = env + + def make(self): + self._make_dirs() + self._make_conf() + self._make_htdocs() + self._make_h2test() + self._make_modules_conf() + + def _make_dirs(self): + if os.path.exists(self.env.gen_dir): + shutil.rmtree(self.env.gen_dir) + os.makedirs(self.env.gen_dir) + if not os.path.exists(self.env.server_logs_dir): + os.makedirs(self.env.server_logs_dir) + + def _make_conf(self): + conf_src_dir = os.path.join(self.env.test_dir, 'conf') + conf_dest_dir = os.path.join(self.env.server_dir, 'conf') + if not os.path.exists(conf_dest_dir): + os.makedirs(conf_dest_dir) + for name in os.listdir(conf_src_dir): + src_path = os.path.join(conf_src_dir, name) + m = re.match(r'(.+).template', name) + if m: + self._make_template(src_path, os.path.join(conf_dest_dir, m.group(1))) + elif os.path.isfile(src_path): + shutil.copy(src_path, os.path.join(conf_dest_dir, name)) + + def _make_template(self, src, dest): + var_map = dict() + for name, value in self.env.__class__.__dict__.items(): + if isinstance(value, property): + var_map[name] = value.fget(self.env) + t = Template(''.join(open(src).readlines())) + with open(dest, 'w') as fd: + fd.write(t.substitute(var_map)) + + def _make_htdocs(self): + if not os.path.exists(self.env.server_docs_dir): + os.makedirs(self.env.server_docs_dir) + shutil.copytree(os.path.join(self.env.test_dir, 'htdocs'), + os.path.join(self.env.server_dir, 'htdocs'), + dirs_exist_ok=True) + cgi_dir = os.path.join(self.env.server_dir, 'htdocs/cgi') + for name in os.listdir(cgi_dir): + if re.match(r'.+\.py', name): + cgi_file = os.path.join(cgi_dir, name) + st = os.stat(cgi_file) + os.chmod(cgi_file, st.st_mode | stat.S_IEXEC) + + def _make_h2test(self): + subprocess.run([self.env.apxs, '-c', 'mod_h2test.c'], + capture_output=True, check=True, + cwd=os.path.join(self.env.test_dir, 'mod_h2test')) + + def _make_modules_conf(self): + modules_conf = os.path.join(self.env.server_dir, 'conf/modules.conf') + with open(modules_conf, 'w') as fd: + # issue load directives for all modules we want that are shared + for m in self.MODULES: + mod_path = os.path.join(self.env.libexec_dir, f"mod_{m}.so") + if os.path.isfile(mod_path): + fd.write(f"LoadModule {m}_module \"{mod_path}\"\n") + for m in ["http2", "proxy_http2"]: + fd.write(f"LoadModule {m}_module \"{self.env.libexec_dir}/mod_{m}.so\"\n") + # load our test module which is not installed + fd.write(f"LoadModule h2test_module \"{self.env.test_dir}/mod_h2test/.libs/mod_h2test.so\"\n") + + +class H2TestEnv: + + def __init__(self, pytestconfig=None): + our_dir = os.path.dirname(inspect.getfile(Dummy)) + self.config = ConfigParser(interpolation=ExtendedInterpolation()) + self.config.read(os.path.join(our_dir, 'config.ini')) + + self._apxs = self.config.get('global', 'apxs') + self._prefix = self.config.get('global', 'prefix') + self._apachectl = self.config.get('global', 'apachectl') + self._libexec_dir = self.get_apxs_var('LIBEXECDIR') + + self._curl = self.config.get('global', 'curl_bin') + self._nghttp = self.config.get('global', 'nghttp') + self._h2load = self.config.get('global', 'h2load') + self._ca = None + + self._http_port = int(self.config.get('test', 'http_port')) + self._https_port = int(self.config.get('test', 'https_port')) + self._http_tld = self.config.get('test', 'http_tld') + self._test_dir = self.config.get('test', 'test_dir') + self._test_src_dir = self.config.get('test', 'test_src_dir') + self._gen_dir = self.config.get('test', 'gen_dir') + self._server_dir = os.path.join(self._gen_dir, 'apache') + self._server_conf_dir = os.path.join(self._server_dir, "conf") + self._server_docs_dir = os.path.join(self._server_dir, "htdocs") + self._server_logs_dir = os.path.join(self.server_dir, "logs") + self._server_error_log = os.path.join(self._server_logs_dir, "error_log") + + self._dso_modules = self.config.get('global', 'dso_modules').split(' ') + self._domains = [ + f"test1.{self._http_tld}", + f"test2.{self._http_tld}", + f"test3.{self._http_tld}", + f"cgi.{self._http_tld}", + f"push.{self._http_tld}", + f"hints.{self._http_tld}", + f"ssl.{self._http_tld}", + f"pad0.{self._http_tld}", + f"pad1.{self._http_tld}", + f"pad2.{self._http_tld}", + f"pad3.{self._http_tld}", + f"pad8.{self._http_tld}", + ] + self._domains_noh2 = [ + f"noh2.{self._http_tld}", + ] + self._mpm_type = os.environ['MPM'] if 'MPM' in os.environ else 'event' + + self._httpd_addr = "127.0.0.1" + self._http_base = f"http://{self._httpd_addr}:{self.http_port}" + self._https_base = f"https://{self._httpd_addr}:{self.https_port}" + + self._test_conf = os.path.join(self._server_conf_dir, "test.conf") + self._httpd_base_conf = f""" + LoadModule mpm_{self.mpm_type}_module \"{self.libexec_dir}/mod_mpm_{self.mpm_type}.so\" + H2MinWorkers 1 + H2MaxWorkers 64 + SSLSessionCache "shmcb:ssl_gcache_data(32000)" + """ + py_verbosity = pytestconfig.option.verbose if pytestconfig is not None else 0 + if py_verbosity >= 2: + self._httpd_base_conf += f""" + LogLevel http2:trace2 proxy_http2:info + LogLevel core:trace5 mpm_{self.mpm_type}:trace5 + """ + if py_verbosity >= 1: + self._httpd_base_conf += "LogLevel http2:debug proxy_http2:debug" + else: + self._httpd_base_conf += "LogLevel http2:info proxy_http2:info" + + self._verify_certs = False + self._setup = H2TestSetup(env=self) + self._setup.make() + + @property + def apxs(self) -> str: + return self._apxs + + @property + def prefix(self) -> str: + return self._prefix + + @property + def mpm_type(self) -> str: + return self._mpm_type + + @property + def http_port(self) -> int: + return self._http_port + + @property + def https_port(self) -> int: + return self._https_port + + @property + def http_tld(self) -> str: + return self._http_tld + + @property + def domain_test1(self) -> str: + return self._domains[0] + + @property + def domains(self) -> List[str]: + return self._domains + + @property + def domains_noh2(self) -> List[str]: + return self._domains_noh2 + + @property + def http_base_url(self) -> str: + return self._http_base + + @property + def https_base_url(self) -> str: + return self._https_base + + @property + def gen_dir(self) -> str: + return self._gen_dir + + @property + def test_dir(self) -> str: + return self._test_dir + + @property + def test_src_dir(self) -> str: + return self._test_src_dir + + @property + def server_dir(self) -> str: + return self._server_dir + + @property + def server_logs_dir(self) -> str: + return self._server_logs_dir + + @property + def libexec_dir(self) -> str: + return self._libexec_dir + + @property + def dso_modules(self) -> List[str]: + return self._dso_modules + + @property + def server_conf_dir(self) -> str: + return self._server_conf_dir + + @property + def server_docs_dir(self) -> str: + return self._server_docs_dir + + @property + def httpd_base_conf(self) -> str: + return self._httpd_base_conf + + @property + def h2load(self) -> str: + return self._h2load + + @property + def ca(self) -> Credentials: + return self._ca + + def set_ca(self, ca: Credentials): + self._ca = ca + + def get_credentials_for_name(self, dns_name) -> List['Credentials']: + for domains in [self._domains, self._domains_noh2]: + if dns_name in domains: + return self.ca.get_credentials_for_name(domains[0]) + return [] + + def has_h2load(self): + return self._h2load != "" + + def has_nghttp(self): + return self._nghttp != "" + + def has_nghttp_get_assets(self): + if not self.has_nghttp(): + return False + args = [self._nghttp, "-a"] + p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + rv = p.returncode + if rv != 0: + return False + return p.stderr == "" + + def get_apxs_var(self, name: str) -> str: + p = subprocess.run([self._apxs, "-q", name], capture_output=True, text=True) + if p.returncode != 0: + return "" + return p.stdout.strip() + + def get_httpd_version(self) -> str: + return self.get_apxs_var("HTTPD_VERSION") + + def mkpath(self, path): + if not os.path.exists(path): + return os.makedirs(path) + + def test_src(self, path): + return os.path.join(self._test_src_dir, path) + + def run(self, args) -> ExecResult: + log.debug("execute: %s", " ".join(args)) + start = datetime.now() + p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + return ExecResult(exit_code=p.returncode, stdout=p.stdout, stderr=p.stderr, + duration=datetime.now() - start) + + def mkurl(self, scheme, hostname, path='/'): + port = self.https_port if scheme == 'https' else self.http_port + return "%s://%s.%s:%s%s" % (scheme, hostname, self.http_tld, port, path) + + def install_test_conf(self, conf: List[str]): + with open(self._test_conf, 'w') as fd: + fd.write(f"{self.httpd_base_conf}\n") + for line in conf: + fd.write(f"{line}\n") + + def is_live(self, url, timeout: timedelta = None): + s = requests.Session() + if not timeout: + timeout = timedelta(seconds=10) + try_until = datetime.now() + timeout + log.debug("checking reachability of %s", url) + while datetime.now() < try_until: + try: + req = requests.Request('HEAD', url).prepare() + s.send(req, verify=self._verify_certs, timeout=timeout.total_seconds()) + return True + except IOError: + log.debug("connect error: %s", sys.exc_info()[0]) + time.sleep(.2) + except: + log.warning("Unexpected error: %s", sys.exc_info()[0]) + time.sleep(.2) + log.debug(f"Unable to contact '{url}' after {timeout} sec") + return False + + def is_dead(self, url, timeout: timedelta = None): + s = requests.Session() + if not timeout: + timeout = timedelta(seconds=10) + try_until = datetime.now() + timeout + log.debug("checking reachability of %s", url) + while datetime.now() < try_until: + try: + req = requests.Request('HEAD', url).prepare() + s.send(req, verify=self._verify_certs, timeout=int(timeout.total_seconds())) + time.sleep(.2) + except IOError as ex: + return True + log.debug("Server still responding after %d sec", timeout) + return False + + def _run_apachectl(self, cmd): + args = [self._apachectl, + "-d", self.server_dir, + "-f", os.path.join(self._server_dir, 'conf/httpd.conf'), + "-k", cmd] + log.debug("execute: %s", " ".join(args)) + p = subprocess.run(args, capture_output=True, text=True) + rv = p.returncode + if rv != 0: + log.warning(f"exit {rv}, stdout: {p.stdout}, stderr: {p.stderr}") + return rv + + def apache_reload(self): + rv = self._run_apachectl("graceful") + if rv == 0: + timeout = timedelta(seconds=10) + rv = 0 if self.is_live(self._http_base, timeout=timeout) else -1 + return rv + + def apache_restart(self): + rv = self.apache_stop() + rv = self._run_apachectl("start") + if rv == 0: + timeout = timedelta(seconds=10) + rv = 0 if self.is_live(self._http_base, timeout=timeout) else -1 + return rv + + def apache_stop(self): + rv = self._run_apachectl("stop") + if rv == 0: + timeout = timedelta(seconds=10) + rv = 0 if self.is_dead(self._http_base, timeout=timeout) else -1 + log.debug("waited for a apache.is_dead, rv=%d", rv) + return rv + + def apache_error_log_clear(self): + if os.path.isfile(self._server_error_log): + os.remove(self._server_error_log) + + RE_APLOGNO = re.compile(r'.*\[(?P[^:]+):(error|warn)].* (?PAH\d+): .+') + RE_SSL_LIB_ERR = re.compile(r'.*\[ssl:error].* SSL Library Error: error:(?P\S+):.+') + RE_ERRLOG_ERROR = re.compile(r'.*\[(?P[^:]+):error].*') + RE_ERRLOG_WARN = re.compile(r'.*\[(?P[^:]+):warn].*') + + def apache_errors_and_warnings(self): + errors = [] + warnings = [] + + if os.path.isfile(self._server_error_log): + for line in open(self._server_error_log): + m = self.RE_APLOGNO.match(line) + if m and m.group('aplogno') in [ + 'AH02032', + 'AH01276', + 'AH01630', + 'AH00135', + 'AH02261', # Re-negotiation handshake failed (our test_101 + ]: + # we know these happen normally in our tests + continue + m = self.RE_SSL_LIB_ERR.match(line) + if m and m.group('errno') in [ + '1417A0C1', # cipher suite mismatch, test_101 + '1417C0C7', # client cert not accepted, test_101 + ]: + # we know these happen normally in our tests + continue + m = self.RE_ERRLOG_ERROR.match(line) + if m and m.group('module') not in ['cgid']: + errors.append(line) + continue + m = self.RE_ERRLOG_WARN.match(line) + if m: + warnings.append(line) + continue + return errors, warnings + + def curl_complete_args(self, urls, timeout, options): + if not isinstance(urls, list): + urls = [urls] + u = urlparse(urls[0]) + assert u.hostname, f"hostname not in url: {urls[0]}" + assert u.port, f"port not in url: {urls[0]}" + headerfile = ("%s/curl.headers" % self.gen_dir) + if os.path.isfile(headerfile): + os.remove(headerfile) + + args = [ + self._curl, + "--cacert", self.ca.cert_file, + "-s", "-D", headerfile, + "--resolve", ("%s:%s:%s" % (u.hostname, u.port, self._httpd_addr)), + "--connect-timeout", ("%d" % timeout) + ] + if options: + args.extend(options) + args += urls + return args, headerfile + + def curl_raw(self, urls, timeout, options): + args, headerfile = self.curl_complete_args(urls, timeout, options) + r = self.run(args) + if r.exit_code == 0: + lines = open(headerfile).readlines() + exp_stat = True + header = {} + for line in lines: + if exp_stat: + log.debug("reading 1st response line: %s", line) + m = re.match(r'^(\S+) (\d+) (.*)$', line) + assert m + r.add_response({ + "protocol": m.group(1), + "status": int(m.group(2)), + "description": m.group(3), + "body": r.outraw + }) + exp_stat = False + header = {} + elif re.match(r'^$', line): + exp_stat = True + else: + log.debug("reading header line: %s", line) + m = re.match(r'^([^:]+):\s*(.*)$', line) + assert m + header[m.group(1).lower()] = m.group(2) + r.response["header"] = header + if r.json: + r.response["json"] = r.json + return r + + def curl_get(self, url, timeout=5, options=None): + return self.curl_raw([url], timeout=timeout, options=options) + + def curl_upload(self, url, fpath, timeout=5, options=None): + if not options: + options = [] + options.extend([ + "--form", ("file=@%s" % fpath) + ]) + return self.curl_raw([url], timeout, options) + + def curl_post_data(self, url, data="", timeout=5, options=None): + if not options: + options = [] + options.extend(["--data", "%s" % data]) + return self.curl_raw(url, timeout, options) + + def curl_post_value(self, url, key, value, timeout=5, options=None): + if not options: + options = [] + options.extend(["--form", "{0}={1}".format(key, value)]) + return self.curl_raw(url, timeout, options) + + def curl_protocol_version(self, url, timeout=5, options=None): + if not options: + options = [] + options.extend(["-w", "%{http_version}\n", "-o", "/dev/null"]) + r = self.curl_raw(url, timeout=timeout, options=options) + if r.exit_code == 0 and r.response: + return r.response["body"].decode('utf-8').rstrip() + return -1 + + def nghttp(self): + return Nghttp(self._nghttp, connect_addr=self._httpd_addr, tmp_dir=self.gen_dir) + + def h2load_status(self, run: ExecResult): + stats = {} + m = re.search( + r'requests: (\d+) total, (\d+) started, (\d+) done, (\d+) succeeded' + r', (\d+) failed, (\d+) errored, (\d+) timeout', run.stdout) + if m: + stats["requests"] = { + "total": int(m.group(1)), + "started": int(m.group(2)), + "done": int(m.group(3)), + "succeeded": int(m.group(4)) + } + m = re.search(r'status codes: (\d+) 2xx, (\d+) 3xx, (\d+) 4xx, (\d+) 5xx', + run.stdout) + if m: + stats["status"] = { + "2xx": int(m.group(1)), + "3xx": int(m.group(2)), + "4xx": int(m.group(3)), + "5xx": int(m.group(4)) + } + run.add_results({"h2load": stats}) + return run + + def setup_data_1k_1m(self): + s100 = "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\n" + with open(os.path.join(self.gen_dir, "data-1k"), 'w') as f: + for i in range(10): + f.write(s100) + with open(os.path.join(self.gen_dir, "data-10k"), 'w') as f: + for i in range(100): + f.write(s100) + with open(os.path.join(self.gen_dir, "data-100k"), 'w') as f: + for i in range(1000): + f.write(s100) + with open(os.path.join(self.gen_dir, "data-1m"), 'w') as f: + for i in range(10000): + f.write(s100) diff --git a/test/modules/http2/h2_nghttp.py b/test/modules/http2/h2_nghttp.py new file mode 100644 index 00000000000..d06798e868e --- /dev/null +++ b/test/modules/http2/h2_nghttp.py @@ -0,0 +1,288 @@ +import re +import os +import subprocess +from datetime import datetime +from typing import Dict + +from urllib.parse import urlparse + +from h2_result import ExecResult + + +def _get_path(x): + return x["path"] + + +class Nghttp: + + def __init__(self, path, connect_addr=None, tmp_dir="/tmp"): + self.NGHTTP = path + self.CONNECT_ADDR = connect_addr + self.TMP_DIR = tmp_dir + + @staticmethod + def get_stream(streams, sid): + sid = int(sid) + if sid not in streams: + streams[sid] = { + "id": sid, + "header": {}, + "request": { + "id": sid, + "body": b'' + }, + "response": { + "id": sid, + "body": b'' + }, + "paddings": [], + "promises": [] + } + return streams[sid] if sid in streams else None + + def run(self, urls, timeout, options): + return self._baserun(urls, timeout, options) + + def complete_args(self, url, _timeout, options: [str]) -> [str]: + if not isinstance(url, list): + url = [url] + u = urlparse(url[0]) + args = [self.NGHTTP] + if self.CONNECT_ADDR: + connect_host = self.CONNECT_ADDR + args.append("--header=host: %s:%s" % (u.hostname, u.port)) + else: + connect_host = u.hostname + if options: + args.extend(options) + for xurl in url: + xu = urlparse(xurl) + nurl = "%s://%s:%s/%s" % (u.scheme, connect_host, xu.port, xu.path) + if xu.query: + nurl = "%s?%s" % (nurl, xu.query) + args.append(nurl) + return args + + def _baserun(self, url, timeout, options): + return self._run(self.complete_args(url, timeout, options)) + + def parse_output(self, btext) -> Dict: + # getting meta data and response body out of nghttp's output + # is a bit tricky. Without '-v' we just get the body. With '-v' meta + # data and timings in both directions are listed. + # We rely on response :status: to be unique and on + # response body not starting with space. + # Something not good enough for general purpose, but for these tests. + output = {} + body = '' + streams = {} + skip_indents = True + # chunk output into lines. nghttp mixes text + # meta output with bytes from the response body. + lines = [l.decode() for l in btext.split(b'\n')] + for lidx, l in enumerate(lines): + if len(l) == 0: + body += '\n' + continue + m = re.match(r'\[.*] recv \(stream_id=(\d+)\) (\S+): (\S*)', l) + if m: + s = self.get_stream(streams, m.group(1)) + hname = m.group(2) + hval = m.group(3) + print("stream %d header %s: %s" % (s["id"], hname, hval)) + header = s["header"] + if hname in header: + header[hname] += ", %s" % hval + else: + header[hname] = hval + body = '' + continue + + m = re.match(r'\[.*] recv HEADERS frame <.* stream_id=(\d+)>', l) + if m: + s = self.get_stream(streams, m.group(1)) + if s: + print("stream %d: recv %d header" % (s["id"], len(s["header"]))) + response = s["response"] + hkey = "header" + if "header" in response: + h = response["header"] + if ":status" in h and int(h[":status"]) >= 200: + hkey = "trailer" + else: + prev = { + "header": h + } + if "previous" in response: + prev["previous"] = response["previous"] + response["previous"] = prev + response[hkey] = s["header"] + s["header"] = {} + body = '' + continue + + m = re.match(r'(.*)\[.*] recv DATA frame ', l) + if m: + s = self.get_stream(streams, m.group(3)) + body += m.group(1) + blen = int(m.group(2)) + if s: + print("stream %d: %d DATA bytes added" % (s["id"], blen)) + padlen = 0 + if len(lines) > lidx + 2: + mpad = re.match(r' +\(padlen=(\d+)\)', lines[lidx+2]) + if mpad: + padlen = int(mpad.group(1)) + s["paddings"].append(padlen) + blen -= padlen + s["response"]["body"] += body[-blen:].encode() + body = '' + skip_indents = True + continue + + m = re.match(r'\[.*] recv PUSH_PROMISE frame <.* stream_id=(\d+)>', l) + if m: + s = self.get_stream(streams, m.group(1)) + if s: + # headers we have are request headers for the PUSHed stream + # these have been received on the originating stream, the promised + # stream id it mentioned in the following lines + print("stream %d: %d PUSH_PROMISE header" % (s["id"], len(s["header"]))) + if len(lines) > lidx+2: + m2 = re.match(r'\s+\(.*promised_stream_id=(\d+)\)', lines[lidx+2]) + if m2: + s2 = self.get_stream(streams, m2.group(1)) + s2["request"]["header"] = s["header"] + s["promises"].append(s2) + s["header"] = {} + continue + + m = re.match(r'(.*)\[.*] recv (\S+) frame ', l) + if m: + print("recv frame %s on stream %s" % (m.group(2), m.group(4))) + body += m.group(1) + skip_indents = True + continue + + m = re.match(r'(.*)\[.*] send (\S+) frame ', l) + if m: + print("send frame %s on stream %s" % (m.group(2), m.group(4))) + body += m.group(1) + skip_indents = True + continue + + if skip_indents and l.startswith(' '): + continue + + if '[' != l[0]: + skip_indents = None + body += l + '\n' + + # the main request is done on the lowest odd numbered id + main_stream = 99999999999 + for sid in streams: + s = streams[sid] + if ":status" in s["response"]["header"]: + s["response"]["status"] = int(s["response"]["header"][":status"]) + if (sid % 2) == 1 and sid < main_stream: + main_stream = sid + + output["streams"] = streams + if main_stream in streams: + output["response"] = streams[main_stream]["response"] + output["paddings"] = streams[main_stream]["paddings"] + return output + + def _raw(self, url, timeout, options): + args = ["-v"] + if options: + args.extend(options) + r = self._baserun(url, timeout, args) + if 0 == r.exit_code: + r.add_results(self.parse_output(r.outraw)) + return r + + def get(self, url, timeout=5, options=None): + return self._raw(url, timeout, options) + + def assets(self, url, timeout=5, options=None): + if not options: + options = [] + options.extend(["-ans"]) + r = self._baserun(url, timeout, options) + assets = [] + if 0 == r.exit_code: + lines = re.findall(r'[^\n]*\n', r.stdout, re.MULTILINE) + for lidx, l in enumerate(lines): + m = re.match(r'\s*(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+/(.*)', l) + if m: + assets.append({ + "path": m.group(7), + "status": int(m.group(5)), + "size": m.group(6) + }) + assets.sort(key=_get_path) + r.add_assets(assets) + return r + + def post_data(self, url, data, timeout=5, options=None): + reqbody = ("%s/nghttp.req.body" % self.TMP_DIR) + with open(reqbody, 'wb') as f: + f.write(data.encode('utf-8')) + if not options: + options = [] + options.extend(["--data=%s" % reqbody]) + return self._raw(url, timeout, options) + + def post_name(self, url, name, timeout=5, options=None): + reqbody = ("%s/nghttp.req.body" % self.TMP_DIR) + with open(reqbody, 'w') as f: + f.write("--DSAJKcd9876\n") + f.write("Content-Disposition: form-data; name=\"value\"; filename=\"xxxxx\"\n") + f.write("Content-Type: text/plain\n") + f.write("\n%s\n" % name) + f.write("--DSAJKcd9876\n") + if not options: + options = [] + options.extend(["--data=%s" % reqbody]) + return self._raw(url, timeout, options) + + def upload(self, url, fpath, timeout=5, options=None): + if not options: + options = [] + options.extend(["--data=%s" % fpath]) + return self._raw(url, timeout, options) + + def upload_file(self, url, fpath, timeout=5, options=None): + fname = os.path.basename(fpath) + reqbody = ("%s/nghttp.req.body" % self.TMP_DIR) + with open(fpath, 'rb') as fin: + with open(reqbody, 'wb') as f: + f.write(("""--DSAJKcd9876 +Content-Disposition: form-data; name="xxx"; filename="xxxxx" +Content-Type: text/plain + +testing mod_h2 +--DSAJKcd9876 +Content-Disposition: form-data; name="file"; filename="%s" +Content-Type: application/octet-stream +Content-Transfer-Encoding: binary + +""" % fname).encode('utf-8')) + f.write(fin.read()) + f.write(""" +--DSAJKcd9876""".encode('utf-8')) + if not options: + options = [] + options.extend([ + "--data=%s" % reqbody, + "--expect-continue", + "-HContent-Type: multipart/form-data; boundary=DSAJKcd9876"]) + return self._raw(url, timeout, options) + + def _run(self, args) -> ExecResult: + print(("execute: %s" % " ".join(args))) + start = datetime.now() + p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + return ExecResult(exit_code=p.returncode, stdout=p.stdout, stderr=p.stderr, + duration=datetime.now() - start) diff --git a/test/modules/http2/h2_result.py b/test/modules/http2/h2_result.py new file mode 100644 index 00000000000..06fc9e53004 --- /dev/null +++ b/test/modules/http2/h2_result.py @@ -0,0 +1,71 @@ +import json +from datetime import timedelta +from typing import Optional, Dict, List + + +class ExecResult: + + def __init__(self, exit_code: int, stdout: bytes, stderr: bytes = None, duration: timedelta = None): + self._exit_code = exit_code + self._raw = stdout if stdout else b'' + self._stdout = stdout.decode() if stdout is not None else "" + self._stderr = stderr.decode() if stderr is not None else "" + self._duration = duration if duration is not None else timedelta() + self._response = None + self._results = {} + self._assets = [] + # noinspection PyBroadException + try: + self._json_out = json.loads(self._stdout) + except: + self._json_out = None + + @property + def exit_code(self) -> int: + return self._exit_code + + @property + def outraw(self) -> bytes: + return self._raw + + @property + def stdout(self) -> str: + return self._stdout + + @property + def json(self) -> Optional[Dict]: + """Output as JSON dictionary or None if not parseable.""" + return self._json_out + + @property + def stderr(self) -> str: + return self._stderr + + @property + def duration(self) -> timedelta: + return self._duration + + @property + def response(self) -> Optional[Dict]: + return self._response + + @property + def results(self) -> Dict: + return self._results + + @property + def assets(self) -> List: + return self._assets + + def add_response(self, resp: Dict): + if self._response: + resp['previous'] = self._response + self._response = resp + + def add_results(self, results: Dict): + self._results.update(results) + if 'response' in results: + self.add_response(results['response']) + + def add_assets(self, assets: List): + self._assets.extend(assets) diff --git a/test/modules/http2/htdocs/alive.json b/test/modules/http2/htdocs/alive.json new file mode 100644 index 00000000000..2239ee2ee7b --- /dev/null +++ b/test/modules/http2/htdocs/alive.json @@ -0,0 +1,4 @@ +{ + "host" : "generic", + "alive" : true +} diff --git a/test/modules/http2/htdocs/cgi/echo.py b/test/modules/http2/htdocs/cgi/echo.py new file mode 100644 index 00000000000..5ffe6ed8230 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/echo.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +import sys, cgi, os + +status = '200 Ok' + +content = '' +for line in sys.stdin: + content += line + +# Just echo what we get +print("Status: 200") +print("Content-Type: application/data\n") +sys.stdout.write(content) + diff --git a/test/modules/http2/htdocs/cgi/echohd.py b/test/modules/http2/htdocs/cgi/echohd.py new file mode 100644 index 00000000000..371ae8b0f7a --- /dev/null +++ b/test/modules/http2/htdocs/cgi/echohd.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +import cgi, os +import cgitb; cgitb.enable() + +status = '200 Ok' + +form = cgi.FieldStorage() +name = form.getvalue('name') + +if name: + print("Status: 200") + print("""\ +Content-Type: text/plain\n""") + print("""%s: %s""" % (name, os.environ['HTTP_'+name])) +else: + print("Status: 400 Parameter Missing") + print("""\ +Content-Type: text/html\n + +

No name was specified

+""") + + diff --git a/test/modules/http2/htdocs/cgi/env.py b/test/modules/http2/htdocs/cgi/env.py new file mode 100644 index 00000000000..5c9c0b1adbc --- /dev/null +++ b/test/modules/http2/htdocs/cgi/env.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +import cgi, os +import cgitb; cgitb.enable() + +status = '200 Ok' + +try: + form = cgi.FieldStorage() + input = form['name'] + + # Test if the file was uploaded + if input.value is not None: + val = os.environ[input.value] if input.value in os.environ else "" + print("Status: 200") + print("""\ +Content-Type: text/plain\n""") + print("{0}={1}".format(input.value, val)) + + else: + print("Status: 400 Parameter Missing") + print("""\ +Content-Type: text/html\n + +

No name was specified: %s

+ """ % (count.value)) + +except KeyError: + print("Status: 200 Ok") + print("""\ +Content-Type: text/html\n + + Echo
+ +
+ """) + pass + + + diff --git a/test/modules/http2/htdocs/cgi/files/empty.txt b/test/modules/http2/htdocs/cgi/files/empty.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/modules/http2/htdocs/cgi/hecho.py b/test/modules/http2/htdocs/cgi/hecho.py new file mode 100644 index 00000000000..5c1f79a3027 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/hecho.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +import cgi, os +import cgitb; cgitb.enable() + +status = '200 Ok' + +try: + form = cgi.FieldStorage() + + # A nested FieldStorage instance holds the file + name = form['name'].value + value = '' + + try: + value = form['value'].value + except KeyError: + value = os.environ.get("HTTP_"+name, "unset") + + # Test if a value was given + if name: + print("Status: 200") + print("%s: %s" % (name, value,)) + print ("""\ +Content-Type: text/plain\n""") + + else: + print("Status: 400 Parameter Missing") + print("""\ +Content-Type: text/html\n + +

No name and value was specified: %s %s

+ """ % (name, value)) + +except KeyError: + print("Status: 200 Ok") + print("""\ +Content-Type: text/html\n + + Echo
+ + +
+ """) + pass + + diff --git a/test/modules/http2/htdocs/cgi/hello.py b/test/modules/http2/htdocs/cgi/hello.py new file mode 100644 index 00000000000..191acb2fedd --- /dev/null +++ b/test/modules/http2/htdocs/cgi/hello.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + +import os + +print("Content-Type: application/json") +print() +print("{") +print(" \"https\" : \"%s\"," % (os.getenv('HTTPS', ''))) +print(" \"host\" : \"%s\"," % (os.getenv('SERVER_NAME', ''))) +print(" \"protocol\" : \"%s\"," % (os.getenv('SERVER_PROTOCOL', ''))) +print(" \"ssl_protocol\" : \"%s\"," % (os.getenv('SSL_PROTOCOL', ''))) +print(" \"h2\" : \"%s\"," % (os.getenv('HTTP2', ''))) +print(" \"h2push\" : \"%s\"" % (os.getenv('H2PUSH', ''))) +print("}") + diff --git a/test/modules/http2/htdocs/cgi/mnot164.py b/test/modules/http2/htdocs/cgi/mnot164.py new file mode 100644 index 00000000000..949b0f195b0 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/mnot164.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +import cgi +import cgitb; cgitb.enable() +import os +import sys + +try: + form = cgi.FieldStorage() + count = form['count'].value + text = form['text'].value +except KeyError: + text="a" + count=77784 + + +print("Status: 200 OK") +print("Content-Type: text/html") +print() +sys.stdout.write(text*int(count)) + diff --git a/test/modules/http2/htdocs/cgi/necho.py b/test/modules/http2/htdocs/cgi/necho.py new file mode 100644 index 00000000000..b9249b8969c --- /dev/null +++ b/test/modules/http2/htdocs/cgi/necho.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +import cgi, os +import time +import cgitb; cgitb.enable() + +status = '200 Ok' + +try: + form = cgi.FieldStorage() + count = form['count'] + text = form['text'] + + waitsec = float(form['wait1'].value) if 'wait1' in form else 0.0 + if waitsec > 0: + time.sleep(waitsec) + + if int(count.value): + print("Status: 200") + print("""\ +Content-Type: text/plain\n""") + + waitsec = float(form['wait2'].value) if 'wait2' in form else 0.0 + if waitsec > 0: + time.sleep(waitsec) + + i = 0; + for i in range(0, int(count.value)): + print("%s" % (text.value)) + + waitsec = float(form['wait3'].value) if 'wait3' in form else 0.0 + if waitsec > 0: + time.sleep(waitsec) + + else: + print("Status: 400 Parameter Missing") + print("""\ +Content-Type: text/html\n + +

No count was specified: %s

+ """ % (count.value)) + +except KeyError: + print("Status: 200 Ok") + print("""\ +Content-Type: text/html\n + + Echo
+ + +
+ """) + pass + + diff --git a/test/modules/http2/htdocs/cgi/upload.py b/test/modules/http2/htdocs/cgi/upload.py new file mode 100644 index 00000000000..2c8d63aa108 --- /dev/null +++ b/test/modules/http2/htdocs/cgi/upload.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +import cgi, os +import cgitb +cgitb.enable() + +status = '200 Ok' + +try: # Windows needs stdio set for binary mode. + import msvcrt + msvcrt.setmode (0, os.O_BINARY) # stdin = 0 + msvcrt.setmode (1, os.O_BINARY) # stdout = 1 +except ImportError: + pass + +form = cgi.FieldStorage() + +# Test if the file was uploaded +if 'file' in form: + fileitem = form['file'] + # strip leading path from file name to avoid directory traversal attacks + fn = os.path.basename(fileitem.filename) + f = open(('%s/files/%s' % (os.environ["DOCUMENT_ROOT"], fn)), 'wb'); + f.write(fileitem.file.read()) + f.close() + message = "The file %s was uploaded successfully" % (fn) + print("Status: 201 Created") + print("Content-Type: text/html") + print("Location: %s://%s/files/%s" % (os.environ["REQUEST_SCHEME"], os.environ["HTTP_HOST"], fn)) + print("") + print("

%s

" % (message)) + +elif 'remove' in form: + remove = form['remove'].value + try: + fn = os.path.basename(remove) + os.remove('./files/' + fn) + message = 'The file "' + fn + '" was removed successfully' + except OSError as e: + message = 'Error removing ' + fn + ': ' + e.strerror + status = '404 File Not Found' + print("Status: %s" % (status)) + print(""" +Content-Type: text/html + + +

%s

+""" % (message)) + +else: + message = '''\ + Upload File
+ +
+ ''' + print("Status: %s" % (status)) + print("""\ +Content-Type: text/html + + +

%s

+""" % (message)) + diff --git a/test/modules/http2/htdocs/forbidden.html b/test/modules/http2/htdocs/forbidden.html new file mode 100644 index 00000000000..e186310c739 --- /dev/null +++ b/test/modules/http2/htdocs/forbidden.html @@ -0,0 +1,11 @@ + + + 403 - Forbidden + + +

403 - Forbidden

+

+ An example of an error document. +

+ + diff --git a/test/modules/http2/htdocs/index.html b/test/modules/http2/htdocs/index.html new file mode 100644 index 00000000000..3c076261440 --- /dev/null +++ b/test/modules/http2/htdocs/index.html @@ -0,0 +1,9 @@ + + + mod_h2 test site generic + + +

mod_h2 test site generic

+ + + diff --git a/test/modules/http2/htdocs/noh2/alive.json b/test/modules/http2/htdocs/noh2/alive.json new file mode 100644 index 00000000000..7b54893ee5f --- /dev/null +++ b/test/modules/http2/htdocs/noh2/alive.json @@ -0,0 +1,5 @@ +{ + "host" : "noh2", + "alive" : true +} + diff --git a/test/modules/http2/htdocs/noh2/index.html b/test/modules/http2/htdocs/noh2/index.html new file mode 100644 index 00000000000..696068e9dc2 --- /dev/null +++ b/test/modules/http2/htdocs/noh2/index.html @@ -0,0 +1,9 @@ + + + mod_h2 test site noh2 + + +

mod_h2 test site noh2

+ + + diff --git a/test/modules/http2/htdocs/test1/001.html b/test/modules/http2/htdocs/test1/001.html new file mode 100644 index 00000000000..184952d28c5 --- /dev/null +++ b/test/modules/http2/htdocs/test1/001.html @@ -0,0 +1,10 @@ + + + + HTML/2.0 Test File: 001 + + +

HTML/2.0 Test File: 001

+

This file only contains a simple HTML structure with plain text.

+ + diff --git a/test/modules/http2/htdocs/test1/002.jpg b/test/modules/http2/htdocs/test1/002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3feefb070a78be4b79512578c62768d01f8145bf GIT binary patch literal 90364 zc-rh;1zc3i_rJSKcXvsHG?J2{q)3N=l1n!WC`gD33L+AMAPOiUB4L4|fQX0z(hX9g zgh)uo?*Hy0iuv@t_j|wiGoQ=snL0D)obQ~Od+*MI>Ol1aWSXiPssIEG0uTWJKn)U^ zYN)7K>gwyLYV6$u761T|`d%k@4=5P`xVa;|_0@Kte>*nGfBz~=z+m~TVJ0MIO`uFJ*-{9Yip_4G!7Y;-|d+z#$z3)06y+SMQ7 ziO!z_X(}5RG!4Z<)860!L7EOtJFL?Jm^$mU5}LMibGHL&^q4*E-0aZwV~{@S=L-jE z*j|th_j7{#gLDf>bGrJvIf3*dx~&`B+6Mrzh|u{6xUC~di-0tdx1qiYNXr2L9+AT) z+GZ1tfFDAjg;MeGJnZe{;D})3wdG?Im64HVQ-}Mz!Vw5TU29txYi~O?6%RL0Yxlzd zur4zuP@r|o1}a%nR7O%#P)ta4lcIiF_=^E;+jZ)L9>!)6n%d8K->c_w833f`K;4}E zoM)2^03{~?fUfIv9%niLkb-tAuHPgN4H_?w2!yAsu&}?szmOB$RtT-oPvH+M{6g5& zpAeeeC-t!HhTB{Fx+2)ndb9O#_3-s(^YOH{g|i8M4dOrD@cZKs(1+W@z2WX)3u6#v zPVNq%x!vuY5KbQMY)1;8e10W3;F0A_IsZS_xf z+ly}upl6;5>)UnQZ_Meh12hI5`8YXX+NtOpvf282`>mIurzL<55CEhA6+jQL02}}> zAP9&7Qov3?3D^T@0y=;pupc-G*aD7#8{iH214n?PKsXQuoCVGSDL@*K3FHC=z)he8 zcmPxaPkHzhE20)KP&p^*ZFGH_Gi=ma!7tmH{KXe>A2LoV)FdEo4m>^6VrUKJ} znZfK~-mqX;BrFkj8CC!*h1I~CVg0aouq7-UEJ`dkEJ3WDSn60tShiSRSixAQu~M+E zVijXO#%jhIz?#BBViRLCVQ+Ah%AVF ziOvw^5IrR7B>F&1Ow3KJL~KTkAU;E!OI$_#ig=NPl0=9^gT#&`gyaHAF-a52ds2K- zE>dOEgQNkZiKMqk>q*~{;gfNbsgPNd1(RJMyGPbeHb+iLE=sOL?nZu^{2KW)@(~JL z3T}!$6m}HHDXvgdQ4CSSC^;xqC~YZ^QD#zBQw~$%Q1MV{P&rdYQRP#;q?)3ppx!}k zOnr#@0(BX6KMjnAn?{4il_rMfCQTd7GA%Q$GA*3;6m0=*6YT;WBb^c*oGy~Ckgk<( znVyY)54{V0EPV-mF9Q|>KZ72FKf@)4YKC`=RE#?rZ5bmOZ!&f7Csz4X+9Uei+m0IP<{!1NB#@^ z_1mG_CAT|mzqq|o09!ytz+K?7K)WE3pt7K!V4mQB5RK4Yp)jEmq4&a^!e+v;!ZpH3 z5eX4jkxY?pQ3_E_(J;|c(HSv*FrJw|&{_PkPMS9MU$Q=L+iPzzLhsE)0!r5>x^ zuEDHftC6cQr75Kur1@BjNXtMgMQd;`|6cFCrP@$!P3?H?o_$>V-1n8}06H2v@jAV_ zJi1=G_w{h}boDOiz0nudKcZh_KxtrUaLr)eaF=0>VYd;lk+0DsV^U)a<6Pqflien9 zCjF+ura`7J_A~5v+JDy!*UZ=~+icE!kNG+CVG9Y1aErDBJO>UPcy^HCpzFahOHxZ~ z%Uf31Rwh>0tX8dctS?*7*=X3L+DzH1*e2PI+bP*4*p0&F;c@V{_VV^|_9G7R4)G47 zj*5oozGW3R@M#|6X<#cRhGC$J?%Cd{6*JohYdM`BtML6UD$ z|M|V=?b)MYW{1m(xeQ569da}PZqzN>Vo9C~E=sJqIvs^ziX!s@NHpn!THp(@Y zHz_t%Ht%kJ(xTDwqIF+uW1CT1N4rIPe}`SiNT+M(beCV(N_S`vc28t4S#RPirdOBy z`1%U_CHu<;b`R7J8Vq(1*$$1r_IbTJeEbdZo5Z)QZ*xb)Mjni+jy8;$j}4D|j<386 zpCF$|eb4*;_N3Be?Ud=%@U-_dYUcC@`VTp?J7yov>CU~Hcbi{Xh+L#!yt*X4RI_Zd z{C35E6?gUg8sAzeQVZFGazmj|0~CyV4msHafVMWk5AFu=09*(K0K@Dhz}*Cd0o)&~ z?<;H|jGt&{2=B)_P%sij$KdV(0K6e$7@7+FI~(DI*jX=Od>&gm zbb~*(QabDtt@v@{g9Cwmtc$Z*4hYLpAqqt#s4lr>$R;uccgW$ExCCgg2F2nt{pE(}?6Kmnn)C}2|7 za!3mW&<5!sZ=itU#qo0*Iz}kqOj3Kr>Ma!TP!t6$TohhKl$W7^;WQ*91_e9->u|}N zAZ0BNqJWut6adtqfLDl$>89lc6p$FQh@*)7P+-KFFlV_q8We~EUMQ}@SW&>?CKOPk zHQtBZj{^GXP{7K|dxmiatsz5MbCW1Q00m4Dg{-~R`g(lB`u`OpLa^$Vm#?{wp#XD{ z0DrxgbJN0eL7Hp)`*-q{wgrx5C5A{p2@d#R)EW}mw|Zc4sqJZurzRxqWIO8<xNb>QNWRXN99zEBdUw6V>nXus_~xU z8D7DAV)?Qv?=&c&Iamm18r){F%-7Q6im6N`as_MTHAhmkMvJwT%37I1m zVM{c)swg1AWl<5C^=xVh{(5+I7kP}#6q4@bEBCMp9l}P?%2Hk!TR&T_Tz#bo_O(!b z{bq1ch*ZpU$lCNy)>;Nua9(&i%tRp1JsJ8#j2W|tqME-_rpzfLKiWx3a)w7EDBz0{ z#bYm!5J~&XPHE>(COSeP3?sg4R2BAD78EH$>DnAb^T}YHu+>&CL;uzE`te)HN9ZvN;`NWp)@k;EHQdIF_KF-5@+&hPB$K{%*{D%q6KdF>(`}Gexm3;|S1_%TzBXlMMCujx zgXT=)sTxj-kDnG^aHs;|5Yjskz!_huNf6zA`KCsH7B-jOe!Dd*qzCID=tBnE!$1w9 zfKMu9LII~q7Znu~6lV*hsC_L5OVIvS99aSS+a0w&6L6-~#W zTK*7`KC31{`lD&4%V!Q;)MfN4GHsss)PnW7&li^6dE=!C67-BgSvmtZo(H+S?*_rm2__o@X9q3^IT9T>Zw&PPLKo zxsWE#oR|6s(^gbgHBdm$c7=B_Yy4^R5sUFC;I45{r{b~^m%_ogd6MKghgGv6_s4Zt zGHfeYR{cumlJ7F~+M@uCNB8puN|us5Y^s)z&DoBDe%{yzc{9j5t5d?J>rH@lJ>;~l zOW-AXl|0`>`SxIM%_9?BW30CoAE&K7y7m4U3TVo+npK=ORVX06UU4ht-6JbS-xU;a zafRo@!Q#ocaR!5(lS_oaCDtgAbaj8oX$yiNB9; zD)dv+uCIQ4Z$hH<`THB0MTvKBEh{$mJmFc6X)pCxd%0ZI5PTaRVDiQs?r*Ol7!)m~ zmn7xZQ&Uzy=X3*fEF%>L*O!y#Y{%2o#uA5pk%cQNNV603EoegCM3@4mom%dA&4)RX6E zSB=a%9onQw$Kit|$fyyUqbPu;Pftkn)ZC?e?}$6*Ls}H>sGtCPoqWXwVHmRKKDcGj z|5^uj3GZw}qR!lCDw>&G&Ye5m8JN<}6p%tED9}54qy6RzLyenn`I%*8+OpzXYL9Da zNcGamRX7S*nq)>Of(~OW+`pwXpg_m;>60B6&-=#o-=2NaARJU*(t7P;ez)`6@@p{k zQgQ(FA|MFlhca_&X>-AmJT+HPTqz$Oj%w*e0j~usSl9aa_-3ldEDu(!o(r--7PBI| zUOl)Ikk($Lws>v%o`Q79ic5fIKulqpzTw;$>FUoLy5?6Mf;0wMtC*BFv*GL&4J)V z+Fe(fU!5#;(A#!sS>U~I zm+)o%dhe?Z+NG);y@?b?_JMml?xfX$aWD^_gaSM|Q9!&Qg@*Qv()Ru3IR?SO+IQqs z#)Im8)R6`j69qC3o_ANgyuI(n4`Pe**N3khv$e^o0^m3-8JmqNy)eEUK1?O@auhw5AOG3 z;?vR++r+nX_k_2ucDn^$Vq_z=I_y`U-U9Nqy_jOLkQ(K0X5s3$pcU0MmM`4iJ7&1h z?l9Rl*BlbHU7!Ti)xP3(MuEdmeO?V}oswRncq`MV;qCJ6UbOw6+xC95!!FxCKH0*W zf6;c_-d}IDL!p=p8I$9Xr^N%`0Rk6ZB3A!)yZ;*j(p8t>vXEg9Bq?~0k=11IoU^pz z%PbJ(CFAW#a0LC}es}o*m)vEoystBb|6j2A+7OCJiHd_2GvM-t3*L-1jfafUqE*g1 zZcnN=CarLWi=`wNRQXVllwm#GM4|qzfX5r~Zm1JAv197<;~8-w5kPvEhBg)#=JucL z>laPvGT0cJV$PORJmlue<_Guoaq@7NXBQO`VP}K8+j`hJxjV?S8yTt!O0z2}5Xf!Y zt)pVNUw03ir>m0>f=$w0^5!o3lP_kvsn!3IKh2s?JLzx8gu7#Emp=VXge zAi$S%fge@?S$t&X>Fwl>5Yn}FfUA0VyIF&zwz`M6Q-Fs%!rE0I?jt9Rt`9c**!=tL z5l*%)aDs7CU@h9n5mGb_crzYksWp2aKH%a5rUdZ|lRKSzDu% zXzKIO@c*oE=$7EnT@|Fngoh{M{H*BJF@~kH!=Tu{}A?@aKBkCn`Xmrm=v4^|1Y5XwVXe|uAr#& z_t5x*Y-zC_-^H$!)E0LCUhIPA(*S)nXi^Nl&)NL-%_d0dHupb``jH58SS-5~=)>+iyq=--ViBX{e6W;y>4 z0N77t-CEQCOa0{YA6A1S7wEO?Cy8lSbO+!}RTHXJa)%{~n%DNiH z>u=S*dEg@=A|xjAs}Fa;gdaHOy&kqMpBdR(yZXR||EMYAuqXVFo;H2Ph~dZQ5ub+j z^Jf}A6!S+?{-%(hW&BkUe=Om~t=ZQiZb&F6jCl>JK!AB;JBoREdkFJ2c+A(>0RTn{ z6-K>By@yFdm0=Fpfv|qem-;`JLOY%f>2$QD&lxD$j{eVg1e?ISw zsYS4HP!gTuS$~U7@M+|jK4Ehozwj??Zx5EZf-%m=R_i$#$tj<5#4xcL`oO`*90^P; z_&Eo|a}h&(0s!i}0XBjz{`<=?GUI)EV-HzBXpK2+yyTb;Xy>NTP=JYOvhueC3eHi)I@!W~ zj9vGlPtroZ=m#59hCas){^4R08oM{~#&z)a@b&y63&+FT$-&7T?(XY`K7hW*0NqFj zlLw}Wt$h(5YH)YBH|PZHFrx?O^~cHt>y^@OBrD7!j2Y-oyf zU3m44Y_xXm){k_ftNX#d5#On9ypjE7bwV2l6%SVr?@h`jUvIEW?Nb4I82dcj(VzGT z4^JImgb#eP;s{(pMShb@WaEJV75Ys+A?Bw8zRJeTD&F;WXwem?K6^eas!y|T-P;ji zepvzXQAO$Ne~^9v;}Xe+0lKZDM_WgawvHZc9X;AQdbD-)XzS?F*3qM_qeojukG75; zZ5=(@I(oEq^l0no(bmzU|B<6d>rY3vVea;g(0BakTYpkO8L$I902=@fumQS&BS<5_ zKOYR`iT>rhKd8Y5r~n2ZAK7AhSbxTe3*fEyf$9b;K)wvnPcd{Oz+hM~bO0%kz(NNo z3>zB@3mZ+MnS5>w#ezZCtNd0#Jp#z_uobbDU=Z?+rzMX87W4ym$QRE-aPbK6aUfXO zFeq5g3_(8{*;EPun8zd#a1a|$3CLh%psbVqz`r$!hVM@QEA11bF9Ae5&OZGsJh*MW zAHs+^#r_Hp{PR6UK$Qkj=wILgwU-hAM4D9C{>ng-qhD+(WJ@7i3fWS~mO{1^vZav! zIE9$<3f@l{m_Pna0kv5D%SploTczI>4LiADQsUUro^N+j`cV=5L%Bq%>#xhi8503I zr)_6{VUV{Zdfyaz?o9ZmfI!c4*ur<)$%nsdLmK=0586m@y}ywMqAA3bcP3MmZv7o- zt-C2;of)q53x=z0_fM&O_+Iy$623iE=e%0NIeyzV`%~V3FqLM0{;i66?|K)=o_%b! z{>$8=_pBh{arD2ykx=}=D;HeYy>I2oq9rk^(Wg88yC8(vyWFp{>i6gUriAM9!1KFf zD&*@b-uq-Y6o*0G?iU6rQ0IU6Iupt8w<=DskTGFaw-MQb06Ids&)m$i0{`ftGkR5hkfiXf-Sb5ovymcNJ` zZEsZQ-(g352E`pc{An5wH|a@Ru;<~FrJvB>VgpXc)n?CYK|Gr=v7^KXRvFZB_ivff zu~$B5Kgyj=-E7aM-da-Z1)Ki=ViP<7O%S|gg8yn01Wd-QNj-E61t7DSZ&YH*NL+tK zqeA^JvIt}{m?+PFtozNzR;}q-mRCYHA)wy4ls#a$yl=Deo!sBxhOON2{PV6G_G*>h zxURLN_G5Z`R*dElp9Rgo2oAVqi(>f~@;uIeOq*!2oO_~wR{+AH_U6I~gHh?tmd`3V z&q6p^{qWEGeA2)vxVe;ZpUB5_L8AQj(^;OT{~|21Ec8DwcF!-j`e@1n0s$uUn*Bvs z(X1)%)H<1)pMYj3zPCCge4q9&>|f+3E6=(1njiTHcxb8VY=PLhN~^zlIlvu3Dm;VU zx`1hMXtc*@HRfh9uuy?xbj#Q6!-nBUZJX{sH^C15?yM;O0M3fVKQk*>3#Z~!9nHNl zm3Z&Egrp>7g#Mo3f7%1!j<0gQWuWQ7pes^{q3=x=uhs8C$^(Q{-=BdLWElnE%RD(z zg7HM`QQ;*^xtespH(R^Wvvu&#%+}zFNBg`o+%V9_yF8GObk-05J&XT&Klop6@jvZE z{tk=(dH?)hZt*|w-2MwJ9uHc4@0P{?E{l(?mME8CqdmMEBH6Y*{g2-_^Q2g!Q zYiF^KkmAY>)8De{N{(LuqxXt~_nzbC!6jX9IKjjw4@KE=4@5|D99z)aM+e zJsTd~H>-vMV<>R)bkRp8L)OF(0Oa>;xyoqIcNAgki`#76YU%Im1U#+kb$9Ukr^BM( zVtzz-C)9W33px}RIQq(9S3gs<^!&$$I4N2TkTYU2pcA`r0MfG2*@&2%#IgOwQu z5Bljxq<5g}ro$>iH`7coaU{u13N6sDoVIbRDd{)UUj}35qW|VKnJI^d5*hi)P3SyS zcRJK)NHQW)j(q6p$OpBhjY*Dympm>GI=ut%pZbChwGXMpzza`&b^~57FIn)U+h$&2 z``YOdV!4e#p_~6-DR;A%!!r1}sup>8fMv0&l7(~1A)2H4DGSw9%_(psc&pQ|cZUc7 z!~_@L{;|#(SiCG7KC*U>sJ`?|_6CDX&&a1|50IfV3iN|=={P4yW&wxvel$OvP!i-9 zv?o#h;?C!e7N1!VArkDqnaNhsWq^_@S`U!1=mVHix%~-K_*3o4wx2u{q^^p~VdG^PWL;{XC}i-zktRk|*{Tfn`|30wZigq~KW?Uxk$x!*rPF|7N+tL+#I zkl(81mPZpo^7xbW_JPgaEU)KlZgGltvP{kAl*wnj*SLF5NgB^#k%4;WOUR{T$I$H= zfSrq9&=18G`zQG_Jn^2M-dKw+>Zn8hz=O!&uNy4Gj1uj>8a_Xra*O8p>@xol)8LHS zPQAZy1}oc*ki-rH{N-L+&e2qFE-) z(dY(9-^0x`2_zW>;2zc{3`N82V@pOVVWq$Bz39YSer+ZJwJ2bt<&9mlz%NW^+_}1$ zP}O>o^RowSZ5~ot)R=xD^f7s*KP|L*)g1s9`PTB1p4x*VTo2OssoXzXJKCgbH?1AE z%%Oj7-2$Pvv3BT|p^^WLljhL)RT(N{N*A5&j6Fxvx}``=D4DG`?G4cCfxSrWKLh}z z5zPZ=pUC>&7cxTbbVApn8QxExtAzfq%b2poAkYuj6u*Oo;T$>oYpxwM&xUK~Js67i zIj{$yTaxUYJm*vIBV;aqy*fp-ZL^~f$-O(X>Az?*&5O~In!2B#`@BJd38?Wxe!F|_ zgJ(Z?-#(ct_Mz`}5?(s4_g>%7O*ewD;_$f7y(`kkez@4rK)$o>^SWb5WY1cSb7J3z z&_8mv=!v=E1UfPT0MRDBvm`U1v*>mxx8tZsoYmw$NUTctZZkA+*O=e#><`$u(Fe#+ zUGRx#gUvH++vyqd$$ewvi*+em{gNZX;B-TCHYY}a8VyyYozF>#VQ#@or*z~yr#1GG zq{Mw`1b~y`4NLCZhd~Me%Ox-(O-w7n7mw%z99u60YifZi`&Sy zAGpbN0?4lpKr^_(75$k!tq^vPx`T%5CL8tBf(?xvunt^2_(g={HgOCehd*;2@sLbepLrI0O!Y$@co6=K(MI`pq7ggfOK@NW&c zsKk6}cJ(RVXE@3&4Y* ze=rJ)0)}~(kipkH+HB8mUH|h}a~KLxG^!a_X0cv8=_N8t{)Y8r1SRSJha?I}^X_bA zm?HtIO<~klL`I>a#{VwT;F(Frwc=9p$5jn#=R@B1upYZBpO!wNwlPr8V3Pj%;A0s~ zd*!hXM<9bL7k3`(TqZfbF3{2fZvT5yhY{KT()NdJS{%EySygVCWOU{=ylWltbDrHP z5x|^MMpAb$!oKkDE66U>I-1(p)W6DH`ECt&m-P7nybq)gWCJIy4lncykyiGw)HfhF zPDP~0h^$oQl+WX)1^o|H&bKjg+#XH3PmDH)p0N4!iP0y!W{0)~c%3bietPhNo$&Vy zQokvXqn0gGy`RzC7YM5_AN|s%ZTHP9H0R!%G0QI$$*sIk`T`L_E_d$F79Je_Pip$? z@&F2W8IO~0Dgmv$N<*wvj-+j}sVp!tLMP}QslrOumlKA& z@WY3cKA)`-{SzZ{45@g@;JPdO20_YWeiyRb>pvkKn;M&q5h8q!R~Zgn5w$s89Vt%3 zTWk7>tizD4k>bW5b6dZtu%0V-dsZS68DXCiSZq4(9OO;vor8Wm)oPIS8u6k02X!N+(MfNkF-7Agmam9p%bBE07KHAR3+9XYMUH`Yq!SAv_@Xvum6De zV7n^;%bAaRK>p{p*QAs}+RS;~RMv9)90u+HuMfB0cBWR%SGqoAK$7+%oJ3oOc-cXG z%r!B@+U4do!M6SM4OyOPE~!%cZm%g2aSJN<*!nt5myy#2Hj;3&gvnLCE=o>_E*{p; zQ_;IN7p_Xp_*n3+*^?`W)K}%?L0Op*S~kM%eeOCLzTwE|`Jo;eKl=Id zp1=s9Duwp$3ti(R?zG((21k`BoL4mWAvf%=B_X_B^ZmKBg~=lo+k8{r2F)kNF$bUT$aD7q`T++-6SkRED9`p1P>PO%X5#< zvmCrm@I<0w*pY^G<3VqS{EAjC;PR~k9p+z}K}y?Wi$pc4#(}V#iPm`eOg^I3 zj91u@>wfAHCd3hcQ;(6p4LjA`^?oNl5p=Jtpy^`R5|cyMhGTu5jMDstO0VV_ znFR}-X%R9aOf@R43fc8tbdVH(Gv^ZCA>&h*f>n}H0RPc~)@z{Wd@Y5{t=eTLpv#|s znOH(`m^gRe4#nqLg+%9q`O9u=A}qTI-O5)LpYQZGMgge^nnCzK?)W1HGI9y<&^5F6n?;yhKQnMZ#PH6)Yui8z0Ji(7%!4$g_ z^9dK%@CL0%IBFHt6P*tlpX<4nZ=aa8Ke8&|Cs%G)W~YWl+05#R${eG(mAC;wHhon# z1CTx4=E@*Fv@h|oWnpGHe96Coi?T(;S#A5E&Jqc-{M-cer2KD@@#3H zPx*?L2FXWGyZ%{D0eGazyWh^^M?`L1CtoSRi7eZwqf>G6C>qjf)T1wW+P`ogz^)YN zw0_}o0j;lVUI!jLr4kTu z>Fud`mz@$R{PB^8Y+9Zk-CgI!Z7-=8{I3VMHrk3&$CNE=o^5$G0c;Bf;q$#<`H zYpusWxvpN1WX;GbTgHYW56@5q%S3clGv>JK}V{Ij*IJL}fov*5a2zCz+oGt?u5 z08cvfck(e+7~$3=JbJoWp6OP9j)RUBtp z>1AfhpK)te%xATp*A%FLtMu~3y51G{8e9#q$1Oi$=T1`Z&%Bz6jW4^mA)=@6?5e*W-e1Y$++X|EzpP96ur8PxzYyX z$My~l-{n&4fvS|oJB%ZhlIrGd~nH?_N;8IMC%1}kAMKE>5O-z%&=(2YeW=wdJI@4ms^ zN`6Xa%-!mYzP_ZgzijLJpTA^`14VCI3M2JVj{yyG0D$1&;S*rPpxD@$FRcPlENt8+ zFq2kF*XSk}-7H=}EmE)2qF6yJ9VZq~?F8g(8t(iFem5t&O;Xw2mmBQF<0t zXGOdFx_Px=!R^`s+`hwXcGYi+2rnB84kosn*?S(Fd~jCG=7TAA<93>9Eth<8Y2}4i z>hz+AuR}-9MIFkz)0Ujdwlc{{bpAmb1ff~|K)-8z?@O|vg*cqO2VH_u$&X0?%>zQvr|R#C5pARp z$d2^1j#}Gi5dC^FeGw+NC?gY~=wl`1>}A%h-ocnvw{N?d6C(_9FSpu7o5RXINkTf` zDbtm>=}iuG{*LIQr4}uNcd}!Pq_k2}jc+$e;*9zjM7E`Pam^0f~44hsB39zR@h_f);;I)v}i}O{=EXMLSxeC*Rm(MB{y;(Y=V- z!4|=52}!a~h3KQdv0_7fuRxv;>1g#;b0a<>-?J9t4Byy3gQs-A@f+6WDBa>~`WE9> zcine9yV~k>1%ZM z;>$NZFA+henw_|#ANO`Yc9m%6*O)G)2+TU?ZoMXbhtN5T>*YCdVKRl_3}74 z{dOA&)-E>Ihw4O9ljnB(Ypiz$Y#$aA=)0j(Mm>{Ek%{rsLyJEzdAdd)fV=qGekn^)+#<@3IH&$dH|(9f~+&vHuGzn`2jbeQjlu zJ2nY%N6)+CrD^l-dvIcLppTa3ONc3Z)_w!AeA6t>bbH1yo@PzT!fnCQ{?-3Bp}q%Q zk_?k8=MyhMdDFTMzqvrVGNVF7M%BW1U#Z+g)0wI_-Ew=D1c7^l@VTax6H<<}&quX) zUARp+jL6Q=?!ulaHPFqTfG!>2yK3Nf^hiO%uQ$}o-+LzAf+=5BmNGgFW<9(!J}H~T zawwkqPsyMUPtbPsPhXng$=@}S?7ziii^&#~Uvp}I&q$02=(g{+J`r)YdAAsyj}n3@ zE4P8*tRPJF@<(Sv4{UMNsanHdn zj|&||UHtRSM_yI`R%5C|rWyGhc&8kBR+XzDMc!|YQO91_rPf=*m$4VkfVx6wQjdr* zxH4t1Vlj)%BC1H5Qt_f(u1xM-;CpzoxKv@b-upj3gS)@jsK7Q?H0GS@1JnhX8BFs}w#PlGw$os8;#HqxaLaRJc#5VBj zQ5E=uRi?=VtI7;^4zz zSWqYg^UMW;1wgT>b{vIKv+3#^c*Wij%V;E5vJ&yEoZ6-=YVA#tzVV0!y77p`rMX#G zAYD&z6sfoP#_Gy+ZKc{!a#&1_I5z7UdjdtKTB=}~^SrA*BLB(77uC!7Bxo~P^^k{I zFO{BwG9&W~d0pYr*8V>D+1 z0|Bej+j%G;_Jh;CcD3|Z0(Y@_o~|nA;M~4W=Ck>2mjN9Fd9=f@sVrk~vl83%S#{62!l0_9=)_ez4z@Kqq$b*gj$>AJ1D>hG~)) zE+PVm2VaEhABlO);OU}u;lu@K=F;t+@hc4;G#1eK*THPf$IL8x1fEj!JpE@_OXZH4 zX;M^as4CV^or|pvI`+s|O>~|Ve?L=Aha8uk53AKbkS(4&>NJ8Kpf|^ANn`fC!Fw1d zFf`5Ap0`E;Nl}8|)4o)mCb3hX{ce%*MZ#aKPzzRw&VGA<<=CN{{Zwfj0k_lJl8WtA zNGd{auIs9Uny2n>t>D>oeFs8Ih_xXgE5HE=uG`)$4V!m5nEa6SmgekBU@gTY+Y|R) zQ<-?EqW!tiRLIJX!oB^Zoqt^U_+A0Wy9Pq6^~*P#j+q_oj3tsqLSL-IgUv9FV-u)* zxUENbuqfPT!9Jk+;*WIVnH-VXaA^76A!=VnL0*ZhiDa^>!hV6<{cTB7gksnlGn;@H z{m7mrUU_KzM!!*u>o=PC8h7~T1GI5t3Tlp;=zTlnFA@E3V*Iu3ex?dZY>f}Us^hPL z`PT+qMY{T6|99QP-Mv*!j&ebMas;K(iJ19w(z<=>`xDHaQe-xTl=VOiwBQOn3+Hy( zEp|HJRqVu6hNd?I_78Iv+@wA^e#Y=rY-j9NlhtJcqX_S&>pK(AS@+z|BN@&z^%vx? zy60rf{6e$nz1epQ9cwc((|M^786%Qr{KD#nM!NE9YaF?$H#+oMUYfq+9di)yqw*C` z+({st{DS!e^WNbzkIrO!*I26=$k-NL`Rf(wo%QvS$TCTl=a936f?Ot+ zV3Vw3uwp_nnolCSwSG6)=D9hVrIstmh|dk(k6_WizpDJ67VgV=5$PyEE;_rFnSDGL z1t{T-oOvTc^639jbh_HuFf#HwYyF3(C}5z4^$u)4J-CIm>*$KEqTL#0qx?@UvXJ+w zNMuV$h_hnF9o9Y+0P_d8r1F*1hBolGTDcJnZ-EOAb zCL+2+$;%sY^HyV13mFx=xP-E)^Yk)M`JT+ICt6j4sxj&M9^~E zhK5z{-gErpX-OPKC<^FG7#SIr)jm^j=9b-_&d$y*+at=oyx_ zMx{#npv8%IOW|I7?}hB}W}$yH^IF)URy-2^V(H4+sh6}#+X5A=Qw@YH>zE?KJs;d7 z?EFA9nCy*od@Uz_V)*I7txo@ePS^TFXiE$aVoRuFQET}6xDvf0Ld+@sKZ@$F?#wof zWs4gS!@iu@Wkcr|esc*KzN+rc??n?A9UHI6M$Ux06 zO!5jZDNCovgZHtN!E1vq{mu44PVFw^4<0(Kx~(*g{Zi8x###vD8Z}s8d@f4dvP3nX zu-S4b-~qX?X4>6XdMDj;p61-n{L+r60u0xl%$!#7RoEk+^#zh9v9y|U-b*FeFy_wi z{qKpFsOw`|!|n`u{A6EipSKF5){^A2;I-W&#XpLl|FranWtw*@5x^BX zy7{zoRwpn2&`85c+GDB7t6?ahoQGR$H?q{R(&oMJIm^zPTKu zT9d7H4}?qShzAz0+==f$F~l=bQuwi3oPSTZThjh&xA6ZuCI3U+ zsxq@-YqBebUvLd8e!BhV5#4CYNC_Lwq@EreFV0G(TQ>YIuRq6-+ojP7>|co9eoemp zafKh3*zktsUfQ3RQx_BD`4!}Sazh9kx+tRe==;WZir?oRk54$tp|S9+6@K2 z|A9o15jEaTRZ(|C^?q;0v1iw}1(7wj?_tc+@VR^yzt@S;tlRaiq7%=~t@uZ=;zf?w zU33Pw5w*B%YkG2D?Z*G}ZaNKBi3J~B8l2`rR^7VnZ?esm5aAOPN7ETet42mF(rkAr zr!&0(>V5JOr4To%FuoIZb#vEIFOP#ARN=&e98RNTF=Xo34PQ&#IDoVYV2?zqHtbCf zIg4{&*Xnv~@a-15?VOhR5;z3UXvejc!*1?bZvLkWB*XhhnT`suBDIdg)#6Et@0m2h zrrYim4#Cqh9WVQsXQ+;Bi`gw8yF<5F7vSw~Xkivzi@B9Q2=8GRiXjnxdCgHrD8@0l zcNi9o!!~+i+M41z^O(TG{J92vCtUr}1s7iVXE1f&xd|t8n?kv|$XFlReT;(X=EtKE zvXlIwz1VqX&k_)GofLw?k1cD{y7#}gKEfZv;I~q=_qFhFPw2l@IqL;`&68zJ0?n3* zYA6}=yK|1hTM{{9pTZiCjgbe+uuru-d3EvTNou_&6reZ_XSH$XjC?UHpMIWgL5D=c zTr{+-$lOE&uLlK0-FyF>)_Ah%NVqf>KVaLnql&iF-%A<@WmFQ(%i1l70wV6c-z{|X ztiHn;HIB(WlOv@}XHPnp1{g;I{NYJUAP0+-y|P2@yU>5U zo-H{$k)TA)Ec^il(Cn-=dK#-v-R{M5-29La?*WVOGnU0ki@^;R-7>pIc6(Hs5{cg# z00K|gHg2Oebqa1RVjI6IUwP~<1du#?YQMO)0h71nQqE-_qK5t{6hNK7jjv@jkcgEkKc@;U}~8m zgzVNJN;Y86y=JX&)~`v){46vkTAb8pX_ScH`B>SmS6FIyT6IhI#iY}6AR;q*E~q~y zC-&~eZU9EzG``sHOVQh4T`Y;X;QXMBF3fJ*2u<6`n~4vUU18O(Pk7A<{W^Jf6L*Bo zW)O&~=RRdFqtumiW6LJ0Oq-fNyU3c_PN>Q5z48!ooQPo;6iV~ZgFH+n5@G$mU0AOptMFRH z&R(fCz;=1LkjK`~;x+LuAIn5cI6=9Yx2H|vhrPYWm{3S4rOkU)L;l&|Kx0Ss z-Q^&|Cyil!YwUPtjAnySmTeG!FE9T+jdhJ={(gS`Y@A_Oyk>lwmSi|xhm+o@VWn9l z5oXqUulb}T=0kHCEwTv%`kyPO9aTGN+d=;ZMk6Z7L%thJ@I;x*?TJt(MX~7gQlRUL zRcg#}uZMc5YK|BM_qD`_Pqdp4G>VWhyTmpM;vIk_hy*kG(c0ZLze;XLBS2$EWpJB- zT$$YOkiovT*oiFnwo8#(wwbhN6KH(-eX!sZPdJ{RuXqJ9ip1fEO4eww_rz;9_)AWh zmz1z>iy7gbd5wJMua@JhPLQ2T0yO{<5D$VSW1iQ*=5Jkj8AE8eV0mz)#4ofL54$y; z@u)<;IJbLk1wR+U@Un1{&RAlHBgr%1+LVhG%+Z~|3UX)uG|@0&#Qn^%AyQwC3s-LP zg=w&-z@Z6QyiPc04?Q@J0&pVPOs*od8{X>_yjj`Koo;ddax+tQZnf^Q$9to0K61Hn z0A{8KJK04ny7zU-Qun)uTxy~eeDo)&d-rHLk79*&w(AOxn)Ab@LrLz2!c^FFZ{tmn zo{))s)`&IH!@UbTf4dFGYK{Azi@N^Xh8hyWg`sAzcUT*dQ4+98R%z_&jn^?7>&*+? zw|SQkq)CjerD6KO=oQWRZs0b&m0kIXg9DEZwUob<_y4u`7I0B*>;Ld(7+~lj1SE%{ zOF}_FsiAvFrKAx=kP;A(?k;JNZj_QV=u#0-Is^m-B$dt=^mx?cIrp4%@BQ8TzwgJr z2cEs+`>ba@>v^8F_S(!wus&DS3oDU`nK&IF*KQymb#(DdB_0&WsgAE!&8IQF>d-nx zgz*+bp{kze;%NigNcY6Cjt`Q@<}6c0ybvq?kwpOqjTuD_S<50v5{$%$S`EXE6lu{i zBir-U`l>Y>4)QbQ=t-U&W^G>8@|@)_!t%M$toPj9forK%$$tJ&WE?wZCt_+w_KL8) z{#vJ7_qDhlV7!)N^NDRg^;0L}9<)rjHg zSsHLIZ>}(zk8v9~1&Pfv$Es4-!)cnsCq!Ov#WO;d^6Jm!`jR|mJdVx>{$M|V{ijbv?$gRMk&`dts1%@Xr~J-!Dc{|;4Itn68kLmC>TPOqCEkk8|hx)1G& zORiu>FHCse9jU(7KO3rOekNc(I;g}6fwHcVewekt$0t2$(|uuMCgLD8B%08?FN!9c z_?*B9%+za$vJ!?%767a)Sh_1JVrpgxX%%F!zG5okJ;$K!yJ42=TZBw2e${j58c}~z z5@89#r9us%k*}Z2Gi2c#>DWwhnU8;8V za{oorw}Ww<<6&-j6(;T&IB%X@x!mq?dJD1nAi|?ZzKi9SuuZ#uK%Le1Taj$!Q|mO- zcw2F@4P@=jX?zv&*vjFgF`BqfOu9BrgvmBmx9U4TdJDQqzO+S?JuNbE`Hff0_Of73?0JJHd=JaoQG?dTZpt%TH@aKhGCCL<>~j5OjAuig*6uoR zT3+5d03K$>$GpS2x$T9V%UhF8EWLsC5VL&amGapVh*%dwU`1=66zkD$EtuV zlqfb8HwhLAiN9u2BsEVOjX$*=4^aOX?#aoitYUgWFX2 z6MTp7A6zVG@;1+jv{0?E$9Qr_1YEQlhA0>?JAUl6O0YsJvvC3Nr|E9-%B>Q@v$a{5 zy(l|YYc9YI6_>`1b@<;qu_V?9$&R}(4E8J7G#m=`O}1&tqSG4@=|bJ?UDU0@O5g;B zTt@(4d`h0O8@-mJXAa6R;j@j2#kWPKrYV{lgXHbFrLmohKb66S{fwG<8J$A%)YL*Y z`dAeXgMfk>v9$yai7&?L$mV}y{1=m{R1ox`JSGm#w=@vrQRf_tyqjnr5^<4b9#7+Q zxy+--)3{-NytLSD>#Ky4Qem1*j&Bp!%A`-{fsQ;0aV?GmzQPK zTps zv(z@L`U<`T2&ey#0iOjEkbwa^R|jN6l%J zp~mhYv{M`y@A7H}dJ{};mXM5h-n|>me<*g)Bfb;JEy=l9znWl$sb_4)9P^Qi0PZ2h z+mgTV(atiG*o@ys@6gb(%%R$0Sgn9oB!O^G?>^Mlm1{*#(pT{aXdBfnFiw2fZ11!I z)kyQ%iNsKr*U|GV8rpS|Xd)HWV33|BAAB>B(EVaLLWz@p&w3^B^sv!#Y@_vVC*>K^ z7LVUV8sl&bqBk`QamaD+{gDr?du8`yH?K!DOrKiaG{`F_FzWQw6WHy~u-#8EgAMQrtZ@PJN7%2e z{Q`4Qq;JeRV<|ozxy_BdZKn&6I0+56&Afib$<$5uesxRnyN8sIbBuL`efGsBK6LV< zl5N|!O$4N`t}-R$#L7a#2{bAt2WqPz4-ffbVL;$}Jw3qEDyvpHeRZfg(-UxV4oReb z$y>tJ$K`Ik-Hqr#1JrCSNQ zn$%UE+cTSrxF*NrI0Vs#a#=u*55L)HeqGMMBj7h<(N2lS)Nb3)o>7ms^I$e)%UGXf zahS%dnSW)}<*&q>Yc@{O-sa&eD$-7-FY5@$BNt+Gu?_Qz>55RTg ze{Z69&ZoG1^HMzI?8`T`VO%09If61NGX%J#$_k*h5hJg(g?9@^(2r?T6ZD=D4v7IR z!aT`JJ=>wAl03G~s8cv)5dG|oJSg4zxoH|x_5CYCLR=Ku2!l$xsyiV~^m-eS8y7l}v9_qfc=78&!TE z=}4E`9;*$Pi=g`3zOGu|X{K_gp8x*uA6^w(2K0CYUYO8g0*qD45>6iIly4YP3=bHDrr$FAuQHnP+&|qbGwmxO)%mrx~F%UHyrvBX4 z8jKh;9K~BsIj~pc*jdxL`HaujPN1!~VYS*cFfOeo=!#H78&6q&MW9y+3U$s_7TFPy zU~bCq!B<7pWD(W@xnoYONXt2!yJES+b&7&kKAVV00&mp$te2I$QGp!E5y0WN8$u`Z zmVmc|_@#XGRlX@n`Ri9+Cg%jyXU$12neP>DNgYI1-oDM%XBm41dAWfUp&rNT59~Ws zWy?yRTjzIswyYHd@-|~NQBfm{U_gb0_00M5c#G_g|3~y$_uyr*5^T{jIV8`ipMXN& zKk~f=D!sJqw2dR2Y9>(OegOfS_U#T(l7dbMy;7EqWod7&bY8M+^;HVP9lRK_0_8P( zl(wPGzB4bH_t7MtTW<4aq{LhXs%f+2OB>Ulmy1u2G)Z^ZRYshEhykV)&?uHgT zmr{7M@2YUDYhTxJD}hha~edg@O$KBZs}yX>#Y z!{c}hg9A-e=!5UZ9%0i+hO|*ybLeiqLYds|7<*fV(T{K3?~asK?o#l*{0b&6XNjG7qMF}L4z-tijE{x24ut<=VbIs}W;0Btut zY;~#isLv?Sb45;N^M$HmtR62Sjqf*)^L_s`^G=w}F8&&Z>r?tk9OJ1MmUS!pY*{;v-8lN_4_vx`-<1v1*dEPmZdvcxJA}QTM>gg%pbnkHQjZ;ejuGfU> zGc7Z9=eJlX{?&V)zpt&4Ze0#x{ws=?`3_>(h9kF)2b(8Wn7SeJYov-Lf(9c3vNzao zG)<>S<30bo6Yei7U`rV{f|Y4br~mpL*b_(I52+=ztI|&bA5AEya1Tx`rv_-L^6Wru z?VJNHJ_>2!>bx_TD-kbBHLO4qU|S&Z?tMyKy=u^lL4li&IYf8w*)1%|F^TBT_75+p z`v^8bqmR)>xT{GjW>v9_xG>6sNgxh~;-V#+h-j6-zgGDn@vcZcptxKiOOGcXw<_P^!WeJYbHA+`J zXdc`=B8ur%#&Xbm^Wb6|1+V>QxEzgGaJ zijv6b2=1r_6TD@dyTp{?5$HH|2FtaylEix;bvCTG9+y-)xG3WY2!1=;!0}J)aJVm8 z&R)CzDrn?~qpy@SWtb*fM zPOW=_(ZDfwOordg8y! zEKKx%eZW`B9vvKnTd;YWrv-wt(HYSPsjs&G7>(U~mC#Z4o2}dXP$Ov=4KOWw&qgX{qP9Mw z?s*S*!}8}3sS?iFg1iQNTB)Xkps!8EVFenXh?(-@`&Hl4N_?F!z4s<;!Ksv8wgT4iUe{|DH)EXEth^@@)A2z^9># zxOzCcUzYVDDHj*r*cbKVqrOc2`*s8rlANImNriaRiWrHhFBQ+31@b-}@RvtijX!H{ zCU69tWpqGoooN3^lJM?SpL($LG%b!Dx92%ty|JZHZnxVTl32o=h5ME1Duk(Og8ajL z1RxvMs>dbgnYJ9z`%Bmm85;aIM%*UD?-DpX`fkos;|w&83j{XiG&Fg?(GMf(aJ zrYPoh=~|9b>P5uIBLK(j{Bv9s&`H{B6Ld2oV~y$1oo;xL_G z({{wxZ*1PSVcN}!O0|okR6qIiyqfm>lg1A|&jyZ_0gcp$@U36Axvpq^8mi}?$8^(U z>B&=awL}L|S!P`ey2q5Q^?(!qoU-7Rzy+S(tLOTiUE=grA})Bd=$)2O-e5Zdl6naA zpjIAz18ZJjw0@>UYsFq)(Os+?wx?q1Da7x=o%|f0?5HUD9|l3~6PmBL5d_wc z5?Fki)A}~Qd%UMKWC5}8^shM^T4XY-p~7V6Sm8Tt$5zbnV8g_HEv)F0;Q8=5@a8>< zw^FnifiEP3X*r;`>!yQL<_0-as5+7TA3a8kZ=fxK8oh&LXo` zG)L7-%Lx*_k1UW;V!8OJXoH)1p4S(gG113&*M2ipNAx_5iRC_l%T29ISL03PR+m@3 zy`$$SeH_Fi8*@P*00!&sTZ)-*MbPW`QknT+>MIf)^)3Xw8#3vgW$IIR z6})Moy_8T7))DlO3=38@?FU&bC3}j$BV$kNRk9=%y2g$|Yf!8Z1}=o8r&VbkF}fl# z*bnz%Y*q8W%>(fjm#`7rFLHeRXUxh{G7DM`{n5N>GHPIx>KBX=y$;bVR--*?g9mBP z6tx5yW6!O5(gzu2? zp!N6eTWNWo;nTZ@O5#bm4!&|jJKM8liqd5<=ur6oJnI<}SxPhNe@e`j+J z+6#{7+o+#UA}k(RonCcjAyI769g~~2!=5v8Ez&-idvtek>qg^Y=q}rw751EZr6MY# z=Zy8n(%AMMK9ogkr`wNSu&`xp0bUABi02kLxU#6)yWK zuAO&ASU)8rQV${NZC1FD{nYj6S1W%u`oGX<6&rpu4K*d){_MV3t4FqObZ?Z_yatg_ zXB;Y8c>;Q`Ct5zmTi$?oBVLbaNC<*{V0fE72;Lrci9zY?Wo~1Q7ciE)t)UfC0cdB^j4NqYpaHf0n#K`GaCyk>y5l z2?UaWX1_Qc_$LntpMV+Cz5UshTkq2T>{C@dttDOO{$zs~Kq-a+xAOS&XE%l(CurTw z@k9RuUjVh*ZWr0IGgKYH~w^9oTxhPL{6&u_&$H88yq^9MS%-W zoH;m36QAUDT-KK(OVxc~We5OEV~=CGe`$HN_BON8x9k_bVL$qp+4Gk-dZG=QAM%cf zggHjM(aYNY(*#PO7>iGrAw3C_WNXmqU}NaXZAZ@6dLiE=nw*Rd_OEI$>OZb0U75O2 z=Dz#+@?PuSw$kUzj0&g;ebl2ngHKIS!OvntkdHlR+K6RwcRW6~MJ_~(QH_i_{;nkv(tmgkQ~j#c&)RcVzNQgQj^Hg0J{2Oha( zRg_+MQem)R_k(GEquHnNXLM`rz9Cl*Mws6B_V^0aklT2_T??BsE9mHbV$M}^PM(4* z&75DgH%AgA@GM=USR`1sHk5gWScmsuG?u4MpnLmAcAPbAwPlOkl~-LnbHde_rJ6oy zC*>`qW9M_R5_aT&jK?s1Agn|_jAPF7o-tYcJZW6PjXQA4^lbhu#*g7#-wF1Wyz|S| z4ZZbtGx%A{@PihH06nEHHb@s-u_rg+hK7Mj zcI|HK8%pjUd6J&@eJE2?`V2QeKMa)`PM;zdvuME`3D%@GL@%201wgyAIk!VGr2y=< zyczOLGIK5n<)zv^BqCmx%hPPKVd@3C=6z4jaN=-z1b6miLk=F+i;`z;-uEz2gKfIU z7>R0nrZ3{I@H}R_o_NdbJ|tSXM|TxM?tLx62-pD_^TBkY9BUnOGGJegi}~53l_*ix z(Q~t5T1UXmEFUD`6MQ{^$W}I5o9i7iw_FfzO6i-wA9@^>>n=$^qcS*|#Y2;s;5@I` z1%#f>SE)bP7F;ga8r_i6FWwN$X3?<{3$p8F2(e8gy`!J$z{3X{5pX z%Hv(MXjAhcrIFSe&Q&UGgn)NN(cLshw8v@0^ofD>MgGVPgdY|$^EZUTBJng4dA2`l z2UastjQ>h`;ph>7ZUB()I-F{!_l2a!E|#azOEv(ww*|Z2L?Z~5x*WBX2tkto`r}kI z+fMo*CesV-d6)z?0II%4$%0%EuE}dv7&beIBX~o@%|g{hVTg}d0w?$i-y1cfsLWMJ zu3tM{r`#PDnZR^8%#dfR>&z01d8V;burmN)`5x|#>Us~LD45}@8e^3M9(FON4!wpIy+g_CJ{Z^@{Xn{oO$LPi&q)1^Rha> z5li2g-*?{p%>CH&=`?G;^x||cCRYkpDiv`Q$Y#uMgvxu7NurjL+rx>V%*3ymoYI2X zuQ^G)xKq^Hrf01(tZ80yoh{ev@e0|6;Sl@$xtXH6?&R^{wp2^9&06}g#l5*k6Q)$Q znkR3>iE%^QMrw`CJnXRKZrV3^V};DT?9@7&dtRDLe^88#%s82lI_D+W4=qY@rkkX( zAW&GKY+qNNe_#z1HVoYn_R}ixjvbMeQc+%9@S9rX^I33f`J|k8&KJylv5Ar5%+bzj zlsKAPMh~vFv5`$RGzPcf*p#RegJD<-?(gPYJ&y;@G>PyTsG9_?=hfob$SsR@YUoT} zq(HAgZ$hhRP8b@X6wILq=nrCk(vU6y436(~NgaZ{kul2cP?)F}2n_i|PM_5c2^Evg z>r@|d0GjycnkwhfI60CPbO79}6z$Y}$&AWM^;CkwV0B9iw7|e{x}KJp^3*uBd&lFr zR4QQ^q;P{o+a~&f#957CydaP%txP@m);duEw94To?pc*gTd4u^w(zHUJ8xr?I|Ub< zGH_LW+4aWN7pM{JlW~}?zG_d^(Jv@_#@w~3kfT!<74yFK;q+Y*+D6l zphsyuZGiZ#I;G&#!&0sK_&ddxJBQ&^P-QkEn@-`UiP+CAye?JXJ&lX(FgEIuOe?W;mN^Y+4qPob z@M%`LHL;qB*Lo}BLr=6A(aErs+n@M?l6TEaq}R6@<=v*?=HPtFc@9nav_wsLRm zBT&!ONweE>UrbL=_L0b6>0>BxPO`+7|Z(<~f1DY;OQn zgFzKRJo$bwQwOd?*@Vb0Zs8_*P|}=&$UW|T$`$)?l7;Mx5J=&e_i2SSb#7q z2QT*H=fhKcoN0Mv<<=p^;VY;}EGZSYYZl41Gdn8zD&lCnqMyuqF=;IILX<3}^~B;* z=T$m)E?XlasBs(`)JM2Xb^irUwICS<^GjupXp@wpi)SMNkiy$5c6nZrXe%UhA^_gn zodMC0oiI#VF@)$E2#QOTR3*+zX^7KiE1j}H0Vf<|5JfFOBkU2i+Lid+UdmW1f9C_C z>du&cQj%+sfVUb7I73Yq*>p0kM*w4xyh*cciJLg&ZBa8XfI=2bPb-iF&kV0b;}HcK zaS7$GcFgxk?@-p<@vB_7qB1OmJz|vNfNAlV#CMT3ndDg^NC7xzmNHTcFLYvZ#!@zu zx>QwL_@Ru8if|PRnmykRyAM??sU{=Q5ZM8v*sls-fjQCfU9{`rItSR(zijI{YyPa3 zKPnFf$W`8!i@ijTDyEI%>>21QgXy*saLZ&u(KJqLWCG z91RVPJ9aw;YWFTjWn90?POVIRQI<1qAA(uUed=!DJB0mnWSj}btz!_~W1UqPQj?a&a8ybu&1N-Iko|!>t;7jSYY?EEauB|aqt`5G6}3Qw(8{$ z{J?G0n#Sxhmyb)9x*t7lP|sYF_fGf08Akc?;1S_VFWR4&8)v*eKe;cyg6!||9@grw zAT~2aDV12isu>u*T_babNq0&J9qd&c?XfHf{JRgzYz+-X1urfiru5D0!xd)FlllIm z|cX({d42~`*5uPU&A4vHWy0&SvcM=IsYa& z^uOBr&%XbU3J?2twhs9}79Qj4I(-s&{rTd_XEFp(oCMEbJ_7*ikDQP{?~{JQ|I6?% z8`3Z+04Dr$eQc`GuY1+tZ>rHpehWwW)+=D&vj5)L>Hk!C&^K_9==Vh^-xPfdhkVQM z+ty*}G{nsMVKhXS-uKkM)FwocM6yQJXyXWr!e}Mn- zxPJ>5h5gOeVbR|-5&eh4|0AmdeI4Jw+xjn+c`%PT(0l&SI{w5FV70Y$a0KZ66|0B- z(EeYrJMcfy{Xc?>{-S$A+3$1yA{_ba$b$)G=m7}*kB0M&N&Wzb{%Ci9({LciR!?mJ z{GsrF&+h)d;eh@soIVl?c>Z9v$8hLhfgb~z(SHpXL79EG91|_hdJe`G;Uh2>f-`!M^kz{0BDwS2Z88bp+fw0`_h{-v4a)&`&JC z58U5IYH+kD__%S{&uQ`}{3rY;{3rY;{3rY;{3rY;{3ras3jgmOM=bz5!O8bKQBhGa zz^Gq@B2eMBS)(;r6@|jM#E?;qhMwuA4L!Y|zT1h4f+7Mv0;nvciO~>}xNK^ssjQ>B zzxle#KOmlN{m^(X%~+wE`U}iWY>;AjY4Gn5FS_(XV(eGw?V0^T%EpLPd{c6hjo1?g zVOYfGJy|F0%zLvCVdTdogJcLuHb5H@#1P+cHzYRJB#`3$Oi-qX4XA%jeI*NhA#uK- z)E+&xUS&n{i!Qxy+G#%hL2-M8_A!~bCa9)FWt0Ib=D4)Ym(cI4!ElT^C9C4;EUBt~ z%tQSS+1Jdl%aQ`-fk+Z~ki!Eb{mzuiS_`|r*_@~Haq%2yv~|BG<7(?YqkEVir}AY+ zXOWi%U!5!+36=}J*2HqxyZIUmD|Znj*Bu)-KRdsz7@oMz{_n2_te#XGPCBW^9K}op zCfWsxCyg80y&_Pl(J$gSldW=pla#mRh9b#JKW51U)aHK(!+a<2kD&#K2W~w;=kCOlQh>$`)DTUbOxagKwTftA> zG8B5^t+y z3o02a1m%bKGghcLc3l>_)DpGi>{*@_=a~NT>!jXWwL~RTQ#O{*zuXxFV&7`2mfwjj z&Jnm1dtBk<>QmK}F8fclSYBK^yr8nZB>mn)J zoO~M_9rf62(SGsQRRWcaMwnsQ8ZEad(!hpGtQQ&;Y3p_Dv!7fR^x0+aRk|8UAh|*z z-s5qL)u#0v!`4q7b;|$c#971|(X$4SC;oYZgbhgrBI^7CZ{z+`Tna9kxtI~^>W$nB z!3m5)Dr(^NLe_s+1r^B!rbQv3D7h89h}=cU`k5tV{>N=W7)_da8=;y5>+x z1_gqz^`!K3vP{RQs`YE>Nzxa9!6hKgUU&pSyJ?J=5u*M28AJMJEsflBW*fks3HJ++7!9p_hyD_-FYGTS6+RcwEt+EcF)ef~kD`WI z#!HRWJ747cvowP`K_^T)R+L_vekLnATuy-b2jVjciGpM_G%u#`CIu*7YPvM%=yKey zTyE`SN6e|>SAy3b6Mk00v!yTmb`dL_kEAmvB9O_d`HpV zZIP(?q+@OjUpgA3K6t*n@!~&fqxA9fAaCQALd)cL25IEqtKr{RwZy{jiy{2BN53dd zP51Q$@an)dDqeleuT{a2NY6x=CyDjlqVvlA$$1OUUv8Mq?^ZY*Xw|tFkBeyjSb)T# zPw*&c5;vjqB)k=oo))Jp&y*9>*Ew&pUhbkL#Qu*mY}Xh8u>c;7_n6Ai27o>dwZm4C zjqy&5TxX6+U%7?Wx#A?ve&KV;%-i4pcEc z@Et=~)1HSW2P(EOP7~Q;)_ls4jNc^I@-Y0GkH!9^G&xYW@xWO`L%LCn9NZe@fje|R3k=`+8a4Aa%SnMZ)S{zAy^+&2uEgFLwZ zkiikqPy_@=5LMdy>+3U) z<8`nUV{XDe>Z&M4Py2Us?SF_IuKrQ!n4&WGHpZkU&2I4@P3?b52!lWdmNx3j(-qeJ z$&SUN56s4k_?EP)uRX8Vv>N%3WhQP8puR9SinvL$8;nPpI5yRp+Wq%P>!Hzbv`P0J z3+zlc)UB1*Pb3cZPKf)rB-8z1M-@FXJr@m(jh1)tgwcuLcC+@F!R>oj?E`2mkNLEZ zy#4b`=;cOqT3G(V z52|7kBlj`(R@cQ@YP$#l>6EN)m3PeFW~AF;Iwbmeh70GD8h#S$Ldw*JXg&UeXUjHI zWAE?_(b7MOiT95GHu6mKlKq7gekXzE1uw@>y=kuPrcuW(-P7%Uhey?IvzxAsane7V zW&41B&}T^k>{GsHUil64p+94;5b~KhkbIV`eH+EHp?~t)Dz7v7L)R=fZ{FU*2#1+49nW#_^V?2HuOsRmTSu#{hw5*Jfy?L}z|jveB<3$1a+o}0 z#w7HtbHo4b0DnVP(P9JOI5M)nRMeT^jW=o?Uv_55@134sjJ{>lH~ zfvZ0{&)dBBHBQP>>yWeW2VbE@_BDxWQUNyEUDbJFp;qlb)}KVxninv$)okSg{4FYb z<~B!9vjR`>az(cQ!c2)Pi9H)$AHhY4(wrCmaQxGbc|r_@2GsS$s9l^~^omQmKlpAV zXsxR<+SZOYj}JM1TUORI1YXF43Tx{r4VCSA+gh;c5l#|P+gqi^akGKs^FdxZ0mN4=6sY5|{PGh&=stgvg z+FM&tLEqaI1DMJB1!8okDPwsX@B|(X5e-?aDptmciuA8WBGI7v=1fNbV?bS?3wy8z zvpk5GQ&C1qw3(efdX~Y-{`oB8>9YDf__*DqObL{rj#PH?d_}6aZ`)sd$OnKMr=Ne2 zFkmkLqNuCir^fP(HYQ7{hTbAV(w{tfM4=efGGZhjuxIndC(e3XUR{$-IIL--*#~2!+!CHdB1E_cairazrX* zF1RQ!%ZgPo6@y29^pnW9k*(VKAoNDxeaV8Z$SLHxNC~hkZqbk46zW)fKDCU@3;og> zx;^TLF^L8y91B%<@n5S*_1U~-1Y+fs40fR+94!hUo3=YlGXh_@%y7^I_<9ot$tuu@ z87ruV5-~^^=wd2gQbV7x!Z}~Q6boDWF$^rNh&v+Bot9|w+#n5=rYY5=$X4;NUf7l%|Mb4F-F;UOw%$$27BKvTOI%<_GVK=jbc89{}SZB1^hILd04e5&avTS zdrA<(>1YBj?pETK-!MnYa53&P`-vg|ye3fu2xE-Qv%^mSw*-~mi;T_&CwTmJlF43` zgo!60$_x17sv*xn_|b`!9^<|m5i+UnMlyqyFuP?To?@};bG!KdsD`GzP?-+zVz`_X zHd53)5z68rOF@C-`oVu5mUfXNR*nonsm07#YPbR^oCEjT&}LajyTqge=(HTL^mXj{ z4bmL%&bp8i%Ol|SjCS%VqqF|8*?>t5nICPGZxj5k7{)^epX(I&T*CtHxrT?khCk6+ za?rh=0%{Dx8={|#G?MT^$C2S?!owuQk%{r_iZrrsN9$m}_V8}j%VT38E$=+_Ak|(1 zqmJVuw?_+OBZ!EW;SRZMw*}afq^Mr`T4c0dZkATK{h&}=^Po_>v{3tkaOKI^?@!*N zMz{q+nBIQ7wH9AQppD)pi$Xw}KF5P4jvV0Qy{?qA11=vmAX&V}3ey9DEt83$kU>TTQSjn*E|{c?#bWJLIOQR z>R#t-E17S!%>=0u`o)-hRawO7ZHr^Gz)tRSdTx4CL?@L=Te5R0E(BVG!d@;sfskxD zpC=Q7-k})Dh)K*`b|?BKTK~PdI_7gc@q7TeI<1~uVTp&2bdR9Td{;@XrSpP85VVq$ zk;~*1P*M^p3Z$@l*(9FIoeAxLKSeimc4@R8!;P@V6equi431N024mjzTSlTv>0sOY z9swVO%k_7j4liI2`%0*kN_NUYkOw`yQMjU_o=C!tlEH`#a!@dSL2q+M7Ke#zzBbOi zj<23X<(>&H!`a&UI6WY_RQ%(cwj7r)oFRhruy-7;ocP8+r zZ^}el_pWBh zeIQAi2@)sM^d6CbMu=reh2hD>a{HMxWN5&cEfJE}2Nk_opCaDgJ#)Y(iOI5oi8oC^ zw6X^U1yLtOj{4(1QkC9RJ8pH&B`xWepbKoa59lzW1Hkp)4DIBU#m2&! zi6M%Hq{|GAC?sc2-L2))#a8n}|9~uQ3V9APl05z4x{=fZnswn)WePv(vZueq88{^A z+^J>pHQ%Hj?>_T2^GmxO`YQeClL2RgE0}wQjJ#7Cih*md6As`H!uYk7g|#NdP;X;A zjP%NDh{IFoNKA|}%J+&)eF}c)hZqy81fi~8rO7CKCi7qf{B2a$-J-$7R=%%2;2YN? z6Z9?vp~1Lu-%e^;JOGK?k*^j&+jF=aLk~gVT+WKVX&~mweX~nOICjO`aXk;b)c<&I zMG13sb>;E;%SY!XQy*DOfJ&z@K?e8_qgii?(=tCdnc_lwg4WhV$0B$3v_YV;)%6Mv z|3)zePji&2?c=!o1hkL!iF^*$R=kY9k8NxbSS&9EOeOE=Y24tHvzQGjV@{GLV#Gi8 z__0*mii_#A$}sWmW(IdnI&H&rx%nPqW}TAa$2ZWyEHi}eJmLCx=q+(T;w&1L0PKWOti`jr%f&BIAUam)m(Rw#po!7~Lhf!mP)2Iy!Eyp^ z2F~KA5j^Lw=XeiCigSGojTkL3=Q9OdjAfBWfa6=m0}4B-)09Gfj`Ts(>S-QoD29=- z8D+RwUeun + + + HTML/2.0 Test File: 003 + + +

HTML/2.0 Test File: 003

+

This is a text HTML file with a big image:

+

GSMA Logo

+ + diff --git a/test/modules/http2/htdocs/test1/003/003_img.jpg b/test/modules/http2/htdocs/test1/003/003_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3feefb070a78be4b79512578c62768d01f8145bf GIT binary patch literal 90364 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 + + HTML/2.0 Test File: 004 + + +

HTML/2.0 Test File: 004

+ This file contains plain text with a bunch of images.
+
+
+
+
+
+
+
+
+
+
+
+
+
This page is developed using this template:HTTP/2 demo server +

+ + \ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/004/gophertiles.jpg b/test/modules/http2/htdocs/test1/004/gophertiles.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e45ac3b02bb8974d7a8c0fde9c61e1bb16203b9f GIT binary patch literal 742 zc-s4anP38T>!MAjrX>z@Wg)sKme|$jB_n z`2PswA_fLVRz@&jfC5G)p!?X^IXJnv1sIqZnVFebm_e=u%G3ho7+3^Zg%k}P*@OcV z*_8@Kj2b5{ECr+Nabot8FYu9hwy!G(W<0ns_J%91?)yGetzkL1n{m0K= zj10_-Fo5A7L7;z_SXh`@*g^hbWGV+q3bL>&8nOvF2C^p>3M&~ka)>xhT)6Qdr?PR- z2hpUWi(FzVCJ$9Vg1iLw5pf=BBFjf`55fKO{}uxeGb1p + + + HTML/2.0 Test File: 006 + + + + +

HTML/2.0 Test File: 006

+
This page contains: +
    +
  • HTML +
  • CSS +
  • JavaScript +
+
+
+ +
+ + \ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/006/006.css b/test/modules/http2/htdocs/test1/006/006.css new file mode 100644 index 00000000000..de6aa5fd180 --- /dev/null +++ b/test/modules/http2/htdocs/test1/006/006.css @@ -0,0 +1,21 @@ +@CHARSET "ISO-8859-1"; +body{ + background:HoneyDew; +} +p{ +color:#0000FF; +text-align:left; +} + +h1{ +color:#FF0000; +text-align:center; +} + +.listTitle{ + font-size:large; +} + +.listElements{ + color:#3366FF +} \ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/006/006.js b/test/modules/http2/htdocs/test1/006/006.js new file mode 100644 index 00000000000..b450067b530 --- /dev/null +++ b/test/modules/http2/htdocs/test1/006/006.js @@ -0,0 +1,31 @@ +/** + * JavaScript Functions File + */ +function returnDate() +{ + var currentDate; + currentDate=new Date(); + var dateString=(currentDate.getMonth()+1)+'/'+currentDate.getDate()+'/'+currentDate.getFullYear(); + return dateString; +} + +function returnHour() +{ + var currentDate; + currentDate=new Date(); + var hourString=currentDate.getHours()+':'+currentDate.getMinutes()+':'+currentDate.getSeconds(); + return hourString; +} + +function javaScriptMessage(){ + return 'This section is generated under JavaScript:
'; +} + +function mainJavascript(){ + document.write(javaScriptMessage()) + document.write('
    '); + document.write('
  • Current date (dd/mm/yyyy): ' + returnDate()); + document.write('
    '); + document.write('
  • Current time (hh:mm:ss): '+returnHour()); + document.write('
'); +} \ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/006/header.html b/test/modules/http2/htdocs/test1/006/header.html new file mode 100644 index 00000000000..bace20ee88b --- /dev/null +++ b/test/modules/http2/htdocs/test1/006/header.html @@ -0,0 +1 @@ +My Header Title diff --git a/test/modules/http2/htdocs/test1/007.html b/test/modules/http2/htdocs/test1/007.html new file mode 100644 index 00000000000..4db93e4c5a7 --- /dev/null +++ b/test/modules/http2/htdocs/test1/007.html @@ -0,0 +1,21 @@ + + + + +HTML/2.0 Test File: 007 + + +

HTML/2.0 Test File: 007

+

This page is used to send data from the client to the server:

+
+ + Name:
+ Age:
+ Gender: Male + Female
+ + +
+
+ + \ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/007/007.py b/test/modules/http2/htdocs/test1/007/007.py new file mode 100644 index 00000000000..02b5466f96a --- /dev/null +++ b/test/modules/http2/htdocs/test1/007/007.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import cgi, sys +import cgitb; cgitb.enable() + +print "Content-Type: text/html;charset=UTF-8" +print + +print """\ + + HTML/2.0 Test File: 007 (received data) +

HTML/2.0 Test File: 007

""" + +# alternative output: parsed form params <-> plain POST body +parseContent = True # <-> False + +if parseContent: + print '

Data processed:

    ' + form = cgi.FieldStorage() + for name in form: + print '
  • ', name, ': ', form[name].value, '
  • ' + print '
' +else: + print '

POST data output:

'
+	data = sys.stdin.read()
+	print data
+	print '
' + +print '' \ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/009.py b/test/modules/http2/htdocs/test1/009.py new file mode 100644 index 00000000000..8fd9095af3b --- /dev/null +++ b/test/modules/http2/htdocs/test1/009.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import cgi, sys, time +import cgitb; cgitb.enable() + +print "Content-Type: text/html;charset=UTF-8" +print + +print """\ + + HTML/2.0 Test File: 009 (server time) +

HTML/2.0 Test File: 009

+

60 seconds of server time, one by one.

""" + +for i in range(60): + s = time.strftime("%Y-%m-%d %H:%M:%S") + print "
", s, "
" + sys.stdout.flush() + time.sleep(1) + +print "

done.

" \ No newline at end of file diff --git a/test/modules/http2/htdocs/test1/alive.json b/test/modules/http2/htdocs/test1/alive.json new file mode 100644 index 00000000000..93e7f959725 --- /dev/null +++ b/test/modules/http2/htdocs/test1/alive.json @@ -0,0 +1,5 @@ +{ + "host" : "test1", + "alive" : true +} + diff --git a/test/modules/http2/htdocs/test1/apache.org-files/ant.jpg b/test/modules/http2/htdocs/test1/apache.org-files/ant.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ebd7ad71724eabcce2bc868e9c57d54a17deafe GIT binary patch literal 6437 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 literal 0 Hc-jL100001 diff --git a/test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png b/test/modules/http2/htdocs/test1/apache.org-files/asf_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..07c0113c7bf3464ce976a073c7391f410d800593 GIT binary patch literal 29982 zc-oY?1yEhfwl=zOcXxN!;4X`WFWlYTC6M6mZo%E%3GVKi1P>A%f(3Z&ea=4j-dFGb zf4#1?s^;i9yua=-y5`&3+YSI<+S|qw0FaYo1i%CSYrOpeU`TnG+4%q<0MPHW(EHR5 z6o<9DyR!fro1+`6iMf-h1*@5p1Dm&rGaCmhI~zbq)Z5v_%+A7{+|uRCqtE6t`YiGu9PAMuvF61rX?cnTS;ci0i?O^ZdCg3eh z`L}X`_vgQ+*(k~XW^uO@rWF6{1-Z7O3b~|{s|7g^D=&)~I|n!U2Yyx#9^Mc9ADGEG z-)S~>J~mEv7IuCC9xefPPV#>b%6Dt7=9U6rDVcxUdZ&ab{~eTF*{O`VS{qMf~OV<2<_l5g^m1TQ(hVB2g-2Y6y zW9YBP|A6B82C;$#L6f7bN06^pl0PsZt0BRQi zfCus0CLja=3k?ko0}TrU1B(Fr{zrm`g@s2#MnptHL_|hM{(GP!qoSdsp(0~pVPj)q z5fc#+5tIFAK)}Jlp&+B+qod;!;$YwqlKuZ3Zvy}fct9?sHWUN~01^WN3IpP82=M#e zZ)hlp|8_P2pkZL)AfezPARqux5dY&11SAwR3_1V+3kd-U4Fd%Q1My$e7_gXFJm?hI zIOOaq+_=UZykeXZ3F4GoGE^Av4A78Jh=}koP=A|x=LcY5LQ`;vt74&>xCAB^G*EK7 z_RmXzO&h7)uwlsAcY=}zxVQ_|f}5ztE^&;n7R*#6LufGHUHzZVqGM2)K#;2#bFe3< zQer{8F98%3G$bSx#NU3u$N85H6Lgor%Xb^({qsBQDp$s032z$!A2E9>#o2b)p$zu6!mWyb*tjbZ=*NMm|ZyYnNSzBFHAqpWkBsm(eGU>69$LQ9a`uA=?^6^uM^Vb$p3m z8JIZ{h0@A#j^%T|PzvEkPVb?gFtHO14VHHU?9k)QOr{TR`H_aVO*t~-jR62^inKyK zEdgKj7k}!-v9#`t=?`ZPPevZTV^*`@rBW6JoH{d3zWmmVrb;#cNuG-rx##g!uNVL! zon8P$lPyAEVs_?#*pQi|ZW*hX-P>Ms5MT~Y-KmdH7Z+u~MCT_$T06X2bL13Y|E>Z# zU!9nq0f2~@iG@=1x90Khb>P3fq&>cF21mM-W~pr|oqm(AbBxWn_u)TKiZLx7(Y|w- zRs15N#D9L1hWa70`QhXcqS=)wHYhPelOF|+H{Aw}aukGNmNyfLowK1I8XyHL(M%H> z<@V@<6&Nvfczr_}=gNjDqGi!7GqHW_G6et(p->C5uDu$5CH%GA;=jnH(4A#F!)-HI zBye0J)FPa@_I0|dwMX#!R_I4OLqpo*&$*`LqV;hH&V;?g4rRjcQG#biVgSVQ%5W-R z%n^Y9&r!qJA>|Ggw0Bd~SVD4Av;cKNz=WHRe-czCQeR|3&jzgR$Xn=(uz?W;nMFmVN+d5TFjlqkB4%TKRc`#tLz0h z6Fhf!d;{Qk(WJ{^kQL<~XZQcuQCZ1gCsx--m8anmOz$;tQAv0IV^vdSI7S$K_X6i{ zI0fWLs^NV6V4}V9y(pfI*{p1Bz#-1JztL zKU+m4ZXy(;g~^890hp5>Ihu=zZJwB?hf(99Yo2*j1xdGf;X5?WV4%FWgi(X(+voT(l6}YljD^thvW1gWBS8w*MBxPi9|=Mw<>-Z}LhS2MBd9Ec zq>SANKBGc&H-%kABp}I9s4Rfc#2op{(=c}j8BOvR^f zkte2(A;Wo+G1_%y+?T_F~I`5mW7>UBNER{5EO*0 zYI)J<88{q%Ilr}O{M>bBLQ>+=GEE_>EhuRG6o8Sgk)ZD8sJ0&KeapFTgX;vc(S3cZwjK%^QDe}gM%YX$S0*5vUysC^vsTgSc*epA;-!5lG z*FxW&0ED~FM&Cp!#-Du2Sdh}yS2gCm@2&GwBzd<-0Qj@;nJKYvC>(W!GTOl$~-YMw&-Dm1uyYZh%_v4 zPTf>`nmR)r%BI*GKt&s*ZYd*eYAVKoCIMxd8;d9jrpcx zdb}F7ZH+8LEexpRU(a=5_H#0><R(eu+{i=*^m%<{f5q z-*^f8c;Aa%0Uu9v6D}n@_C56lr>d4m@8X_HKjBYQURE(?$j=`B*?8?ndawd<_#@U4 z=ROGL`6sPavM84*ba!zwYd1)y?+Nq!Ac>5oiUhT++rb;)G#DYHCTzN@GLsjtDqfZ# zyo{qtUtYf#WyVPfFI4J>jy`sAagV<0G%;Si8ine?NK!&e0rbH)N#j-lNsOQUiI>3U z+BloF3U&K2ll^a=ft8-JPPT;VI+rEh6>=c`uVwb@T@~K13`#YnUk+{Qr;88q%7TiE z=i1A;_|A*Re}b`SC{W1Sb9lN|KMOjIwvsF;3d3T(@A z{z~@ZT=uHh9SwBstyr+un&uXv!FzFJ^Z> z1ctr%tsD-1dtDL6>DvF@<2nJHrmNH!WNG50>{&Mlxxni#Rc1@kesQE+Ic-LB&MLQa z7=ktQNVm1}J$byz491=LZV}wz(dEN3Qz4OUTr*1b{O;q zNQ3VmwVzhi$YmqP4u_vm&J_AVoS2yLx@}9)_Y(dK{vj0PAznD~vV05c$$+58xhG;s zx(QW_VF1y#KM+aHyFnzmVh{fncTt$cd2#2~&I{k4iLfIawJ#>7HExJ!zqq2N zppCWLhK*preO+Y;Rl~k=l+lsJP1k9Y-%vPozhPSrv) zAXzG&%2o*1#;~M#0|fuZZ4$N!YtUXg{t>%?HgXKzeiF;1n7xqK>`7tN+Ji|`J1o$T z+_*QhEJn}H%XezJo3y!U(a|MNt(dmoq3h(8iGx`<9rlMG2e0u|QE%KuacYw&`oG1% z11=l5p{m=;vuHWLyfSOno}%w{xQ<0&FNJEjre5N`PQ+L+nRtw;m1G%fF+X3$5g~Sd8g_C63^JfOO9DvP@nP$6tb`00Ps-^$LrO0 z1G8GOBKrQqX=Lx&j;tKa*8W1EUwO2>ir!ovX})k9=~s1o6jSM0f~#Kn#Ublh!rz?X ztheYfE%5`-MhviaG7fC|ih->uCI#=*tkm=%rK+YKbyPTMSexs3bYUSNwKcr3L%xs% z`s4%+WdT?t!3j5|Fs|A|H&DPKP-_hp1cefLaO(2&pb@ko8d24HGd9XnizgI+Q6H*4 zRWEc*w6v|Dp*}VeZy_{QQN;_9utVV)dexj?3x%_M?bLs8p6i(?pYQCo`82xKuJN3f>R`e32kP) zdbA+_)0iN&W_vL9ptLZtNp}+A;|q9)Z&E>0im>PTCQJt&y=C4>nYA4s*Ymp!BFqT%PK_^MY<;6f#L4~d5?rp&nSKckj z*xKt7B-a@z)y?%|+(u4LOixDd)85wFYcs`Dzfx*K&eSbkN=A|*)l8*;p+4XU zPr15OJ=88u22=e9Rix`mq2X*yFysZJN*nVw4@pmMq8$|#8xsB~BUFT*U3l}xh?L@b zD6tQ-oSj3Pi>nRKs(qrD*qQMX%hm_aEG?CNc-u@)+zLuTO?C}f2c_1#7d3wr8b#nPSKO2?{*4qK*{>+AG_ zV_vTtxvM7kmn~iLu*^*RV#y_wE^8nCt6~Z(OBIuUZ!}iz%z0(QrrpACD1_pa7Pq_D zly+f`yndPF4JNct*XcH1Tdw%nQ@tAuSZ4Gawmx^)PGp2`$DHRR3I8#$a>k5bUzZ4} zl+H40^1!#}P&km(>HS$2m#4An$3k&?W*fo1fmVFOIsR||k0N(%za5-=tib2|u&uh%`#l&wR@8F()fQ6+v` z`ArvArz`^XN;I}=w>Ojb5XxR#6li$9oaeXT{p>gxZxNcO)9MLAy(W1Bw3fB3`M9xjk$vV$t$LKeatZB*lbE$uo&fZ1PJ?T}2 z)w;dNYjBg}w?Ub!wP%`7!&V41-F2}w)zJ)use<##Z5n)AmBO(eHQ#?BH4*x&eR1e* zvh)AtFu(F`7$O>>`j{t*ssbZD;XgdU3(uPVbf^ z>kZI-;-6rDhdP|C+$;)_-WKArTz#nQHt0j>6AzKojfP8J?U_s$2KaKyojBSGG?`=<~6ltG2! zuT+W|DXA{lDAa|YwMslx@3Jg4o)J{3CTxXC)V)I5RV~^cVtI}GqG2+f3nv{a3BwF9 z=}(GSmm~dwKy>9JatB8x@#7tguYQF_h!v+ll35$;xZ2b$fKaA%XWernTWh~|GC*Zk8{3-!S(2}6f>)hvik_m}g;>#m;; zrb8>^y5ok?>YBdJbi7xi&U85C?#6=fy3Y5$)-M)3HF0{HKbtvBOh@`&LRLL_bXE#f zd$THMPA2?$HqRqGiFgu^Pr#+KX&KII>CK?X>M1Ek&b;PIlF(lllJ$CH7F~LJum@62 zt&uiFk5#{0Z+_Xa{K7ELmcKtcWvSk1iL`1^Of_<9P$aw?>VTb&8?|=$F`g(9jq>Gb zT&+y|lrY*82JysqdsW8E-oGYkz>o2CGaBCZi&dkh;71oq#x*aSSWf?%;%MD$Jv0|Q zkK~N_#^#$8t}`am)#|4ib^Ek>3x4Zkne`q&uh!n|kBIJqTEFcCv5hp=_;pO`D<^RK zF;tGcP*+=j>;3q;@tn4Kzo~0zIdZTd-t}`NX|UBgxG1)&xlAfnrsaO` zGmk5?z$qbc`C6yE%|Ouiv)an$kbdVHUaf3xaac#zz88b8*(Uy{a9x}ARy}6cFEz>y z{TDTUB1K=9LJ%v9;tu1iKY( ze$0a^f5%E^c4riCZ*+hD2C!+6N!n^{4YvffMoh_fLNE2QJH7#|Sk@Ia$LbYBTjbvG6wQAF{Cy>Y{Od~eLKPSvELz}- zX{e3=KCWhuh`llE`Qx{YUGQNg0i$HdF)=S66Z%o9GJ~8k68idfk;5S3sGvxp`B9Cu zMUg}D!Xb&_G7b^U#_*|QkWr~f@uA1G5-3HhGLb{dU7-uc+=v5t7;T#DdSmP8L3|-Vs{v6#JED(WVX2scu`7iP#`_VHb(q8k_jUm z{y;Y83q&4qoH!%#D90rE5`2Fm40(*NeW)xa{?jSSH4o2zsd)Z~j5t21pV_USZi?_4 zX$k`)h`kt{7s$vD6=yv6Sv#tc>J4D;QzK#)v9}E(?ibuog=yzE_kidK06`-Mb|lD+ z(ZUbxrY|S_hR;RR$^(@Cc`_>&5Rq9sM$L@p81sN5Plwbe-^&SB+~>Qrj~R%Fa3(Ju zV`!uZjIT%z!=Re1$%EpA*+-z}ixcrDFC7(QNSsG>0wg9_t3pzdSR~M?W0A9J%J?ag zPo6~hEeHe@(@2Ha`%7FM>bwNTpmU=pC};52TYeWOcOUC-NhsbnHtTzBNK9N(`7kv= z%|N~nE!U?uKC17V1pB~1EiA@QD{v^R30&fOEfW0~ejs5*A#cY?zyFJb`itCUOS)zs zQbtLFPx6*$lX9-4FGQ=j3Fh3;5ug%mLe02Ql{70!;^=A=X}ePTFfwJqz(VgDHUZMr zReD)xSdai2#;*v+{u`hW5bqivKK9p(zBpQjqLQFv2Vo~C;>XSnHJjGS^Seq``51VR zd|oWe^FN)D?t4?Iq(W(4BLd zo$SX~Ln}ckb{PRFLP<)Jta(q6Hv2)XJ<&e~yiIGHWM`FR<9NNM&#-=$!8lJc45)0J z$f=A{t(;hlqQ+fRl2>xGSXEsf5}ZX);O# zC0Co>jeP5J-Ze+jK92Nbq^q=q=}Oya9?NQ&Cxfhyjdi4hh*x3M_4=9}U)Q(+ipTym z_er#o&|=bggIGn*KrQ8=cYdpVy~NrG{h>v^H?s@pxcH3RCEB>D)i7cs&-i#1F;K5A%m=zPE@vYkzO)8 zMDo6+g~G$n?MQ|e)C;{KQ|bNU6C;&30Cu5bXX=+-wB>b_K#J}Se5 zwQQbitHKsRsVT&xc5|1_z?amT1O_*6JCoz$USOS&l(Lvl*oO_$&Gcr)d;I7~m(unyvDvZoyj^zP?_DOZK zS^NlE7p_6l#7N{_L*R@s#w^ygsoV*b%78$oT_jUo4~YfiCsVmMfL{aHJmoRWoRpbr zgOlc`lKwaA5gRJsf(c58YBv3t*Yr0))s5q4jW>XXs>O@ZI4&zMBQp)73aJBMEG2L4+h1hR6lAO>dMc?T4NU2j@xdMoXsUJQ@m+aB=-b&W`KecTvI=|y&x+;6 zSCT6r{%6f6ob9cS=e#YYJCFN8uA&*f58X-!RbX`@+ z$YDnG=^2p9X*|%_#0$++Enz_^fU+$0*PpO(b1@edaPT@4_iQvDe1~IH7ahAdd{xDM&ux7ONSrU!F7XY}To3@Keg|A)7fn+c7`5O+6ygjVCRXt-;97>0GPWW# zBQ`acfx}0@VAZ}gmE=np)>QzS77;F)+Kv{obH{n-9H-eW0ytX;{aVT^{Z!8uQmN+q z`dIjIge-)7K6t(XP-B}AqxXnrZpA-l|AT_KljeB?oxa7GUVVFiJ?-_sE9EF%|H=?R@u6SA67Glp1TyIwr-rx2qLEf^K==`=A zco-Q|`1Aa;i(pzKW|pPNVH&Ls4IDU3*5!BiD6PolGnMrj1BjzWmv0xyUjV$Pl(X>HWj_$wEDJ86g=&BgslgGR32>gAqr&)Xis}i>B!JFa#aQ7wGy-9JglU6tzYCy)FG*O_Fm_SiK;yMJ44?pli+D9!oSRLIx zhOhSmVLuK75}B9-D>8-(Mn<)i1~a7ynF=b#Gi2A7Tjti6qX!?^tEk%ii;=zO5^Q6M z_cnRwUL_&KXqNsJ#Tk!}zO;cVw(zg?GW2{t;A9*v2OQOHM&tVq+W0BqCm0Cd=|iuC z0Mrd2zJ$7HKO%rBuPSrt$ZVf&G{V)Nce@vD|1znxFLcsHFA>jsFqws2pLj33iP(bp z8`(su#fFv_B_W4VcP5Z@`6sSdapIiGvuCejBSRiEnR{&_bUcL(UD05Nty%$gF7{5B z*LmuE`zqp#b;rH@oflexxnT)I?E7EWBz#Fm45mx9T z;h6X4SNh)uDn$Y$d|2JE9EvokR&sFJM+$@Yq@dKL z^B6d8CdaHb8!nX}d=O+U#Fba0XR?gl&ZmgeE!fu*H7UMr2!q`@zI1q^ZqJchjz4x5 z>emv~$F4@k!8WlhWy%O4%?q|JmU6(bnj5gxibwfRJRI|#4eC?GpgWubxe}X2mZRSa zd?hCu48-}B#2wCnHsmn^@q5rQ`dQ~QE3J_|LwGVxS&kjL1a+%MRF)QS$*jt1<%b~& zhPjb?Hd>p!+^@L$zY#mqu5~Is+i6tQ?tjt=tymx!CNM@gl1La4@NHAi*43GSDPG@$ zWsA-)a4+b+S+#zopSr9hIHxN*xx!cuP^Xr)kmO@RMcC4TdB_wr!@xh( zix3$%HzhUV5^e{K;UHDBoe-5{R7$~)O5Vc&Z759}l|IZ1RbCBK5aHdV+K%WJNQsQc@+WeW+*jPx+Hsp4n&1!s>zsqi7+3*Osd1zPt+A7$gp}XB8 zh&a*DFVlf0Lxy8bzd|IHDvlGT#eH2@TxBg3OGrrZlOP38({Pg8Y!x1KmaJ=nh+#!X zI|rwA{iudX?85rKSE4`HR{YeXkh@mnh5&cX7jJ_ueR(5b7t!X)bVoE?n(lyD1kj(yOCQ0Wjz>6 zq*xFP<9ukflWtHQXGDksyW$~}8XVD_fpSKfs-u3x;Z#wkc-!D#8G0dLX6=yq?yliWls<|cgzWs$7%Hy|C$%s1 zk*B!x`a8$X=b!6p59ZeRmAU%3BB48bZi~HvaSeI~`)`0fbuGse1EnlKQKAvZ1h=hxRyk%yj{Wt2^wyf@GQdbU7C^&xY)Fn7?p}KIqqCF?c62DieSVg$1bKw z^Uz3~47>45@lgUD^Yu>rvS^^{Q`sdWmg8WkQmuOwa7?-XHi{Uii)y1uDQdsEtpJ@5 zU2F~ub%Nun+KiA;>N+(+*or$WsK!|NERue{@katO$uiXxnQ_0!8jC{VATxz~bRgwS zGexPol5_bkZi`q_jximY;eHvsJl##f)ZShK!YY7b<@-{#GkD0XHXCEe{e)zPDAm6g znNyhTitP{3m|>4nb%l%zofhUKir3{mdI$oiQYkdCFR-RJwb5-bc_ZA64(Tz&Y<`r; zZz1N)%-OluQPHz4O-0#*LP(A@1}APONWRuBU# zEL4lfW?z)FOt@z-wK?-8m;+Z~P`8R1_!uZ{$zRq-Pe}=Jb|dw^rdCalT@#QDbDvFs zcb&lsei9^dW{+9yvB_v9qp+NEIXLuV$m3CpW2(0hT6_bLMC~{^Nfl+KMiP@xy-B<% z^fcR?mcmXl6n;hlmwVg62Yuz1Dbt44yNNDxxBbfe1Mg`>l@j;3 z3*qHb4QXDUP~WWw$?Sh+Ku<@vl^B*2=no1tAZMVJa*9wKj4xrXtFQ4RR8YIZ`~g;n zW6npnM3r?7-GVI05Mw+VAjQ21t+YNdubrDSH(l(7v7=xBW~I17a&$mHQGkvxSi0L) z>aevOclDK;GZ5RId2s^hTtXO+A>y%tUvW{+5(NtQ+Y8BhZIQHi#_xrzOan`$qC2cm?6aD-Oyf|D(b) z)o?nuew~;G)VYTrdY^C^?7Y#(U(x9~F3in)RbamoV5J$dfN|RS)1X8$#Ux+f!YOFV zn(7n2zd;!~V!QkBk5A~6EbRwfZpG9dmTup3aP-+*7n@YdW4H)SJYy?0r?P;g;4ruC z5Pkhl)n+USj4E;JKF69OI~)oh7l}3Zr7j;i*=c@PdC$MVBtij?#GNvBF?yCbVKS1o zpa(Cl2KPxN8y81TyW#-(pn$!C$#T)ZBTZdqQVBI)K=yBJb1E8`_WOTk^x@B(losx^5dFzb~h?pQ4MZb&=i{Dm2 zmRbLK`DreEVj-=Bwu<`BD0}HVf3JG&aT(s$S=r|@^$Ckq@PM+-u`@;GW#<$!D8{# zo5J9BxDMe?>0oy2b;J01*&SsvOem$&`n(Eb%Ix4*@QSXj*SQD()Xrq)N8R7!=X6zj z9Nwv(p3+N~ZAEc}R-7lpvLEI4Ls<+oHx*_sfk8yh^|MJK#@;i|xW^#6Kg$F+8c5c= zda80lu&Op&(O>_(-xl>;Cb~2Tt_K}CTkO>n^pYC~Wv~KUh~zBP0&X*WwCE8)3xGs8 zrQc`icb}PG!M|iKOJJ;0Enh1pPa(*%UYTh zI!wM}`_9|^*fK(h7IpqnPWkhD-Ac65KKtjpPiA<%3x6*6|18NTv7)6mV{NCQUmyxw zH(w0Y!dDoiE!N0D$$8l7KC_T7ip!3Ksu9#P?NX1LQPb+Z`pUQuGZMa4bDBEtU;KE75u`0*J)?cebkdQ8=rT z0=a|UMbPnH)1Q5J3)2NeW9FA*y4Zo||6mvTsde`p zoVh7tTkgZiA3O^AZRGbUfZ5tc)?JOZoAmCv7Qg)wu%F?Jj^p}gt?R#9RHBMr z3m!0oH;N>U_m00}5vylnV#Wg1PL`ATJeLlw`J@!>u}x|hY-LNeIUKY;?^@PAcH%d# z5P|jN*o5LQR}ih4VjkKG3VYq;v%(x!=R|kV|D;@a^^oJ^3)?Kp4{}A$^{$@sn}L*& za3Z(X^+DzW1==m{85m0sVpRMc=J&DzVU4v`%_2FUNQ$pGCheL5cI_KXTlqcYfGM$5 z#80OLNpMkC<}!j8l&vZkw(h!BGm?Y}uO66=&GM+$BFU6inUai~dne3(_7$X(g;vag zjzA4tyW_sI6AUf66_cpw!aIDNx+1S z%MpE7kTLV>-2Pk-mFjb!yVQ{pj0`XDSON5s3mvHl{Q6cau^11)W5B?1jmDZwE^{{B zMOoMpd$$Xed5KToYR{WWkm=u*Et~Z_OEXz+FSbbGSv+ZZMMy1_MYFF$#+FOdDh_i| zuB6#GW#EhF7Q^sviJ~DNa(xsL0bRIri5LSNyKCexdb%lUHw!El2LA&x=)y1}dAX%T zmL)$m@d-MqpCLDsLAmW7r)a{%$M;!u4iQP$Iux*6_aj9lC2|1@_DY6tnmqMQF zpfXU3?WJS0?dYPcG9Cz7r1`Of^RbgN_@(tI^Q0L$gKhDFCI-c)X-%0Soy+a=5yOmG z-7Zu(zd#66Qi#*~aigrgfwTTF9Ynv-nIYGW6iKsQ4fe4C^oL z5Q0LkN_tNetZj~%yT}Wc)sJ4HpLq}RLG7POYEVGEbN=6uDGP;vSyy`k10^s7>?(sV9ggi9ul;TpN<0>s2?G9Q&7lsQCo zmxGden)o!b?#^W9! zok;|&D(CY3L_W1@8XFLfT&?71aZ$O?tO$nRAT6}jQtoDz>Z;V@7*og{KmY+&YuFK`(_dtAaS{?eFNz0;nw+*msMtAFyk`Trm}MAb`EZu|!dvxy!J-o8Y$Dqwo+T5t`fdz088E(tm+l_S^ha=7Jb?#2rmH6LHyA}~pb=*rGAoW^liT$fsyg)=vzq%DDU zS~{E?S`G|Xb$B7x(Cyj!MQWp;ia?niHbLrxiTwdHZ&s}{+-J@YeLZRGiWRX#Ab*)n_1c%gQ=T4%zF5hb7ZHm z3qUcEN=00#TjdJ8nUgy6vq-%#O|}xfqY2PuR7zL}96qiE>>JlB<^baQPuAE!20g!$ zN;cIoOkPN*Pt~N#BXMtWk-Na@V9lA%cfmY=EJQ>OJUN>2NydExFf~$WMFTg4Dr}e2 zA_qUSJr>A!eO~mzceYlBRdxCHCoUC0&hyDGQ=X^8zAQK3zKdaY8lFVyNYa}rza3s7~i5zqJn_gXA{nx#S)zs zx$)j-;)BF6_%Eav@fKM1O!X(3kq^QmJl+85707zc<|&M7n!m~S#__bE)(!Q5^ntxO zF?)O2F7Oulww#J~Wn3xwTht{j)QN7#)V6&W5}JFFyiz2=X3Z#;Zi9oU`V>4YoCvvU zwAzDS3S0HpcyXguA%A|s>a!2l&~rbfVeS_ftWyW7tm49izE;}0V3OF^PomOWoDTE0 z8oU9H#V`qn4*0JIaa(N=J3D?Q=M%#*geAISc~5>R41f`Gm0_<-`%{~?w3Z#uM4EY; zrqY|{H<9!tHFx5E{C&PXy6fIEU70bEhQsmC^Bbj8j?>z3+d<Y`{dJzhV!x#mEoImRdcHG^OWJT=`2ix&ZMSq zntWHot5aKN-`cIugZIM8^x|Oz3R{4sYN~nJcqBi@GTN1=9dK`u)Yn|7;}ON9Q}wiK z7p*t4P%A(xV6954AmT^=<)+Z>LOp~y zG8{(3HTyedk*C?eJx>uuQ)UXKOo6m5IalEyMAJGU;Z@q1wA5oN@v3}5ZOk%hAOs`(f zqC@|^(~QTiPd>UnnkFkEPNps0Xid6uSi}{WKcZJNnhbL1Xp3v4)e`5mklD8M-D_D@ z0(nS^147oo`Dg8_x^ddIpYUB|wzkS9Ecm9JW#0g^t?g}(F_$1z!11CMdo)|r%dpLc zvdBbJe2Oz_%5aoXt0uQ1d^Ff7?m=klr#lh+NSuwN`MY%E|G0s1S9eu)}S@I3Q!nu)3TS1~5PW-`d z5hfbRgti`GlAI>Y()s5kFXwvXneBHt2B*_EfNtTzhR&l-Y4Jh{`ll0*Q}(_V9(HtI z+ZCQSK;dK1;E`_Jf6{gJ;MnH}wts!Lgn|&I04{f4)*kNa`NEg6q3;MZ=vnND z<=QEh&EK7#+7I@!U}Kd_cwUpn&4pZF;H1wWvb#yk0%&X+2M zLcxFdBZE4G-_ef!gRMR;G3n38aH71`!sXo=h2JG3dv`}Ywmb)v(Om+cKJC8O=jqRz z>g$0dQ^=A=ue<`3=D6=!G=HUEVM`i7i@$+^YN|m#ACG7Oku9@-_7;Dx*hO?GBG(bR zRx8A<(IoHkQ{R`M)7R*LyielHjJqwTpw0CpOs{A*^CO+Sz& zhW`!Fy@<;i@OA8~?g%r|4e%rQqvLG&99We(vDz~!XIr`Y^F&LFZ9kJeU5PRaO4Jxe zPTDYLhSZvwHOFpksRRYGPAWco8A~-ZV8z4wa%S`9%6(X|`f28XuIMVJ87{4d>A9BM zg893P8Y$Uz%45xGp~?mR%>pT|KIxf2vO;($Q2e9wb4j|F?5{s~xE9zCisZ1DY|c!9 z!#{jHDmQli7*Uz*N8uRt75so}Qe7i zjNArg?PO9|ZeGm9k#9FWph$bSu}zPZJMd+rFDfTHtOn4)5WcIFjI$qg%jB~Npc9KKRw}BH8x(53Y7eubwG*8w$C{fECP2cov*c1IWmS2) z_6!2EU^T2->sVwA$AHegAWO$%c%63qES~|IOl_{fiboh2q#A{9YF3yhLEg~$}WcM@kR z(t0KbcAawt7%i<8$x5FkN>z4pjds&q|DfJ|l9;1zMK6ZLm=XL(0E>#lbj+Y`zq)V^Xp?E0kgEIX=Bl9eRkX%b=1&q*_9n}5&trwO z7F6id_mI2P>Ph4|3BwpaM+9-}sCdUUluBqQ9 zU+VNWN#$RdG)i8(QZY{SUgsXs43|jfUX~{G&>GX-!iZ$EQV{31e!QwN&=AHgIox!J zdIX5N7lc+?9fpYch}4Nu?lFn-bfoE2J@dV8yhQiH&@K|Yy=Vr;KJ`=%`wJAsF!=UG`ek#lLx=wKBnS_loy{E- zqoM!;a!aCLvIq&%T7kf#K_)jg zk!@Oe3_5A6BD2G&k*X$XAM9h$G7<1aMAlWzy`}2nes`fUG#|X1ag=c?`x$#q%UQ7O$}Rt zc+hyHA9v8cd#f!wfk_l1(#j+b6oH=Gy(VxQD5@@Lo0EHuWs_f=(UxbL3+UjDVm#j$) zkFnaVHKl&nb%_NEmzLnAr`P&PDN2p16rCb;DgBMWVUtfkPi1w- zJ=xqg7^;}7x zH2P;(&16y21e_iY@PhW%U5PX8*bBE(YfN76VU10SYuRasqDA5D*@n+#o*endPxEAi z^*{K)_5dVLN5PP68*!Pjpa|=b8@MHArxH!dxl+9Hsm)8Qj@WJV(YWM(4-sT&Tx+8r z6(AS#Le5?Ku6rf5)q#~ERywBeHBG?1=tvsHR9kL{29s9Dxj-yNmeIN?8F%$L zl*j%bk_x;4aRAgtIz|5g`gE5&I||%d`c+hq_XpXmTPGJt|NO#wTnr(6>X4#A3|C0H z;uE1c!1wv@#n$*^hJLqSIEje~AaKv-C&}2$TJoB*7&jzE8H?Hjdy>NPvN$haLyDf@ zNrFZn($05>5Ba2z^L1u8Rj6OKgS|K=VZFSE+S)^?vlit$Xj2Jbq z49woPhh#~Lx$q) z+tZY7Ro2V^PBh!}Q*<^gBXBMBX(p1rs^HW?_SIJOMs9IWNO{#@+UPbQi*W5tX+M- zKaG{*!&nrgb%DNRk_nL_%w&I#^R{wI2KZRJlWv6ZrI3~30TP(xM{lJ>7;E&=ti zBh{b5PN;7Y`)Fgk}i62ME1aDIy632%-0mbZH7oM^Qp2v;d(B7^+mI7ZIf@RgogS zh=_oQbPFmMf8RHEzB~W_y)!#Iv$O9$@AJIx&d#25c2ADJuQqBj5isNJ%;VCX@X2O) zqGlH(?f;sK)gc3-!2Qdm)}1;v2^_&IHDM9rd|AOnG|}Ig=NLpMmT`q6jz167aBuPg z)q1fs*4sVz2N?|5hcb5Ri>BGa8JR5kEq}a-F0r-e`G5#7+ZClr{J@haSwOLu`^hY` z<*`k>?!X^~Q|uV!PJNVU*y5_p>v4nhLf$w#o)%g))nf0#)14xoDHV4}URBEDdx@1? z)fJd;_09|o(_0d0ntOfL(WxR|HGC|DYXdi~9@`q+86xJDR>PkT9y3#q%zcLf$9Y|_ z4!V$&HZl3+J4ZN2aZTD(-Tus24!u1?EX!Mx7<%6KR~;;vhrdWSmm7QeM&Cud^qJ;is5;2}b zGm~0hEskg05!a(W%fgj?5-EN9H2;?<_*aNX^_{GGbu)u9H_TM|A@*UM^AVaiIjNZZ z##Nl}Ns?_GYo~ss>%onf=NStcv<3;nn*WxH75=qqE7;2jIz3p@O<|dF&O&d42BQAW zEet~MaRML9^dhoW$X?L>sm}a$#^d7?$zKX5MbqzZXYnP%?wV>ru1NIB47OE(?Ioe7 zG>@@qb|J>Zx8F_URjEI+J5q}_u-2Eoy%;$0I>;;AA>0d>I(nG(9m5`An~!=nSe=^Q zL4a-=d5dEwn~~lVsxf9%kH_Jqxik`YgQ^2yqg4ql?d#;P22Dh+OT8$99Lbt^#3SaV zKW3t?uW6DDcDfWL81ZJuS9zE?08y_hiRH|3VRKzHi;>KUJ)=75iAM>|+Iu$cu=qOe zg>j5;F|QE&n9@?kRu%cCPJ4vsttEeW@G@QTI6Mc?nm#oBw0ffW=5Ny@!m;`}fUlSV z55Yz#Q+FDRVer=X}^sB9C zm31ECd*w8vOtZkk3*oO9$q|3o9;9~|ept}^Bs$+Sg~Lqmec1d0uB+3-%P7o_;6rHcTGg%rp;wZd(-5*=@EAC%o%BR zarn-sF<*>xL_qhZ%yx}0$L^W+nDg^aefo;lF)caUupNH7@ zbl(WRXT131Ln87D7ipqBfBIX{^Y_6?^C2tozEKZ5I>NRr=l~hq@C?U%xBDjhCO47T z@A9W)0E~q)DGuuMDp2@D7ar5 zONym%gUm8F0=-My%Lb%E*K^pqDoSh1I@w;8_$dNd8mAAq%xAnXAC3EIAzTi1K9W?~ zCBlDDF$q_R!*k_6m%L_ED0BCAI!*tn)$3RXc_4Nxo=WQAk$O0}r@zXRSh zU#xvq;*lNGq$|x_%qBj$7o|k`TF)1Xd{`#sS}F(0K9Eai%3#W_etmb$`MUGtuYSFP z_i7j?K@H(K70P3Iq`_D9f#|qg(}Ajwg&ZbZX})}CC1--^OynL-k7{;L74Nt1po9@o zKx}G8WhSWfZvx@g!=Wzzw(!b+S6BTa3J`=n*&BLfhVPIr)1khVXP@#0_CCeova`!e zG({~OGe_X@8ozP#_wUKZu7nI}Y2E)jgO@Tcesrr;+oSmuP6ke2A(;*V=YR}O00bnZ z+iaeQn1UAc`fAYhLRegU8-KtLO*FesFBz0ku}2l8_3&p=6+Rl-*QCm`+kKEi|HcL& z8jgrI_!|FnCn^??c+y)wMky>KeAK#v7m=o6>}EGi#i`CB0&k&0ah+u1(lek!s{P}% zKK5_6_OKy;YG4;GYeIWKlSxfu^TlCurr)YKL8RU^$`7n{|AcQ&w~I3t3A^NzS1Oql z(vhEh$3ip5XWeYwM!Qxb2tM=-wQnIL$kvO%3!566+sL^yVa9AlSM!yr8fbetC+rks znJ6|WEnuOy->kw{N)=aoQ-F6C$#DZ}bnD8Jpn0a(ruw51d+)57Fo>qQOZB~p&DwrZtm zZl1&~MBOJnzluI6xFs#?VF|^$^&t8>k!WAy zhrhd?+Nws|#vkjb7Q~*#_H*X89wP&e2Spk0Ovmj0iaITbLW(8D8SGnpHx^$lC}P08 z?8;7H+N) zg6q7<{yD&t-2`MlR#V^kk<5lU~N4n zQUOPQ*N#un&HE?n)f&s{YI+eg?SEQBrl~V@^%$_*MmxJcFRsbPibzJ{ppf@U(d_yp}~Fc!DeZhp^GTB2g=smo_t#CQqV8Gy(4zb zsxWYS*97x&J=LBG2=Zs{A!*(U)Z_hX=P5ErzQ)96c{y0#JI2K6`_`M1Eq2W<%H(?0 z@_cWl{@GSeW$~_w+1Io6su=|@cYEpvF?Y;}T;^E|#BcRt#-?_>m!F(ebhFqC!cF6| z&{<5k9tX>bJYUEqNY-Em-mwd{u!u?8m5~$9WC@$8wd#aJrrH-i_B+*_hR2Z+3!O5< zU)IxlfB4R{pPZm1UcDUGUPkSD{hHmYbF%}a)KaXIhvR(mAA?tlD-&XHYi45H+%K0P z)!)!Qt;{iRT1T0M5Z~KdeUq(hg=VXct{<2ll2V4depa>j8%^B*tLhO;V)P3dJqK*P z{y+Xm2BS0{gzF(Q|9=aO?)#a|%>PR-u@|92f%)If{|15lr#4y$J_jf-`u}UdpvdS8 zZ)ij&07TRSWarkVm|0Mh^DCG?^Rh(;kO^$<~d0KkPy3gDGxSSvC;6~UHCfrvtZ zC;>Nh2ApQYjK~Wc4^pF4)0{%}gG718MLlOUiaDjjY zU1*GkAYl*?B@_X_P)7lZLW2NM033^eqb|%qFf8nt2;aI*kQYfpymlV&lwn7feKvGI(Z0PdGY&&#wj>(;w`m54Qz$dvFQ;r7sS(V zb5}lX;X82Xn-a5 z4w`B5iD@^H;@93B?FyFY-u47uL8&$UtiI8!^wX`4T7s|eiIEF%kRNLW6kopctc6O3 zx{XfHxdKQPPHcU}9_FhVYuwJU^^DW>Bjg%kzPg$ZmFhk?fQwvD!QtWgvBpQ2stHV% zO*v0o@2R+t3s)0}m?l;-=9btjX6#XZYqbKOGs_F(2sM#$ChzHiv)oQ zV24XAL57XtukXAN4gEMpe0qnE%(_e6LL3ocKTszcJ(4zX<|QKFu9oRkw;fX>k+*Q2 zNx0@A#I53ZAxDNai`9RHS@p`p^j{WzcfOz8U1+oXp=fT^p#UF*4wfnZBqw zRL>?_qT4T=`ARls5*r%C4C!+)NM)#AJRB>~2MSqUenus0afsLuG7{0Fi@rpnEaKKn9D0~@&A4y=Zffe1dX+es zR}<{Z^4;P)+Nu6!8N7l131#(xvZy^jufjDsYaYQhl?VcTU&?y`Q|wGU%UwYP<-ky0 zlw4Q|ASHF6@4ngfVtiaL?HJ6ZAlHI^B1Rz3_5C!WsTlyI8qUH1u>AGqG@=YqWwZs8 zU}O{%KsW>KDauBR_dNSzurt(1@gc!bY}LqKX!lJjk4OgivJ^+E9g1iWa_@yNbzMQM z&HlX!v_B$uOP!D#D(D|PbJ+4+na3-1HMCoe7#}rqXm_QeV~8)d;LW33^CD@AVIVc0 zka~Q+X1;n{qd?P?wY04j!ai)0mjsiP4*`<$j9hADbnS_*yO|}S zY+spGz9bSI$3Jnn8_wacI%pb+GXk`Hp-ZHIzc69idG`iyt2Z3lly14(9c4ze($u5# zC;i_eWS<6(%sf@**8hUyhe*}F2)++irM2Rzt3};&dQA>^J@y||2E1gAFC7$ zV!TU^s_CJ$bfBVJ6JvKjxD$`u7v@1FqeZ_OV8(=!vO=@D*~+r;aB9JVlbe5pdD+_7 z@XcFY)#97K!H86m@^nm(tx)Op>bK2Dt zH_?@J4ZTtgKBk03{5$BWSA!7bZq{*0LNMk~!{ThAK{#1!4O{fIUywHdAO^c*TB#?5 z6&y|yLlI;7;)Qjl->qw#adf6E)IFm8!uo99vn(E`1$uEMu~Zn&qv0WUD5KPL^_pFS z&XZT?fRcI#!CdFrW3iET>L-U^&jHi`L%+rqrEY!mfngr7{!ziZ$^Jct`){`ma`}ZM zo*9Ub^}Z1^Bt-%I@5EJb$-Ju#qkL%n)~k&94J_%3Z7Qby`eN5F_Gd>^SmsD_`LJ;J z{kXeUZsM(Mzskh`4OD93`4k=ehf|6jws$ixaZ{4zT(|7sQ-yJ$2!c|zwOUt!5+jm- zOD#Lmln|MA$H5XfaZ2>@%3=YCiiHWz?;g?Xyc*pJ^9Ze8te~tf%+X@cNGP{SQl*Va z;#F7=Gb$Ezy}_vPky}$JAZd*7Hk(w|%AelkwlRR)X=?#8QPSy^99j~;**M4KU)BV> z#HMdV<@``p4Q3utREFNP1%7(rADgrDifSl-X!_c@>l?pchfFe;@4BXnO6y7T2~%#UhO`!I6NXIsCs zXNa7RG_8=vQ0~(>FC-pi?`{9KAW#7>d2l@PFCnh8v9K@dWEXWla&vjxb{r_2NpIODIC$nOKc#Jf)24rIA9aKhoFE^g?$A4x0kxGFTVYO#fhF7@e{2%k$l)?@BYVDKtZk>SQ1TXpj5w1I<3qs2K8%`dFs(u6nL-P!KkVL7>>{j$3QcRls3syO zK@$Pk)*UJSF9&b9T)xc-G!h8z^O!#MH=NP>|N})nZ>2_3`kwI(TbQDG%NU*;;iQJava{l z`@|=kNYAC<>^J+;NdVqqn$2>KGR(y%@|s zst((`_B}JX$%>vY2So$PXX6tSkf1KU+^fr{>&QH)Th)d3Ik|Zb$Z8HOeWnsaFWZ55 zU)%^{f+a5L)Dhz>1V&)(Imex|)ptuvw7krn_fN4!I=M|P9+uhH5Bk8Hyo7Y&Sa2io{JDzY338L09-9dm!0S@OB`7un2u28>=abHkkFFh;FEDx|uBBF$fM_%P%y~Vq+>?Dva*kR{N9O!eIbhfO zmQD{{;hwyeC7dhL(0z@X7!g0+OxoeU;fa-?1u zaKPZmEe_3;q`E6-l!MfRoFcYSb3<}Na+iDOH)NqP-dWsiOhxHeXozah2KF!0S8ihu zjDJ(b!8ku8hJB%6&Kk~;qif-^psIh?ESxv=&CD~q#8Z|P9cd6m`bf^mF)U%@&hrVe z2CJy1x??w#G}E?%Ek*4c)eKA91$Pt8o*9uKZ`D=$=sOif*!Tm{L+P#rj@%`_-xEzU zKx!|j5Pc=dCtlVfYC&(SzwDMaN?%gfSuYL_tezO`z01!e5mUZm*yqU?3f1(?AsewS zX=AQ#y+uuq;?d9Wce2MgYH6V!4G*$Gu^B^C(8z%YB<-aSsT{pQuBKPS-dPmvM zpZWI6w-wwN?A_wsy9Uu4@l=utTo{YfFQPE#?liGPnI<`QCpxH^TRuaMW^MDmab@t` zzUKwL(95hQBqA+TP*2BHn$G6!?Be&!N)wsBinmAXik*y@gx`Oh=p=xp?s|WbgU9cW z()~m{p6YeVG+>V(6X}OE(j`jsbyZ-}ZA+WD=N#*8B};^0s~n`~cPeMH=gfxf>KP1C zZ6GbCHZ5H06b#n|kVnT)2MoI^wp~6UB8WNKMHpq(VdGc}MmNVhcwJR;Xw?Cj%0Msk zRn!C6(f3P35`b*)zsor^`SOjWp{^Cxq=l6R7f)lEVPv6sOvs14064H_GB?aDGr>1f zTWTXfdRZm+G~-$=ISq~dfB)oKzJ`TczY#p_wl2zcI7I$yH&CA4^URvF!Svy zEV}E=#M!QZ^kRB9Y3scg0Ki87GMLTq;?c&jtKrc2%J6`E=wWKgq6xkRP<hc2%EiznW$8GO zDrBeUGAoK4rK7X%A|@=fkGqKn|M0q@9D+h=f1VtqXJgJ%Bg(_g`>#MGW9D*rUX%9_mxLXpAnQrXbc0ufq2 zm(i#Ujv(41HavcWkP$x@xmFw-?}KEBt(2t7@7UnT!qo9`#u5r$O8nU>8d6!*DrP%k zI>@NUJ#eZFndAG4pm#()ncUlG4*pj{5TFGk83EFnI>wS#W^kdHUcPz-DI9G zkeSsQg3og2-Q-hIun{U2WidT9DZ#jPPQD|(GjY(`-B=_MT zOBM~jCu`XI6qAPVhS*zhvD@)+&s}r+6m0f#o!05s@sy7MSQbqG41y5}%5O_jPzj*& zqnO48N!7Rlc4)<7=1>5mcwqs;6*tLd7Ic&krLXm8RmiqLaJYPQyndSk1sj00*_+1& zEQH0n_Qg%im1nJzqw2;4JG+6qDy@UJvbm&AEZ3fugwhOlHen>KbCXN_SZz`rvYYsD zL%!Y*@Kmg4@Z^gWFpg0(;04+?_d~oa_&SAt7t9Pujo$EIC#F%Z1AC>#o=F>N-3kmB zT}Zk-q}flK6@J^=AK@jmr`9T(Aro}xRt`hSZv+|K52Uo&qNDp5V!!A5(t=Vq@Ugel4OQ-&8kwAFJzzp{dMBFn%f~vtI-&R-{;;LUE~any9#xX zS%;U@sc@Ria?;552ftfJwkzxllf!H=)CM&bJ9844p{vvuc*uUdA($9iT^!p4BFVJf z7Xhe+&M0h#GK_1F1SFZnz?$aDC=!cZ1PN|9ebC`pIUe}*18`PM7B$hqDsRZjL^qQ>ou5qxLFTbJR=-o}dUqDR;e{ht zCw&kC%7xm0^R`%NPGyzv|Ezp&+o!R)qbuLl+qo(!C@p2D5kc3-W-zi-MD8@FGvfz{ET~@J$OOiiAN?4|~Ir zE4`D!Pd?27DJZo94^R{f$w@R;_J*n=y|*iIiHmlu0$Ak30SY!eREn_jHuLH4^&G&a z&|yuq^-)q^X0~2li3oCnMJQ+BtrGA<9?Fo70Amdl(xIrtm84>{XIL>vC7S_o1sf_J zlZ20n&|wgh8K--g=VJ#uYrrNc^HLYswhVc0aQ(~9k86c82PpS2?}z1dUXjs!f?QqD z40>5u5A{_{4A%3EaRLBB6A1MFy56eh1zt28d#F(|4iYK3~7lf{DCF}xW-jM3i3#+qfGM*IJVre|Q{D7PAVZYwWiqBXsgrx#C_;sw#TUUJ zTK;^XF3rz6sWbp%V4uX}UAl{`>g%cfT)UIZ^(2(jEPgOhq(`mHsOsOjf}|H9@f>84 z{kCgihO~M-9a}Ry3m6zvX5f0A)uLk=?(p75mIf*J+0Ve73%`W5ugK zf>abzm2t=#ie}1IMIQt0F8-cF#qZi_R%&$H}_F0?hhGHw`2XoheR#6BjP2$djj3)=3luWn!Cm&l5D3#e-(MY{}&?B%GvOh{v z8QtfgEe$M5Bk!A$a85Jg>d4cWm4kd4{e+*u_r)ue)>pbB)B$5@j zSZ(to3<_%W)xO7q0I-?4tR4|lX!ZDMU3YNOPnzhVd}2)iT$@<%?_vu${~I=+Y`S%L zbmnhzQS?{QAF&PNzgrlTrA-s`4(I%#-q71J?`IVLP`W1NAoCs_3CHeI;M`m-ludq# zB64uQbNXwk5nuMu?}#)@Ms}w82CI}W@GepoPj9Syl)?v6MG`el3mppTmRT1b5#HYJ zcD&meFsNmLt~PjLT~seW-cB<43@6Q+lIE9=Cb^~Y+$Ma<>33XsW2J~QeSeP6RLoyrx!B{N>P zo_$DJ4=hdm^Hz|pD@8Wg7v>a$T)LF_WTOG66Ts|m>_A?Zwtg0F_$FLdkE`Mqqauv4 zLZR?+F2>lxnkvqgt9xl6Q8d}~_MsUwU?+7|F4P@RFrOjkNBGYA;4?;CzWdm~ho?C7$O9#f=y4$&O z%4uEWA9kx_*tYKYar)=kVVYgkF77eKA`Zu7y6wD;L6%}Qr#VkCONzecwg<28pznY` za;a*-Kq)PvT%v)6MH0?35z5MTgl~0FP?f|=Z@F~V2sTfJy$jr0fbsO;)M1c(8WFpt zYf-)?3-l=n*qe?dxGDUUMs#iPRkhwWNrvNP6_{)r*w^2chI8+tqoX`LSfFv5k``XE zk|IuKdfE_77Of_9(C%+5tIJ!LR(bCO)a27flE+%Xs;h=zjL=vM#?&xCCz4ZWAAnrf>`F_d-MupyP52C~qE%~;VR3p=uRm{H@{z>Y z)R-s5w&>YMZs@Vn?>EZBLzwehWEeovToZI_2!~T~ewch(n=~dO0WrGnrF-ixYMzAj zk+AY|&OY_MLYi!Rp^M3JW3^}y(c5LTq$))XR;Eo#1SUjF4Xq3E@~szixkD128Mt1# zb0JdlxcADzh`n%P17MlWRHZi7PeGhnbpyjvA}Opsp4tp?A6FoA>bttZFmEkBB1Yh7 z26)t%fZbKr9-*P=4rk1O&)};7^J|E z-Z_BqoX}{_XlPOWSe14_LHIANcZQQ`CI7U?4u4MG6vuV38%T=>tFe>S@cIXINV-N` zPi48Je#A>==Bg|ct1^8<4Z#}P1tK=}@>xYI)bI#}_1Bm5$rfLz|2D3JXOpBs2B{$j~D~Pb)n$nl`aq4@oP2RX`Hrlu{Es%a%#-tegE>hHrgA#c60aIB8JH8+^ z$oTFAJ8sD`!y;`)8lBCYV5HB4rtPw9=r+n4v@Kvi2l(s~a!SxlajG-h)$DZ`QDjaj z8wa7CGG4n%83&0XBzqpGdeIzJ==gjyE1o^ll*L%yexKL(-o1|q$h~*Z@mHN-*W#Z7 zTS)~3Nl2*Q%)|;z?lLo})*evgRH^M@4jED6v?RtD-kTWHv#Hf#&}4YW0X5&fe)rzZ zFHF+3d&S+`Srk&=o<8fWyZL(}_d&B9D4WB;3UJ$izHU(Sog;3(o`zrt%`UK`+p(y@ zv2j@1AKE z*esD}roIMG!L%;-Q=rWv0iBG$DEWo2PKIIHs2z*Te2Ry6^Gm%cVHZAk5ps$ zYW2FAfqPzS%qUyx-pkCCEEUFc08pKSA=2M*Vp@LNhyDG}$Vdx>|C7ZRGGSE@POpCs zNqMQ(_Od&*klvg3^qSo33Hi0lW`tjK7aEaRBu_Xe~0qWtQXD z)vNQ~<<8a`Dp;)=KL2Cr()irVFZ9P%tJiV`0f8qt39#L1(f8}mowiQ2a>MCzl0RK- z(|F`vx3HYtombl^`W5S*{v9~-1)5W)S?-Z1Op98KxxKsED z`10WCIMqO>qq?^N@Y$K;%QchEw>v9oUyY5@Z@8VV?v#eyTm3lw)m%Q0r})ROiWi1X zuYl9m_*m$XPw?e4OIC&3+uhd>&3@;aAEgIEeIKrgSguDGXz)<}idvIBiB2>fp%Sx)r#oSbX zyUgewxH1SsXM&~ zb5q|6`mZjW1Du{3uK(Iha`L&|N^{T3`cHwVm>=JrMtzb|+~(Ek;TTwEX#3k`X5_aP5}o2bYXLe-qw_nMiDZF*4ri4huQ)nX`)k$eSijTn8ehW%7&Ub#kZmyt05#FeN4tV&L z>5P}+>?bc3otF&lzVQ1DGeNcD7Y{87{nWxk7M)2lA8J8rAE$this.Mf&&(Mb("Tried to set int value to a number too large ( "+a+" = "+b+")","sIGVV"),c=this.Mf);0>c&&(Mb("Tried to set int value to a number too small ( "+a+" = "+b+")","sIGVV"),c=0);return c};k.Ga=m(x.prototype.Ga,"fssiGVV");k.Db=function(){return this.value||0};k.Db=m(x.prototype.Db,"fssiTB");k.Ub=function(a){return a};k.Ub=m(x.prototype.Ub,"fssiPFB"); +k.Ra=function(){return this.value+""};k.Ra=m(x.prototype.Ra,"fssiTES");k.Oa=function(a){return parseInt(a,10)};k.Oa=m(x.prototype.Oa,"fssiPES");var Ib=function(){this.lb=this.value=null;this.U=!1},Ib=m(Ib,"fsES");k=Ib.prototype;k.Td=2;k.Ga=function(a,b){return b=b?b.toString():""};k.Ga=m(Ib.prototype.Ga,"fsesGVV");k.Ra=function(){return this.value?encodeURIComponent(this.value):""};k.Ra=m(Ib.prototype.Ra,"fsesTES");k.Oa=function(a){return decodeURIComponent(a)};k.Oa=m(Ib.prototype.Oa,"fsesPES"); +var Lb=[Jb,x,Ib],Nb=function(a){null==Hb&&Kb();return Hb.Qa(a)},Nb=m(Nb,"fsSC"),Pb=function(a,b){null==Hb&&Kb();null==t&&(t={},Ob());a.Ua=b;t[a.sessionId]=a},Pb=m(Pb,"fsLFC"),Ob=function(){window.setInterval(Qb,500);Hb.Ha()},Ob=m(Ob,"fsIL"),Qb=function(){for(var a in t)if(t.hasOwnProperty(a)){var b=t[a];b.Rb()||(b.Ua=null,delete t[a])}},Qb=m(Qb,"fsCDI"),Kb=function(){A.Oe();Hb=A.af?A:ra()?z:B},Kb=m(Kb,"fsLT"),z={Jf:"exists",Qa:function(a){if(!a.U)return!0;for(var b in a.state)if(a.state.hasOwnProperty(b)){var c= +a.state[b];if(c.U&&c.Db){var d=c.Tc,e=c.Db(),f=b+":";z.Md(f+z.Jf);for(var g=0,h=1;g")&&(a=a.replace(ac,">"));-1!=a.indexOf('"')&&(a=a.replace(bc,"""));-1!=a.indexOf("'")&&(a=a.replace(cc,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(dc,"�"));return a},Zb=/&/g,$b=//g,bc=/"/g,cc=/'/g,dc=/\x00/g,Yb=/[\x00&<>"']/, +fc=function(){return Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^ia()).toString(36)},gc=function(a,b){return ab?1:0};var hc=Array.prototype.filter?function(a,b,c){return Array.prototype.filter.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=[],f=0,g=da(a)?a.split(""):a,h=0;h]*>|&[^;]+;/g,kc=function(a,b){return b?a.replace(jc,""):a},lc=RegExp("[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]"),mc=RegExp("^[^A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02b8\u0300-\u0590\u0800-\u1fff\u200e\u2c00-\ufb1c\ufe00-\ufe6f\ufefd-\uffff]*[\u0591-\u06ef\u06fa-\u07ff\u200f\ufb1d-\ufdff\ufe70-\ufefc]"),nc=/^http:\/\/.*/,oc=/\s+/,pc=/[\d\u06f0-\u06f9]/;var rc=function(){this.Kj="";this.$h=qc},qc={};var tc=function(){this.df="";this.ai=sc};tc.prototype.ve=function(){return 1};var uc=function(a){return a instanceof tc&&a.constructor===tc&&a.ai===sc?a.df:"type_error:SafeUrl"},sc={};var wc=function(){this.Lj="";this.bi=vc};wc.prototype.ve=function(){return 1};var xc=function(a){return a instanceof wc&&a.constructor===wc&&a.bi===vc?a.Lj:"type_error:TrustedResourceUrl"},vc={};var zc=function(){this.df="";this.Zh=yc;this.Ii=null};zc.prototype.ve=function(){return this.Ii};var yc={};var Ac=function(){return null},Bc=function(a){var b=arguments,c=b.length;return function(){for(var a,e=0;eparseFloat(a))?String(b):a}(),Qc={},Rc=function(a){var b;if(!(b=Qc[a])){b=0;for(var c=Xb(String(Pc)).split("."),d=Xb(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f"+b,d.removeChild(d.firstChild)):d.innerHTML=b;if(1==d.childNodes.length)d=d.removeChild(d.firstChild);else{for(c=c.createDocumentFragment();d.firstChild;)c.appendChild(d.firstChild);d=c}return d};Xc.prototype.appendChild=function(a,b){a.appendChild(b)}; +Xc.prototype.contains=function(a,b){if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||Boolean(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a};E&&Rc(8);var ad={},bd={},cd={},dd={},ed={},fd={},gd=function(){throw Error("Do not instantiate directly");};gd.prototype.Ba=null;gd.prototype.toString=function(){return this.content};var hd=function(){gd.call(this)};ja(hd,gd);var id=function(a,b){return null!=a&&a.Ya===b},jd=function(a){if(null!=a)switch(a.Ba){case 1:return 1;case -1:return-1;case 0:return 0}return null},kd=function(){gd.call(this)};ja(kd,gd);kd.prototype.Ya=ad;var G=function(a){return null!=a&&a.Ya===ad?a:a instanceof zc?F(a instanceof zc&&a.constructor===zc&&a.Zh===yc?a.df:"type_error:SafeHtml",a.ve()):F(ec(String(String(a))),jd(a))},ld=function(){gd.call(this)};ja(ld,gd);ld.prototype.Ya={};ld.prototype.Ba=1;var md=function(){gd.call(this)};ja(md,gd); +md.prototype.Ya=bd;md.prototype.Ba=1;var nd=function(){gd.call(this)};ja(nd,gd);nd.prototype.Ya=cd;nd.prototype.Ba=1;var od=function(){gd.call(this)};ja(od,gd);od.prototype.Ya=dd;od.prototype.Ba=1;var pd=function(){gd.call(this)};ja(pd,gd);pd.prototype.Ya=ed;pd.prototype.Ba=1;var qd=function(a,b){this.content=String(a);this.Ba=null!=b?b:null};ja(qd,hd);qd.prototype.Ya=fd; +var rd=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a){return new b(String(a))}},F=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a,d){var e=new b(String(a));void 0!==d&&(e.Ba=d);return e}}(kd);rd(ld);var sd=rd(md);rd(nd); +var td=rd(od),ud=rd(pd),vd=function(a,b){function c(){}c.prototype=a;var d=new c,e;for(e in b)d[e]=b[e];return d},wd=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a){return(a=String(a))?new b(a):""}},xd=function(a){return(a=String(a))?new qd(a,void 0):""},I=function(a){function b(a){this.content=a}b.prototype=a.prototype;return function(a,d){var e=String(a);if(!e)return"";e=new b(e);void 0!==d&&(e.Ba=d);return e}}(kd);wd(ld);wd(nd);wd(md);wd(od); +var yd=wd(pd),K=function(a){return G(a)},zd=function(a){return a.replace(/<\//g,"<\\/").replace(/\]\]>/g,"]]\\>")},M=function(a){return id(a,ad)?(a=String(a.content).replace(Ad,"").replace(Bd,"<"),String(a).replace(Cd,Dd)):ec(String(a))},Fd=function(a){if(id(a,dd))return a.content.replace(/([^"'\s])$/,"$1 ");a=String(a);a=Ed.test(a)?a:"zSoyz";return a},Id=function(a){return String(a).replace(Gd,Hd)},O=function(a){if(id(a,bd)||id(a,cd))return String(a).replace(Gd,Hd);a instanceof tc?a=Id(uc(a)): +a instanceof wc?a=Id(xc(a)):(a=String(a),a=Jd.test(a)?a.replace(Gd,Hd):"#zSoyz");return a},Ld=function(a){if(id(a,bd)||id(a,cd))return String(a).replace(Gd,Hd);a instanceof tc?a=Id(uc(a)):a instanceof wc?a=Id(xc(a)):(a=String(a),a=Kd.test(a)?a.replace(Gd,Hd):"about:invalid#zSoyz");return a},P=function(a){if(id(a,ed))return zd(a.content);null==a?a="":a instanceof rc?(a=a instanceof rc&&a.constructor===rc&&a.$h===qc?a.Kj:"type_error:SafeStyle",a=zd(a)):(a=String(a),a=Md.test(a)?a:"zSoyz");return a}, +Q=function(a){return id(a,fd)?"zSoyz":a},Nd=function(a){var b=jd(a);if(null==b){var c=b=0,d=!1;a=kc(a+"",id(a,ad)).split(oc);for(var e=0;e":">","`":"`","\u0085":"…", +"\u00a0":" ","\u2028":"
","\u2029":"
"},Dd=function(a){return Od[a]},Pd={"\x00":"%00","\u0001":"%01","\u0002":"%02","\u0003":"%03","\u0004":"%04","\u0005":"%05","\u0006":"%06","\u0007":"%07","\b":"%08","\t":"%09","\n":"%0A","\x0B":"%0B","\f":"%0C","\r":"%0D","\u000e":"%0E","\u000f":"%0F","\u0010":"%10","\u0011":"%11","\u0012":"%12","\u0013":"%13","\u0014":"%14","\u0015":"%15","\u0016":"%16","\u0017":"%17","\u0018":"%18","\u0019":"%19","\u001a":"%1A","\u001b":"%1B","\u001c":"%1C", +"\u001d":"%1D","\u001e":"%1E","\u001f":"%1F"," ":"%20",'"':"%22","'":"%27","(":"%28",")":"%29","<":"%3C",">":"%3E","\\":"%5C","{":"%7B","}":"%7D","\u007f":"%7F","\u0085":"%C2%85","\u00a0":"%C2%A0","\u2028":"%E2%80%A8","\u2029":"%E2%80%A9","\uff01":"%EF%BC%81","\uff03":"%EF%BC%83","\uff04":"%EF%BC%84","\uff06":"%EF%BC%86","\uff07":"%EF%BC%87","\uff08":"%EF%BC%88","\uff09":"%EF%BC%89","\uff0a":"%EF%BC%8A","\uff0b":"%EF%BC%8B","\uff0c":"%EF%BC%8C","\uff0f":"%EF%BC%8F","\uff1a":"%EF%BC%9A","\uff1b":"%EF%BC%9B", +"\uff1d":"%EF%BC%9D","\uff1f":"%EF%BC%9F","\uff20":"%EF%BC%A0","\uff3b":"%EF%BC%BB","\uff3d":"%EF%BC%BD"},Hd=function(a){return Pd[a]},Cd=/[\x00\x22\x27\x3c\x3e]/g,Gd=/[\x00- \x22\x27-\x29\x3c\x3e\\\x7b\x7d\x7f\x85\xa0\u2028\u2029\uff01\uff03\uff04\uff06-\uff0c\uff0f\uff1a\uff1b\uff1d\uff1f\uff20\uff3b\uff3d]/g,Md=/^(?!-*(?:expression|(?:moz-)?binding))(?:[.#]?-?(?:[_a-z0-9-]+)(?:-[_a-z0-9-]+)*-?|-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[a-z]{1,2}|%)?|!important|)$/i,Jd=/^(?![^#?]*\/(?:\.|%2E){2}(?:[\/?#]|$))(?:(?:https?|mailto):|[^&:\/?#]*(?:[\/?#]|$))/i, +Kd=/^[^&:\/?#]*(?:[\/?#]|$)|^https?:|^data:image\/[a-z0-9+]+;base64,[a-z0-9+\/]+=*$|^blob:/i,Ed=/^(?!on|src|(?:style|action|archive|background|cite|classid|codebase|data|dsync|href|longdesc|usemap)\s*$)(?:[a-z0-9_$:-]*)$/i,Ad=/<(?:!|\/?([a-zA-Z][a-zA-Z0-9:\-]*))(?:[^>'"]|"[^"]*"|'[^']*')*>/g,Bd=/"+G(a.content)+"")};if(window.IS_GOOGLE_AFS_IFRAME_){var Td=1,R=function(){return"e"+Td++},Ud=function(a){this.Cb=a};Ud.prototype.j=function(){return this.Cb};var S=new Ud("");S.G=function(){return[]}};if(window.IS_GOOGLE_AFS_IFRAME_)var Vd=function(a,b,c,d,e,f,g,h,l,r,u,y,C,H,J){this.eb=a;this.za=b;this.xi=c;this.Jb=d;this.me=e;this.Te=f;this.yb=g;this.xk=h;this.f=l;this.A=r;this.yj=u;this.bk=y;this.Y=C;this.ac=H;this.xg=!1;this.sg=J};var Wd=function(a,b){if(a.classList)return a.classList.contains(b);for(var c=a.className.split(" "),d=0;d"+ +a+"";var c;try{c=b.firstChild.firstChild.firstChild}catch(d){return null}return 1==c.nodeType&&"tr"==c.tagName.toLowerCase()?c:null},be=function(a){var b=a.parentNode,c=a.nextSibling,d=document.createElement("div");d.appendChild(a);b&&(c?b.insertBefore(d,c):b.appendChild(d));return d};var U=function(a,b,c){if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent)a.attachEvent("on"+b,c);else{var d=a["on"+b];a["on"+b]=null!=d?Bc(c,d):c}},ce=function(a,b){U(a,"mousedown",b);U(a,"mousedown",function(a,b,e){var f=!1;return function(){f||(a.removeEventListener?a.removeEventListener(b,e,!1):a.detachEvent&&a.detachEvent("on"+b,e),f=!0)}}(a,"mousedown",b))};var de=function(a){de[" "](a);return a};de[" "]=function(){};E&&Rc("9");!Mc||Rc("528");Lc&&Rc("1.9b")||E&&Rc("8")||Jc&&Rc("9.5")||Mc&&Rc("528");Lc&&!Rc("8")||E&&Rc("9");var ee=function(a,b,c,d,e,f,g,h){this.Rc=a;this.Ef=b;this.Cf=c;this.Ff=d;this.Df=e;this.Gf=f;this.Rd=g;this.Hf=h};ee.prototype.clone=function(){return new ee(this.Rc,this.Ef,this.Cf,this.Ff,this.Df,this.Gf,this.Rd,this.Hf)}; +var fe=function(a,b){if(0==b)return a.Rc;if(1==b)return a.Rd;var c=Cc(a.Rc,a.Cf,b),d=Cc(a.Cf,a.Df,b),e=Cc(a.Df,a.Rd,b),c=Cc(c,d,b),d=Cc(d,e,b);return Cc(c,d,b)},he=function(a){var b=ge,c=(a-b.Rc)/(b.Rd-b.Rc);if(0>=c)return 0;if(1<=c)return 1;for(var d=0,e=1,f=0;8>f;f++){var g=fe(b,c),h=(fe(b,c+1E-6)-g)/1E-6;if(1E-6>Math.abs(g-a))return c;if(1E-6>Math.abs(h))break;else gf;f++)gNd(a.text),f:a.f}))},ne=function(a){return F(0'+G(a.text)+""+(a.f?"‏":"‎"):"")};var qe=function(a){return F('"+K(oe(a))+"")},re=function(a){return F('
"+K(ne({text:a.Hd,Ia:!1,f:a.f}))+""+(a.mg?' ('+K(pe({text:a.mg,f:a.f}))+")":"")+"
"+(a.Zi?"":''+K(oe(a))+""))},se=function(a){return F('"+K(ne({text:a.text,Ia:!1,f:a.f}))+"")},te=function(a){var b=F,c;c=a.wh;var d=a.xh;a=a.f;var e="";if(d&&0'+G(c)+"")},ue=function(a){return F('"+te(a)+"")},ve=function(a){return F("
"+ +G(a.Ka)+"
"+G(a.La)+"
"+G(a.Ad))},we=function(a){return F("
"+G(a.Ka)+"
"+G(a.La))},xe=function(a){var b,c="",d=b=a.eb,e=typeof d;switch("object"==e&&null!=d||"function"==e?b.toString():b){case 1:c+="oneLine";break;case 2:c+="twoLine";break;case 3:c+="threeLine"}c=xd(c);a=""+('
"+G(a.content)+"
");return F(a)};var ye=function(a){var b=Yc(a),c=new Vc(0,0),d;d=b?Yc(b):document;var e;(e=!E||9<=Uc)||(e="CSS1Compat"==Zc(d).qc.compatMode);if(a==(e?d.documentElement:d.body))return c;var f;a:{try{f=a.getBoundingClientRect()}catch(g){f={left:0,top:0,right:0,bottom:0};break a}E&&a.ownerDocument.body&&(a=a.ownerDocument,f.left-=a.documentElement.clientLeft+a.body.clientLeft,f.top-=a.documentElement.clientTop+a.body.clientTop)}a=Zc(b).qc;b=a.scrollingElement?a.scrollingElement:Mc||"CSS1Compat"!=a.compatMode?a.body|| +a.documentElement:a.documentElement;a=a.parentWindow||a.defaultView;b=E&&Rc("10")&&a.pageYOffset!=b.scrollTop?new Vc(b.scrollLeft,b.scrollTop):new Vc(a.pageXOffset||b.scrollLeft,a.pageYOffset||b.scrollTop);c.x=f.left+b.x;c.y=f.top+b.y;return c};var ze=function(a){return F(""+G(a.text)+"")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ae=function(a,b){this.ki=a;this.D=b||ze};Ae.prototype.j=function(){return this.D({text:this.ki,ca:null})}};var Be=function(a){var b="";a=a.elements;for(var c=a.length,d=0;d';a=a.Jc;for(var c=a.length,d=0;d")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ee=function(a,b){this.F=R();this.qb=a;this.D=b||De};Ee.prototype.j=function(){for(var a=[],b=0;b^<]*>/g,"")},Le=function(a){var b=a.offsetWidth;if(!Ge())return b;var c=document.defaultView||{};c&&c.getComputedStyle?(a=c.getComputedStyle(a,!1),b-=He(a.getPropertyValue("padding-left"))+He(a.getPropertyValue("padding-right"))):(a=a.currentStyle,b-=He(a.paddingLeft)+He(a.paddingRight));return b},Me=function(a){var b=a.cloneNode(!0);b.style.visibility="hidden";b.style.position="absolute";if(ra()){var c=a.ownerDocument.createElement("div"); +c.style.visibility="hidden";c.style.position="relative";c.style.width="9999px";c.appendChild(b);a.parentNode.appendChild(c)}else b.style.top="0",b.style.whiteSpace="nowrap",a.parentNode.appendChild(b);a=new Wc(b.offsetWidth,b.offsetHeight);ra()?c.parentNode.removeChild(c):b.parentNode.removeChild(b);return a},Ne=function(){var a=document.createElement("div");a.innerHTML="";return"http://www.w3.org/2000/svg"==(a.firstChild&&a.firstChild.namespaceURI)};var Oe=/([?|&]{1}nm=)([\d]{1,})/,Pe=/(\?|&)clkt=-?[\d]*/g,Qe=/[&\?]nb=\d/,Re=/(\?|&)nx=-?[\d]+/g,Se=/(\?|&)ny=-?[\d]+/g,Ue=function(a){return function(){for(var b=0;ba.length+b.length&&(a+=b+encodeURIComponent(c),1950'),c=a.Jc,d=c.length,e=0;e'+G(f)+"");b+=""}return F(b)},lf=function(a){var b=F;if("jfkButton"==a.Y){var c=a.ij,d=a.text;a=F(K(Sd({href:a.url,A:a.A,qa:"grayJfkButton",content:I((c?'': +"")+''+G(d)+"")})))}else a='";return b(a)};var mf=function(a){var b=a.rb?"right":"left";a=""+('
'+G(a.Da)+'
'+G(a.Ea)+"
");return F(a)},nf=function(a){var b=a.rb?"right":"left";return a=""+('
'+Q(a.Da)+'
'+Q(a.Ea)+"
")},of=function(a){var b= +a.f?"right":"left";a=""+('
'+G(a.Ea)+''+G(a.Da)+"
");return F(a)};if(window.IS_GOOGLE_AFS_IFRAME_){var pf=function(a,b,c,d,e,f,g,h){this.F=R();this.va=a;this.aj=b;this.jj=c;this.Cb=d;this.ui=e;this.I=f;this.W=g;this.D=h||lf};pf.prototype.j=function(){return this.D({uid:this.F,url:this.va,zg:this.aj,ij:this.jj,text:this.Cb,Y:this.ui,f:this.I,A:this.W})};var qf=function(a,b,c,d,e){"svgIcon"==c&&(c=Ne()?c+"Ctc":"pngIcon");return new pf(a,(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com/images/afs/mobile/button_ctc.png",(window._googCsaAlwaysHttps?"https:": +"")+"//www.google.com/images/afs/mobile/gray_phone_icon.png",b,c,d,e,void 0)},rf=function(a,b,c,d,e){"svgIcon"==c&&(c=Ne()?c+"Ctd":"pngIcon");return new pf(a,(window._googCsaAlwaysHttps?"https:":"")+"//www.google.com/images/afs/mobile/"+(c?"ctd_get_app.png":"ctd-dl-icon.png"),"",b,c,e,d,void 0)},sf=function(a,b){var c=[];a.ctc&&c.push(qf(a.ctc.u,a.ctc.bt,b.Y,b.f,b.A));a.ctd&&c.push(rf(a.u,a.ctd.ps,b.Y,b.f,b.A));!(1<=c.length)||b.Y||a.ctc&&a.ctc.coa||a.ctd||c.push(new pf(a.u,(window._googCsaAlwaysHttps? +"https:":"")+"//www.google.com/images/afs/mobile/button_visit_site.png","",b.xk,"",b.f,b.A,void 0));return c},tf=function(a,b,c,d){this.Nc=a;this.jc=b;this.o=c;this.D=d||of};tf.prototype.j=function(){var a={Da:this.jc.j(),Ea:this.Nc.j(),Z:this.o.ac?60:78,Li:"jfkButton"==this.o.Y?"top":"middle",ga:12,borderColor:"jfkButton"==this.o.Y||this.o.ac?"":"#DDDDDD",f:this.o.f};return this.D(a)};tf.prototype.M=function(a,b){this.Nc.M&&this.Nc.M(a,b);this.jc.M&&this.jc.M(a,b)};tf.prototype.G=function(a){var b= +[];this.Nc.G&&(b=b.concat(this.Nc.G(a)));this.jc.G&&(b=b.concat(this.jc.G(a)));return b};var uf=function(a,b,c){b=sf(b,c);return 1==b.length?new tf(a,b[0],c,void 0):a},vf=function(a,b){var c=sf(a,b);return 1a?b=0:.8a&&(.2>=c&&(g.style.paddingBottom="3px"),.95<=c?g.style.paddingBottom="1px":.85<=c&&(g.style.paddingBottom="2px"));g&&1==c&&(g.style.paddingBottom="");if(window.onresize)window.onresize();f.style.opacity=b},l=function(a){var b=2*(.5-a);.5a&&(c=1);f.style.height=e*c+"px";f.style.opacity=b;if(window.onresize)window.onresize()},r=new ke(350);return function(){r.$a||(Wd(b,"collapsed")?(r.Gb=h,Xd(b,"collapsed"),d&&Xd(d,"collapsed")):(r.Gb=l,Yd(b, +"collapsed"),d&&Yd(d,"collapsed")),le(r))}};var Af=function(a){return F('
'+G(a.Ka)+"
"+yf({content:I('
'+(!a.J||!a.O||a.$&&a.V?"":zf({J:a.J,O:a.O,xd:!0}))+G(a.La)+'
'+G(a.Ad)+"
"),f:a.f,$:a.$,V:a.V,sa:a.sa,ra:a.ra,Z:a.$&&a.V?45:0,ga:0,rb:a.f,J:a.J,O:a.O})+"
")},Bf=function(a){return F('
'+G(a.Ka)+"
"+yf({content:I('
'+ +(!a.J||!a.O||a.$&&a.V?"":zf({J:a.J,O:a.O,xd:!0}))+'
'+G(a.La)+"
"),f:a.f,$:a.$,V:a.V,sa:a.sa,ra:a.ra,Z:a.$&&a.V?45:0,ga:0,rb:a.f,J:a.J,O:a.O})+"
")},Cf=function(a){return F("
"+(a.$&&a.V?'':"")+G(a.nj)+(a.J&&a.O?" "+zf({J:a.J,O:a.O,xd:!0}):"")+G(a.oj)+"
")},yf=function(a){return F(K(mf({Da:I(""+ +(a.$&&a.V?'
'+(a.J&&a.O?zf({J:a.J,O:a.O,xd:!1}):"")+"
":"")),Ea:I(""+G(a.content)),Z:a.Z,ga:a.ga,rb:a.f})))},zf=function(a){return F('
('+ +G(a.O)+")
")};var Df=function(a){return F('')},Ef=function(a){return F('')};if(window.IS_GOOGLE_AFS_IFRAME_){var Gf=function(a){return a.adIconUrl&&"title-right"==a.adIconLocation?new Ff(a.adIconUrl,a.img?Df:Ef):S},Ff=function(a,b){this.ek=a;this.D=b};Ff.prototype.j=function(){return this.D({ya:this.ek})}};var Hf=function(a){return F((a.Ng?F(''):"")+'
'+K(pe({text:a.Hd,f:a.f}))+"
")};if(window.IS_GOOGLE_AFS_IFRAME_){var If=function(a,b,c){this.Ic=a;this.I=b;this.D=c||Hf};If.prototype.j=function(){return this.D({Hd:this.Ic,f:this.I,Ng:!0})}};var Kf=function(a){return""+Jf({text:a.text.c,Ia:a.text.rtl,f:a.f})},Jf=function(a){return''+Q(a.text)+""+(a.f?"‏":"‎")};var Lf=function(a){return F(a.Ne?"
"+K(pe({text:a.Ne,f:a.f}))+"
":"")};if(window.IS_GOOGLE_AFS_IFRAME_){var Mf=function(a,b,c){this.F=R();this.Cb=a;this.I=b;this.D=c||Lf};Mf.prototype.j=function(){return this.D({uid:this.F,Ne:this.Cb,f:this.I})};var Nf=function(a,b){return a.location?new Mf(a.location,b.f):S}};if(window.IS_GOOGLE_AFS_IFRAME_){var Pf=function(a,b,c,d){this.F=R();this.xa=a;this.Ce=b;this.zk=c;this.D=d||Of};Pf.prototype.j=function(){return this.D({uid:this.F,Gd:this.xa,tb:this.Ce,Hh:this.zk})};var Qf=function(a,b){var c=a.gt&&"oh"==a.gt.r&&a.gt.t?a.gt.t:null;return a.oh&&0",c=a.$e,d=c.length,e=0;e"}return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var Sf=function(a,b,c,d){this.F=R();this.jk=a;this.W=b;this.I=c;this.D=d||Rf};Sf.prototype.j=function(){return this.D({uid:this.F,$e:this.jk,A:this.W,f:this.I})};var Uf=function(a,b){return a.plus_ones?new Sf(Tf(a),b.A,b.f):S},Tf=function(a){var b=[];if(a.plus_ones)for(var c=0,d=a.plus_ones.length;c  ('+K(Sd({href:a.Mc.u,content:Math.round(10*a.Mc.r)/10,A:a.A,qa:"sr-gt sr-gl"}))+")":"")},Xf=function(a){for(var b='
',c=a.ik,d=c.length,e=0;e ':"LINK_START"==f?'":"LINK_END"==f?"":"NUM_START"==f?'':"NUM_END"== +f?" ":K(pe({text:f,f:a.f})));return F(b+"
")},Vf=function(a){return F('
')};if(window.IS_GOOGLE_AFS_IFRAME_){var Yf=function(a,b,c,d,e,f){this.F=R();this.Cb=a;this.W=b;this.Pa=c;this.va=d;this.I=e;this.D=f||Xf};Yf.prototype.j=function(){return this.D({uid:this.F,ik:this.Cb,A:this.W,r:this.Pa,vk:this.va,f:this.I})};var Zf=function(a,b){if(a.ctd&&a.ctd.r&&a.ctd.nr&&b.ac){var c=a.ctd.r;return new Yf(["NUM_START",c,"NUM_END","RATING"," ","("+a.ctd.nr+")"],!1,c,"",b.f)}return a.sr&&a.sr.nt&&a.sr.r&&a.sr.u?new Yf(a.sr.nt,b.A,a.sr.r,a.sr.u,b.f):S}};var ag=function(a){var b="";if(a.qf&&0'),c=a.qf,d=c.length,e=0;e";c=a.ck;d=c.length;for(e=0;e";if(a.Te&&a.na&&0';c=a.na;d=c.length;for(e=0;e"}}return F(b)}, +$f=function(a){return F("")},bg=function(a){for(var b='")},cg=function(a){return F('")},dg=function(a){return F('
'+cg({uid:a.uid,na:a.na,A:a.A,qh:"sitelinksTruncatedWide",nh:"sitelinksTruncatedNarrow",Ih:"nonSfblSitelinksWrapper"})+ +"
")};if(window.IS_GOOGLE_AFS_IFRAME_){var eg=function(a,b,c,d,e){this.F=R();this.$b=a;this.W=b;this.Qj=c;this.I=d;this.D=e||ag};eg.prototype.j=function(){for(var a=[],b=[],c=0;c',c=a.be,d=c.length,e=0;e'+(0!=e?"· ":"")+K(pe({text:c[e],f:a.f}))+"";b+=""}return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var jg=function(a,b,c){this.vi=a;this.I=b;this.D=c||ig};jg.prototype.j=function(){return this.D({be:this.vi,f:this.I})};var kg=function(a,b){return a.cos&&0d&&(c=c.substring(0,d-3)+"...");a.nodeValue=c;return!1}c=a.textContent||a.innerText;if(!c||c.length<=(b?0:4))return a.parentNode.removeChild(a),!0;for(c=lg(a.lastChild,b);c;)c=lg(a.lastChild,c);return!1},mg=function(a,b){if(!(0>=b)){for(var c=a.innerHTML.length;0b;c--)for(var d=a,e=lg(d.lastChild,!1);e;)e=lg(d.lastChild, +e);a.offsetHeight>b&&(a.innerHTML="")}},ng=function(a,b){var c=a.style.whiteSpace,d=a.style.wordWrap;a.style.whiteSpace="nowrap";a.style.wordWrap="normal";var e=a.offsetHeight;a.style.whiteSpace=c;a.style.wordWrap=d;mg(a,e*b+b)},og=function(a,b,c,d,e){var f=a.offsetHeight;if(!(f<=b)){var g=be(a);a=be(g);g.style.overflow="hidden";g.style.position="relative";var h=document.createElement("div");try{h.style.backgroundImage="linear-gradient(to bottom, rgba(255,255,255,0), #ffffff)"}catch(L){}h.style.height= +"30px";h.style.position="absolute";h.style.bottom=0;h.style.width="100%";h.style.pointerEvents="none";g.appendChild(h);var l=document.createElement("div");l.innerHTML=c;l.className="expander";l.style.textAlign="center";l.style.color=e;l.style.cursor="pointer";l.style.fontSize="11px";a.appendChild(l);var r=b-l.offsetHeight;g.style.height=r+"px";var u=f-r,y=document.getElementById("adBlock"),C=function(a){var b=y?y.offsetHeight:null;g.style.height=r+a*u+"px";.8<=a&&(l.innerHTML=d,h.style.background= +"");y&&b&&y.offsetHeight>b&&(y&&.2>=a&&(y.style.paddingBottom="4px"),y&&.98<=a?y.style.paddingBottom="1px":y&&.97<=a?y.style.paddingBottom="2px":y&&.96<=a&&(y.style.paddingBottom="3px"));y&&1==a&&(y.style.paddingBottom="");if(window.onresize)window.onresize()},H=function(a){g.style.height=f-a*u+"px";if(.2>=a)try{h.style.backgroundImage="linear-gradient(to bottom, rgba(255,255,255,0), #ffffff)"}catch(b){}.8<=a&&(l.innerHTML=c);if(window.onresize)window.onresize()},J=new ke(400);U(l,"click",function(){J.$a|| +l.innerHTML!=c?J.$a||(J.Gb=H,le(J)):(J.Gb=C,le(J))})}};if(window.IS_GOOGLE_AFS_IFRAME_){var pg=function(a,b,c){ng(T(a.document,b),2);U(a,"resize",function(){var d=T(a.document,b);d.innerHTML=c;ng(d,2)})},qg=function(a,b,c,d,e,f,g,h,l,r,u,y,C,H){this.F=R();this.P=a;this.T=b;this.ob=R();this.R=c;this.zc=d;this.vb=e;this.oa=f;this.vc=g;this.Dc=h;this.Cc=l;this.Ac=r;this.Pa=u;this.zb=y;this.I=C;this.fa=H||Af;this.Fb=R();this.Ca=R()};qg.prototype.j=function(){var a=Be({elements:[this.oa.j(),this.R.j()]}),b=Be({elements:[this.P.j(),this.vb.j()]}),c=this.zc? +a:this.T.j(),d=this.zc?this.T.j():a,a=this.fa({Ka:b,La:c,Ad:d,Eb:this.F,oc:this.ob,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb,Lc:!1,f:this.I}),b=this.fa({Ka:b,La:c,Ad:d,Eb:this.Fb,oc:this.Ca,J:this.Pa,O:this.zb,Lc:!0,f:this.I});return Be({elements:[a,b]})};qg.prototype.M=function(a){var b=T(a.document,this.ob).innerHTML;pg(a,this.ob,b);this.Ca&&(b=T(a.document,this.Ca).innerHTML,pg(a,this.Ca,b));this.Fb&&U(a,"resize",wf(a,this.F,this.Fb))};qg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))}; +var rg=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.F=R();this.P=a;this.T=b;this.ob=R();this.R=c;this.vb=d;this.oa=e;this.vc=f;this.Dc=g;this.Cc=h;this.Ac=l;this.Pa=r;this.zb=u;this.I=y;this.fa=C||Bf;this.Fb=R();this.Ca=R()};rg.prototype.j=function(){var a=Be({elements:[this.P.j(),this.vb.j()]}),b=Be({elements:[this.oa.j()," ",this.R.j()," ",this.T.j()]}),c=this.fa({Ka:a,La:b,Eb:this.F,oc:this.ob,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb,Lc:!1,f:this.I}),a=this.fa({Ka:a,La:b,Eb:this.Fb, +oc:this.Ca,J:this.Pa,O:this.zb,Lc:!0,f:this.I});return Be({elements:[c,a]})};rg.prototype.M=function(a){var b=T(a.document,this.ob).innerHTML;pg(a,this.ob,b);this.Ca&&(b=T(a.document,this.Ca).innerHTML,pg(a,this.Ca,b));this.Fb&&U(a,"resize",wf(a,this.F,this.Fb))};rg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))};var sg=function(a,b,c,d,e,f,g,h,l,r,u){this.P=a;this.T=b;this.R=c;this.oa=d;this.vc=e;this.Dc=f;this.Cc=g;this.Ac=h;this.Pa=l;this.zb=r;this.fa=u||Cf};sg.prototype.j=function(){var a= +Be({elements:[this.oa.j()," ",this.P.j()," "]}),b=Be({elements:[" ",this.T.j()," ",this.R.j()]});return this.fa({nj:a,oj:b,$:this.vc,V:this.Dc,sa:this.Cc,ra:this.Ac,J:this.Pa,O:this.zb})};sg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a))}};if(window.IS_GOOGLE_AFS_IFRAME_){var yg=function(a,b,c,d,e){this.F=R();this.gc=a;this.caps_=b;this.o=c;this.D=e||tg;d=[];c.Y&&1!=c.eb&&(e=df(a,c),e=new Ee([e,Gf(a)]),d.push(new af(e,a,c)));e=c.Y&&1!=c.eb?S:df(a,c);var f=c.Y&&1!=c.eb?S:Gf(a),g=jf(a,c),h=gf(a,c);if(a.ctd){var l=a.ctd.iu;if(l)var r=a.ctd.ih>a.ctd.iw?"height":"width",u=a.u,y=a.ctd.ir;else y=u=r=void 0;var C=a.ctd.r,H=a.ctd.nr;switch(c.eb){case 1:e=new sg(e,h,g,c.yb,l,r,u,y,C,H);break;case 2:e=new rg(e,h,g,f,c.yb,l,r,u,y,C,H,c.f);break; +default:e=new qg(e,h,g,c.me,f,c.yb,l,r,u,y,C,H,c.f)}}else switch(c.eb){case 1:e=new ug(e,h,g,c.yb);break;case 2:e=new vg(e,h,g,f,c.yb);break;default:e=new wg(e,h,g,a.pn?new If(a.pn,c.f):S,c.me,f,c.yb)}e=new af(e,a,c);b=xg(a,b,c);c.Y?(b=new Ee([e].concat(b)),d.push(uf(b,a,c))):(d.push(uf(e,a,c)),d=d.concat(b));this.$c=new Ee(d);this.Wf=R()};yg.prototype.j=function(){var a={uid:this.F,B:this.gc,A:this.o.A,fi:this.$c.j(),Jb:this.o.za||this.o.Jb,Vf:this.Wf,kk:null,jh:null};return this.D(a)};yg.prototype.M= +function(a,b){var c=this.$c.G(a.document),d=document.getElementById(this.Wf);d&&c.push(new Ze(d,"&nb=18"));for(d=T(a.document,this.F);null!=d&&!Wd(d,"a_");)d=d.parentElement;d&&$e(c,d,T(a.document,"adBlock"),b);this.$c.M&&this.$c.M(a,b)};var wg=function(a,b,c,d,e,f,g,h){this.P=a;this.T=b;this.R=c;this.Ic=d;this.zc=e;this.vb=f;this.oa=g;this.fa=h||ve};wg.prototype.j=function(){var a=Be({elements:[this.oa.j(),this.R.j(),this.Ic.j()]});return this.fa({Ka:Be({elements:[this.P.j(),this.vb.j()]}),La:this.zc? +a:this.T.j(),Ad:this.zc?this.T.j():a})};wg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))};var vg=function(a,b,c,d,e,f){this.P=a;this.T=b;this.R=c;this.vb=d;this.oa=e;this.fa=f||we};vg.prototype.j=function(){var a=Be({elements:[this.P.j(),this.vb.j()]}),b=Be({elements:[this.oa.j(),this.R.j(),this.T.j()]});return this.fa({Ka:a,La:b})};vg.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))};var ug=function(a,b,c,d){this.P=a;this.T=b; +this.R=c;this.oa=d};ug.prototype.j=function(){return Be({elements:[this.oa.j(),this.P.j(),this.T.j(),F(""),this.R.j()]})};ug.prototype.G=function(a){return this.P.G(a).concat(this.R.G(a).concat(this.T.G(a)))}};var zg=function(a,b,c,d,e){this.gg=a;this.tg=b;this.hh=c;this.Oj=d;this.Nj=e||""};zg.prototype.$j=function(a){var b=new $a("https:"+Ka()+"/afs/gen_204");n(b,"client",this.gg);n(b,"zx",this.tg());n(b,"aqid",this.Nj);n(b,"action",a);this.hh(ab(b))};var Ag={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400", +darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc", +ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a", +lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1", +moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57", +seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};var Fg=function(a){var b={};a=String(a);var c="#"==a.charAt(0)?a:"#"+a;if(Bg.test(c))return b.ud=Cg(c),b.type="hex",b;a:{var d=a.match(Dg);if(d){var c=Number(d[1]),e=Number(d[2]),d=Number(d[3]);if(0<=c&&255>=c&&0<=e&&255>=e&&0<=d&&255>=d){c=[c,e,d];break a}}c=[]}if(c.length)return b.ud=Eg(c[0],c[1],c[2]),b.type="rgb",b;if(Ag&&(c=Ag[a.toLowerCase()]))return b.ud=c,b.type="named",b;throw Error(a+" is not a valid color string");},Gg=/#(.)(.)(.)/,Cg=function(a){if(!Bg.test(a))throw Error("'"+a+"' is not a valid hex color"); +4==a.length&&(a=a.replace(Gg,"#$1$1$2$2$3$3"));return a.toLowerCase()},Eg=function(a,b,c){a=Number(a);b=Number(b);c=Number(c);if(isNaN(a)||0>a||255b||255c||255'+Q(a[d])+"";return b};var Ng=function(a){return F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&a.B.img?(a.kc?'':"")+''+(a.kc?"":""):"")},Og=function(a){return F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&!a.B.img?'':"")};var Qg=function(a){var b=F,c='
',d;if(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&a.B.img&&a.B.adIconWidth){d=I(""+K(Ng({B:a.B,kc:a.Jb,A:a.A,Kg:a.Bk})));var e=I(""+Pg(a)),f=a.B.adIconSpacingAfter?a.B.adIconSpacingAfter:12,g=a.f?"right":"left";d=""+('
'+G(d)+''+G(e)+"
");d=F(d);d=G(d)}else d=Pg(a);c=c+d+"
";d=a.expansion;d=F(d&&""!=d?'
'+G(d)+"
":"");return b(c+d+(a.ii?F('
'+(a.Fh?'': +'
')+'
'+(a.Fh?'': +'
')+"
"):"")+"
")},Pg=function(a){return F(G(a.li)+G(a.tk)+(a.Fg&&a.V?K(yf({content:a.eg,f:a.f,$:a.Fg,V:a.V,sa:a.sa,ra:a.ra,Z:45,ga:12,rb:a.f})):'
'+G(a.eg)+"
"))};if(window.IS_GOOGLE_AFS_IFRAME_){var Rg=function(a,b,c,d){this.gc=a;this.F=R();this.lj=R();var e=df(a,c),e=new Ee([e,Gf(a)]);this.Ah=new af(e,a,c);var f=jf(a,c),g=Zf(a,c),e=gf(a,c),f=new Ee([f,g],Ce),e=c.me?new Ee([f,e]):new Ee([e,f]),e=new Ee([new af(e,a,c),kg(a,c)]);this.fg=uf(e,a,c);this.qg=new Ee(xg(a,b,c));this.gj=!c.xg;c.xg=!0;this.o=c;this.Wi=a.ctc||a.ctd;this.Mg="collapse"==c.ac;a.ctd&&(this.Di=a.ctd.iu,this.Fi=a.ctd.ih>a.ctd.iw?"height":"width",this.Ei=a.u,this.fj=a.ctd.ir);this.D=d||Qg}; +Rg.prototype.j=function(){var a={tk:this.Ah.j(),li:this.o.yb.j(),eg:this.fg.j(),expansion:this.qg.j(),Eb:this.F,f:this.o.f,Fg:this.Di,V:this.Fi,sa:this.Ei,ra:this.fj,B:this.gc,Jb:this.o.za||this.o.Jb,A:this.o.A,Vf:this.lj,ii:this.Mg,Fh:Ne()};return this.D(a)};Rg.prototype.M=function(a,b){this.Ah.M(a,b);this.fg.M(a,b);this.qg.M(a,b);var c=T(a.document,this.F),d=c.parentNode;this.Wi||Yd(c,"n_");var e=Zd(c,"a","e_");0'+(a.gd?'':"")+G(a.$d)+(a.gd?"":"")+"":"")},Vg=function(a){return""+(a.Bc?''+Q(a.Bc)+"":"")};var tg=function(a){var b=(a.jh?"":Og(a))+'
'+(a.jh?"":Ng({B:a.B,kc:a.Jb,A:a.A,Kg:a.Vf}))+'
',c;c=a.kk?F('"):"";return b+c+Q(a.fi)+"
"+F(a.B.adIconUrl&&"ad-left"==a.B.adIconLocation&&!a.B.img?'
': +"")};var Wg=function(a){return F(a.text?'
'+G(a.text)+"
":"")};var Xg=function(a){var b="";if(a.Kd&&0',c=a.Kd,d=c.length,e=0;e'+K(pe(f))+" - "+(f.rh?'"+K(pe({text:f.source,f:f.f}))+"":K(pe({text:f.source,f:f.f})))+"":""),b=b+f;b+=""}else a.tb&&(b+=K(Wg({text:a.tb})));return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_){var Yg=function(a,b,c,d){this.F=R();this.Tj=a;this.Ce=b;this.I=c;this.D=d||Xg};Yg.prototype.j=function(){return this.D({uid:this.F,Kd:this.Tj,tb:this.Ce,f:this.I})};var Zg=function(a,b){var c=a.gt&&"ar"==a.gt.r&&a.gt.t?a.gt.t:null;return a.ar&&0':"");a=a.Gd;for(var c=a.length,d=0;d'+(0!=d?"· ":"")+''+G(a[d].t)+" ";b+=""}else a.tb&&(b+=K(Wg({text:a.tb})));return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_)var xg=function(a,b,c){return b.isHighendMobile?c.ac?[Nf(a,c),hg(a,c)]:b.reviewUnderSellerRating?[kg(a,c),hg(a,c),Zf(a,c),Zg(a,c),Uf(a,c),Nf(a,c),Qf(a,c),vf(a,c)]:[kg(a,c),Zg(a,c),hg(a,c),Zf(a,c),Uf(a,c),Nf(a,c),Qf(a,c),vf(a,c)]:b.reviewUnderSellerRating?[kg(a,c),Uf(a,c),Nf(a,c),hg(a,c),Zf(a,c),Zg(a,c),Qf(a,c)]:[kg(a,c),Zg(a,c),Uf(a,c),Nf(a,c),hg(a,c),Zf(a,c),Qf(a,c)]},ch=function(a,b,c,d,e){var f=Rb(d),g=Sb(d),h=f("type")||"ads",l=a.linkColorSchemeVisUrlLinkColor|| +"#008000",r=a.linkColorSchemeTitleLinkColor||"#0000CC";a.isHighendMobile&&a.mobileUiFormat?(l="#006621",r="#1a0dab"):$g(d,a)&&(r=l="#4272db");var l=f("colorDomainLink",l),r=f("colorTitleLink",r),u=e.adBadgeColor||l,y="0.85em",C=f("fontSizeDomainLink");C&&(y=.85*C+"px");var H;H=(H=d.width)&&"auto"!=H?H:"100%";var J={Qb:!1,Ud:null,ae:null};if(d.verticalSpacing){var L=d.verticalSpacing/2;J.Qb=!0;J.Ud=Math.floor(L);J.ae=Math.ceil(L)}var L=(L=f("colorAdSeparator"))?L:a.isHighendMobile||a.isTablet?"#E6E6E6": +null,ua=f("colorAdBackground"),ka=f("colorAdBorder"),la=f("colorText"),qa=f("colorBackground"),eb=f("colorBorder"),sb=f("colorAttribution"),fb=f("colorPlusOnes"),qk=f("colorKeyword"),rk=f("colorLocation"),sk=f("colorAnnotation"),Qa;Qa=[[0,0,0],[255,255,255]];if(l){var Sc;Sc=Cg(l);Qa=Kg([parseInt(Sc.substr(1,2),16),parseInt(Sc.substr(3,2),16),parseInt(Sc.substr(5,2),16)],Qa);Qa=Eg(Qa[0],Qa[1],Qa[2])}else Qa=null;a={C:a,ti:H,Ta:J,fc:L,Va:ua,S:ka,da:la,mb:r,Mb:l,Lb:qa,Aa:eb,Kb:sb,hd:fb,hg:qk,Wa:rk,N:sk, +yi:u,zi:Qa,fontFamily:f("fontFamily"),qe:f("fontFamilyAttribution"),sb:f("fontSizeTitle"),wa:f("fontSizeDescription"),rc:C,Pb:f("fontSizeAttribution"),qd:f("fontSizePlusOnes"),od:f("fontSizeLocation"),K:f("fontSizeAnnotation"),Ni:y,mk:f("titleBold"),sk:e.titleInlineBlock,Uj:f("rolloverLinkBold"),fh:f("rolloverLinkColor"),eh:f("rolloverLinkBackgroundColor"),Vj:f("rolloverLinkUnderline"),dh:f("rolloverAdBackgroundColor"),Pg:f("noTitleUnderline"),zh:ah(a),Xc:g("adBorderSelections","left"),cc:g("adBorderSelections", +"right"),Yc:g("adBorderSelections","top"),Wc:g("adBorderSelections","bottom"),pi:g("borderSelections","left"),ag:g("borderSelections","right"),ri:g("borderSelections","top"),oi:g("borderSelections","bottom"),za:Tb(d,a),Tb:f("lineHeightTitle"),aa:f("lineHeightDescription"),ab:f("lineHeightDomainLink"),Zf:f("attributionSpacingBelow"),hj:$g(d,a),De:e.hasButtonRight};f("adIconUrl")?(a.Ib=f("adIconWidth"),a.kb=f("adIconHeight"),a.Hb=f("adIconLocation"),a.dc=f("adIconSpacingAbove"),a.ec=f("adIconSpacingBefore"), +a.Uf=f("adIconSpacingAfter"),a.ad=f("adIconSpacingBelow"),a.Vd=!0):f("adIconPageUrl")&&(a.Ib=f("adIconPageWidth"),a.kb=f("adIconPageHeight"),a.Hb=f("adIconPageLocation"),a.dc=f("adIconPageSpacingAbove"),a.ec=f("adIconPageSpacingBefore"),a.Uf=f("adIconPageSpacingAfter"),a.Vd=!1);"relatedsearch"==h&&(a.type="relatedsearch",a.Nb=f("columnSpacing"),a.vd=f("horizontalFlow"),a.ub=f("horizontalAlignment"));var v,h=a.C.isRtl?"right":"left";d=a.C.isRtl?"left":"right";f="";e=""),b,c)},dh=function(a,b,c,d,e,f,g,h,l){a="

"+(f?a?ze({text:a,ca:"rhHeader"})+"
":Ug({$d:c,gd:b,ca:"rhHeader"})+(e?Vg({Bc:e,ca:"rhHeader",id:"megaLabel"}):Vg({Bc:d,ca:"lhHeader",id:"adsLabel"})):a?ze({text:a,ca:"lhHeader"}):(e?Vg({Bc:e,ca:"lhHeader",id:"megaLabel"}):Vg({Bc:d,ca:"rhHeader", +id:"adsLabel"}))+Ug({$d:c,gd:b,ca:"lhHeader"}))+"

";bh(a,g,h)},bh=function(a,b,c){da(a)||(a=a.toString());ra()?b.populate(a):c.appendChild($c(Zc(),a))};if(window.IS_GOOGLE_AFS_IFRAME_)var eh=/^((https?):)?\/\/afs.googleusercontent.com\//,fh=/^\/\/afs.googleusercontent.com\//,gh=function(a,b,c,d,e,f,g){if(!d||eh.test(b))for(var h=0;ha.which:2>a.button)&&Fa(Eb(b))}))}},nh,oh,mh=!1,kh=function(a){mh=!1;a=a.touches;1==a.length&&(a=a[0],nh=a.clientX,oh=a.clientY,mh=!0)},lh=function(a){a=a.touches[0]; +if(10'+G(a.Og)+"":'
')},wh=function(a){return ud(".sb_ {padding-top: 10px; text-align: right; height: 29px; font-size: 12px; color: #666666; line-height: 29px; margin-bottom: 2px;}.tb_ {padding-right: 10px; height: 100%; display: inline-block;}.lb_ {display: inline-block; text-align: center; border-radius: 2px; background: white; border: 1px solid #f3f3f3; cursor: default; white-space: nowrap; text-decoration: none; color: #444444; font-size: 11px; font-weight: bold; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;}.ub_.lb_ {height: 100%; width: 34px; font-size: inherit; position: relative;}.lb_.s_ {border: 1px solid #dcdcdc; background: #f5f5f5; z-index: 10;}.lb_.s_:active {-webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1); box-shadow: inset 0 1px 2px rgba(0,0,0,.1); background: #f8f8f8; color: #333;}.lb_.s_:hover {border: 1px solid #c6c6c6; z-index: 20;}.left.lb_ {border-top-right-radius: 0; border-bottom-right-radius: 0;}.right.lb_ {border-top-left-radius: 0; border-bottom-left-radius: 0; margin-left: -1px;}.vb_ {margin-top: -3px; vertical-align: middle; filter: alpha(opacity=33); opacity: .333;}.lb_.s_:hover > .vb_ {filter: alpha(opacity=90); opacity: .9;}.lb_.s_ > .vb_ {filter: alpha(opacity=55); opacity: .55;}table {font-size: "+ +P(a.fontSize)+"px; border-collapse: collapse; display: inline-table; white-space: normal; margin-right: 10px; vertical-align: top; border-top: 1px solid #ebebeb;}.qb_ {position: relative; overflow: hidden;}.rb_ {white-space: nowrap; position: relative; left: 0px;}.j_ {color: #777777;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var xh=function(a,b,c,d,e){this.xa=a;this.Fj=b;this.ak=c;this.xj=d;this.nb=0;this.Hc=[];this.D=e;this.Yd=new ke(300);this.Qg=R();this.kf=R();this.Sg=R();this.hf=R();this.jf=R();this.Tg=R()};k=xh.prototype;k.j=function(){return this.D({zj:this.Qg,Yj:this.kf,Dj:this.Sg,Wj:this.hf,Xj:this.jf,Ej:this.Tg,Og:0==this.xa.length?this.xj:""})};k.ug=function(a,b){return a==b?this.ak.replace("%1$d",""+a).replace("%2$d",""+this.xa.length):this.Fj.replace("%1$d",""+a).replace("%2$d", +""+b).replace("%3$d",""+this.xa.length)};k.Cj=function(a,b){if(0!=this.xa.length){var c=T(a,this.Qg);b-=c.offsetHeight;var d=T(a,this.kf),c=c.offsetWidth,e=a.createElement("table");e.style.width=c+"px";d.appendChild(e);for(var f=0,g=0;gb){var h=e.removeChild(e.lastChild);0==f&&(b=e.offsetHeight);this.Hc.push(this.ug(f+1,g));e=a.createElement("table");e.style.width=c+"px";d.appendChild(e);e.appendChild(h);f=g}this.Hc.push(this.ug(f+ +1,this.xa.length));this.Eh(a)}};k.cg=function(){return 0
';c='
'+G(a.title)+"
"+(a.ha?'
'+G(a.ha)+"
":"");c=I(c);b+=(a.xb?K(mf({Da:I('
'),Ea:I(""+G(c)),Z:69,ga:10})):G(c))+'
'+G(a.sh)+"
"+G(a.ah)+"
";return F(b)},zh= +function(a){for(var b='
';c='
'+G(a.title)+'
'+G(a.ha)+'
'+G(a.sh)+"
"+G(a.ah)+"
";c=I(c);b+=(a.xb?K(mf({Da:I('
'+ +(a.description?'
'+G(a.description)+"
":"")),Ea:I(""+G(c)),Z:224,ga:20})):G(c))+"
";return F(b)};var Bh=function(a){var b;return F(''+Ah(a)+""+K(null==(b=a.ma)?"":b)+''+G(a.Wb)+"")},Ah=function(a){return F('
'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("hb_"),Za:a.Dd}))+"
 
")},Ch=function(a){var b;return F(''+Ah(a)+""+K(null==(b=a.ma)?"":b)+"
"+G(a.Wb)+'
'+ +G(a.ua)+'
'+K(Sd({href:a.Ja,content:"Buy",A:a.Ma,qa:xd("s_ kb_ lb_")}))+"")},Dh=function(a){return ud(".i_ {border-bottom: 1px solid #ebebeb; vertical-align: middle;}.i_ td {padding: 7px 4px 7px 0;}.gb_ {width: 40%;}.i_ .fb_ {text-align: right; padding: 7px 0; font-weight: bold;}.hb_ {text-decoration: none; color: "+P(a.linkColor)+"; display: block; overflow: hidden; text-overflow: ellipsis;}.hb_:hover {text-decoration: underline;}")},Eh=function(a){var b;a=a|| +{};return F(''+Ah(a)+'
'+G(a.Wb)+'
'+K(null==(b=a.ua)?"":b)+'
'+K(null==(b=a.ma)?"":b)+"
")},Fh=function(a){return ud(".i_ {border-bottom: 1px solid #ebebeb; vertical-align: middle;}.i_ td {height: 50px; padding-right: 4px;}.gb_ {width: 40%;}.i_ .jb_ {text-align: right; padding-right: 0;}.kb_.lb_ {padding: 0 8px; min-width: 54px; height: 27px; line-height: 27px;}.hb_ {text-decoration: none; color: "+ +P(a.linkColor)+"; display: block; overflow: hidden; text-overflow: ellipsis;}.hb_:hover {text-decoration: underline;}.ib_ {color: #7d7d7d; font-size: 80%;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var Gh=function(a,b){this.bg=a;this.maxHeight=b},Hh=new Gh(10,350),Ih=new Gh(20,700),Jh=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.Ee=a;this.P=b;this.T=c;this.pe=d;this.pj=e;this.dk=f;this.wj=g+" \u25bc";this.mj=h+" \u25b2";this.re=l;this.We=r;this.gk=y;this.D=C;this.Ab=u;this.Ab.height=Math.min(this.Ab.height,this.re.maxHeight);this.Ab.width=Math.min(this.Ab.width,1E3);this.yh=R();this.kg=R();this.Sf=R();this.Qf=R();this.yg=R()};Jh.prototype.j=function(){return this.D({xb:this.Ee, +title:this.P,description:this.T,ha:this.pe,sh:this.dk,ah:this.We.j(),si:this.Ab.width,uh:this.gk,Oc:this.yh,Hi:this.kg,Rf:this.Sf,ei:this.Qf,Xi:this.yg})};Jh.prototype.Vi=function(a){return T(a,"adBlock").offsetWidth};Jh.prototype.Mj=function(a){this.uk(a);var b=T(a,this.Sf).offsetHeight,b=b+2*this.re.bg;this.We.Cj(a,this.Ab.height-b);this.We.Zd(a)};Jh.prototype.uk=function(a){var b=T(a,this.yh);ng(b,3);if(b=a.getElementById(this.kg)){var c=Je(T(a,this.Qf)),c=c+2*this.re.bg;Je(T(a,this.yg));og(b, +this.Ab.height-c-50,this.wj,this.mj,this.pj)}};var Kh=function(a,b,c,d){var e,f,g,h=[],l=null,r=a.lc||"#0651cf";switch(a.id){case 1:case "SMALL_FORMAT":e=Bh;f=vh;g=yh;h.push(Dh({linkColor:r}));h.push(ud(wh({fontSize:12})));h.push(ud("#adBlock {font-family: arial; font-size: 0; width: 300px; background: white;}.h_ {font-size: 18px; font-weight: bold; color: #222222; word-wrap: break-word;}.xa_ {padding: 9px; border: 1px solid #e0e0e0;}.ab_ {max-width: 67px; max-height: 67px; vertical-align: middle;}.za_ {width: 67px; height: 67px; border: 1px solid #eeeeee; text-align: center; line-height: 67px;}.bb_ {padding: 10px 0; font-size: 12px; font-weight: bold; color: #222222;}.cb_ {color: #787878; font-size: 13px;}")); +d&&(e=Eh,h.push(ud(".i_ .nb_ {padding: 7px 0; width: 46px;}.i_ .fb_ {text-align: left; padding-right: 4px;}.ib_ {color: #7d7d7d; font-size: 90%; font-weight: normal;}")));l=Hh;break;case 3:case "WIDE_FORMAT":e=Ch;f=vh;g=zh;h.push(Fh({linkColor:r}));h.push(ud(wh({fontSize:14})));h.push(ud("#adBlock {font-family: arial; font-size: 0; background: white;}.xa_ {padding: 19px; border: 1px solid #e0e0e0;}.ab_ {max-width: 222px; max-height: 222px; vertical-align: middle;}.za_ {width: 222px; height: 222px; border: 1px solid #eeeeee; text-align: center; line-height: 222px; margin-bottom: 20px;}.eb_ {font-size: 12px; line-height: 18px; color: #222222; word-wrap: break-word;}.db_ {padding-bottom: 20px;}.h_ {font-size: 18px; font-weight: bold; color: #222222; word-wrap: break-word;}.cb_ {color: #7d7d7d; font-size: 13px;}.bb_ {font-size: 14px; font-weight: bold; color: #222222; padding-bottom: 8px;}")); +l=Ih;break;default:return Na.log({message:"Jackpot block json failed to provide a known format."},"crjc"),null}var u=[];a.offers&&(u=ic(a.offers,function(a){return new uh(a.u,a.m,a.pr,a.s,d&&a.ppu?a.ppu:"",c,e)}));f=new xh(u,b.pt,b.sipt,b.nl,f);return new Jh(a.pd.i,a.pd.t,a.pd.d,d&&a.pd.er?a.pd.er:"",r,b.sl,b.m,b.l,l,f,new Wc(a.mw,a.mh),h,g)}};var Lh=function(a){var b='
',c='
'+K(Sd({href:a.Ja,content:a.title,A:a.Ma,qa:xd("oc_"),Za:a.Oc}))+'
',c=c+('
'+G(a.Wb)+"
"+(a.Id?(a.ma?'
'+G(a.ma)+"
": +"")+(a.ha?'
'+G(a.ha)+"
":"")+(a.ua?'
'+G(a.ua)+"
":""):"")+'
'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("sc_"),Za:a.Dd}))+"
"),b=b+K(mf({Da:I("
"+K(Sd({href:a.Ja,content:I('
'+G(a.$f)+"
"),A:a.Ma,qa:xd("lc_"),Za:a.Dg}))+"
"),Ea:I(c),Z:a.Fe,ga:a.xc}));return F(b+"
")},Mh=function(a){return ud(".hc_ {background: white; margin-right: "+ +P(a.yc)+"px; margin-bottom: "+P(a.yc)+"px;"+(a.og?P(Rd({value:yd("1px 2px 1px rgba(0, 0, 0, 0.1)")}))+"border: 1px solid #E0E0E0; box-sizing: border-box; border-radius: 3px;":P(Rd({value:yd("0 2px 1px rgba(0, 0, 0, 0.1), 0 0 1px rgba(0, 0, 0, 0.1)")}))+"border-radius: 2px;")+"width: "+P(a.hi)+"px; height: "+P(a.gi)+"px;"+P(Qd())+"}.ic_ {"+(a.og?"padding: "+P(a.xc-1)+"px;":"padding: "+P(a.xc)+"px;")+"position: relative;}.lc_ {text-decoration: none;}.jc_ {width: "+P(a.Fe)+"px; height: "+P(a.bj)+"px; background-repeat: no-repeat; background-position: center; background-size: contain; cursor: pointer; position: relative;}.mc_ {position: relative; height: "+ +P(a.Bi)+"px;}.oc_ {color: "+P(a.nk)+"; font-size: "+P(a.qk)+"px; text-decoration: none;}.nc_ {width: "+P(a.jd)+"px; word-wrap: break-word;}.mb_ {font-size: "+P(a.Ij)+"px; font-weight: bold; color: "+P(a.Xg)+";}.pc_ {color: "+P(a.Xg)+"; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: "+P(a.jd)+"px;}.sc_ {color: "+P(a.Lg)+"; text-decoration: none;}.rc_ {font-size: "+P(a.tj)+"px; padding-bottom: 2px; color: "+P(a.Lg)+"; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: "+ +P(a.jd)+"px;}.bb_ {font-size: 13px;"+P(Qd())+"text-decoration: none; background-color: #555555; position: absolute; bottom: 1px; left: 1px; padding: 0 3px; color: white; border-radius: 2px;}.qc_ {font-size: 12px; color: #777777; padding-bottom: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: "+P(a.jd)+"px;}")};var Nh=function(a){var b='
'+K(Sd({href:a.Ja,content:I('
'+G(a.$f)+"
"),A:a.Ma,qa:xd("lc_"),Za:a.Dg}))+'
'+K(Sd({href:a.Ja,content:a.title,A:a.Ma,qa:xd("oc_"),Za:a.Oc}))+'
',b=b+('
'+G(a.Wb)+"
"+(a.Id?(a.ma?'
'+G(a.ma)+"
":"")+(a.ha?'
'+G(a.ha)+"
":"")+(a.ua?'
'+G(a.ua)+"
":""):"")+'
'+K(Sd({href:a.Ja,content:a.Ed,A:a.Ma,qa:xd("sc_"),Za:a.Dd}))+"
");return F(b)},Oh=function(a){return ud(P(Mh(a))+".jc_ {margin-bottom: "+ +P(a.xc)+"px;}")};if(window.IS_GOOGLE_AFS_IFRAME_){var Ph=function(a,b,c,d,e,f,g,h,l,r,u,y,C){this.mi=c;this.Me=d;this.P=a.t;this.Qe=a.m;this.cf=a.pr;this.Ee=a.i;this.Nd=a.s;this.Qd=a.ppu;this.pe=a.er;this.Pj=u;this.Yi=b.h;this.yk=b.w;this.Ie=e;this.Hg=f;this.cj=b.ih;this.Eg=b.iw;this.jg=g;this.Ci=h;this.rk=b.ts;this.uj=b.ms;this.Jj=b.ps;this.pk=b.tc;this.sj=b.mc;this.Hj=b.pc;this.Xe=l;this.Ki=r;this.fk=y;this.D=C;this.Ag=R();this.Cg=R();this.vf=R();this.Cd=R();this.Wg=R()};k=Ph.prototype;k.j=function(){return this.D({Ug:this.Ag, +$f:this.mi,Ja:this.Me,xb:this.Ee,Dg:this.Cg,title:this.P,Oc:this.vf,Wb:this.cf,Ed:this.Qe,Dd:this.Cd,Vg:this.Wg,Fe:this.Eg,xc:this.Hg,Yg:this.Ai(),Ma:this.Xe,ma:this.Nd,ua:this.Qd,ha:this.pe,Id:this.Pj})};k.Ui=function(){return this.fk({hi:this.yk,gi:this.Yi,yc:this.Ie,xc:this.Hg,bj:this.cj,Fe:this.Eg,Bi:this.jg,jd:this.Ci,qk:this.rk,tj:this.uj,Ij:this.Jj,nk:this.pk,Lg:this.sj,Xg:this.Hj,og:this.Ki})};k.Ai=function(){return hc([this.Qd,this.Nd],ca).join("\n")};k.Bh=function(a){var b=a.document.getElementById(this.Wg); +b&&mg(a.document.getElementById(this.vf),this.jg-(b.offsetHeight+4));this.ic&&this.ic.Bh(a)};k.Xf=function(a){this.ic&&this.ic.Xf(a)};k.vg=function(a){return T(a,this.Ag)};k.wg=function(a){var b=this.ic?this.ic.wg(a):[];return[new Ze(T(a,this.vf),"&nb=0"),new Ze(T(a,this.Cd),"&nb=1"),new Ze(T(a,this.Cg),"&nb=9")].concat(b)};var Qh=function(a,b,c,d,e,f,g){var h=db(a.u),l=new Wc(b.w,b.h),r=new Wc(b.iw,b.ih),u=Math.floor((l.height-r.height)/2);return new Ph(a,b,c,h,d,u,r.height,l.width-(3*u+r.width), +e,f,g,Mh,Lh)},Rh=function(a,b,c,d,e,f,g){var h=db(a.u),l=new Wc(b.w,b.h),r=new Wc(b.iw,b.ih),u=Math.floor((l.width-r.width)/2);return new Ph(a,b,c,h,d,u,l.height-(3*u+r.height),r.width,e,f,g,Oh,Nh)}};var Sh=function(a){var b='
';a=a.Sj;for(var c=a.length,d=0;d
")};if(window.IS_GOOGLE_AFS_IFRAME_){var Th=function(a,b,c,d,e,f,g){this.Vb=a;this.kh=b;this.Ie=c;this.ni=d;this.Mi=e;this.ej=f;this.D=g};Th.prototype.j=function(){for(var a=[],b=0;b
';for(var d=a.ads,e=d.length,f=0;f"}return b+"
'+(1==a.ads.length?'  ': +''+K(++c)+". ")+' '+Q(g.cleanTitle)+' opens new browser window'+ +Q(g.l1)+" "+Q(g.l2)+' '+Q(g.v)+"
"}, +Vh=function(a){for(var b='
',c=a.ads,d=c.length,e=0;e");return b+="
  -  
'+ +Q(f.l1)+" "+Q(f.l2)+'
"};var Wh=function(a){var b,c=0;b='';for(var d=a.ads,e=d.length,f=0;f"}b+="
'+K(++c)+'.  '+G(g.t)+'
'+ +G(g.l1)+" "+G(g.l2)+' '+G(g.v)+"
";return F(b)},Xh=function(a){for(var b='',c=a.ads,d=c.length,e=0;e");b+="
'+G(f.l1)+" "+G(f.l2)+'
";return F(b)},Yh=function(a){var b;b='';for(var c=a.ads,d=c.length,e=0;e"}b+="
'+ +G(f.l1)+" "+G(f.l2)+' '+G(f.v)+"
";return F(b)},Zh=function(a){for(var b='',c=a.ads,d=c.length,e=0;e");b+="
  -  
'+G(f.l1)+" "+G(f.l2)+'
";return F(b)},$h=function(a){var b,c=0;b='";return F(b)};if(window.IS_GOOGLE_AFS_IFRAME_)var ai=function(a,b){b=b||130;var c=b+Math.max(1.5*b,160),d=a.document.getElementById("wideSfbl"),e=a.document.getElementById("narrowSfbl");d&&e&&(Ie(a.document.body,!1)Ie(f,!1)){for(g=0;h=c[g];g++)h.style.display="none";for(g=0;h=d[g];g++)h.style.display="block"}else{for(g=0;h=c[g];g++)h.style.display="block";for(g=0;h=d[g];g++)h.style.display="none"}};var bi=function(a){return'"+(a.B.pn?Hf({Hd:a.B.pn,f:a.C.isRtl,Ng:!1})+"
":"")+(a.Gg?'
'+Wf({Mc:a.B.sr})+"
":"")},ci=function(a){return""+(a.C.disableSellerFirstFavicon?bi({B:a.B,C:a.C,A:a.A,Gg:a.wd}):nf({Da:'',Ea:""+ +bi({B:a.B,C:a.C,A:a.A,Gg:a.wd}),Z:18,ga:3,rb:a.C.isRtl}))+(a.wd?"":'
'+Wf({Mc:a.B.sr})+"
")},di=function(a){var b='
',c=a.B.l1r,d=a.B.l2r,e=a.C.isRtl,f="";if(d&&d.c)var g=c.rtl||d.rtl,f=f+Jf({Ia:g,f:e,text:Kf({text:c,f:g})+" "+Kf({text:d,f:g})});else f+=Kf({text:c,f:e});b=b+f+"
"+ig({be:a.B.cos, +f:a.C.isRtl})+Xg({Kd:a.B.ar,tb:a.B.gt&&"ar"==a.B.gt.r?a.B.gt.t:null,f:a.C.isRtl})+Rf({$e:a.B.plus_ones,A:a.A})+Lf({Ne:a.B.location,f:a.C.isRtl})+Of({Gd:a.B.oh,tb:a.B.gt&&"oh"==a.B.gt.r?a.B.gt.t:null,Hh:a.C.offerHighlightWithIcon});a=a.B.sls&&0g?e?(e.style.display="none",c?c.style.display="":e.parentNode.style.display="none"):(d.style.display="none",c||(d.parentNode.style.display="none")):e?(e.style.display="",e.parentNode.style.display="",c&&(c.style.display="none")):(d.style.display="",d.parentNode.style.display="")}},Fi=m(Fi,"aH"),Oi=function(a){var b="master-"+Ai(a);a=Di(b,a);b="";if(a)try{b= +a.document.documentElement.lang}catch(c){}return b},Oi=m(Oi,"gMIHL"),Pi=function(a,b){try{if(a&&a.document.getElementsByTagName("html")){var c;(c=a.document.getElementsByTagName("html")[0])&&!c.lang&&(c.lang=b)}}catch(d){}},Pi=m(Pi,"sSIHL"),Ri=function(a,b,c){a=a.document.getElementsByTagName("table");for(var d=a.length,e=0;eMe(a).height},Si=m(Si,"iW"),Ti=function(a){for(;0e.length?e.push(h):"sl-right"==h.className&&3>f.length&&f.push(h);for(d=[];0e){c=Le(d)-15;125>c&&(c=125);for(var f=d.getElementsByTagName("div"),g=0,h=0,l;l=f[h];h++)Me(l).width<=c&&3>g?g++:l.style.display="none";g>e?(Wi(d,"visibility","visible"),a.style.display="none"):d.style.display="none"}else d.style.display="none"}},Vi=m(Vi,"uS"),Ui=function(a,b){var c=b.shift();if(c){for(;0< +b.length;)Ti(b.pop());c[1]&&(Si(c)||(Yd(c[0].firstChild,"l"),Yd(c[1].firstChild,"r"),c[0].innerHTML+=" - "+c[1].innerHTML),c[1].parentNode.removeChild(c[1]),c.pop());a.className="sl-table-ol";c[0].className="sl-left-ol";Si(c[0])&&Ti(c)}},Ui=m(Ui,"hSLS"),Xi=function(a,b){return Le(a)b||"number"==typeof c&&16>c)&&(a=a.document.getElementById("adBlock"))&&""!=a.innerHTML?!0:!1},lj=m(lj,"iCSI"),Ji=function(a,b){for(var c=!1,d=[],e=0;erb)for(a=0;a=f)a=g;else{a=[];for(var h= +0,l=0;l';e=g.length;for(b=0;b'+K(pe({text:a.t,f:f})),d+='
';c=F(d+"")}else{d=""+('");e=g.length;for(b=0;bf||2<=f&&b":"")+'";c=d+"
",l=g.length%f||f,d+='
=g.length-l?" lr":"")+'">'+Og({B:a,kc:!1,qj:"_top"})+ +'
'+Ng({B:a,kc:!1,qj:"_top"})+'
"}return c},uj=m(uj,"cRSN"),gj=function(a,b,c,d,e,f,g,h,l,r,u){if(0>=a.length)return null;var y=Ub(e),C="";c=null;if(u.customAdIcons){var H="https"==window.location.protocol;null!=e.adIconUrl&&0
'+nf({Da:""+ci(vd(a,{B:g,wd:!0})),Ea:""+di(vd(a,{B:g})),Z:null==(qa=a.Zj)?130:qa,ga:10,rb:a.C.isRtl})+"
";y+='";C=y+""}else{c=[];qa=g.ac?Rg:yg;for(y=0;y