[updated to reflect happstack 0.5.0 release Jeremy Shaw **20100503184757 Ignore-this: 72d90fe261c10f6c578a21a1a2b26805 ] hunk ./Main.hs 179 - + hunk ./Main.hs 215 -

ghc 6.8.3 or 6.10.1, and cabal >= 1.6 are required.

+

ghc 6.10.4 or 6.12.x, and cabal >= 1.6 are required.

hunk ./Main.hs 229 -
  • cabal install --reinstall syb-with-class --disable-documentation
  • hunk ./debian/changelog 1 +haskell-happstackdotcom (0.0.21) unstable; urgency=low + + * happstack 0.5.0 release, updated docs + + -- Jeremy Shaw Mon, 03 May 2010 13:44:01 -0500 + hunk ./debian/rules 454 + # find docs/0.5.0/ -type f | xargs -n1 -i echo " install" -Dp -m 644 {} debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/`basename {}` >> debian/rules + install -Dp -m 644 docs/0.5.0/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/plus.gif + install -Dp -m 644 docs/0.5.0/gen-docs.sh debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/gen-docs.sh + install -Dp -m 644 docs/0.5.0/happstack-data.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data.haddock + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Pairs.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Pairs.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/hscolour.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/hscolour.css + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Xml-Base.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Xml-Base.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Normalize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Normalize.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Proxy.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Proxy.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Xml-PrintParse.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Xml-PrintParse.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Serialize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Serialize.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-SerializeTH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-SerializeTH.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Xml-HaXml.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Xml-HaXml.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Default-Generic.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Default-Generic.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-DeriveAll.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-DeriveAll.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Xml-Instances.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Xml-Instances.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Migrate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Migrate.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Default.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Default.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-GOps.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-GOps.html + install -Dp -m 644 docs/0.5.0/happstack-data/src/Happstack-Data-Xml.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/src/Happstack-Data-Xml.html + install -Dp -m 644 docs/0.5.0/happstack-data/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/plus.gif + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Pairs.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Pairs.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Xml-HaXml.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Xml-HaXml.html + install -Dp -m 644 docs/0.5.0/happstack-data/happstack-data.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/happstack-data.haddock + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Proxy.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Proxy.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-DeriveAll.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-DeriveAll.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-A.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-A.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-C.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-C.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-D.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-D.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-E.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-E.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Normalize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Normalize.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-F.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-F.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Proxy.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Proxy.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-G.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-G.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-I.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-I.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Serialize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Serialize.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-K.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-K.html + install -Dp -m 644 docs/0.5.0/happstack-data/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/index.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-M.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-M.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-N.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-N.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-O.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-O.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-P.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-P.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-R.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-R.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-SerializeTH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-SerializeTH.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-S.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-S.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-T.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-T.html + install -Dp -m 644 docs/0.5.0/happstack-data/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/haddock-util.js + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-U.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-U.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-V.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-V.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-W.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-W.html + install -Dp -m 644 docs/0.5.0/happstack-data/doc-index-X.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/doc-index-X.html + install -Dp -m 644 docs/0.5.0/happstack-data/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/minus.gif + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Migrate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Migrate.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Xml-HaXml.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Xml-HaXml.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Default-Generic.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Default-Generic.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Default-Generic.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Default-Generic.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Default.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Default.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-GOps.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-GOps.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-DeriveAll.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-DeriveAll.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data.html + install -Dp -m 644 docs/0.5.0/happstack-data/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Normalize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Normalize.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Migrate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Migrate.html + install -Dp -m 644 docs/0.5.0/happstack-data/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/haddock.css + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Pairs.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Pairs.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Serialize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Serialize.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-SerializeTH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-SerializeTH.html + install -Dp -m 644 docs/0.5.0/happstack-data/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/index-frames.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Default.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Default.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-GOps.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-GOps.html + install -Dp -m 644 docs/0.5.0/happstack-data/mini_Happstack-Data-Xml.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/mini_Happstack-Data-Xml.html + install -Dp -m 644 docs/0.5.0/happstack-data/Happstack-Data-Xml.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/Happstack-Data-Xml.html + install -Dp -m 644 docs/0.5.0/happstack-data/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-data/frames.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-TimeOut.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-TimeOut.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/hscolour.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/hscolour.css + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-Cron.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-Cron.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-Concurrent.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-Concurrent.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-TH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-TH.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-OpenExclusively.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-OpenExclusively.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-Common.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-Common.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-LogFormat.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-LogFormat.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Crypto-HMAC.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Crypto-HMAC.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-Mail.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-Mail.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-ByteStringCompat.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-ByteStringCompat.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Crypto-SHA1.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Crypto-SHA1.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Crypto-MD5.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Crypto-MD5.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Crypto-Base64.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Crypto-Base64.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Crypto-W64.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Crypto-W64.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Crypto-DES.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Crypto-DES.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-HostAddress.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-HostAddress.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-AutoBuild.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-AutoBuild.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-Daemonize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-Daemonize.html + install -Dp -m 644 docs/0.5.0/happstack-util/src/Happstack-Util-FileManip.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/src/Happstack-Util-FileManip.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-TimeOut.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-TimeOut.html + install -Dp -m 644 docs/0.5.0/happstack-util/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/plus.gif + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Crypto-Base64.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Crypto-Base64.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-Cron.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-Cron.html + install -Dp -m 644 docs/0.5.0/happstack-util/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/doc-index.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-Concurrent.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-Concurrent.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-Common.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-Common.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-TH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-TH.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-OpenExclusively.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-OpenExclusively.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-Common.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-Common.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-HostAddress.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-HostAddress.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-OpenExclusively.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-OpenExclusively.html + install -Dp -m 644 docs/0.5.0/happstack-util/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/index.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-Mail.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-Mail.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-AutoBuild.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-AutoBuild.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-ByteStringCompat.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-ByteStringCompat.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-TH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-TH.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-Daemonize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-Daemonize.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-Concurrent.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-Concurrent.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Crypto-HMAC.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Crypto-HMAC.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-LogFormat.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-LogFormat.html + install -Dp -m 644 docs/0.5.0/happstack-util/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/haddock-util.js + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-FileManip.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-FileManip.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Crypto-HMAC.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Crypto-HMAC.html + install -Dp -m 644 docs/0.5.0/happstack-util/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/minus.gif + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Crypto-MD5.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Crypto-MD5.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Crypto-W64.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Crypto-W64.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Crypto-SHA1.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Crypto-SHA1.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-Mail.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-Mail.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-ByteStringCompat.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-ByteStringCompat.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Crypto-SHA1.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Crypto-SHA1.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Crypto-DES.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Crypto-DES.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Crypto-MD5.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Crypto-MD5.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Crypto-Base64.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Crypto-Base64.html + install -Dp -m 644 docs/0.5.0/happstack-util/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Crypto-W64.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Crypto-W64.html + install -Dp -m 644 docs/0.5.0/happstack-util/happstack-util.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/happstack-util.haddock + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-TimeOut.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-TimeOut.html + install -Dp -m 644 docs/0.5.0/happstack-util/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/haddock.css + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-Cron.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-Cron.html + install -Dp -m 644 docs/0.5.0/happstack-util/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/index-frames.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Crypto-DES.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Crypto-DES.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-HostAddress.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-HostAddress.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-AutoBuild.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-AutoBuild.html + install -Dp -m 644 docs/0.5.0/happstack-util/mini_Happstack-Util-LogFormat.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/mini_Happstack-Util-LogFormat.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-Daemonize.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-Daemonize.html + install -Dp -m 644 docs/0.5.0/happstack-util/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/frames.html + install -Dp -m 644 docs/0.5.0/happstack-util/Happstack-Util-FileManip.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util/Happstack-Util-FileManip.html + install -Dp -m 644 docs/0.5.0/sendfile.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile.haddock + install -Dp -m 644 docs/0.5.0/happstack/src/hscolour.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/hscolour.css + install -Dp -m 644 docs/0.5.0/happstack/src/HSP-WebT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/HSP-WebT.html + install -Dp -m 644 docs/0.5.0/happstack/src/Happstack-Server-HSX.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/Happstack-Server-HSX.html + install -Dp -m 644 docs/0.5.0/happstack/src/HSP-IdentityT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/HSP-IdentityT.html + install -Dp -m 644 docs/0.5.0/happstack/src/Happstack-State-ClockTime.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/Happstack-State-ClockTime.html + install -Dp -m 644 docs/0.5.0/happstack/src/Happstack-Server-HStringTemplate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/Happstack-Server-HStringTemplate.html + install -Dp -m 644 docs/0.5.0/happstack/src/HSP-Google-Analytics.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/HSP-Google-Analytics.html + install -Dp -m 644 docs/0.5.0/happstack/src/HSP-ServerPartT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/HSP-ServerPartT.html + install -Dp -m 644 docs/0.5.0/happstack/src/Paths_happstack.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/Paths_happstack.html + install -Dp -m 644 docs/0.5.0/happstack/src/Happstack-Server-HSP-HTML.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/Happstack-Server-HSP-HTML.html + install -Dp -m 644 docs/0.5.0/happstack/src/HSP-Identity.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/src/HSP-Identity.html + install -Dp -m 644 docs/0.5.0/happstack/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/plus.gif + install -Dp -m 644 docs/0.5.0/happstack/mini_HSP-Identity.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_HSP-Identity.html + install -Dp -m 644 docs/0.5.0/happstack/HSP-WebT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/HSP-WebT.html + install -Dp -m 644 docs/0.5.0/happstack/Happstack-Server-HSX.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/Happstack-Server-HSX.html + install -Dp -m 644 docs/0.5.0/happstack/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/doc-index.html + install -Dp -m 644 docs/0.5.0/happstack/mini_Happstack-Server-HSP-HTML.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_Happstack-Server-HSP-HTML.html + install -Dp -m 644 docs/0.5.0/happstack/HSP-IdentityT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/HSP-IdentityT.html + install -Dp -m 644 docs/0.5.0/happstack/Happstack-State-ClockTime.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/Happstack-State-ClockTime.html + install -Dp -m 644 docs/0.5.0/happstack/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/index.html + install -Dp -m 644 docs/0.5.0/happstack/mini_Happstack-Server-HStringTemplate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_Happstack-Server-HStringTemplate.html + install -Dp -m 644 docs/0.5.0/happstack/mini_HSP-Google-Analytics.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_HSP-Google-Analytics.html + install -Dp -m 644 docs/0.5.0/happstack/Happstack-Server-HStringTemplate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/Happstack-Server-HStringTemplate.html + install -Dp -m 644 docs/0.5.0/happstack/mini_HSP-ServerPartT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_HSP-ServerPartT.html + install -Dp -m 644 docs/0.5.0/happstack/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/haddock-util.js + install -Dp -m 644 docs/0.5.0/happstack/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/minus.gif + install -Dp -m 644 docs/0.5.0/happstack/mini_Happstack-State-ClockTime.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_Happstack-State-ClockTime.html + install -Dp -m 644 docs/0.5.0/happstack/HSP-Google-Analytics.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/HSP-Google-Analytics.html + install -Dp -m 644 docs/0.5.0/happstack/HSP-ServerPartT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/HSP-ServerPartT.html + install -Dp -m 644 docs/0.5.0/happstack/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/happstack/mini_HSP-IdentityT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_HSP-IdentityT.html + install -Dp -m 644 docs/0.5.0/happstack/mini_HSP-WebT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_HSP-WebT.html + install -Dp -m 644 docs/0.5.0/happstack/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/haddock.css + install -Dp -m 644 docs/0.5.0/happstack/happstack.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/happstack.haddock + install -Dp -m 644 docs/0.5.0/happstack/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/index-frames.html + install -Dp -m 644 docs/0.5.0/happstack/Happstack-Server-HSP-HTML.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/Happstack-Server-HSP-HTML.html + install -Dp -m 644 docs/0.5.0/happstack/HSP-Identity.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/HSP-Identity.html + install -Dp -m 644 docs/0.5.0/happstack/mini_Happstack-Server-HSX.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/mini_Happstack-Server-HSX.html + install -Dp -m 644 docs/0.5.0/happstack/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack/frames.html + install -Dp -m 644 docs/0.5.0/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index.html + install -Dp -m 644 docs/0.5.0/HStringTemplate.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate.haddock + install -Dp -m 644 docs/0.5.0/happstack-server.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server.haddock + install -Dp -m 644 docs/0.5.0/doc-index-A.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-A.html + install -Dp -m 644 docs/0.5.0/doc-index-B.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-B.html + install -Dp -m 644 docs/0.5.0/doc-index-C.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-C.html + install -Dp -m 644 docs/0.5.0/doc-index-D.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-D.html + install -Dp -m 644 docs/0.5.0/doc-index-E.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-E.html + install -Dp -m 644 docs/0.5.0/doc-index-F.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-F.html + install -Dp -m 644 docs/0.5.0/doc-index-G.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-G.html + install -Dp -m 644 docs/0.5.0/doc-index-H.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-H.html + install -Dp -m 644 docs/0.5.0/doc-index-I.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-I.html + install -Dp -m 644 docs/0.5.0/doc-index-K.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-K.html + install -Dp -m 644 docs/0.5.0/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/index.html + install -Dp -m 644 docs/0.5.0/doc-index-L.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-L.html + install -Dp -m 644 docs/0.5.0/doc-index-M.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-M.html + install -Dp -m 644 docs/0.5.0/doc-index-N.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-N.html + install -Dp -m 644 docs/0.5.0/doc-index-124.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-124.html + install -Dp -m 644 docs/0.5.0/doc-index-O.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-O.html + install -Dp -m 644 docs/0.5.0/doc-index-38.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-38.html + install -Dp -m 644 docs/0.5.0/doc-index-P.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-P.html + install -Dp -m 644 docs/0.5.0/doc-index-Q.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-Q.html + install -Dp -m 644 docs/0.5.0/doc-index-R.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-R.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-XSLT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-XSLT.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/hscolour.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/hscolour.css + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Socket.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Socket.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-SURI.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-SURI.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-SURI-ParseURI.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-SURI-ParseURI.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-StdConfig.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-StdConfig.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Listen.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Listen.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-SimpleHTTP.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-SimpleHTTP.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-RFC822Headers.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-RFC822Headers.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-LazyLiner.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-LazyLiner.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Types.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Types.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Handler.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Handler.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-SocketTH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-SocketTH.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Clock.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Clock.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-Cookie.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-Cookie.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-TCP.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-TCP.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-FileServe.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-FileServe.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-Parts.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-Parts.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-Stream.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-Stream.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-MinHaXML.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-MinHaXML.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-LowLevel.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-LowLevel.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-HTTP.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-HTTP.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Client.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Client.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Paths_happstack_server.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Paths_happstack_server.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Multipart.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Multipart.html + install -Dp -m 644 docs/0.5.0/happstack-server/src/Happstack-Server-MessageWrap.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/src/Happstack-Server-MessageWrap.html + install -Dp -m 644 docs/0.5.0/happstack-server/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/plus.gif + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-XSLT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-XSLT.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-MinHaXML.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-MinHaXML.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-SURI.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-SURI.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-SURI.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-SURI.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-StdConfig.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-StdConfig.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index.html + install -Dp -m 644 docs/0.5.0/happstack-server/happstack-server.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/happstack-server.haddock + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-A.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-A.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-B.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-B.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-C.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-C.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-SimpleHTTP.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-SimpleHTTP.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-D.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-D.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-E.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-E.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-F.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-F.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-G.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-G.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-H.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-H.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-I.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-I.html + install -Dp -m 644 docs/0.5.0/happstack-server/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/index.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-L.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-L.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-M.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-M.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-N.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-N.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-O.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-O.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-P.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-P.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-Q.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-Q.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-R.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-R.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-S.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-S.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-Parts.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-Parts.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-T.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-T.html + install -Dp -m 644 docs/0.5.0/happstack-server/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/haddock-util.js + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-U.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-U.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-V.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-V.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-HTTP-Types.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-HTTP-Types.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-FileServe.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-FileServe.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-StdConfig.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-StdConfig.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-W.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-W.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-X.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-X.html + install -Dp -m 644 docs/0.5.0/happstack-server/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/minus.gif + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-SimpleHTTP.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-SimpleHTTP.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-Cookie.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-Cookie.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-HTTP-FileServe.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-HTTP-FileServe.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-Parts.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-Parts.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-MinHaXML.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-MinHaXML.html + install -Dp -m 644 docs/0.5.0/happstack-server/doc-index-60.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/doc-index-60.html + install -Dp -m 644 docs/0.5.0/happstack-server/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-Types.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-Types.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-HTTP-LowLevel.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-HTTP-LowLevel.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-Client.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-Client.html + install -Dp -m 644 docs/0.5.0/happstack-server/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/haddock.css + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-HTTP-Client.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-HTTP-Client.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-LowLevel.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-LowLevel.html + install -Dp -m 644 docs/0.5.0/happstack-server/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/index-frames.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-MessageWrap.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-MessageWrap.html + install -Dp -m 644 docs/0.5.0/happstack-server/Happstack-Server-MessageWrap.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/Happstack-Server-MessageWrap.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-Cookie.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-Cookie.html + install -Dp -m 644 docs/0.5.0/happstack-server/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/frames.html + install -Dp -m 644 docs/0.5.0/happstack-server/mini_Happstack-Server-XSLT.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-server/mini_Happstack-Server-XSLT.html + install -Dp -m 644 docs/0.5.0/happstack-state.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state.haddock + install -Dp -m 644 docs/0.5.0/doc-index-S.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-S.html + install -Dp -m 644 docs/0.5.0/happstack-ixset.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset.haddock + install -Dp -m 644 docs/0.5.0/doc-index-T.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-T.html + install -Dp -m 644 docs/0.5.0/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/haddock-util.js + install -Dp -m 644 docs/0.5.0/doc-index-U.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-U.html + install -Dp -m 644 docs/0.5.0/doc-index-V.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-V.html + install -Dp -m 644 docs/0.5.0/doc-index-W.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-W.html + install -Dp -m 644 docs/0.5.0/doc-index-X.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-X.html + install -Dp -m 644 docs/0.5.0/doc-index-46.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-46.html + install -Dp -m 644 docs/0.5.0/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/minus.gif + install -Dp -m 644 docs/0.5.0/prologue.txt debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/prologue.txt + install -Dp -m 644 docs/0.5.0/sendfile/src/hscolour.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/src/hscolour.css + install -Dp -m 644 docs/0.5.0/sendfile/src/Network-Socket-SendFile-Linux.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/src/Network-Socket-SendFile-Linux.html + install -Dp -m 644 docs/0.5.0/sendfile/src/Network-Socket-SendFile.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/src/Network-Socket-SendFile.html + install -Dp -m 644 docs/0.5.0/sendfile/src/Network-Socket-SendFile-Internal.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/src/Network-Socket-SendFile-Internal.html + install -Dp -m 644 docs/0.5.0/sendfile/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/plus.gif + install -Dp -m 644 docs/0.5.0/sendfile/sendfile.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/sendfile.haddock + install -Dp -m 644 docs/0.5.0/sendfile/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/doc-index.html + install -Dp -m 644 docs/0.5.0/sendfile/Network-Socket-SendFile.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/Network-Socket-SendFile.html + install -Dp -m 644 docs/0.5.0/sendfile/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/index.html + install -Dp -m 644 docs/0.5.0/sendfile/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/haddock-util.js + install -Dp -m 644 docs/0.5.0/sendfile/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/minus.gif + install -Dp -m 644 docs/0.5.0/sendfile/mini_Network-Socket-SendFile.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/mini_Network-Socket-SendFile.html + install -Dp -m 644 docs/0.5.0/sendfile/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/sendfile/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/haddock.css + install -Dp -m 644 docs/0.5.0/sendfile/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/index-frames.html + install -Dp -m 644 docs/0.5.0/sendfile/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/sendfile/frames.html + install -Dp -m 644 docs/0.5.0/doc-index-58.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-58.html + install -Dp -m 644 docs/0.5.0/doc-index-60.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-60.html + install -Dp -m 644 docs/0.5.0/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/happstack-util.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-util.haddock + install -Dp -m 644 docs/0.5.0/doc-index-64.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/doc-index-64.html + install -Dp -m 644 docs/0.5.0/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/haddock.css + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/hscolour.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/hscolour.css + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate-QQ.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate-QQ.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate-GenericWithClass.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate-GenericWithClass.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Group.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Group.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Instances.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Instances.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Base.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Base.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate-GenericStandard.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate-GenericStandard.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Renderf.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Renderf.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Classes.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Classes.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/src/Text-StringTemplate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/src/Text-StringTemplate.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/plus.gif + install -Dp -m 644 docs/0.5.0/HStringTemplate/Text-StringTemplate-QQ.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/Text-StringTemplate-QQ.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/Text-StringTemplate-GenericWithClass.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/Text-StringTemplate-GenericWithClass.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/doc-index.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/HStringTemplate.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/HStringTemplate.haddock + install -Dp -m 644 docs/0.5.0/HStringTemplate/Text-StringTemplate-Base.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/Text-StringTemplate-Base.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/index.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/Text-StringTemplate-GenericStandard.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/Text-StringTemplate-GenericStandard.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/haddock-util.js + install -Dp -m 644 docs/0.5.0/HStringTemplate/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/minus.gif + install -Dp -m 644 docs/0.5.0/HStringTemplate/mini_Text-StringTemplate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/mini_Text-StringTemplate.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/Text-StringTemplate-Classes.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/Text-StringTemplate-Classes.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-Base.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-Base.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-GenericWithClass.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-GenericWithClass.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/Text-StringTemplate.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/Text-StringTemplate.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/haddock.css + install -Dp -m 644 docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-QQ.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-QQ.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/index-frames.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-Classes.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-Classes.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-GenericStandard.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-GenericStandard.html + install -Dp -m 644 docs/0.5.0/HStringTemplate/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/HStringTemplate/frames.html + install -Dp -m 644 docs/0.5.0/happstack.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack.haddock + install -Dp -m 644 docs/0.5.0/happstack-ixset/src/hscolour.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/src/hscolour.css + install -Dp -m 644 docs/0.5.0/happstack-ixset/src/Happstack-Data-IxSet.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/src/Happstack-Data-IxSet.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/src/Happstack-Data-IxSet-Ix.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/src/Happstack-Data-IxSet-Ix.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/plus.gif + install -Dp -m 644 docs/0.5.0/happstack-ixset/mini_Happstack-Data-IxSet.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/mini_Happstack-Data-IxSet.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/doc-index.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/Happstack-Data-IxSet.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/Happstack-Data-IxSet.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/index.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/happstack-ixset.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/happstack-ixset.haddock + install -Dp -m 644 docs/0.5.0/happstack-ixset/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/haddock-util.js + install -Dp -m 644 docs/0.5.0/happstack-ixset/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/minus.gif + install -Dp -m 644 docs/0.5.0/happstack-ixset/Happstack-Data-IxSet-Ix.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/Happstack-Data-IxSet-Ix.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/happstack-ixset/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/haddock.css + install -Dp -m 644 docs/0.5.0/happstack-ixset/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/index-frames.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/mini_Happstack-Data-IxSet-Ix.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/mini_Happstack-Data-IxSet-Ix.html + install -Dp -m 644 docs/0.5.0/happstack-ixset/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-ixset/frames.html + install -Dp -m 644 docs/0.5.0/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/index-frames.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/hscolour.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/hscolour.css + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Saver.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Saver.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Saver-Types.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Saver-Types.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Util.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Util.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Transaction.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Transaction.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-ComponentSystem.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-ComponentSystem.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-TxControl.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-TxControl.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Types.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Types.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Control.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Control.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Checkpoint.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Checkpoint.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-Memory.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-Memory.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-File.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-File.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Monad.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Monad.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-Queue.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-Queue.html + install -Dp -m 644 docs/0.5.0/happstack-state/src/Happstack-State-ComponentTH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/src/Happstack-State-ComponentTH.html + install -Dp -m 644 docs/0.5.0/happstack-state/plus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/plus.gif + install -Dp -m 644 docs/0.5.0/happstack-state/mini_Happstack-State-Saver.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/mini_Happstack-State-Saver.html + install -Dp -m 644 docs/0.5.0/happstack-state/Happstack-State-Saver.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/Happstack-State-Saver.html + install -Dp -m 644 docs/0.5.0/happstack-state/mini_Happstack-State-ComponentSystem.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/mini_Happstack-State-ComponentSystem.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index.html + install -Dp -m 644 docs/0.5.0/happstack-state/Happstack-State-Transaction.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/Happstack-State-Transaction.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-A.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-A.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-C.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-C.html + install -Dp -m 644 docs/0.5.0/happstack-state/mini_Happstack-State-ComponentTH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/mini_Happstack-State-ComponentTH.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-D.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-D.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-E.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-E.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-F.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-F.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-G.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-G.html + install -Dp -m 644 docs/0.5.0/happstack-state/Happstack-State-ComponentSystem.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/Happstack-State-ComponentSystem.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-H.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-H.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-I.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-I.html + install -Dp -m 644 docs/0.5.0/happstack-state/index.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/index.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-L.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-L.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-M.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-M.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-N.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-N.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-O.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-O.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-P.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-P.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-Q.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-Q.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-R.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-R.html + install -Dp -m 644 docs/0.5.0/happstack-state/happstack-state.haddock debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/happstack-state.haddock + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-S.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-S.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-T.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-T.html + install -Dp -m 644 docs/0.5.0/happstack-state/haddock-util.js debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/haddock-util.js + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-U.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-U.html + install -Dp -m 644 docs/0.5.0/happstack-state/mini_Happstack-State-Transaction.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/mini_Happstack-State-Transaction.html + install -Dp -m 644 docs/0.5.0/happstack-state/mini_Happstack-State.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/mini_Happstack-State.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-V.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-V.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-W.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-W.html + install -Dp -m 644 docs/0.5.0/happstack-state/minus.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/minus.gif + install -Dp -m 644 docs/0.5.0/happstack-state/Happstack-State-Control.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/Happstack-State-Control.html + install -Dp -m 644 docs/0.5.0/happstack-state/Happstack-State.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/Happstack-State.html + install -Dp -m 644 docs/0.5.0/happstack-state/doc-index-58.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/doc-index-58.html + install -Dp -m 644 docs/0.5.0/happstack-state/haskell_icon.gif debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/haskell_icon.gif + install -Dp -m 644 docs/0.5.0/happstack-state/haddock.css debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/haddock.css + install -Dp -m 644 docs/0.5.0/happstack-state/index-frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/index-frames.html + install -Dp -m 644 docs/0.5.0/happstack-state/mini_Happstack-State-Control.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/mini_Happstack-State-Control.html + install -Dp -m 644 docs/0.5.0/happstack-state/Happstack-State-ComponentTH.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/Happstack-State-ComponentTH.html + install -Dp -m 644 docs/0.5.0/happstack-state/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/happstack-state/frames.html + install -Dp -m 644 docs/0.5.0/frames.html debian/happstackdotcom-data/usr/share/happstackdotcom-data/docs/0.5.0/docs/0.5.0/frames.html adddir ./docs/0.5.0 adddir ./docs/0.5.0/HStringTemplate addfile ./docs/0.5.0/HStringTemplate.haddock binary ./docs/0.5.0/HStringTemplate.haddock oldhex * newhex *0d0cface000f0000852500007c7b51000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000001000000 *050000000000000001000000060000000000000001000000070000000000000001000000080000 *0000000000010000000900000000000000010000000a00000000000000020000000b0000000000 *0000020000000c00000000000000010000000d00000000000000010000000e0000000000000001 *0000000f0000000000000001000000100000000000000001000000110000000000000001000000 *120000000000000002000000130000000000000002000000140000000000000002000000150000 *000000000002000000160000000000000002000000170000000000000002000000180000000000 *0000020000001900000000000000020000001a00000000000000020000001b0000000000000002 *0000001c00000000000000020000001d00000000000000020000001e0000000000000002000000 *1f0000000000000001000000200000000000000003000000210000000000000003000000220000 *000000000003000000230000000000000003000000240000000000000003000000250000000000 *000003000000260000000000000001000000270000000000000003000000280000000000000003 *0000002900000000000000030000002a00000000000000030000002b0000000000000001000000 *2c00000000000000030000002d00000000000000010000002e00000000000000010000002f0000 *000000000001000000300000000000000001000000310000000000000001000000320000000000 *000001000000330000000000000001000000340000000000000001000000350000000000000001 *000000360000000000000001000000370000000000000001000000380000000000000001000000 *3900000000000000010000003a00000000000000010000003b00000000000000010000003c0000 *0000000000010000003d00000000000000030000003e00000000000000030000003f0000000000 *000003000000400000000000000001000000410000000000000004000000420000000000000001 *000000430000000000000001000000440000000000000001000000450000000000000001000000 *460000000000000001000000470000000000000001000000480000000000000001000000490000 *0000000000010000004a00000000000000010000004b00000000000000010000004c0000000000 *0000010000004d00000000000000010000004e00000000000000010000004f0000000000000001 *000000500000000000000001090000000000000002000000002000000000010301023700000054 *000000680000006500000020000000530000007400000072000000690000006e00000067000000 *61000000620000006c0000006500000020000000630000006c0000006100000073000000730000 *002000000073000000680000006f000000750000006c0000006400000020000000620000006500 *000020000000690000006e0000007300000074000000610000006e000000740000006900000061 *000000740000006500000064000000200000007700000069000000740000006800000020000000 *630000006100000072000000650000002e0000000a02420000002000000047000000650000006e *0000006500000072000000610000006c0000006c000000790000002c0000002000000074000000 *68000000650000002000000070000000720000006f000000760000006900000064000000650000 *006400000020000000690000006e0000007300000074000000610000006e000000630000006500 *0000730000002000000073000000680000006f000000750000006c000000640000002000000062 *0000006500000020000000650000006e0000006f00000075000000670000006800000020000000 *660000006f0000007200000020000000610000006e000000790000007400000068000000690000 *006e000000670000002e0000000a00000000010000000000020000000000030000000000040103 *01020d00000044000000650000006600000061000000750000006c000000740000007300000020 *000000740000006f00000020000000200107022f000000200000006d000000630000006f000000 *6e0000006300000061000000740000004d0000006100000070000000200000006d000000200000 *006b000000200000003d00000020000000660000006f0000006c00000064000000720000002000 *0000280000006d000000610000007000000070000000650000006e00000064000000200000002e *000000200000006b00000029000000200000006d000000650000006d0000007000000074000000 *79000000200000006d0000002002010000000a0000000005010301020d00000044000000650000 *006600000061000000750000006c000000740000007300000020000000740000006f0000002000 *0000200107021b00000020000000280000006d000000630000006f0000006e0000006300000061 *00000074000000200000002e00000029000000200000002e00000020000000690000006e000000 *740000006500000072000000730000007000000065000000720000007300000065000000200201 *0000000a0000000006010301020d00000044000000650000006600000061000000750000006c00 *0000740000007300000020000000740000006f0000002000000020010701022900000020000000 *200000006d0000006c0000006100000062000000650000006c0000002000000078000000200000 *0079000000200000003d00000020000000730000006d000000630000006f0000006e0000006300 *00006100000074000000200000005b000000780000002c00000020000000730000007400000046 *000000720000006f0000006d000000530000007400000072000000690000006e00000067000000 *200105010000005b0102120000002c00000020000000790000002c000000200000007300000074 *00000046000000720000006f0000006d000000530000007400000072000000690000006e000000 *67000000200105010000005d0102010000005d02010000002002010000000a0000000007010302 *2c0000004a000000750000007300000074000000200000006d000000650000006d000000700000 *0074000000790000002e0000002000000048000000650000007200000065000000200000007400 *00006f0000002000000061000000760000006f0000006900000064000000200000006f00000072 *0000007000000068000000610000006e00000020000000690000006e0000007300000074000000 *610000006e0000006300000065000000730000000a00000000080103022d0000004a0000007500 *00007300000074000000200000006d000000610000007000000070000000650000006e00000064 *0000002e000000200000004800000065000000720000006500000020000000740000006f000000 *2000000061000000760000006f0000006900000064000000200000006f00000072000000700000 *0068000000610000006e00000020000000690000006e0000007300000074000000610000006e00 *00006300000065000000730000000a00000000090103022d0000004a0000007500000073000000 *74000000200000006d000000630000006f0000006e0000006300000061000000740000002e0000 *00200000004800000065000000720000006500000020000000740000006f000000200000006100 *0000760000006f0000006900000064000000200000006f00000072000000700000006800000061 *0000006e00000020000000690000006e0000007300000074000000610000006e00000063000000 *65000000730000000a000000000a00000000000b00000000000c010301024c0000005400000068 *0000006500000020000000530000007400000072000000690000006e0000006700000054000000 *650000006d000000700000006c00000061000000740000006500000053000000680000006f0000 *00770000007300000020000000630000006c000000610000007300000073000000200000007300 *0000680000006f000000750000006c000000640000002000000062000000650000002000000069 *0000006e0000007300000074000000610000006e00000074000000690000006100000074000000 *650000006400000020000000660000006f0000007200000020000000610000006c0000006c0000 *002000000074000000790000007000000065000000730000002000000074000000680000006100 *000074000000200000006100000072000000650000000a02950000002000000064000000690000 *00720000006500000063000000740000006c000000790000002000000064000000690000007300 *0000700000006c0000006100000079000000650000006400000020000000690000006e00000020 *0000006100000020000000530000007400000072000000690000006e0000006700000054000000 *650000006d000000700000006c0000006100000074000000650000002c00000020000000620000 *0075000000740000002000000074000000610000006b0000006500000020000000610000006e00 *0000200000006f0000007000000074000000690000006f0000006e000000610000006c00000020 *000000660000006f000000720000006d0000006100000074000000200000007300000074000000 *72000000690000006e000000670000002e00000020000000450000006100000063000000680000 *002000000073000000750000006300000068000000200000007400000079000000700000006500 *0000200000006d0000007500000073000000740000002000000068000000610000007600000065 *00000020000000610000006e00000020000000610000007000000070000000720000006f000000 *70000000720000006900000061000000740000006500000020000000540000006f000000530000 *00450000006c000000650000006d000000200000006d0000006500000074000000680000006f00 *00006400000020000000640000006500000066000000690000006e000000650000006400000020 *00000061000000730000002000000077000000650000006c0000006c0000002e0000000a000000 *000d010301020c00000044000000650000006600000061000000750000006c0000007400000073 *00000020000000740000006f000000200104010000005102020000002e0000000a000000000e01 *0301020d00000044000000650000006600000061000000750000006c0000007400000073000000 *20000000740000006f000000200000002001070102010000002001020100000020021c0000005f *0000002000000061000000200000002d0000003e00000020000000730000007400000072000000 *690000006e0000006700000054000000650000006d000000700000006c00000061000000740000 *006500000053000000680000006f0000007700000020000000610000002002010000000a000000 *000f010301024300000054000000680000006500000020000000540000006f0000005300000045 *0000006c000000650000006d00000020000000630000006c000000610000007300000073000000 *2000000073000000680000006f000000750000006c000000640000002000000062000000650000 *0020000000690000006e0000007300000074000000610000006e00000074000000690000006100 *000074000000650000006400000020000000660000006f0000007200000020000000610000006c *0000006c0000002000000074000000790000007000000065000000730000002000000074000000 *6800000061000000740000002000000063000000610000006e0000002000000062000000650000 *000a022f00000020000000690000006e0000007300000065000000720000007400000065000000 *640000002000000061000000730000002000000061000000740000007400000072000000690000 *00620000007500000074000000650000007300000020000000690000006e000000740000006f00 *0000200000006100000020000000530000007400000072000000690000006e0000006700000054 *000000650000006d000000700000006c0000006100000074000000650000002e0000000a000000 *001000000000001100000000001200000000001300000000001400000000001500000000001600 *000000001700000000001800000000001900000000001a00000000001b00000000001c00000000 *001d00000000001e00000000001f010301023b0000005400000068000000690000007300000020 *0000006d0000006500000074000000680000006f00000064000000200000007300000068000000 *6f000000750000006c000000640000002000000062000000650000002000000075000000730000 *00650000006400000020000000740000006f000000200000006300000072000000650000006100 *0000740000006500000020000000540000006f00000053000000450000006c000000650000006d *00000020000000690000006e0000007300000074000000610000006e0000006300000065000000 *7300000020000000660000006f000000720000000a023200000020000000740000007900000070 *000000650000007300000020000000640000006500000066000000690000006e00000069000000 *6e00000067000000200000006100000020000000630000007500000073000000740000006f0000 *006d00000020000000660000006f000000720000006d0000006100000074000000740000006500 *0000640000002000000073000000680000006f000000770000002000000066000000750000006e *0000006300000074000000690000006f0000006e0000002e0000000a0020000000000000000100 *000002000000030000000400000005000000060000000700000008000000090000000a0000000b *0000000c0000000d0000000e0000000f0000001000000011000000120000001300000014000000 *15000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000 *001f20000000120000001a00000019000000180000001700000016000000150000001400000013 *0000000c0000000d0000000e0000000f00000010000000110000001b0000000a0000000b000000 *1c0000001d0000001e000000000000000100000002000000030000000400000005000000060000 *000700000008000000090000001f01032000000000090000000100000002000000030000000400 *000005000000060000000700000008000000090000000100000000020000000003000000000400 *000000050000000006000000000700000000080000000009000000000a010000000b0000000b00 *0000000c020000000d0000000e0000000d000000000e000000000f020000001000000011000000 *1000000000110000000012080000001a0000001900000018000000170000001600000015000000 *140000001300000013000000001400000000150000000016000000001700000000180000000019 *000000001a000000001b000000001c020000001d0000001e0000001d000000001e000000001f00 *000000000000000500000000010000005200000000020003000000000000000003000000006500 *000053000000000054000000000055000000000056000000000020000000000021000000000022 *000000000023000000000024000000000025000000000026010301020e00000041000000200000 *00530000007400000072000000690000006e000000670000002000000077000000690000007400 *0000680000002001020100000022010205000000680000006f0000006c00000065000000730102 *010000002201022f00000020000000690000006e0000002000000069000000740000002e000000 *20000000530000007400000072000000690000006e0000006700000054000000650000006d0000 *00700000006c00000061000000740000006500000073000000200000006d000000610000007900 *000020000000620000006500000020000000630000006f0000006d000000700000006f00000073 *0000006500000064000000200000006f0000006600000020000000610000006e00000079000000 *0a0102010000002001040100000000010224000000200000007400000079000000700000006500 *00002c000000200000007700000068000000690000006300000068000000200000006100000074 *00000020000000740000006800000065000000200000006d0000006f0000006d00000065000000 *6e0000007400000020000000690000006e000000630000006c0000007500000064000000650000 *00730000002001040100000057010203000000730000002c0000002001020a0000004200000079 *0000007400000065000000530000007400000072000000690000006e0000006701020300000073 *0000002c0000000a01020f00000020000000500000007200000065000000740000007400000079 *0000005000000072000000690000006e0000007400000065000000720000002001020300000044 *0000006f00000063010207000000730000002c00000020000000610000006e0000006400000020 *0104020000005800000059010201000000200104010000005701021e000000730000002c000000 *200000007700000068000000690000006300000068000000200000006100000072000000650000 *002000000061000000630000007400000075000000610000006c0000006c000000790000002000 *00006f0000006600000020000000740000007900000070000000650000000a0102010000002001 *04010000005a0102410000002e000000200000005700000068000000650000006e000000200000 *006100000020000000530000007400000072000000690000006e00000067000000540000006500 *00006d000000700000006c00000061000000740000006500000020000000690000007300000020 *000000630000006f0000006d000000700000006f00000073000000650000006400000020000000 *6f00000066000000200000006100000020000000740000007900000070000000650000002c0000 *002000000069000000740000007300000020000000690000006e00000074000000650000007200 *00006e000000610000006c00000073000000200000006100000072000000650000000a01022000 *00002000000061000000730000002000000077000000650000006c0000006c0000002c00000020 *000000730000006f0000002000000069000000740000002000000069000000730000002c000000 *20000000730000006f00000020000000740000006f000000200000007300000070000000650000 *00610000006b000000200102010000002201021900000074000000750000007200000074000000 *6c000000650000007300000020000000610000006c0000006c0000002000000074000000680000 *00650000002000000077000000610000007900000020000000640000006f000000770000006e00 *00002e0102010000002202010000000a000000002700000000002800000000002900000000002a *00000000002b010301022b000000410000002000000066000000750000006e0000006300000074 *000000690000006f0000006e000000200000007400000068000000610000007400000020000000 *67000000650000006e000000650000007200000061000000740000006500000073000000200000 *00530000007400000072000000690000006e0000006700000054000000650000006d0000007000 *00006c000000610000007400000065000000730000002e0000000a01022e000000200000005400 *000068000000690000007300000020000000690000007300000020000000630000006f0000006e *0000006300000065000000700000007400000075000000610000006c0000006c00000079000000 *200000006100000020000000710000007500000065000000720000007900000020000000660000 *00750000006e0000006300000074000000690000006f0000006e00000020000000690000006e00 *0000740000006f0000002000000061000000200102010000002201020500000067000000720000 *006f0000007500000070010201000000220215000000200000006f000000660000002000000053 *0000007400000072000000690000006e0000006700000054000000650000006d00000070000000 *6c000000610000007400000065000000730000002e0000000a000000005b00000000005c000000 *00005d00000000005e00000000005f00000000006000000000002c00000000002d010302260000 *0052000000650000006e0000006400000065000000720000007300000020000000610000002000 *0000530000007400000072000000690000006e0000006700000054000000650000006d00000070 *0000006c00000061000000740000006500000020000000740000006f0000002000000061000000 *20000000530000007400000072000000690000006e000000670000002e0000000a000000002e01 *0301021e00000052000000650000006e0000006400000065000000720000007300000020000000 *6100000020000000530000007400000072000000690000006e0000006700000054000000650000 *006d000000700000006c00000061000000740000006500000020000000740000006f0000002000 *0000610000002001021d000000540000006500000078000000740000002e000000500000007200 *0000650000007400000074000000790000005000000072000000690000006e000000740000002e *000000480000007500000067000000680000006500000073000000500000004a0000002e000000 *440000006f0000006302020000002e0000000a000000002f0103023a0000004700000065000000 *6e000000650000007200000069000000630000002000000072000000650000006e000000640000 *0065000000720000002000000066000000750000006e0000006300000074000000690000006f00 *00006e00000020000000660000006f000000720000002000000061000000200000005300000074 *00000072000000690000006e0000006700000054000000650000006d000000700000006c000000 *610000007400000065000000200000006f0000006600000020000000610000006e000000790000 *0020000000740000007900000070000000650000002e0000000a0000000030010301025d000000 *52000000650000007400000075000000720000006e000000730000002000000061000000200000 *007400000075000000700000006c00000065000000200000006f00000066000000200000007400 *000068000000720000006500000065000000200000004d00000061000000790000006200000065 *000000730000002e00000020000000540000006800000065000000200000006600000069000000 *720000007300000074000000200000006900000073000000200000007300000065000000740000 *002000000069000000660000002000000074000000680000006500000072000000650000002000 *000069000000730000002000000061000000200000007000000061000000720000007300000065 *000000200000006500000072000000720000006f0000007200000020000000690000006e000000 *200000007400000068000000650000002000000074000000650000006d000000700000006c0000 *006100000074000000650000002e0000000a010267000000200000005400000068000000650000 *00200000006e000000650000007800000074000000200000006900000073000000200000007300 *0000650000007400000020000000740000006f0000002000000061000000200000006c00000069 *0000007300000074000000200000006f0000006600000020000000610000007400000074000000 *720000006900000062000000750000007400000065000000730000002000000074000000680000 *0061000000740000002000000068000000610000007600000065000000200000006e0000006f00 *000074000000200000006200000065000000650000006e00000020000000730000006500000074 *0000002c000000200000006f00000072000000200000004e0000006f0000007400000068000000 *690000006e0000006700000020000000690000006600000020000000610000006c0000006c0000 *002000000061000000740000007400000072000000690000006200000075000000740000006500 *00007300000020000000610000007200000065000000200000007300000065000000740000002e *0000000a01027c00000020000000540000006800000065000000200000006c0000006100000073 *000000740000002000000069000000730000002000000073000000650000007400000020000000 *740000006f0000002000000061000000200000006c000000690000007300000074000000200000 *006f0000006600000020000000690000006e000000760000006f0000006b000000650000006400 *00002000000074000000650000006d000000700000006c00000061000000740000006500000073 *00000020000000740000006800000061000000740000002000000063000000610000006e000000 *6e0000006f00000074000000200000006200000065000000200000006c0000006f0000006f0000 *006b00000065000000640000002000000075000000700000002c000000200000006f0000007200 *0000200000004e0000006f0000007400000068000000690000006e000000670000002000000069 *0000006600000020000000610000006c0000006c00000020000000690000006e00000076000000 *6f0000006b00000065000000640000002000000074000000650000006d000000700000006c0000 *00610000007400000065000000730000002000000063000000610000006e000000200000006200 *00006500000020000000660000006f000000750000006e000000640000002e0000000a02920000 *00200000004e0000006f0000007400000065000000200000007400000068000000610000007400 *000020000000740000006800000069000000730000002000000063000000680000006500000063 *0000006b000000200000006900000073000000200000007300000068000000610000006c000000 *6c0000006f00000077000000200000002d0000002d00000020000000690000002e000000650000 *002e000000200000006d000000690000007300000073000000690000006e000000670000002000 *000061000000740000007400000072000000690000006200000075000000740000006500000073 *00000020000000610000006e000000640000002000000074000000650000006d00000070000000 *6c0000006100000074000000650000007300000020000000610000007200000065000000200000 *006f0000006e0000006c0000007900000020000000630000006100000075000000670000006800 *00007400000020000000690000006e000000200000007400000068000000650000002000000074 *0000006f00000070000000200000006c0000006500000076000000650000006c00000020000000 *74000000650000006d000000700000006c0000006100000074000000650000002c000000200000 *006e0000006f0000007400000020000000610000006e0000007900000020000000690000006e00 *0000760000006f0000006b00000065000000640000002000000073000000750000006200000074 *000000650000006d000000700000006c0000006100000074000000650000002e0000000a000000 *003101030102320000005000000061000000720000007300000065000000730000002000000061 *00000020000000530000007400000072000000690000006e000000670000002000000074000000 *6f0000002000000070000000720000006f00000064000000750000006300000065000000200000 *006100000020000000530000007400000072000000690000006e00000067000000540000006500 *00006d000000700000006c0000006100000074000000650000002c000000200000007700000069 *000000740000006800000020010201000000270102010000002401020100000027010211000000 *730000002000000061000000730000002000000064000000650000006c000000690000006d0000 *0069000000740000006500000072000000730000002e0000000a024a0000002000000049000000 *7400000020000000690000007300000020000000630000006f0000006e00000073000000740000 *007200000075000000630000007400000065000000640000002000000077000000690000007400 *000068000000200000006100000020000000730000007400000075000000620000002000000067 *000000720000006f00000075000000700000002000000074000000680000006100000074000000 *2000000063000000610000006e0000006e0000006f00000074000000200000006c0000006f0000 *006f0000006b000000200000007500000070000000200000006f00000074000000680000006500 *0000720000002000000074000000650000006d000000700000006c000000610000007400000065 *000000730000002e0000000a0000000032010301024a0000005000000061000000720000007300 *00006500000073000000200000006100000020000000530000007400000072000000690000006e *0000006700000020000000740000006f0000002000000070000000720000006f00000064000000 *750000006300000065000000200000006100000020000000530000007400000072000000690000 *006e0000006700000054000000650000006d000000700000006c00000061000000740000006500 *00002c0000002000000064000000650000006c000000690000006d000000690000007400000065 *0000006400000020000000620000007900000020000000610000006e000000670000006c000000 *6500000020000000620000007200000061000000630000006b0000006500000074000000730000 *002e0000000a024a00000020000000490000007400000020000000690000007300000020000000 *630000006f0000006e000000730000007400000072000000750000006300000074000000650000 *006400000020000000770000006900000074000000680000002000000061000000200000007300 *00007400000075000000620000002000000067000000720000006f000000750000007000000020 *000000740000006800000061000000740000002000000063000000610000006e0000006e000000 *6f00000074000000200000006c0000006f0000006f0000006b0000002000000075000000700000 *00200000006f000000740000006800000065000000720000002000000074000000650000006d00 *0000700000006c000000610000007400000065000000730000002e0000000a0000000033010301 *023c0000005900000069000000650000006c000000640000007300000020000000610000002000 *0000530000007400000072000000690000006e0000006700000054000000650000006d00000070 *0000006c0000006100000074000000650000002000000077000000690000007400000068000000 *2000000074000000680000006500000020000000610000007000000070000000720000006f0000 *007000000072000000690000006100000074000000650000002000000061000000740000007400 *000072000000690000006200000075000000740000006500000020000000730000006500000074 *0000002e0000000a023c0000002000000049000000660000002000000074000000680000006500 *000020000000610000007400000074000000720000006900000062000000750000007400000065 *00000020000000610000006c000000720000006500000061000000640000007900000020000000 *6500000078000000690000007300000074000000730000002c0000002000000069000000740000 *0020000000690000007300000020000000610000007000000070000000650000006e0000006400 *0000650000006400000020000000740000006f0000002000000061000000200000006c00000069 *00000073000000740000002e0000000a0000000034010301023d00000059000000690000006500 *00006c000000640000007300000020000000610000002000000053000000740000007200000069 *0000006e0000006700000054000000650000006d000000700000006c0000006100000074000000 *650000002000000077000000690000007400000068000000200000007400000068000000650000 *0020000000610000007000000070000000720000006f0000007000000072000000690000006100 *000074000000650000002000000061000000740000007400000072000000690000006200000075 *000000740000006500000073000000200000007300000065000000740000002e0000000a023c00 *000020000000490000006600000020000000610000006e00000079000000200000006100000074 *000000740000007200000069000000620000007500000074000000650000002000000061000000 *6c0000007200000065000000610000006400000079000000200000006500000078000000690000 *007300000074000000730000002c00000020000000690000007400000020000000690000007300 *000020000000610000007000000070000000650000006e00000064000000650000006400000020 *000000740000006f0000002000000061000000200000006c000000690000007300000074000000 *2e0000000a0000000035010301023c0000005900000069000000650000006c0000006400000073 *000000200000006100000020000000530000007400000072000000690000006e00000067000000 *54000000650000006d000000700000006c00000061000000740000006500000020000000770000 *006900000074000000680000002000000074000000680000006500000020000000610000007000 *000070000000720000006f00000070000000720000006900000061000000740000006500000020 *000000610000007400000074000000720000006900000062000000750000007400000065000000 *200000007300000065000000740000002e0000000a01023c000000200000004900000066000000 *200000007400000068000000650000002000000061000000740000007400000072000000690000 *006200000075000000740000006500000020000000610000006c00000072000000650000006100 *00006400000079000000200000006500000078000000690000007300000074000000730000002c *000000200000006900000074000000200000006900000073000000200000006100000070000000 *70000000650000006e00000064000000650000006400000020000000740000006f000000200000 *0061000000200000006c0000006900000073000000740000002e0000000a010240000000200000 *00540000006800000069000000730000002000000077000000690000006c0000006c0000002000 *00006e0000006f00000074000000200000007400000072000000610000006e000000730000006c *000000610000007400000065000000200000007400000068000000650000002000000061000000 *740000007400000072000000690000006200000075000000740000006500000020000000740000 *0068000000720000006f00000075000000670000006800000020000000610000006e0000007900 *000020000000690000006e0000007400000065000000720000006d000000650000006400000069 *0000006100000074000000650000000a0102390000002000000072000000650000007000000072 *0000006500000073000000650000006e000000740000006100000074000000690000006f000000 *6e0000002c00000020000000730000006f000000200000006900000073000000200000006d0000 *006f00000072000000650000002000000065000000660000006600000069000000630000006900 *0000650000006e00000074000000200000007700000068000000650000006e0000002c00000020 *000000650000002e000000670000002e0000002000000073000000650000007400000074000000 *690000006e000000670000000a0241000000200000006100000074000000740000007200000069 *000000620000007500000074000000650000007300000020000000740000006800000061000000 *7400000020000000610000007200000065000000200000006c0000006100000072000000670000 *006500000020000000620000007900000074000000650000007300000074000000720000006900 *00006e000000670000007300000020000000690000006e00000020000000610000002000000062 *000000790000007400000065000000730000007400000072000000690000006e00000067000000 *2000000074000000650000006d000000700000006c0000006100000074000000650000002e0000 *000a0000000036010301023d0000005900000069000000650000006c0000006400000073000000 *200000006100000020000000530000007400000072000000690000006e00000067000000540000 *00650000006d000000700000006c00000061000000740000006500000020000000770000006900 *000074000000680000002000000074000000680000006500000020000000610000007000000070 *000000720000006f00000070000000720000006900000061000000740000006500000020000000 *610000007400000074000000720000006900000062000000750000007400000065000000730000 *00200000007300000065000000740000002e0000000a01023c0000002000000049000000660000 *0020000000610000006e0000007900000020000000610000007400000074000000720000006900 *00006200000075000000740000006500000020000000610000006c000000720000006500000061 *000000640000007900000020000000650000007800000069000000730000007400000073000000 *2c0000002000000069000000740000002000000069000000730000002000000061000000700000 *0070000000650000006e00000064000000650000006400000020000000740000006f0000002000 *000061000000200000006c0000006900000073000000740000002e0000000a0102320000002000 *000041000000740000007400000072000000690000006200000075000000740000006500000073 *000000200000006100000072000000650000002000000061000000640000006400000065000000 *64000000200000006e00000061000000740000006900000076000000650000006c000000790000 *002c000000200000007700000068000000690000006300000068000000200000006d0000006100 *0000790000002000000070000000720000006f000000760000006900000064000000650000000a *021300000020000000650000006600000066000000690000006300000069000000650000006e00 *00006300000079000000200000006700000061000000690000006e000000730000002e0000000a *000000003701030102370000005200000065000000700000006c00000061000000630000006500 *000073000000200000007400000068000000650000002000000061000000740000007400000072 *000000690000006200000075000000740000006500000073000000200000006f00000066000000 *200000006100000020000000530000007400000072000000690000006e00000067000000540000 *00650000006d000000700000006c00000061000000740000006500000020000000770000006900 *000074000000680000002000000074000000680000006f00000073000000650000000a01024200 *000020000000640000006500000073000000630000007200000069000000620000006500000064 *00000020000000690000006e000000200000007400000068000000650000002000000073000000 *65000000630000006f0000006e0000006400000020000000610000007200000067000000750000 *006d000000650000006e000000740000002e000000200000004900000066000000200000007400 *0000680000006500000020000000610000007200000067000000750000006d000000650000006e *0000007400000020000000640000006f0000006500000073000000200000006e0000006f000000 *74000000200000007900000069000000650000006c000000640000000a01024100000020000000 *6100000020000000730000006500000074000000200000006f00000066000000200000006e0000 *00610000006d000000650000006400000020000000610000007400000074000000720000006900 *000062000000750000007400000065000000730000002000000062000000750000007400000020 *0000006f0000006e0000006c000000790000002000000061000000200000007300000069000000 *6e000000670000006c00000065000000200000006f0000006e000000650000002c000000200000 *007400000068000000610000007400000020000000610000007400000074000000720000006900 *0000620000007500000074000000650000000a0102190000002000000069000000730000002000 *00006e000000610000006d00000065000000640000002c00000020000000610000007300000020 *000000610000002000000064000000650000006600000061000000750000006c00000074000000 *2c000000200102010000002201020200000069000000740102010000002202020000002e000000 *0a0000000038010301024200000051000000750000006500000072000000690000006500000073 *00000020000000610000006e00000020000000530000007400000072000000690000006e000000 *670000002000000054000000650000006d000000700000006c0000006100000074000000650000 *002000000047000000720000006f000000750000007000000020000000610000006e0000006400 *00002000000072000000650000007400000075000000720000006e00000073000000200000004a *000000750000007300000074000000200000007400000068000000650000002000000061000000 *7000000070000000720000006f0000007000000072000000690000006100000074000000650000 *000a023200000020000000530000007400000072000000690000006e0000006700000054000000 *650000006d000000700000006c0000006100000074000000650000002000000069000000660000 *002000000069000000740000002000000065000000780000006900000073000000740000007300 *00002c000000200000006f00000074000000680000006500000072000000770000006900000073 *000000650000002c000000200000004e0000006f0000007400000068000000690000006e000000 *670000002e0000000a000000003901030102080000004100000073000000200000007700000069 *0000007400000068000000200104010000003801022b0000002000000062000000750000007400 *0000200000006e0000006500000076000000650000007200000020000000690000006e0000006c *000000690000006e00000065000000640000002c00000020000000730000006f00000020000000 *610000007000000070000000720000006f00000070000000720000006900000061000000740000 *006500000020000000660000006f00000072000000200000007500000073000000650000000a02 *20000000200000007700000069000000740000006800000020000000760000006f0000006c0000 *006100000074000000690000006c000000650000002000000074000000650000006d0000007000 *00006c0000006100000074000000650000002000000067000000720000006f0000007500000070 *000000730000002e0000000a000000003a01030232000000410000006400000064000000730000 *00200000006100000020000000730000006500000074000000200000006f000000660000002000 *0000670000006c0000006f00000062000000610000006c000000200000006f0000007000000074 *000000690000006f0000006e0000007300000020000000740000006f0000002000000061000000 *2000000073000000690000006e000000670000006c000000650000002000000074000000650000 *006d000000700000006c0000006100000074000000650000000a000000003b010301023c000000 *5300000065000000740000007300000020000000610000006e00000020000000650000006e0000 *00630000006f00000064000000690000006e000000670000002000000066000000750000006e00 *00006300000074000000690000006f0000006e000000200000006f000000660000002000000061 *0000002000000074000000650000006d000000700000006c000000610000007400000065000000 *200000007400000068000000610000007400000020000000610000006c0000006c000000200000 *0076000000610000006c0000007500000065000000730000002000000061000000720000006500 *00000a0102380000002000000072000000650000006e0000006400000065000000720000006500 *00006400000020000000770000006900000074000000680000002e00000020000000460000006f *00000072000000200000006500000078000000610000006d000000700000006c00000065000000 *200000006f0000006e000000650000002000000075000000730000006500000066000000750000 *006c00000020000000650000006e000000630000006f0000006400000065000000720000002000 *0000770000006f000000750000006c000000640000002000000062000000650000002001021c00 *0000540000006500000078000000740000002e00000048000000740000006d0000006c0000002e *000000730000007400000072000000690000006e00000067000000540000006f00000048000000 *740000006d0000006c000000530000007400000072000000690000006e0000006702350000002e *00000020000000410000006c0000006c0000002000000061000000740000007400000072000000 *6900000062000000750000007400000065000000730000002000000077000000690000006c0000 *006c00000020000000620000006500000020000000650000006e000000630000006f0000006400 *00006500000064000000200000006f0000006e000000630000006500000020000000610000006e *00000064000000200000006f0000006e0000006c00000079000000200000006f0000006e000000 *63000000650000002e0000000a000000003c010301025100000041000000200000007300000070 *000000650000006300000069000000610000006c0000002000000074000000650000006d000000 *700000006c00000061000000740000006500000020000000740000006800000061000000740000 *002000000073000000690000006d000000700000006c0000007900000020000000640000007500 *00006d000000700000007300000020000000740000006800000065000000200000007600000061 *0000006c000000750000006500000073000000200000006f000000660000002000000061000000 *6c0000006c00000020000000740000006800000065000000200000006100000074000000740000 *007200000069000000620000007500000074000000650000007300000020000000730000006500 *00007400000020000000690000006e0000002000000069000000740000002e0000000a01025500 *00002000000054000000680000006900000073000000200000006d000000610000007900000020 *0000006200000065000000200000006d0000006100000064000000650000002000000061000000 *7600000061000000690000006c00000061000000620000006c0000006500000020000000740000 *006f00000020000000610000006e000000790000002000000074000000650000006d0000007000 *00006c000000610000007400000065000000200000006100000073000000200000006100000020 *00000066000000750000006e0000006300000074000000690000006f0000006e00000020000000 *620000007900000020000000610000006400000064000000690000006e00000067000000200000 *00690000007400000020000000740000006f000000200000006900000074000000730000002000 *000067000000720000006f00000075000000700000002e0000000a010206000000200000004900 *00002e000000650000002e00000020010701023d000000200000006d000000790000004e000000 *650000007700000047000000720000006f0000007500000070000000200000003d000000200000 *006100000064000000640000005300000075000000700000006500000072000000470000007200 *00006f0000007500000070000000200000006d0000007900000047000000720000006f00000075 *0000007000000020000000240000002000000067000000720000006f0000007500000070000000 *530000007400000072000000690000006e0000006700000054000000650000006d000000700000 *006c00000061000000740000006500000073000000200000005b0000002801050b000000640000 *00750000006d000000700000004100000074000000740000007200000069000000620000007301 *020e0000002c0000002000000064000000750000006d0000007000000041000000740000007400 *000072000000690000006200000073000000290102010000005d02010000002002010000000a00 *0000003d0000000000610000000000620000000000630000000000640000000000650000000000 *6600000000006700000000006800000000006900000000003e00000000006a00000000006b0000 *0000006c00000000006d00000000006e00000000003f0103010229000000470000006500000074 *0000007300000020000000610000006c0000006c00000020000000710000007500000061000000 *730000006900000071000000750000006f000000740000006500000064000000200000006e0000 *00610000006d00000065000000730000002c000000200000006e0000006f000000720000006d00 *0000610000006c000000200000006e000000610000006d00000065000000730000002001020100 *0000260102250000002000000074000000650000006d000000700000006c000000610000007400 *00006500000073000000200000007500000073000000650000006400000020000000690000006e *000000200000006100000020000000670000006900000076000000650000006e00000020000000 *74000000650000006d000000700000006c0000006100000074000000650000002e0000000a0244 *000000200000004d00000075000000730000007400000020000000620000006500000020000000 *700000006100000073000000730000006500000064000000200000006100000020000000700000 *00610000006900000072000000200000006f000000660000002000000063000000680000006100 *000072000000730000002000000064000000650000006e0000006f00000074000000690000006e *00000067000000200000007400000068000000650000002000000064000000650000006c000000 *690000006d000000650000007400000065000000720000007300000020000000740000006f0000 *0020000000620000006500000020000000750000007300000065000000640000002e0000000a00 *0000006f0000000000700103023a00000047000000650000006e00000065000000720000006900 *0000630000002000000072000000650000006e0000006400000065000000720000002000000066 *000000750000006e0000006300000074000000690000006f0000006e0000002000000066000000 *6f00000072000000200000006100000020000000530000007400000072000000690000006e0000 *006700000054000000650000006d000000700000006c0000006100000074000000650000002000 *00006f0000006600000020000000610000006e0000007900000020000000740000007900000070 *000000650000002e0000000a0000000040010302dd000000520000006500000074000000750000 *00720000006e000000730000002000000061000000200000007400000075000000700000006c00 *000065000000200000006f00000066000000200000007400000068000000720000006500000065 *000000200000006c000000690000007300000074000000730000002e0000002000000054000000 *680000006500000020000000660000006900000072000000730000007400000020000000690000 *0073000000200000006f000000660000002000000074000000650000006d000000700000006c00 *000061000000740000006500000073000000200000007700000069000000740000006800000020 *000000700000006100000072000000730000006500000020000000650000007200000072000000 *6f00000072000000730000002c00000020000000610000006e0000006400000020000000740000 *0068000000650000006900000072000000200000006500000072000000720000006f0000007300 *00002e00000020000000540000006800000065000000200000006e000000650000007800000074 *000000200000006900000073000000200000006f00000066000000200000006d00000069000000 *7300000073000000690000006e0000006700000020000000610000007400000074000000720000 *006900000062000000750000007400000065000000730000002c00000020000000610000006e00 *00006400000020000000740000006800000065000000200000006c000000610000007300000074 *000000200000006900000073000000200000006f00000066000000200000006d00000069000000 *7300000073000000690000006e000000670000002000000074000000650000006d000000700000 *006c000000610000007400000065000000730000002e0000002000000049000000660000002000 *000074000000680000006500000072000000650000002000000061000000720000006500000020 *0000006e0000006f000000200000006500000072000000720000006f0000007200000073000000 *2c000000200000007400000068000000650000006e00000020000000610000006c0000006c0000 *00200000006c000000690000007300000074000000730000002000000077000000690000006c00 *00006c00000020000000620000006500000020000000650000006d000000700000007400000079 *0000002e0000000a00000000710000000000720000000000730000000000740000000000750000 *0000007600000000007700000000007800000000007900000000007a00000000007b0000000000 *7c00000000007d00000000007e00000000007f010301023d000000690000006600000020000000 *7000000020000000690000007300000020000000740000007200000075000000650000002c0000 *002000000073000000740000006d000000700000006c0000002000000063000000610000006e00 *0000200000006600000061000000690000006c0000002000000067000000720000006100000063 *0000006500000066000000750000006c0000006c000000790000002c0000002000000066000000 *610000006c00000073000000650000002000000069000000740000002000000064000000690000 *00650000007300000020000000680000006100000072000000640000002e0000000a0240000000 *2000000053000000650000007400000020000000740000006f0000002000000066000000610000 *006c00000073000000650000002000000061000000740000002000000074000000680000006500 *000020000000740000006f00000070000000200000006c0000006500000076000000650000006c *0000002c00000020000000610000006e0000006400000020000000740000007200000075000000 *650000002000000077000000690000007400000068000000690000006e00000020000000690000 *006600000020000000650000007800000070000000720000006500000073000000730000006900 *00006f0000006e000000730000002e0000000a0000000080000000000081000000000082000000 *000083000000000084000000000085000000000086000000000087000000000088000000000089 *00000000008a00000000008b00000000008c00000000008d00000000008e00000000008f000000 *000090000000000091000000000092000000000093000000000094000000000095000000000096 *00000000009700000000009800000000009900000000009a000032000000000000000100000002 *000000030000000400000005000000060000000700000008000000090000000c0000000d000000 *0e0000000f00000010000000110000001f00000020000000210000002200000023000000240000 *0025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e00 *00002f000000300000003100000032000000330000003400000035000000360000003700000038 *000000390000003a0000003b0000003c0000003d0000003e0000003f0000004032000000260000 *002700000028000000290000002a0000000c0000000d0000000e0000000f000000100000001100 *00002b000000000000000100000002000000030000000400000005000000060000000700000008 *000000090000001f0000003d0000002d0000002e0000002f000000310000003200000038000000 *3900000033000000340000003500000036000000370000003a0000003b0000002c000000200000 *0021000000220000002300000024000000250000003e0000003c00000030000000400000003f01 *032100000020050000002100000022000000230000002400000025000000210000000022000000 *0023000000002400000000250000000026040000002700000028000000290000002a0000002700 *000000280000000029000000002a000000002b000000002c000000002d000000002e000000002f *000000003000000000310000000032000000003300000000340000000035000000003600000000 *3700000000380000000039000000003a000000003b000000003c000000003d000000003e000000 *003f0000000040000000000000000004000108000000700000006f000000720000007400000061 *000000620000006c00000065010c00000065000000780000007000000065000000720000006900 *00006d000000650000006e00000074000000610000006c0112000000730000002e000000630000 *006c0000006f00000076000000650000007200000040000000670000006d000000610000006900 *00006c0000002e000000630000006f0000006d030000004100000000009b00000000009c000001 *00000041010000004100010000004100000000000000000600000000100000009d00000000009e *00000000009f0000000000a0000000000042010301024a00000047000000690000007600000065 *0000006e0000002000000061000000200000006c00000069000000730000007400000020000000 *6f00000066000000200000006e000000610000006d0000006500000064000000200000006f0000 *006600000020000000530000007400000072000000690000006e00000067000000540000006500 *00006d000000700000006c000000610000007400000065000000730000002c0000002000000072 *000000650000007400000075000000720000006e00000073000000200000006100000020000000 *67000000720000006f000000750000007000000020000000770000006800000069000000630000 *00680000002000000067000000650000006e000000650000007200000061000000740000006500 *0000730000000a022b000000200000007400000068000000650000006d00000020000000730000 *007500000063000000680000002000000074000000680000006100000074000000200000007400 *00006800000065000000790000002000000063000000610000006e000000200000006300000061 *0000006c0000006c000000200000006f0000006e0000006500000020000000610000006e000000 *6f000000740000006800000065000000720000002e0000000a0000000043010301024a00000047 *0000006900000076000000650000006e0000002000000061000000200000007000000061000000 *74000000680000002c0000002000000072000000650000007400000075000000720000006e0000 *007300000020000000610000002000000067000000720000006f00000075000000700000002000 *000077000000680000006900000063000000680000002000000067000000650000006e00000065 *000000720000006100000074000000650000007300000020000000610000006c0000006c000000 *2000000066000000690000006c000000650000007300000020000000690000006e000000200000 *007300000061000000690000006400000020000000640000006900000072000000650000006300 *0000740000006f00000072000000790000000a0102170000002000000077000000680000006900 *000063000000680000002000000068000000610000007600000065000000200000007400000068 *000000650000002000000070000000720000006f00000070000000650000007200000020010201 *0000002201020200000073000000740102010000002201020c0000002000000065000000780000 *0074000000650000006e00000073000000690000006f0000006e0000002e0000000a01024c0000 *0020000000540000006800000069000000730000002000000066000000750000006e0000006300 *000074000000690000006f0000006e000000200000006900000073000000200000007300000074 *000000720000006900000063000000740000002c00000020000000770000006900000074000000 *6800000020000000610000006c0000006c0000002000000066000000690000006c000000650000 *00730000002000000072000000650000006100000064000000200000006f0000006e0000006300 *0000650000002e0000002000000041000000730000002000000069000000740000002000000070 *0000006500000072000000660000006f000000720000006d000000730000002000000066000000 *690000006c0000006500000020000000490000004f0000002c0000000a022a0000002000000065 *000000780000007000000065000000630000007400000020000000690000007400000020000000 *740000006f000000200000007400000068000000720000006f0000007700000020000000740000 *00680000006500000020000000750000007300000075000000610000006c000000200000006500 *00007800000063000000650000007000000074000000690000006f0000006e000000730000002e *0000000a0000000044010301024a000000470000006900000076000000650000006e0000002000 *00006100000020000000700000006100000074000000680000002c000000200000007200000065 *0000007400000075000000720000006e0000007300000020000000610000002000000067000000 *720000006f00000075000000700000002000000077000000680000006900000063000000680000 *002000000067000000650000006e00000065000000720000006100000074000000650000007300 *000020000000610000006c0000006c0000002000000066000000690000006c0000006500000073 *00000020000000690000006e000000200000007300000061000000690000006400000020000000 *6400000069000000720000006500000063000000740000006f00000072000000790000000a0102 *170000002000000077000000680000006900000063000000680000002000000068000000610000 *007600000065000000200000007400000068000000650000002000000070000000720000006f00 *000070000000650000007200000020010201000000220102020000007300000074010201000000 *2201020c00000020000000650000007800000074000000650000006e0000007300000069000000 *6f0000006e0000002e0000000a0102470000002000000054000000680000006900000073000000 *2000000066000000750000006e0000006300000074000000690000006f0000006e000000200000 *006900000073000000200000006c000000610000007a0000007900000020000000690000006e00 *0000200000007400000068000000650000002000000073000000610000006d0000006500000020 *000000770000006100000079000000200000007400000068000000610000007400000020000000 *7200000065000000610000006400000046000000690000006c0000006500000020000000690000 *0073000000200000006c000000610000007a000000790000002c00000020000000770000006900 *0000740000006800000020000000610000006c0000006c0000000a01024a000000200000006600 *0000690000006c0000006500000073000000200000007200000065000000610000006400000020 *0000006f0000006e0000002000000064000000650000006d000000610000006e00000064000000 *2c00000020000000620000007500000074000000200000006e0000006f000000200000006d0000 *006f0000007200000065000000200000007400000068000000610000006e000000200000006f00 *00006e00000063000000650000002e00000020000000540000006800000065000000200000006c *000000690000007300000074000000200000006f00000066000000200000006600000069000000 *6c00000065000000730000002c00000020000000680000006f0000007700000065000000760000 *0065000000720000002c0000000a01024c00000020000000690000007300000020000000670000 *00650000006e000000650000007200000061000000740000006500000064000000200000006100 *000074000000200000007400000068000000650000002000000074000000690000006d00000065 *000000200000007400000068000000650000002000000066000000750000006e00000063000000 *74000000690000006f0000006e0000002000000069000000730000002000000063000000610000 *006c0000006c00000065000000640000002e000000200000004100000073000000200000007400 *000068000000690000007300000020000000700000006500000072000000660000006f00000072 *0000006d000000730000002000000066000000690000006c000000650000002000000049000000 *4f0000002c0000000a010245000000200000006500000078000000700000006500000063000000 *7400000020000000690000007400000020000000740000006f0000002000000074000000680000 *00720000006f000000770000002000000074000000680000006500000020000000750000007300 *000075000000610000006c00000020000000650000007800000063000000650000007000000074 *000000690000006f0000006e000000730000002e00000020000000410000006e00000064000000 *2c0000002000000061000000730000002000000069000000740000002000000069000000730000 *00200000006c000000610000007a000000790000002c0000002000000065000000780000007000 *00006500000063000000740000000a022800000020000000740000006800000065000000730000 *006500000020000000650000007800000063000000650000007000000074000000690000006f00 *00006e0000007300000020000000690000006e00000020000000750000006e0000006500000078 *00000070000000650000006300000074000000650000006400000020000000700000006c000000 *610000006300000065000000730000002e0000000a000000004501030102080000004100000073 *000000200000007700000069000000740000006800000020010401000000430102390000002c00 *000020000000620000007500000074000000200000007400000072000000610000007600000065 *000000720000007300000065000000730000002000000073000000750000006200000064000000 *69000000720000006500000063000000740000006f000000720000006900000065000000730000 *002000000061000000730000002000000077000000650000006c0000006c0000002e0000002000 *0000410000002000000074000000650000006d000000700000006c000000610000007400000065 *000000200000006e000000610000006d00000065000000640000000a0102010000002001020100 *000022010203000000660000006f0000006f010602230000006200000061000000720000002e00 *000073000000740000005c00000022000000200000006d00000061000000790000002000000062 *00000065000000200000007200000065000000660000006500000072000000650000006e000000 *630000006500000064000000200000006200000079000000200000005c00000022000000660000 *006f0000006f010203000000620000006100000072010201000000220218000000200000006900 *00006e000000200000007400000068000000650000002000000072000000650000007400000075 *000000720000006e00000065000000640000002000000067000000720000006f00000075000000 *700000002e0000000a000000004601030102160000005300000065000000650000002000000064 *0000006f00000063000000750000006d000000650000006e000000740000006100000074000000 *690000006f0000006e00000020000000660000006f000000720000002001040100000045020200 *00002e0000000a0000000047010301024700000041000000640000006400000073000000200000 *006100000020000000730000007500000070000000650000007200000067000000720000006f00 *0000750000007000000020000000740000006f00000020000000610000006e0000007900000020 *000000530000007400000072000000690000006e0000006700000054000000650000006d000000 *700000006c0000006100000074000000650000002000000067000000720000006f000000750000 *007000000020000000730000007500000063000000680000002000000074000000680000006100 *0000740000002000000074000000650000006d000000700000006c000000610000007400000065 *000000730000002000000066000000720000006f0000006d0000000a024b000000200000007400 *00006800000065000000200000006f000000720000006900000067000000690000006e00000061 *0000006c0000002000000067000000720000006f00000075000000700000002000000061000000 *7200000065000000200000006e0000006f000000770000002000000061000000620000006c0000 *006500000020000000740000006f0000002000000063000000610000006c0000006c0000002000 *00006f0000006e00000065000000730000002000000066000000720000006f0000006d00000020 *000000740000006800000065000000200000007300000075000000700000006500000072000000 *67000000720000006f000000750000007000000020000000610000007300000020000000770000 *00650000006c0000006c0000002e0000000a000000004801030102070000004100000064000000 *640000007300000020000000610000002001020100000022010208000000730000007500000062 *00000067000000720000006f000000750000007001020100000022010236000000200000007400 *00006f00000020000000610000006e000000790000002000000053000000740000007200000069 *0000006e0000006700000054000000650000006d000000700000006c0000006100000074000000 *650000002000000067000000720000006f00000075000000700000002000000073000000750000 *006300000068000000200000007400000068000000610000007400000020000000740000006500 *00006d000000700000006c00000061000000740000006500000073000000200000006600000072 *0000006f0000006d0000000a01022c00000020000000740000006800000065000000200000006f *000000720000006900000067000000690000006e000000610000006c0000002000000067000000 *720000006f0000007500000070000000200000006e0000006f0000007700000020000000680000 *006100000076000000650000002000000074000000650000006d000000700000006c0000006100 *000074000000650000002000000063000000610000006c0000006c000000730000002001020100 *000022010208000000730000006800000061000000640000006f00000077000000650000006401 *020100000022021200000020000000620000007900000020000000740000006800000065000000 *2000000073000000750000006200000067000000720000006f00000075000000700000002e0000 *000a000000004901030102450000004d0000006500000072000000670000006500000073000000 *2000000074000000770000006f0000002000000067000000720000006f00000075000000700000 *007300000020000000690000006e000000740000006f0000002000000061000000200000007300 *0000690000006e000000670000006c000000650000002000000067000000720000006f00000075 *000000700000002e00000020000000540000006800000069000000730000002000000066000000 *750000006e0000006300000074000000690000006f0000006e0000002000000069000000730000 *00200000006c0000006500000066000000740000002d0000006200000069000000610000007300 *000065000000640000002c0000000a024300000020000000700000007200000065000000660000 *006500000072000000690000006e000000670000002000000062000000690000006e0000006400 *0000690000006e00000067000000730000002000000066000000720000006f0000006d00000020 *000000740000006800000065000000200000006600000069000000720000007300000074000000 *2000000067000000720000006f0000007500000070000000200000007700000068000000650000 *006e00000020000000740000006800000065000000720000006500000020000000690000007300 *0000200000006100000020000000630000006f0000006e000000660000006c0000006900000063 *000000740000002e0000000a000000004a01030228000000410000006400000064000000730000 *00200000006100000020000000730000006500000074000000200000006f000000660000002000 *0000670000006c0000006f00000062000000610000006c000000200000006f0000007000000074 *000000690000006f0000006e0000007300000020000000740000006f0000002000000061000000 *2000000067000000720000006f00000075000000700000000a000000004b010301023900000053 *00000065000000740000007300000020000000610000006e00000020000000650000006e000000 *630000006f00000064000000690000006e000000670000002000000066000000750000006e0000 *006300000074000000690000006f0000006e000000200000006f00000066000000200000006100 *00002000000067000000720000006f000000750000007000000020000000740000006800000061 *0000007400000020000000610000006c0000006c0000002000000076000000610000006c000000 *750000006500000073000000200000006100000072000000650000000a02290000002000000072 *000000650000006e00000064000000650000007200000065000000640000002000000077000000 *69000000740000006800000020000000690000006e000000200000006500000061000000630000 *006800000020000000650000006e000000630000006c0000006f00000073000000650000006400 *00002000000074000000650000006d000000700000006c0000006100000074000000650000000a *000000004c0103010244000000460000006f0000007200000020000000610000006e0000007900 *000020000000720000006500000071000000750000006500000073000000740000006500000064 *0000002000000074000000650000006d000000700000006c000000610000007400000065000000 *2c0000002000000072000000650000007400000075000000720000006e00000073000000200000 *0061000000200000006d0000006500000073000000730000006100000067000000650000002000 *000074000000680000006100000074000000200000007400000068000000650000002000000074 *000000650000006d000000700000006c0000006100000074000000650000002000000077000000 *61000000730000000a01024b00000020000000750000006e00000061000000620000006c000000 *6500000020000000740000006f00000020000000620000006500000020000000660000006f0000 *00750000006e000000640000002e00000020000000550000007300000065000000660000007500 *00006c00000020000000740000006f000000200000006100000064000000640000002000000061 *000000730000002000000061000000200000007300000075000000700000006500000072000000 *2000000067000000720000006f000000750000007000000020000000660000006f000000720000 *00200000006100000020000000730000006500000074000000200000006f000000660000002000 *000074000000650000006d000000700000006c000000610000007400000065000000730000000a *022900000020000000750000006e00000064000000650000007200000020000000640000006500 *000076000000650000006c0000006f000000700000006d000000650000006e000000740000002c *00000020000000740000006f000000200000006100000069000000640000002000000069000000 *6e00000020000000640000006500000062000000750000006700000067000000690000006e0000 *00670000002e0000000a000000004d010301024b00000047000000690000007600000065000000 *6e00000020000000610000006e00000020000000690000006e0000007400000065000000670000 *0072000000610000006c00000020000000610000006d0000006f000000750000006e0000007400 *0000200000006f00000066000000200000007300000065000000630000006f0000006e00000064 *0000007300000020000000610000006e0000006400000020000000610000002000000070000000 *6100000074000000680000002c0000002000000072000000650000007400000075000000720000 *006e0000007300000020000000610000002000000067000000720000006f000000750000007000 *00002000000067000000650000006e00000065000000720000006100000074000000690000006e *000000670000000a01024000000020000000610000006c0000006c000000200000006600000069 *0000006c000000650000007300000020000000690000006e000000200000007300000061000000 *6900000064000000200000006400000069000000720000006500000063000000740000006f0000 *00720000007900000020000000610000006e000000640000002000000073000000750000006200 *00006400000069000000720000006500000063000000740000006f000000720000006900000065 *000000730000002000000077000000690000007400000068000000200000007400000068000000 *650000002000000070000000720000006f00000070000000650000007200000020010201000000 *2201020200000073000000740102010000002201020c0000002000000065000000780000007400 *0000650000006e00000073000000690000006f0000006e0000002c0000000a0102320000002000 *000063000000610000006300000068000000650000006400000020000000660000006f00000072 *000000200000007400000068000000610000007400000020000000610000006d0000006f000000 *750000006e00000074000000200000006f00000066000000200000007300000065000000630000 *006f0000006e00000064000000730000002e00000020000000490000004f000000200000006500 *000072000000720000006f00000072000000730000002000000061000000720000006500000020 *010201000000220102090000007300000077000000610000006c0000006c0000006f0000007700 *000065000000640102010000002201020c00000020000000620000007900000020000000740000 *0068000000690000007300000020000000730000006f0000000a01021400000020000000740000 *006800000061000000740000002000000065000000780000006300000065000000700000007400 *0000690000006f0000006e0000007300000020000000640000006f0000006e0102010000002701 *021e00000074000000200000006100000072000000690000007300000065000000200000006900 *00006e00000020000000750000006e000000650000007800000070000000650000006300000074 *000000650000006400000020000000700000006c00000061000000630000006500000073000000 *2e0000000a01024e00000020000000540000006800000069000000730000002000000076000000 *690000006f0000006c000000610000007400000065000000730000002000000072000000650000 *00660000006500000072000000650000006e0000007400000069000000610000006c0000002000 *00007400000072000000610000006e00000073000000700000006100000072000000650000006e *00000063000000790000002c000000200000006200000075000000740000002000000063000000 *610000006e00000020000000620000006500000020000000760000006500000072000000790000 *002000000075000000730000006500000066000000750000006c00000020000000690000006e00 *000020000000640000006500000076000000650000006c0000006f00000070000000690000006e *000000670000000a01024c0000002000000074000000650000006d000000700000006c00000061 *00000074000000650000007300000020000000660000006f000000720000002000000061000000 *6e0000007900000020000000730000006f0000007200000074000000200000006f000000660000 *002000000073000000650000007200000076000000650000007200000020000000610000007000 *0000700000006c00000069000000630000006100000074000000690000006f0000006e0000002e *0000002000000049000000740000002000000073000000680000006f000000750000006c000000 *640000002000000062000000650000002000000073000000770000006100000070000000700000 *006500000064000000200000006f000000750000007400000020000000660000006f0000007200 *00000a01024e0000002000000070000000720000006f0000006400000075000000630000007400 *0000690000006f0000006e00000020000000700000007500000072000000700000006f00000073 *00000065000000730000002e000000200000005400000068000000650000002000000064000000 *750000006d00000070000000410000007400000074000000720000006900000062000000730000 *002000000074000000650000006d000000700000006c0000006100000074000000650000002000 *000069000000730000002000000061000000640000006400000065000000640000002000000074 *0000006f0000002000000074000000680000006500000020000000720000006500000074000000 *75000000720000006e00000065000000640000002000000067000000720000006f000000750000 *00700000000a024f00000020000000620000007900000020000000640000006500000066000000 *61000000750000006c000000740000002c00000020000000610000007300000020000000690000 *00740000002000000073000000680000006f000000750000006c00000064000000200000007000 *0000720000006f0000007600000065000000200000007500000073000000650000006600000075 *0000006c00000020000000660000006f0000007200000020000000640000006500000062000000 *750000006700000067000000690000006e0000006700000020000000610000006e000000640000 *0020000000640000006500000076000000650000006c0000006f00000070000000690000006e00 *0000670000002000000074000000650000006d000000700000006c000000610000007400000065 *000000730000002e0000000a000c00000042000000430000004400000045000000460000004700 *000048000000490000004a0000004b0000004c0000004d000200030c0000004200000000430000 *00004400000000450000000046000000004700000000480000000049000000004a000000004b00 *0000004c000000004d00000000000000000700000000030000004e00000000004f000000000050 *0000030000004e0000004f00000050000100030000004e010000004f0000004f00000000500000 *000000000000080000000002000000a10000000000a20000000000000000000000000009000000 *0007000000a30000000000a40000000000a50000000000a60000000000a70000000000a8000000 *0000a90000000000000000000000000001000108000000700000006f0000007200000074000000 *61000000620000006c00000065010c000000650000007800000070000000650000007200000069 *0000006d000000650000006e00000074000000610000006c0112000000730000002e0000006300 *00006c0000006f00000076000000650000007200000040000000670000006d0000006100000069 *0000006c0000002e000000630000006f0000006d00330000000000000001000000020000000300 *00000400000005000000060000000700000008000000090000000c0000000d0000000e0000000f *00000010000000110000001f000000260000002b0000002d0000002e0000002f00000030000000 *3100000032000000330000003400000035000000360000003700000038000000390000003a0000 *003b0000003c000000400000004200000043000000440000004500000046000000470000004800 *0000490000004a0000004b0000004c0000004d0000004e0000004f000000503300000026000000 *2b0000000f00000010000000110000000c0000000d0000000e0000001f00000000000000010000 *0002000000030000000400000005000000060000000700000008000000090000004e0000004f00 *0000310000003200000038000000390000002d0000002e0000002f0000003c0000003000000040 *0000003300000050000000340000003500000036000000370000003a0000004a0000003b000000 *4b00000042000000470000004800000049000000430000004d0000004500000046000000440000 *004c000000000000000000aa0000000000000002030000000a0000000000000002000000000b00 *00000000000002000000000c0000000000000002000000000d0000000000000002000000000e00 *00000000000002000000000f000000000000000200000000100000000000000002000000001100 *000000000000020000000012000000000000000200000000130000000000000002030000001400 *000000000000020100000014000000000000000203000000150000000000000002000000001600 *000000000000020000000017000000000000000203000000180000000000000002000000001900 *00000000000002000000001a0000000000000002030000001b0000000000000002010000001c00 *00000000000002010000001d0000000000000002010000001e0000000000000002010000001f00 *000000000000020100000020000000000000000201000000210000000000000002010000002200 *000000000000020100000023000000000000000203000000240000000000000002030000002500 *000000000000020100000025000000000000000200000000260000000000000002000000002700 *000000000000030300000028000000000000000301000000280000000000000003000000002900 *00000000000003000000002a0000000000000003000000002b0000000000000003000000002c00 *00000000000003030000002d0000000000000003010000002e0000000000000003000000002f00 *000000000000030000000030000000000000000300000000310000000000000003030000003200 *000000000000030000000033000000000000000300000000340000000000000003000000003500 *000000000000030000000036000000000000000300000000370000000000000003000000003800 *0000000000000300000000390000000000000003000000003a0000000000000003000000003b00 *00000000000003000000003c0000000000000003000000003d0000000000000003000000003e00 *00000000000003000000003f000000000000000300000000400000000000000003000000004100 *000000000000030000000042000000000000000300000000430000000000000003000000004400 *000000000000030000000045000000000000000300000000460000000000000003000000004700 *000000000000040000000048000000000000000600000000490000000000000006000000004a00 *00000000000006000000004b0000000000000006000000004c0000000000000006000000004d00 *00000000000006000000004e0000000000000006000000004f0000000000000006000000005000 *000000000000060000000051000000000000000600000000520000000000000006000000005300 *000000000000060000000054000000000000000703000000550000000000000007000000005600 *0000000000000700000000570000005800000059000000005a0000000000000005000000005b00 *00000000000003030000005c0000000000000003010000005d0000000000000003010000005e00 *00000000000003010000005f000000580000006003000000610000005800000062010000006300 *000058000000620300000063000000580000005903000000640000000000000003030000006500 *000000000000030000000066000000000000000300000000670000000000000003000000006800 *0000000000000300000000690000000000000003000000006a0000000000000003000000006b00 *00000000000003000000006c0000000000000003000000006d0000000000000003000000006e00 *00000000000003000000006f000000000000000300000000700000000000000003000000007100 *000000000000030000000072000000000000000300000000730000000000000003000000007400 *000000000000030000000075000000000000000300000000760000000000000003000000007700 *000000000000030000000078000000000000000300000000790000000000000003000000007a00 *00000000000003000000007b0000000000000003000000007c0000000000000003000000007d00 *00000000000003000000007e0000000000000003000000007f0000000000000003000000008000 *000000000000030000000081000000000000000300000000820000000000000003000000008300 *000000000000030000000084000000000000000300000000850000000000000003000000008600 *000000000000030000000087000000000000000300000000880000000000000003000000008900 *00000000000003000000008a0000000000000003000000008b0000000000000003000000008c00 *00000000000003000000008d0000000000000003000000008e0000000000000003000000008f00 *000000000000030000000090000000000000000300000000910000000000000003000000009200 *000000000000030000000093000000000000000300000000940000000000000003000000009500 *000000000000030000000096000000000000000300000000970000000000000003000000009800 *0000000000000300000000990000000000000003000000009a0000000000000003000000009b00 *00000000000003000000009c0000000000000003000000009d0000000000000003000000009e00 *00000000000003000000009f000000000000000300000000a0000000000000000300000000a100 *0000000000000300000000a2000000000000000300000000a3000000000000000300000000a400 *0000000000000400000000a5000000000000000400000000a60000000000000006000000006600 *0000000000000600000000a7000000000000000600000000a8000000000000000600000000a900 *0000000000000800000000aa000000000000000800000000ab000000000000000903000000ac00 *0000000000000901000000ac000000000000000900000000ad000000000000000900000000ae00 *0000000000000900000000af000000000000000900000000b0000000000000000900000000b100 *000000000000b2000000000000001548537472696e6754656d706c6174652d302e362e32000000 *0000000013546578742e537472696e6754656d706c617465000000000000001b546578742e5374 *72696e6754656d706c6174652e436c61737365730000000000000018546578742e537472696e67 *54656d706c6174652e426173650000000000000016546578742e537472696e6754656d706c6174 *652e5151000000000000001d546578742e537472696e6754656d706c6174652e496e7374616e63 *65730000000000000019546578742e537472696e6754656d706c6174652e47726f757000000000 *0000001b546578742e537472696e6754656d706c6174652e52656e646572660000000000000023 *546578742e537472696e6754656d706c6174652e47656e657269635374616e6461726400000000 *00000024546578742e537472696e6754656d706c6174652e47656e6572696357697468436c6173 *73000000000000000a537472696e6761626c65000000000000000c737446726f6d537472696e67 *0000000000000010737446726f6d42797465537472696e67000000000000000a7374546f537472 *696e67000000000000000a6d636f6e6361744d6170000000000000000c6d696e74657263616c61 *746500000000000000066d6c6162656c0000000000000007736d656d7074790000000000000008 *736d617070656e640000000000000008736d636f6e6361740000000000000006535453686f7700 *00000000000013537472696e6754656d706c61746553686f77730000000000000012737472696e *6754656d706c61746553686f77000000000000001b737472696e6754656d706c617465466f726d *617474656453686f770000000000000007546f53456c656d0000000000000007746f53456c656d *000000000000000b746f53456c656d4c697374000000000000000553456c656d00000000000000 *05534e756c6c0000000000000004534e4154000000000000000453424c4500000000000000024c *490000000000000002534d00000000000000045354534800000000000000024253000000000000 *00035354520000000000000004534d617000000000000000075374466972737400000000000000 *0a73744765744669727374000000000000000b737453686f7773546f5345000000000000000453 *456e760000000000000003736d700000000000000005736f70747300000000000000047367656e *000000000000000473656e63000000000000000e537472696e6754656d706c6174650000000000 *00000453544d50000000000000000473656e76000000000000000772756e53544d500000000000 *00000763686b53544d500000000000000007535447726f7570000000000000000b706164646564 *5472616e730000000000000008746f537472696e670000000000000007746f5050446f63000000 *000000000672656e646572000000000000000d636865636b54656d706c61746500000000000000 *076e657753544d50000000000000000c6e6577416e676c6553544d50000000000000000c736574 *417474726962757465000000000000000d7365744d616e79417474726962000000000000001273 *65744e617469766541747472696275746500000000000000137365744d616e794e617469766541 *7474726962000000000000000b77697468436f6e74657874000000000000001167657453747269 *6e6754656d706c6174650000000000000012676574537472696e6754656d706c61746527000000 *000000000d6f7074496e73657274546d706c000000000000000a736574456e636f646572000000 *000000000b64756d70417474726962730000000000000006696e5347656e000000000000000970 *6172736553544d50000000000000000e706172736553544d504e616d6573000000000000001163 *6865636b54656d706c61746544656570000000000000000473746d70000000000000001467726f *7570537472696e6754656d706c61746573000000000000000e6469726563746f727947726f7570 *00000000000000126469726563746f727947726f75704c617a7900000000000000176469726563 *746f727947726f7570526563757273697665000000000000001b6469726563746f727947726f75 *705265637572736976654c617a79000000000000000d616464537570657247726f757000000000 *0000000b61646453756247726f7570000000000000000d6d65726765535447726f757073000000 *000000000e6f7074496e7365727447726f7570000000000000000f736574456e636f6465724772 *6f757000000000000000096e756c6c47726f7570000000000000001c756e73616665566f6c6174 *696c654469726563746f727947726f757000000000000000065345547970650000000000000007 *72656e6465726600000000000000027c3d00000000000000046261736500000000000000084748 *432e53686f77000000000000000473686f77000000000000000574326d6170000000000000000d *546d706c457863657074696f6e000000000000000a50617273654572726f720000000000000006 *4e6f546d706c00000000000000084e6f41747472696200000000000000084748432e4261736500 *00000000000006537472696e67000000000000000b446174612e4d6f6e6f696400000000000000 *04456e646f000000000000000553686f7753000000000000000a546d706c506172736572000000 *00000000043c24243e00000000000000027c2e00000000000000032e3e3e000000000000000866 *726f6d4d616e7900000000000000057377696e670000000000000009656e764c6f6f6b75700000 *00000000000b656e764c6f6f6b757045780000000000000009656e76496e736572740000000000 *000009656e76496e7341707000000000000000096f70744c6f6f6b757000000000000000096f70 *74496e7365727400000000000000076e756c6c4f7074000000000000000873744c6f6f6b757000 *0000000000000a6d6572676553456e7673000000000000000e64726f70547261696c696e674272 *000000000000000767657453657073000000000000000874656c6c4e616d650000000000000006 *74656c6c5151000000000000000874656c6c546d706c000000000000000763686b53746d700000 *00000000000972656e646572457272000000000000000b6d636f6e6361744d6170270000000000 *00000773686f7756616c000000000000000773686f7753747200000000000000076a7573745354 *520000000000000006737473686f77000000000000000773746673686f77000000000000000661 *726f756e6400000000000000067370616365640000000000000004776f72640000000000000007 *636f6d6c697374000000000000000570726f7073000000000000000b6573636170656443686172 *000000000000000a6573636170656453747200000000000000086d79436f6e6361740000000000 *00000573746d706c000000000000000773756253746d700000000000000007636f6d6d656e7400 *00000000000005626c616e6b00000000000000076f70744578707200000000000000076f70744c *696e65000000000000000767657450726f70000000000000000769664973536574000000000000 *0006696673746174000000000000000a656c73656966737461740000000000000008656c736573 *7461740000000000000009656e646966737461740000000000000005657870726e000000000000 *0009736571546d706c73270000000000000008736571546d706c73000000000000000873756265 *7870726e000000000000000b6272616365436f6e63617400000000000000076c69746572616c00 *00000000000006617474726962000000000000000666756e63746e00000000000000076d6b496e *646578000000000000000369783000000000000000086379636c65417070000000000000000770 *6c75736c656e00000000000000076c695472616e73000000000000000769746572417070000000 *0000000008616e6f6e546d706c000000000000000b72656754656d706c61746500000000000000 *0c71756f7465546d706c506174000000000000000c71756f7465546d706c457870000000000000 *00097265616446696c6527000000000000000e67726f757046726f6d46696c6573000000000000 *0011676574546d706c73526563757273697665000000000000000867546f53456c656d00000000 *0000000e7374726970496e6974556e6465720000000000000008546f53456c656d440000000000 *000008746f53456c656d4400000000000000177374726970496e697469616c556e64657273636f *726573000000000000000c746f53456c656d50726f7879000000000000000e67656e6572696354 *6f53456c656d00000000000000096765744669656c6473 addfile ./docs/0.5.0/HStringTemplate/HStringTemplate.haddock binary ./docs/0.5.0/HStringTemplate/HStringTemplate.haddock oldhex * newhex *0d0cface000f0000852500007c7b51000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000001000000 *050000000000000001000000060000000000000001000000070000000000000001000000080000 *0000000000010000000900000000000000010000000a00000000000000020000000b0000000000 *0000020000000c00000000000000010000000d00000000000000010000000e0000000000000001 *0000000f0000000000000001000000100000000000000001000000110000000000000001000000 *120000000000000002000000130000000000000002000000140000000000000002000000150000 *000000000002000000160000000000000002000000170000000000000002000000180000000000 *0000020000001900000000000000020000001a00000000000000020000001b0000000000000002 *0000001c00000000000000020000001d00000000000000020000001e0000000000000002000000 *1f0000000000000001000000200000000000000003000000210000000000000003000000220000 *000000000003000000230000000000000003000000240000000000000003000000250000000000 *000003000000260000000000000001000000270000000000000003000000280000000000000003 *0000002900000000000000030000002a00000000000000030000002b0000000000000001000000 *2c00000000000000030000002d00000000000000010000002e00000000000000010000002f0000 *000000000001000000300000000000000001000000310000000000000001000000320000000000 *000001000000330000000000000001000000340000000000000001000000350000000000000001 *000000360000000000000001000000370000000000000001000000380000000000000001000000 *3900000000000000010000003a00000000000000010000003b00000000000000010000003c0000 *0000000000010000003d00000000000000030000003e00000000000000030000003f0000000000 *000003000000400000000000000001000000410000000000000004000000420000000000000001 *000000430000000000000001000000440000000000000001000000450000000000000001000000 *460000000000000001000000470000000000000001000000480000000000000001000000490000 *0000000000010000004a00000000000000010000004b00000000000000010000004c0000000000 *0000010000004d00000000000000010000004e00000000000000010000004f0000000000000001 *000000500000000000000001090000000000000002000000002000000000010301023700000054 *000000680000006500000020000000530000007400000072000000690000006e00000067000000 *61000000620000006c0000006500000020000000630000006c0000006100000073000000730000 *002000000073000000680000006f000000750000006c0000006400000020000000620000006500 *000020000000690000006e0000007300000074000000610000006e000000740000006900000061 *000000740000006500000064000000200000007700000069000000740000006800000020000000 *630000006100000072000000650000002e0000000a02420000002000000047000000650000006e *0000006500000072000000610000006c0000006c000000790000002c0000002000000074000000 *68000000650000002000000070000000720000006f000000760000006900000064000000650000 *006400000020000000690000006e0000007300000074000000610000006e000000630000006500 *0000730000002000000073000000680000006f000000750000006c000000640000002000000062 *0000006500000020000000650000006e0000006f00000075000000670000006800000020000000 *660000006f0000007200000020000000610000006e000000790000007400000068000000690000 *006e000000670000002e0000000a00000000010000000000020000000000030000000000040103 *01020d00000044000000650000006600000061000000750000006c000000740000007300000020 *000000740000006f00000020000000200107022f000000200000006d000000630000006f000000 *6e0000006300000061000000740000004d0000006100000070000000200000006d000000200000 *006b000000200000003d00000020000000660000006f0000006c00000064000000720000002000 *0000280000006d000000610000007000000070000000650000006e00000064000000200000002e *000000200000006b00000029000000200000006d000000650000006d0000007000000074000000 *79000000200000006d0000002002010000000a0000000005010301020d00000044000000650000 *006600000061000000750000006c000000740000007300000020000000740000006f0000002000 *0000200107021b00000020000000280000006d000000630000006f0000006e0000006300000061 *00000074000000200000002e00000029000000200000002e00000020000000690000006e000000 *740000006500000072000000730000007000000065000000720000007300000065000000200201 *0000000a0000000006010301020d00000044000000650000006600000061000000750000006c00 *0000740000007300000020000000740000006f0000002000000020010701022900000020000000 *200000006d0000006c0000006100000062000000650000006c0000002000000078000000200000 *0079000000200000003d00000020000000730000006d000000630000006f0000006e0000006300 *00006100000074000000200000005b000000780000002c00000020000000730000007400000046 *000000720000006f0000006d000000530000007400000072000000690000006e00000067000000 *200105010000005b0102120000002c00000020000000790000002c000000200000007300000074 *00000046000000720000006f0000006d000000530000007400000072000000690000006e000000 *67000000200105010000005d0102010000005d02010000002002010000000a0000000007010302 *2c0000004a000000750000007300000074000000200000006d000000650000006d000000700000 *0074000000790000002e0000002000000048000000650000007200000065000000200000007400 *00006f0000002000000061000000760000006f0000006900000064000000200000006f00000072 *0000007000000068000000610000006e00000020000000690000006e0000007300000074000000 *610000006e0000006300000065000000730000000a00000000080103022d0000004a0000007500 *00007300000074000000200000006d000000610000007000000070000000650000006e00000064 *0000002e000000200000004800000065000000720000006500000020000000740000006f000000 *2000000061000000760000006f0000006900000064000000200000006f00000072000000700000 *0068000000610000006e00000020000000690000006e0000007300000074000000610000006e00 *00006300000065000000730000000a00000000090103022d0000004a0000007500000073000000 *74000000200000006d000000630000006f0000006e0000006300000061000000740000002e0000 *00200000004800000065000000720000006500000020000000740000006f000000200000006100 *0000760000006f0000006900000064000000200000006f00000072000000700000006800000061 *0000006e00000020000000690000006e0000007300000074000000610000006e00000063000000 *65000000730000000a000000000a00000000000b00000000000c010301024c0000005400000068 *0000006500000020000000530000007400000072000000690000006e0000006700000054000000 *650000006d000000700000006c00000061000000740000006500000053000000680000006f0000 *00770000007300000020000000630000006c000000610000007300000073000000200000007300 *0000680000006f000000750000006c000000640000002000000062000000650000002000000069 *0000006e0000007300000074000000610000006e00000074000000690000006100000074000000 *650000006400000020000000660000006f0000007200000020000000610000006c0000006c0000 *002000000074000000790000007000000065000000730000002000000074000000680000006100 *000074000000200000006100000072000000650000000a02950000002000000064000000690000 *00720000006500000063000000740000006c000000790000002000000064000000690000007300 *0000700000006c0000006100000079000000650000006400000020000000690000006e00000020 *0000006100000020000000530000007400000072000000690000006e0000006700000054000000 *650000006d000000700000006c0000006100000074000000650000002c00000020000000620000 *0075000000740000002000000074000000610000006b0000006500000020000000610000006e00 *0000200000006f0000007000000074000000690000006f0000006e000000610000006c00000020 *000000660000006f000000720000006d0000006100000074000000200000007300000074000000 *72000000690000006e000000670000002e00000020000000450000006100000063000000680000 *002000000073000000750000006300000068000000200000007400000079000000700000006500 *0000200000006d0000007500000073000000740000002000000068000000610000007600000065 *00000020000000610000006e00000020000000610000007000000070000000720000006f000000 *70000000720000006900000061000000740000006500000020000000540000006f000000530000 *00450000006c000000650000006d000000200000006d0000006500000074000000680000006f00 *00006400000020000000640000006500000066000000690000006e000000650000006400000020 *00000061000000730000002000000077000000650000006c0000006c0000002e0000000a000000 *000d010301020c00000044000000650000006600000061000000750000006c0000007400000073 *00000020000000740000006f000000200104010000005102020000002e0000000a000000000e01 *0301020d00000044000000650000006600000061000000750000006c0000007400000073000000 *20000000740000006f000000200000002001070102010000002001020100000020021c0000005f *0000002000000061000000200000002d0000003e00000020000000730000007400000072000000 *690000006e0000006700000054000000650000006d000000700000006c00000061000000740000 *006500000053000000680000006f0000007700000020000000610000002002010000000a000000 *000f010301024300000054000000680000006500000020000000540000006f0000005300000045 *0000006c000000650000006d00000020000000630000006c000000610000007300000073000000 *2000000073000000680000006f000000750000006c000000640000002000000062000000650000 *0020000000690000006e0000007300000074000000610000006e00000074000000690000006100 *000074000000650000006400000020000000660000006f0000007200000020000000610000006c *0000006c0000002000000074000000790000007000000065000000730000002000000074000000 *6800000061000000740000002000000063000000610000006e0000002000000062000000650000 *000a022f00000020000000690000006e0000007300000065000000720000007400000065000000 *640000002000000061000000730000002000000061000000740000007400000072000000690000 *00620000007500000074000000650000007300000020000000690000006e000000740000006f00 *0000200000006100000020000000530000007400000072000000690000006e0000006700000054 *000000650000006d000000700000006c0000006100000074000000650000002e0000000a000000 *001000000000001100000000001200000000001300000000001400000000001500000000001600 *000000001700000000001800000000001900000000001a00000000001b00000000001c00000000 *001d00000000001e00000000001f010301023b0000005400000068000000690000007300000020 *0000006d0000006500000074000000680000006f00000064000000200000007300000068000000 *6f000000750000006c000000640000002000000062000000650000002000000075000000730000 *00650000006400000020000000740000006f000000200000006300000072000000650000006100 *0000740000006500000020000000540000006f00000053000000450000006c000000650000006d *00000020000000690000006e0000007300000074000000610000006e0000006300000065000000 *7300000020000000660000006f000000720000000a023200000020000000740000007900000070 *000000650000007300000020000000640000006500000066000000690000006e00000069000000 *6e00000067000000200000006100000020000000630000007500000073000000740000006f0000 *006d00000020000000660000006f000000720000006d0000006100000074000000740000006500 *0000640000002000000073000000680000006f000000770000002000000066000000750000006e *0000006300000074000000690000006f0000006e0000002e0000000a0020000000000000000100 *000002000000030000000400000005000000060000000700000008000000090000000a0000000b *0000000c0000000d0000000e0000000f0000001000000011000000120000001300000014000000 *15000000160000001700000018000000190000001a0000001b0000001c0000001d0000001e0000 *001f20000000120000001a00000019000000180000001700000016000000150000001400000013 *0000000c0000000d0000000e0000000f00000010000000110000001b0000000a0000000b000000 *1c0000001d0000001e000000000000000100000002000000030000000400000005000000060000 *000700000008000000090000001f01032000000000090000000100000002000000030000000400 *000005000000060000000700000008000000090000000100000000020000000003000000000400 *000000050000000006000000000700000000080000000009000000000a010000000b0000000b00 *0000000c020000000d0000000e0000000d000000000e000000000f020000001000000011000000 *1000000000110000000012080000001a0000001900000018000000170000001600000015000000 *140000001300000013000000001400000000150000000016000000001700000000180000000019 *000000001a000000001b000000001c020000001d0000001e0000001d000000001e000000001f00 *000000000000000500000000010000005200000000020003000000000000000003000000006500 *000053000000000054000000000055000000000056000000000020000000000021000000000022 *000000000023000000000024000000000025000000000026010301020e00000041000000200000 *00530000007400000072000000690000006e000000670000002000000077000000690000007400 *0000680000002001020100000022010205000000680000006f0000006c00000065000000730102 *010000002201022f00000020000000690000006e0000002000000069000000740000002e000000 *20000000530000007400000072000000690000006e0000006700000054000000650000006d0000 *00700000006c00000061000000740000006500000073000000200000006d000000610000007900 *000020000000620000006500000020000000630000006f0000006d000000700000006f00000073 *0000006500000064000000200000006f0000006600000020000000610000006e00000079000000 *0a0102010000002001040100000000010224000000200000007400000079000000700000006500 *00002c000000200000007700000068000000690000006300000068000000200000006100000074 *00000020000000740000006800000065000000200000006d0000006f0000006d00000065000000 *6e0000007400000020000000690000006e000000630000006c0000007500000064000000650000 *00730000002001040100000057010203000000730000002c0000002001020a0000004200000079 *0000007400000065000000530000007400000072000000690000006e0000006701020300000073 *0000002c0000000a01020f00000020000000500000007200000065000000740000007400000079 *0000005000000072000000690000006e0000007400000065000000720000002001020300000044 *0000006f00000063010207000000730000002c00000020000000610000006e0000006400000020 *0104020000005800000059010201000000200104010000005701021e000000730000002c000000 *200000007700000068000000690000006300000068000000200000006100000072000000650000 *002000000061000000630000007400000075000000610000006c0000006c000000790000002000 *00006f0000006600000020000000740000007900000070000000650000000a0102010000002001 *04010000005a0102410000002e000000200000005700000068000000650000006e000000200000 *006100000020000000530000007400000072000000690000006e00000067000000540000006500 *00006d000000700000006c00000061000000740000006500000020000000690000007300000020 *000000630000006f0000006d000000700000006f00000073000000650000006400000020000000 *6f00000066000000200000006100000020000000740000007900000070000000650000002c0000 *002000000069000000740000007300000020000000690000006e00000074000000650000007200 *00006e000000610000006c00000073000000200000006100000072000000650000000a01022000 *00002000000061000000730000002000000077000000650000006c0000006c0000002c00000020 *000000730000006f0000002000000069000000740000002000000069000000730000002c000000 *20000000730000006f00000020000000740000006f000000200000007300000070000000650000 *00610000006b000000200102010000002201021900000074000000750000007200000074000000 *6c000000650000007300000020000000610000006c0000006c0000002000000074000000680000 *00650000002000000077000000610000007900000020000000640000006f000000770000006e00 *00002e0102010000002202010000000a000000002700000000002800000000002900000000002a *00000000002b010301022b000000410000002000000066000000750000006e0000006300000074 *000000690000006f0000006e000000200000007400000068000000610000007400000020000000 *67000000650000006e000000650000007200000061000000740000006500000073000000200000 *00530000007400000072000000690000006e0000006700000054000000650000006d0000007000 *00006c000000610000007400000065000000730000002e0000000a01022e000000200000005400 *000068000000690000007300000020000000690000007300000020000000630000006f0000006e *0000006300000065000000700000007400000075000000610000006c0000006c00000079000000 *200000006100000020000000710000007500000065000000720000007900000020000000660000 *00750000006e0000006300000074000000690000006f0000006e00000020000000690000006e00 *0000740000006f0000002000000061000000200102010000002201020500000067000000720000 *006f0000007500000070010201000000220215000000200000006f000000660000002000000053 *0000007400000072000000690000006e0000006700000054000000650000006d00000070000000 *6c000000610000007400000065000000730000002e0000000a000000005b00000000005c000000 *00005d00000000005e00000000005f00000000006000000000002c00000000002d010302260000 *0052000000650000006e0000006400000065000000720000007300000020000000610000002000 *0000530000007400000072000000690000006e0000006700000054000000650000006d00000070 *0000006c00000061000000740000006500000020000000740000006f0000002000000061000000 *20000000530000007400000072000000690000006e000000670000002e0000000a000000002e01 *0301021e00000052000000650000006e0000006400000065000000720000007300000020000000 *6100000020000000530000007400000072000000690000006e0000006700000054000000650000 *006d000000700000006c00000061000000740000006500000020000000740000006f0000002000 *0000610000002001021d000000540000006500000078000000740000002e000000500000007200 *0000650000007400000074000000790000005000000072000000690000006e000000740000002e *000000480000007500000067000000680000006500000073000000500000004a0000002e000000 *440000006f0000006302020000002e0000000a000000002f0103023a0000004700000065000000 *6e000000650000007200000069000000630000002000000072000000650000006e000000640000 *0065000000720000002000000066000000750000006e0000006300000074000000690000006f00 *00006e00000020000000660000006f000000720000002000000061000000200000005300000074 *00000072000000690000006e0000006700000054000000650000006d000000700000006c000000 *610000007400000065000000200000006f0000006600000020000000610000006e000000790000 *0020000000740000007900000070000000650000002e0000000a0000000030010301025d000000 *52000000650000007400000075000000720000006e000000730000002000000061000000200000 *007400000075000000700000006c00000065000000200000006f00000066000000200000007400 *000068000000720000006500000065000000200000004d00000061000000790000006200000065 *000000730000002e00000020000000540000006800000065000000200000006600000069000000 *720000007300000074000000200000006900000073000000200000007300000065000000740000 *002000000069000000660000002000000074000000680000006500000072000000650000002000 *000069000000730000002000000061000000200000007000000061000000720000007300000065 *000000200000006500000072000000720000006f0000007200000020000000690000006e000000 *200000007400000068000000650000002000000074000000650000006d000000700000006c0000 *006100000074000000650000002e0000000a010267000000200000005400000068000000650000 *00200000006e000000650000007800000074000000200000006900000073000000200000007300 *0000650000007400000020000000740000006f0000002000000061000000200000006c00000069 *0000007300000074000000200000006f0000006600000020000000610000007400000074000000 *720000006900000062000000750000007400000065000000730000002000000074000000680000 *0061000000740000002000000068000000610000007600000065000000200000006e0000006f00 *000074000000200000006200000065000000650000006e00000020000000730000006500000074 *0000002c000000200000006f00000072000000200000004e0000006f0000007400000068000000 *690000006e0000006700000020000000690000006600000020000000610000006c0000006c0000 *002000000061000000740000007400000072000000690000006200000075000000740000006500 *00007300000020000000610000007200000065000000200000007300000065000000740000002e *0000000a01027c00000020000000540000006800000065000000200000006c0000006100000073 *000000740000002000000069000000730000002000000073000000650000007400000020000000 *740000006f0000002000000061000000200000006c000000690000007300000074000000200000 *006f0000006600000020000000690000006e000000760000006f0000006b000000650000006400 *00002000000074000000650000006d000000700000006c00000061000000740000006500000073 *00000020000000740000006800000061000000740000002000000063000000610000006e000000 *6e0000006f00000074000000200000006200000065000000200000006c0000006f0000006f0000 *006b00000065000000640000002000000075000000700000002c000000200000006f0000007200 *0000200000004e0000006f0000007400000068000000690000006e000000670000002000000069 *0000006600000020000000610000006c0000006c00000020000000690000006e00000076000000 *6f0000006b00000065000000640000002000000074000000650000006d000000700000006c0000 *00610000007400000065000000730000002000000063000000610000006e000000200000006200 *00006500000020000000660000006f000000750000006e000000640000002e0000000a02920000 *00200000004e0000006f0000007400000065000000200000007400000068000000610000007400 *000020000000740000006800000069000000730000002000000063000000680000006500000063 *0000006b000000200000006900000073000000200000007300000068000000610000006c000000 *6c0000006f00000077000000200000002d0000002d00000020000000690000002e000000650000 *002e000000200000006d000000690000007300000073000000690000006e000000670000002000 *000061000000740000007400000072000000690000006200000075000000740000006500000073 *00000020000000610000006e000000640000002000000074000000650000006d00000070000000 *6c0000006100000074000000650000007300000020000000610000007200000065000000200000 *006f0000006e0000006c0000007900000020000000630000006100000075000000670000006800 *00007400000020000000690000006e000000200000007400000068000000650000002000000074 *0000006f00000070000000200000006c0000006500000076000000650000006c00000020000000 *74000000650000006d000000700000006c0000006100000074000000650000002c000000200000 *006e0000006f0000007400000020000000610000006e0000007900000020000000690000006e00 *0000760000006f0000006b00000065000000640000002000000073000000750000006200000074 *000000650000006d000000700000006c0000006100000074000000650000002e0000000a000000 *003101030102320000005000000061000000720000007300000065000000730000002000000061 *00000020000000530000007400000072000000690000006e000000670000002000000074000000 *6f0000002000000070000000720000006f00000064000000750000006300000065000000200000 *006100000020000000530000007400000072000000690000006e00000067000000540000006500 *00006d000000700000006c0000006100000074000000650000002c000000200000007700000069 *000000740000006800000020010201000000270102010000002401020100000027010211000000 *730000002000000061000000730000002000000064000000650000006c000000690000006d0000 *0069000000740000006500000072000000730000002e0000000a024a0000002000000049000000 *7400000020000000690000007300000020000000630000006f0000006e00000073000000740000 *007200000075000000630000007400000065000000640000002000000077000000690000007400 *000068000000200000006100000020000000730000007400000075000000620000002000000067 *000000720000006f00000075000000700000002000000074000000680000006100000074000000 *2000000063000000610000006e0000006e0000006f00000074000000200000006c0000006f0000 *006f0000006b000000200000007500000070000000200000006f00000074000000680000006500 *0000720000002000000074000000650000006d000000700000006c000000610000007400000065 *000000730000002e0000000a0000000032010301024a0000005000000061000000720000007300 *00006500000073000000200000006100000020000000530000007400000072000000690000006e *0000006700000020000000740000006f0000002000000070000000720000006f00000064000000 *750000006300000065000000200000006100000020000000530000007400000072000000690000 *006e0000006700000054000000650000006d000000700000006c00000061000000740000006500 *00002c0000002000000064000000650000006c000000690000006d000000690000007400000065 *0000006400000020000000620000007900000020000000610000006e000000670000006c000000 *6500000020000000620000007200000061000000630000006b0000006500000074000000730000 *002e0000000a024a00000020000000490000007400000020000000690000007300000020000000 *630000006f0000006e000000730000007400000072000000750000006300000074000000650000 *006400000020000000770000006900000074000000680000002000000061000000200000007300 *00007400000075000000620000002000000067000000720000006f000000750000007000000020 *000000740000006800000061000000740000002000000063000000610000006e0000006e000000 *6f00000074000000200000006c0000006f0000006f0000006b0000002000000075000000700000 *00200000006f000000740000006800000065000000720000002000000074000000650000006d00 *0000700000006c000000610000007400000065000000730000002e0000000a0000000033010301 *023c0000005900000069000000650000006c000000640000007300000020000000610000002000 *0000530000007400000072000000690000006e0000006700000054000000650000006d00000070 *0000006c0000006100000074000000650000002000000077000000690000007400000068000000 *2000000074000000680000006500000020000000610000007000000070000000720000006f0000 *007000000072000000690000006100000074000000650000002000000061000000740000007400 *000072000000690000006200000075000000740000006500000020000000730000006500000074 *0000002e0000000a023c0000002000000049000000660000002000000074000000680000006500 *000020000000610000007400000074000000720000006900000062000000750000007400000065 *00000020000000610000006c000000720000006500000061000000640000007900000020000000 *6500000078000000690000007300000074000000730000002c0000002000000069000000740000 *0020000000690000007300000020000000610000007000000070000000650000006e0000006400 *0000650000006400000020000000740000006f0000002000000061000000200000006c00000069 *00000073000000740000002e0000000a0000000034010301023d00000059000000690000006500 *00006c000000640000007300000020000000610000002000000053000000740000007200000069 *0000006e0000006700000054000000650000006d000000700000006c0000006100000074000000 *650000002000000077000000690000007400000068000000200000007400000068000000650000 *0020000000610000007000000070000000720000006f0000007000000072000000690000006100 *000074000000650000002000000061000000740000007400000072000000690000006200000075 *000000740000006500000073000000200000007300000065000000740000002e0000000a023c00 *000020000000490000006600000020000000610000006e00000079000000200000006100000074 *000000740000007200000069000000620000007500000074000000650000002000000061000000 *6c0000007200000065000000610000006400000079000000200000006500000078000000690000 *007300000074000000730000002c00000020000000690000007400000020000000690000007300 *000020000000610000007000000070000000650000006e00000064000000650000006400000020 *000000740000006f0000002000000061000000200000006c000000690000007300000074000000 *2e0000000a0000000035010301023c0000005900000069000000650000006c0000006400000073 *000000200000006100000020000000530000007400000072000000690000006e00000067000000 *54000000650000006d000000700000006c00000061000000740000006500000020000000770000 *006900000074000000680000002000000074000000680000006500000020000000610000007000 *000070000000720000006f00000070000000720000006900000061000000740000006500000020 *000000610000007400000074000000720000006900000062000000750000007400000065000000 *200000007300000065000000740000002e0000000a01023c000000200000004900000066000000 *200000007400000068000000650000002000000061000000740000007400000072000000690000 *006200000075000000740000006500000020000000610000006c00000072000000650000006100 *00006400000079000000200000006500000078000000690000007300000074000000730000002c *000000200000006900000074000000200000006900000073000000200000006100000070000000 *70000000650000006e00000064000000650000006400000020000000740000006f000000200000 *0061000000200000006c0000006900000073000000740000002e0000000a010240000000200000 *00540000006800000069000000730000002000000077000000690000006c0000006c0000002000 *00006e0000006f00000074000000200000007400000072000000610000006e000000730000006c *000000610000007400000065000000200000007400000068000000650000002000000061000000 *740000007400000072000000690000006200000075000000740000006500000020000000740000 *0068000000720000006f00000075000000670000006800000020000000610000006e0000007900 *000020000000690000006e0000007400000065000000720000006d000000650000006400000069 *0000006100000074000000650000000a0102390000002000000072000000650000007000000072 *0000006500000073000000650000006e000000740000006100000074000000690000006f000000 *6e0000002c00000020000000730000006f000000200000006900000073000000200000006d0000 *006f00000072000000650000002000000065000000660000006600000069000000630000006900 *0000650000006e00000074000000200000007700000068000000650000006e0000002c00000020 *000000650000002e000000670000002e0000002000000073000000650000007400000074000000 *690000006e000000670000000a0241000000200000006100000074000000740000007200000069 *000000620000007500000074000000650000007300000020000000740000006800000061000000 *7400000020000000610000007200000065000000200000006c0000006100000072000000670000 *006500000020000000620000007900000074000000650000007300000074000000720000006900 *00006e000000670000007300000020000000690000006e00000020000000610000002000000062 *000000790000007400000065000000730000007400000072000000690000006e00000067000000 *2000000074000000650000006d000000700000006c0000006100000074000000650000002e0000 *000a0000000036010301023d0000005900000069000000650000006c0000006400000073000000 *200000006100000020000000530000007400000072000000690000006e00000067000000540000 *00650000006d000000700000006c00000061000000740000006500000020000000770000006900 *000074000000680000002000000074000000680000006500000020000000610000007000000070 *000000720000006f00000070000000720000006900000061000000740000006500000020000000 *610000007400000074000000720000006900000062000000750000007400000065000000730000 *00200000007300000065000000740000002e0000000a01023c0000002000000049000000660000 *0020000000610000006e0000007900000020000000610000007400000074000000720000006900 *00006200000075000000740000006500000020000000610000006c000000720000006500000061 *000000640000007900000020000000650000007800000069000000730000007400000073000000 *2c0000002000000069000000740000002000000069000000730000002000000061000000700000 *0070000000650000006e00000064000000650000006400000020000000740000006f0000002000 *000061000000200000006c0000006900000073000000740000002e0000000a0102320000002000 *000041000000740000007400000072000000690000006200000075000000740000006500000073 *000000200000006100000072000000650000002000000061000000640000006400000065000000 *64000000200000006e00000061000000740000006900000076000000650000006c000000790000 *002c000000200000007700000068000000690000006300000068000000200000006d0000006100 *0000790000002000000070000000720000006f000000760000006900000064000000650000000a *021300000020000000650000006600000066000000690000006300000069000000650000006e00 *00006300000079000000200000006700000061000000690000006e000000730000002e0000000a *000000003701030102370000005200000065000000700000006c00000061000000630000006500 *000073000000200000007400000068000000650000002000000061000000740000007400000072 *000000690000006200000075000000740000006500000073000000200000006f00000066000000 *200000006100000020000000530000007400000072000000690000006e00000067000000540000 *00650000006d000000700000006c00000061000000740000006500000020000000770000006900 *000074000000680000002000000074000000680000006f00000073000000650000000a01024200 *000020000000640000006500000073000000630000007200000069000000620000006500000064 *00000020000000690000006e000000200000007400000068000000650000002000000073000000 *65000000630000006f0000006e0000006400000020000000610000007200000067000000750000 *006d000000650000006e000000740000002e000000200000004900000066000000200000007400 *0000680000006500000020000000610000007200000067000000750000006d000000650000006e *0000007400000020000000640000006f0000006500000073000000200000006e0000006f000000 *74000000200000007900000069000000650000006c000000640000000a01024100000020000000 *6100000020000000730000006500000074000000200000006f00000066000000200000006e0000 *00610000006d000000650000006400000020000000610000007400000074000000720000006900 *000062000000750000007400000065000000730000002000000062000000750000007400000020 *0000006f0000006e0000006c000000790000002000000061000000200000007300000069000000 *6e000000670000006c00000065000000200000006f0000006e000000650000002c000000200000 *007400000068000000610000007400000020000000610000007400000074000000720000006900 *0000620000007500000074000000650000000a0102190000002000000069000000730000002000 *00006e000000610000006d00000065000000640000002c00000020000000610000007300000020 *000000610000002000000064000000650000006600000061000000750000006c00000074000000 *2c000000200102010000002201020200000069000000740102010000002202020000002e000000 *0a0000000038010301024200000051000000750000006500000072000000690000006500000073 *00000020000000610000006e00000020000000530000007400000072000000690000006e000000 *670000002000000054000000650000006d000000700000006c0000006100000074000000650000 *002000000047000000720000006f000000750000007000000020000000610000006e0000006400 *00002000000072000000650000007400000075000000720000006e00000073000000200000004a *000000750000007300000074000000200000007400000068000000650000002000000061000000 *7000000070000000720000006f0000007000000072000000690000006100000074000000650000 *000a023200000020000000530000007400000072000000690000006e0000006700000054000000 *650000006d000000700000006c0000006100000074000000650000002000000069000000660000 *002000000069000000740000002000000065000000780000006900000073000000740000007300 *00002c000000200000006f00000074000000680000006500000072000000770000006900000073 *000000650000002c000000200000004e0000006f0000007400000068000000690000006e000000 *670000002e0000000a000000003901030102080000004100000073000000200000007700000069 *0000007400000068000000200104010000003801022b0000002000000062000000750000007400 *0000200000006e0000006500000076000000650000007200000020000000690000006e0000006c *000000690000006e00000065000000640000002c00000020000000730000006f00000020000000 *610000007000000070000000720000006f00000070000000720000006900000061000000740000 *006500000020000000660000006f00000072000000200000007500000073000000650000000a02 *20000000200000007700000069000000740000006800000020000000760000006f0000006c0000 *006100000074000000690000006c000000650000002000000074000000650000006d0000007000 *00006c0000006100000074000000650000002000000067000000720000006f0000007500000070 *000000730000002e0000000a000000003a01030232000000410000006400000064000000730000 *00200000006100000020000000730000006500000074000000200000006f000000660000002000 *0000670000006c0000006f00000062000000610000006c000000200000006f0000007000000074 *000000690000006f0000006e0000007300000020000000740000006f0000002000000061000000 *2000000073000000690000006e000000670000006c000000650000002000000074000000650000 *006d000000700000006c0000006100000074000000650000000a000000003b010301023c000000 *5300000065000000740000007300000020000000610000006e00000020000000650000006e0000 *00630000006f00000064000000690000006e000000670000002000000066000000750000006e00 *00006300000074000000690000006f0000006e000000200000006f000000660000002000000061 *0000002000000074000000650000006d000000700000006c000000610000007400000065000000 *200000007400000068000000610000007400000020000000610000006c0000006c000000200000 *0076000000610000006c0000007500000065000000730000002000000061000000720000006500 *00000a0102380000002000000072000000650000006e0000006400000065000000720000006500 *00006400000020000000770000006900000074000000680000002e00000020000000460000006f *00000072000000200000006500000078000000610000006d000000700000006c00000065000000 *200000006f0000006e000000650000002000000075000000730000006500000066000000750000 *006c00000020000000650000006e000000630000006f0000006400000065000000720000002000 *0000770000006f000000750000006c000000640000002000000062000000650000002001021c00 *0000540000006500000078000000740000002e00000048000000740000006d0000006c0000002e *000000730000007400000072000000690000006e00000067000000540000006f00000048000000 *740000006d0000006c000000530000007400000072000000690000006e0000006702350000002e *00000020000000410000006c0000006c0000002000000061000000740000007400000072000000 *6900000062000000750000007400000065000000730000002000000077000000690000006c0000 *006c00000020000000620000006500000020000000650000006e000000630000006f0000006400 *00006500000064000000200000006f0000006e000000630000006500000020000000610000006e *00000064000000200000006f0000006e0000006c00000079000000200000006f0000006e000000 *63000000650000002e0000000a000000003c010301025100000041000000200000007300000070 *000000650000006300000069000000610000006c0000002000000074000000650000006d000000 *700000006c00000061000000740000006500000020000000740000006800000061000000740000 *002000000073000000690000006d000000700000006c0000007900000020000000640000007500 *00006d000000700000007300000020000000740000006800000065000000200000007600000061 *0000006c000000750000006500000073000000200000006f000000660000002000000061000000 *6c0000006c00000020000000740000006800000065000000200000006100000074000000740000 *007200000069000000620000007500000074000000650000007300000020000000730000006500 *00007400000020000000690000006e0000002000000069000000740000002e0000000a01025500 *00002000000054000000680000006900000073000000200000006d000000610000007900000020 *0000006200000065000000200000006d0000006100000064000000650000002000000061000000 *7600000061000000690000006c00000061000000620000006c0000006500000020000000740000 *006f00000020000000610000006e000000790000002000000074000000650000006d0000007000 *00006c000000610000007400000065000000200000006100000073000000200000006100000020 *00000066000000750000006e0000006300000074000000690000006f0000006e00000020000000 *620000007900000020000000610000006400000064000000690000006e00000067000000200000 *00690000007400000020000000740000006f000000200000006900000074000000730000002000 *000067000000720000006f00000075000000700000002e0000000a010206000000200000004900 *00002e000000650000002e00000020010701023d000000200000006d000000790000004e000000 *650000007700000047000000720000006f0000007500000070000000200000003d000000200000 *006100000064000000640000005300000075000000700000006500000072000000470000007200 *00006f0000007500000070000000200000006d0000007900000047000000720000006f00000075 *0000007000000020000000240000002000000067000000720000006f0000007500000070000000 *530000007400000072000000690000006e0000006700000054000000650000006d000000700000 *006c00000061000000740000006500000073000000200000005b0000002801050b000000640000 *00750000006d000000700000004100000074000000740000007200000069000000620000007301 *020e0000002c0000002000000064000000750000006d0000007000000041000000740000007400 *000072000000690000006200000073000000290102010000005d02010000002002010000000a00 *0000003d0000000000610000000000620000000000630000000000640000000000650000000000 *6600000000006700000000006800000000006900000000003e00000000006a00000000006b0000 *0000006c00000000006d00000000006e00000000003f0103010229000000470000006500000074 *0000007300000020000000610000006c0000006c00000020000000710000007500000061000000 *730000006900000071000000750000006f000000740000006500000064000000200000006e0000 *00610000006d00000065000000730000002c000000200000006e0000006f000000720000006d00 *0000610000006c000000200000006e000000610000006d00000065000000730000002001020100 *0000260102250000002000000074000000650000006d000000700000006c000000610000007400 *00006500000073000000200000007500000073000000650000006400000020000000690000006e *000000200000006100000020000000670000006900000076000000650000006e00000020000000 *74000000650000006d000000700000006c0000006100000074000000650000002e0000000a0244 *000000200000004d00000075000000730000007400000020000000620000006500000020000000 *700000006100000073000000730000006500000064000000200000006100000020000000700000 *00610000006900000072000000200000006f000000660000002000000063000000680000006100 *000072000000730000002000000064000000650000006e0000006f00000074000000690000006e *00000067000000200000007400000068000000650000002000000064000000650000006c000000 *690000006d000000650000007400000065000000720000007300000020000000740000006f0000 *0020000000620000006500000020000000750000007300000065000000640000002e0000000a00 *0000006f0000000000700103023a00000047000000650000006e00000065000000720000006900 *0000630000002000000072000000650000006e0000006400000065000000720000002000000066 *000000750000006e0000006300000074000000690000006f0000006e0000002000000066000000 *6f00000072000000200000006100000020000000530000007400000072000000690000006e0000 *006700000054000000650000006d000000700000006c0000006100000074000000650000002000 *00006f0000006600000020000000610000006e0000007900000020000000740000007900000070 *000000650000002e0000000a0000000040010302dd000000520000006500000074000000750000 *00720000006e000000730000002000000061000000200000007400000075000000700000006c00 *000065000000200000006f00000066000000200000007400000068000000720000006500000065 *000000200000006c000000690000007300000074000000730000002e0000002000000054000000 *680000006500000020000000660000006900000072000000730000007400000020000000690000 *0073000000200000006f000000660000002000000074000000650000006d000000700000006c00 *000061000000740000006500000073000000200000007700000069000000740000006800000020 *000000700000006100000072000000730000006500000020000000650000007200000072000000 *6f00000072000000730000002c00000020000000610000006e0000006400000020000000740000 *0068000000650000006900000072000000200000006500000072000000720000006f0000007300 *00002e00000020000000540000006800000065000000200000006e000000650000007800000074 *000000200000006900000073000000200000006f00000066000000200000006d00000069000000 *7300000073000000690000006e0000006700000020000000610000007400000074000000720000 *006900000062000000750000007400000065000000730000002c00000020000000610000006e00 *00006400000020000000740000006800000065000000200000006c000000610000007300000074 *000000200000006900000073000000200000006f00000066000000200000006d00000069000000 *7300000073000000690000006e000000670000002000000074000000650000006d000000700000 *006c000000610000007400000065000000730000002e0000002000000049000000660000002000 *000074000000680000006500000072000000650000002000000061000000720000006500000020 *0000006e0000006f000000200000006500000072000000720000006f0000007200000073000000 *2c000000200000007400000068000000650000006e00000020000000610000006c0000006c0000 *00200000006c000000690000007300000074000000730000002000000077000000690000006c00 *00006c00000020000000620000006500000020000000650000006d000000700000007400000079 *0000002e0000000a00000000710000000000720000000000730000000000740000000000750000 *0000007600000000007700000000007800000000007900000000007a00000000007b0000000000 *7c00000000007d00000000007e00000000007f010301023d000000690000006600000020000000 *7000000020000000690000007300000020000000740000007200000075000000650000002c0000 *002000000073000000740000006d000000700000006c0000002000000063000000610000006e00 *0000200000006600000061000000690000006c0000002000000067000000720000006100000063 *0000006500000066000000750000006c0000006c000000790000002c0000002000000066000000 *610000006c00000073000000650000002000000069000000740000002000000064000000690000 *00650000007300000020000000680000006100000072000000640000002e0000000a0240000000 *2000000053000000650000007400000020000000740000006f0000002000000066000000610000 *006c00000073000000650000002000000061000000740000002000000074000000680000006500 *000020000000740000006f00000070000000200000006c0000006500000076000000650000006c *0000002c00000020000000610000006e0000006400000020000000740000007200000075000000 *650000002000000077000000690000007400000068000000690000006e00000020000000690000 *006600000020000000650000007800000070000000720000006500000073000000730000006900 *00006f0000006e000000730000002e0000000a0000000080000000000081000000000082000000 *000083000000000084000000000085000000000086000000000087000000000088000000000089 *00000000008a00000000008b00000000008c00000000008d00000000008e00000000008f000000 *000090000000000091000000000092000000000093000000000094000000000095000000000096 *00000000009700000000009800000000009900000000009a000032000000000000000100000002 *000000030000000400000005000000060000000700000008000000090000000c0000000d000000 *0e0000000f00000010000000110000001f00000020000000210000002200000023000000240000 *0025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e00 *00002f000000300000003100000032000000330000003400000035000000360000003700000038 *000000390000003a0000003b0000003c0000003d0000003e0000003f0000004032000000260000 *002700000028000000290000002a0000000c0000000d0000000e0000000f000000100000001100 *00002b000000000000000100000002000000030000000400000005000000060000000700000008 *000000090000001f0000003d0000002d0000002e0000002f000000310000003200000038000000 *3900000033000000340000003500000036000000370000003a0000003b0000002c000000200000 *0021000000220000002300000024000000250000003e0000003c00000030000000400000003f01 *032100000020050000002100000022000000230000002400000025000000210000000022000000 *0023000000002400000000250000000026040000002700000028000000290000002a0000002700 *000000280000000029000000002a000000002b000000002c000000002d000000002e000000002f *000000003000000000310000000032000000003300000000340000000035000000003600000000 *3700000000380000000039000000003a000000003b000000003c000000003d000000003e000000 *003f0000000040000000000000000004000108000000700000006f000000720000007400000061 *000000620000006c00000065010c00000065000000780000007000000065000000720000006900 *00006d000000650000006e00000074000000610000006c0112000000730000002e000000630000 *006c0000006f00000076000000650000007200000040000000670000006d000000610000006900 *00006c0000002e000000630000006f0000006d030000004100000000009b00000000009c000001 *00000041010000004100010000004100000000000000000600000000100000009d00000000009e *00000000009f0000000000a0000000000042010301024a00000047000000690000007600000065 *0000006e0000002000000061000000200000006c00000069000000730000007400000020000000 *6f00000066000000200000006e000000610000006d0000006500000064000000200000006f0000 *006600000020000000530000007400000072000000690000006e00000067000000540000006500 *00006d000000700000006c000000610000007400000065000000730000002c0000002000000072 *000000650000007400000075000000720000006e00000073000000200000006100000020000000 *67000000720000006f000000750000007000000020000000770000006800000069000000630000 *00680000002000000067000000650000006e000000650000007200000061000000740000006500 *0000730000000a022b000000200000007400000068000000650000006d00000020000000730000 *007500000063000000680000002000000074000000680000006100000074000000200000007400 *00006800000065000000790000002000000063000000610000006e000000200000006300000061 *0000006c0000006c000000200000006f0000006e0000006500000020000000610000006e000000 *6f000000740000006800000065000000720000002e0000000a0000000043010301024a00000047 *0000006900000076000000650000006e0000002000000061000000200000007000000061000000 *74000000680000002c0000002000000072000000650000007400000075000000720000006e0000 *007300000020000000610000002000000067000000720000006f00000075000000700000002000 *000077000000680000006900000063000000680000002000000067000000650000006e00000065 *000000720000006100000074000000650000007300000020000000610000006c0000006c000000 *2000000066000000690000006c000000650000007300000020000000690000006e000000200000 *007300000061000000690000006400000020000000640000006900000072000000650000006300 *0000740000006f00000072000000790000000a0102170000002000000077000000680000006900 *000063000000680000002000000068000000610000007600000065000000200000007400000068 *000000650000002000000070000000720000006f00000070000000650000007200000020010201 *0000002201020200000073000000740102010000002201020c0000002000000065000000780000 *0074000000650000006e00000073000000690000006f0000006e0000002e0000000a01024c0000 *0020000000540000006800000069000000730000002000000066000000750000006e0000006300 *000074000000690000006f0000006e000000200000006900000073000000200000007300000074 *000000720000006900000063000000740000002c00000020000000770000006900000074000000 *6800000020000000610000006c0000006c0000002000000066000000690000006c000000650000 *00730000002000000072000000650000006100000064000000200000006f0000006e0000006300 *0000650000002e0000002000000041000000730000002000000069000000740000002000000070 *0000006500000072000000660000006f000000720000006d000000730000002000000066000000 *690000006c0000006500000020000000490000004f0000002c0000000a022a0000002000000065 *000000780000007000000065000000630000007400000020000000690000007400000020000000 *740000006f000000200000007400000068000000720000006f0000007700000020000000740000 *00680000006500000020000000750000007300000075000000610000006c000000200000006500 *00007800000063000000650000007000000074000000690000006f0000006e000000730000002e *0000000a0000000044010301024a000000470000006900000076000000650000006e0000002000 *00006100000020000000700000006100000074000000680000002c000000200000007200000065 *0000007400000075000000720000006e0000007300000020000000610000002000000067000000 *720000006f00000075000000700000002000000077000000680000006900000063000000680000 *002000000067000000650000006e00000065000000720000006100000074000000650000007300 *000020000000610000006c0000006c0000002000000066000000690000006c0000006500000073 *00000020000000690000006e000000200000007300000061000000690000006400000020000000 *6400000069000000720000006500000063000000740000006f00000072000000790000000a0102 *170000002000000077000000680000006900000063000000680000002000000068000000610000 *007600000065000000200000007400000068000000650000002000000070000000720000006f00 *000070000000650000007200000020010201000000220102020000007300000074010201000000 *2201020c00000020000000650000007800000074000000650000006e0000007300000069000000 *6f0000006e0000002e0000000a0102470000002000000054000000680000006900000073000000 *2000000066000000750000006e0000006300000074000000690000006f0000006e000000200000 *006900000073000000200000006c000000610000007a0000007900000020000000690000006e00 *0000200000007400000068000000650000002000000073000000610000006d0000006500000020 *000000770000006100000079000000200000007400000068000000610000007400000020000000 *7200000065000000610000006400000046000000690000006c0000006500000020000000690000 *0073000000200000006c000000610000007a000000790000002c00000020000000770000006900 *0000740000006800000020000000610000006c0000006c0000000a01024a000000200000006600 *0000690000006c0000006500000073000000200000007200000065000000610000006400000020 *0000006f0000006e0000002000000064000000650000006d000000610000006e00000064000000 *2c00000020000000620000007500000074000000200000006e0000006f000000200000006d0000 *006f0000007200000065000000200000007400000068000000610000006e000000200000006f00 *00006e00000063000000650000002e00000020000000540000006800000065000000200000006c *000000690000007300000074000000200000006f00000066000000200000006600000069000000 *6c00000065000000730000002c00000020000000680000006f0000007700000065000000760000 *0065000000720000002c0000000a01024c00000020000000690000007300000020000000670000 *00650000006e000000650000007200000061000000740000006500000064000000200000006100 *000074000000200000007400000068000000650000002000000074000000690000006d00000065 *000000200000007400000068000000650000002000000066000000750000006e00000063000000 *74000000690000006f0000006e0000002000000069000000730000002000000063000000610000 *006c0000006c00000065000000640000002e000000200000004100000073000000200000007400 *000068000000690000007300000020000000700000006500000072000000660000006f00000072 *0000006d000000730000002000000066000000690000006c000000650000002000000049000000 *4f0000002c0000000a010245000000200000006500000078000000700000006500000063000000 *7400000020000000690000007400000020000000740000006f0000002000000074000000680000 *00720000006f000000770000002000000074000000680000006500000020000000750000007300 *000075000000610000006c00000020000000650000007800000063000000650000007000000074 *000000690000006f0000006e000000730000002e00000020000000410000006e00000064000000 *2c0000002000000061000000730000002000000069000000740000002000000069000000730000 *00200000006c000000610000007a000000790000002c0000002000000065000000780000007000 *00006500000063000000740000000a022800000020000000740000006800000065000000730000 *006500000020000000650000007800000063000000650000007000000074000000690000006f00 *00006e0000007300000020000000690000006e00000020000000750000006e0000006500000078 *00000070000000650000006300000074000000650000006400000020000000700000006c000000 *610000006300000065000000730000002e0000000a000000004501030102080000004100000073 *000000200000007700000069000000740000006800000020010401000000430102390000002c00 *000020000000620000007500000074000000200000007400000072000000610000007600000065 *000000720000007300000065000000730000002000000073000000750000006200000064000000 *69000000720000006500000063000000740000006f000000720000006900000065000000730000 *002000000061000000730000002000000077000000650000006c0000006c0000002e0000002000 *0000410000002000000074000000650000006d000000700000006c000000610000007400000065 *000000200000006e000000610000006d00000065000000640000000a0102010000002001020100 *000022010203000000660000006f0000006f010602230000006200000061000000720000002e00 *000073000000740000005c00000022000000200000006d00000061000000790000002000000062 *00000065000000200000007200000065000000660000006500000072000000650000006e000000 *630000006500000064000000200000006200000079000000200000005c00000022000000660000 *006f0000006f010203000000620000006100000072010201000000220218000000200000006900 *00006e000000200000007400000068000000650000002000000072000000650000007400000075 *000000720000006e00000065000000640000002000000067000000720000006f00000075000000 *700000002e0000000a000000004601030102160000005300000065000000650000002000000064 *0000006f00000063000000750000006d000000650000006e000000740000006100000074000000 *690000006f0000006e00000020000000660000006f000000720000002001040100000045020200 *00002e0000000a0000000047010301024700000041000000640000006400000073000000200000 *006100000020000000730000007500000070000000650000007200000067000000720000006f00 *0000750000007000000020000000740000006f00000020000000610000006e0000007900000020 *000000530000007400000072000000690000006e0000006700000054000000650000006d000000 *700000006c0000006100000074000000650000002000000067000000720000006f000000750000 *007000000020000000730000007500000063000000680000002000000074000000680000006100 *0000740000002000000074000000650000006d000000700000006c000000610000007400000065 *000000730000002000000066000000720000006f0000006d0000000a024b000000200000007400 *00006800000065000000200000006f000000720000006900000067000000690000006e00000061 *0000006c0000002000000067000000720000006f00000075000000700000002000000061000000 *7200000065000000200000006e0000006f000000770000002000000061000000620000006c0000 *006500000020000000740000006f0000002000000063000000610000006c0000006c0000002000 *00006f0000006e00000065000000730000002000000066000000720000006f0000006d00000020 *000000740000006800000065000000200000007300000075000000700000006500000072000000 *67000000720000006f000000750000007000000020000000610000007300000020000000770000 *00650000006c0000006c0000002e0000000a000000004801030102070000004100000064000000 *640000007300000020000000610000002001020100000022010208000000730000007500000062 *00000067000000720000006f000000750000007001020100000022010236000000200000007400 *00006f00000020000000610000006e000000790000002000000053000000740000007200000069 *0000006e0000006700000054000000650000006d000000700000006c0000006100000074000000 *650000002000000067000000720000006f00000075000000700000002000000073000000750000 *006300000068000000200000007400000068000000610000007400000020000000740000006500 *00006d000000700000006c00000061000000740000006500000073000000200000006600000072 *0000006f0000006d0000000a01022c00000020000000740000006800000065000000200000006f *000000720000006900000067000000690000006e000000610000006c0000002000000067000000 *720000006f0000007500000070000000200000006e0000006f0000007700000020000000680000 *006100000076000000650000002000000074000000650000006d000000700000006c0000006100 *000074000000650000002000000063000000610000006c0000006c000000730000002001020100 *000022010208000000730000006800000061000000640000006f00000077000000650000006401 *020100000022021200000020000000620000007900000020000000740000006800000065000000 *2000000073000000750000006200000067000000720000006f00000075000000700000002e0000 *000a000000004901030102450000004d0000006500000072000000670000006500000073000000 *2000000074000000770000006f0000002000000067000000720000006f00000075000000700000 *007300000020000000690000006e000000740000006f0000002000000061000000200000007300 *0000690000006e000000670000006c000000650000002000000067000000720000006f00000075 *000000700000002e00000020000000540000006800000069000000730000002000000066000000 *750000006e0000006300000074000000690000006f0000006e0000002000000069000000730000 *00200000006c0000006500000066000000740000002d0000006200000069000000610000007300 *000065000000640000002c0000000a024300000020000000700000007200000065000000660000 *006500000072000000690000006e000000670000002000000062000000690000006e0000006400 *0000690000006e00000067000000730000002000000066000000720000006f0000006d00000020 *000000740000006800000065000000200000006600000069000000720000007300000074000000 *2000000067000000720000006f0000007500000070000000200000007700000068000000650000 *006e00000020000000740000006800000065000000720000006500000020000000690000007300 *0000200000006100000020000000630000006f0000006e000000660000006c0000006900000063 *000000740000002e0000000a000000004a01030228000000410000006400000064000000730000 *00200000006100000020000000730000006500000074000000200000006f000000660000002000 *0000670000006c0000006f00000062000000610000006c000000200000006f0000007000000074 *000000690000006f0000006e0000007300000020000000740000006f0000002000000061000000 *2000000067000000720000006f00000075000000700000000a000000004b010301023900000053 *00000065000000740000007300000020000000610000006e00000020000000650000006e000000 *630000006f00000064000000690000006e000000670000002000000066000000750000006e0000 *006300000074000000690000006f0000006e000000200000006f00000066000000200000006100 *00002000000067000000720000006f000000750000007000000020000000740000006800000061 *0000007400000020000000610000006c0000006c0000002000000076000000610000006c000000 *750000006500000073000000200000006100000072000000650000000a02290000002000000072 *000000650000006e00000064000000650000007200000065000000640000002000000077000000 *69000000740000006800000020000000690000006e000000200000006500000061000000630000 *006800000020000000650000006e000000630000006c0000006f00000073000000650000006400 *00002000000074000000650000006d000000700000006c0000006100000074000000650000000a *000000004c0103010244000000460000006f0000007200000020000000610000006e0000007900 *000020000000720000006500000071000000750000006500000073000000740000006500000064 *0000002000000074000000650000006d000000700000006c000000610000007400000065000000 *2c0000002000000072000000650000007400000075000000720000006e00000073000000200000 *0061000000200000006d0000006500000073000000730000006100000067000000650000002000 *000074000000680000006100000074000000200000007400000068000000650000002000000074 *000000650000006d000000700000006c0000006100000074000000650000002000000077000000 *61000000730000000a01024b00000020000000750000006e00000061000000620000006c000000 *6500000020000000740000006f00000020000000620000006500000020000000660000006f0000 *00750000006e000000640000002e00000020000000550000007300000065000000660000007500 *00006c00000020000000740000006f000000200000006100000064000000640000002000000061 *000000730000002000000061000000200000007300000075000000700000006500000072000000 *2000000067000000720000006f000000750000007000000020000000660000006f000000720000 *00200000006100000020000000730000006500000074000000200000006f000000660000002000 *000074000000650000006d000000700000006c000000610000007400000065000000730000000a *022900000020000000750000006e00000064000000650000007200000020000000640000006500 *000076000000650000006c0000006f000000700000006d000000650000006e000000740000002c *00000020000000740000006f000000200000006100000069000000640000002000000069000000 *6e00000020000000640000006500000062000000750000006700000067000000690000006e0000 *00670000002e0000000a000000004d010301024b00000047000000690000007600000065000000 *6e00000020000000610000006e00000020000000690000006e0000007400000065000000670000 *0072000000610000006c00000020000000610000006d0000006f000000750000006e0000007400 *0000200000006f00000066000000200000007300000065000000630000006f0000006e00000064 *0000007300000020000000610000006e0000006400000020000000610000002000000070000000 *6100000074000000680000002c0000002000000072000000650000007400000075000000720000 *006e0000007300000020000000610000002000000067000000720000006f000000750000007000 *00002000000067000000650000006e00000065000000720000006100000074000000690000006e *000000670000000a01024000000020000000610000006c0000006c000000200000006600000069 *0000006c000000650000007300000020000000690000006e000000200000007300000061000000 *6900000064000000200000006400000069000000720000006500000063000000740000006f0000 *00720000007900000020000000610000006e000000640000002000000073000000750000006200 *00006400000069000000720000006500000063000000740000006f000000720000006900000065 *000000730000002000000077000000690000007400000068000000200000007400000068000000 *650000002000000070000000720000006f00000070000000650000007200000020010201000000 *2201020200000073000000740102010000002201020c0000002000000065000000780000007400 *0000650000006e00000073000000690000006f0000006e0000002c0000000a0102320000002000 *000063000000610000006300000068000000650000006400000020000000660000006f00000072 *000000200000007400000068000000610000007400000020000000610000006d0000006f000000 *750000006e00000074000000200000006f00000066000000200000007300000065000000630000 *006f0000006e00000064000000730000002e00000020000000490000004f000000200000006500 *000072000000720000006f00000072000000730000002000000061000000720000006500000020 *010201000000220102090000007300000077000000610000006c0000006c0000006f0000007700 *000065000000640102010000002201020c00000020000000620000007900000020000000740000 *0068000000690000007300000020000000730000006f0000000a01021400000020000000740000 *006800000061000000740000002000000065000000780000006300000065000000700000007400 *0000690000006f0000006e0000007300000020000000640000006f0000006e0102010000002701 *021e00000074000000200000006100000072000000690000007300000065000000200000006900 *00006e00000020000000750000006e000000650000007800000070000000650000006300000074 *000000650000006400000020000000700000006c00000061000000630000006500000073000000 *2e0000000a01024e00000020000000540000006800000069000000730000002000000076000000 *690000006f0000006c000000610000007400000065000000730000002000000072000000650000 *00660000006500000072000000650000006e0000007400000069000000610000006c0000002000 *00007400000072000000610000006e00000073000000700000006100000072000000650000006e *00000063000000790000002c000000200000006200000075000000740000002000000063000000 *610000006e00000020000000620000006500000020000000760000006500000072000000790000 *002000000075000000730000006500000066000000750000006c00000020000000690000006e00 *000020000000640000006500000076000000650000006c0000006f00000070000000690000006e *000000670000000a01024c0000002000000074000000650000006d000000700000006c00000061 *00000074000000650000007300000020000000660000006f000000720000002000000061000000 *6e0000007900000020000000730000006f0000007200000074000000200000006f000000660000 *002000000073000000650000007200000076000000650000007200000020000000610000007000 *0000700000006c00000069000000630000006100000074000000690000006f0000006e0000002e *0000002000000049000000740000002000000073000000680000006f000000750000006c000000 *640000002000000062000000650000002000000073000000770000006100000070000000700000 *006500000064000000200000006f000000750000007400000020000000660000006f0000007200 *00000a01024e0000002000000070000000720000006f0000006400000075000000630000007400 *0000690000006f0000006e00000020000000700000007500000072000000700000006f00000073 *00000065000000730000002e000000200000005400000068000000650000002000000064000000 *750000006d00000070000000410000007400000074000000720000006900000062000000730000 *002000000074000000650000006d000000700000006c0000006100000074000000650000002000 *000069000000730000002000000061000000640000006400000065000000640000002000000074 *0000006f0000002000000074000000680000006500000020000000720000006500000074000000 *75000000720000006e00000065000000640000002000000067000000720000006f000000750000 *00700000000a024f00000020000000620000007900000020000000640000006500000066000000 *61000000750000006c000000740000002c00000020000000610000007300000020000000690000 *00740000002000000073000000680000006f000000750000006c00000064000000200000007000 *0000720000006f0000007600000065000000200000007500000073000000650000006600000075 *0000006c00000020000000660000006f0000007200000020000000640000006500000062000000 *750000006700000067000000690000006e0000006700000020000000610000006e000000640000 *0020000000640000006500000076000000650000006c0000006f00000070000000690000006e00 *0000670000002000000074000000650000006d000000700000006c000000610000007400000065 *000000730000002e0000000a000c00000042000000430000004400000045000000460000004700 *000048000000490000004a0000004b0000004c0000004d000200030c0000004200000000430000 *00004400000000450000000046000000004700000000480000000049000000004a000000004b00 *0000004c000000004d00000000000000000700000000030000004e00000000004f000000000050 *0000030000004e0000004f00000050000100030000004e010000004f0000004f00000000500000 *000000000000080000000002000000a10000000000a20000000000000000000000000009000000 *0007000000a30000000000a40000000000a50000000000a60000000000a70000000000a8000000 *0000a90000000000000000000000000001000108000000700000006f0000007200000074000000 *61000000620000006c00000065010c000000650000007800000070000000650000007200000069 *0000006d000000650000006e00000074000000610000006c0112000000730000002e0000006300 *00006c0000006f00000076000000650000007200000040000000670000006d0000006100000069 *0000006c0000002e000000630000006f0000006d00330000000000000001000000020000000300 *00000400000005000000060000000700000008000000090000000c0000000d0000000e0000000f *00000010000000110000001f000000260000002b0000002d0000002e0000002f00000030000000 *3100000032000000330000003400000035000000360000003700000038000000390000003a0000 *003b0000003c000000400000004200000043000000440000004500000046000000470000004800 *0000490000004a0000004b0000004c0000004d0000004e0000004f000000503300000026000000 *2b0000000f00000010000000110000000c0000000d0000000e0000001f00000000000000010000 *0002000000030000000400000005000000060000000700000008000000090000004e0000004f00 *0000310000003200000038000000390000002d0000002e0000002f0000003c0000003000000040 *0000003300000050000000340000003500000036000000370000003a0000004a0000003b000000 *4b00000042000000470000004800000049000000430000004d0000004500000046000000440000 *004c000000000000000000aa0000000000000002030000000a0000000000000002000000000b00 *00000000000002000000000c0000000000000002000000000d0000000000000002000000000e00 *00000000000002000000000f000000000000000200000000100000000000000002000000001100 *000000000000020000000012000000000000000200000000130000000000000002030000001400 *000000000000020100000014000000000000000203000000150000000000000002000000001600 *000000000000020000000017000000000000000203000000180000000000000002000000001900 *00000000000002000000001a0000000000000002030000001b0000000000000002010000001c00 *00000000000002010000001d0000000000000002010000001e0000000000000002010000001f00 *000000000000020100000020000000000000000201000000210000000000000002010000002200 *000000000000020100000023000000000000000203000000240000000000000002030000002500 *000000000000020100000025000000000000000200000000260000000000000002000000002700 *000000000000030300000028000000000000000301000000280000000000000003000000002900 *00000000000003000000002a0000000000000003000000002b0000000000000003000000002c00 *00000000000003030000002d0000000000000003010000002e0000000000000003000000002f00 *000000000000030000000030000000000000000300000000310000000000000003030000003200 *000000000000030000000033000000000000000300000000340000000000000003000000003500 *000000000000030000000036000000000000000300000000370000000000000003000000003800 *0000000000000300000000390000000000000003000000003a0000000000000003000000003b00 *00000000000003000000003c0000000000000003000000003d0000000000000003000000003e00 *00000000000003000000003f000000000000000300000000400000000000000003000000004100 *000000000000030000000042000000000000000300000000430000000000000003000000004400 *000000000000030000000045000000000000000300000000460000000000000003000000004700 *000000000000040000000048000000000000000600000000490000000000000006000000004a00 *00000000000006000000004b0000000000000006000000004c0000000000000006000000004d00 *00000000000006000000004e0000000000000006000000004f0000000000000006000000005000 *000000000000060000000051000000000000000600000000520000000000000006000000005300 *000000000000060000000054000000000000000703000000550000000000000007000000005600 *0000000000000700000000570000005800000059000000005a0000000000000005000000005b00 *00000000000003030000005c0000000000000003010000005d0000000000000003010000005e00 *00000000000003010000005f000000580000006003000000610000005800000062010000006300 *000058000000620300000063000000580000005903000000640000000000000003030000006500 *000000000000030000000066000000000000000300000000670000000000000003000000006800 *0000000000000300000000690000000000000003000000006a0000000000000003000000006b00 *00000000000003000000006c0000000000000003000000006d0000000000000003000000006e00 *00000000000003000000006f000000000000000300000000700000000000000003000000007100 *000000000000030000000072000000000000000300000000730000000000000003000000007400 *000000000000030000000075000000000000000300000000760000000000000003000000007700 *000000000000030000000078000000000000000300000000790000000000000003000000007a00 *00000000000003000000007b0000000000000003000000007c0000000000000003000000007d00 *00000000000003000000007e0000000000000003000000007f0000000000000003000000008000 *000000000000030000000081000000000000000300000000820000000000000003000000008300 *000000000000030000000084000000000000000300000000850000000000000003000000008600 *000000000000030000000087000000000000000300000000880000000000000003000000008900 *00000000000003000000008a0000000000000003000000008b0000000000000003000000008c00 *00000000000003000000008d0000000000000003000000008e0000000000000003000000008f00 *000000000000030000000090000000000000000300000000910000000000000003000000009200 *000000000000030000000093000000000000000300000000940000000000000003000000009500 *000000000000030000000096000000000000000300000000970000000000000003000000009800 *0000000000000300000000990000000000000003000000009a0000000000000003000000009b00 *00000000000003000000009c0000000000000003000000009d0000000000000003000000009e00 *00000000000003000000009f000000000000000300000000a0000000000000000300000000a100 *0000000000000300000000a2000000000000000300000000a3000000000000000300000000a400 *0000000000000400000000a5000000000000000400000000a60000000000000006000000006600 *0000000000000600000000a7000000000000000600000000a8000000000000000600000000a900 *0000000000000800000000aa000000000000000800000000ab000000000000000903000000ac00 *0000000000000901000000ac000000000000000900000000ad000000000000000900000000ae00 *0000000000000900000000af000000000000000900000000b0000000000000000900000000b100 *000000000000b2000000000000001548537472696e6754656d706c6174652d302e362e32000000 *0000000013546578742e537472696e6754656d706c617465000000000000001b546578742e5374 *72696e6754656d706c6174652e436c61737365730000000000000018546578742e537472696e67 *54656d706c6174652e426173650000000000000016546578742e537472696e6754656d706c6174 *652e5151000000000000001d546578742e537472696e6754656d706c6174652e496e7374616e63 *65730000000000000019546578742e537472696e6754656d706c6174652e47726f757000000000 *0000001b546578742e537472696e6754656d706c6174652e52656e646572660000000000000023 *546578742e537472696e6754656d706c6174652e47656e657269635374616e6461726400000000 *00000024546578742e537472696e6754656d706c6174652e47656e6572696357697468436c6173 *73000000000000000a537472696e6761626c65000000000000000c737446726f6d537472696e67 *0000000000000010737446726f6d42797465537472696e67000000000000000a7374546f537472 *696e67000000000000000a6d636f6e6361744d6170000000000000000c6d696e74657263616c61 *746500000000000000066d6c6162656c0000000000000007736d656d7074790000000000000008 *736d617070656e640000000000000008736d636f6e6361740000000000000006535453686f7700 *00000000000013537472696e6754656d706c61746553686f77730000000000000012737472696e *6754656d706c61746553686f77000000000000001b737472696e6754656d706c617465466f726d *617474656453686f770000000000000007546f53456c656d0000000000000007746f53456c656d *000000000000000b746f53456c656d4c697374000000000000000553456c656d00000000000000 *05534e756c6c0000000000000004534e4154000000000000000453424c4500000000000000024c *490000000000000002534d00000000000000045354534800000000000000024253000000000000 *00035354520000000000000004534d617000000000000000075374466972737400000000000000 *0a73744765744669727374000000000000000b737453686f7773546f5345000000000000000453 *456e760000000000000003736d700000000000000005736f70747300000000000000047367656e *000000000000000473656e63000000000000000e537472696e6754656d706c6174650000000000 *00000453544d50000000000000000473656e76000000000000000772756e53544d500000000000 *00000763686b53544d500000000000000007535447726f7570000000000000000b706164646564 *5472616e730000000000000008746f537472696e670000000000000007746f5050446f63000000 *000000000672656e646572000000000000000d636865636b54656d706c61746500000000000000 *076e657753544d50000000000000000c6e6577416e676c6553544d50000000000000000c736574 *417474726962757465000000000000000d7365744d616e79417474726962000000000000001273 *65744e617469766541747472696275746500000000000000137365744d616e794e617469766541 *7474726962000000000000000b77697468436f6e74657874000000000000001167657453747269 *6e6754656d706c6174650000000000000012676574537472696e6754656d706c61746527000000 *000000000d6f7074496e73657274546d706c000000000000000a736574456e636f646572000000 *000000000b64756d70417474726962730000000000000006696e5347656e000000000000000970 *6172736553544d50000000000000000e706172736553544d504e616d6573000000000000001163 *6865636b54656d706c61746544656570000000000000000473746d70000000000000001467726f *7570537472696e6754656d706c61746573000000000000000e6469726563746f727947726f7570 *00000000000000126469726563746f727947726f75704c617a7900000000000000176469726563 *746f727947726f7570526563757273697665000000000000001b6469726563746f727947726f75 *705265637572736976654c617a79000000000000000d616464537570657247726f757000000000 *0000000b61646453756247726f7570000000000000000d6d65726765535447726f757073000000 *000000000e6f7074496e7365727447726f7570000000000000000f736574456e636f6465724772 *6f757000000000000000096e756c6c47726f7570000000000000001c756e73616665566f6c6174 *696c654469726563746f727947726f757000000000000000065345547970650000000000000007 *72656e6465726600000000000000027c3d00000000000000046261736500000000000000084748 *432e53686f77000000000000000473686f77000000000000000574326d6170000000000000000d *546d706c457863657074696f6e000000000000000a50617273654572726f720000000000000006 *4e6f546d706c00000000000000084e6f41747472696200000000000000084748432e4261736500 *00000000000006537472696e67000000000000000b446174612e4d6f6e6f696400000000000000 *04456e646f000000000000000553686f7753000000000000000a546d706c506172736572000000 *00000000043c24243e00000000000000027c2e00000000000000032e3e3e000000000000000866 *726f6d4d616e7900000000000000057377696e670000000000000009656e764c6f6f6b75700000 *00000000000b656e764c6f6f6b757045780000000000000009656e76496e736572740000000000 *000009656e76496e7341707000000000000000096f70744c6f6f6b757000000000000000096f70 *74496e7365727400000000000000076e756c6c4f7074000000000000000873744c6f6f6b757000 *0000000000000a6d6572676553456e7673000000000000000e64726f70547261696c696e674272 *000000000000000767657453657073000000000000000874656c6c4e616d650000000000000006 *74656c6c5151000000000000000874656c6c546d706c000000000000000763686b53746d700000 *00000000000972656e646572457272000000000000000b6d636f6e6361744d6170270000000000 *00000773686f7756616c000000000000000773686f7753747200000000000000076a7573745354 *520000000000000006737473686f77000000000000000773746673686f77000000000000000661 *726f756e6400000000000000067370616365640000000000000004776f72640000000000000007 *636f6d6c697374000000000000000570726f7073000000000000000b6573636170656443686172 *000000000000000a6573636170656453747200000000000000086d79436f6e6361740000000000 *00000573746d706c000000000000000773756253746d700000000000000007636f6d6d656e7400 *00000000000005626c616e6b00000000000000076f70744578707200000000000000076f70744c *696e65000000000000000767657450726f70000000000000000769664973536574000000000000 *0006696673746174000000000000000a656c73656966737461740000000000000008656c736573 *7461740000000000000009656e646966737461740000000000000005657870726e000000000000 *0009736571546d706c73270000000000000008736571546d706c73000000000000000873756265 *7870726e000000000000000b6272616365436f6e63617400000000000000076c69746572616c00 *00000000000006617474726962000000000000000666756e63746e00000000000000076d6b496e *646578000000000000000369783000000000000000086379636c65417070000000000000000770 *6c75736c656e00000000000000076c695472616e73000000000000000769746572417070000000 *0000000008616e6f6e546d706c000000000000000b72656754656d706c61746500000000000000 *0c71756f7465546d706c506174000000000000000c71756f7465546d706c457870000000000000 *00097265616446696c6527000000000000000e67726f757046726f6d46696c6573000000000000 *0011676574546d706c73526563757273697665000000000000000867546f53456c656d00000000 *0000000e7374726970496e6974556e6465720000000000000008546f53456c656d440000000000 *000008746f53456c656d4400000000000000177374726970496e697469616c556e64657273636f *726573000000000000000c746f53456c656d50726f7879000000000000000e67656e6572696354 *6f53456c656d00000000000000096765744669656c6473 addfile ./docs/0.5.0/HStringTemplate/Text-StringTemplate-Base.html hunk ./docs/0.5.0/HStringTemplate/Text-StringTemplate-Base.html 1 + + +Text.StringTemplate.Base
     HStringTemplate-0.6.2: StringTemplate implementation in Haskell.Source codeContentsIndex
    Text.StringTemplate.Base
    Synopsis
    data StringTemplate a = STMP {
    senv :: SEnv a
    runSTMP :: Either String (SEnv a -> a)
    chkSTMP :: SEnv a -> (Maybe String, Maybe [String], Maybe [String])
    }
    class Show a => StringTemplateShows a where
    stringTemplateShow :: a -> String
    stringTemplateFormattedShow :: String -> a -> String
    class ToSElem a where
    toSElem :: Stringable b => a -> SElem b
    toSElemList :: Stringable b => [a] -> SElem b
    type STGroup a = String -> StFirst (StringTemplate a)
    class Stringable a where
    stFromString :: String -> a
    stFromByteString :: ByteString -> a
    stToString :: a -> String
    mconcatMap :: [b] -> (b -> a) -> a
    mintercalate :: a -> [a] -> a
    mlabel :: a -> a -> a
    smempty :: a
    smappend :: a -> a -> a
    smconcat :: [a] -> a
    stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem b
    inSGen :: (STGroup a -> STGroup a) -> StringTemplate a -> StringTemplate a
    toString :: StringTemplate String -> String
    toPPDoc :: StringTemplate Doc -> Doc
    render :: Stringable a => StringTemplate a -> a
    newSTMP :: Stringable a => String -> StringTemplate a
    newAngleSTMP :: Stringable a => String -> StringTemplate a
    getStringTemplate :: Stringable a => String -> STGroup a -> Maybe (StringTemplate a)
    getStringTemplate' :: Stringable a => String -> STGroup a -> Maybe (StringTemplate a)
    setAttribute :: (ToSElem a, Stringable b) => String -> a -> StringTemplate b -> StringTemplate b
    setManyAttrib :: (ToSElem a, Stringable b) => [(String, a)] -> StringTemplate b -> StringTemplate b
    setNativeAttribute :: Stringable b => String -> b -> StringTemplate b -> StringTemplate b
    setManyNativeAttrib :: Stringable b => [(String, b)] -> StringTemplate b -> StringTemplate b
    withContext :: (ToSElem a, Stringable b) => StringTemplate b -> a -> StringTemplate b
    optInsertTmpl :: [(String, String)] -> StringTemplate a -> StringTemplate a
    setEncoder :: Stringable a => (a -> a) -> StringTemplate a -> StringTemplate a
    paddedTrans :: a -> [[a]] -> [[a]]
    data SEnv a = SEnv {
    smp :: SMap a
    sopts :: [(String, SEnv a -> SElem a)]
    sgen :: STGroup a
    senc :: a -> a
    }
    parseSTMP :: Stringable a => (Char, Char) -> String -> Either String (SEnv a -> a)
    dumpAttribs :: Stringable a => StringTemplate a
    checkTemplate :: Stringable a => StringTemplate a -> (Maybe String, Maybe [String], Maybe [String])
    checkTemplateDeep :: (Stringable a, NFData a) => StringTemplate a -> ([(String, String)], [String], [String])
    parseSTMPNames :: (Char, Char) -> String -> Either ParseError ([String], [String], [String])
    Documentation
    data StringTemplate a Source
    A String with "holes" in it. StringTemplates may be composed of any + Stringable type, which at the moment includes Strings, ByteStrings, + PrettyPrinter Docs, and Endo Strings, which are actually of type + ShowS. When a StringTemplate is composed of a type, its internals are + as well, so it is, so to speak "turtles all the way down." +
    Constructors
    STMP
    senv :: SEnv a
    runSTMP :: Either String (SEnv a -> a)
    chkSTMP :: SEnv a -> (Maybe String, Maybe [String], Maybe [String])
    class Show a => StringTemplateShows a whereSource
    The StringTemplateShows class should be instantiated for all types that are + directly displayed in a StringTemplate, but take an optional format string. Each such type must have an appropriate ToSElem method defined as well. +
    Methods
    stringTemplateShow :: a -> StringSource
    Defaults to show. +
    stringTemplateFormattedShow :: String -> a -> StringSource
    Defaults to _ a -> stringTemplateShow a +
    class ToSElem a whereSource
    The ToSElem class should be instantiated for all types that can be + inserted as attributes into a StringTemplate. +
    Methods
    toSElem :: Stringable b => a -> SElem bSource
    toSElemList :: Stringable b => [a] -> SElem bSource
    type STGroup a = String -> StFirst (StringTemplate a)Source
    A function that generates StringTemplates. + This is conceptually a query function into a "group" of StringTemplates. +
    class Stringable a whereSource
    The Stringable class should be instantiated with care. + Generally, the provided instances should be enough for anything. +
    Methods
    stFromString :: String -> aSource
    stFromByteString :: ByteString -> aSource
    stToString :: a -> StringSource
    mconcatMap :: [b] -> (b -> a) -> aSource
    Defaults to mconcatMap m k = foldr (mappend . k) mempty m +
    mintercalate :: a -> [a] -> aSource
    Defaults to (mconcat .) . intersperse +
    mlabel :: a -> a -> aSource
    Defaults to mlabel x y = smconcat [x, stFromString [, y, stFromString ]] +
    smempty :: aSource
    Just mempty. Here to avoid orphan instances +
    smappend :: a -> a -> aSource
    Just mappend. Here to avoid orphan instances +
    smconcat :: [a] -> aSource
    Just mconcat. Here to avoid orphan instances +
    stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem bSource
    This method should be used to create ToSElem instances for + types defining a custom formatted show function. +
    inSGen :: (STGroup a -> STGroup a) -> StringTemplate a -> StringTemplate aSource
    toString :: StringTemplate String -> StringSource
    Renders a StringTemplate to a String. +
    toPPDoc :: StringTemplate Doc -> DocSource
    Renders a StringTemplate to a Text.PrettyPrint.HughesPJ.Doc. +
    render :: Stringable a => StringTemplate a -> aSource
    Generic render function for a StringTemplate of any type. +
    newSTMP :: Stringable a => String -> StringTemplate aSource
    Parses a String to produce a StringTemplate, with '$'s as delimiters. + It is constructed with a stub group that cannot look up other templates. +
    newAngleSTMP :: Stringable a => String -> StringTemplate aSource
    Parses a String to produce a StringTemplate, delimited by angle brackets. + It is constructed with a stub group that cannot look up other templates. +
    getStringTemplate :: Stringable a => String -> STGroup a -> Maybe (StringTemplate a)Source
    Queries an String Template Group and returns Just the appropriate + StringTemplate if it exists, otherwise, Nothing. +
    getStringTemplate' :: Stringable a => String -> STGroup a -> Maybe (StringTemplate a)Source
    As with getStringTemplate but never inlined, so appropriate for use + with volatile template groups. +
    setAttribute :: (ToSElem a, Stringable b) => String -> a -> StringTemplate b -> StringTemplate bSource
    Yields a StringTemplate with the appropriate attribute set. + If the attribute already exists, it is appended to a list. +
    setManyAttrib :: (ToSElem a, Stringable b) => [(String, a)] -> StringTemplate b -> StringTemplate bSource
    Yields a StringTemplate with the appropriate attributes set. + If any attribute already exists, it is appended to a list. +
    setNativeAttribute :: Stringable b => String -> b -> StringTemplate b -> StringTemplate bSource
    Yields a StringTemplate with the appropriate attribute set. + If the attribute already exists, it is appended to a list. + This will not translate the attribute through any intermediate + representation, so is more efficient when, e.g. setting + attributes that are large bytestrings in a bytestring template. +
    setManyNativeAttrib :: Stringable b => [(String, b)] -> StringTemplate b -> StringTemplate bSource
    Yields a StringTemplate with the appropriate attributes set. + If any attribute already exists, it is appended to a list. + Attributes are added natively, which may provide + efficiency gains. +
    withContext :: (ToSElem a, Stringable b) => StringTemplate b -> a -> StringTemplate bSource
    Replaces the attributes of a StringTemplate with those + described in the second argument. If the argument does not yield + a set of named attributes but only a single one, that attribute + is named, as a default, "it". +
    optInsertTmpl :: [(String, String)] -> StringTemplate a -> StringTemplate aSource
    Adds a set of global options to a single template +
    setEncoder :: Stringable a => (a -> a) -> StringTemplate a -> StringTemplate aSource
    Sets an encoding function of a template that all values are + rendered with. For example one useful encoder would be Text.Html.stringToHtmlString. All attributes will be encoded once and only once. +
    paddedTrans :: a -> [[a]] -> [[a]]Source
    data SEnv a Source
    Constructors
    SEnv
    smp :: SMap a
    sopts :: [(String, SEnv a -> SElem a)]
    sgen :: STGroup a
    senc :: a -> a
    parseSTMP :: Stringable a => (Char, Char) -> String -> Either String (SEnv a -> a)Source
    dumpAttribs :: Stringable a => StringTemplate aSource
    A special template that simply dumps the values of all the attributes set in it. + This may be made available to any template as a function by adding it to its group. + I.e. myNewGroup = addSuperGroup myGroup $ groupStringTemplates [(dumpAttribs, dumpAttribs)] +
    checkTemplate :: Stringable a => StringTemplate a -> (Maybe String, Maybe [String], Maybe [String])Source
    Returns a tuple of three Maybes. The first is set if there is a parse error in the template. + The next is set to a list of attributes that have not been set, or Nothing if all attributes are set. + The last is set to a list of invoked templates that cannot be looked up, or Nothing if all invoked templates can be found. + Note that this check is shallow -- i.e. missing attributes and templates are only caught in the top level template, not any invoked subtemplate. +
    checkTemplateDeep :: (Stringable a, NFData a) => StringTemplate a -> ([(String, String)], [String], [String])Source
    Returns a tuple of three lists. The first is of templates with parse errors, and their erros. The next is of missing attributes, and the last is of missing templates. If there are no errors, then all lists will be empty. +
    parseSTMPNames :: (Char, Char) -> String -> Either ParseError ([String], [String], [String])Source
    Gets all quasiquoted names, normal names & templates used in a given template. + Must be passed a pair of chars denoting the delimeters to be used. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/HStringTemplate/Text-StringTemplate-Classes.html hunk ./docs/0.5.0/HStringTemplate/Text-StringTemplate-Classes.html 1 + + +Text.StringTemplate.Classes
     HStringTemplate-0.6.2: StringTemplate implementation in Haskell.Source codeContentsIndex
    Text.StringTemplate.Classes
    Synopsis
    data SElem a
    = STR String
    | BS ByteString
    | STSH STShow
    | SM (SMap a)
    | LI [SElem a]
    | SBLE a
    | SNAT a
    | SNull
    class Show a => StringTemplateShows a where
    stringTemplateShow :: a -> String
    stringTemplateFormattedShow :: String -> a -> String
    class ToSElem a where
    toSElem :: Stringable b => a -> SElem b
    toSElemList :: Stringable b => [a] -> SElem b
    type SMap a = Map String (SElem a)
    data STShow = forall a . StringTemplateShows a => STShow a
    newtype StFirst a = StFirst {
    stGetFirst :: Maybe a
    }
    class Stringable a where
    stFromString :: String -> a
    stFromByteString :: ByteString -> a
    stToString :: a -> String
    mconcatMap :: [b] -> (b -> a) -> a
    mintercalate :: a -> [a] -> a
    mlabel :: a -> a -> a
    smempty :: a
    smappend :: a -> a -> a
    smconcat :: [a] -> a
    stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem b
    Documentation
    data SElem a Source
    Constructors
    STR String
    BS ByteString
    STSH STShow
    SM (SMap a)
    LI [SElem a]
    SBLE a
    SNAT a
    SNull
    class Show a => StringTemplateShows a whereSource
    The StringTemplateShows class should be instantiated for all types that are + directly displayed in a StringTemplate, but take an optional format string. Each such type must have an appropriate ToSElem method defined as well. +
    Methods
    stringTemplateShow :: a -> StringSource
    Defaults to show. +
    stringTemplateFormattedShow :: String -> a -> StringSource
    Defaults to _ a -> stringTemplateShow a +
    class ToSElem a whereSource
    The ToSElem class should be instantiated for all types that can be + inserted as attributes into a StringTemplate. +
    Methods
    toSElem :: Stringable b => a -> SElem bSource
    toSElemList :: Stringable b => [a] -> SElem bSource
    type SMap a = Map String (SElem a)Source
    data STShow Source
    Constructors
    forall a . StringTemplateShows a => STShow a
    newtype StFirst a Source
    Constructors
    StFirst
    stGetFirst :: Maybe a
    class Stringable a whereSource
    The Stringable class should be instantiated with care. + Generally, the provided instances should be enough for anything. +
    Methods
    stFromString :: String -> aSource
    stFromByteString :: ByteString -> aSource
    stToString :: a -> StringSource
    mconcatMap :: [b] -> (b -> a) -> aSource
    Defaults to mconcatMap m k = foldr (mappend . k) mempty m +
    mintercalate :: a -> [a] -> aSource
    Defaults to (mconcat .) . intersperse +
    mlabel :: a -> a -> aSource
    Defaults to mlabel x y = smconcat [x, stFromString [, y, stFromString ]] +
    smempty :: aSource
    Just mempty. Here to avoid orphan instances +
    smappend :: a -> a -> aSource
    Just mappend. Here to avoid orphan instances +
    smconcat :: [a] -> aSource
    Just mconcat. Here to avoid orphan instances +
    stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem bSource
    This method should be used to create ToSElem instances for + types defining a custom formatted show function. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/HStringTemplate/Text-StringTemplate-GenericStandard.html hunk ./docs/0.5.0/HStringTemplate/Text-StringTemplate-GenericStandard.html 1 + + +Text.StringTemplate.GenericStandard
     HStringTemplate-0.6.2: StringTemplate implementation in Haskell.Source codeContentsIndex
    Text.StringTemplate.GenericStandard
    Description
    Generic Instance for ToSElem using standard Data.Generic libraries. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/HStringTemplate/Text-StringTemplate-GenericWithClass.html hunk ./docs/0.5.0/HStringTemplate/Text-StringTemplate-GenericWithClass.html 1 + + +Text.StringTemplate.GenericWithClass
     HStringTemplate-0.6.2: StringTemplate implementation in Haskell.Source codeContentsIndex
    Text.StringTemplate.GenericWithClass
    Description
    Generic Instance for ToSElem using syb-with-class. + Inspired heavily-to-entirely by Alex Drummond's RJson. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/HStringTemplate/Text-StringTemplate-QQ.html hunk ./docs/0.5.0/HStringTemplate/Text-StringTemplate-QQ.html 1 + + +Text.StringTemplate.QQ
     HStringTemplate-0.6.2: StringTemplate implementation in Haskell.Source codeContentsIndex
    Text.StringTemplate.QQ
    Portabilityportable
    Stabilityexperimental
    Maintainers.clover@gmail.com
    Description
    This module provides stmp, a quasi-quoter for StringTemplate expressions. + Quoted templates are guaranteed syntactically well-formed at compile time, + and antiquotation (of identifiers only) is provided by backticks. + Usage: let var = [0,1,2] in toString [$stmp|($`var`; separator = ', '$)|] === "(0, 1, 2)" +
    Documentation
    stmp :: QuasiQuoterSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/HStringTemplate/Text-StringTemplate.html hunk ./docs/0.5.0/HStringTemplate/Text-StringTemplate.html 1 + + +Text.StringTemplate
     HStringTemplate-0.6.2: StringTemplate implementation in Haskell.Source codeContentsIndex
    Text.StringTemplate
    Portabilityportable
    Stabilityexperimental
    Maintainers.clover@gmail.com
    Contents
    Types +
    Classes +
    Creation +
    Display +
    Modification +
    Groups +
    Description

    A StringTemplate is a String with "holes" in it. + This is a port of the Java StringTemplate library written by Terrence Parr. + (http://www.stringtemplate.org). User-contributed documentation available at + http://www.haskell.org/haskellwiki/HStringTemplate. +

    This library implements the basic 3.1 grammar, lacking group files + (though not groups themselves), Regions, and Interfaces. + The goal is not to blindly copy the StringTemplate API, but rather to + take its central ideas and implement them in a Haskellish manner. + Indentation and wrapping, for example, are implemented through the + HughesPJ Pretty Printing library. Calling toPPDoc on a StringTemplate + yields a Doc with appropriate paragraph-fill wrapping that can be + rendered in the usual fashion. +

    Basic instances are provided of the StringTemplateShows and ToSElem class. + Any type deriving ToSElem can be passed automatically as a StringTemplate + attribute. This package can be installed with syb-with-class bindings + that provide a ToSElem instance for anything deriving + Data.Generics.SYB.WithClass.Basics.Data. When defining an instance of + ToSElem that can take a format parameter, you should first define an + instance of StringTemplateShows, and then define an instance of ToSElem + where toSElem = stShowsToSE. +

    Synopsis
    data StringTemplate a
    type STGroup a = String -> StFirst (StringTemplate a)
    class ToSElem a where
    toSElem :: Stringable b => a -> SElem b
    toSElemList :: Stringable b => [a] -> SElem b
    class Show a => StringTemplateShows a where
    stringTemplateShow :: a -> String
    stringTemplateFormattedShow :: String -> a -> String
    stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem b
    class Stringable a where
    stFromString :: String -> a
    stFromByteString :: ByteString -> a
    stToString :: a -> String
    mconcatMap :: [b] -> (b -> a) -> a
    mintercalate :: a -> [a] -> a
    mlabel :: a -> a -> a
    smempty :: a
    smappend :: a -> a -> a
    smconcat :: [a] -> a
    class Stringable b => SEType b a where
    renderf :: StringTemplate b -> a
    newSTMP :: Stringable a => String -> StringTemplate a
    newAngleSTMP :: Stringable a => String -> StringTemplate a
    getStringTemplate :: Stringable a => String -> STGroup a -> Maybe (StringTemplate a)
    getStringTemplate' :: Stringable a => String -> STGroup a -> Maybe (StringTemplate a)
    toString :: StringTemplate String -> String
    toPPDoc :: StringTemplate Doc -> Doc
    render :: Stringable a => StringTemplate a -> a
    dumpAttribs :: Stringable a => StringTemplate a
    checkTemplate :: Stringable a => StringTemplate a -> (Maybe String, Maybe [String], Maybe [String])
    checkTemplateDeep :: (Stringable a, NFData a) => StringTemplate a -> ([(String, String)], [String], [String])
    setAttribute :: (ToSElem a, Stringable b) => String -> a -> StringTemplate b -> StringTemplate b
    (|=) :: Monad m => a -> m a1 -> m (a, a1)
    setManyAttrib :: (ToSElem a, Stringable b) => [(String, a)] -> StringTemplate b -> StringTemplate b
    setNativeAttribute :: Stringable b => String -> b -> StringTemplate b -> StringTemplate b
    setManyNativeAttrib :: Stringable b => [(String, b)] -> StringTemplate b -> StringTemplate b
    withContext :: (ToSElem a, Stringable b) => StringTemplate b -> a -> StringTemplate b
    optInsertTmpl :: [(String, String)] -> StringTemplate a -> StringTemplate a
    optInsertGroup :: [(String, String)] -> STGroup a -> STGroup a
    setEncoder :: Stringable a => (a -> a) -> StringTemplate a -> StringTemplate a
    setEncoderGroup :: Stringable a => (a -> a) -> STGroup a -> STGroup a
    groupStringTemplates :: [(String, StringTemplate a)] -> STGroup a
    addSuperGroup :: STGroup a -> STGroup a -> STGroup a
    addSubGroup :: STGroup a -> STGroup a -> STGroup a
    mergeSTGroups :: STGroup a -> STGroup a -> STGroup a
    directoryGroup :: Stringable a => FilePath -> IO (STGroup a)
    unsafeVolatileDirectoryGroup :: Stringable a => FilePath -> Int -> IO (STGroup a)
    directoryGroupRecursive :: Stringable a => FilePath -> IO (STGroup a)
    directoryGroupRecursiveLazy :: Stringable a => FilePath -> IO (STGroup a)
    directoryGroupLazy :: Stringable a => FilePath -> IO (STGroup a)
    nullGroup :: Stringable a => STGroup a
    Types +
    data StringTemplate a Source
    A String with "holes" in it. StringTemplates may be composed of any + Stringable type, which at the moment includes Strings, ByteStrings, + PrettyPrinter Docs, and Endo Strings, which are actually of type + ShowS. When a StringTemplate is composed of a type, its internals are + as well, so it is, so to speak "turtles all the way down." +
    type STGroup a = String -> StFirst (StringTemplate a)Source
    A function that generates StringTemplates. + This is conceptually a query function into a "group" of StringTemplates. +
    Classes +
    class ToSElem a whereSource
    The ToSElem class should be instantiated for all types that can be + inserted as attributes into a StringTemplate. +
    Methods
    toSElem :: Stringable b => a -> SElem bSource
    toSElemList :: Stringable b => [a] -> SElem bSource
    class Show a => StringTemplateShows a whereSource
    The StringTemplateShows class should be instantiated for all types that are + directly displayed in a StringTemplate, but take an optional format string. Each such type must have an appropriate ToSElem method defined as well. +
    Methods
    stringTemplateShow :: a -> StringSource
    Defaults to show. +
    stringTemplateFormattedShow :: String -> a -> StringSource
    Defaults to _ a -> stringTemplateShow a +
    stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem bSource
    This method should be used to create ToSElem instances for + types defining a custom formatted show function. +
    class Stringable a whereSource
    The Stringable class should be instantiated with care. + Generally, the provided instances should be enough for anything. +
    Methods
    stFromString :: String -> aSource
    stFromByteString :: ByteString -> aSource
    stToString :: a -> StringSource
    mconcatMap :: [b] -> (b -> a) -> aSource
    Defaults to mconcatMap m k = foldr (mappend . k) mempty m +
    mintercalate :: a -> [a] -> aSource
    Defaults to (mconcat .) . intersperse +
    mlabel :: a -> a -> aSource
    Defaults to mlabel x y = smconcat [x, stFromString [, y, stFromString ]] +
    smempty :: aSource
    Just mempty. Here to avoid orphan instances +
    smappend :: a -> a -> aSource
    Just mappend. Here to avoid orphan instances +
    smconcat :: [a] -> aSource
    Just mconcat. Here to avoid orphan instances +
    class Stringable b => SEType b a whereSource
    Methods
    renderf :: StringTemplate b -> aSource
    Creation +
    newSTMP :: Stringable a => String -> StringTemplate aSource
    Parses a String to produce a StringTemplate, with '$'s as delimiters. + It is constructed with a stub group that cannot look up other templates. +
    newAngleSTMP :: Stringable a => String -> StringTemplate aSource
    Parses a String to produce a StringTemplate, delimited by angle brackets. + It is constructed with a stub group that cannot look up other templates. +
    getStringTemplate :: Stringable a => String -> STGroup a -> Maybe (StringTemplate a)Source
    Queries an String Template Group and returns Just the appropriate + StringTemplate if it exists, otherwise, Nothing. +
    getStringTemplate' :: Stringable a => String -> STGroup a -> Maybe (StringTemplate a)Source
    As with getStringTemplate but never inlined, so appropriate for use + with volatile template groups. +
    Display +
    toString :: StringTemplate String -> StringSource
    Renders a StringTemplate to a String. +
    toPPDoc :: StringTemplate Doc -> DocSource
    Renders a StringTemplate to a Text.PrettyPrint.HughesPJ.Doc. +
    render :: Stringable a => StringTemplate a -> aSource
    Generic render function for a StringTemplate of any type. +
    dumpAttribs :: Stringable a => StringTemplate aSource
    A special template that simply dumps the values of all the attributes set in it. + This may be made available to any template as a function by adding it to its group. + I.e. myNewGroup = addSuperGroup myGroup $ groupStringTemplates [(dumpAttribs, dumpAttribs)] +
    checkTemplate :: Stringable a => StringTemplate a -> (Maybe String, Maybe [String], Maybe [String])Source
    Returns a tuple of three Maybes. The first is set if there is a parse error in the template. + The next is set to a list of attributes that have not been set, or Nothing if all attributes are set. + The last is set to a list of invoked templates that cannot be looked up, or Nothing if all invoked templates can be found. + Note that this check is shallow -- i.e. missing attributes and templates are only caught in the top level template, not any invoked subtemplate. +
    checkTemplateDeep :: (Stringable a, NFData a) => StringTemplate a -> ([(String, String)], [String], [String])Source
    Returns a tuple of three lists. The first is of templates with parse errors, and their erros. The next is of missing attributes, and the last is of missing templates. If there are no errors, then all lists will be empty. +
    Modification +
    setAttribute :: (ToSElem a, Stringable b) => String -> a -> StringTemplate b -> StringTemplate bSource
    Yields a StringTemplate with the appropriate attribute set. + If the attribute already exists, it is appended to a list. +
    (|=) :: Monad m => a -> m a1 -> m (a, a1)Source
    setManyAttrib :: (ToSElem a, Stringable b) => [(String, a)] -> StringTemplate b -> StringTemplate bSource
    Yields a StringTemplate with the appropriate attributes set. + If any attribute already exists, it is appended to a list. +
    setNativeAttribute :: Stringable b => String -> b -> StringTemplate b -> StringTemplate bSource
    Yields a StringTemplate with the appropriate attribute set. + If the attribute already exists, it is appended to a list. + This will not translate the attribute through any intermediate + representation, so is more efficient when, e.g. setting + attributes that are large bytestrings in a bytestring template. +
    setManyNativeAttrib :: Stringable b => [(String, b)] -> StringTemplate b -> StringTemplate bSource
    Yields a StringTemplate with the appropriate attributes set. + If any attribute already exists, it is appended to a list. + Attributes are added natively, which may provide + efficiency gains. +
    withContext :: (ToSElem a, Stringable b) => StringTemplate b -> a -> StringTemplate bSource
    Replaces the attributes of a StringTemplate with those + described in the second argument. If the argument does not yield + a set of named attributes but only a single one, that attribute + is named, as a default, "it". +
    optInsertTmpl :: [(String, String)] -> StringTemplate a -> StringTemplate aSource
    Adds a set of global options to a single template +
    optInsertGroup :: [(String, String)] -> STGroup a -> STGroup aSource
    Adds a set of global options to a group +
    setEncoder :: Stringable a => (a -> a) -> StringTemplate a -> StringTemplate aSource
    Sets an encoding function of a template that all values are + rendered with. For example one useful encoder would be Text.Html.stringToHtmlString. All attributes will be encoded once and only once. +
    setEncoderGroup :: Stringable a => (a -> a) -> STGroup a -> STGroup aSource
    Sets an encoding function of a group that all values are + rendered with in each enclosed template +
    Groups +
    groupStringTemplates :: [(String, StringTemplate a)] -> STGroup aSource
    Given a list of named of StringTemplates, returns a group which generates + them such that they can call one another. +
    addSuperGroup :: STGroup a -> STGroup a -> STGroup aSource
    Adds a supergroup to any StringTemplate group such that templates from + the original group are now able to call ones from the supergroup as well. +
    addSubGroup :: STGroup a -> STGroup a -> STGroup aSource
    Adds a "subgroup" to any StringTemplate group such that templates from + the original group now have template calls "shadowed" by the subgroup. +
    mergeSTGroups :: STGroup a -> STGroup a -> STGroup aSource
    Merges two groups into a single group. This function is left-biased, + prefering bindings from the first group when there is a conflict. +
    directoryGroup :: Stringable a => FilePath -> IO (STGroup a)Source
    Given a path, returns a group which generates all files in said directory + which have the proper "st" extension. + This function is strict, with all files read once. As it performs file IO, + expect it to throw the usual exceptions. +
    unsafeVolatileDirectoryGroup :: Stringable a => FilePath -> Int -> IO (STGroup a)Source
    Given an integral amount of seconds and a path, returns a group generating + all files in said directory and subdirectories with the proper "st" extension, + cached for that amount of seconds. IO errors are "swallowed" by this so + that exceptions don't arise in unexpected places. + This violates referential transparency, but can be very useful in developing + templates for any sort of server application. It should be swapped out for + production purposes. The dumpAttribs template is added to the returned group + by default, as it should prove useful for debugging and developing templates. +
    directoryGroupRecursive :: Stringable a => FilePath -> IO (STGroup a)Source
    As with directoryGroup, but traverses subdirectories as well. A template named + "foobar.st\" may be referenced by \"foobar" in the returned group. +
    directoryGroupRecursiveLazy :: Stringable a => FilePath -> IO (STGroup a)Source
    See documentation for directoryGroupRecursive. +
    directoryGroupLazy :: Stringable a => FilePath -> IO (STGroup a)Source
    Given a path, returns a group which generates all files in said directory + which have the proper "st" extension. + This function is lazy in the same way that readFile is lazy, with all + files read on demand, but no more than once. The list of files, however, + is generated at the time the function is called. As this performs file IO, + expect it to throw the usual exceptions. And, as it is lazy, expect + these exceptions in unexpected places. +
    nullGroup :: Stringable a => STGroup aSource
    For any requested template, returns a message that the template was + unable to be found. Useful to add as a super group for a set of templates + under development, to aid in debugging. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/HStringTemplate/doc-index.html hunk ./docs/0.5.0/HStringTemplate/doc-index.html 1 + + +HStringTemplate-0.6.2: StringTemplate implementation in Haskell. (Index)
     HStringTemplate-0.6.2: StringTemplate implementation in Haskell.ContentsIndex
    addSubGroup
    addSuperGroup
    BS
    checkTemplate
    checkTemplateDeep
    chkSTMP
    directoryGroup
    directoryGroupLazy
    directoryGroupRecursive
    directoryGroupRecursiveLazy
    dumpAttribs
    getStringTemplate
    getStringTemplate'
    groupStringTemplates
    inSGen
    LI
    mconcatMap
    mergeSTGroups
    mintercalate
    mlabel
    newAngleSTMP
    newSTMP
    nullGroup
    optInsertGroup
    optInsertTmpl
    paddedTrans
    parseSTMP
    parseSTMPNames
    render
    renderf
    runSTMP
    SBLE
    SElem
    senc
    SEnv
    1 (Type/Class)
    2 (Data Constructor)
    senv
    setAttribute
    setEncoder
    setEncoderGroup
    setManyAttrib
    setManyNativeAttrib
    setNativeAttribute
    SEType
    sgen
    SM
    SMap
    smappend
    smconcat
    smempty
    smp
    SNAT
    SNull
    sopts
    StFirst
    1 (Type/Class)
    2 (Data Constructor)
    stFromByteString
    stFromString
    stGetFirst
    STGroup
    STMP
    stmp
    STR
    Stringable
    StringTemplate
    stringTemplateFormattedShow
    stringTemplateShow
    StringTemplateShows
    STSH
    STShow
    1 (Type/Class)
    2 (Data Constructor)
    stShowsToSE
    stToString
    toPPDoc
    ToSElem
    toSElem
    toSElemList
    toString
    unsafeVolatileDirectoryGroup
    withContext
    |=
    addfile ./docs/0.5.0/HStringTemplate/frames.html hunk ./docs/0.5.0/HStringTemplate/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/HStringTemplate/haddock-util.js hunk ./docs/0.5.0/HStringTemplate/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/HStringTemplate/haddock.css hunk ./docs/0.5.0/HStringTemplate/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + addfile ./docs/0.5.0/HStringTemplate/haskell_icon.gif binary ./docs/0.5.0/HStringTemplate/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/HStringTemplate/index-frames.html hunk ./docs/0.5.0/HStringTemplate/index-frames.html 1 + + +HStringTemplate-0.6.2: StringTemplate implementation in Haskell.

    Text.StringTemplate
    Text.StringTemplate.Base
    Text.StringTemplate.Classes
    Text.StringTemplate.GenericStandard
    Text.StringTemplate.GenericWithClass
    Text.StringTemplate.QQ

    addfile ./docs/0.5.0/HStringTemplate/index.html hunk ./docs/0.5.0/HStringTemplate/index.html 1 + + +HStringTemplate-0.6.2: StringTemplate implementation in Haskell.
     HStringTemplate-0.6.2: StringTemplate implementation in Haskell.ContentsIndex
    HStringTemplate-0.6.2: StringTemplate implementation in Haskell.
    A port of the Java library by Terrence Parr. +
    Modules
    show/hideText
    show/hideText.StringTemplate
    Text.StringTemplate.Base
    Text.StringTemplate.Classes
    Text.StringTemplate.GenericStandard
    Text.StringTemplate.GenericWithClass
    Text.StringTemplate.QQ
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-Base.html hunk ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-Base.html 1 + + +Text.StringTemplate.Base addfile ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-Classes.html hunk ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-Classes.html 1 + + +Text.StringTemplate.Classes
    Text.StringTemplate.Classes
    data SElem a
    class ToSElem a
    type SMap a
    data STShow
    data StFirst a
    class Stringable a
    addfile ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-GenericStandard.html hunk ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-GenericStandard.html 1 + + +Text.StringTemplate.GenericStandard
    Text.StringTemplate.GenericStandard
    addfile ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-GenericWithClass.html hunk ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-GenericWithClass.html 1 + + +Text.StringTemplate.GenericWithClass
    Text.StringTemplate.GenericWithClass
    addfile ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-QQ.html hunk ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate-QQ.html 1 + + +Text.StringTemplate.QQ
    Text.StringTemplate.QQ
    addfile ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate.html hunk ./docs/0.5.0/HStringTemplate/mini_Text-StringTemplate.html 1 + + +Text.StringTemplate addfile ./docs/0.5.0/HStringTemplate/minus.gif binary ./docs/0.5.0/HStringTemplate/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/HStringTemplate/plus.gif binary ./docs/0.5.0/HStringTemplate/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b adddir ./docs/0.5.0/HStringTemplate/src addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Base.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Base.html 1 + + + + +Text/StringTemplate/Base.hs + + + +
    {-# LANGUAGE RelaxedPolyRec, DeriveDataTypeable #-}
    +{-# OPTIONS_HADDOCK not-home #-}
    +
    +module Text.StringTemplate.Base
    +    (StringTemplate(..), StringTemplateShows(..), ToSElem(..), STGroup,
    +     Stringable(..), stShowsToSE, inSGen,
    +     toString, toPPDoc, render, newSTMP, newAngleSTMP,
    +     getStringTemplate, getStringTemplate',
    +     setAttribute, setManyAttrib,
    +     setNativeAttribute, setManyNativeAttrib,
    +     withContext, optInsertTmpl, setEncoder,
    +     paddedTrans, SEnv(..), parseSTMP, dumpAttribs,
    +     checkTemplate, checkTemplateDeep,
    +     parseSTMPNames
    +    ) where
    +import Control.Arrow
    +import Control.Applicative hiding ((<|>),many,optional)
    +import Control.Monad
    +import Control.Parallel.Strategies(rnf, NFData(..))
    +import qualified Control.Exception as C
    +import Data.List
    +import Data.Maybe
    +import Data.Monoid
    +import Data.Typeable
    +import System.IO.Unsafe
    +
    +import Text.ParserCombinators.Parsec
    +import qualified Data.Map as M
    +import qualified Text.PrettyPrint.HughesPJ as PP
    +
    +import Text.StringTemplate.Classes
    +import Text.StringTemplate.Instances()
    +import Debug.Trace
    +
    +{--------------------------------------------------------------------
    +  Generic Utilities
    +--------------------------------------------------------------------}
    +
    +type TmplParser = GenParser Char ((Char, Char),[String],[String],[String])
    +
    +(<$$>) :: (Functor f1, Functor f) => (a -> b) -> f (f1 a) -> f (f1 b)
    +(<$$>) = (<$>) . (<$>)
    +infixr 8 <$$>
    +
    +(|.) :: (t1 -> t2) -> (t -> t1) -> t -> t2
    +(|.) f g = f . g
    +infixr 3 |.
    +
    +(.>>) :: (Monad m) => m a -> m b -> m b
    +(.>>) f g = f >> g
    +infixr 5 .>>
    +
    +fromMany :: b -> ([a] -> b) -> [a] -> b
    +fromMany e _ [] = e
    +fromMany _ f xs  = f xs
    +
    +swing :: (((a -> c1) -> c1) -> b -> c) -> b -> a -> c
    +swing = flip . (. flip id)
    +
    +paddedTrans :: a -> [[a]] -> [[a]]
    +paddedTrans _ [] = []
    +paddedTrans n as = take (maximum . map length $ as) . trans $ as
    +    where trans ([] : xss)  = (n : map h xss) :  trans ([n] : map t xss)
    +          trans ((x : xs) : xss) = (x : map h xss) : trans (m xs : map t xss)
    +          trans _ = [];
    +          h (x:_) = x; h _ = n; t (_:y:xs) = y:xs; t _ = [n];
    +          m (x:xs) = x:xs; m _ = [n];
    +
    +{--------------------------------------------------------------------
    +  StringTemplate and the API
    +--------------------------------------------------------------------}
    +
    +-- | A function that generates StringTemplates.
    +-- This is conceptually a query function into a \"group\" of StringTemplates.
    +type STGroup a = String -> (StFirst (StringTemplate a))
    +
    +-- | A String with \"holes\" in it. StringTemplates may be composed of any
    +-- 'Stringable' type, which at the moment includes 'String's, 'ByteString's,
    +-- PrettyPrinter 'Doc's, and 'Endo' 'String's, which are actually of type
    +-- 'ShowS'. When a StringTemplate is composed of a type, its internals are
    +-- as well, so it is, so to speak \"turtles all the way down.\"
    +data StringTemplate a = STMP {senv :: SEnv a,  runSTMP :: Either String (SEnv a -> a), chkSTMP :: SEnv a -> (Maybe String, Maybe [String], Maybe [String])}
    +
    +-- | Renders a StringTemplate to a String.
    +toString :: StringTemplate String -> String
    +toString = render
    +
    +-- | Renders a StringTemplate to a 'Text.PrettyPrint.HughesPJ.Doc'.
    +toPPDoc :: StringTemplate PP.Doc -> PP.Doc
    +toPPDoc = render
    +
    +-- | Generic render function for a StringTemplate of any type.
    +render :: Stringable a => StringTemplate a -> a
    +render = either (showStr) id . runSTMP <*> senv
    +
    +nullEnv = SEnv M.empty [] mempty id
    +
    +-- | Returns a tuple of three Maybes. The first is set if there is a parse error in the template.
    +-- The next is set to a list of attributes that have not been set, or Nothing if all attributes are set.
    +-- The last is set to a list of invoked templates that cannot be looked up, or Nothing if all invoked templates can be found.
    +-- Note that this check is shallow -- i.e. missing attributes and templates are only caught in the top level template, not any invoked subtemplate.
    +checkTemplate :: Stringable a => StringTemplate a -> (Maybe String, Maybe [String], Maybe [String])
    +checkTemplate t = chkSTMP t (senv t)
    +
    +-- | Parses a String to produce a StringTemplate, with \'$\'s as delimiters.
    +-- It is constructed with a stub group that cannot look up other templates.
    +newSTMP :: Stringable a => String -> StringTemplate a
    +newSTMP s = STMP nullEnv (parseSTMP ('$','$') s) (chkStmp ('$','$') s)
    +
    +-- | Parses a String to produce a StringTemplate, delimited by angle brackets.
    +-- It is constructed with a stub group that cannot look up other templates.
    +newAngleSTMP :: Stringable a => String -> StringTemplate a
    +newAngleSTMP s = STMP nullEnv (parseSTMP ('<','>') s) (chkStmp ('<','>') s)
    +
    +-- | Yields a StringTemplate with the appropriate attribute set.
    +-- If the attribute already exists, it is appended to a list.
    +setAttribute :: (ToSElem a, Stringable b) => String -> a -> StringTemplate b -> StringTemplate b
    +setAttribute s x st = st {senv = envInsApp s (toSElem x) (senv st)}
    +
    +-- | Yields a StringTemplate with the appropriate attributes set.
    +-- If any attribute already exists, it is appended to a list.
    +setManyAttrib :: (ToSElem a, Stringable b) => [(String, a)] -> StringTemplate b -> StringTemplate b
    +setManyAttrib = flip . foldl' . flip $ uncurry setAttribute
    +
    +-- | Yields a StringTemplate with the appropriate attribute set.
    +-- If the attribute already exists, it is appended to a list.
    +-- This will not translate the attribute through any intermediate
    +-- representation, so is more efficient when, e.g. setting
    +-- attributes that are large bytestrings in a bytestring template.
    +setNativeAttribute :: Stringable b => String -> b -> StringTemplate b -> StringTemplate b
    +setNativeAttribute s x st = st {senv = envInsApp s (SNAT x) (senv st)}
    +
    +-- | Yields a StringTemplate with the appropriate attributes set.
    +-- If any attribute already exists, it is appended to a list.
    +-- Attributes are added natively, which may provide
    +-- efficiency gains.
    +setManyNativeAttrib :: (Stringable b) => [(String, b)] -> StringTemplate b -> StringTemplate b
    +setManyNativeAttrib = flip . foldl' . flip $ uncurry setNativeAttribute
    +
    +-- | Replaces the attributes of a StringTemplate with those
    +-- described in the second argument. If the argument does not yield
    +-- a set of named attributes but only a single one, that attribute
    +-- is named, as a default, \"it\".
    +withContext :: (ToSElem a, Stringable b) => StringTemplate b -> a -> StringTemplate b
    +withContext st x = case toSElem x of
    +                     SM a -> st {senv = (senv st) {smp = a}}
    +                     b -> st {senv = (senv st) {smp = M.singleton "it" b}}
    +
    +-- | Queries an String Template Group and returns Just the appropriate
    +-- StringTemplate if it exists, otherwise, Nothing.
    +getStringTemplate :: (Stringable a) => String -> STGroup a -> Maybe (StringTemplate a)
    +getStringTemplate s sg = stGetFirst (sg s)
    +
    +-- | As with 'getStringTemplate' but never inlined, so appropriate for use
    +-- with volatile template groups.
    +{-# NOINLINE getStringTemplate' #-}
    +getStringTemplate' :: (Stringable a) => String -> STGroup a -> Maybe (StringTemplate a)
    +getStringTemplate' s sg = stGetFirst (sg s)
    +
    +-- | Adds a set of global options to a single template
    +optInsertTmpl :: [(String, String)] -> StringTemplate a -> StringTemplate a
    +optInsertTmpl x st = st {senv = optInsert (map (second justSTR) x) (senv st)}
    +
    +-- | Sets an encoding function of a template that all values are
    +-- rendered with. For example one useful encoder would be 'Text.Html.stringToHtmlString'. All attributes will be encoded once and only once.
    +setEncoder :: (Stringable a) => (a -> a) -> StringTemplate a -> StringTemplate a
    +setEncoder x st = st {senv = (senv st) {senc = x} }
    +
    +-- | A special template that simply dumps the values of all the attributes set in it.
    +-- This may be made available to any template as a function by adding it to its group.
    +-- I.e. @ myNewGroup = addSuperGroup myGroup $ groupStringTemplates [("dumpAttribs", dumpAttribs)] @
    +dumpAttribs :: Stringable a => StringTemplate a
    +dumpAttribs = STMP nullEnv (Right $ \env -> showVal env (SM $ smp env)) (const (Nothing, Nothing, Nothing))
    +
    +{--------------------------------------------------------------------
    +  Internal API
    +--------------------------------------------------------------------}
    +--IMPLEMENT groups having stLookup return a Maybe for regions
    +
    +data SEnv a = SEnv {smp :: SMap a, sopts :: [(String, (SEnv a -> SElem a))], sgen :: STGroup a, senc :: a -> a}
    +
    +inSGen :: (STGroup a -> STGroup a) -> StringTemplate a -> StringTemplate a
    +inSGen f st@STMP{senv = env} = st {senv = env {sgen = f (sgen env)} }
    +
    +envLookup :: String -> SEnv a -> Maybe (SElem a)
    +envLookup x = M.lookup x . smp
    +
    +envLookupEx :: String -> SEnv a -> SElem a
    +envLookupEx x snv = case M.lookup x (smp snv) of
    +                      Just a -> a
    +                      Nothing -> case optLookup "throwException" snv of
    +                                   Just _ -> C.throw $ NoAttrib x
    +                                   Nothing -> SNull
    +
    +envInsert :: (String, SElem a) -> SEnv a -> SEnv a
    +envInsert (s, x) y = y {smp = M.insert s x (smp y)}
    +envInsApp :: Stringable a => String -> SElem a -> SEnv a -> SEnv a
    +envInsApp  s  x  y = y {smp = M.insertWith go s x (smp y)}
    +    where go a (LI bs) = LI (a:bs)
    +          go a b = LI [a,b]
    +
    +optLookup :: String -> SEnv a -> Maybe (SEnv a -> SElem a)
    +optLookup x = lookup x . sopts
    +optInsert :: [(String, SEnv a -> SElem a)] -> SEnv a -> SEnv a
    +optInsert x env = env {sopts = x ++ sopts env}
    +nullOpt :: SEnv a -> SElem a
    +nullOpt = fromMaybe (justSTR "") =<< optLookup "null"
    +
    +stLookup :: (Stringable a) => String -> SEnv a -> StringTemplate a
    +stLookup x env = maybe (newSTMP ("No Template Found for: " ++ x))
    +                 (\st-> st {senv = mergeSEnvs env (senv st)}) $ stGetFirst (sgen env x)
    +
    +--merges values of former into latter, preserving encoder
    +--of latter, as well as non-overriden options. group of latter is overridden.
    +mergeSEnvs :: SEnv a -> SEnv a -> SEnv a
    +mergeSEnvs x y = SEnv {smp = M.union (smp x) (smp y), sopts = (sopts y ++ sopts x), sgen = sgen x, senc = senc y}
    +
    +parseSTMP :: (Stringable a) => (Char, Char) -> String -> Either String (SEnv a -> a)
    +parseSTMP x = either (Left . show) Right . runParser (stmpl False) (x,[],[],[]) "" . dropTrailingBr
    +
    +dropTrailingBr :: String -> String
    +dropTrailingBr ('\r':'\n':[]) = []
    +dropTrailingBr ('\n':[]) = []
    +dropTrailingBr [] = []
    +dropTrailingBr (x:xs) = x : dropTrailingBr xs
    +
    +getSeps :: TmplParser (Char, Char)
    +getSeps = (\(x,_,_,_) -> x) <$> getState
    +
    +tellName :: String -> TmplParser ()
    +tellName x = getState >>= \(s,q,n,t) -> setState (s,q,x:n,t)
    +
    +tellQQ :: String -> TmplParser ()
    +tellQQ x = getState >>= \(s,q,n,t) -> setState (s,x:q,n,t)
    +
    +tellTmpl :: String -> TmplParser ()
    +tellTmpl x = getState >>= \(s,q,n,t) -> setState (s,q,n,x:t)
    +
    +-- | Gets all quasiquoted names, normal names & templates used in a given template.
    +-- Must be passed a pair of chars denoting the delimeters to be used.
    +parseSTMPNames :: (Char, Char) -> String -> Either ParseError ([String],[String],[String])
    +parseSTMPNames cs s = runParser getRefs (cs,[],[],[]) "" s
    +    where getRefs = do
    +            (stmpl False :: TmplParser (SEnv String -> String))
    +            (_,qqnames,regnames,tmpls) <- getState
    +            return (qqnames, regnames, tmpls)
    +
    +chkStmp :: Stringable a => (Char, Char) -> String -> SEnv a -> (Maybe String, Maybe [String], Maybe [String])
    +chkStmp cs s snv = case parseSTMPNames cs s of
    +                     Left err -> (Just $ "Parse error: " ++ show err, Nothing, Nothing)
    +                     Right (_, regnames, tmpls) ->
    +                         let nonms   = filter (\x -> not $ elem x (M.keys $ smp snv)) regnames
    +                             notmpls = filter (\x -> isNothing $ stGetFirst (sgen snv x)) tmpls
    +                         in (Nothing, if null nonms then Nothing else Just nonms,
    +                                      if null notmpls then Nothing else Just notmpls)
    +
    +data TmplException = NoAttrib String | NoTmpl String | ParseError String String deriving (Show, Typeable)
    +instance C.Exception TmplException
    +
    +-- | Generic render function for a StringTemplate of any type.
    +renderErr :: Stringable a => String -> StringTemplate a -> a
    +renderErr n t = case runSTMP t of
    +                Right rt -> rt (senv t)
    +                Left err -> case optLookup "throwException" (senv t) of
    +                              Just _ -> C.throw $ ParseError n err
    +                              Nothing -> showStr err (senv t)
    +
    +-- | Returns a tuple of three lists. The first is of templates with parse errors, and their erros. The next is of missing attributes, and the last is of missing templates. If there are no errors, then all lists will be empty.
    +checkTemplateDeep :: (Stringable a, NFData a) => StringTemplate a -> ([(String,String)], [String], [String])
    +checkTemplateDeep t = case runSTMP t of
    +                        Left err -> ([("Top Level Template", err)], [],[])
    +                        Right _ -> unsafePerformIO $ go ([],[],[]) $ inSGen (`mappend` nullGroup) $ optInsertTmpl [("throwException","true")] t
    +    where go (e1,e2,e3) tmpl = (C.evaluate (rnf $ render tmpl) >> return (e1,e2,e3)) `C.catch`
    +                                  \e -> case e of NoTmpl x -> go (e1,e2,x:e3) $ addSub x tmpl
    +                                                  NoAttrib x -> go (e1,x:e2, e3) $ setAttribute x "" tmpl
    +                                                  ParseError n x -> go ((n,x):e1,e2,e3) $ addSub n tmpl
    +          addSub x tmpl = inSGen (mappend $ blankGroup x) tmpl
    +          blankGroup x s = StFirst $ if x == s then Just (newSTMP "") else Nothing
    +          nullGroup x = StFirst $ Just (C.throw $ NoTmpl x)
    +
    +{--------------------------------------------------------------------
    +  Internal API for polymorphic display of elements
    +--------------------------------------------------------------------}
    +
    +mconcatMap' :: Stringable a => SEnv a -> [b] -> (b -> a) -> a
    +mconcatMap' snv xs f = mintercalate sep . map f $ xs
    +    where sep = showVal snv $ fromMaybe (justSTR "") =<< optLookup "separator" $ snv
    +
    +showVal :: Stringable a => SEnv a -> SElem a -> a
    +showVal snv se = case se of
    +                   STR x  -> stEncode x
    +                   BS  x  -> stEncodeBS x
    +                   LI xs  -> joinUpWith showVal xs
    +                   SM sm  -> joinUpWith showAssoc $ M.assocs sm
    +                   STSH x -> stEncode (format x)
    +                   SNAT x -> senc snv x
    +                   SBLE x -> x
    +                   SNull  -> showVal <*> nullOpt $ snv
    +    where format = maybe stshow . stfshow <*> optLookup "format" $ snv
    +          joinUpWith f xs = mconcatMap' snv xs (f snv)
    +          showAssoc e (k,v) = stEncode (k ++ ": ") `mlabel` showVal e v
    +          stEncode   = senc snv . stFromString
    +          stEncodeBS = senc snv . stFromByteString
    +
    +showStr :: Stringable a => String -> SEnv a -> a
    +showStr = const . stFromString
    +
    +{--------------------------------------------------------------------
    +  Utility Combinators
    +--------------------------------------------------------------------}
    +
    +justSTR :: String -> b -> SElem a
    +justSTR = const . STR
    +stshow :: STShow -> String
    +stshow (STShow a) = stringTemplateShow a
    +stfshow :: Stringable a => SEnv a -> (SEnv a -> SElem a) -> STShow -> String
    +stfshow snv fs (STShow a) = stringTemplateFormattedShow
    +                            (stToString <$$> showVal <*> fs $ snv) a
    +
    +around :: Char -> GenParser Char st t -> Char -> GenParser Char st t
    +around x p y = do {char x; v<-p; char y; return v}
    +spaced :: GenParser Char st t -> GenParser Char st t
    +spaced p = do {spaces; v<-p; spaces; return v}
    +word :: GenParser Char st String
    +word = many1 alphaNum
    +comlist :: GenParser Char st a -> GenParser Char st [a]
    +comlist p = spaced (p `sepBy1` spaced (char ','))
    +
    +props :: Stringable a => TmplParser [SEnv a -> SElem a]
    +props = many $ char '.' >> (around '(' subexprn ')' <|> justSTR <$> word)
    +
    +escapedChar, escapedStr :: String -> GenParser Char st String
    +escapedChar chs =
    +    noneOf chs >>= \x -> if x == '\\' then anyChar >>= \y -> return [y] else return [x]
    +escapedStr chs = concat <$> many1 (escapedChar chs)
    +
    +{-
    +escapedStr' chs = dropTrailingBr <$> escapedStr chs
    +-}
    +
    +{--------------------------------------------------------------------
    +  The Grammar
    +--------------------------------------------------------------------}
    +myConcat :: Stringable a => [SEnv a -> a] -> (SEnv a -> a)
    +myConcat xs a = smconcat $ map ($ a) xs
    +
    +
    +-- | if p is true, stmpl can fail gracefully, false it dies hard.
    +-- Set to false at the top level, and true within if expressions.
    +stmpl :: Stringable a => Bool -> TmplParser (SEnv a -> a)
    +stmpl p = do
    +  (ca, cb) <- getSeps
    +  myConcat <$> many (showStr <$> escapedStr [ca] <|> try (around ca optExpr cb)
    +                    <|> try comment <|> bl <?> "template")
    +      where bl | p = try blank | otherwise = blank
    +
    +subStmp :: Stringable a => TmplParser (([SElem a], [SElem a]) -> SEnv a -> a)
    +subStmp = do
    +  (ca, cb) <- getSeps
    +  udEnv <- option (transform ["it"]) (transform <$> try attribNames)
    +  st <- myConcat <$> many (showStr <$> escapedStr (ca:"}|")
    +                         <|> try (around ca optExpr cb)
    +                         <|> try comment <|> blank  <?> "subtemplate")
    +  return (st <$$> udEnv)
    +      where transform an (att,is) =
    +                flip (foldr envInsert) $ zip ("i":"i0":an) (is++att)
    +            attribNames = (char '|' >>) . return =<< comlist (spaced word)
    +
    +comment :: Stringable a => TmplParser (SEnv a -> a)
    +comment = do
    +  (ca, cb) <- getSeps
    +  string [ca,'!'] >> manyTill anyChar (try . string $ ['!',cb])
    +  return (showStr "")
    +
    +blank :: Stringable a => TmplParser (SEnv a -> a)
    +blank = do
    +  (ca, cb) <- getSeps
    +  char ca
    +  spaces
    +  char cb
    +  return (showStr "")
    +
    +optExpr :: Stringable a => TmplParser (SEnv a -> a)
    +optExpr = do
    +  (_, cb) <- getSeps
    +  (try (string ("else"++[cb])) <|> try (string "elseif(") <|>
    +    try (string "endif")) .>> fail "Malformed If Statement." <|> return ()
    +  expr <- try ifstat <|> spaced exprn
    +  opts <- (char ';' >> optList) <|> return []
    +  return $ expr . optInsert opts
    +      where -- opt = around ';' (spaced word) '=' >>= (<$> spaced subexprn) . (,)
    +            optList = sepBy oneOpt (char ',' <|> char ';')
    +            oneOpt = do
    +              o <- spaced word
    +              char '='
    +              v <- spaced subexprn
    +              return (o,v)
    +
    +{--------------------------------------------------------------------
    +  Statements
    +--------------------------------------------------------------------}
    +
    +optLine :: TmplParser ()
    +optLine = optional (char '\r') >> optional (char '\n')
    +
    +--if env then do stuff
    +getProp :: Stringable a => [SEnv a -> SElem a] -> SElem a -> SEnv a -> SElem a
    +getProp (p:ps) (SM mp) env =
    +  case M.lookup (stToString . showVal env $ p env) mp of
    +    Just prop -> getProp ps prop env
    +    Nothing -> SNull
    +getProp (_:_) _ _ = SNull
    +getProp _ se _ = se
    +
    +ifIsSet :: t -> t -> Bool -> SElem a -> t
    +ifIsSet t e n SNull = if n then e else t
    +ifIsSet t e n _ = if n then t else e
    +
    +ifstat ::Stringable a => TmplParser (SEnv a -> a)
    +ifstat = do
    +  (_, cb) <- getSeps
    +  string "if("
    +  n <- option True (char '!' >> return False)
    +  e <- subexprn
    +  p <- props
    +  char ')' >> char cb >> optLine
    +  act <- stmpl True
    +  cont <- (try elseifstat <|> try elsestat <|> endifstat)
    +  return (ifIsSet act cont n =<< getProp p =<< e)
    +
    +elseifstat ::Stringable a => TmplParser (SEnv a -> a)
    +elseifstat = getSeps >>= char . fst >> string "else" >> ifstat
    +
    +elsestat ::Stringable a => TmplParser (SEnv a -> a)
    +elsestat = do
    +  (ca, cb) <- getSeps
    +  around ca (string "else") cb
    +  optLine
    +  act <- stmpl True
    +  char ca >> string "endif"
    +  return act
    +
    +endifstat ::Stringable a => TmplParser (SEnv a -> a)
    +endifstat = getSeps >>= char . fst >> string "endif" >> return (showStr "")
    +
    +{--------------------------------------------------------------------
    +  Expressions
    +--------------------------------------------------------------------}
    +
    +exprn :: Stringable a => TmplParser (SEnv a -> a)
    +exprn = do
    +  exprs <- comlist ( (SBLE <$$> around '(' exprn ')')
    +                     <|> subexprn)
    +             <?> "expression"
    +  templ <- tmplChain
    +  return $ fromMany (showVal <*> head exprs)
    +             ((sequence exprs >>=) . seqTmpls') templ
    +      where tmplChain = many (char ':' >> iterApp <$> comlist (anonTmpl <|> regTemplate)) <?> "template call"
    +
    +seqTmpls' :: Stringable a => [[SElem a] -> SEnv a -> [a]] -> [SElem a] -> SEnv a -> a
    +seqTmpls' tmpls elems snv = mintercalate sep $ seqTmpls tmpls elems snv
    +    where sep = showVal snv $ fromMaybe (justSTR "") =<< optLookup "separator" $ snv
    +
    +seqTmpls :: Stringable a => [[SElem a] -> SEnv a -> [a]] -> [SElem a] -> SEnv a -> [a]
    +seqTmpls [f]    y snv = f y snv
    +seqTmpls (f:fs) y snv = concatMap (\x -> seqTmpls fs x snv) (map ((:[]) . SBLE) $ f y snv)
    +seqTmpls  _ _ _   = [stFromString ""]
    +
    +subexprn :: Stringable a => TmplParser (SEnv a -> SElem a)
    +subexprn = cct <$> spaced
    +            (braceConcat
    +             <|> SBLE <$$> ($ ([SNull],ix0)) <$> try regTemplate
    +             <|> attrib
    +             <|> SBLE <$$> ($ ([SNull],ix0)) <$> anonTmpl
    +             <?> "expression")
    +           `sepBy1` spaced (char '+')
    +    where cct xs@(_:_:_) = SBLE |.
    +                           flip mconcatMap <$> showVal <*> sequence xs
    +          cct [x] = x
    +          cct  _  = const SNull
    +
    +braceConcat :: Stringable a => TmplParser (SEnv a -> SElem a)
    +braceConcat = LI . foldr go [] <$$> sequence <$> around '['(comlist subexprn)']'
    +    where go (LI x) lst = x++lst; go x lst = x:lst
    +
    +literal :: GenParser Char st (b -> SElem a)
    +literal = justSTR <$> (around '"' (concat <$> many (escapedChar "\"")) '"'
    +                   <|> around '\'' (concat <$> many (escapedChar "'")) '\'')
    +
    +attrib :: Stringable a => TmplParser (SEnv a -> SElem a)
    +attrib = do
    +  a <-     literal
    +       <|> try functn
    +       <|> envLookupEx <$> regWord
    +       <|> envLookupEx <$> qqWord
    +       <|> around '(' subexprn ')'
    +          <?> "attribute"
    +  proprs <- props
    +  return $ fromMany a ((a >>=) . getProp) proprs
    +      where qqWord = do
    +              w <- around '`' word '`'
    +              tellQQ w
    +              return $ '`' : w ++ "`"
    +            regWord = do
    +              w <- word
    +              tellName w
    +              return w
    +
    +--add null func
    +functn :: Stringable a => TmplParser (SEnv a -> SElem a)
    +functn = do
    +  f <- string "first" <|> try (string "rest") <|> string "reverse"
    +       <|> string "strip"
    +       <|> try (string "length") <|> string "last" <?> "function"
    +  (fApply f .) <$> around '(' subexprn ')'
    +      where fApply str (LI xs)
    +                | str == "first"  = if null xs then SNull else head xs
    +                | str == "last"   = if null xs then SNull else last xs
    +                | str == "rest"   = if null xs then SNull else (LI . tail) xs
    +                | str == "reverse" = LI . reverse $ xs
    +                | str == "strip"  = LI . filter (not . liNil) $ xs
    +                | str == "length" = STR . show . length $ xs
    +            fApply str x
    +                | str == "rest"   = LI []
    +                | str == "length" = STR "1"
    +                | otherwise       = x
    +            liNil (LI x) = null x
    +            liNil _      = False
    +
    +{--------------------------------------------------------------------
    +  Templates
    +--------------------------------------------------------------------}
    +--change makeTmpl to do notation for clarity?
    +
    +
    +
    +mkIndex :: Num b => [b] -> [[SElem a]]
    +mkIndex = map ((:) . STR . show . (1+) <*> (:[]) . STR . show)
    +ix0 :: [SElem a]
    +ix0 = [STR "1",STR "0"]
    +
    +cycleApp :: (Stringable a) => [([SElem a], [SElem a]) -> SEnv a -> a] -> [([SElem a], [SElem a])]  -> SEnv a -> [a]
    +cycleApp x y snv = map ($ snv) (zipWith ($) (cycle x) y)
    +
    +pluslen :: [a] -> [([a], [SElem b])]
    +pluslen xs = zip (map (:[]) xs) $ mkIndex [0..(length xs)]
    +
    +liTrans :: [SElem a] -> [([SElem a], [SElem a])]
    +liTrans = pluslen' . paddedTrans SNull . map u
    +    where u (LI x) = x; u x = [x]
    +          pluslen' xs = zip xs $ mkIndex [0..(length xs)]
    +
    +--map repeatedly, then finally concat
    +iterApp :: Stringable a => [([SElem a], [SElem a]) -> SEnv a -> a] -> [SElem a] -> SEnv a -> [a]
    +iterApp [f] (LI xs:[])    snv = map (flip f snv) (pluslen xs)
    +iterApp [f] vars@(LI _:_) snv = map (flip f snv) (liTrans vars)
    +iterApp [f] v             snv = [f (v,ix0) snv]
    +iterApp fs (LI xs:[])     snv = cycleApp fs (pluslen xs) snv
    +iterApp fs vars@(LI _:_)  snv = cycleApp fs (liTrans vars) snv
    +iterApp fs xs             snv = cycleApp fs (pluslen xs) snv
    +
    +anonTmpl :: Stringable a => TmplParser (([SElem a], [SElem a]) -> SEnv a -> a)
    +anonTmpl = around '{' subStmp '}'
    +
    +regTemplate :: Stringable a => TmplParser (([SElem a], [SElem a]) -> SEnv a -> a)
    +regTemplate = do
    +  try (functn::TmplParser (SEnv String -> SElem String)) .>> fail "" <|> return ()
    +  name <- justSTR <$> many1 (alphaNum <|> char '/'<|> char '_')
    +          <|> around '(' subexprn ')'
    +  tryTellTmpl (name nullEnv)
    +  vals <- around '(' (spaced $ try assgn <|> anonassgn <|> return []) ')'
    +  return $ join . (. name) . makeTmpl vals
    +      where makeTmpl v ((se:_),is) (STR x)  =
    +                renderErr x |. stBind . (zip ["it","i","i0"] (se:is) ++)
    +                             . swing (map . second) v <*> stLookup x
    +            makeTmpl _ _ _ = showStr "Invalid Template Specified"
    +            stBind v st = st {senv = foldr envInsert (senv st) v}
    +            anonassgn = (:[]) . (,) "it" <$> subexprn
    +            assgn = (spaced word >>= (<$> char '=' .>> spaced subexprn) . (,))
    +                    `sepEndBy1` char ';'
    +            tryTellTmpl (STR x) = tellTmpl x
    +            tryTellTmpl _ = return ()
    +
    +--DEBUG
    +
    +{-pTrace s = pt <|> return ()
    +    where pt = try $
    +               do
    +                 x <- try $ many1 anyChar
    +                 trace (s++": " ++x) $ try $ char 'z'
    +                 fail x
    +-}
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Classes.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Classes.html 1 + + + + +Text/StringTemplate/Classes.hs + + + +
    {-# LANGUAGE ExistentialQuantification, FlexibleInstances, StandaloneDeriving, GeneralizedNewtypeDeriving, TypeSynonymInstances #-}
    +{-# OPTIONS_HADDOCK not-home #-}
    +module Text.StringTemplate.Classes
    +    (SElem(..), StringTemplateShows(..), ToSElem(..), SMap, STShow(..),
    +     StFirst(..), Stringable(..), stShowsToSE
    +    ) where
    +import qualified Data.Map as M
    +import Data.List
    +import Data.Monoid
    +import qualified Data.ByteString.Char8 as B
    +import qualified Data.ByteString.Lazy.Char8 as LB
    +import qualified Data.Text as T
    +import qualified Data.Text.Encoding as T
    +import qualified Data.Text.Lazy as LT
    +import qualified Data.Text.Lazy.Encoding as LT
    +import qualified Text.PrettyPrint.HughesPJ as PP
    +
    +newtype StFirst a = StFirst { stGetFirst :: Maybe a }
    +        deriving (Eq, Ord, Read, Show)
    +instance Monoid (StFirst a) where
    +        mempty = StFirst Nothing
    +        r@(StFirst (Just _)) `mappend` _ = r
    +        StFirst Nothing `mappend` r = r
    +
    +instance Functor StFirst where
    +    fmap f = StFirst . fmap f . stGetFirst
    +
    +type SMap a = M.Map String (SElem a)
    +
    +data SElem a = STR String
    +             | BS LB.ByteString
    +             | STSH STShow
    +             | SM (SMap a)
    +             | LI [SElem a]
    +             | SBLE a
    +             | SNAT a
    +             | SNull
    +
    +-- | The ToSElem class should be instantiated for all types that can be
    +-- inserted as attributes into a StringTemplate.
    +class ToSElem a where
    +    toSElem :: Stringable b => a -> SElem b
    +    toSElemList :: Stringable b => [a] -> SElem b
    +    toSElemList = LI . map toSElem
    +
    +-- | The StringTemplateShows class should be instantiated for all types that are
    +-- directly displayed in a StringTemplate, but take an optional format string. Each such type must have an appropriate ToSElem method defined as well.
    +class (Show a) => StringTemplateShows a where
    +    -- | Defaults to 'show'.
    +    stringTemplateShow :: a -> String
    +    stringTemplateShow = show
    +    -- | Defaults to  @ \ _ a -> stringTemplateShow a @
    +    stringTemplateFormattedShow :: String -> a -> String
    +    stringTemplateFormattedShow = flip $ const . stringTemplateShow
    +
    +-- | This method should be used to create ToSElem instances for
    +-- types defining a custom formatted show function.
    +stShowsToSE :: (StringTemplateShows a, Stringable b) => a -> SElem b
    +stShowsToSE = STSH . STShow
    +
    +data STShow = forall a.(StringTemplateShows a) => STShow a
    +
    +-- | The Stringable class should be instantiated with care.
    +-- Generally, the provided instances should be enough for anything.
    +class Stringable a where
    +    stFromString :: String -> a
    +    stFromByteString :: LB.ByteString -> a
    +    stFromByteString = stFromString . LB.unpack
    +    stToString :: a -> String
    +    -- | Defaults to  @ mconcatMap m k = foldr (mappend . k) mempty m @
    +    mconcatMap :: [b] -> (b -> a) -> a
    +    mconcatMap m k = foldr (smappend . k) smempty m
    +    -- | Defaults to  @ (mconcat .) . intersperse @
    +    mintercalate :: a -> [a] -> a
    +    mintercalate = (smconcat .) . intersperse
    +    -- | Defaults to  @  mlabel x y = smconcat [x, stFromString "[", y, stFromString "]"] @
    +    mlabel :: a -> a -> a
    +    mlabel x y = smconcat [x, stFromString "[", y, stFromString "]"]
    +    -- | Just mempty. Here to avoid orphan instances
    +    smempty :: a
    +    -- | Just mappend. Here to avoid orphan instances
    +    smappend :: a -> a -> a
    +    -- | Just mconcat. Here to avoid orphan instances
    +    smconcat :: [a] -> a
    +    smconcat xs = foldr (smappend . id) smempty xs
    +
    +instance Stringable String where
    +    stFromString = id
    +    stToString = id
    +    smempty = ""
    +    smappend = (++)
    +
    +instance Stringable PP.Doc where
    +    stFromString = PP.text
    +    stToString = PP.render
    +    mconcatMap m k = PP.fcat . map k $ m
    +    mintercalate = (PP.fcat .) . PP.punctuate
    +    mlabel x y = x PP.$$ PP.nest 1 y
    +    smempty = PP.empty
    +    smappend = (PP.<>)
    +
    +instance Stringable B.ByteString where
    +    stFromString = B.pack
    +    stFromByteString = B.concat . LB.toChunks
    +    stToString = B.unpack
    +    smempty = B.empty
    +    smappend = B.append
    +
    +instance Stringable LB.ByteString where
    +    stFromString = LB.pack
    +    stFromByteString = id
    +    stToString = LB.unpack
    +    smempty = LB.empty
    +    smappend = LB.append
    +
    +instance Stringable T.Text where
    +    stFromString = T.pack
    +    stFromByteString = T.decodeUtf8 . B.concat . LB.toChunks
    +    stToString = T.unpack
    +    smempty = T.empty
    +    smappend = T.append
    +
    +instance Stringable LT.Text where
    +    stFromString = LT.pack
    +    stFromByteString = LT.decodeUtf8
    +    stToString = LT.unpack
    +    smempty = LT.empty
    +    smappend = LT.append
    +
    +--add dlist instance
    +instance Stringable (Endo String) where
    +    stFromString = Endo . (++)
    +    stToString = ($ []) . appEndo
    +    smempty = mempty
    +    smappend = mappend
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-GenericStandard.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-GenericStandard.html 1 + + + + +Text/StringTemplate/GenericStandard.hs + + + +
    {-# LANGUAGE FlexibleInstances, OverlappingInstances, UndecidableInstances, Rank2Types, ScopedTypeVariables #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +--------------------------------------------------------------------
    +-- | Generic Instance for ToSElem using standard Data.Generic libraries.
    +--------------------------------------------------------------------}
    +
    +module Text.StringTemplate.GenericStandard() where
    +import qualified Data.Map as M
    +import Text.StringTemplate.Classes
    +import Text.StringTemplate.Instances()
    +import Data.Generics.Basics
    +import Data.Generics.Aliases
    +import qualified Data.Map as M
    +import qualified Data.ByteString.Char8 as B
    +import qualified Data.ByteString.Lazy.Char8 as LB
    +import Data.Maybe
    +-- import qualified System.Time as OldTime
    +-- import System.Locale
    +-- import Data.Time
    +import qualified Data.Text as T
    +import qualified Data.Text.Lazy as LT
    +
    +gToSElem :: forall a b.(Data a, Stringable b) => a -> SElem b
    +gToSElem = (\x ->
    +            case (map stripInitUnder (constrFields . toConstr $ x)) of
    +              [] -> LI (STR (showConstr (toConstr x)) :
    +                        gmapQ gToSElem x)
    +              fs -> SM (M.fromList (zip fs (gmapQ gToSElem x)))
    +           )
    +           `ext1Q` (\t -> case t of (Just x) -> gToSElem x; _ -> SNull)
    +           `ext1Q` (SM . fmap gToSElem)
    +           `ext1Q` (LI . map gToSElem)
    +           -- `extQ` (toSElem :: OldTime.CalendarTime -> SElem b)
    +           -- `extQ` (toSElem :: OldTime.TimeDiff -> SElem b)
    +           -- `extQ` (toSElem :: TimeOfDay -> SElem b)
    +           -- `extQ` (toSElem :: UTCTime -> SElem b)
    +           -- `extQ` (toSElem :: TimeZone -> SElem b)
    +           -- `extQ` (toSElem :: ZonedTime -> SElem b)
    +           -- `extQ` (toSElem :: Day -> SElem b)
    +           -- `extQ` (toSElem :: LocalTime -> SElem b)
    +           `extQ` (toSElem :: LB.ByteString -> SElem b)
    +           `extQ` (toSElem :: B.ByteString -> SElem b)
    +           `extQ` (toSElem :: LT.Text -> SElem b)
    +           `extQ` (toSElem :: T.Text -> SElem b)
    +           `extQ` (toSElem :: Bool -> SElem b)
    +           `extQ` (toSElem :: Float -> SElem b)
    +           `extQ` (toSElem :: Double -> SElem b)
    +           `extQ` (toSElem :: Int -> SElem b)
    +           `extQ` (toSElem :: Integer -> SElem b)
    +           `extQ` (toSElem :: String -> SElem b)
    +
    +
    +instance Data a => ToSElem a
    +    where toSElem = gToSElem
    +
    +stripInitUnder :: String -> String
    +stripInitUnder ('_':s) = stripInitUnder s
    +stripInitUnder s       = s
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-GenericWithClass.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-GenericWithClass.html 1 + + + + +Text/StringTemplate/GenericWithClass.hs + + + +
    {-# LANGUAGE FlexibleInstances, OverlappingInstances, FlexibleContexts, UndecidableInstances, Rank2Types #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +--------------------------------------------------------------------
    +-- | Generic Instance for ToSElem using syb-with-class.
    +--   Inspired heavily-to-entirely by Alex Drummond's RJson.
    +--------------------------------------------------------------------}
    +
    +module Text.StringTemplate.GenericWithClass() where
    +import qualified Data.Map as M
    +import Text.StringTemplate.Classes
    +import Data.Generics.SYB.WithClass.Basics
    +
    +stripInitialUnderscores :: String -> String
    +stripInitialUnderscores ('_':s) = stripInitialUnderscores s
    +stripInitialUnderscores s       = s
    +
    +data ToSElemD a = ToSElemD { toSElemD :: Stringable b => a -> SElem b }
    +
    +toSElemProxy :: Proxy ToSElemD
    +toSElemProxy = error "This value should never be evaluated!"
    +
    +instance (ToSElem a, Data ToSElemD a) => Sat (ToSElemD a) where
    +   dict = ToSElemD { toSElemD = toSElem }
    +
    +genericToSElem :: (Data ToSElemD a, ToSElem a, Stringable b) => a -> SElem b
    +genericToSElem x
    +       | isAlgType (dataTypeOf toSElemProxy x) =
    +           case (map stripInitialUnderscores (getFields x)) of
    +             [] -> LI (STR (showConstr (toConstr toSElemProxy x)) :
    +                           gmapQ toSElemProxy (toSElemD dict) x)
    +             fs -> SM (M.fromList (zip fs (gmapQ toSElemProxy (toSElemD dict) x)))
    +       | True =
    +               error ("Unable to serialize the primitive type '" ++
    +                      dataTypeName (dataTypeOf toSElemProxy x) ++ "'")
    +
    +getFields :: Data ToSElemD a => a -> [String]
    +getFields = constrFields . toConstr toSElemProxy
    +
    +instance Data ToSElemD t => ToSElem t where
    +   toSElem = genericToSElem
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Group.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Group.html 1 + + + + +Text/StringTemplate/Group.hs + + + +
    {-# LANGUAGE BangPatterns #-}
    +{-# OPTIONS_HADDOCK not-home #-}
    +
    +module Text.StringTemplate.Group
    +    (groupStringTemplates, addSuperGroup, addSubGroup, setEncoderGroup,
    +     mergeSTGroups, directoryGroup, optInsertGroup,
    +     directoryGroupLazy, directoryGroupRecursive, directoryGroupRecursiveLazy,
    +     unsafeVolatileDirectoryGroup, nullGroup
    +    ) where
    +import Control.Applicative
    +import Control.Arrow
    +import Control.Monad
    +import Data.Monoid
    +import Data.List
    +import System.Time
    +import System.FilePath
    +import System.Directory
    +import Data.IORef
    +import System.IO.Unsafe
    +import System.IO.Error
    +import System.IO.UTF8 as U
    +import qualified Data.Map as M
    +
    +import Text.StringTemplate.Base
    +import Text.StringTemplate.Classes
    +
    +{--------------------------------------------------------------------
    +  Utilities
    +--------------------------------------------------------------------}
    +
    +(<$$>) :: (Functor f1, Functor f) => (a -> b) -> f (f1 a) -> f (f1 b)
    +(<$$>) = (<$>) . (<$>)
    +
    +readFile' :: FilePath -> IO String
    +readFile' f = do
    +  x <- U.readFile f
    +  length x `seq` return x
    +
    +groupFromFiles :: Stringable a => (FilePath -> IO String) -> [(FilePath,String)] -> IO (STGroup a)
    +groupFromFiles rf fs = groupStringTemplates <$> forM fs  (\(f,fname) -> do
    +     stmp <- newSTMP <$> rf f
    +     return (fname, stmp))
    +
    +getTmplsRecursive :: FilePath -> FilePath -> IO [(FilePath, FilePath)]
    +getTmplsRecursive base fp = do
    +          dirContents <- filter (not . isPrefixOf ".") <$> getDirectoryContents fp
    +          subDirs <- filterM (doesDirectoryExist . (fp </>)) dirContents
    +          subs <- concat <$> mapM (\x -> getTmplsRecursive (base </> x) (fp </> x)) subDirs
    +          return $ (map ((fp </>) &&& (\x -> base </> dropExtension x)) $
    +                    filter ((".st" ==) . takeExtension) dirContents)
    +                   ++ subs
    +
    +{--------------------------------------------------------------------
    +  Group API
    +--------------------------------------------------------------------}
    +
    +-- | Given a list of named of StringTemplates, returns a group which generates
    +-- them such that they can call one another.
    +groupStringTemplates :: [(String,StringTemplate a)] -> STGroup a
    +groupStringTemplates xs = newGen
    +    where newGen s = StFirst (M.lookup s ng)
    +          ng = M.fromList $ map (second $ inSGen (`mappend` newGen)) xs
    +
    +-- | Given a path, returns a group which generates all files in said directory
    +-- which have the proper \"st\" extension.
    +-- This function is strict, with all files read once. As it performs file IO,
    +-- expect it to throw the usual exceptions.
    +directoryGroup :: (Stringable a) => FilePath -> IO (STGroup a)
    +directoryGroup path =
    +    groupFromFiles readFile' .
    +    map ((</>) path &&& takeBaseName) . filter ((".st" ==) . takeExtension) =<<
    +    getDirectoryContents path
    +
    +-- | Given a path, returns a group which generates all files in said directory
    +-- which have the proper \"st\" extension.
    +-- This function is lazy in the same way that readFile is lazy, with all
    +-- files read on demand, but no more than once. The list of files, however,
    +-- is generated at the time the function is called. As this performs file IO,
    +-- expect it to throw the usual exceptions. And, as it is lazy, expect
    +-- these exceptions in unexpected places.
    +directoryGroupLazy :: (Stringable a) => FilePath -> IO (STGroup a)
    +directoryGroupLazy path =
    +    groupFromFiles U.readFile .
    +    map ((</>) path &&& takeBaseName) . filter ((".st" ==) . takeExtension) =<<
    +    getDirectoryContents path
    +
    +-- | As with 'directoryGroup', but traverses subdirectories as well. A template named
    +-- \"foo/bar.st\" may be referenced by \"foo/bar\" in the returned group.
    +directoryGroupRecursive :: (Stringable a) => FilePath -> IO (STGroup a)
    +directoryGroupRecursive path = groupFromFiles readFile' =<< getTmplsRecursive "" path
    +
    +-- | See documentation for 'directoryGroupRecursive'.
    +directoryGroupRecursiveLazy :: (Stringable a) => FilePath -> IO (STGroup a)
    +directoryGroupRecursiveLazy path = groupFromFiles U.readFile =<< getTmplsRecursive "" path
    +
    +-- | Adds a supergroup to any StringTemplate group such that templates from
    +-- the original group are now able to call ones from the supergroup as well.
    +addSuperGroup :: STGroup a -> STGroup a -> STGroup a
    +addSuperGroup f g = inSGen (`mappend` g) <$$> f
    +
    +-- | Adds a \"subgroup\" to any StringTemplate group such that templates from
    +-- the original group now have template calls \"shadowed\" by the subgroup.
    +addSubGroup :: STGroup a -> STGroup a -> STGroup a
    +addSubGroup f g = inSGen (g `mappend`) <$$> f
    +
    +-- | Merges two groups into a single group. This function is left-biased,
    +-- prefering bindings from the first group when there is a conflict.
    +mergeSTGroups :: STGroup a -> STGroup a -> STGroup a
    +mergeSTGroups f g = addSuperGroup f g `mappend` addSubGroup g f
    +
    +-- | Adds a set of global options to a group
    +optInsertGroup :: [(String, String)] -> STGroup a -> STGroup a
    +optInsertGroup opts f = (inSGen (optInsertGroup opts) . optInsertTmpl opts) <$$> f
    +
    +-- | Sets an encoding function of a group that all values are
    +-- rendered with in each enclosed template
    +setEncoderGroup :: (Stringable a) => (a -> a) ->  STGroup a -> STGroup a
    +setEncoderGroup x f = (inSGen (setEncoderGroup x) . setEncoder x) <$$> f
    +
    +-- | For any requested template, returns a message that the template was
    +-- unable to be found. Useful to add as a super group for a set of templates
    +-- under development, to aid in debugging.
    +nullGroup :: Stringable a => STGroup a
    +nullGroup x = StFirst . Just . newSTMP $ "Could not find template: " ++ x
    +
    +-- | Given an integral amount of seconds and a path, returns a group generating
    +-- all files in said directory and subdirectories with the proper \"st\" extension,
    +-- cached for that amount of seconds. IO errors are \"swallowed\" by this so
    +-- that exceptions don't arise in unexpected places.
    +-- This violates referential transparency, but can be very useful in developing
    +-- templates for any sort of server application. It should be swapped out for
    +-- production purposes. The dumpAttribs template is added to the returned group
    +-- by default, as it should prove useful for debugging and developing templates.
    +unsafeVolatileDirectoryGroup :: Stringable a => FilePath -> Int -> IO (STGroup a)
    +unsafeVolatileDirectoryGroup path m = return . flip addSubGroup extraTmpls $ cacheSTGroup stfg
    +    where stfg = StFirst . Just . newSTMP . unsafePerformIO . flip catch
    +                       (return . (\e -> "IO Error: " ++ show (ioeGetFileName e) ++ " -- " ++ ioeGetErrorString e))
    +                 . U.readFile . (path </>) . (++".st")
    +          extraTmpls = addSubGroup (groupStringTemplates [("dumpAttribs", dumpAttribs)]) nullGroup
    +          cacheSTGroup :: STGroup a -> STGroup a
    +          cacheSTGroup g = unsafePerformIO $ do
    +                             !ior <- newIORef M.empty
    +                             return $ \s -> unsafePerformIO $ do
    +                               mp  <- readIORef ior
    +                               curtime <- getClockTime
    +                               let udReturn now = do
    +                                       let st = g s
    +                                       atomicModifyIORef ior $
    +                                         flip (,) () . M.insert s (now, st)
    +                                       return st
    +                               case M.lookup s mp of
    +                                 Nothing -> udReturn curtime
    +                                 Just (t, st) ->
    +                                     if (tdSec . normalizeTimeDiff $
    +                                               diffClockTimes curtime t) > m
    +                                       then udReturn curtime
    +                                       else return st
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Instances.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Instances.html 1 + + + + +Text/StringTemplate/Instances.hs + + + +
    {-# LANGUAGE FlexibleInstances, OverlappingInstances #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +{-# OPTIONS_HADDOCK not-home #-}
    +
    +module Text.StringTemplate.Instances() where
    +import Text.StringTemplate.Classes
    +
    +import qualified Data.Map as M
    +import Numeric
    +import qualified Data.ByteString.Char8 as B
    +import qualified Data.ByteString.Lazy.Char8 as LB
    +import Data.Ratio
    +import Data.Array
    +import Data.Maybe
    +import qualified Data.Foldable as F
    +import qualified System.Time as OldTime
    +import System.Locale
    +import Data.Time
    +import qualified Data.Text as T
    +import qualified Data.Text.Encoding as T
    +import qualified Data.Text.Lazy as LT
    +import qualified Data.Text.Lazy.Encoding as LT
    +
    +
    +{--------------------------------------------------------------------
    +  Additional instances for items that may be set as StringTemplate
    +  attributes. The code should provide examples of how to proceed.
    +--------------------------------------------------------------------}
    +
    +--Basics
    +instance ToSElem Char where
    +    toSElem = STR . (:[])
    +    toSElemList = STR
    +
    +instance ToSElem LB.ByteString where
    +    toSElem = BS
    +
    +instance ToSElem B.ByteString where
    +    toSElem = BS . LB.fromChunks . (:[])
    +
    +instance ToSElem LT.Text where
    +    toSElem = BS . LT.encodeUtf8
    +
    +instance ToSElem T.Text where
    +    toSElem = BS . LB.fromChunks . (:[]) . T.encodeUtf8
    +
    +instance ToSElem Bool where
    +    toSElem True = STR ""
    +    toSElem _ = SNull
    +
    +instance (ToSElem a) => ToSElem (Maybe a) where
    +    toSElem (Just x) = toSElem x
    +    toSElem _ = SNull
    +
    +instance (ToSElem a) => ToSElem (M.Map String a) where
    +    toSElem = SM . fmap toSElem
    +
    +instance (ToSElem a) => ToSElem [a] where
    +    toSElem = toSElemList
    +
    +instance (ToSElem a, Ix i) => ToSElem (Array i a) where
    +   toSElem = toSElem . elems
    +
    +instance (ToSElem a, F.Foldable t) => ToSElem (t a) where
    +    toSElem = toSElemList . F.toList
    +
    +--Numbers
    +instance StringTemplateShows Float where
    +    stringTemplateShow = flip showFloat ""
    +    stringTemplateFormattedShow = flip flip [] . showGFloat . fmap fst . listToMaybe . reads
    +instance ToSElem Float where
    +    toSElem = stShowsToSE
    +
    +instance StringTemplateShows Double where
    +    stringTemplateShow = flip showFloat ""
    +    stringTemplateFormattedShow = flip flip [] . showGFloat . fmap fst . listToMaybe . reads
    +instance ToSElem Double where
    +    toSElem = stShowsToSE
    +
    +instance ToSElem Int where
    +    toSElem = STR . show
    +
    +instance ToSElem Integer where
    +    toSElem = STR . show
    +
    +instance Integral a => ToSElem (Ratio a) where
    +    toSElem = STR . show
    +
    +--Dates and Times
    +instance StringTemplateShows OldTime.CalendarTime where
    +    stringTemplateShow = OldTime.calendarTimeToString
    +    stringTemplateFormattedShow = OldTime.formatCalendarTime defaultTimeLocale
    +instance ToSElem OldTime.CalendarTime where
    +    toSElem = stShowsToSE
    +
    +instance StringTemplateShows OldTime.TimeDiff where
    +    stringTemplateShow = OldTime.timeDiffToString
    +    stringTemplateFormattedShow = OldTime.formatTimeDiff defaultTimeLocale
    +instance ToSElem OldTime.TimeDiff where
    +    toSElem = stShowsToSE
    +
    +instance StringTemplateShows Day where
    +    stringTemplateShow = show
    +    stringTemplateFormattedShow = formatTime defaultTimeLocale
    +instance ToSElem Day where
    +    toSElem = stShowsToSE
    +
    +instance StringTemplateShows LocalTime where
    +    stringTemplateShow = show
    +    stringTemplateFormattedShow = formatTime defaultTimeLocale
    +instance ToSElem LocalTime where
    +    toSElem = stShowsToSE
    +
    +instance StringTemplateShows TimeOfDay where
    +    stringTemplateShow = show
    +    stringTemplateFormattedShow = formatTime defaultTimeLocale
    +instance ToSElem TimeOfDay where
    +    toSElem = stShowsToSE
    +
    +instance StringTemplateShows UTCTime where
    +    stringTemplateShow = show
    +    stringTemplateFormattedShow = formatTime defaultTimeLocale
    +instance ToSElem UTCTime where
    +    toSElem = stShowsToSE
    +
    +instance StringTemplateShows TimeZone where
    +    stringTemplateShow = show
    +    stringTemplateFormattedShow = formatTime defaultTimeLocale
    +instance ToSElem TimeZone where
    +    toSElem = stShowsToSE
    +
    +instance StringTemplateShows ZonedTime where
    +    stringTemplateShow = show
    +    stringTemplateFormattedShow = formatTime defaultTimeLocale
    +instance ToSElem ZonedTime where
    +    toSElem = stShowsToSE
    +
    +t2map :: [SElem a] -> SElem a
    +t2map = SM . M.fromList . zip (map show [(0::Int)..])
    +
    +instance (ToSElem a, ToSElem b) => ToSElem (a, b) where
    +   toSElem (a,b) = t2map [toSElem a, toSElem b]
    +instance (ToSElem a, ToSElem b, ToSElem c) => ToSElem (a, b, c) where
    +   toSElem (a,b,c) = t2map [toSElem a, toSElem b, toSElem c]
    +instance (ToSElem a, ToSElem b, ToSElem c, ToSElem d) => ToSElem (a, b, c, d) where
    +   toSElem (a,b,c,d) = t2map [toSElem a, toSElem b, toSElem c, toSElem d]
    +instance (ToSElem a, ToSElem b, ToSElem c, ToSElem d, ToSElem e) => ToSElem (a, b, c, d, e) where
    +   toSElem (a,b,c,d,e) = t2map [toSElem a, toSElem b, toSElem c, toSElem d, toSElem e]
    +instance (ToSElem a, ToSElem b, ToSElem c, ToSElem d, ToSElem e, ToSElem f) => ToSElem (a, b, c, d, e, f) where
    +   toSElem (a,b,c,d,e, f) = t2map [toSElem a, toSElem b, toSElem c, toSElem d, toSElem e, toSElem f]
    +instance (ToSElem a, ToSElem b, ToSElem c, ToSElem d, ToSElem e, ToSElem f, ToSElem g) => ToSElem (a, b, c, d, e, f, g) where
    +   toSElem (a,b,c,d,e,f,g) = t2map [toSElem a, toSElem b, toSElem c, toSElem d, toSElem e, toSElem f, toSElem g]
    +instance (ToSElem a, ToSElem b, ToSElem c, ToSElem d, ToSElem e, ToSElem f, ToSElem g, ToSElem h) => ToSElem (a, b, c, d, e, f, g, h) where
    +   toSElem (a,b,c,d,e,f,g,h) = t2map [toSElem a, toSElem b, toSElem c, toSElem d, toSElem e, toSElem f, toSElem g, toSElem h]
    +instance (ToSElem a, ToSElem b, ToSElem c, ToSElem d, ToSElem e, ToSElem f, ToSElem g, ToSElem h, ToSElem i) => ToSElem (a, b, c, d, e, f, g, h, i) where
    +   toSElem (a,b,c,d,e,f,g,h,i) = t2map [toSElem a, toSElem b, toSElem c, toSElem d, toSElem e, toSElem f, toSElem g, toSElem h, toSElem i]
    +instance (ToSElem a, ToSElem b, ToSElem c, ToSElem d, ToSElem e, ToSElem f, ToSElem g, ToSElem h, ToSElem i, ToSElem j) => ToSElem (a, b, c, d, e, f, g, h, i, j) where
    +   toSElem (a,b,c,d,e,f,g,h,i,j) = t2map [toSElem a, toSElem b, toSElem c, toSElem d, toSElem e, toSElem f, toSElem g, toSElem h, toSElem i, toSElem j]
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-QQ.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-QQ.html 1 + + + + +Text/StringTemplate/QQ.hs + + + +
    {-# LANGUAGE DeriveDataTypeable, QuasiQuotes #-}
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Text.StringTemplate.QQ
    +-- Copyright   :  (c) Sterling Clover 2009
    +-- License     :  BSD 3 Clause
    +-- Maintainer  :  s.clover@gmail.com
    +-- Stability   :  experimental
    +-- Portability :  portable
    +--
    +-- This module provides stmp, a quasi-quoter for StringTemplate expressions.
    +-- Quoted templates are guaranteed syntactically well-formed at compile time,
    +-- and antiquotation (of identifiers only) is provided by backticks.
    +-- Usage: @ let var = [0,1,2] in toString [$stmp|($\`var\`; separator = ', '$)|] === \"(0, 1, 2)\"@
    +-----------------------------------------------------------------------------
    +
    +module Text.StringTemplate.QQ (stmp) where
    +
    +import qualified Language.Haskell.TH as TH
    +import Language.Haskell.TH.Quote
    +import Text.StringTemplate.Base
    +import Control.Monad.Writer
    +
    +quoteTmplExp :: String -> TH.ExpQ
    +quoteTmplPat :: String -> TH.PatQ
    +
    +stmp :: QuasiQuoter
    +stmp = QuasiQuoter quoteTmplExp quoteTmplPat
    +
    +quoteTmplPat = error "Cannot apply stmp quasiquoter in patterns"
    +quoteTmplExp s = return tmpl
    +  where
    +    vars = case parseSTMPNames ('$','$') s of
    +             Right (xs,_,_) -> xs
    +             Left  err -> fail $ show err
    +    base  = TH.AppE (TH.VarE (TH.mkName "newSTMP")) (TH.LitE (TH.StringL s))
    +    tmpl  = foldr addAttrib base vars
    +    addAttrib var = TH.AppE
    +        (TH.AppE (TH.AppE (TH.VarE (TH.mkName "setAttribute"))
    +                          (TH.LitE (TH.StringL ('`' : var ++ "`"))))
    +                 (TH.VarE (TH.mkName  var)))
    +
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Renderf.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate-Renderf.html 1 + + + + +Text/StringTemplate/Renderf.hs + + + +
    {-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
    +module Text.StringTemplate.Renderf ((|=), SEType(..)) where
    +import Text.StringTemplate.Base
    +
    +class Stringable b => SEType b a where
    +    renderf :: StringTemplate b -> a
    +instance Stringable a => SEType a a where
    +    renderf = render
    +instance Stringable a => SEType a (StringTemplate a) where
    +    renderf = id
    +instance (ToSElem a, SEType b r) => SEType b ((String, a) -> r) where
    +    renderf x (k, v) = renderf $ setAttribute k v x
    +
    +(|=) :: (Monad m) => a -> m a1 -> m (a, a1)
    +k |= v = return . (,) k =<< v
    +infixl 5 |=
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate.html hunk ./docs/0.5.0/HStringTemplate/src/Text-StringTemplate.html 1 + + + + +Text/StringTemplate.hs + + + +
    -----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Text.StringTemplate
    +-- Copyright   :  (c) Sterling Clover 2008
    +-- License     :  BSD 3 Clause
    +-- Maintainer  :  s.clover@gmail.com
    +-- Stability   :  experimental
    +-- Portability :  portable
    +--
    +-- A StringTemplate is a String with \"holes\" in it.
    +-- This is a port of the Java StringTemplate library written by Terrence Parr.
    +-- (<http://www.stringtemplate.org>). User-contributed documentation available at
    +-- <http://www.haskell.org/haskellwiki/HStringTemplate>.
    +--
    +-- This library implements the basic 3.1 grammar, lacking group files
    +-- (though not groups themselves), Regions, and Interfaces.
    +-- The goal is not to blindly copy the StringTemplate API, but rather to
    +-- take its central ideas and implement them in a Haskellish manner.
    +-- Indentation and wrapping, for example, are implemented through the
    +-- HughesPJ Pretty Printing library. Calling toPPDoc on a StringTemplate
    +-- yields a Doc with appropriate paragraph-fill wrapping that can be
    +-- rendered in the usual fashion.
    +--
    +-- Basic instances are provided of the StringTemplateShows and ToSElem class.
    +-- Any type deriving ToSElem can be passed automatically as a StringTemplate
    +-- attribute. This package can be installed with syb-with-class bindings
    +-- that provide a ToSElem instance for anything deriving
    +-- 'Data.Generics.SYB.WithClass.Basics.Data'. When defining an instance of
    +-- ToSElem that can take a format parameter, you should first define an
    +-- instance of StringTemplateShows, and then define an instance of ToSElem
    +-- where @ toSElem = stShowsToSE@.
    +-----------------------------------------------------------------------------
    +
    +module Text.StringTemplate (
    +  -- * Types
    +  StringTemplate, STGroup,
    +  -- * Classes
    +  ToSElem(..), StringTemplateShows(..), stShowsToSE, Stringable(..), SEType(..),
    +  -- * Creation
    +  newSTMP, newAngleSTMP, getStringTemplate, getStringTemplate',
    +  -- * Display
    +  toString, toPPDoc, render, dumpAttribs, checkTemplate, checkTemplateDeep,
    +  -- * Modification
    +  setAttribute, (|=), setManyAttrib,
    +  setNativeAttribute, setManyNativeAttrib,
    +  withContext,
    +  optInsertTmpl, optInsertGroup,
    +  setEncoder, setEncoderGroup,
    +  -- * Groups
    +  groupStringTemplates, addSuperGroup, addSubGroup,
    +  mergeSTGroups, directoryGroup, unsafeVolatileDirectoryGroup,
    +  directoryGroupRecursive, directoryGroupRecursiveLazy,
    +  directoryGroupLazy, nullGroup
    +  ) where
    +import Text.StringTemplate.Base
    +import Text.StringTemplate.Group
    +import Text.StringTemplate.Renderf
    +import Text.StringTemplate.Instances()
    +
    + addfile ./docs/0.5.0/HStringTemplate/src/hscolour.css hunk ./docs/0.5.0/HStringTemplate/src/hscolour.css 1 +.hs-keyglyph, .hs-layout {color: red;} +.hs-keyword {color: blue;} +.hs-comment, .hs-comment a {color: green;} +.hs-str, .hs-chr {color: teal;} +.hs-keyword, .hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {} addfile ./docs/0.5.0/doc-index-124.html hunk ./docs/0.5.0/doc-index-124.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (|)
    |=
    |||
    addfile ./docs/0.5.0/doc-index-38.html hunk ./docs/0.5.0/doc-index-38.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (&)
    &&&
    addfile ./docs/0.5.0/doc-index-46.html hunk ./docs/0.5.0/doc-index-46.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (.)
    .^
    addfile ./docs/0.5.0/doc-index-58.html hunk ./docs/0.5.0/doc-index-58.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (:)
    :+:
    1 (Data Constructor)
    2 (Type/Class)
    addfile ./docs/0.5.0/doc-index-60.html hunk ./docs/0.5.0/doc-index-60.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (<)
    </<
    <>
    addfile ./docs/0.5.0/doc-index-64.html hunk ./docs/0.5.0/doc-index-64.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (@)
    @*
    @+
    @<
    @<=
    @=
    @>
    @><
    @><=
    @>=
    @>=<
    @>=<=
    addfile ./docs/0.5.0/doc-index-A.html hunk ./docs/0.5.0/doc-index-A.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (A)
    aConstrFromElements
    addAnalytics
    addCookie
    addCookies
    addHeader
    addHeaderBS
    addHeaderM
    addHeaderUnsafe
    addItem
    addSubGroup
    addSuperGroup
    addTxId
    allStateTypes
    always
    analytics
    AnyEv
    anyPath
    anyPath'
    anyRequest
    Append
    applyMD5Rounds
    applyRequest
    asContentType
    askRq
    askState
    AsPairs
    asProxyType
    1 (Function)
    2 (Function)
    asQuery
    asUpdate
    Attr
    attrF
    attrFMb
    attrFS
    autoBuild
    a_path
    a_scheme
    addfile ./docs/0.5.0/doc-index-B.html hunk ./docs/0.5.0/doc-index-B.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (B)
    badGateway
    badRequest
    basicAuth
    binarylocation
    bindPort
    blockDotFiles
    Body
    body
    bodyInput
    bodyPartToInput
    boolM
    breakChar
    breakCharEnd
    BS
    ByteCount
    addfile ./docs/0.5.0/doc-index-C.html hunk ./docs/0.5.0/doc-index-C.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (C)
    calcs
    cast
    CatchEv
    catchEv
    CData
    cdataElem
    change
    checkDiff
    checkTemplate
    checkTemplateDeep
    chkSTMP
    chop72
    ClockTime
    Collect
    collectHandlers
    collectHandlers'
    Collection
    1 (Data Constructor)
    2 (Type/Class)
    collectVersions
    1 (Function)
    2 (Function)
    comp
    Component
    componentIO
    ComponentTree
    ComponentVersions
    componentVersions
    composeFilter
    compressedResponseFilter
    Conf
    1 (Data Constructor)
    2 (Type/Class)
    CONNECT
    constrFromElements
    constrFromElementsNoRootDefault
    constr[a74A]
    constr[a74y]
    constr[a74z]
    constr[afDd]
    constr[afDn]
    constr[anFW]
    constr[apow]
    contain
    1 (Function)
    2 (Function)
    Contained
    1 (Type/Class)
    2 (Type/Class)
    ContentType
    1 (Data Constructor)
    2 (Type/Class)
    continueHTTP
    Cookie
    1 (Data Constructor)
    2 (Type/Class)
    cookieDomain
    cookieName
    cookiePath
    cookiesParser
    cookieValue
    cookieVersion
    createCheckpoint
    createEventMap
    createNewTxRun
    createReader
    createWriter
    cron
    CSS
    ctlAllComponents
    ctlChildren
    ctlComponentVersions
    ctlCreateCheckpoint
    ctlEventSaver
    ctlPrefixLock
    ctlSaver
    ctParameters
    ctSubtype
    ctType
    addfile ./docs/0.5.0/doc-index-D.html hunk ./docs/0.5.0/doc-index-D.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (D)
    daemonize
    dataType[a74x]
    dataType[afDc]
    dataType[afDm]
    dataType[anFV]
    dataType[apov]
    debug
    debugFilter
    debugM
    decode
    decodeBody
    Default
    DefaultD
    1 (Data Constructor)
    2 (Type/Class)
    defaultDefaultValue
    defaultInputType
    defaultIxFiles
    defaultNormalize
    defaultNormalizeRecursively
    defaultProxy
    defaultReadXml
    defaultReadXml'
    defaultToXml
    defaultValue
    defaultValueD
    deflateFilter
    DELETE
    delete
    1 (Function)
    2 (Function)
    deleteIx
    Dependencies
    deriveAll
    deriveNewData
    deriveNewDataNoDefault
    deriveSerialize
    1 (Function)
    2 (Function)
    deriveSerializeFor
    1 (Function)
    2 (Function)
    deserialize
    1 (Function)
    2 (Function)
    deserializeObject
    1 (Function)
    2 (Function)
    des_dec
    des_decrypt
    des_enc
    des_encrypt
    dir
    directoryGroup
    directoryGroupLazy
    directoryGroupRecursive
    directoryGroupRecursiveLazy
    dirs
    doIndex
    doIndex'
    doIndexLazy
    doIndexStrict
    doXslt
    dropSpace
    dropSpaceEnd
    dumpAttribs
    dup
    addfile ./docs/0.5.0/doc-index-E.html hunk ./docs/0.5.0/doc-index-E.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (E)
    e
    EH
    Elem
    Element
    1 (Type/Class)
    2 (Type/Class)
    elF
    ElString
    1 (Data Constructor)
    2 (Type/Class)
    elString
    emitEvent
    emitEvent'
    emitFunc
    EmitInternal
    1 (Data Constructor)
    2 (Type/Class)
    emitRef
    empty
    emptyElem
    Enc
    encode
    encodings
    End
    1 (Data Constructor)
    2 (Type/Class)
    EpochMilli
    epochPico
    EpochSeconds
    epochSeconds
    Error
    errorHandlerSP
    errorwrapper
    errWrap
    escape
    1 (Function)
    2 (Function)
    escape'
    eSecsToCalTime
    Ev
    evalIdentity
    evalIdentityT
    Event
    1 (Data Constructor)
    2 (Type/Class)
    eventContext
    eventData
    EventHandler
    EventItem
    1 (Data Constructor)
    2 (Type/Class)
    EventLogEntry
    1 (Data Constructor)
    2 (Type/Class)
    EventMap
    EventQueue
    eventStreamRef
    eventTString
    EvLoaders
    EvLoaders'
    ExceptionT
    expireCookie
    extension
    1 (Function)
    2 (Function)
    extraEvents
    addfile ./docs/0.5.0/doc-index-F.html hunk ./docs/0.5.0/doc-index-F.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (F)
    filePathLazy
    filePathSendFile
    filePathStrict
    FileSaver
    fileServe
    fileServe'
    fileServeLazy
    fileServeStrict
    FilterFun
    FilterMonad
    FilterT
    1 (Data Constructor)
    2 (Type/Class)
    find
    finishWith
    first
    flatten
    flattenCDATA
    1 (Function)
    2 (Function)
    Flexible
    forbidden
    forever
    foreverSt
    fork
    forkEver
    forkEverSt
    fork_
    formatRequestCombined
    formatTimeCombined
    formDecode
    found
    from
    fromAttribute
    fromAttributes
    FromData
    fromData
    fromHaXml
    fromHaXmls
    fromList
    fromPairs
    FromPath
    fromPath
    FromReqURI
    fromReqURI
    fromSet
    FromString
    fromString
    fromXml
    funResultTy
    addfile ./docs/0.5.0/doc-index-G.html hunk ./docs/0.5.0/doc-index-G.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (G)
    gAsk
    gcast
    gcast1
    gcast2
    GET
    getAttr
    GetCheckpointState
    1 (Data Constructor)
    2 (Type/Class)
    getCookie
    getCookie'
    getCookies
    getCookies'
    getCopy
    1 (Function)
    2 (Function)
    getDaemonizedId
    getData
    getDataFn
    getEpochMilli
    getEQ
    getEventClockTime
    getEventId
    getEventStream
    getFilter
    getGT
    getGTE
    getHeader
    getHeaderBS
    getHeaderM
    getHeaderUnsafe
    getLT
    getLTE
    getOne
    getOneOr
    getOrd
    getRandom
    getRandomR
    getRange
    getResponse
    getRoot
    getSafeGet
    1 (Function)
    2 (Function)
    getSafePut
    1 (Function)
    2 (Function)
    GetState
    1 (Data Constructor)
    2 (Type/Class)
    getState
    1 (Function)
    2 (Function)
    getStateType
    getStringTemplate
    getStringTemplate'
    getTime
    getXmls
    gFind
    gFind'
    gGet
    globalRandomGen
    gModify
    gReplace
    groupBy
    groupStringTemplates
    gSet
    guardRq
    guessContentType
    guessContentTypeM
    gzipFilter
    addfile ./docs/0.5.0/doc-index-H.html hunk ./docs/0.5.0/doc-index-H.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (H)
    handleEvent
    handleQuery
    handleUpdate
    hasHeader
    hasHeaderBS
    hasHeaderUnsafe
    hasStyleURL
    HEAD
    HeaderPair
    1 (Data Constructor)
    2 (Type/Class)
    Headers
    hexToW64
    hGetLn
    hmacSHA1
    hName
    Host
    host
    HostAddress
    HostAddress6
    hPutLine
    HR
    1 (Data Constructor)
    2 (Type/Class)
    hValue
    addfile ./docs/0.5.0/doc-index-I.html hunk ./docs/0.5.0/doc-index-I.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (I)
    Ident
    IdentityT
    1 (Data Constructor)
    2 (Type/Class)
    IdentT
    ifModifiedSince
    ignoreFilters
    IHR
    1 (Data Constructor)
    2 (Type/Class)
    Indexable
    IndexOp
    inferIxSet
    inferRecordUpdaters
    initEventStream
    initialValue
    Input
    1 (Data Constructor)
    2 (Type/Class)
    inputContentType
    inputFilename
    inputValue
    insEl
    insert
    1 (Function)
    2 (Function)
    inSGen
    instanceD'
    internalServerError
    intersection
    is4Char
    isAbs
    isAttr
    isCSS
    isDot
    isSigD
    isTheAttr
    isXSL
    Ix
    1 (Data Constructor)
    2 (Type/Class)
    IxSet
    ixSet
    addfile ./docs/0.5.0/doc-index-K.html hunk ./docs/0.5.0/doc-index-K.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (K)
    K
    1 (Data Constructor)
    2 (Type/Class)
    addfile ./docs/0.5.0/doc-index-L.html hunk ./docs/0.5.0/doc-index-L.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (L)
    l
    lazyByteStringResponse
    lazyProcValidator
    LI
    liftSTM
    listElem
    listen
    listen'
    listenOn
    listToEl
    localContext
    localRq
    localState
    localStateReader
    loglocation
    logMC
    logMT
    look
    lookBS
    lookCookie
    lookCookieValue
    lookInput
    lookPairs
    lookRead
    lookupEventHandler
    ltrim
    addfile ./docs/0.5.0/doc-index-M.html hunk ./docs/0.5.0/doc-index-M.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (M)
    mapFst
    mapServerPartT
    mapServerPartT'
    mapSnd
    mapWebT
    maybeM
    mbReadFile
    mconcatMap
    md5
    MD5Context
    md5File
    md5Finalize
    md5InitialContext
    md5Update
    Memory
    mergeSTGroups
    Message
    Method
    1 (Type/Class)
    2 (Type/Class)
    method
    methodM
    MethodMap
    1 (Data Constructor)
    2 (Type/Class)
    methodOnly
    Methods
    methods
    methodSP
    methodType
    Migrate
    1 (Type/Class)
    2 (Type/Class)
    migrate
    1 (Function)
    2 (Function)
    MimeMap
    mimeTypes
    mintercalate
    mkAppTy
    mkCookie
    mkCookieHeader
    mkFunTy
    mkHeaders
    mkMethods
    mkObject
    1 (Function)
    2 (Function)
    mkTyCon
    mkTyConApp
    mkWebT
    mlabel
    Mode
    1 (Type/Class)
    2 (Type/Class)
    mode
    1 (Function)
    2 (Function)
    modifyResponse
    movedPermanently
    multi
    multipartDecode
    addfile ./docs/0.5.0/doc-index-N.html hunk ./docs/0.5.0/doc-index-N.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (N)
    NameAddr
    1 (Data Constructor)
    2 (Type/Class)
    nameAddr_addr
    nameAddr_name
    newAngleSTMP
    newSTMP
    newTxContext
    noCalcs
    noCommas
    noContentLength
    noHandle
    nonEmpty
    noopValidator
    NoOther
    Normalize
    normalize
    NormalizeD
    1 (Data Constructor)
    2 (Type/Class)
    normalizeD
    normalizeProxy
    normalizeRecursively
    normalizeRecursivelyD
    normalizeXml
    NoStyle
    notFound
    notMb
    null
    nullConf
    nullDir
    nullGroup
    nullRsFlags
    NullSaver
    addfile ./docs/0.5.0/doc-index-O.html hunk ./docs/0.5.0/doc-index-O.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (O)
    Object
    1 (Type/Class)
    2 (Type/Class)
    objectType
    1 (Function)
    2 (Function)
    obtainLock
    Offset
    Ok
    ok
    onLoad
    openExclusively
    optInsertGroup
    optInsertTmpl
    OPTIONS
    Other
    1 (Data Constructor)
    2 (Type/Class)
    otherVersion
    addfile ./docs/0.5.0/doc-index-P.html hunk ./docs/0.5.0/doc-index-P.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (P)
    pad
    paddedTrans
    Pairs
    pairsToHTMLForm
    pairsToXml
    parse
    parseConfig
    parseCookies
    parseObject
    1 (Function)
    2 (Function)
    parseResponse
    parseSTMP
    parseSTMPNames
    path
    1 (Function)
    2 (Function)
    pathEls
    periodic
    periodic'
    port
    POST
    PrefixLock
    Primitive
    1 (Data Constructor)
    2 (Data Constructor)
    processLoggingFlags
    ProcessQueue
    procFPSIO
    procLBSIO
    prop_DES
    prop_PadUnPad
    prop_stringW64
    Proxy
    1 (Data Constructor)
    2 (Type/Class)
    3 (Data Constructor)
    4 (Type/Class)
    proxy
    1 (Function)
    2 (Function)
    proxyQuery
    proxyServe
    proxyUpdate
    pushEventItem
    PUT
    putCopy
    1 (Function)
    2 (Function)
    putRequest
    putState
    putXmls
    addfile ./docs/0.5.0/doc-index-Q.html hunk ./docs/0.5.0/doc-index-Q.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (Q)
    quadCharToW64
    Query
    1 (Data Constructor)
    2 (Type/Class)
    query
    1 (Function)
    2 (Function)
    QueryEvent
    QueryHandler
    queryInput
    Queue
    quickQuery'
    quoteEsc
    addfile ./docs/0.5.0/doc-index-R.html hunk ./docs/0.5.0/doc-index-R.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (R)
    readCookieValue
    readElement
    readerClose
    readerGet
    readerGetUncut
    ReaderStream
    1 (Data Constructor)
    2 (Type/Class)
    ReadM
    readM
    readMXml
    readMXmlD
    readMXmlNoRootDefault
    readMXmlNoRootDefaultD
    ReadState
    1 (Data Constructor)
    2 (Type/Class)
    ReadString
    readString
    readVersionedElement
    readXml
    readXml'
    readXmlWith
    rechunkLazy
    recToEl
    redirect
    registerResetAction
    releaseLock
    render
    1 (Function)
    2 (Function)
    renderf
    Request
    1 (Data Constructor)
    2 (Type/Class)
    request
    require
    requireM
    Res
    reset
    Response
    1 (Data Constructor)
    2 (Type/Class)
    result
    resultBS
    revmap
    Rigid
    Rigidity
    rproxyServe
    RqBody
    rqBody
    rqCookies
    RqData
    rqHeaders
    rqInputs
    rqMethod
    rqPaths
    rqPeer
    rqQuery
    rqUri
    rqURL
    rqVersion
    rsBody
    rsCode
    rsfContentLength
    RsFlags
    1 (Data Constructor)
    2 (Type/Class)
    rsFlags
    rsHeaders
    rsValidator
    rtrim
    runColdEvent
    runColdEventFunc
    runCommand
    RunHandler
    runIdentityT
    Runner
    runObjectEvent
    runObjectEventFunc
    runQuery
    runServerPartT
    runSTMP
    runTxLoop
    runTxSystem
    runValidator
    runWebT
    addfile ./docs/0.5.0/doc-index-S.html hunk ./docs/0.5.0/doc-index-S.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (S)
    safeGet
    1 (Function)
    2 (Function)
    safePut
    1 (Function)
    2 (Function)
    SAttr
    Saver
    saxon
    SBLE
    scheme
    SChild
    second
    Seconds
    secure
    seeOther
    sel
    SElem
    senc
    SendFile
    sendFile
    sendFile'
    sendFileMode
    sendFileResponse
    sendRawMessages
    sendSimpleMessages
    SEnv
    1 (Data Constructor)
    2 (Type/Class)
    senv
    Serialize
    1 (Type/Class)
    2 (Type/Class)
    serialize
    1 (Function)
    2 (Function)
    serveFile
    serveFileUsing
    ServerMonad
    ServerPart
    ServerPartT
    1 (Data Constructor)
    2 (Type/Class)
    Set
    SetAppend
    setAttribute
    SetCheckpointState
    1 (Data Constructor)
    2 (Type/Class)
    setEncoder
    setEncoderGroup
    setEvLoadersQueue
    setFilter
    setHeader
    setHeaderBS
    setHeaderM
    setHeaderUnsafe
    setManyAttrib
    setManyNativeAttrib
    setNativeAttribute
    setNewEventMap
    SetNewState
    1 (Data Constructor)
    2 (Type/Class)
    setNewState
    setNewState'
    setNewStateType
    setQueryType
    setResponseCode
    setRsCode
    setUpdateType
    setValidator
    setValidatorSP
    SEType
    sfCount
    sfFilePath
    sfOffset
    sgen
    sha1
    sha1Raw
    sha1_size
    showHostAddress
    showHostAddress6
    showsTypeRep
    shutdownSystem
    simpleDoc
    simpleDoc'
    simpleDocOld
    simpleErrorHandler
    simpleHTTP
    simpleHTTP'
    simpleHTTP''
    simpleHTTPWithSocket
    simpleHTTPWithSocket'
    simpleInput
    SimpleMessage
    1 (Data Constructor)
    2 (Type/Class)
    simpleProlog
    size
    sleep
    SM
    SMap
    smappend
    smconcat
    smempty
    smp
    SNAT
    SNull
    sopts
    split
    splitList
    splitListBy
    splitTyConApp
    spUnwrapErrorT
    startSystemState
    startSystemStateAmazon
    stats
    stdSaver
    StFirst
    1 (Data Constructor)
    2 (Type/Class)
    stFromByteString
    stFromString
    stGetFirst
    STGroup
    STMP
    stmp
    STR
    strictByteStringResponse
    Stringable
    stringMD5
    StringTemplate
    stringTemplateFormattedShow
    stringTemplateShow
    StringTemplateShows
    stringToKey
    stringToW64s
    STSH
    STShow
    1 (Data Constructor)
    2 (Type/Class)
    stShowsToSE
    stToString
    StyleSheet
    StyleURL
    styleURL
    SubHandlers
    subHandlers
    subject
    SURI
    1 (Data Constructor)
    2 (Type/Class)
    suri
    addfile ./docs/0.5.0/doc-index-T.html hunk ./docs/0.5.0/doc-index-T.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (T)
    t
    tempRedirect
    test
    textElem
    TimeOutException
    1 (Data Constructor)
    2 (Type/Class)
    to
    toAttribute
    toAttrs
    toContentType
    TOD
    ToElement
    toElement
    toHaXml
    toHaXmlEl
    toHaXmls
    toHTMLForm
    toList
    ToMessage
    toMessage
    toPairs
    toPairsX
    toPPDoc
    toPublicXml
    toQuadChars
    toResponse
    toResponseBS
    ToSElem
    toSElem
    toSElemList
    toSet
    ToString
    toString
    1 (Function)
    2 (Function)
    ToSURI
    toSURI
    toXml
    toXmlD
    TRACE
    trailingSlash
    transparentReadXml
    transparentToXml
    transparentXml
    trim
    TxControl
    1 (Data Constructor)
    2 (Type/Class)
    TxId
    txLastTxContext
    txProcessQueue
    TxRun
    1 (Data Constructor)
    2 (Type/Class)
    TyCon
    tyConString
    typ
    Typeable
    Typeable1
    Typeable2
    Typeable3
    Typeable4
    Typeable5
    Typeable6
    Typeable7
    typeAttr
    typeNotValue
    typeOf
    typeOf1
    typeOf1Default
    typeOf2
    typeOf2Default
    typeOf3
    typeOf3Default
    typeOf4
    typeOf4Default
    typeOf5
    typeOf5Default
    typeOf6
    typeOf6Default
    typeOf7
    typeOfDefault
    TypeRep
    typeRepArgs
    typeRepKey
    typeRepTyCon
    TypeString
    addfile ./docs/0.5.0/doc-index-U.html hunk ./docs/0.5.0/doc-index-U.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (U)
    UACCT
    1 (Data Constructor)
    2 (Type/Class)
    unauthorized
    unBracket
    unEscape
    unFilterT
    union
    unpad
    unproxify
    unProxy
    1 (Function)
    2 (Function)
    unrproxify
    unsafeIOToEv
    unsafeSendFile
    unsafeSendFile'
    unsafeVolatileDirectoryGroup
    unSAttr
    unSChild
    unServerPartT
    ununWebT
    unWAttr
    unWChild
    UnWebT
    unWebT
    Update
    1 (Data Constructor)
    2 (Type/Class)
    update
    UpdateEvent
    UpdateHandler
    updateIx
    uriRest
    u_path
    u_scheme
    addfile ./docs/0.5.0/doc-index-V.html hunk ./docs/0.5.0/doc-index-V.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (V)
    validateConf
    validator
    verbim
    Version
    1 (Type/Class)
    2 (Data Constructor)
    3 (Type/Class)
    4 (Type/Class)
    version
    versionAttr
    Versioned
    1 (Data Constructor)
    2 (Data Constructor)
    addfile ./docs/0.5.0/doc-index-W.html hunk ./docs/0.5.0/doc-index-W.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (W)
    W
    1 (Data Constructor)
    2 (Type/Class)
    w64sToString
    w64ToQuadChar
    w64ToQuadNum
    waitForTermination
    WAttr
    WChild
    wdgHTMLValidator
    Web
    webHSP
    webHSP'
    WebMonad
    webST
    WebT
    1 (Data Constructor)
    2 (Type/Class)
    withContext
    withData
    withDataFn
    withHost
    withRequest
    withSafeTimeOut
    withSafeTimeOutMaybe
    withTimeOut
    withTimeOutMaybe
    wrapElem
    writeChanLeft
    writeChanRight
    writerAdd
    writerAtomicReplace
    writerClose
    writerCut
    WriterStream
    1 (Data Constructor)
    2 (Type/Class)
    addfile ./docs/0.5.0/doc-index-X.html hunk ./docs/0.5.0/doc-index-X.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    Index (X)
    XML
    1 (Data Constructor)
    2 (Type/Class)
    Xml
    xmlAttr
    xmlCDataList
    xmlCDataLists
    XmlD
    1 (Data Constructor)
    2 (Type/Class)
    xmlElem
    xmlEscaper
    xmlProxy
    xmls
    xmlShowCData
    xmlShowCDatas
    xmlStdEscape
    xmlToHTMLForm
    xmlToPairs
    XSL
    XSLPath
    xslt
    XSLTCmd
    XSLTCommand
    xsltElem
    xsltFile
    xsltFPS
    xsltFPSIO
    xsltproc
    xsltString
    addfile ./docs/0.5.0/doc-index.html hunk ./docs/0.5.0/doc-index.html 1 + + +Happstack (Index)
     HappstackContentsIndex
    Index
    ABCDEFGHIKLMNOPQRSTUVWX:&.<@|
    addfile ./docs/0.5.0/frames.html hunk ./docs/0.5.0/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/gen-docs.sh hunk ./docs/0.5.0/gen-docs.sh 1 +#!/bin/sh + +startdir=`pwd` + + +mkdir -p happstack-docs +cd happstack-docs +echo 'Happstack documentation.' > prologue.txt +destdir=`pwd` + +tmp=`mktemp -d` + +gendocs () { + cd $tmp + if [ -e "$startdir/$1-$2.tar.gz" ]; then cp $startdir/$1-$2* .; tar xf $1-$2*; + else cabal unpack $1; + fi + cd $1* + if [ -n "$3" ]; then flags="--flags='$3'"; + fi + runhaskell Setup configure --user $flags + runhaskell Setup haddock --hyperlink-source --html-location='http://happstack.com/docs/0.5.0/$pkg' + cp dist/doc/html/*/*.haddock $destdir + rsync -a dist/doc/html/ $destdir +} + +gendocs happstack +gendocs happstack-data +#gendocs happstack-helpers +gendocs happstack-ixset +gendocs happstack-server +gendocs happstack-state +gendocs happstack-util +gendocs HStringTemplate +gendocs sendfile + +rm -r $tmp + +cd $destdir +for name in */; do + for x in ${name}*.haddock; do + n=`echo $name | tr -d '/'` + haddock_args="$haddock_args --read-interface=$n,$x" + done +done +echo $haddock_args +haddock -t 'Happstack' --gen-contents --gen-index -o . --prologue prologue.txt $haddock_args addfile ./docs/0.5.0/haddock-util.js hunk ./docs/0.5.0/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/haddock.css hunk ./docs/0.5.0/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + adddir ./docs/0.5.0/happstack adddir ./docs/0.5.0/happstack-data addfile ./docs/0.5.0/happstack-data.haddock binary ./docs/0.5.0/happstack-data.haddock oldhex * newhex *0d0cface000f0000bb910000af9a9b000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000001000000 *050000000000000001000000060000000000000001000000070000000000000002000000080000 *0000000000020000000900000000000000020000000a00000000000000020000000b0000000000 *0000020000000c00000000000000020000000d00000000000000020000000e0000000000000002 *0000000f0000000000000002000000100000000000000002000000110000000000000003000000 *120000000000000003000000130000000000000004000000140000000000000004000000150000 *000000000004000000160000000000000004000000170000000000000004000000180000000000 *0000040000001900000000000000040000001a00000000000000050000001b0000000000000005 *0000001c00000000000000050000001d00000000000000060000001e0000000000000006000000 *1f0000000000000006000000200000000000000006000000210000000000000006000000220000 *000000000006000000230000000000000006000000240000000000000006000000250000000000 *000006000000260000000000000006000000270000000000000006000000280000000000000006 *0000002900000000000000060000002a00000000000000060000002b0000000000000006000000 *2c00000000000000060000002d00000000000000060000002e00000000000000060000002f0000 *000000000006000000300000000000000006000000310000000000000006000000320000000000 *000006000000330000000000000006000000340000000000000006000000350000000000000006 *000000360000000000000006000000370000000000000006000000380000000000000006000000 *3900000000000000060000003a00000000000000060000003b00000000000000060000003c0000 *0000000000060000003d00000000000000060000003e00000000000000060000003f0000000000 *000006000000400000000000000006000000410000000000000006000000420000000000000006 *000000430000000000000006000000440000000000000006000000450000000000000006000000 *460000000000000006000000470000000000000006000000480000000000000006000000490000 *0000000000060000004a00000000000000060000004b00000000000000060000004c0000000000 *0000060000004d00000000000000060000004e00000000000000060000004f0000000000000006 *000000500000000000000006000000510000000000000006000000520000000000000006000000 *530000000000000006000000540000000000000006000000550000000000000006000000560000 *000000000006000000570000000000000006000000580000000000000006000000590000000000 *0000060000005a00000000000000060000005b00000000000000060000005c0000000000000007 *0000005d00000000000000070000005e00000000000000070000005f0000000000000007000000 *600000000000000007000000610000000000000007000000620000000000000007000000630000 *000000000007000000640000000000000007000000650000000000000006000000660000000000 *000006000000670000000000000006000000680000000000000006000000690000000000000006 *0000006a00000000000000060000006b00000000000000060000006c0000000000000006000000 *6d00000000000000060000006e00000000000000060000006f0000000000000006000000700000 *000000000006000000710000000000000008000000720000000000000008000000730000000000 *000008000000740000000000000008000000750000000000000008000000760000000000000008 *000000770000000000000008000000780000000000000008000000790000000000000008000000 *7a00000000000000080000007b00000000000000090000007c00000000000000090000007d0000 *0000000000090000007e00000000000000090000007f0000000000000009000000800000000000 *00000900000081000000000000000900000082000000000000000a00000083000000000000000a *00000084000000000000000a00000085000000000000000a00000086000000000000000a000000 *87000000000000000a00000088000000000000000a00000089000000000000000a0000008a0000 *00000000000a0000008b000000000000000a0000008c000000000000000a0000008d0000000000 *00000a0000008e000000000000000a0000008f000000000000000a00000090000000000000000a *00000091000000000000000a00000092000000000000000a00000093000000000000000a000000 *94000000000000000a00000095000000000000000a00000096000000000000000a000000970000 *00000000000a00000098000000000000000a00000099000000000000000b0000009a0000000000 *00000b100000000000000001000000000700000000010301070208000000670000005300000065 *000000740000002000000078000000200000007901020f0000002000000077000000690000006c *0000006c0000002000000074000000720000006100000076000000650000007200000061000000 *6c00000020010702010000007801020e00000020000000610000006e0000006400000020000000 *7200000065000000700000006c000000610000006300000065000000200000000a01021b000000 *20000000610000006e0000007900000020000000690000006e0000007300000074000000610000 *006e000000630000006500000073000000200000006f0000006600000020000000740000006800 *000065000000200000007400000079000000700000006500000020010702010000006101021300 *000020000000690000006e00000020000000690000007400000073000000200000007300000074 *00000072000000750000006300000074000000750000007200000065000000200000000a010206 *000000200000007700000069000000740000006800000020010702010000007902020000002e00 *00000a000000000101030107020c000000670000005200000065000000700000006c0000006100 *000063000000650000002000000066000000200000006201020f00000020000000770000006900 *00006c0000006c0000002000000074000000720000006100000076000000650000007200000073 *0000006500000020010702010000007801021100000020000000610000006e0000006400000020 *00000077000000690000006c0000006c0000002000000061000000630000007400000020000000 *6f0000006e0000000a01021a00000020000000610000006e000000790000002000000069000000 *6e0000007300000074000000610000006e0000006300000065000000200000006f000000660000 *002000000074000000680000006500000020000000740000007900000070000000650000002001 *0702010000006101021700000020000000690000006e0000002000000069000000740000007300 *000020000000730000007400000072000000750000006300000074000000750000007200000065 *00000020000000770000006900000074000000680000000a01020e000000200000007400000068 *000000650000002000000066000000750000006e0000006300000074000000690000006f000000 *6e00000020010702010000006602020000002e0000000a00000000020103010702070000006700 *000046000000690000006e00000064000000200000006101022300000020000000770000006900 *00006c0000006c0000002000000065000000780000007400000072000000610000006300000074 *00000020000000610000006e0000007900000020000000650000006c000000650000006d000000 *650000006e0000007400000073000000200000006f000000660000002000000074000000790000 *0070000000650000002001070201000000620102060000002000000066000000720000006f0000 *006d0000000a0102010000002001070201000000610102010000002701022d0000007300000020 *000000730000007400000072000000750000006300000074000000750000007200000065000000 *20000000690000006e000000200000006100000063000000630000006f00000072000000640000 *00610000006e000000630000006500000020000000770000006900000074000000680000002000 *0000740000006800000065000000200000004d0000006f0000006e000000610000006400000050 *0000006c00000075000000730000000a01023400000020000000690000006e0000007300000074 *000000610000006e00000063000000650000002c00000020000000650000002e00000067000000 *2e000000200000004d0000006100000079000000620000006500000020000000460000006f0000 *006f0000002000000077000000690000006c0000006c0000002000000072000000650000007400 *000075000000720000006e00000020000000740000006800000065000000200000006600000069 *00000072000000730000007400000020000000460000006f0000006f0000000a01021100000020 *000000660000006f000000750000006e0000006400000020000000770000006800000069000000 *6c00000065000000200000005b000000460000006f0000006f0102010000005d02250000002000 *000077000000690000006c0000006c000000200000007200000065000000740000007500000072 *0000006e00000020000000740000006800000065000000200000006c0000006900000073000000 *74000000200000006f0000006600000020000000460000006f0000006f00000073000000200000 *00660000006f000000750000006e000000640000002e0000000a0000000003010301022d000000 *410000006300000074000000730000002000000061000000730000002000000067000000460000 *00690000006e000000640000002000000062000000750000007400000020000000770000006900 *00006c0000006c000000200000007400000068000000720000006f000000770000002000000061 *0000006e0000002000000065000000780000006300000065000000700000007400000069000000 *6f0000006e0000002000000069000000660000000a0213000000200000006e0000006f00000074 *00000068000000690000006e000000670000002000000069000000730000002000000066000000 *6f000000750000006e000000640000002e0000000a000000000401030102360000004100000020 *00000067000000650000006e0000006500000072000000610000006c000000690000007a000000 *6500000064000000200000006d0000006f00000064000000690000006600000079000000200000 *00740000006800000061000000740000002000000077000000690000006c0000006c0000002000 *00006100000070000000700000006c000000790000002000000074000000680000006500000020 *0000006d0000006f00000064000000690000006600000069000000630000006100000074000000 *690000006f0000006e0000000a02290000002000000066000000750000006e0000006300000074 *000000690000006f0000006e00000020000000740000006f000000200000007400000068000000 *650000002000000073000000740000007200000075000000630000007400000075000000720000 *0065000000200000006f0000006600000020000000740000006800000065000000200000007300 *0000740000006100000074000000650000002e0000000a00000000050103010229000000410000 *002000000067000000650000006e0000006500000072000000610000006c000000690000007a00 *000065000000640000002000000061000000730000006b00000020000000740000006800000061 *000000740000002000000077000000690000006c0000006c000000200000007400000072000000 *610000007600000065000000720000007300000065000000200000007400000068000000650000 *000a0102360000002000000073000000740000006f000000720000006500000064000000200000 *0074000000790000007000000065000000200000006f0000006600000020000000740000006800 *000065000000200000004d0000006f0000006e0000006100000064000000520000006500000061 *00000064000000650000007200000020000000690000006e00000020000000610000006e000000 *20000000610000007400000074000000650000006d000000700000007400000020000000740000 *006f0000002000000066000000690000006e000000640000000a01020400000020000000610000 *006e00000020010702010000006101022e00000020000000610000006e00000064000000200000 *0077000000690000006c0000006c000000200000007400000068000000650000006e0000002000 *00006100000070000000700000006c000000790000002000000074000000680000006500000020 *00000070000000720000006f000000760000006900000064000000650000006400000020000000 *66000000750000006e0000006300000074000000690000006f0000006e00000020000000690000 *00660000000a020800000020000000660000006f000000750000006e000000640000002e000000 *0a0000000006010301021200000054000000680000006500000020000000650000007100000075 *0000006900000076000000610000006c000000650000006e00000074000000200000006f000000 *660000002001040100000005021000000020000000660000006f00000072000000200000004d00 *00006f0000006e000000610000006400000053000000740000006100000074000000650000000a *000700000000000000010000000200000003000000040000000500000006070000000000000001 *000000020000000300000004000000050000000600070000000000000000010000000002000000 *000300000000040000000005000000000600000000000000000200010c0000004e0000006f0000 *007400000020000000700000006f000000720000007400000061000000620000006c0000006501 *0c0000006500000078000000700000006500000072000000690000006d000000650000006e0000 *0074000000610000006c0116000000680000006100000070000000700000007300000040000000 *670000006f0000006f000000670000006c0000006500000067000000720000006f000000750000 *0070000000730000002e000000630000006f0000006d0a00000007010301022c00000057000000 *68000000650000006e0000002000000077000000720000006900000074000000690000006e0000 *006700000020000000790000006f0000007500000072000000200000006f000000770000006e00 *00002000000067000000650000006e000000650000007200000069000000630000002000000066 *000000750000006e0000006300000074000000690000006f0000006e0000007300000020000000 *660000006f00000072000000200104010000000b01020900000020000000790000006f00000075 *000000200000006d00000061000000790000000a010244000000200000006e0000006500000065 *0000006400000020000000740000006f0000002000000061000000630000006300000065000000 *73000000730000002000000074000000680000006500000020000000630000006c000000610000 *007300000073000000200000006d0000006500000074000000680000006f000000640000007300 *0000200000007400000068000000720000006f0000007500000067000000680000002000000074 *000000680000006900000073000000200000006400000061000000740000006100000074000000 *790000007000000065000000200000007200000061000000740000006800000065000000720000 *00200000007400000068000000610000006e0000000a020b000000200000006400000069000000 *720000006500000063000000740000006c000000790000002e0000000a00000000080000000000 *0900000000000a00000000000b0101030102040000005400000068000000650000002001040100 *00000b01021200000020000000630000006c000000610000007300000073000000200000007000 *0000720000006f0000007600000069000000640000006500000073000000200000006100000020 *0104010000000c0102110000002000000066000000750000006e00000063000000740000006900 *00006f0000006e0000002c0000002000000077000000680000006900000063000000680000000a *01024400000020000000690000007300000020000000690000006e00000074000000650000006e *00000064000000650000006400000020000000740000006f000000200000006e0000006f000000 *720000006d000000610000006c000000690000007a000000650000002000000076000000610000 *006c000000750000006500000073000000200000006f0000006e0000006c000000790000002000 *000061000000740000002000000074000000680000006500000020000000740000006f00000070 *0000002d0000006c0000006500000076000000650000006c00000020000000630000006f000000 *6e0000007300000074000000720000007500000063000000740000006f000000720000002c0000 *000a01020700000020000000610000006e00000064000000200000006100000020010401000000 *0d0102200000002000000066000000750000006e0000006300000074000000690000006f000000 *6e0000002c00000020000000770000006800000069000000630000006800000020000000690000 *007300000020000000690000006e00000074000000650000006e00000064000000650000006400 *000020000000740000006f0000000a01023e000000200000006e0000006f000000720000006d00 *0000610000006c000000690000007a0000006500000020000000610000006c0000006c00000020 *000000740000006800000065000000200000007300000075000000620000007600000061000000 *6c00000075000000650000007300000020000000610000006e0000006400000020000000740000 *0068000000650000006e000000200000006e0000006f000000720000006d000000610000006c00 *0000690000007a000000650000002000000074000000680000006500000020000000740000006f *000000700000002d0000006c0000006500000076000000650000006c0000000a020e0000002000 *0000630000006f0000006e0000007300000074000000720000007500000063000000740000006f *000000720000002e0000000a010301023a00000054000000680000006500000072000000650000 *002000000069000000730000002000000061000000200000006400000065000000660000006100 *0000750000006c0000007400000020000000690000006e0000007300000074000000610000006e *00000063000000650000002000000074000000680000006100000074000000200000006d000000 *61000000740000006300000068000000650000007300000020000000610000006c0000006c0000 *002000000074000000790000007000000065000000730000002c00000020000000770000006800 *0000650000007200000065000000200104010000000c0102010000000a01020400000020000000 *6900000073000000200104010000009b01020500000020000000610000006e0000006400000020 *0104010000000d010209000000200000006100000070000000700000006c000000690000006500 *000073000000200104010000000d01020400000020000000740000006f0000000a01021e000000 *20000000610000006c0000006c000000200000006f000000660000002000000069000000740000 *0073000000200000006300000068000000690000006c0000006400000072000000650000006e00 *000020000000610000006e00000064000000200000007400000068000000650000006e00000020 *0104010000000c021000000020000000740000006f000000200000007400000068000000650000 *0020000000720000006500000073000000750000006c000000740000002e0000000a0301024200 *0000490000006600000020000000790000006f000000750000002000000077000000610000006e *0000007400000020000000740000006f0000002000000061000000630000007400000075000000 *610000006c0000006c0000007900000020000000640000006f00000020000000730000006f0000 *006d00000065000000200000006e0000006f000000720000006d000000610000006c0000006900 *00007a0000006100000074000000690000006f0000006e00000020000000660000006f00000072 *000000200000006100000020000000630000006500000072000000740000006100000069000000 *6e00000020000000740000007900000070000000650000002c0000000a01024700000020000000 *7400000068000000650000006e000000200000006a000000750000007300000074000000200000 *00640000006500000066000000690000006e0000006500000020000000610000006e0000002000 *0000690000006e0000007300000074000000610000006e00000063000000650000002000000066 *0000006f0000007200000020000000740000006800000061000000740000002000000074000000 *7900000070000000650000003b0000002000000074000000680000006900000073000000200000 *0077000000690000006c0000006c0000002000000074000000610000006b000000650000002000 *0000700000007200000065000000630000006500000064000000650000006e0000006300000065 *0000000a021c000000200000006f00000076000000650000007200000020000000740000006800 *0000650000002000000064000000650000006600000061000000750000006c0000007400000020 *000000690000006e0000007300000074000000610000006e00000063000000650000002e000000 *0a000000000c00000000000d00000000000e010301020c00000054000000680000006900000073 *00000020000000690000007300000020000000740000006800000065000000200104010000000c *0102190000002000000066000000750000006e0000006300000074000000690000006f0000006e *00000020000000690000006e000000200000007400000068000000650000002000000064000000 *650000006600000061000000750000006c00000074000000200104010000000b0102010000000a *01024300000020000000690000006e0000007300000074000000610000006e0000006300000065 *0000002e000000200000004900000074000000200000006d000000610000007900000020000000 *620000006500000020000000610000002000000075000000730000006500000066000000750000 *006c000000200000006200000075000000690000006c00000064000000690000006e0000006700 *000020000000620000006c0000006f000000630000006b00000020000000770000006800000065 *0000006e0000002000000077000000720000006900000074000000690000006e00000067000000 *20000000790000006f0000007500000072000000200000006f000000770000006e0000000a020c *00000020000000690000006e0000007300000074000000610000006e0000006300000065000000 *730000002e0000000a000000000f010301020c0000005400000068000000690000007300000020 *000000690000007300000020000000740000006800000065000000200104010000000d01021900 *00002000000066000000750000006e0000006300000074000000690000006f0000006e00000020 *000000690000006e00000020000000740000006800000065000000200000006400000065000000 *6600000061000000750000006c000000740000000a010201000000200104010000000b01023a00 *000020000000690000006e0000007300000074000000610000006e00000063000000650000002e *000000200000004900000074000000200000006d00000061000000790000002000000062000000 *6500000020000000610000002000000075000000730000006500000066000000750000006c0000 *00200000006200000075000000690000006c00000064000000690000006e000000670000002000 *0000620000006c0000006f000000630000006b000000200000007700000068000000650000006e *0000002000000077000000720000006900000074000000690000006e000000670000000a021500 *000020000000790000006f0000007500000072000000200000006f000000770000006e00000020 *000000690000006e0000007300000074000000610000006e000000630000006500000073000000 *2e0000000a0000000010010301022c0000005700000068000000650000006e0000002000000077 *000000720000006900000074000000690000006e0000006700000020000000790000006f000000 *7500000072000000200000006f000000770000006e0000002000000067000000650000006e0000 *00650000007200000069000000630000002000000066000000750000006e000000630000007400 *0000690000006f0000006e0000007300000020000000660000006f000000720000002001040100 *00000b01020900000020000000790000006f00000075000000200000006d000000610000007900 *00000a021d000000200000006e0000006500000065000000640000002000000074000000680000 *0069000000730000002c0000002000000074000000680000006500000020000000700000007200 *00006f00000078000000790000002000000076000000610000006c00000075000000650000002e *0000000a000a0000000700000008000000090000000a0000000b0000000c0000000d0000000e00 *00000f000000100a0000000b0000000c0000000d0000000e0000000f0000000700000008000000 *090000000a00000010000a000000070300000008000000090000000a0000000800000000090000 *00000a000000000b020000000c0000000d0000000c000000000d000000000e000000000f000000 *0010000000000000000003000000000200000011010302960000004d0000006900000067000000 *7200000061000000740000006500000020000000690000006e0000007300000074000000610000 *006e00000063000000650000007300000020000000610000007200000065000000200000006e00 *0000650000006500000064000000650000006400000020000000740000006f0000002000000061 *0000006c0000006c0000006f000000770000002000000075000000700000006700000072000000 *61000000640000006500000073000000200000006f00000066000000200000004d000000410000 *004300000049000000440000002000000073000000740000006100000074000000650000002e00 *0000200000002000000049000000740000002000000073000000680000006f000000750000006c *00000064000000200000006200000065000000200000006400000065000000630000006c000000 *6100000072000000650000006400000020000000610000007300000020000000690000006e0000 *007300000074000000610000006e0000006300000065000000200000004d000000690000006700 *000072000000610000007400000065000000200000004f0000006c00000064000000200000004e *000000650000007700000020000000770000006800000065000000720000006500000020000000 *6d000000690000006700000072000000610000007400000065000000200000003d000000200000 *007400000072000000610000006e000000730000006900000074000000690000006f0000006e00 *00005f00000066000000750000006e0000006300000074000000690000006f0000006e0000000a *000000001200000200000011000000120200000011000000120002000000110100000012000000 *1200000000000000000400010c0000004e0000006f0000007400000020000000700000006f0000 *00720000007400000061000000620000006c00000065010c000000650000007800000070000000 *6500000072000000690000006d000000650000006e00000074000000610000006c011600000068 *0000006100000070000000700000007300000040000000670000006f0000006f00000067000000 *6c0000006500000067000000720000006f0000007500000070000000730000002e000000630000 *006f0000006d0700000013010301022c0000005700000068000000650000006e00000020000000 *77000000720000006900000074000000690000006e0000006700000020000000790000006f0000 *007500000072000000200000006f000000770000006e0000002000000067000000650000006e00 *0000650000007200000069000000630000002000000066000000750000006e0000006300000074 *000000690000006f0000006e0000007300000020000000660000006f0000007200000020010401 *0000001601020900000020000000790000006f00000075000000200000006d0000006100000079 *0000000a010243000000200000006e00000065000000650000006400000020000000740000006f *000000200000006100000063000000630000006500000073000000730000002000000074000000 *680000006500000020000000630000006c000000610000007300000073000000200000006d0000 *006500000074000000680000006f00000064000000200000007400000068000000720000006f00 *000075000000670000006800000020000000740000006800000069000000730000002000000064 *000000610000007400000061000000740000007900000070000000650000002000000072000000 *6100000074000000680000006500000072000000200000007400000068000000610000006e0000 *000a020b000000200000006400000069000000720000006500000063000000740000006c000000 *790000002e0000000a000000001400000000001500000000001601010301020400000054000000 *6800000065000000200104010000001601021200000020000000630000006c0000006100000073 *000000730000002000000070000000720000006f00000076000000690000006400000065000000 *730000002000000061000000200104010000001701020e0000002000000076000000610000006c *00000075000000650000002c000000200000007700000068000000690000006300000068000000 *0a0225000000200000006900000073000000200000007400000068000000650000002000000064 *000000650000006600000061000000750000006c00000074000000200000007600000061000000 *6c000000750000006500000020000000660000006f000000720000002000000074000000680000 *00610000007400000020000000740000007900000070000000650000002e0000000a0103010240 *000000540000006800000065000000720000006500000020000000690000007300000020000000 *6e0000006f00000020000000690000006e0000007300000074000000610000006e000000630000 *006500000020000000660000006f00000072000000200000006100000072000000620000006900 *000074000000720000006100000072000000790000002000000074000000790000007000000065 *000000730000002000000062000000790000002000000064000000650000006600000061000000 *750000006c000000740000002c0000002000000062000000750000007400000020000000690000 *006600000020000000790000006f000000750000000a0102420000002000000064000000650000 *00630000006c00000061000000720000006500000020000000610000006e000000200000006900 *00006e0000007300000074000000610000006e0000006300000065000000200000007700000069 *00000074000000680000006f00000075000000740000002000000070000000720000006f000000 *760000006900000064000000690000006e00000067000000200000007400000068000000650000 *002000000076000000610000006c00000075000000650000002000000074000000680000006500 *00006e000000200000006f0000006e000000650000002000000077000000690000006c0000006c *0000002000000062000000650000000a010224000000200000006200000075000000690000006c *00000074000000200000007500000073000000690000006e000000670000002000000074000000 *680000006500000020000000660000006900000072000000730000007400000020000000630000 *006f0000006e0000007300000074000000720000007500000063000000740000006f0000007200 *00002e000000200104010000001701021400000020000000690000007300000020000000750000 *0073000000650000006400000020000000740000006f0000002000000070000000720000006f00 *0000760000006900000064000000650000000a022e0000002000000076000000610000006c0000 *0075000000650000007300000020000000660000006f0000007200000020000000610000006e00 *00007900000020000000610000007200000067000000750000006d000000650000006e00000074 *00000073000000200000006f000000660000002000000074000000680000006500000020000000 *630000006f0000006e0000007300000074000000720000007500000063000000740000006f0000 *00720000002e0000000a03010232000000490000006600000020000000790000006f0000007500 *00002000000077000000610000006e0000007400000020000000610000006e0000002000000069 *0000006e0000007300000074000000610000006e00000063000000650000002000000066000000 *6f0000007200000020000000610000006c0000006c000000200000007400000079000000700000 *006500000073000000200000007400000068000000650000006e00000020000000690000006d00 *0000700000006f00000072000000740000000a0102010000002001051e00000048000000610000 *007000000070000000730000007400000061000000630000006b0000002e000000440000006100 *000074000000610000002e00000044000000650000006600000061000000750000006c00000074 *0000002e00000047000000650000006e0000006500000072000000690000006302020000002e00 *00000a0000000017000000000018010301020c0000005400000068000000690000007300000020 *000000690000007300000020000000740000006800000065000000200104010000001701022700 *000020000000740000006800000061000000740000002000000069000000730000002000000075 *00000073000000650000006400000020000000690000006e00000020000000610000006e000000 *20000000690000006e0000007300000074000000610000006e0000006300000065000000200000 *00690000006600000020000000790000006f0000007500000020000000640000006f0000006e01 *020100000027010202000000740000000a01024600000020000000730000007000000065000000 *63000000690000006600000079000000200000006f0000006e000000650000002e000000200000 *004900000074000000200000006d00000061000000790000002000000062000000650000002000 *0000610000002000000075000000730000006500000066000000750000006c0000002000000062 *00000075000000690000006c00000064000000690000006e000000670000002000000062000000 *6c0000006f000000630000006b000000200000007700000068000000650000006e000000200000 *0077000000720000006900000074000000690000006e0000006700000020000000790000006f00 *00007500000072000000200000006f000000770000006e0000000a020c00000020000000690000 *006e0000007300000074000000610000006e0000006300000065000000730000002e0000000a00 *00000019010301022c0000005700000068000000650000006e0000002000000077000000720000 *006900000074000000690000006e0000006700000020000000790000006f000000750000007200 *0000200000006f000000770000006e0000002000000067000000650000006e0000006500000072 *00000069000000630000002000000066000000750000006e000000630000007400000069000000 *6f0000006e0000007300000020000000660000006f000000720000002001040100000016010209 *00000020000000790000006f00000075000000200000006d00000061000000790000000a021d00 *0000200000006e0000006500000065000000640000002000000074000000680000006900000073 *0000002c000000200000007400000068000000650000002000000070000000720000006f000000 *78000000790000002000000076000000610000006c00000075000000650000002e0000000a0007 *000000130000001400000015000000160000001700000018000000190700000016000000170000 *001800000013000000140000001500000019000700000013020000001400000015000000140000 *00001500000000160100000017000000170000000018000000001900000000000000000500010c *0000004e0000006f0000007400000020000000700000006f000000720000007400000061000000 *620000006c00000065010c0000006500000078000000700000006500000072000000690000006d *000000650000006e00000074000000610000006c01160000006800000061000000700000007000 *00007300000040000000670000006f0000006f000000670000006c000000650000006700000072 *0000006f0000007500000070000000730000002e000000630000006f0000006d080000001a0103 *010224000000440000006500000072000000690000007600000065000000730000002000000069 *0000006e0000007300000074000000610000006e00000063000000650000007300000020000000 *660000006f00000072000000200000007300000079000000620000002d00000077000000690000 *0074000000680000002d000000630000006c000000610000007300000073010201000000270102 *1200000073000000200000004400000061000000740000006100000020000000630000006c0000 *0061000000730000007300000020000000610000006e00000064000000200000000a0102190000 *002000000020000000200000004800000061000000700000007000000073000000740000006100 *0000630000006b0000002e000000440000006100000074000000610000002e0000004400000065 *0000006600000061000000750000006c0000007401020100000027010211000000730000002000 *000044000000650000006600000061000000750000006c0000007400000020000000630000006c *0000006100000073000000730000002e0000000a01022c00000020000000200000002000000054 *0000006800000065000000200000006c000000690000007300000074000000200000006f000000 *66000000200000006e000000610000006d00000065000000730000002000000073000000680000 *006f000000750000006c00000064000000200000006200000065000000200000006f0000006600 *00002000000074000000680000006500000020000000660000006f000000720000006d00000020 *0000005b0102010000002701020100000027010204000000460000006f0000006f0000002c0102 *0100000027010201000000270102060000004200000061000000720000002c0000002e0000002e *0102010000005d02010000000a000000001b010301022400000044000000650000007200000069 *00000076000000650000007300000020000000690000006e000000730000007400000061000000 *6e00000063000000650000007300000020000000660000006f0000007200000020000000730000 *0079000000620000002d000000770000006900000074000000680000002d000000630000006c00 *000061000000730000007301020100000027010213000000730000002000000044000000610000 *00740000006100000020000000630000006c000000610000007300000073000000200000006f00 *00006e0000006c000000790000002e0000000a01022c0000002000000020000000200000005400 *00006800000065000000200000006c000000690000007300000074000000200000006f00000066 *000000200000006e000000610000006d0000006500000073000000200000007300000068000000 *6f000000750000006c00000064000000200000006200000065000000200000006f000000660000 *002000000074000000680000006500000020000000660000006f000000720000006d0000002000 *00005b0102010000002701020100000027010204000000460000006f0000006f0000002c010201 *00000027010201000000270102060000004200000061000000720000002c0000002e0000002e01 *02010000005d02010000000a000000009c00000000009d00000000001c01010301020400000054 *0000006800000065000000200104010000001c0102300000002000000066000000750000006e00 *00006300000074000000690000006f0000006e0000002000000074000000610000006b00000065 *000000730000002000000061000000200000006c00000069000000730000007400000020000000 *6f0000006600000020000000630000006c00000061000000730000007300000065000000730000 *0020000000740000006f0000002000000064000000650000007200000069000000760000006500 *000020000000610000006e000000640000000a0102440000002000000061000000200000006200 *00006c0000006f000000630000006b000000200000006f00000066000000200000006400000065 *000000630000006c00000061000000720000006100000074000000690000006f0000006e000000 *730000002e0000002000000049000000740000002000000077000000690000006c0000006c0000 *00200000006100000064000000640000006900000074000000690000006f0000006e0000006100 *00006c0000006c0000007900000020000000640000006500000072000000690000007600000065 *00000020000000690000006e0000007300000074000000610000006e0000006300000065000000 *7300000020000000660000006f000000720000000a022200000020000000540000007900000070 *0000006500000061000000620000006c000000650000002c000000200000004f0000006c000000 *640000002e0000004400000061000000740000006100000020000000610000006e000000640000 *00200000004e00000065000000770000002e000000440000006100000074000000610000002e00 *00000a010302090000004500000078000000610000006d000000700000006c000000650000003a *0000000a0701022c00000020000000240000002800000020000000640000006500000072000000 *690000007600000065000000410000006c0000006c000000200000005b00000027000000270000 *0053000000680000006f000000770000002c000000200000002700000027000000450000007100 *00002c00000020000000270000002700000044000000650000006600000061000000750000006c *000000740000005d000000200000005b000000640000007c0000000a01021b0000002000000020 *000000200000002000000020000000200000002000000020000000640000006100000074000000 *6100000020000000460000006f0000006f0000002000000061000000200000003d000000200000 *00460000006f0000006f00000020000000610000000a01021e0000002000000020000000200000 *002000000020000000200000002000000020000000640000006100000074000000610000002000 *0000420000006100000072000000200000003d0000002000000042000000610000007a00000020 *0000007c00000020000000510000007500000075000000780000000a0207000000200000002000 *00007c0000005d00000020000000290000000a000000009e00000000009f0000000000a0000003 *0000001a0000001b0000001c030000001c0000001a0000001b00030000001a000000001b000000 *001c00000000000000000c00010c0000004e0000006f0000007400000020000000700000006f00 *0000720000007400000061000000620000006c00000065010c0000006500000078000000700000 *006500000072000000690000006d000000650000006e00000074000000610000006c0116000000 *680000006100000070000000700000007300000040000000670000006f0000006f000000670000 *006c0000006500000067000000720000006f0000007500000070000000730000002e0000006300 *00006f0000006d0000000000000000000000000d000000003f0000001d00000000001e00000000 *001f00000000002000000000002100000000002200000000002300000000002400000000002500 *000000002600000000002700000000002800000000002900000000002a00000000002b00000000 *002c00000000002d00000000002e01030242000000520000006900000067000000690000006400 *000069000000740000007900000020000000690000007300000020000000750000007300000065 *0000006400000020000000740000006f0000002000000064000000650000007300000069000000 *670000006e00000061000000740000006500000020000000740000006800000065000000200000 *00720000006500000073000000750000006c00000074000000200000006f000000660000002000 *000061000000200000006600000061000000690000006c00000065000000640000002000000058 *0000006d0000006c0000002000000070000000610000007200000073000000690000006e000000 *670000002e0000000a000000002f00000000003000000000003100000000003200000000003300 *0000000034010301022b000000450000006c000000650000006d000000650000006e0000007400 *000020000000720000006500000063000000750000007200000073000000690000007600000065 *0000006c0000007900000020000000720000006500000070000000720000006500000073000000 *650000006e000000740000007300000020000000580000004d0000004c00000020000000640000 *006100000074000000610000002e00000020000000200000000a0102a500000020000000200000 *002000000020000000450000006c000000650000006d000000200000006e000000200000006500 *00006c000000650000006d00000073000000200000002d0000003e00000020000000580000004d *0000004c00000020000000650000006c000000650000006d000000650000006e00000074000000 *2000000077000000690000007400000068000000200000006e000000610000006d000000650000 *00200000006e00000020000000610000006e000000640000002000000064000000650000007300 *000063000000720000006900000062000000650000006400000020000000620000007900000020 *000000650000006c000000650000006d000000730000002e00000020000000200000004e000000 *6f0000007400000065000000200000007400000068000000610000007400000020000000650000 *006c000000650000006d0000007300000020000000630000006f0000006e000000740000006100 *0000690000006e00000073000000200000007300000075000000620000002d000000650000006c *000000650000006d000000650000006e0000007400000073000000200000006100000073000000 *2000000077000000650000006c0000006c00000020000000610000007300000020000000740000 *006800000065000000200000006100000074000000740000007200000069000000620000007500 *0000740000006500000073000000200000006f00000072000000200000006c0000006900000074 *0000006500000072000000610000006c0000002000000064000000610000007400000061000000 *200000006f000000660000002000000074000000680000006500000020000000650000006c0000 *00650000006d000000650000006e000000740000002e0000000a01022300000020000000200000 *002000000020000000430000004400000061000000740000006100000020000000640000002000 *00002d0000003e000000200000004c00000069000000740000006500000072000000610000006c *00000020000000730000007400000072000000690000006e000000670000002000000064000000 *6100000074000000610000000a0102170000002000000020000000200000002000000041000000 *740000007400000072000000200000006b00000065000000790000002000000076000000610000 *006c000000200000002d0000003e000000200000004b00000065000000790102010000002f0225 *00000056000000610000006c000000750000006500000020000000700000006100000069000000 *72000000200000006f000000660000002000000074000000680000006500000020000000650000 *006c000000650000006d000000650000006e000000740000002000000061000000740000007400 *00007200000069000000620000007500000074000000650000002e0000000a0000000035000000 *00003600000000003700000000003800000000003900000000003a00000000003b00000000003c *0103010237000000690000006e00000073000000450000006c0000002000000061000000200000 *00620000002000000077000000690000006c0000006c00000020000000630000006f0000006e00 *000076000000650000007200000074000000200000006100000020000000740000006f00000020 *000000780000006d0000006c00000020000000610000006e000000640000002000000069000000 *6e0000007300000065000000720000007400000020000000690000007400000020000000690000 *006e000000740000006f000000200000007400000068000000650000000a022f00000020000000 *780000006d0000006c000000200000006f00000066000000200000006200000020000000690000 *0066000000200000006200000020000000720000006500000073000000750000006c0000007400 *00007300000020000000690000006e00000020000000610000006e00000020000000450000006c *000000650000006d00000020000000630000006f0000006e000000730000007400000072000000 *7500000063000000740000006f000000720000002e0000000a000000003d010301022d00000057 *000000720000006100000070000000700000006500000072000000200000006100000072000000 *6f000000750000006e000000640000002000000074000000680000006500000020000000580000 *006d0000006c00000020000000630000006c000000610000007300000073000000200000006d00 *00006500000074000000680000006f000000640000002000000072000000650000006100000064 *000000580000006d0000006c0000002e0000000a02970000002000000054000000680000006500 *000020000000520000006900000067000000690000006400000069000000740000007900000020 *00000077000000690000006c0000006c0000002000000064000000650000007400000065000000 *720000006d000000690000006e0000006500000020000000740000006800000065000000200000 *006200000065000000680000006100000076000000690000006f00000072000000200000006900 *00006e000000200000007400000068000000650000002000000063000000610000007300000065 *000000200000006f00000066000000200000006100000020000000660000006100000069000000 *6c00000065000000640000002000000070000000610000007200000073000000690000006e0000 *00670000003a000000200000002000000052000000690000006700000069000000640000002000 *000077000000690000006c0000006c000000200000007200000065000000740000007500000072 *0000006e000000200000004e0000006f0000007400000068000000690000006e00000067000000 *20000000610000006e0000006400000020000000460000006c0000006500000078000000690000 *00620000006c000000650000002000000077000000690000006c0000006c000000200000007200 *0000650000007400000075000000720000006e000000200000004900000064000000650000006e *000000740000006900000074000000790000002000000028000000640000006500000066000000 *61000000750000006c0000007400000056000000610000006c0000007500000065000000290000 *000a000000003e010302700000004900000064000000650000006e000000740000006900000063 *000000610000006c00000020000000740000006f00000020000000740000006f00000058000000 *6d0000006c0000002000000066000000720000006f0000006d00000020000000580000006d0000 *006c00000020000000630000006c00000061000000730000007300000020000000650000007800 *000063000000650000007000000074000000200000007400000068000000610000007400000020 *00000069000000740000002000000077000000690000006c0000006c0000002000000072000000 *650000006d0000006f000000760000006500000020000000610000007400000074000000720000 *00690000006200000075000000740000006500000073000000200000006e000000610000006d00 *00006500000064000000200000006800000061000000730000006b000000650000006c0000006c *00000054000000790000007000000065000000200000006f000000720000002000000068000000 *61000000730000006b000000650000006c0000006c000000540000007900000070000000650000 *0056000000650000007200000073000000690000006f0000006e0000000a000000003f01030241 *000000550000007300000065000000640000002000000061000000730000002000000061000000 *2000000074000000790000007000000065000000200000007700000069000000740000006e0000 *0065000000730000007300000020000000660000006f0000007200000020000000750000007300 *000061000000670000006500000020000000770000006900000074000000680000002000000073 *00000079000000620000002d000000770000006900000074000000680000002d00000063000000 *6c0000006100000073000000730000002000000044000000610000007400000061000000200000 *00630000006c0000006100000073000000730000002e0000000a00000000400103024a00000041 *00000070000000700000006c000000690000006500000073000000200000006600000075000000 *6e0000006300000074000000690000006f0000006e00000020000000740000006f000000200000 *006f0000006e0000006c0000007900000020000000660000006900000072000000730000007400 *000020000000650000006c000000650000006d000000650000006e00000074000000200000006f *0000006600000020000000740000006800000065000000200000006c0000006900000073000000 *740000002e000000200000002000000053000000610000006600000065000000200000006f0000 *006e00000020000000650000006d000000700000007400000079000000200000006c0000006900 *00007300000074000000730000002e0000000a0000000041010301023e000000430000006f0000 *006e00000076000000650000007200000074000000730000002000000074000000680000006500 *000020000000610000007200000067000000750000006d000000650000006e0000007400000020 *000000740000006f00000020000000610000006e00000020000000580000006d0000006c000000 *20000000650000006c000000650000006d000000650000006e0000007400000020000000770000 *006900000074000000680000002000000074000000680000006500000020000000630000006f00 *00006e0000007300000074000000720000007500000063000000740000006f0000007200000020 *0000000a01024d0000002000000020000000200000006e000000610000006d0000006500000020 *00000061000000730000002000000074000000680000006500000020000000720000006f000000 *6f00000074000000200000006f0000006600000020000000740000006800000065000000200000 *00450000006c000000650000006d00000020000000610000006e00000064000000200000007400 *00006800000065000000200000006100000064000000640000006900000074000000690000006f *0000006e000000610000006c000000200000006100000074000000740000007200000069000000 *620000007500000074000000650000007300000020000000630000006f00000072000000720000 *006500000073000000700000006f0000006e00000064000000690000006e000000670000002000 *00000a022f000000200000002000000020000000740000006f0000002000000068000000610000 *00730000006b000000650000006c0000006c000000540000007900000070000000650000002000 *0000610000006e00000064000000200000006800000061000000730000006b000000650000006c *0000006c0000005400000079000000700000006500000056000000650000007200000073000000 *690000006f0000006e0000002000000061000000640000006400000065000000640000000a0000 *0000420103025200000047000000650000006e0000006500000072000000690000006300000061 *0000006c0000006c00000079000000200000007400000072000000610000007600000065000000 *7200000073000000650000007300000020000000610000006e00000020000000690000006e0000 *007300000074000000610000006e0000006300000065000000200000006f000000660000002000 *0000580000006d0000006c00000020000000610000006e0000006400000020000000630000006f *0000006e0000007600000065000000720000007400000073000000200000006900000074000000 *20000000690000006e000000740000006f0000002000000061000000200000006c000000690000 *007300000074000000200000006f0000006600000020000000650000006c000000650000006d00 *0000650000006e0000007400000073000000200000000a0000000043010301024a000000410000 *007400000074000000650000006d00000070000000740000007300000020000000740000006f00 *000020000000700000006100000072000000730000006500000020000000740000006800000065 *00000020000000730000006500000074000000200000006f000000660000002000000065000000 *6c000000650000006d000000650000006e000000740000007300000020000000610000006e0000 *00640000002000000072000000650000007400000075000000720000006e000000200000007400 *000068000000650000002000000066000000690000007200000073000000740000002000000063 *0000006f0000006e0000007300000074000000720000007500000063000000740000006f000000 *720000002000000069000000740000000a022e0000002000000063000000610000006e00000020 *000000730000007500000063000000630000006500000073000000730000006600000075000000 *6c0000006c00000079000000200000007000000061000000720000007300000065000000200000 *006f000000660000002000000074000000680000006500000020000000690000006e0000006600 *000065000000720000007200000065000000640000002000000074000000790000007000000065 *0000002e0000000a00000000440103024500000043000000720000006500000061000000740000 *006500000020000000610000006e00000020000000580000006d0000006c000000200000006900 *00006e0000007300000074000000610000006e0000006300000065000000200000007500000073 *000000690000006e00000067000000200000007400000072000000610000006e00000073000000 *700000006100000072000000650000006e00000074000000540000006f000000580000006d0000 *006c00000020000000610000006e00000064000000200000007400000072000000610000006e00 *000073000000700000006100000072000000650000006e00000074000000520000006500000061 *00000064000000580000006d0000006c0000000a00000000450000000000460000000000470000 *00000048000000000049010302720000004d000000610000007400000063000000680000006500 *000073000000200000007400000068000000650000002000000070000000720000006f00000076 *000000690000006400000065000000640000002000000073000000740000007200000069000000 *6e0000006700000020000000740000006f00000020000000740000006800000065000000200000 *006b0000006500000079000000200000006f0000006600000020000000610000006e0000002000 *00006100000074000000740000007200000069000000620000007500000074000000650000002e *000000200000002000000052000000650000007400000075000000720000006e00000073000000 *2000000046000000610000006c0000007300000065000000200000006900000066000000200000 *00610000006e00000079000000200000006f000000740000006800000065000000720000002000 *0000450000006c000000650000006d000000650000006e0000007400000020000000630000006f *0000006e0000007300000074000000720000007500000063000000740000006f00000072000000 *20000000690000007300000020000000670000006900000076000000650000006e0000002e0000 *000a000000004a0103025600000046000000650000007400000063000000680000002000000074 *00000068000000650000002000000076000000610000006c000000750000006500000020000000 *6f0000006600000020000000740000006800000065000000200000006700000069000000760000 *00650000006e000000200000006100000074000000740000007200000069000000620000007500 *000074000000650000002000000069000000660000002000000070000000720000006500000073 *000000650000006e000000740000002c000000200000006900000066000000200000006e000000 *6f000000740000002000000070000000720000006500000073000000650000006e000000740000 *002000000077000000690000006c0000006c000000200000007200000065000000740000007500 *0000720000006e000000200000004e0000006f0000007400000068000000690000006e00000067 *0000000a000000004b010302310000004100000074000000740000007200000069000000620000 *007500000074000000650000002000000075000000730000006500000064000000200000006600 *00006f0000007200000020000000580000006d0000006c00000020000000630000006c00000061 *00000073000000730000002000000076000000650000007200000073000000690000006f000000 *6e00000020000000690000006e000000660000006f000000720000006d00000061000000740000 *00690000006f0000006e0000000a000000004c0103024f00000041000000740000007400000072 *000000690000006200000075000000740000006500000020000000750000007300000065000000 *6400000020000000660000006f00000072000000200000007200000065000000630000006f0000 *007200000064000000690000006e00000067000000200000007400000068000000650000002000 *000061000000630000007400000075000000610000006c00000020000000480000006100000073 *0000006b000000650000006c0000006c0000002000000074000000790000007000000065000000 *20000000690000006e0000002000000074000000680000006500000020000000780000006d0000 *006c0000002000000073000000650000007200000069000000610000006c000000690000007a00 *00006100000074000000690000006f0000006e000000200000000a000000004d00000000004e01 *0301024500000061000000430000006f0000006e00000073000000740000007200000046000000 *720000006f0000006d000000450000006c000000650000006d000000650000006e000000740000 *00730000002000000077000000690000006c0000006c0000002000000072000000650000007400 *000075000000720000006e00000020000000740000006800000065000000200000007200000065 *00000073000000750000006c0000007400000073000000200000006f0000006600000020000000 *740000006800000065000000200000006600000069000000720000007300000074000000200000 *00630000006f0000006e0000007300000074000000720000007500000063000000740000006f00 *0000720000000a0218000000200000007400000068000000610000007400000020000000700000 *00610000007200000073000000650000007300000020000000630000006f000000720000007200 *00006500000063000000740000006c000000790000002e0000000a000000004f01030102410000 *004c000000690000006b0000006500000020000000630000006f0000006e000000730000007400 *00007200000046000000720000006f0000006d000000450000006c000000650000006d00000065 *0000006e0000007400000073000000200000006200000075000000740000002000000064000000 *6f0000006500000073000000200000006e0000006f0000007400000020000000610000006c0000 *006c0000006f000000770000002000000064000000650000006600000061000000750000006c00 *000074000000690000006e0000006700000020000000690000006e000000200000006300000061 *0000007300000065000000200000006f000000660000000a021000000020000000610000002000 *00007000000061000000720000007300000065000000200000006500000072000000720000006f *000000720000002e0000000a000000005001030102420000004100000074000000740000006500 *00006d00000070000000740000007300000020000000740000006f000000200000007000000061 *000000720000007300000065000000200000007400000068000000650000002000000067000000 *6900000076000000650000006e00000020000000650000006c000000650000006d000000650000 *006e000000740000007300000020000000740000006f0000002000000062000000750000006900 *00006c000000640000002000000074000000680000006500000020000000700000006100000072 *000000740000006900000063000000750000006c00000061000000720000002000000074000000 *7900000070000000650000000a0228000000200000002000000020000000200000002000000067 *0000006900000076000000650000006e0000002000000062000000790000002000000074000000 *680000006500000020000000630000006f0000006e000000730000007400000072000000750000 *0063000000740000006f0000007200000020000000610000007200000067000000750000006d00 *0000650000006e000000740000002e0000000a00000000510103022c0000005200000065000000 *7400000075000000720000006e0000007300000020000000740000006800000065000000200000 *00650000006c000000650000006d000000650000006e0000007400000073000000200000006300 *0000750000007200000072000000650000006e000000740000006c000000790000002000000069 *0000006e0000002000000074000000680000006500000020000000730000007400000061000000 *74000000650000000a000000005201030235000000530000006500000074000000730000002000 *000074000000680000006500000020000000730000007400000061000000740000006500000020 *0000006f000000660000002000000074000000680000006500000020000000780000006d000000 *6c0000002000000070000000610000007200000073000000690000006e00000067000000200000 *00740000006f000000200000007400000068000000650000002000000067000000690000007600 *0000650000006e0000002000000076000000610000006c00000075000000650000000a00000000 *530103010249000000410000007400000074000000650000006d00000070000000740000007300 *000020000000740000006f00000020000000700000006100000072000000730000006500000020 *000000740000006800000065000000200000006300000075000000720000007200000065000000 *6e0000007400000020000000730000006500000074000000200000006f00000066000000200000 *00650000006c000000650000006d000000650000006e00000074000000730000002e0000002000 *000020000000490000006600000020000000690000007400000020000000660000006100000069 *0000006c0000007300000020000000740000006800000065000000200000006200000065000000 *680000006100000076000000690000006f000000720000000a01024b0000006900000073000000 *20000000640000006500000070000000650000006e00000064000000650000006e000000740000 *00200000006f0000006e0000002000000074000000680000006500000020000000520000006900 *00006700000069000000640000006900000074000000790000002e000000200000002000000049 *000000660000002000000069000000740000002000000069000000730000002000000052000000 *690000006700000069000000640000002c000000200000007400000068000000650000006e0000 *002000000069000000740000002000000077000000690000006c0000006c000000200000007200 *0000650000007400000075000000720000006e000000200000004e0000006f0000007400000068 *000000690000006e000000670000000a0102370000006200000075000000740000002000000069 *000000660000002000000069000000740000002000000069000000730000002000000046000000 *6c000000650000007800000069000000620000006c000000650000002000000069000000740000 *002000000077000000690000006c0000006c000000200000007200000065000000740000007500 *0000720000006e0000002000000074000000680000006500000020000000640000006500000066 *00000061000000750000006c0000007400000056000000610000006c0000007500000065000000 *2e0000000a01024a00000049000000660000002000000074000000680000006500000020000000 *70000000610000007200000073000000690000006e000000670000002000000073000000750000 *006300000063000000650000006500000064000000730000002c00000020000000690000007400 *00002000000077000000690000006c0000006c0000002000000072000000650000007400000075 *000000720000006e00000020000000740000006800000065000000200000007600000061000000 *6c000000750000006500000020000000610000006e000000640000002000000073000000740000 *006f00000072000000650000002000000074000000680000006500000020000000720000006500 *00006d00000061000000690000006e000000690000006e000000670000000a0222000000580000 *004d0000004c00000020000000650000006c000000650000006d000000650000006e0000007400 *00007300000020000000690000006e000000200000007400000068000000650000002000000070 *000000610000007200000073000000650000007200000020000000730000007400000061000000 *74000000650000002e0000000a0000000054010302600000004900000064000000650000006e00 *0000740000006900000063000000610000006c00000020000000740000006f0000002000000072 *0000006500000061000000640000004d000000580000006d0000006c0000002000000065000000 *780000006300000065000000700000007400000020000000740000006800000061000000740000 *0020000000690000006e0000002000000074000000680000006500000020000000630000006100 *00007300000065000000200000006f000000660000002000000061000000200000006600000061 *000000690000006c00000065000000640000002000000070000000610000007200000073000000 *690000006e000000670000002000000069000000740000002000000077000000690000006c0000 *006c000000200000006e0000006f00000074000000200000007500000073000000650000002000 *000064000000650000006600000061000000750000006c0000007400000056000000610000006c *00000075000000650000002e0000000a000000005500000000005601030224000000780000006d *0000006c00000053000000680000006f0000007700000043000000440000006100000074000000 *61000000200000006c000000690000006600000074000000650000006400000020000000740000 *006f00000020000000610000006300000074000000200000006f0000006e000000200000006c00 *0000690000007300000074000000730000000a0000000057010301024700000061000000750000 *00740000006f0000006d00000061000000740000006900000063000000610000006c0000006c00 *000079000000200000006300000072000000650000006100000074000000650000007300000020 *000000610000006e00000020000000580000006d0000006c000000200000006400000065000000 *66000000690000006e0000006900000074000000690000006f0000006e00000020000000660000 *006f00000072000000200000006100000020000000740000007900000070000000650000002000 *00007400000068000000610000007400000020000000690000007300000020000000610000006e *00000020000000690000006e0000007300000074000000610000006e0000006300000065000000 *0a025d0000006f000000660000002000000053000000680000006f000000770000002000000061 *0000006e0000006400000020000000520000006500000061000000640000002e00000020000000 *20000000540000006800000069000000730000002000000077000000690000006c0000006c0000 *0020000000720000006500000073000000750000006c0000007400000020000000690000006e00 *000020000000610000006e00000020000000690000006e0000007300000074000000610000006e *000000630000006500000020000000740000006800000061000000740000002000000063000000 *6f0000006e00000076000000650000007200000074000000730000002000000074000000680000 *0065000000200000007400000079000000700000006500000020000000740000006f0000002000 *0000610000006e000000640000002000000066000000720000006f0000006d0000002000000043 *000000440000006100000074000000610000002e0000000a000000005801030225000000780000 *006d0000006c00000043000000440000006100000074000000610000004c000000690000007300 *00007400000073000000200000006c000000690000006600000074000000650000006400000020 *000000740000006f00000020000000610000006300000074000000200000006f0000006e000000 *200000006c000000690000007300000074000000730000000a0000000059010301024400000043 *00000072000000650000006100000074000000650000007300000020000000610000006e000000 *20000000690000006e0000007300000074000000610000006e0000006300000065000000200000 *0073000000690000006d000000690000006c000000610000007200000020000000740000006f00 *000020000000780000006d0000006c00000053000000680000006f000000770000004300000044 *000000610000007400000061000000200000006500000078000000630000006500000070000000 *7400000020000000660000006f00000072000000200000006c0000006900000073000000740000 *0073000000200000006f00000066000000200000007400000068000000650000000a020f000000 *70000000720000006f000000760000006900000064000000650000006400000020000000740000 *00790000007000000065000000200000000a000000005a01030231000000520000006500000070 *0000006c0000006100000063000000650000007300000020000000630000006f0000006d000000 *6d000000610000007300000020000000690000006e000000200000007400000068000000650000 *0020000000730000007400000072000000690000006e0000006700000020000000770000006900 *000074000000680000002000000073000000690000006e000000670000006c0000006500000020 *0000007300000070000000610000006300000065000000730000000a000000005b0103021c0000 *005400000068000000720000006f000000770000007300000020000000610000006e0000002000 *00006500000072000000720000006f00000072000000200000007700000068000000650000006e *0000002000000063000000610000006c0000006c00000065000000640000000a003f0000001d00 *00001e0000001f0000002000000021000000220000002300000024000000250000002600000027 *00000028000000290000002a0000002b0000002c0000002d0000002e0000002f00000030000000 *3100000032000000330000003400000035000000360000003700000038000000390000003a0000 *003b0000003c0000003d0000003e0000003f000000400000004100000042000000430000004400 *000045000000460000004700000048000000490000004a0000004b0000004c0000004d0000004e *0000004f0000005000000051000000520000005300000054000000550000005600000057000000 *58000000590000005a0000005b0001003f0000001d020000001e0000001f0000001e000000001f *000000002000000000210400000022000000230000002400000025000000220000000023000000 *002400000000250000000026070000002700000028000000290000002a0000002b0000002c0000 *002d0000002700000000280000000029000000002a000000002b000000002c000000002d000000 *002e02000000300000002f0000002f000000003000000000310200000033000000320000003200 *000000330000000034030000003700000036000000350000003500000000360000000037000000 *00380000000039000000003a000000003b000000003c000000003d000000003e000000003f0000 *000040000000004100000000420000000043000000004400000000450000000046000000004700 *000000480000000049000000004a000000004b000000004c000000004d000000004e000000004f *000000005000000000510000000052000000005300000000540000000055000000005600000000 *5700000000580000000059000000005a000000005b00000000000000000700000000090000005c *00000000005d0103022b0000004c00000069000000660000007400000073000000200000007400 *00006f0000004800000061000000580000006d0000006c00000020000000740000006f00000020 *000000610000006300000074000000200000006f0000006e000000200000006c00000069000000 *730000007400000073000000200000006f0000006600000020000000450000006c000000650000 *006d000000650000006e0000007400000073000000200000000a000000005e0103010244000000 *430000006f0000006e000000760000006500000072000000740000007300000020000000740000 *00680000006500000020000000450000006c000000650000006d000000650000006e0000007400 *000020000000740000006f000000200000004800000061000000580000006d0000006c00000020 *000000450000006c000000650000006d000000650000006e000000740000002000000069000000 *660000002000000074000000680000006500000020000000450000006c000000650000006d0000 *00650000006e00000074000000200000006900000073000000200000006f000000660000002000 *000074000000680000006500000020000000660000006f000000720000006d0000000a020b0000 *0020000000450000006c000000650000006d000000200000005f000000200000005f0000002000 *00000a000000005f0103024a000000430000006f0000006e000000760000006500000072000000 *73000000690000006f0000006e0000002000000066000000750000006e00000063000000740000 *00690000006f0000006e0000002000000062000000650000007400000077000000650000006500 *00006e000000200000007400000068000000650000002000000048000000610000007000000070 *000000730000007400000061000000630000006b00000020000000450000006c00000065000000 *6d000000650000006e0000007400000020000000610000006e0000006400000020000000480000 *0061000000580000006d0000006c00000020000000430000006f0000006e000000740000006500 *00006e000000740000002000000074000000790000007000000065000000730000000a00000000 *600103010248000000430000006f0000006e000000760000006500000072000000740000007300 *000020000000610000006e00000020000000450000006c000000650000006d000000650000006e *000000740000002000000074000000680000006100000074000000200000006900000073000000 *20000000610000006e000000200000004100000074000000740000007200000020000000690000 *006e000000740000006f0000002000000061000000200000004800000061000000580000006d00 *00006c000000200000004100000074000000740000007200000069000000620000007500000074 *000000650000002e000000200000002000000057000000690000006c0000006c00000020000000 *7400000068000000720000006f000000770000000a022d00000020000000610000006e00000020 *0000006500000072000000720000006f0000007200000020000000690000006600000020000000 *70000000720000006f000000760000006900000064000000650000006400000020000000740000 *0068000000650000002000000077000000720000006f0000006e00000067000000200000006300 *00006f0000006e0000007300000074000000720000007500000063000000740000006f00000072 *0000002e0000000a0000000061010302240000004c000000690000006600000074000000730000 *002000000066000000720000006f0000006d0000004800000061000000580000006d0000006c00 *000020000000740000006f000000200000006f0000007000000065000000720000006100000074 *00000065000000200000006f0000006e000000200000006c000000690000007300000074000000 *730000000a000000006201030227000000430000006f0000006e00000076000000650000007200 *000074000000730000002000000061000000200000004800000061000000580000006d0000006c *00000020000000430000006f0000006e00000074000000650000006e0000007400000020000000 *740000006f00000020000000610000006e00000020000000450000006c000000650000006d0000 *00650000006e000000740000000a0000000063010302240000004c000000690000006600000074 *000000730000002000000066000000720000006f0000006d000000410000007400000074000000 *72000000690000006200000075000000740000006500000020000000740000006f000000200000 *00610000006300000074000000200000006f0000006e000000200000006c000000690000007300 *000074000000730000000a0000000064010301023a00000057000000690000006c0000006c0000 *0020000000630000006f0000006e00000076000000650000007200000074000000200000006100 *0000200000004800000061000000580000006d0000006c00000020000000610000007400000074 *000000720000006900000062000000750000007400000065000000200000007400000068000000 *6100000074000000200000006900000073000000200000006f0000006600000020000000740000 *00680000006500000020000000660000006f000000720000006d000000200000005b0000004c00 *0000650000006600000074000000200000005f0102010000005d01020600000020000000740000 *006f00000020000000610000000a02350000002000000048000000610000007000000070000000 *730000007400000061000000630000006b00000020000000450000006c000000650000006d0000 *00650000006e000000740000002e00000020000000200000004f00000074000000680000006500 *000072000000770000006900000073000000650000002c0000002000000077000000690000006c *0000006c000000200000007400000068000000720000006f000000770000002000000061000000 *6e000000200000006500000072000000720000006f000000720000002e0000000a00090000005c *0000005d0000005e0000005f0000006000000061000000620000006300000064090000005c0000 *005d0000005e0000005f000000600000006100000062000000630000006400090000005c000000 *005d000000005e000000005f000000006000000000610000000062000000006300000000640000 *0000000000000e000000000c000000650000000000660000000000670000000000680000000000 *6900000000006a00000000006b00000000006c00000000006d00000000006e00000000006f0000 *0000007000000c00000065000000660000006700000068000000690000006a0000006b0000006c *0000006d0000006e0000006f000000700001000c00000065010000006600000066000000006701 *00000068000000680000000069010000006a0000006a000000006b010000006c0000006c000000 *006d000000006e000000006f000000007000000000000000000f00000000000000010000000000 *000000000600000000004b0000001d0000001e0000001f00000020000000210000002200000023 *0000002400000025000000260000002700000028000000290000002a0000002b0000002c000000 *2d0000002e0000002f000000300000003100000032000000330000003400000035000000360000 *003700000038000000390000003a0000003b0000003c0000003d0000003e0000003f0000004000 *00004100000042000000430000004400000045000000460000004700000048000000490000004a *0000004b0000004c0000004d0000004e0000004f00000050000000510000005200000053000000 *5400000055000000560000005700000058000000590000005a0000005b00000065000000660000 *006700000068000000690000006a0000006b0000006c0000006d0000006e0000006f000000704b *000000340000003700000036000000350000003b0000003a00000039000000380000003c000000 *3d0000003100000033000000320000003e0000002e000000300000002f00000026000000270000 *0028000000290000002a0000002b0000002c0000002d0000002100000022000000230000002400 *0000250000003f0000004000000041000000420000004300000044000000450000004600000047 *00000048000000490000004a0000004b0000004c0000004d0000004e0000004f00000050000000 *200000001d0000001e0000001f0000005100000052000000530000005400000055000000560000 *005700000058000000590000005a0000005b000000690000006a0000006b0000006c0000007000 *00006f0000006e0000006d00000067000000680000006500000066000000000000000000080000 *00001b000000710000000000720000000000730000000000740000000000750103010238000000 *430000006f0000006e0000007600000065000000720000007400000073000000200000006c0000 *0069000000730000007400000073000000200000006f0000006600000020000000730000007400 *000072000000690000006e00000067000000200000007000000061000000690000007200000073 *00000020000000690000006e000000740000006f0000002000000061000000200000006c000000 *690000007300000074000000200000006f0000006600000020000000450000006c000000650000 *006d000000650000006e00000074000000730000002e0000000a01021900000020000000540000 *006800000065000000200000006200000061000000730000006900000063000000200000007300 *000074000000720000007500000063000000740000007500000072000000650000002000000069 *00000073000000200000000a01020e000000200000007000000061000000690000007200000073 *000000540000006f000000580000006d0000006c000000200000005b0000002801050300000066 *0000006f0000006f0102010000002c010503000000620000006100000072010201000000290102 *010000005d010209000000200000003d000000200000005b000000450000006c00000065000000 *6d00000020010503000000660000006f0000006f010208000000200000005b0000004300000044 *000000610000007400000061000000200105030000006200000061000000720102010000005d01 *02010000005d0102010000000a01020e0000002000000070000000610000006900000072000000 *73000000540000006f000000580000006d0000006c000000200000005b00000028010507000000 *660000006f0000006f0000002f0000006200000061000000720102010000002c01050300000062 *000000610000007a010201000000290102010000005d010209000000200000003d000000200000 *005b000000450000006c000000650000006d00000020010503000000660000006f0000006f0102 *07000000200000005b000000450000006c000000650000006d0000002001050300000062000000 *6100000072010208000000200000005b0000004300000044000000610000007400000061000000 *2001050300000062000000610000007a0102010000005d0102010000005d0102010000005d0202 *000000200000000a00000000a10000000000a20000000000760103010237000000430000006f00 *00006e00000076000000650000007200000074000000730000002000000061000000200000006c *000000690000007300000074000000200000006f0000006600000020000000450000006c000000 *650000006d000000650000006e000000740000007300000020000000740000006f000000200000 *0061000000200000006c000000690000007300000074000000200000006f000000660000002000 *0000530000007400000072000000690000006e0000006700000020000000700000006100000069 *00000072000000730000002e0000000a01021400000020000000780000006d0000006c00000054 *0000006f0000005000000061000000690000007200000073000000200000005b00000043000000 *44000000610000007400000061000000200000005f0102010000005d010209000000200000003d *000000200000006500000072000000720000006f000000720000000a0102120000002000000078 *0000006d0000006c000000540000006f0000005000000061000000690000007200000073000000 *200000005b000000450000006c000000650000006d00000020010503000000660000006f000000 *6f010208000000200000005b000000430000004400000061000000740000006100000020010503 *0000006200000061000000720102010000005d0102010000005d010205000000200000003d0000 *00200000005b00000028010503000000660000006f0000006f0102010000002c01050300000062 *0000006100000072010201000000290102010000005d0102010000000a01021200000020000000 *780000006d0000006c000000540000006f00000050000000610000006900000072000000730000 *00200000005b000000450000006c000000650000006d00000020010503000000660000006f0000 *006f010207000000200000005b000000450000006c000000650000006d00000020010503000000 *620000006100000072010208000000200000005b00000043000000440000006100000074000000 *610000002001050300000062000000610000007a0102010000005d0102010000005d0102010000 *005d010205000000200000003d000000200000005b00000028010507000000660000006f000000 *6f0000002f0000006200000061000000720102010000002c01050300000062000000610000007a *010201000000290102010000005d0102010000000a021e00000020000000780000006d0000006c *000000540000006f0000005000000061000000690000007200000073000000200000002e000000 *200000007000000061000000690000007200000073000000540000006f000000580000006d0000 *006c000000200000003d0000002000000069000000640000000a00000000a30000000000770103 *010248000000430000007200000065000000610000007400000065000000730000002000000074 *000000680000006500000020000000580000006d0000006c000000200000007300000074000000 *7200000075000000630000007400000075000000720000006500000020000000630000006f0000 *0072000000720000006500000073000000700000006f0000006e00000064000000690000006e00 *00006700000020000000740000006f000000200000007400000068000000650000002000000073 *000000700000006500000063000000690000006600000069000000630000006100000074000000 *690000006f0000006e000000200000006f0000006600000020000000610000006e000000200000 *0048000000540000004d0000004c0000000a024900000020000000660000006f00000072000000 *6d0000002e00000020000000200000005400000068000000650000002000000070000000720000 *006f00000076000000690000006400000065000000640000002000000070000000610000006900 *000072000000730000002000000073000000680000006f000000750000006c0000006400000020 *000000620000006500000020000000740000006800000065000000200000007300000070000000 *6500000063000000200000006f0000006600000020000000740000006800000065000000200000 *00690000006e0000007000000075000000740000007300000020000000740000006f0000002000 *000074000000680000006500000020000000660000006f000000720000006d0000002e0000000a *00000000a40000000000a500000000007801030254000000450000007100000075000000690000 *0076000000610000006c000000650000006e0000007400000020000000740000006f0000002000 *00007000000061000000690000007200000073000000540000006f00000048000000540000004d *0000004c000000460000006f000000720000006d00000020000000620000007500000074000000 *20000000660000006900000072000000730000007400000020000000630000006f0000006e0000 *007600000065000000720000007400000073000000200000007400000068000000650000002000 *0000580000006d0000006c00000020000000690000006e0000007300000074000000610000006e *000000630000006500000020000000740000006f000000200000006c0000006900000073000000 *74000000200000006f000000660000002000000070000000610000006900000072000000730000 *002e0000000a000000007900000000007a0103027b000000450000007100000075000000690000 *0076000000610000006c000000650000006e0000007400000020000000740000006f0000002000 *00007000000061000000690000007200000073000000540000006f00000048000000540000004d *0000004c000000460000006f000000720000006d00000020000000620000007500000074000000 *20000000660000006900000072000000730000007400000020000000630000006f0000006e0000 *007600000065000000720000007400000073000000200000007400000068000000650000002000 *0000580000006d0000006c00000020000000690000006e0000007300000074000000610000006e *000000630000006500000020000000740000006f000000200000006c0000006900000073000000 *74000000200000006f000000660000002000000070000000610000006900000072000000730000 *002e0000002000000020000000410000006e00000020000000610000006c000000690000006100 *00007300000020000000660000006f0000007200000020000000780000006d0000006c00000054 *0000006f00000048000000540000004d0000004c000000460000006f000000720000006d000000 *2000000063000000750000007200000072000000650000006e000000740000006c000000790000 *002e0000000a00000000a60000000000a70000000000a80000000000a90000000000aa00000000 *00ab0000000000ac0000000000ad0000000000ae0000000000af0000000000b00000000000b100 *000a00000071000000720000007300000074000000750000007600000077000000780000007900 *00007a0a00000075000000760000007700000078000000790000007a0000007400000071000000 *7200000073000a0000007102000000720000007300000072000000007300000000740000000075 *0000000076000000007700000000780000000079000000007a0000000000000000090000000007 *0000007b0103023c00000050000000720000006f00000078000000790000002000000069000000 *7300000020000000650000006d00000070000000740000007900000020000000610000006e0000 *006400000020000000690000007300000020000000750000007300000065000000640000002000 *000061000000730000002000000061000000200000007400000072000000610000006e00000073 *000000700000006f0000007200000074000000200000006f000000660000002000000061000000 *200000007000000068000000610000006e000000740000006f0000006d00000020000000740000 *007900000070000000650000000a000000007c00000000007d00000000007e00000000007f0103 *023400000043000000720000006500000061000000740000006500000073000000200000007400 *000068000000650000002000000050000000720000006f00000078000000790000002000000077 *000000690000007400000068000000200000006100000020000000740000007900000070000000 *65000000200000006d00000061000000740000006300000068000000690000006e000000670000 *002000000074000000680000006500000020000000610000007200000067000000750000006d00 *0000650000006e000000740000000a00000000800103020f000000520000006500000074000000 *75000000720000006e0000007300000020000000620000006f00000074000000740000006f0000 *006d0000000a000000008101030232000000410000006300000074000000730000002000000061 *000000730000002000000069000000640000002000000065000000780000006300000065000000 *700000007400000020000000660000006f000000720000002000000070000000720000006f0000 *00760000006900000064000000690000006e000000670000002000000074000000790000007000 *000065000000200000007200000065000000730000007400000072000000690000006300000074 *000000690000006f0000006e000000730000000a00070000007b0000007c0000007d0000007e00 *00007f0000008000000081070000007b0000007c0000007e0000007d0000007f00000080000000 *8100070000007b010000007c0000007c000000007d000000007e000000007f0000000080000000 *008100000000000000000a0000000023000000820103010251000000550000006e000000690000 *00660000006f000000720000006d00000020000000630000006f0000006e000000740000006100 *0000690000006e000000650000007200000020000000660000006f000000720000002000000061 *0000006e000000790000002000000073000000650000007200000069000000610000006c000000 *690000007a000000650000006400000020000000640000006100000074000000610000002e0000 *002000000020000000490000007400000020000000630000006f0000006e000000740000006100 *0000690000006e0000007300000020000000610000002000000073000000740000007200000069 *0000006e0000006700000020000000720000006500000070000000200000006f00000066000000 *2000000074000000680000006500000020000000740000007900000070000000650000000a0232 *00000020000000610000006e000000640000002000000074000000680000006500000020000000 *61000000630000007400000075000000610000006c000000200000006400000061000000740000 *00610000002000000073000000650000007200000069000000610000006c000000690000007a00 *0000650000006400000020000000740000006f0000002000000061000000200000006200000079 *000000740000006500000020000000730000007400000072000000690000006e00000067000000 *2e0000000a00000000b20000000000830000000000b30000000000840000000000850000000000 *860000000000870103010249000000540000006800000065000000200000005600000065000000 *7200000073000000690000006f0000006e00000020000000740000007900000070000000650000 *0020000000630000006c0000006100000073000000730000002000000069000000730000002000 *00007500000073000000650000006400000020000000740000006f000000200000006400000065 *000000730000006300000072000000690000006200000065000000200000007700000068000000 *650000007400000068000000650000007200000020000000610000002000000074000000790000 *0070000000650000002000000069000000730000002000000066000000750000006e0000006400 *0000610000006d000000650000006e00000074000000610000006c0000000a0102490000002000 *00006f000000720000002000000069000000660000002000000069000000740000002000000069 *00000073000000200000006d00000065000000610000006e000000740000002000000074000000 *6f00000020000000650000007800000074000000650000006e0000006400000020000000610000 *006e0000006f000000740000006800000065000000720000002000000074000000790000007000 *0000650000002e0000002000000020000000460000006f00000072000000200000006100000020 *000000750000007300000065000000720000002000000064000000650000006600000069000000 *6e0000006500000064000000200000007400000079000000700000006500000020000000740000 *006800000061000000740000000a01024f00000020000000640000006f00000065000000730000 *00200000006e0000006f0000007400000020000000650000007800000074000000650000006e00 *00006400000020000000610000006e00000079000000200000006f000000740000006800000065 *00000072000000730000002c000000200000006f0000006e000000650000002000000063000000 *610000006e00000020000000750000007300000065000000200000007400000068000000650000 *002000000064000000650000006600000061000000750000006c00000074000000200000006900 *00006e0000007300000074000000610000006e0000006300000065000000200000006f00000066 *0000002000000056000000650000007200000073000000690000006f0000006e0000002c000000 *20000000650000002e000000670000002e0000000a010201000000200107021700000069000000 *6e0000007300000074000000610000006e00000063000000650000002000000056000000650000 *007200000073000000690000006f0000006e000000200000004d00000079000000540000007900 *0000700000006501023800000020000000740000006f0000002000000064000000650000006600 *0000690000006e0000006500000020000000690000007400000020000000680000006100000073 *00000020000000680000006100000076000000690000006e000000670000002000000061000000 *2000000076000000650000007200000073000000690000006f0000006e00000020000000690000 *0064000000200000006f00000066000000200000003000000020000000610000006e0000006400 *00002000000070000000720000006500000076000000690000006f00000075000000730000000a *020700000020000000740000007900000070000000650000002e0000000a000000008800000000 *008900000000008a00000000008b010301020f0000004400000061000000740000006100000020 *0000006c00000061000000790000006f000000750000007400000020000000770000006f000000 *6e01020100000027022c00000074000000200000006300000068000000610000006e0000006700 *0000650000002e000000200000005500000073000000650000006400000020000000660000006f *00000072000000200000007400000079000000700000006500000073000000200000006c000000 *690000006b0000006500000020000000490000006e0000007400000020000000610000006e0000 *006400000020000000430000006800000061000000720000002e0000000a00000000b400000000 *00b50000000000b60000000000b70000000000b800000000008c0000000000b90000000000ba00 *000000008d010302280000004c0000006900000066000000740000007300000020000000740000 *0068000000650000002000000070000000720000006f0000007600000069000000640000006500 *0000640000002000000076000000610000006c000000750000006500000020000000690000006e *000000740000006f00000020000000430000006f0000006e000000740000006100000069000000 *6e00000065000000640000000a00000000bb00000000008e010301024f00000043000000720000 *0065000000610000007400000065000000730000002000000061000000200000004d0000006f00 *000064000000650000002000000074000000680000006100000074000000200000006900000073 *0000002000000061000000200000006e0000006500000077000000200000007600000065000000 *7200000073000000690000006f0000006e000000200000006f0000006600000020000000740000 *006800000065000000200000007400000079000000700000006500000020000000630000006100 *000072000000720000006900000065000000640000002000000062000000790000002000000074 *00000068000000650000002000000070000000720000006f000000760000006900000064000000 *65000000640000002000000070000000720000006f00000078000000790000000a010254000000 *20000000610000006e000000640000002000000077000000690000007400000068000000200000 *007400000068000000650000002000000070000000720000006f00000076000000690000006400 *000065000000640000002000000076000000650000007200000073000000690000006f0000006e *000000200000006e000000750000006d0000006200000065000000720000002e00000020000000 *200000004e0000006f000000740000006500000020000000740000006800000061000000740000 *002000000073000000690000006e00000063000000650000002000000056000000650000007200 *000073000000690000006f0000006e000000490000006400000020000000690000007300000020 *000000610000006e00000020000000690000006e0000007300000074000000610000006e000000 *6300000065000000200000006f000000660000000a010241000000200000004e00000075000000 *6d000000200000007400000068000000610000007400000020000000790000006f000000750000 *00200000006d000000610000007900000020000000750000007300000065000000200000006900 *00006e00000074000000200000006c00000069000000740000006500000072000000610000006c *00000073000000200000007700000068000000650000006e000000200000006300000061000000 *6c0000006c000000690000006e0000006700000020000000650000007800000074000000650000 *006e00000073000000690000006f0000006e0000002c00000020000000650000002e0000006700 *00002e000000200000000a01020100000020010702250000006500000078000000740000006500 *00006e00000073000000690000006f0000006e0000002000000031000000200000002800000050 *000000720000006f0000007800000079000000200000003a0000003a0000002000000050000000 *720000006f0000007800000079000000200000004f0000006c0000006400000053000000740000 *006100000074000000650000002902010000000a000000008f0000000000900000000000910103 *01023c0000004500000071000000750000006900000076000000610000006c000000650000006e *00000074000000200000006f000000660000002000000044000000610000007400000061000000 *2e00000042000000690000006e0000006100000072000000790000002e00000070000000750000 *007400000020000000660000006f0000007200000020000000690000006e000000730000007400 *0000610000006e000000630000006500000073000000200000006f000000660000002000000053 *000000650000007200000069000000610000006c000000690000007a000000650000002e000000 *20000000200000000a02290000002000000054000000610000006b000000650000007300000020 *000000690000006e000000740000006f000000200000006100000063000000630000006f000000 *750000006e000000740000002000000076000000650000007200000073000000690000006f0000 *006e000000690000006e00000067000000200000006f0000006600000020000000740000007900 *00007000000065000000730000002e0000000a0000000092010301023900000045000000710000 *00750000006900000076000000610000006c000000650000006e00000074000000200000006f00 *00006600000020000000440000006100000074000000610000002e00000042000000690000006e *0000006100000072000000790000002e0000006700000065000000740000002000000066000000 *6f0000007200000020000000690000006e0000007300000074000000610000006e000000630000 *006500000073000000200000006f00000066000000200000005300000065000000720000006900 *0000610000006c000000690000007a000000650000000a02290000002000000054000000610000 *006b000000650000007300000020000000690000006e000000740000006f000000200000006100 *000063000000630000006f000000750000006e0000007400000020000000760000006500000072 *00000073000000690000006f0000006e000000690000006e00000067000000200000006f000000 *660000002000000074000000790000007000000065000000730000002e0000000a00000000bc00 *00000000bd0103022b000000430000006f0000006d000000700000006100000072000000650000 *007300000020000000740000006800000065000000200000006e000000750000006d0000006500 *00007200000069000000630000002000000076000000610000006c000000750000006500000020 *0000006f0000006600000020000000740000006800000065000000200000007600000065000000 *7200000073000000690000006f0000006e000000730000000a0000000093010301021000000050 *000000750000007200000065000000200000007600000065000000720000007300000069000000 *6f0000006e000000200000006f000000660000002001040100000091021e0000002e0000002000 *00002000000053000000650000007200000069000000610000006c000000690000007a00000065 *0000007300000020000000740000006f0000002000000061000000200000004200000079000000 *7400000065000000530000007400000072000000690000006e000000670000000a000000009401 *030102100000005000000075000000720000006500000020000000760000006500000072000000 *73000000690000006f0000006e000000200000006f00000066000000200104010000009201022e *0000002e0000002000000020000000500000006100000072000000730000006500000073000000 *200000006100000020000000420000007900000074000000650000005300000074000000720000 *00690000006e0000006700000020000000690000006e000000740000006f000000200000007400 *000068000000650000002000000065000000780000007000000065000000630000007400000065 *0000006400000020000000740000007900000070000000650000000a0212000000200000006100 *00006e0000006400000020000000610000002000000072000000650000006d0000006100000069 *0000006e0000006400000065000000720000002e0000000a000000009501030210000000560000 *00650000007200000073000000690000006f0000006e000000200000006c0000006f0000006f00 *00006b0000007500000070000000730000000a0000000096010301040100000094021900000020 *0000007300000070000000650000006300000069000000610000006c000000690000007a000000 *650000006400000020000000740000006f000000200000004f000000620000006a000000650000 *00630000007400000073000000200000000a000000009701030102370000004100000074000000 *74000000650000006d00000070000000740000007300000020000000740000006f000000200000 *00630000006f0000006e0000007600000065000000720000007400000020000000610000006e00 *0000200000004f000000620000006a000000650000006300000074000000200000006200000061 *000000630000006b00000020000000690000006e000000740000006f0000002000000069000000 *740000007300000020000000620000006100000073000000650000002000000074000000790000 *0070000000650000002e0000000a01021900000020000000490000006600000020000000740000 *00680000006500000020000000630000006f0000006e0000007600000065000000720000007300 *0000690000006f0000006e000000200000006600000061000000690000006c0000007300000020 *010401000000be02110000002000000077000000690000006c0000006c00000020000000620000 *00650000002000000063000000610000006c0000006c00000065000000640000002e0000000a00 *000000980103024400000053000000650000007200000069000000610000006c00000069000000 *7a0000006500000073000000200000006400000061000000740000006100000020000000610000 *006e000000640000002000000073000000740000006f0000007200000065000000730000002000 *0000690000007400000020000000610000006c0000006f0000006e000000670000002000000077 *000000690000007400000068000000200000006900000074000000730000002000000074000000 *790000007000000065000000200000006e000000610000006d0000006500000020000000690000 *006e00000020000000610000006e000000200000004f000000620000006a000000650000006300 *0000740000000a002000000011000000120000007b0000007c0000007d0000007e0000007f0000 *008000000081000000820000008300000084000000850000008600000087000000880000008900 *00008a0000008b0000008c0000008d0000008e0000008f00000090000000910000009200000093 *000000940000009500000096000000970000009819000000840000008500000086000000870000 *00880000001100000012000000890000008b0000008a0000008c0000008d0000008e0000009200 *0000910000008f0000009000000093000000940000009500000082000000830000009800000096 *000000970017000000820100000083000000830000000084020000008500000086000000850000 *00008600000000870100000088000000880000000089020000008b0000008a0000008a00000000 *8b000000008c000000008d000000008e000000008f000000009000000000910000000092000000 *00930000000094000000009500000000960000000097000000009800000000000000000b000000 *0006000000bf0000000000c0000000000099010301023700000044000000650000007200000069 *00000076000000650000007300000020000000610000006e00000020000000690000006e000000 *7300000074000000610000006e0000006300000065000000200000006f00000066000000200000 *0053000000650000007200000069000000610000006c000000690000007a000000650000002000 *0000660000006f0000007200000020000000740000006800000065000000200000007000000072 *0000006f0000007600000069000000640000006500000064000000200000007400000079000000 *70000000650000000a01023f0000002000000053000000680000006f000000750000006c000000 *6400000020000000770000006f000000720000006b00000020000000690000006e000000200000 *006d0000006f000000730000007400000020000000630000006100000073000000650000007300 *000020000000690000006600000020000000740000006800000065000000200000007400000079 *000000700000006500000020000000690000007300000020000000610000006c00000072000000 *6500000061000000640000007900000020000000610000006e0000006400000020000000690000 *006e0000007300000074000000610000006e00000063000000650000000a01020f000000200000 *006f000000660000002000000056000000650000007200000073000000690000006f0000006e00 *00002e00000020000000200000000a0102050000002000000045000000780000003a0000002001 *070102120000002400000028000000640000006500000072000000690000007600000065000000 *53000000650000007200000069000000610000006c000000690000007a00000065000000200102 *0100000027010201000000270204000000460000006f0000006f0000002902010000000a000000 *009a01030226000000440000006500000072000000690000007600000065000000730000002000 *000053000000650000007200000069000000610000006c000000690000007a0000006500000020 *000000660000006f000000720000002000000061000000200000006c0000006900000073000000 *74000000200000006f000000660000002000000074000000790000007000000065000000730000 *000a00000000c10000000000c2000002000000990000009a02000000990000009a000200000099 *000000009a0000000000000000100000000000ba000000c3000000c4000000c5000000c6000000 *c7000000c8000000c9000000ca000000cb000000cc000000cd000000ce000000cf000000d00000 *00d1000000d2000000d3000000d4000000d5000000d6000000d7000000d8000000d9000000da00 *0000db000000dc000000dd000000de000000df000000e0000000e1000000e2000000e3000000e4 *000000e5000000e6000000e7000000e8000000e9000000ea000000000000000100000002000000 *030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000 *000d0000000e0000000f0000001000000011000000120000001300000014000000150000001600 *00001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f00000020 *000000210000002200000023000000240000002500000026000000270000002800000029000000 *2a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000330000 *003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d00 *00003e0000003f0000004000000041000000420000004300000044000000450000004600000047 *00000048000000490000004a0000004b0000004c0000004d0000004e0000004f00000050000000 *5100000052000000530000005400000055000000560000005700000058000000590000005a0000 *005b00000065000000660000006700000068000000690000006a0000006b0000006c0000006d00 *00006e0000006f0000007000000071000000720000007300000074000000750000007600000077 *00000078000000790000007a0000007b0000007c0000007d0000007e0000007f00000080000000 *8100000082000000830000008400000085000000860000008700000088000000890000008a0000 *008b0000008c0000008d0000008e0000008f000000900000009100000092000000930000009400 *000095000000960000009700000098000000990000009a00000000000000000000eb0000000000 *000001000000001100000000000000010000000012000000000000000100000000130000000000 *000001000000001400000000000000010000000015000000000000000100000000160000000000 *000001000000001700000000000000020300000018000000000000000201000000180000000000 *00000200000000190000000000000002000000001a0000000000000002030000001b0000000000 *000002000000001c0000000000000002000000001d0000000000000002000000001e0000000000 *000002000000001f00000000000000020000000020000000000000000303000000210000000000 *000003000000002200000000000000040300000023000000000000000401000000230000000000 *000004000000002400000000000000040300000025000000000000000400000000260000000000 *000004000000002700000000000000040000000028000000000000000500000000290000000000 *000005000000002a0000000000000005000000002b000000000000000d030000002c0000000000 *00000d010000002c000000000000000d000000002d000000000000000d030000002e0000000000 *00000d030000002f000000000000000d010000002f000000000000000d00000000300000000000 *00000d0000000031000000000000000d0000000032000000000000000d03000000330000000000 *00000d0000000034000000000000000d0000000035000000000000000d00000000360000000000 *00000d0000000037000000000000000d0000000038000000000000000d00000000390000000000 *00000d000000003a000000000000000d030000003b000000000000000d010000003c0000000000 *00000d010000003d000000000000000d030000003e000000000000000d010000003f0000000000 *00000d010000003e000000000000000d0300000040000000000000000d01000000410000000000 *00000d0100000042000000000000000d0100000043000000000000000d00000000440000000000 *00000d0000000045000000000000000d0000000046000000000000000d00000000470000000000 *00000d0000000048000000000000000d0000000049000000000000000d000000004a0000000000 *00000d000000004b000000000000000d000000004c000000000000000d000000004d0000000000 *00000d000000004e000000000000000d000000004f000000000000000d00000000500000000000 *00000d0000000051000000000000000d0000000052000000000000000d00000000530000000000 *00000d0000000054000000000000000d0000000055000000000000000d00000000560000000000 *00000d0000000057000000000000000d0000000058000000000000000d00000000590000000000 *00000d000000005a000000000000000d000000005b000000000000000d000000005c0000000000 *00000d000000005d000000000000000d000000005e000000000000000d000000005f0000000000 *00000d0000000060000000000000000d0000000061000000000000000d00000000620000000000 *00000d0000000063000000000000000d0000000064000000000000000d00000000650000000000 *00000d0000000066000000000000000d0000000067000000000000000700000000680000000000 *00000700000000690000000000000007000000006a0000000000000007000000006b0000000000 *000007000000006c0000000000000007000000006d0000000000000007000000006e0000000000 *000007000000006f00000000000000070000000070000000000000000e03000000710000000000 *00000e0000000072000000000000000e0300000073000000000000000e00000000740000000000 *00000e0300000075000000000000000e0100000075000000000000000e03000000760000000000 *00000e0100000076000000000000000e0000000077000000000000000e00000000780000000000 *00000e0000000079000000000000000e000000007a0000000000000008030000007b0000000000 *000008000000007c0000000000000008000000007d0000000000000008030000007e0000000000 *000008000000007f00000000000000080000000080000000000000000800000000810000000000 *000008000000008200000000000000080000000083000000000000000800000000840000000000 *000009030000008500000000000000090100000085000000000000000900000000860000000000 *000009000000008700000000000000090000000088000000000000000900000000890000000000 *000009000000008a000000000000000a030000008b000000000000000a000000008c0000000000 *00000a030000008d000000000000000a000000008e000000000000000a000000008f0000000000 *00000a0300000090000000000000000a0000000091000000000000000a03000000920000000000 *00000a0100000093000000000000000a0100000094000000000000000a03000000950000000000 *00000a0000000096000000000000000a0000000097000000000000000a00000000980000000000 *00000a0000000099000000000000000a000000009a000000000000000a000000009b0000000000 *00000a000000009c000000000000000a000000009d000000000000000a000000009e0000000000 *00000a000000009f000000000000000a00000000a0000000000000000a00000000a10000000000 *00000b00000000a2000000000000000b00000000a3000000a4000000a500000000a60000000000 *00000500000000a7000000000000000500000000a8000000000000000500000000a90000000000 *00000500000000aa000000000000000500000000ab000000000000000800000000ac0000000000 *00000800000000ad000000000000000800000000ae000000000000000800000000af0000000000 *00000800000000b0000000000000000803000000b1000000000000000801000000b10000000000 *00000803000000b2000000000000000801000000b2000000000000000803000000b30000000000 *00000801000000b3000000000000000800000000b4000000000000000800000000b50000000000 *00000800000000b6000000000000000800000000b7000000000000000800000000b80000000000 *00000800000000b9000000000000000a010000008b000000000000000a00000000ba0000000000 *00000a03000000bb000000000000000a01000000bb000000000000000a00000000bc0000000000 *00000a03000000bd000000000000000a01000000bd000000000000000a01000000950000000000 *00000a00000000be000000000000000a00000000bf000000000000000a00000000c00000000000 *00000a00000000c1000000a4000000c200000000c3000000000000000b03000000c40000000000 *00000b01000000c5000000000000000b00000000c6000000000000000b00000000c7000000a400 *0000c803000000c9000000a4000000c803000000ca000000a4000000c803000000cb000000a400 *0000c803000000cc000000a4000000c803000000cd000000a4000000c803000000ce000000a400 *0000c803000000cf000000a4000000c803000000d0000000a4000000c800000000d1000000a400 *0000c800000000d2000000a4000000c800000000d3000000a4000000c800000000d4000000a400 *0000c800000000d5000000a4000000c800000000d6000000a4000000c800000000d7000000a400 *0000c800000000d8000000a4000000c800000000d9000000a4000000c800000000da000000a400 *0000c800000000db000000a4000000c800000000dc000000a4000000c800000000dd000000a400 *0000c800000000de000000a4000000c800000000df000000a4000000c800000000e0000000a400 *0000c800000000e1000000a4000000c800000000e2000000a4000000c800000000e3000000a400 *0000c800000000e4000000a4000000c800000000e5000000a4000000c800000000e6000000a400 *0000c800000000e7000000a4000000c800000000e8000000a4000000c800000000e9000000a400 *0000c800000000ea000000a4000000c803000000eb000000a4000000c803000000ec000000a400 *0000c800000000ed000000a4000000c800000000ee000000a4000000c800000000ef000000a400 *0000c800000000f000000000000000f1000000000000001468617070737461636b2d646174612d *302e352e30000000000000001348617070737461636b2e446174612e474f707300000000000000 *1848617070737461636b2e446174612e4e6f726d616c697a650000000000000016486170707374 *61636b2e446174612e4d696772617465000000000000001648617070737461636b2e446174612e *44656661756c74000000000000001848617070737461636b2e446174612e446572697665416c6c *000000000000001248617070737461636b2e446174612e586d6c00000000000000184861707073 *7461636b2e446174612e586d6c2e4861586d6c000000000000001448617070737461636b2e4461 *74612e5061697273000000000000001448617070737461636b2e446174612e50726f7879000000 *000000001848617070737461636b2e446174612e53657269616c697a65000000000000001a4861 *7070737461636b2e446174612e53657269616c697a655448000000000000001e48617070737461 *636b2e446174612e44656661756c742e47656e6572696300000000000000174861707073746163 *6b2e446174612e586d6c2e42617365000000000000001d48617070737461636b2e446174612e58 *6d6c2e5072696e745061727365000000000000001c48617070737461636b2e446174612e586d6c *2e496e7374616e636573000000000000000e48617070737461636b2e4461746100000000000000 *04675365740000000000000008675265706c61636500000000000000056746696e640000000000 *0000066746696e64270000000000000007674d6f6469667900000000000000046741736b000000 *000000000467476574000000000000000a4e6f726d616c697a6544000000000000000a6e6f726d *616c697a654400000000000000156e6f726d616c697a655265637572736976656c794400000000 *000000094e6f726d616c697a6500000000000000096e6f726d616c697a6500000000000000146e *6f726d616c697a655265637572736976656c79000000000000001064656661756c744e6f726d61 *6c697a65000000000000001b64656661756c744e6f726d616c697a655265637572736976656c79 *000000000000000e6e6f726d616c697a6550726f787900000000000000074d6967726174650000 *0000000000076d696772617465000000000000000844656661756c7444000000000000000d6465 *6661756c7456616c756544000000000000000744656661756c74000000000000000c6465666175 *6c7456616c7565000000000000001364656661756c7444656661756c7456616c75650000000000 *00000c64656661756c7450726f7879000000000000000d6465726976654e657744617461000000 *00000000166465726976654e6577446174614e6f44656661756c74000000000000000964657269 *7665416c6c00000000000000095265616453746174650000000000000004786d6c730000000000 *000005526561644d0000000000000004586d6c440000000000000006746f586d6c440000000000 *000009726561644d586d6c440000000000000016726561644d586d6c4e6f526f6f744465666175 *6c74440000000000000003586d6c0000000000000005746f586d6c000000000000000772656164 *586d6c000000000000000872656164586d6c27000000000000000c6e6f726d616c697a65586d6c *000000000000000776657273696f6e000000000000000c6f7468657256657273696f6e00000000 *00000003747970000000000000000852696769646974790000000000000008466c657869626c65 *0000000000000005526967696400000000000000054f7468657200000000000000074e6f4f7468 *65720000000000000007456c656d656e7400000000000000044174747200000000000000054344 *6174610000000000000004456c656d000000000000000c636f6e7374725b613734795d00000000 *0000000c636f6e7374725b6137347a5d000000000000000c636f6e7374725b613734415d000000 *000000000e64617461547970655b613734785d0000000000000005696e73456c00000000000000 *0766726f6d586d6c000000000000000b746f5075626c6963586d6c0000000000000008786d6c50 *726f787900000000000000056669727374000000000000000c64656661756c74546f586d6c0000 *0000000000107472616e73706172656e74546f586d6c00000000000000127472616e7370617265 *6e7452656164586d6c000000000000000e7472616e73706172656e74586d6c000000000000000e *64656661756c7452656164586d6c000000000000000f64656661756c7452656164586d6c270000 *00000000000b72656164586d6c5769746800000000000000147265616456657273696f6e656445 *6c656d656e74000000000000000969735468654174747200000000000000076765744174747200 *0000000000000b76657273696f6e41747472000000000000000874797065417474720000000000 *00000b72656164456c656d656e74000000000000001361436f6e73747246726f6d456c656d656e *7473000000000000001f636f6e73747246726f6d456c656d656e74734e6f526f6f744465666175 *6c740000000000000012636f6e73747246726f6d456c656d656e74730000000000000007676574 *586d6c730000000000000007707574586d6c730000000000000008726561644d586d6c00000000 *00000015726561644d586d6c4e6f526f6f7444656661756c740000000000000007786d6c417474 *72000000000000000d786d6c53686f77434461746173000000000000000c786d6c53686f774344 *617461000000000000000d786d6c43446174614c69737473000000000000000c786d6c43446174 *614c69737400000000000000086e6f436f6d6d6173000000000000000c747970654e6f7456616c *756500000000000000066973417474720000000000000008746f4861586d6c7300000000000000 *09746f4861586d6c456c0000000000000007746f4861586d6c000000000000000b746f41747472 *6962757465000000000000000a66726f6d4861586d6c73000000000000000966726f6d4861586d *6c000000000000000e66726f6d41747472696275746573000000000000000d66726f6d41747472 *6962757465000000000000000a46726f6d537472696e67000000000000000a66726f6d53747269 *6e670000000000000008546f537472696e670000000000000008746f537472696e670000000000 *0000014b000000000000000157000000000000000c636f6e7374725b616644645d000000000000 *000e64617461547970655b616644635d000000000000000c636f6e7374725b6166446e5d000000 *000000000e64617461547970655b6166446d5d0000000000000007417350616972730000000000 *000007746f5061697273000000000000000966726f6d5061697273000000000000000550616972 *73000000000000000a7061697273546f586d6c000000000000000a786d6c546f50616972730000 *00000000000f7061697273546f48544d4c466f726d000000000000000d786d6c546f48544d4c46 *6f726d0000000000000008746f506169727358000000000000000a746f48544d4c466f726d0000 *00000000000550726f7879000000000000000c636f6e7374725b61706f775d000000000000000e *64617461547970655b61706f765d000000000000000570726f78790000000000000007756e5072 *6f7879000000000000000b617350726f78795479706500000000000000064f626a656374000000 *000000000a6f626a65637454797065000000000000000953657269616c697a6500000000000000 *07676574436f70790000000000000007707574436f7079000000000000000756657273696f6e00 *000000000000046d6f646500000000000000044d6f6465000000000000000956657273696f6e65 *6400000000000000095072696d69746976650000000000000009436f6e7461696e656400000000 *00000007636f6e7461696e0000000000000009657874656e73696f6e000000000000000a676574 *53616665476574000000000000000a676574536166655075740000000000000007736166655075 *74000000000000000773616665476574000000000000000973657269616c697a65000000000000 *000b646573657269616c697a65000000000000000f636f6c6c65637456657273696f6e73000000 *0000000011646573657269616c697a654f626a656374000000000000000b70617273654f626a65 *637400000000000000086d6b4f626a656374000000000000000f64657269766553657269616c69 *7a65000000000000001264657269766553657269616c697a65466f720000000000000004626173 *6500000000000000084748432e426173650000000000000002696400000000000000116d6b4465 *6661756c74496e7374616e6365000000000000000f7479566172426e6472546f4e616d65000000 *000000001161646444657269766564436c6173736573000000000000000d646572697665446566 *61756c74000000000000000f6973446174614f724e6577747970650000000000000005736c6173 *68000000000000000b666f726d496e746f456c73000000000000000c786d6c496e746f50616972 *73000000000000000c7375626d6974427574746f6e000000000000000870546f496e7075740000 *00000000000450617373000000000000000455736572000000000000000855736572496e666f00 *0000000000000c636f6e7374725b616d77775d000000000000000e64617461547970655b616d77 *765d000000000000000c636f6e7374725b616d77485d000000000000000e64617461547970655b *616d77475d000000000000000c636f6e7374725b616d77525d000000000000000e646174615479 *70655b616d77515d000000000000000a6f626a6563744461746100000000000000095665727369 *6f6e49640000000000000009756e56657273696f6e000000000000000850726576696f75730000 *00000000000c756e73616665556e5061636b000000000000000a6d6b50726576696f7573000000 *00000000107361666547657456657273696f6e6564000000000000000f636f6d70617265566572 *73696f6e7300000000000000074748432e45727200000000000000056572726f72000000000000 *0005436c617373000000000000000654616767656400000000000000066d6b5479706500000000 *000000097061727365496e666f000000000000000d446174612e5479706561626c650000000000 *0000085479706561626c6500000000000000095479706561626c65310000000000000009547970 *6561626c653200000000000000095479706561626c653300000000000000095479706561626c65 *3400000000000000095479706561626c653500000000000000095479706561626c653600000000 *000000095479706561626c65370000000000000006676361737432000000000000000667636173 *743100000000000000056763617374000000000000000e747970654f663644656661756c740000 *00000000000e747970654f663544656661756c74000000000000000e747970654f663444656661 *756c74000000000000000e747970654f663344656661756c74000000000000000e747970654f66 *3244656661756c74000000000000000e747970654f663144656661756c74000000000000000d74 *7970654f6644656661756c74000000000000000c73686f77735479706552657000000000000000 *0b7479436f6e537472696e67000000000000000b7479706552657041726773000000000000000c *747970655265705479436f6e00000000000000076d6b4170705479000000000000000b66756e52 *6573756c745479000000000000000d73706c69745479436f6e41707000000000000000076d6b46 *756e5479000000000000000a747970655265704b65790000000000000007747970654f66310000 *000000000007747970654f66320000000000000007747970654f66330000000000000007747970 *654f66340000000000000007747970654f66350000000000000007747970654f66360000000000 *000007747970654f663700000000000000075479706552657000000000000000055479436f6e00 *00000000000006747970654f6600000000000000076d6b5479436f6e000000000000000a6d6b54 *79436f6e417070000000000000000463617374 addfile ./docs/0.5.0/happstack-data/Happstack-Data-Default-Generic.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Default-Generic.html 1 + + +Happstack.Data.Default.Generic
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Default.Generic
    PortabilityNot portable
    Stabilityexperimental
    Maintainerhapps@googlegroups.com
    Description
    Provides a Default instance for all types. defaultDefaultValue is + used for defaultValue. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-Default.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Default.html 1 + + +Happstack.Data.Default
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Default
    PortabilityNot portable
    Stabilityexperimental
    Maintainerhapps@googlegroups.com
    Contents
    The interface +
    Writing your own instances +
    Advanced usage +
    Description
    Provides default values for Haskell datatypes. +
    Synopsis
    class Data DefaultD a => Default a where
    defaultValue :: a
    defaultDefaultValue :: (Data DefaultD a, Default a) => a
    data DefaultD a = DefaultD {
    defaultValueD :: a
    }
    defaultProxy :: Proxy DefaultD
    The interface +
    class Data DefaultD a => Default a whereSource

    The Default class provides a defaultValue value, which + is the default value for that type. +

    There is no instance for arbitrary types by default, but if you + declare an instance without providing the value then one will be + built using the first constructor. defaultValue is used to provide + values for any arguments of the constructor. +

    If you want an instance for all types then import + Happstack.Data.Default.Generic. +

    Methods
    defaultValue :: aSource
    Writing your own instances +
    defaultDefaultValue :: (Data DefaultD a, Default a) => aSource
    This is the defaultValue that is used in an instance if you don't + specify one. It may be a useful building block when writing your own + instances. +
    Advanced usage +
    data DefaultD a Source
    When writing your own generic functions for Default you may + need to access the class method through this datatype rather than + directly. +
    Constructors
    DefaultD
    defaultValueD :: a
    defaultProxy :: Proxy DefaultDSource
    When writing your own generic functions for Default you may + need this, the proxy value. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-DeriveAll.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-DeriveAll.html 1 + + +Happstack.Data.DeriveAll
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.DeriveAll
    PortabilityNot portable
    Stabilityexperimental
    Maintainerhapps@googlegroups.com
    Description
    Concisely specify which classes to derive for your datatypes. + As well as the standard derivable classes, it can also + derive syb-with-class's New.Data class and Happstack.Data.Default's + Default class. +
    Synopsis
    deriveAll :: [Name] -> Q [Dec] -> Q [Dec]
    deriveNewData :: [Name] -> Q [Dec]
    deriveNewDataNoDefault :: [Name] -> Q [Dec]
    Documentation
    deriveAll :: [Name] -> Q [Dec] -> Q [Dec]Source

    The deriveAll function takes a list of classes to derive and + a block of declarations. It will additionally derive instances for + Typeable, Old.Data and New.Data. +

    Example: +

     $( deriveAll [''Show, ''Eq, ''Default] [d|
    +        data Foo a = Foo a
    +        data Bar = Baz | Quux
    +  |] )
    +
    deriveNewData :: [Name] -> Q [Dec]Source
    Derives instances for syb-with-class's Data class and + Happstack.Data.Default's Default class. + The list of names should be of the form [''Foo,''Bar,..] +
    deriveNewDataNoDefault :: [Name] -> Q [Dec]Source
    Derives instances for syb-with-class's Data class only. + The list of names should be of the form [''Foo,''Bar,..] +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-GOps.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-GOps.html 1 + + +Happstack.Data.GOps
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.GOps
    Synopsis
    gSet :: (Data b, Typeable a) => a -> b -> b
    gReplace :: (Typeable a, Data b) => (a -> a) -> b -> b
    gFind :: (MonadPlus m, Data a, Typeable b) => a -> m b
    gFind' :: (Data a, Typeable b) => a -> b
    gModify :: (MonadState s m, Typeable a, Data s) => (a -> a) -> m ()
    gAsk :: (Data r, Typeable a, MonadReader r m, MonadPlus n) => (a -> n b) -> m (n b)
    gGet :: (Data s, Typeable a, MonadState s m, MonadPlus n) => (a -> n b) -> c -> m (n b)
    Documentation
    gSet :: (Data b, Typeable a) => a -> b -> bSource
    gSet x y will traveral x and replace + any instances of the type a in its structure + with y. +
    gReplace :: (Typeable a, Data b) => (a -> a) -> b -> bSource
    gReplace f b will traverse x and will act on + any instance of the type a in its structure with + the function f. +
    gFind :: (MonadPlus m, Data a, Typeable b) => a -> m bSource
    gFind a will extract any elements of type b from + a's structure in accordance with the MonadPlus + instance, e.g. Maybe Foo will return the first Foo + found while [Foo] will return the list of Foos found. +
    gFind' :: (Data a, Typeable b) => a -> bSource
    Acts as gFind but will throw an exception if + nothing is found. +
    gModify :: (MonadState s m, Typeable a, Data s) => (a -> a) -> m ()Source
    A generalized modify that will apply the modification + function to the structure of the state. +
    gAsk :: (Data r, Typeable a, MonadReader r m, MonadPlus n) => (a -> n b) -> m (n b)Source
    A generalized ask that will traverse the + stored type of the MonadReader in an attempt to find + an a and will then apply the provided function if + found. +
    gGet :: (Data s, Typeable a, MonadState s m, MonadPlus n) => (a -> n b) -> c -> m (n b)Source
    The equivalent of gAsk for MonadState +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-Migrate.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Migrate.html 1 + + +Happstack.Data.Migrate
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Migrate
    Synopsis
    class Migrate a b where
    migrate :: a -> b
    Documentation
    class Migrate a b whereSource
    Migrate instances are needed to allow upgrades of MACID state. It should be declared as instance Migrate Old New where migrate = transition_function +
    Methods
    migrate :: a -> bSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-Normalize.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Normalize.html 1 + + +Happstack.Data.Normalize
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Normalize
    PortabilityNot portable
    Stabilityexperimental
    Maintainerhapps@googlegroups.com
    Contents
    The interface +
    Writing your own instances +
    Advanced usage +
    Description
    Normalizing Haskell values. +
    Synopsis
    class Data NormalizeD a => Normalize a where
    normalize :: a -> a
    normalizeRecursively :: a -> a
    defaultNormalize :: Normalize a => a -> a
    defaultNormalizeRecursively :: Normalize a => a -> a
    data NormalizeD a = NormalizeD {
    normalizeD :: a -> a
    normalizeRecursivelyD :: a -> a
    }
    normalizeProxy :: Proxy NormalizeD
    The interface +
    class Data NormalizeD a => Normalize a whereSource

    The Normalize class provides a normalize function, which + is intended to normalize values only at the top-level constructor, + and a normalizeRecursively function, which is intended to + normalize all the subvalues and then normalize the top-level + constructor. +

    There is a default instance that matches all types, where normalize + is id and normalizeRecursively applies normalizeRecursively to + all of its children and then normalize to the result. +

    If you want to actually do some normalization for a certain type, + then just define an instance for that type; this will take precedence + over the default instance. +

    Methods
    normalize :: a -> aSource
    normalizeRecursively :: a -> aSource
    Writing your own instances +
    defaultNormalize :: Normalize a => a -> aSource
    This is the normalize function in the default Normalize + instance. It may be a useful building block when writing your own + instances. +
    defaultNormalizeRecursively :: Normalize a => a -> aSource
    This is the normalizeRecursively function in the default + Normalize instance. It may be a useful building block when writing + your own instances. +
    Advanced usage +
    data NormalizeD a Source
    When writing your own generic functions for Normalize you may + need to access the class methods through this datatype rather than + directly. +
    Constructors
    NormalizeD
    normalizeD :: a -> a
    normalizeRecursivelyD :: a -> a
    normalizeProxy :: Proxy NormalizeDSource
    When writing your own generic functions for Normalize you may + need this, the proxy value. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-Pairs.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Pairs.html 1 + + +Happstack.Data.Pairs
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Pairs
    Synopsis
    pairsToXml :: Pairs -> [Element]
    xmlToPairs :: [Element] -> Pairs
    pairsToHTMLForm :: String -> String -> String -> Pairs -> [Element]
    xmlToHTMLForm :: (Xml a, Show a, Data a, Eq a) => String -> String -> String -> a -> [Element]
    toPairsX :: (Xml a, Show a, Data a, Eq a) => a -> Pairs
    toHTMLForm :: (Xml a, Show a, Data a, Eq a) => String -> String -> String -> a -> [Element]
    type Pairs = [(String, String)]
    class (Xml x, Show x, Data x) => AsPairs x where
    toPairs :: x -> Pairs
    fromPairs :: Pairs -> Maybe x
    Documentation
    pairsToXml :: Pairs -> [Element]Source
    Converts lists of string pairs into a list of Elements. + The basic structure is + pairsToXml [(foo,bar)] = [Elem foo [CData bar]] + pairsToXml [(foo/bar,baz)] = [Elem foo [Elem bar [CData baz]]] +
    xmlToPairs :: [Element] -> PairsSource
    Converts a list of Elements to a list of String pairs. + xmlToPairs [CData _] = error + xmlToPairs [Elem foo [CData bar]] = [(foo,bar)] + xmlToPairs [Elem foo [Elem bar [CData baz]]] = [(foo/bar,baz)] + xmlToPairs . pairsToXml = id +
    pairsToHTMLForm :: String -> String -> String -> Pairs -> [Element]Source
    Creates the Xml structure corresponding to the specification of an HTML + form. The provided pairs should be the spec of the inputs to the form. +
    xmlToHTMLForm :: (Xml a, Show a, Data a, Eq a) => String -> String -> String -> a -> [Element]Source
    Equivalent to pairsToHTMLForm but first converts the Xml instance to list of pairs. +
    toPairsX :: (Xml a, Show a, Data a, Eq a) => a -> PairsSource
    toHTMLForm :: (Xml a, Show a, Data a, Eq a) => String -> String -> String -> a -> [Element]Source
    Equivalent to pairsToHTMLForm but first converts the Xml instance to list of pairs. An alias for xmlToHTMLForm currently. +
    type Pairs = [(String, String)]Source
    class (Xml x, Show x, Data x) => AsPairs x whereSource
    Methods
    toPairs :: x -> PairsSource
    fromPairs :: Pairs -> Maybe xSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-Proxy.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Proxy.html 1 + + +Happstack.Data.Proxy
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Proxy
    Synopsis
    data Proxy t[apou] = Proxy
    dataType[apov] :: DataType
    constr[apow] :: Constr
    proxy :: t -> Proxy t
    unProxy :: Proxy t -> t
    asProxyType :: t -> Proxy t -> t
    Documentation
    data Proxy t[apou] Source
    Proxy is empty and is used as a transport of a phantom type +
    Constructors
    Proxy
    dataType[apov] :: DataTypeSource
    constr[apow] :: ConstrSource
    proxy :: t -> Proxy tSource
    Creates the Proxy with a type matching the argument +
    unProxy :: Proxy t -> tSource
    Returns bottom +
    asProxyType :: t -> Proxy t -> tSource
    Acts as id except for providing type restrictions +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-Serialize.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Serialize.html 1 + + +Happstack.Data.Serialize
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Serialize
    Synopsis
    class (Typeable a, Version a) => Serialize a where
    getCopy :: Contained (Get a)
    putCopy :: a -> Contained Put
    class Version a where
    mode :: Mode a
    class Migrate a b where
    migrate :: a -> b
    data Mode a
    = Primitive
    | Versioned (VersionId a) (Maybe (Previous a))
    data Contained a
    contain :: a -> Contained a
    extension :: forall a b. (Serialize b, Migrate b a) => VersionId a -> Proxy b -> Mode a
    safeGet :: forall a. Serialize a => Get a
    safePut :: forall a. Serialize a => a -> Put
    getSafeGet :: forall a. Serialize a => Get (Get a)
    getSafePut :: forall a. Serialize a => PutM (a -> Put)
    serialize :: Serialize a => a -> ByteString
    deserialize :: Serialize a => ByteString -> (a, ByteString)
    collectVersions :: forall a. (Typeable a, Version a) => Proxy a -> [ByteString]
    data Object
    mkObject :: Serialize a => a -> Object
    deserializeObject :: ByteString -> (Object, ByteString)
    parseObject :: Serialize a => Object -> a
    module Happstack.Data.Proxy
    Documentation
    class (Typeable a, Version a) => Serialize a whereSource
    Methods
    getCopy :: Contained (Get a)Source
    putCopy :: a -> Contained PutSource
    class Version a whereSource
    The Version type class is used to describe whether a type is fundamental + or if it is meant to extend another type. For a user defined type that + does not extend any others, one can use the default instance of Version, e.g. + instance Version MyType to define it has having a version id of 0 and previous + type. +
    Methods
    mode :: Mode aSource
    class Migrate a b whereSource
    Migrate instances are needed to allow upgrades of MACID state. It should be declared as instance Migrate Old New where migrate = transition_function +
    Methods
    migrate :: a -> bSource
    data Mode a Source
    Constructors
    PrimitiveData layout won't change. Used for types like Int and Char. +
    Versioned (VersionId a) (Maybe (Previous a))
    data Contained a Source
    contain :: a -> Contained aSource
    Lifts the provided value into Contained +
    extension :: forall a b. (Serialize b, Migrate b a) => VersionId a -> Proxy b -> Mode aSource
    Creates a Mode that is a new version of the type carried by the provided proxy + and with the provided version number. Note that since VersionId is an instance of + Num that you may use int literals when calling extension, e.g. + extension 1 (Proxy :: Proxy OldState) +
    safeGet :: forall a. Serialize a => Get aSource
    Equivalent of Data.Binary.get for instances of Serialize + Takes into account versioning of types. +
    safePut :: forall a. Serialize a => a -> PutSource
    Equivalent of Data.Binary.put for instances of Serialize. + Takes into account versioning of types. +
    getSafeGet :: forall a. Serialize a => Get (Get a)Source
    getSafePut :: forall a. Serialize a => PutM (a -> Put)Source
    serialize :: Serialize a => a -> ByteStringSource
    Pure version of safePut. Serializes to a ByteString +
    deserialize :: Serialize a => ByteString -> (a, ByteString)Source
    Pure version of safeGet. Parses a ByteString into the expected type + and a remainder. +
    collectVersions :: forall a. (Typeable a, Version a) => Proxy a -> [ByteString]Source
    Version lookups +
    data Object Source
    Uniform container for any serialized data. It contains a string rep of the type + and the actual data serialized to a byte string. +
    mkObject :: Serialize a => a -> ObjectSource
    Serializes data and stores it along with its type name in an Object +
    deserializeObject :: ByteString -> (Object, ByteString)Source
    deserialize specialized to Objects +
    parseObject :: Serialize a => Object -> aSource
    Attempts to convert an Object back into its base type. + If the conversion fails error will be called. +
    module Happstack.Data.Proxy
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-SerializeTH.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-SerializeTH.html 1 + + +Happstack.Data.SerializeTH
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.SerializeTH
    Synopsis
    deriveSerialize :: Name -> Q [Dec]
    deriveSerializeFor :: [Name] -> Q [Dec]
    Documentation
    deriveSerialize :: Name -> Q [Dec]Source
    Derives an instance of Serialize for the provided type + Should work in most cases if the type is already and instance + of Version. + Ex: $(deriveSerialize ''Foo) +
    deriveSerializeFor :: [Name] -> Q [Dec]Source
    Derives Serialize for a list of types +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-Xml-HaXml.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Xml-HaXml.html 1 + + +Happstack.Data.Xml.HaXml
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Xml.HaXml
    Synopsis
    isAttr :: Element -> Bool
    toHaXmls :: [Element] -> [Content]
    toHaXmlEl :: Element -> Element
    toHaXml :: Element -> Content
    toAttribute :: Element -> Attribute
    fromHaXmls :: [Content] -> [Element]
    fromHaXml :: Content -> Element
    fromAttributes :: [Attribute] -> [Element]
    fromAttribute :: Attribute -> Element
    Documentation
    isAttr :: Element -> BoolSource
    toHaXmls :: [Element] -> [Content]Source
    Lifts toHaXml to act on lists of Elements +
    toHaXmlEl :: Element -> ElementSource
    Converts the Element to HaXml Element if the Element is of the form + Elem _ _ +
    toHaXml :: Element -> ContentSource
    Conversion function between the Happstack Element and HaXml Content types +
    toAttribute :: Element -> AttributeSource
    Converts an Element that is an Attr into a HaXml Attribute. Will throw + an error if provided the wrong constructor. +
    fromHaXmls :: [Content] -> [Element]Source
    Lifts fromHaXml to operate on lists +
    fromHaXml :: Content -> ElementSource
    Converts a HaXml Content to an Element +
    fromAttributes :: [Attribute] -> [Element]Source
    Lifts fromAttribute to act on lists +
    fromAttribute :: Attribute -> ElementSource
    Will convert a HaXml attribute that is of the form [Left _] to a + Happstack Element. Otherwise, will throw an error. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data-Xml.html hunk ./docs/0.5.0/happstack-data/Happstack-Data-Xml.html 1 + + +Happstack.Data.Xml
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data.Xml
    Synopsis
    data Element
    = Elem String [Element]
    | CData String
    | Attr String String
    dataType[a74x] :: DataType
    constr[a74A] :: Constr
    constr[a74z] :: Constr
    constr[a74y] :: Constr
    insEl :: (Data XmlD a, Default a, Data NormalizeD a, Data XmlD b, Default b, Data NormalizeD b) => a -> b -> Element
    fromXml :: forall m a. (Monad m, Xml a) => Rigidity m -> [Element] -> m a
    data Other b
    = forall a . (Migrate a b, Xml a) => Other a
    | NoOther
    toPublicXml :: Xml a => a -> [Element]
    data Rigidity m where
    Rigid :: Rigidity Maybe
    Flexible :: Rigidity Identity
    class (Data XmlD a, Default a, Normalize a) => Xml a where
    toXml :: a -> [Element]
    readXml :: Monad m => Rigidity m -> [Element] -> Maybe ([Element], a)
    readXml' :: Monad m => Rigidity m -> [Element] -> Maybe ([Element], a)
    normalizeXml :: a -> [Element] -> [Element]
    version :: a -> Maybe String
    otherVersion :: a -> Other a
    typ :: a -> String
    data XmlD a = XmlD {
    toXmlD :: a -> [Element]
    readMXmlD :: forall m. Monad m => Rigidity m -> ReadM m a
    readMXmlNoRootDefaultD :: forall m. Monad m => Rigidity m -> ReadM Maybe a
    }
    xmlProxy :: Proxy XmlD
    first :: (a -> a) -> [a] -> [a]
    defaultToXml :: Xml t => t -> [Element]
    transparentToXml :: Xml t => t -> [Element]
    transparentReadXml :: forall m t. (Monad m, Xml t) => Rigidity m -> [Element] -> Maybe ([Element], t)
    transparentXml :: Name -> Q [Dec]
    defaultReadXml :: (Monad m, Xml t) => Rigidity m -> [Element] -> Maybe ([Element], t)
    defaultReadXml' :: (Monad m, Xml t) => Rigidity m -> [Element] -> Maybe ([Element], t)
    readXmlWith :: Xml t => (Rigidity m -> Element -> Maybe t) -> Rigidity m -> [Element] -> Maybe ([Element], t)
    readVersionedElement :: forall m t. (Monad m, Xml t) => Rigidity m -> Element -> Maybe t
    isTheAttr :: String -> Element -> Bool
    getAttr :: String -> [Element] -> Maybe (String, [Element])
    versionAttr :: String
    typeAttr :: String
    readElement :: forall m t. (Monad m, Xml t) => Rigidity m -> Element -> Maybe t
    aConstrFromElements :: forall m t. (Monad m, Xml t) => Rigidity m -> [Constr] -> [Element] -> Maybe ([Element], t)
    constrFromElementsNoRootDefault :: forall m t. (Monad m, Xml t) => Rigidity m -> Constr -> [Element] -> Maybe ([Element], t)
    constrFromElements :: forall m t. (Monad m, Xml t) => Rigidity m -> Constr -> [Element] -> m ([Element], t)
    type ReadM m = StateT ReadState m
    data ReadState = ReadState {
    xmls :: [Element]
    }
    getXmls :: Monad m => ReadM m [Element]
    putXmls :: Monad m => [Element] -> ReadM m ()
    readMXml :: (Monad m, Xml a) => Rigidity m -> ReadM m a
    readMXmlNoRootDefault :: (Monad m, Xml a) => Rigidity m -> ReadM Maybe a
    xmlAttr :: Name -> Q [Dec]
    xmlShowCDatas :: [Name] -> Q [Dec]
    xmlShowCData :: Name -> Q [Dec]
    xmlCDataLists :: [Name] -> Q [Dec]
    xmlCDataList :: Name -> Q [Dec]
    noCommas :: String -> String
    typeNotValue :: Xml a => a -> a
    data K = K String
    data W = W [K]
    dataType[afDm] :: DataType
    constr[afDn] :: Constr
    dataType[afDc] :: DataType
    constr[afDd] :: Constr
    class ToString a where
    toString :: a -> String
    class FromString a where
    fromString :: Monad m => Rigidity m -> String -> m a
    Documentation
    data Element Source
    Element recursively represents XML data. + Elem n elems -> XML element with name n and described by elems. Note that elems contains sub-elements as well as the attributes or literal data of the element. + CData d -> Literal string data + Attr key val -> Key/Value pair of the element attribute. +
    Constructors
    Elem String [Element]
    CData String
    Attr String String
    dataType[a74x] :: DataTypeSource
    constr[a74A] :: ConstrSource
    constr[a74z] :: ConstrSource
    constr[a74y] :: ConstrSource
    insEl :: (Data XmlD a, Default a, Data NormalizeD a, Data XmlD b, Default b, Data NormalizeD b) => a -> b -> ElementSource
    insEl a b will convert a to xml and insert it into the + xml of b if b results in an Elem constructor. +
    fromXml :: forall m a. (Monad m, Xml a) => Rigidity m -> [Element] -> m aSource
    Wrapper around the Xml class method readXml. + The Rigidity will determine the behavior in the case of a failed parsing: Rigid will return Nothing and Flexible will return Identity (defaultValue) +
    data Other b Source
    Constructors
    forall a . (Migrate a b, Xml a) => Other a
    NoOther
    toPublicXml :: Xml a => a -> [Element]Source
    Identical to toXml from Xml class except that it will remove attributes named haskellType or haskellTypeVersion +
    data Rigidity m whereSource
    Rigidity is used to designate the result of a failed Xml parsing. +
    Constructors
    Rigid :: Rigidity Maybe
    Flexible :: Rigidity Identity
    class (Data XmlD a, Default a, Normalize a) => Xml a whereSource
    Methods
    toXml :: a -> [Element]Source
    readXml :: Monad m => Rigidity m -> [Element] -> Maybe ([Element], a)Source
    readXml' :: Monad m => Rigidity m -> [Element] -> Maybe ([Element], a)Source
    normalizeXml :: a -> [Element] -> [Element]Source
    version :: a -> Maybe StringSource
    otherVersion :: a -> Other aSource
    typ :: a -> StringSource
    data XmlD a Source
    Constructors
    XmlD
    toXmlD :: a -> [Element]
    readMXmlD :: forall m. Monad m => Rigidity m -> ReadM m a
    readMXmlNoRootDefaultD :: forall m. Monad m => Rigidity m -> ReadM Maybe a
    xmlProxy :: Proxy XmlDSource
    Used as a type witness for usage with syb-with-class Data class. +
    first :: (a -> a) -> [a] -> [a]Source
    Applies function to only first element of the list. Safe on empty lists. +
    defaultToXml :: Xml t => t -> [Element]Source
    Converts the argument to an Xml element with the constructor + name as the root of the Elem and the additional attributes corresponding + to haskellType and haskellTypeVersion added +
    transparentToXml :: Xml t => t -> [Element]Source
    Generically traverses an instance of Xml and converts it into a list of elements +
    transparentReadXml :: forall m t. (Monad m, Xml t) => Rigidity m -> [Element] -> Maybe ([Element], t)Source
    Attempts to parse the set of elements and return the first constructor it + can successfully parse of the inferred type. +
    transparentXml :: Name -> Q [Dec]Source
    Create an Xml instance using transparentToXml and transparentReadXml +
    defaultReadXml :: (Monad m, Xml t) => Rigidity m -> [Element] -> Maybe ([Element], t)Source
    defaultReadXml' :: (Monad m, Xml t) => Rigidity m -> [Element] -> Maybe ([Element], t)Source
    readXmlWith :: Xml t => (Rigidity m -> Element -> Maybe t) -> Rigidity m -> [Element] -> Maybe ([Element], t)Source
    readVersionedElement :: forall m t. (Monad m, Xml t) => Rigidity m -> Element -> Maybe tSource
    isTheAttr :: String -> Element -> BoolSource
    Matches the provided string to the key of an attribute. Returns False if any other Element constructor is given. +
    getAttr :: String -> [Element] -> Maybe (String, [Element])Source
    Fetch the value of the given attribute if present, if not present will return Nothing +
    versionAttr :: StringSource
    Attribute used for Xml class version information +
    typeAttr :: StringSource
    Attribute used for recording the actual Haskell type in the xml serialization +
    readElement :: forall m t. (Monad m, Xml t) => Rigidity m -> Element -> Maybe tSource
    aConstrFromElements :: forall m t. (Monad m, Xml t) => Rigidity m -> [Constr] -> [Element] -> Maybe ([Element], t)Source
    aConstrFromElements will return the results of the first constructor + that parses correctly. +
    constrFromElementsNoRootDefault :: forall m t. (Monad m, Xml t) => Rigidity m -> Constr -> [Element] -> Maybe ([Element], t)Source
    Like constrFromElements but does not allow defaulting in case of + a parse error. +
    constrFromElements :: forall m t. (Monad m, Xml t) => Rigidity m -> Constr -> [Element] -> m ([Element], t)Source
    Attempts to parse the given elements to build the particular type + given by the constructor argument. +
    type ReadM m = StateT ReadState mSource
    data ReadState Source
    Constructors
    ReadState
    xmls :: [Element]
    getXmls :: Monad m => ReadM m [Element]Source
    Returns the elements currently in the state +
    putXmls :: Monad m => [Element] -> ReadM m ()Source
    Sets the state of the xml parsing to the given value +
    readMXml :: (Monad m, Xml a) => Rigidity m -> ReadM m aSource
    Attempts to parse the current set of elements. If it fails the behavior +is dependent on the Rigidity. If it is Rigid, then it will return Nothing +but if it is Flexible it will return the defaultValue. +If the parsing succeeds, it will return the value and store the remaining +XML elements in the parser state. +
    readMXmlNoRootDefault :: (Monad m, Xml a) => Rigidity m -> ReadM Maybe aSource
    Identical to readMXml except that in the case of a failed parsing it will not use defaultValue. +
    xmlAttr :: Name -> Q [Dec]Source
    xmlShowCDatas :: [Name] -> Q [Dec]Source
    xmlShowCData lifted to act on lists +
    xmlShowCData :: Name -> Q [Dec]Source
    automatically creates an Xml definition for a type that is an instance +of Show and Read. This will result in an instance that converts the type to and from CData. +
    xmlCDataLists :: [Name] -> Q [Dec]Source
    xmlCDataLists lifted to act on lists +
    xmlCDataList :: Name -> Q [Dec]Source
    Creates an instance similar to xmlShowCData except for lists of the +provided type +
    noCommas :: String -> StringSource
    Replaces commas in the string with single spaces +
    typeNotValue :: Xml a => a -> aSource
    Throws an error when called +
    data K Source
    Constructors
    K String
    data W Source
    Constructors
    W [K]
    dataType[afDm] :: DataTypeSource
    constr[afDn] :: ConstrSource
    dataType[afDc] :: DataTypeSource
    constr[afDd] :: ConstrSource
    class ToString a whereSource
    Methods
    toString :: a -> StringSource
    class FromString a whereSource
    Methods
    fromString :: Monad m => Rigidity m -> String -> m aSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/Happstack-Data.html hunk ./docs/0.5.0/happstack-data/Happstack-Data.html 1 + + +Happstack.Data
     happstack-data-0.5.0: Happstack data manipulation librariesSource codeContentsIndex
    Happstack.Data
    Documentation
    module Data.Typeable
    module Happstack.Data.Default
    module Happstack.Data.DeriveAll
    module Happstack.Data.Migrate
    module Happstack.Data.Normalize
    module Happstack.Data.Pairs
    module Happstack.Data.Xml
    module Happstack.Data.GOps
    module Happstack.Data.Serialize
    module Happstack.Data.SerializeTH
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/doc-index-A.html hunk ./docs/0.5.0/happstack-data/doc-index-A.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (A)
    aConstrFromElements
    AsPairs
    asProxyType
    Attr
    addfile ./docs/0.5.0/happstack-data/doc-index-C.html hunk ./docs/0.5.0/happstack-data/doc-index-C.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (C)
    cast
    CData
    collectVersions
    constrFromElements
    constrFromElementsNoRootDefault
    constr[a74A]
    constr[a74y]
    constr[a74z]
    constr[afDd]
    constr[afDn]
    constr[apow]
    contain
    Contained
    addfile ./docs/0.5.0/happstack-data/doc-index-D.html hunk ./docs/0.5.0/happstack-data/doc-index-D.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (D)
    dataType[a74x]
    dataType[afDc]
    dataType[afDm]
    dataType[apov]
    Default
    DefaultD
    1 (Type/Class)
    2 (Data Constructor)
    defaultDefaultValue
    defaultNormalize
    defaultNormalizeRecursively
    defaultProxy
    defaultReadXml
    defaultReadXml'
    defaultToXml
    defaultValue
    defaultValueD
    deriveAll
    deriveNewData
    deriveNewDataNoDefault
    deriveSerialize
    deriveSerializeFor
    deserialize
    deserializeObject
    addfile ./docs/0.5.0/happstack-data/doc-index-E.html hunk ./docs/0.5.0/happstack-data/doc-index-E.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (E)
    Elem
    Element
    extension
    addfile ./docs/0.5.0/happstack-data/doc-index-F.html hunk ./docs/0.5.0/happstack-data/doc-index-F.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (F)
    first
    Flexible
    fromAttribute
    fromAttributes
    fromHaXml
    fromHaXmls
    fromPairs
    FromString
    fromString
    fromXml
    funResultTy
    addfile ./docs/0.5.0/happstack-data/doc-index-G.html hunk ./docs/0.5.0/happstack-data/doc-index-G.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (G)
    gAsk
    gcast
    gcast1
    gcast2
    getAttr
    getCopy
    getSafeGet
    getSafePut
    getXmls
    gFind
    gFind'
    gGet
    gModify
    gReplace
    gSet
    addfile ./docs/0.5.0/happstack-data/doc-index-I.html hunk ./docs/0.5.0/happstack-data/doc-index-I.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (I)
    insEl
    isAttr
    isTheAttr
    addfile ./docs/0.5.0/happstack-data/doc-index-K.html hunk ./docs/0.5.0/happstack-data/doc-index-K.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (K)
    K
    1 (Type/Class)
    2 (Data Constructor)
    addfile ./docs/0.5.0/happstack-data/doc-index-M.html hunk ./docs/0.5.0/happstack-data/doc-index-M.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (M)
    Migrate
    migrate
    mkAppTy
    mkFunTy
    mkObject
    mkTyCon
    mkTyConApp
    Mode
    mode
    addfile ./docs/0.5.0/happstack-data/doc-index-N.html hunk ./docs/0.5.0/happstack-data/doc-index-N.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (N)
    noCommas
    NoOther
    Normalize
    normalize
    NormalizeD
    1 (Type/Class)
    2 (Data Constructor)
    normalizeD
    normalizeProxy
    normalizeRecursively
    normalizeRecursivelyD
    normalizeXml
    addfile ./docs/0.5.0/happstack-data/doc-index-O.html hunk ./docs/0.5.0/happstack-data/doc-index-O.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (O)
    Object
    objectType
    Other
    1 (Type/Class)
    2 (Data Constructor)
    otherVersion
    addfile ./docs/0.5.0/happstack-data/doc-index-P.html hunk ./docs/0.5.0/happstack-data/doc-index-P.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (P)
    Pairs
    pairsToHTMLForm
    pairsToXml
    parseObject
    Primitive
    Proxy
    1 (Type/Class)
    2 (Data Constructor)
    proxy
    putCopy
    putXmls
    addfile ./docs/0.5.0/happstack-data/doc-index-R.html hunk ./docs/0.5.0/happstack-data/doc-index-R.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (R)
    readElement
    ReadM
    readMXml
    readMXmlD
    readMXmlNoRootDefault
    readMXmlNoRootDefaultD
    ReadState
    1 (Type/Class)
    2 (Data Constructor)
    readVersionedElement
    readXml
    readXml'
    readXmlWith
    Rigid
    Rigidity
    addfile ./docs/0.5.0/happstack-data/doc-index-S.html hunk ./docs/0.5.0/happstack-data/doc-index-S.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (S)
    safeGet
    safePut
    Serialize
    serialize
    showsTypeRep
    splitTyConApp
    addfile ./docs/0.5.0/happstack-data/doc-index-T.html hunk ./docs/0.5.0/happstack-data/doc-index-T.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (T)
    toAttribute
    toHaXml
    toHaXmlEl
    toHaXmls
    toHTMLForm
    toPairs
    toPairsX
    toPublicXml
    ToString
    toString
    toXml
    toXmlD
    transparentReadXml
    transparentToXml
    transparentXml
    TyCon
    tyConString
    typ
    Typeable
    Typeable1
    Typeable2
    Typeable3
    Typeable4
    Typeable5
    Typeable6
    Typeable7
    typeAttr
    typeNotValue
    typeOf
    typeOf1
    typeOf1Default
    typeOf2
    typeOf2Default
    typeOf3
    typeOf3Default
    typeOf4
    typeOf4Default
    typeOf5
    typeOf5Default
    typeOf6
    typeOf6Default
    typeOf7
    typeOfDefault
    TypeRep
    typeRepArgs
    typeRepKey
    typeRepTyCon
    addfile ./docs/0.5.0/happstack-data/doc-index-U.html hunk ./docs/0.5.0/happstack-data/doc-index-U.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (U)
    unProxy
    addfile ./docs/0.5.0/happstack-data/doc-index-V.html hunk ./docs/0.5.0/happstack-data/doc-index-V.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (V)
    Version
    version
    versionAttr
    Versioned
    addfile ./docs/0.5.0/happstack-data/doc-index-W.html hunk ./docs/0.5.0/happstack-data/doc-index-W.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (W)
    W
    1 (Type/Class)
    2 (Data Constructor)
    addfile ./docs/0.5.0/happstack-data/doc-index-X.html hunk ./docs/0.5.0/happstack-data/doc-index-X.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    ACDEFGIKMNOPRSTUVWX
    Index (X)
    Xml
    xmlAttr
    xmlCDataList
    xmlCDataLists
    XmlD
    1 (Type/Class)
    2 (Data Constructor)
    xmlProxy
    xmls
    xmlShowCData
    xmlShowCDatas
    xmlToHTMLForm
    xmlToPairs
    addfile ./docs/0.5.0/happstack-data/doc-index.html hunk ./docs/0.5.0/happstack-data/doc-index.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries (Index)
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    Index
    ACDEFGIKMNOPRSTUVWX
    addfile ./docs/0.5.0/happstack-data/frames.html hunk ./docs/0.5.0/happstack-data/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/happstack-data/haddock-util.js hunk ./docs/0.5.0/happstack-data/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/happstack-data/haddock.css hunk ./docs/0.5.0/happstack-data/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + addfile ./docs/0.5.0/happstack-data/happstack-data.haddock binary ./docs/0.5.0/happstack-data/happstack-data.haddock oldhex * newhex *0d0cface000f0000bb910000af9a9b000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000001000000 *050000000000000001000000060000000000000001000000070000000000000002000000080000 *0000000000020000000900000000000000020000000a00000000000000020000000b0000000000 *0000020000000c00000000000000020000000d00000000000000020000000e0000000000000002 *0000000f0000000000000002000000100000000000000002000000110000000000000003000000 *120000000000000003000000130000000000000004000000140000000000000004000000150000 *000000000004000000160000000000000004000000170000000000000004000000180000000000 *0000040000001900000000000000040000001a00000000000000050000001b0000000000000005 *0000001c00000000000000050000001d00000000000000060000001e0000000000000006000000 *1f0000000000000006000000200000000000000006000000210000000000000006000000220000 *000000000006000000230000000000000006000000240000000000000006000000250000000000 *000006000000260000000000000006000000270000000000000006000000280000000000000006 *0000002900000000000000060000002a00000000000000060000002b0000000000000006000000 *2c00000000000000060000002d00000000000000060000002e00000000000000060000002f0000 *000000000006000000300000000000000006000000310000000000000006000000320000000000 *000006000000330000000000000006000000340000000000000006000000350000000000000006 *000000360000000000000006000000370000000000000006000000380000000000000006000000 *3900000000000000060000003a00000000000000060000003b00000000000000060000003c0000 *0000000000060000003d00000000000000060000003e00000000000000060000003f0000000000 *000006000000400000000000000006000000410000000000000006000000420000000000000006 *000000430000000000000006000000440000000000000006000000450000000000000006000000 *460000000000000006000000470000000000000006000000480000000000000006000000490000 *0000000000060000004a00000000000000060000004b00000000000000060000004c0000000000 *0000060000004d00000000000000060000004e00000000000000060000004f0000000000000006 *000000500000000000000006000000510000000000000006000000520000000000000006000000 *530000000000000006000000540000000000000006000000550000000000000006000000560000 *000000000006000000570000000000000006000000580000000000000006000000590000000000 *0000060000005a00000000000000060000005b00000000000000060000005c0000000000000007 *0000005d00000000000000070000005e00000000000000070000005f0000000000000007000000 *600000000000000007000000610000000000000007000000620000000000000007000000630000 *000000000007000000640000000000000007000000650000000000000006000000660000000000 *000006000000670000000000000006000000680000000000000006000000690000000000000006 *0000006a00000000000000060000006b00000000000000060000006c0000000000000006000000 *6d00000000000000060000006e00000000000000060000006f0000000000000006000000700000 *000000000006000000710000000000000008000000720000000000000008000000730000000000 *000008000000740000000000000008000000750000000000000008000000760000000000000008 *000000770000000000000008000000780000000000000008000000790000000000000008000000 *7a00000000000000080000007b00000000000000090000007c00000000000000090000007d0000 *0000000000090000007e00000000000000090000007f0000000000000009000000800000000000 *00000900000081000000000000000900000082000000000000000a00000083000000000000000a *00000084000000000000000a00000085000000000000000a00000086000000000000000a000000 *87000000000000000a00000088000000000000000a00000089000000000000000a0000008a0000 *00000000000a0000008b000000000000000a0000008c000000000000000a0000008d0000000000 *00000a0000008e000000000000000a0000008f000000000000000a00000090000000000000000a *00000091000000000000000a00000092000000000000000a00000093000000000000000a000000 *94000000000000000a00000095000000000000000a00000096000000000000000a000000970000 *00000000000a00000098000000000000000a00000099000000000000000b0000009a0000000000 *00000b100000000000000001000000000700000000010301070208000000670000005300000065 *000000740000002000000078000000200000007901020f0000002000000077000000690000006c *0000006c0000002000000074000000720000006100000076000000650000007200000061000000 *6c00000020010702010000007801020e00000020000000610000006e0000006400000020000000 *7200000065000000700000006c000000610000006300000065000000200000000a01021b000000 *20000000610000006e0000007900000020000000690000006e0000007300000074000000610000 *006e000000630000006500000073000000200000006f0000006600000020000000740000006800 *000065000000200000007400000079000000700000006500000020010702010000006101021300 *000020000000690000006e00000020000000690000007400000073000000200000007300000074 *00000072000000750000006300000074000000750000007200000065000000200000000a010206 *000000200000007700000069000000740000006800000020010702010000007902020000002e00 *00000a000000000101030107020c000000670000005200000065000000700000006c0000006100 *000063000000650000002000000066000000200000006201020f00000020000000770000006900 *00006c0000006c0000002000000074000000720000006100000076000000650000007200000073 *0000006500000020010702010000007801021100000020000000610000006e0000006400000020 *00000077000000690000006c0000006c0000002000000061000000630000007400000020000000 *6f0000006e0000000a01021a00000020000000610000006e000000790000002000000069000000 *6e0000007300000074000000610000006e0000006300000065000000200000006f000000660000 *002000000074000000680000006500000020000000740000007900000070000000650000002001 *0702010000006101021700000020000000690000006e0000002000000069000000740000007300 *000020000000730000007400000072000000750000006300000074000000750000007200000065 *00000020000000770000006900000074000000680000000a01020e000000200000007400000068 *000000650000002000000066000000750000006e0000006300000074000000690000006f000000 *6e00000020010702010000006602020000002e0000000a00000000020103010702070000006700 *000046000000690000006e00000064000000200000006101022300000020000000770000006900 *00006c0000006c0000002000000065000000780000007400000072000000610000006300000074 *00000020000000610000006e0000007900000020000000650000006c000000650000006d000000 *650000006e0000007400000073000000200000006f000000660000002000000074000000790000 *0070000000650000002001070201000000620102060000002000000066000000720000006f0000 *006d0000000a0102010000002001070201000000610102010000002701022d0000007300000020 *000000730000007400000072000000750000006300000074000000750000007200000065000000 *20000000690000006e000000200000006100000063000000630000006f00000072000000640000 *00610000006e000000630000006500000020000000770000006900000074000000680000002000 *0000740000006800000065000000200000004d0000006f0000006e000000610000006400000050 *0000006c00000075000000730000000a01023400000020000000690000006e0000007300000074 *000000610000006e00000063000000650000002c00000020000000650000002e00000067000000 *2e000000200000004d0000006100000079000000620000006500000020000000460000006f0000 *006f0000002000000077000000690000006c0000006c0000002000000072000000650000007400 *000075000000720000006e00000020000000740000006800000065000000200000006600000069 *00000072000000730000007400000020000000460000006f0000006f0000000a01021100000020 *000000660000006f000000750000006e0000006400000020000000770000006800000069000000 *6c00000065000000200000005b000000460000006f0000006f0102010000005d02250000002000 *000077000000690000006c0000006c000000200000007200000065000000740000007500000072 *0000006e00000020000000740000006800000065000000200000006c0000006900000073000000 *74000000200000006f0000006600000020000000460000006f0000006f00000073000000200000 *00660000006f000000750000006e000000640000002e0000000a0000000003010301022d000000 *410000006300000074000000730000002000000061000000730000002000000067000000460000 *00690000006e000000640000002000000062000000750000007400000020000000770000006900 *00006c0000006c000000200000007400000068000000720000006f000000770000002000000061 *0000006e0000002000000065000000780000006300000065000000700000007400000069000000 *6f0000006e0000002000000069000000660000000a0213000000200000006e0000006f00000074 *00000068000000690000006e000000670000002000000069000000730000002000000066000000 *6f000000750000006e000000640000002e0000000a000000000401030102360000004100000020 *00000067000000650000006e0000006500000072000000610000006c000000690000007a000000 *6500000064000000200000006d0000006f00000064000000690000006600000079000000200000 *00740000006800000061000000740000002000000077000000690000006c0000006c0000002000 *00006100000070000000700000006c000000790000002000000074000000680000006500000020 *0000006d0000006f00000064000000690000006600000069000000630000006100000074000000 *690000006f0000006e0000000a02290000002000000066000000750000006e0000006300000074 *000000690000006f0000006e00000020000000740000006f000000200000007400000068000000 *650000002000000073000000740000007200000075000000630000007400000075000000720000 *0065000000200000006f0000006600000020000000740000006800000065000000200000007300 *0000740000006100000074000000650000002e0000000a00000000050103010229000000410000 *002000000067000000650000006e0000006500000072000000610000006c000000690000007a00 *000065000000640000002000000061000000730000006b00000020000000740000006800000061 *000000740000002000000077000000690000006c0000006c000000200000007400000072000000 *610000007600000065000000720000007300000065000000200000007400000068000000650000 *000a0102360000002000000073000000740000006f000000720000006500000064000000200000 *0074000000790000007000000065000000200000006f0000006600000020000000740000006800 *000065000000200000004d0000006f0000006e0000006100000064000000520000006500000061 *00000064000000650000007200000020000000690000006e00000020000000610000006e000000 *20000000610000007400000074000000650000006d000000700000007400000020000000740000 *006f0000002000000066000000690000006e000000640000000a01020400000020000000610000 *006e00000020010702010000006101022e00000020000000610000006e00000064000000200000 *0077000000690000006c0000006c000000200000007400000068000000650000006e0000002000 *00006100000070000000700000006c000000790000002000000074000000680000006500000020 *00000070000000720000006f000000760000006900000064000000650000006400000020000000 *66000000750000006e0000006300000074000000690000006f0000006e00000020000000690000 *00660000000a020800000020000000660000006f000000750000006e000000640000002e000000 *0a0000000006010301021200000054000000680000006500000020000000650000007100000075 *0000006900000076000000610000006c000000650000006e00000074000000200000006f000000 *660000002001040100000005021000000020000000660000006f00000072000000200000004d00 *00006f0000006e000000610000006400000053000000740000006100000074000000650000000a *000700000000000000010000000200000003000000040000000500000006070000000000000001 *000000020000000300000004000000050000000600070000000000000000010000000002000000 *000300000000040000000005000000000600000000000000000200010c0000004e0000006f0000 *007400000020000000700000006f000000720000007400000061000000620000006c0000006501 *0c0000006500000078000000700000006500000072000000690000006d000000650000006e0000 *0074000000610000006c0116000000680000006100000070000000700000007300000040000000 *670000006f0000006f000000670000006c0000006500000067000000720000006f000000750000 *0070000000730000002e000000630000006f0000006d0a00000007010301022c00000057000000 *68000000650000006e0000002000000077000000720000006900000074000000690000006e0000 *006700000020000000790000006f0000007500000072000000200000006f000000770000006e00 *00002000000067000000650000006e000000650000007200000069000000630000002000000066 *000000750000006e0000006300000074000000690000006f0000006e0000007300000020000000 *660000006f00000072000000200104010000000b01020900000020000000790000006f00000075 *000000200000006d00000061000000790000000a010244000000200000006e0000006500000065 *0000006400000020000000740000006f0000002000000061000000630000006300000065000000 *73000000730000002000000074000000680000006500000020000000630000006c000000610000 *007300000073000000200000006d0000006500000074000000680000006f000000640000007300 *0000200000007400000068000000720000006f0000007500000067000000680000002000000074 *000000680000006900000073000000200000006400000061000000740000006100000074000000 *790000007000000065000000200000007200000061000000740000006800000065000000720000 *00200000007400000068000000610000006e0000000a020b000000200000006400000069000000 *720000006500000063000000740000006c000000790000002e0000000a00000000080000000000 *0900000000000a00000000000b0101030102040000005400000068000000650000002001040100 *00000b01021200000020000000630000006c000000610000007300000073000000200000007000 *0000720000006f0000007600000069000000640000006500000073000000200000006100000020 *0104010000000c0102110000002000000066000000750000006e00000063000000740000006900 *00006f0000006e0000002c0000002000000077000000680000006900000063000000680000000a *01024400000020000000690000007300000020000000690000006e00000074000000650000006e *00000064000000650000006400000020000000740000006f000000200000006e0000006f000000 *720000006d000000610000006c000000690000007a000000650000002000000076000000610000 *006c000000750000006500000073000000200000006f0000006e0000006c000000790000002000 *000061000000740000002000000074000000680000006500000020000000740000006f00000070 *0000002d0000006c0000006500000076000000650000006c00000020000000630000006f000000 *6e0000007300000074000000720000007500000063000000740000006f000000720000002c0000 *000a01020700000020000000610000006e00000064000000200000006100000020010401000000 *0d0102200000002000000066000000750000006e0000006300000074000000690000006f000000 *6e0000002c00000020000000770000006800000069000000630000006800000020000000690000 *007300000020000000690000006e00000074000000650000006e00000064000000650000006400 *000020000000740000006f0000000a01023e000000200000006e0000006f000000720000006d00 *0000610000006c000000690000007a0000006500000020000000610000006c0000006c00000020 *000000740000006800000065000000200000007300000075000000620000007600000061000000 *6c00000075000000650000007300000020000000610000006e0000006400000020000000740000 *0068000000650000006e000000200000006e0000006f000000720000006d000000610000006c00 *0000690000007a000000650000002000000074000000680000006500000020000000740000006f *000000700000002d0000006c0000006500000076000000650000006c0000000a020e0000002000 *0000630000006f0000006e0000007300000074000000720000007500000063000000740000006f *000000720000002e0000000a010301023a00000054000000680000006500000072000000650000 *002000000069000000730000002000000061000000200000006400000065000000660000006100 *0000750000006c0000007400000020000000690000006e0000007300000074000000610000006e *00000063000000650000002000000074000000680000006100000074000000200000006d000000 *61000000740000006300000068000000650000007300000020000000610000006c0000006c0000 *002000000074000000790000007000000065000000730000002c00000020000000770000006800 *0000650000007200000065000000200104010000000c0102010000000a01020400000020000000 *6900000073000000200104010000009b01020500000020000000610000006e0000006400000020 *0104010000000d010209000000200000006100000070000000700000006c000000690000006500 *000073000000200104010000000d01020400000020000000740000006f0000000a01021e000000 *20000000610000006c0000006c000000200000006f000000660000002000000069000000740000 *0073000000200000006300000068000000690000006c0000006400000072000000650000006e00 *000020000000610000006e00000064000000200000007400000068000000650000006e00000020 *0104010000000c021000000020000000740000006f000000200000007400000068000000650000 *0020000000720000006500000073000000750000006c000000740000002e0000000a0301024200 *0000490000006600000020000000790000006f000000750000002000000077000000610000006e *0000007400000020000000740000006f0000002000000061000000630000007400000075000000 *610000006c0000006c0000007900000020000000640000006f00000020000000730000006f0000 *006d00000065000000200000006e0000006f000000720000006d000000610000006c0000006900 *00007a0000006100000074000000690000006f0000006e00000020000000660000006f00000072 *000000200000006100000020000000630000006500000072000000740000006100000069000000 *6e00000020000000740000007900000070000000650000002c0000000a01024700000020000000 *7400000068000000650000006e000000200000006a000000750000007300000074000000200000 *00640000006500000066000000690000006e0000006500000020000000610000006e0000002000 *0000690000006e0000007300000074000000610000006e00000063000000650000002000000066 *0000006f0000007200000020000000740000006800000061000000740000002000000074000000 *7900000070000000650000003b0000002000000074000000680000006900000073000000200000 *0077000000690000006c0000006c0000002000000074000000610000006b000000650000002000 *0000700000007200000065000000630000006500000064000000650000006e0000006300000065 *0000000a021c000000200000006f00000076000000650000007200000020000000740000006800 *0000650000002000000064000000650000006600000061000000750000006c0000007400000020 *000000690000006e0000007300000074000000610000006e00000063000000650000002e000000 *0a000000000c00000000000d00000000000e010301020c00000054000000680000006900000073 *00000020000000690000007300000020000000740000006800000065000000200104010000000c *0102190000002000000066000000750000006e0000006300000074000000690000006f0000006e *00000020000000690000006e000000200000007400000068000000650000002000000064000000 *650000006600000061000000750000006c00000074000000200104010000000b0102010000000a *01024300000020000000690000006e0000007300000074000000610000006e0000006300000065 *0000002e000000200000004900000074000000200000006d000000610000007900000020000000 *620000006500000020000000610000002000000075000000730000006500000066000000750000 *006c000000200000006200000075000000690000006c00000064000000690000006e0000006700 *000020000000620000006c0000006f000000630000006b00000020000000770000006800000065 *0000006e0000002000000077000000720000006900000074000000690000006e00000067000000 *20000000790000006f0000007500000072000000200000006f000000770000006e0000000a020c *00000020000000690000006e0000007300000074000000610000006e0000006300000065000000 *730000002e0000000a000000000f010301020c0000005400000068000000690000007300000020 *000000690000007300000020000000740000006800000065000000200104010000000d01021900 *00002000000066000000750000006e0000006300000074000000690000006f0000006e00000020 *000000690000006e00000020000000740000006800000065000000200000006400000065000000 *6600000061000000750000006c000000740000000a010201000000200104010000000b01023a00 *000020000000690000006e0000007300000074000000610000006e00000063000000650000002e *000000200000004900000074000000200000006d00000061000000790000002000000062000000 *6500000020000000610000002000000075000000730000006500000066000000750000006c0000 *00200000006200000075000000690000006c00000064000000690000006e000000670000002000 *0000620000006c0000006f000000630000006b000000200000007700000068000000650000006e *0000002000000077000000720000006900000074000000690000006e000000670000000a021500 *000020000000790000006f0000007500000072000000200000006f000000770000006e00000020 *000000690000006e0000007300000074000000610000006e000000630000006500000073000000 *2e0000000a0000000010010301022c0000005700000068000000650000006e0000002000000077 *000000720000006900000074000000690000006e0000006700000020000000790000006f000000 *7500000072000000200000006f000000770000006e0000002000000067000000650000006e0000 *00650000007200000069000000630000002000000066000000750000006e000000630000007400 *0000690000006f0000006e0000007300000020000000660000006f000000720000002001040100 *00000b01020900000020000000790000006f00000075000000200000006d000000610000007900 *00000a021d000000200000006e0000006500000065000000640000002000000074000000680000 *0069000000730000002c0000002000000074000000680000006500000020000000700000007200 *00006f00000078000000790000002000000076000000610000006c00000075000000650000002e *0000000a000a0000000700000008000000090000000a0000000b0000000c0000000d0000000e00 *00000f000000100a0000000b0000000c0000000d0000000e0000000f0000000700000008000000 *090000000a00000010000a000000070300000008000000090000000a0000000800000000090000 *00000a000000000b020000000c0000000d0000000c000000000d000000000e000000000f000000 *0010000000000000000003000000000200000011010302960000004d0000006900000067000000 *7200000061000000740000006500000020000000690000006e0000007300000074000000610000 *006e00000063000000650000007300000020000000610000007200000065000000200000006e00 *0000650000006500000064000000650000006400000020000000740000006f0000002000000061 *0000006c0000006c0000006f000000770000002000000075000000700000006700000072000000 *61000000640000006500000073000000200000006f00000066000000200000004d000000410000 *004300000049000000440000002000000073000000740000006100000074000000650000002e00 *0000200000002000000049000000740000002000000073000000680000006f000000750000006c *00000064000000200000006200000065000000200000006400000065000000630000006c000000 *6100000072000000650000006400000020000000610000007300000020000000690000006e0000 *007300000074000000610000006e0000006300000065000000200000004d000000690000006700 *000072000000610000007400000065000000200000004f0000006c00000064000000200000004e *000000650000007700000020000000770000006800000065000000720000006500000020000000 *6d000000690000006700000072000000610000007400000065000000200000003d000000200000 *007400000072000000610000006e000000730000006900000074000000690000006f0000006e00 *00005f00000066000000750000006e0000006300000074000000690000006f0000006e0000000a *000000001200000200000011000000120200000011000000120002000000110100000012000000 *1200000000000000000400010c0000004e0000006f0000007400000020000000700000006f0000 *00720000007400000061000000620000006c00000065010c000000650000007800000070000000 *6500000072000000690000006d000000650000006e00000074000000610000006c011600000068 *0000006100000070000000700000007300000040000000670000006f0000006f00000067000000 *6c0000006500000067000000720000006f0000007500000070000000730000002e000000630000 *006f0000006d0700000013010301022c0000005700000068000000650000006e00000020000000 *77000000720000006900000074000000690000006e0000006700000020000000790000006f0000 *007500000072000000200000006f000000770000006e0000002000000067000000650000006e00 *0000650000007200000069000000630000002000000066000000750000006e0000006300000074 *000000690000006f0000006e0000007300000020000000660000006f0000007200000020010401 *0000001601020900000020000000790000006f00000075000000200000006d0000006100000079 *0000000a010243000000200000006e00000065000000650000006400000020000000740000006f *000000200000006100000063000000630000006500000073000000730000002000000074000000 *680000006500000020000000630000006c000000610000007300000073000000200000006d0000 *006500000074000000680000006f00000064000000200000007400000068000000720000006f00 *000075000000670000006800000020000000740000006800000069000000730000002000000064 *000000610000007400000061000000740000007900000070000000650000002000000072000000 *6100000074000000680000006500000072000000200000007400000068000000610000006e0000 *000a020b000000200000006400000069000000720000006500000063000000740000006c000000 *790000002e0000000a000000001400000000001500000000001601010301020400000054000000 *6800000065000000200104010000001601021200000020000000630000006c0000006100000073 *000000730000002000000070000000720000006f00000076000000690000006400000065000000 *730000002000000061000000200104010000001701020e0000002000000076000000610000006c *00000075000000650000002c000000200000007700000068000000690000006300000068000000 *0a0225000000200000006900000073000000200000007400000068000000650000002000000064 *000000650000006600000061000000750000006c00000074000000200000007600000061000000 *6c000000750000006500000020000000660000006f000000720000002000000074000000680000 *00610000007400000020000000740000007900000070000000650000002e0000000a0103010240 *000000540000006800000065000000720000006500000020000000690000007300000020000000 *6e0000006f00000020000000690000006e0000007300000074000000610000006e000000630000 *006500000020000000660000006f00000072000000200000006100000072000000620000006900 *000074000000720000006100000072000000790000002000000074000000790000007000000065 *000000730000002000000062000000790000002000000064000000650000006600000061000000 *750000006c000000740000002c0000002000000062000000750000007400000020000000690000 *006600000020000000790000006f000000750000000a0102420000002000000064000000650000 *00630000006c00000061000000720000006500000020000000610000006e000000200000006900 *00006e0000007300000074000000610000006e0000006300000065000000200000007700000069 *00000074000000680000006f00000075000000740000002000000070000000720000006f000000 *760000006900000064000000690000006e00000067000000200000007400000068000000650000 *002000000076000000610000006c00000075000000650000002000000074000000680000006500 *00006e000000200000006f0000006e000000650000002000000077000000690000006c0000006c *0000002000000062000000650000000a010224000000200000006200000075000000690000006c *00000074000000200000007500000073000000690000006e000000670000002000000074000000 *680000006500000020000000660000006900000072000000730000007400000020000000630000 *006f0000006e0000007300000074000000720000007500000063000000740000006f0000007200 *00002e000000200104010000001701021400000020000000690000007300000020000000750000 *0073000000650000006400000020000000740000006f0000002000000070000000720000006f00 *0000760000006900000064000000650000000a022e0000002000000076000000610000006c0000 *0075000000650000007300000020000000660000006f0000007200000020000000610000006e00 *00007900000020000000610000007200000067000000750000006d000000650000006e00000074 *00000073000000200000006f000000660000002000000074000000680000006500000020000000 *630000006f0000006e0000007300000074000000720000007500000063000000740000006f0000 *00720000002e0000000a03010232000000490000006600000020000000790000006f0000007500 *00002000000077000000610000006e0000007400000020000000610000006e0000002000000069 *0000006e0000007300000074000000610000006e00000063000000650000002000000066000000 *6f0000007200000020000000610000006c0000006c000000200000007400000079000000700000 *006500000073000000200000007400000068000000650000006e00000020000000690000006d00 *0000700000006f00000072000000740000000a0102010000002001051e00000048000000610000 *007000000070000000730000007400000061000000630000006b0000002e000000440000006100 *000074000000610000002e00000044000000650000006600000061000000750000006c00000074 *0000002e00000047000000650000006e0000006500000072000000690000006302020000002e00 *00000a0000000017000000000018010301020c0000005400000068000000690000007300000020 *000000690000007300000020000000740000006800000065000000200104010000001701022700 *000020000000740000006800000061000000740000002000000069000000730000002000000075 *00000073000000650000006400000020000000690000006e00000020000000610000006e000000 *20000000690000006e0000007300000074000000610000006e0000006300000065000000200000 *00690000006600000020000000790000006f0000007500000020000000640000006f0000006e01 *020100000027010202000000740000000a01024600000020000000730000007000000065000000 *63000000690000006600000079000000200000006f0000006e000000650000002e000000200000 *004900000074000000200000006d00000061000000790000002000000062000000650000002000 *0000610000002000000075000000730000006500000066000000750000006c0000002000000062 *00000075000000690000006c00000064000000690000006e000000670000002000000062000000 *6c0000006f000000630000006b000000200000007700000068000000650000006e000000200000 *0077000000720000006900000074000000690000006e0000006700000020000000790000006f00 *00007500000072000000200000006f000000770000006e0000000a020c00000020000000690000 *006e0000007300000074000000610000006e0000006300000065000000730000002e0000000a00 *00000019010301022c0000005700000068000000650000006e0000002000000077000000720000 *006900000074000000690000006e0000006700000020000000790000006f000000750000007200 *0000200000006f000000770000006e0000002000000067000000650000006e0000006500000072 *00000069000000630000002000000066000000750000006e000000630000007400000069000000 *6f0000006e0000007300000020000000660000006f000000720000002001040100000016010209 *00000020000000790000006f00000075000000200000006d00000061000000790000000a021d00 *0000200000006e0000006500000065000000640000002000000074000000680000006900000073 *0000002c000000200000007400000068000000650000002000000070000000720000006f000000 *78000000790000002000000076000000610000006c00000075000000650000002e0000000a0007 *000000130000001400000015000000160000001700000018000000190700000016000000170000 *001800000013000000140000001500000019000700000013020000001400000015000000140000 *00001500000000160100000017000000170000000018000000001900000000000000000500010c *0000004e0000006f0000007400000020000000700000006f000000720000007400000061000000 *620000006c00000065010c0000006500000078000000700000006500000072000000690000006d *000000650000006e00000074000000610000006c01160000006800000061000000700000007000 *00007300000040000000670000006f0000006f000000670000006c000000650000006700000072 *0000006f0000007500000070000000730000002e000000630000006f0000006d080000001a0103 *010224000000440000006500000072000000690000007600000065000000730000002000000069 *0000006e0000007300000074000000610000006e00000063000000650000007300000020000000 *660000006f00000072000000200000007300000079000000620000002d00000077000000690000 *0074000000680000002d000000630000006c000000610000007300000073010201000000270102 *1200000073000000200000004400000061000000740000006100000020000000630000006c0000 *0061000000730000007300000020000000610000006e00000064000000200000000a0102190000 *002000000020000000200000004800000061000000700000007000000073000000740000006100 *0000630000006b0000002e000000440000006100000074000000610000002e0000004400000065 *0000006600000061000000750000006c0000007401020100000027010211000000730000002000 *000044000000650000006600000061000000750000006c0000007400000020000000630000006c *0000006100000073000000730000002e0000000a01022c00000020000000200000002000000054 *0000006800000065000000200000006c000000690000007300000074000000200000006f000000 *66000000200000006e000000610000006d00000065000000730000002000000073000000680000 *006f000000750000006c00000064000000200000006200000065000000200000006f0000006600 *00002000000074000000680000006500000020000000660000006f000000720000006d00000020 *0000005b0102010000002701020100000027010204000000460000006f0000006f0000002c0102 *0100000027010201000000270102060000004200000061000000720000002c0000002e0000002e *0102010000005d02010000000a000000001b010301022400000044000000650000007200000069 *00000076000000650000007300000020000000690000006e000000730000007400000061000000 *6e00000063000000650000007300000020000000660000006f0000007200000020000000730000 *0079000000620000002d000000770000006900000074000000680000002d000000630000006c00 *000061000000730000007301020100000027010213000000730000002000000044000000610000 *00740000006100000020000000630000006c000000610000007300000073000000200000006f00 *00006e0000006c000000790000002e0000000a01022c0000002000000020000000200000005400 *00006800000065000000200000006c000000690000007300000074000000200000006f00000066 *000000200000006e000000610000006d0000006500000073000000200000007300000068000000 *6f000000750000006c00000064000000200000006200000065000000200000006f000000660000 *002000000074000000680000006500000020000000660000006f000000720000006d0000002000 *00005b0102010000002701020100000027010204000000460000006f0000006f0000002c010201 *00000027010201000000270102060000004200000061000000720000002c0000002e0000002e01 *02010000005d02010000000a000000009c00000000009d00000000001c01010301020400000054 *0000006800000065000000200104010000001c0102300000002000000066000000750000006e00 *00006300000074000000690000006f0000006e0000002000000074000000610000006b00000065 *000000730000002000000061000000200000006c00000069000000730000007400000020000000 *6f0000006600000020000000630000006c00000061000000730000007300000065000000730000 *0020000000740000006f0000002000000064000000650000007200000069000000760000006500 *000020000000610000006e000000640000000a0102440000002000000061000000200000006200 *00006c0000006f000000630000006b000000200000006f00000066000000200000006400000065 *000000630000006c00000061000000720000006100000074000000690000006f0000006e000000 *730000002e0000002000000049000000740000002000000077000000690000006c0000006c0000 *00200000006100000064000000640000006900000074000000690000006f0000006e0000006100 *00006c0000006c0000007900000020000000640000006500000072000000690000007600000065 *00000020000000690000006e0000007300000074000000610000006e0000006300000065000000 *7300000020000000660000006f000000720000000a022200000020000000540000007900000070 *0000006500000061000000620000006c000000650000002c000000200000004f0000006c000000 *640000002e0000004400000061000000740000006100000020000000610000006e000000640000 *00200000004e00000065000000770000002e000000440000006100000074000000610000002e00 *00000a010302090000004500000078000000610000006d000000700000006c000000650000003a *0000000a0701022c00000020000000240000002800000020000000640000006500000072000000 *690000007600000065000000410000006c0000006c000000200000005b00000027000000270000 *0053000000680000006f000000770000002c000000200000002700000027000000450000007100 *00002c00000020000000270000002700000044000000650000006600000061000000750000006c *000000740000005d000000200000005b000000640000007c0000000a01021b0000002000000020 *000000200000002000000020000000200000002000000020000000640000006100000074000000 *6100000020000000460000006f0000006f0000002000000061000000200000003d000000200000 *00460000006f0000006f00000020000000610000000a01021e0000002000000020000000200000 *002000000020000000200000002000000020000000640000006100000074000000610000002000 *0000420000006100000072000000200000003d0000002000000042000000610000007a00000020 *0000007c00000020000000510000007500000075000000780000000a0207000000200000002000 *00007c0000005d00000020000000290000000a000000009e00000000009f0000000000a0000003 *0000001a0000001b0000001c030000001c0000001a0000001b00030000001a000000001b000000 *001c00000000000000000c00010c0000004e0000006f0000007400000020000000700000006f00 *0000720000007400000061000000620000006c00000065010c0000006500000078000000700000 *006500000072000000690000006d000000650000006e00000074000000610000006c0116000000 *680000006100000070000000700000007300000040000000670000006f0000006f000000670000 *006c0000006500000067000000720000006f0000007500000070000000730000002e0000006300 *00006f0000006d0000000000000000000000000d000000003f0000001d00000000001e00000000 *001f00000000002000000000002100000000002200000000002300000000002400000000002500 *000000002600000000002700000000002800000000002900000000002a00000000002b00000000 *002c00000000002d00000000002e01030242000000520000006900000067000000690000006400 *000069000000740000007900000020000000690000007300000020000000750000007300000065 *0000006400000020000000740000006f0000002000000064000000650000007300000069000000 *670000006e00000061000000740000006500000020000000740000006800000065000000200000 *00720000006500000073000000750000006c00000074000000200000006f000000660000002000 *000061000000200000006600000061000000690000006c00000065000000640000002000000058 *0000006d0000006c0000002000000070000000610000007200000073000000690000006e000000 *670000002e0000000a000000002f00000000003000000000003100000000003200000000003300 *0000000034010301022b000000450000006c000000650000006d000000650000006e0000007400 *000020000000720000006500000063000000750000007200000073000000690000007600000065 *0000006c0000007900000020000000720000006500000070000000720000006500000073000000 *650000006e000000740000007300000020000000580000004d0000004c00000020000000640000 *006100000074000000610000002e00000020000000200000000a0102a500000020000000200000 *002000000020000000450000006c000000650000006d000000200000006e000000200000006500 *00006c000000650000006d00000073000000200000002d0000003e00000020000000580000004d *0000004c00000020000000650000006c000000650000006d000000650000006e00000074000000 *2000000077000000690000007400000068000000200000006e000000610000006d000000650000 *00200000006e00000020000000610000006e000000640000002000000064000000650000007300 *000063000000720000006900000062000000650000006400000020000000620000007900000020 *000000650000006c000000650000006d000000730000002e00000020000000200000004e000000 *6f0000007400000065000000200000007400000068000000610000007400000020000000650000 *006c000000650000006d0000007300000020000000630000006f0000006e000000740000006100 *0000690000006e00000073000000200000007300000075000000620000002d000000650000006c *000000650000006d000000650000006e0000007400000073000000200000006100000073000000 *2000000077000000650000006c0000006c00000020000000610000007300000020000000740000 *006800000065000000200000006100000074000000740000007200000069000000620000007500 *0000740000006500000073000000200000006f00000072000000200000006c0000006900000074 *0000006500000072000000610000006c0000002000000064000000610000007400000061000000 *200000006f000000660000002000000074000000680000006500000020000000650000006c0000 *00650000006d000000650000006e000000740000002e0000000a01022300000020000000200000 *002000000020000000430000004400000061000000740000006100000020000000640000002000 *00002d0000003e000000200000004c00000069000000740000006500000072000000610000006c *00000020000000730000007400000072000000690000006e000000670000002000000064000000 *6100000074000000610000000a0102170000002000000020000000200000002000000041000000 *740000007400000072000000200000006b00000065000000790000002000000076000000610000 *006c000000200000002d0000003e000000200000004b00000065000000790102010000002f0225 *00000056000000610000006c000000750000006500000020000000700000006100000069000000 *72000000200000006f000000660000002000000074000000680000006500000020000000650000 *006c000000650000006d000000650000006e000000740000002000000061000000740000007400 *00007200000069000000620000007500000074000000650000002e0000000a0000000035000000 *00003600000000003700000000003800000000003900000000003a00000000003b00000000003c *0103010237000000690000006e00000073000000450000006c0000002000000061000000200000 *00620000002000000077000000690000006c0000006c00000020000000630000006f0000006e00 *000076000000650000007200000074000000200000006100000020000000740000006f00000020 *000000780000006d0000006c00000020000000610000006e000000640000002000000069000000 *6e0000007300000065000000720000007400000020000000690000007400000020000000690000 *006e000000740000006f000000200000007400000068000000650000000a022f00000020000000 *780000006d0000006c000000200000006f00000066000000200000006200000020000000690000 *0066000000200000006200000020000000720000006500000073000000750000006c0000007400 *00007300000020000000690000006e00000020000000610000006e00000020000000450000006c *000000650000006d00000020000000630000006f0000006e000000730000007400000072000000 *7500000063000000740000006f000000720000002e0000000a000000003d010301022d00000057 *000000720000006100000070000000700000006500000072000000200000006100000072000000 *6f000000750000006e000000640000002000000074000000680000006500000020000000580000 *006d0000006c00000020000000630000006c000000610000007300000073000000200000006d00 *00006500000074000000680000006f000000640000002000000072000000650000006100000064 *000000580000006d0000006c0000002e0000000a02970000002000000054000000680000006500 *000020000000520000006900000067000000690000006400000069000000740000007900000020 *00000077000000690000006c0000006c0000002000000064000000650000007400000065000000 *720000006d000000690000006e0000006500000020000000740000006800000065000000200000 *006200000065000000680000006100000076000000690000006f00000072000000200000006900 *00006e000000200000007400000068000000650000002000000063000000610000007300000065 *000000200000006f00000066000000200000006100000020000000660000006100000069000000 *6c00000065000000640000002000000070000000610000007200000073000000690000006e0000 *00670000003a000000200000002000000052000000690000006700000069000000640000002000 *000077000000690000006c0000006c000000200000007200000065000000740000007500000072 *0000006e000000200000004e0000006f0000007400000068000000690000006e00000067000000 *20000000610000006e0000006400000020000000460000006c0000006500000078000000690000 *00620000006c000000650000002000000077000000690000006c0000006c000000200000007200 *0000650000007400000075000000720000006e000000200000004900000064000000650000006e *000000740000006900000074000000790000002000000028000000640000006500000066000000 *61000000750000006c0000007400000056000000610000006c0000007500000065000000290000 *000a000000003e010302700000004900000064000000650000006e000000740000006900000063 *000000610000006c00000020000000740000006f00000020000000740000006f00000058000000 *6d0000006c0000002000000066000000720000006f0000006d00000020000000580000006d0000 *006c00000020000000630000006c00000061000000730000007300000020000000650000007800 *000063000000650000007000000074000000200000007400000068000000610000007400000020 *00000069000000740000002000000077000000690000006c0000006c0000002000000072000000 *650000006d0000006f000000760000006500000020000000610000007400000074000000720000 *00690000006200000075000000740000006500000073000000200000006e000000610000006d00 *00006500000064000000200000006800000061000000730000006b000000650000006c0000006c *00000054000000790000007000000065000000200000006f000000720000002000000068000000 *61000000730000006b000000650000006c0000006c000000540000007900000070000000650000 *0056000000650000007200000073000000690000006f0000006e0000000a000000003f01030241 *000000550000007300000065000000640000002000000061000000730000002000000061000000 *2000000074000000790000007000000065000000200000007700000069000000740000006e0000 *0065000000730000007300000020000000660000006f0000007200000020000000750000007300 *000061000000670000006500000020000000770000006900000074000000680000002000000073 *00000079000000620000002d000000770000006900000074000000680000002d00000063000000 *6c0000006100000073000000730000002000000044000000610000007400000061000000200000 *00630000006c0000006100000073000000730000002e0000000a00000000400103024a00000041 *00000070000000700000006c000000690000006500000073000000200000006600000075000000 *6e0000006300000074000000690000006f0000006e00000020000000740000006f000000200000 *006f0000006e0000006c0000007900000020000000660000006900000072000000730000007400 *000020000000650000006c000000650000006d000000650000006e00000074000000200000006f *0000006600000020000000740000006800000065000000200000006c0000006900000073000000 *740000002e000000200000002000000053000000610000006600000065000000200000006f0000 *006e00000020000000650000006d000000700000007400000079000000200000006c0000006900 *00007300000074000000730000002e0000000a0000000041010301023e000000430000006f0000 *006e00000076000000650000007200000074000000730000002000000074000000680000006500 *000020000000610000007200000067000000750000006d000000650000006e0000007400000020 *000000740000006f00000020000000610000006e00000020000000580000006d0000006c000000 *20000000650000006c000000650000006d000000650000006e0000007400000020000000770000 *006900000074000000680000002000000074000000680000006500000020000000630000006f00 *00006e0000007300000074000000720000007500000063000000740000006f0000007200000020 *0000000a01024d0000002000000020000000200000006e000000610000006d0000006500000020 *00000061000000730000002000000074000000680000006500000020000000720000006f000000 *6f00000074000000200000006f0000006600000020000000740000006800000065000000200000 *00450000006c000000650000006d00000020000000610000006e00000064000000200000007400 *00006800000065000000200000006100000064000000640000006900000074000000690000006f *0000006e000000610000006c000000200000006100000074000000740000007200000069000000 *620000007500000074000000650000007300000020000000630000006f00000072000000720000 *006500000073000000700000006f0000006e00000064000000690000006e000000670000002000 *00000a022f000000200000002000000020000000740000006f0000002000000068000000610000 *00730000006b000000650000006c0000006c000000540000007900000070000000650000002000 *0000610000006e00000064000000200000006800000061000000730000006b000000650000006c *0000006c0000005400000079000000700000006500000056000000650000007200000073000000 *690000006f0000006e0000002000000061000000640000006400000065000000640000000a0000 *0000420103025200000047000000650000006e0000006500000072000000690000006300000061 *0000006c0000006c00000079000000200000007400000072000000610000007600000065000000 *7200000073000000650000007300000020000000610000006e00000020000000690000006e0000 *007300000074000000610000006e0000006300000065000000200000006f000000660000002000 *0000580000006d0000006c00000020000000610000006e0000006400000020000000630000006f *0000006e0000007600000065000000720000007400000073000000200000006900000074000000 *20000000690000006e000000740000006f0000002000000061000000200000006c000000690000 *007300000074000000200000006f0000006600000020000000650000006c000000650000006d00 *0000650000006e0000007400000073000000200000000a0000000043010301024a000000410000 *007400000074000000650000006d00000070000000740000007300000020000000740000006f00 *000020000000700000006100000072000000730000006500000020000000740000006800000065 *00000020000000730000006500000074000000200000006f000000660000002000000065000000 *6c000000650000006d000000650000006e000000740000007300000020000000610000006e0000 *00640000002000000072000000650000007400000075000000720000006e000000200000007400 *000068000000650000002000000066000000690000007200000073000000740000002000000063 *0000006f0000006e0000007300000074000000720000007500000063000000740000006f000000 *720000002000000069000000740000000a022e0000002000000063000000610000006e00000020 *000000730000007500000063000000630000006500000073000000730000006600000075000000 *6c0000006c00000079000000200000007000000061000000720000007300000065000000200000 *006f000000660000002000000074000000680000006500000020000000690000006e0000006600 *000065000000720000007200000065000000640000002000000074000000790000007000000065 *0000002e0000000a00000000440103024500000043000000720000006500000061000000740000 *006500000020000000610000006e00000020000000580000006d0000006c000000200000006900 *00006e0000007300000074000000610000006e0000006300000065000000200000007500000073 *000000690000006e00000067000000200000007400000072000000610000006e00000073000000 *700000006100000072000000650000006e00000074000000540000006f000000580000006d0000 *006c00000020000000610000006e00000064000000200000007400000072000000610000006e00 *000073000000700000006100000072000000650000006e00000074000000520000006500000061 *00000064000000580000006d0000006c0000000a00000000450000000000460000000000470000 *00000048000000000049010302720000004d000000610000007400000063000000680000006500 *000073000000200000007400000068000000650000002000000070000000720000006f00000076 *000000690000006400000065000000640000002000000073000000740000007200000069000000 *6e0000006700000020000000740000006f00000020000000740000006800000065000000200000 *006b0000006500000079000000200000006f0000006600000020000000610000006e0000002000 *00006100000074000000740000007200000069000000620000007500000074000000650000002e *000000200000002000000052000000650000007400000075000000720000006e00000073000000 *2000000046000000610000006c0000007300000065000000200000006900000066000000200000 *00610000006e00000079000000200000006f000000740000006800000065000000720000002000 *0000450000006c000000650000006d000000650000006e0000007400000020000000630000006f *0000006e0000007300000074000000720000007500000063000000740000006f00000072000000 *20000000690000007300000020000000670000006900000076000000650000006e0000002e0000 *000a000000004a0103025600000046000000650000007400000063000000680000002000000074 *00000068000000650000002000000076000000610000006c000000750000006500000020000000 *6f0000006600000020000000740000006800000065000000200000006700000069000000760000 *00650000006e000000200000006100000074000000740000007200000069000000620000007500 *000074000000650000002000000069000000660000002000000070000000720000006500000073 *000000650000006e000000740000002c000000200000006900000066000000200000006e000000 *6f000000740000002000000070000000720000006500000073000000650000006e000000740000 *002000000077000000690000006c0000006c000000200000007200000065000000740000007500 *0000720000006e000000200000004e0000006f0000007400000068000000690000006e00000067 *0000000a000000004b010302310000004100000074000000740000007200000069000000620000 *007500000074000000650000002000000075000000730000006500000064000000200000006600 *00006f0000007200000020000000580000006d0000006c00000020000000630000006c00000061 *00000073000000730000002000000076000000650000007200000073000000690000006f000000 *6e00000020000000690000006e000000660000006f000000720000006d00000061000000740000 *00690000006f0000006e0000000a000000004c0103024f00000041000000740000007400000072 *000000690000006200000075000000740000006500000020000000750000007300000065000000 *6400000020000000660000006f00000072000000200000007200000065000000630000006f0000 *007200000064000000690000006e00000067000000200000007400000068000000650000002000 *000061000000630000007400000075000000610000006c00000020000000480000006100000073 *0000006b000000650000006c0000006c0000002000000074000000790000007000000065000000 *20000000690000006e0000002000000074000000680000006500000020000000780000006d0000 *006c0000002000000073000000650000007200000069000000610000006c000000690000007a00 *00006100000074000000690000006f0000006e000000200000000a000000004d00000000004e01 *0301024500000061000000430000006f0000006e00000073000000740000007200000046000000 *720000006f0000006d000000450000006c000000650000006d000000650000006e000000740000 *00730000002000000077000000690000006c0000006c0000002000000072000000650000007400 *000075000000720000006e00000020000000740000006800000065000000200000007200000065 *00000073000000750000006c0000007400000073000000200000006f0000006600000020000000 *740000006800000065000000200000006600000069000000720000007300000074000000200000 *00630000006f0000006e0000007300000074000000720000007500000063000000740000006f00 *0000720000000a0218000000200000007400000068000000610000007400000020000000700000 *00610000007200000073000000650000007300000020000000630000006f000000720000007200 *00006500000063000000740000006c000000790000002e0000000a000000004f01030102410000 *004c000000690000006b0000006500000020000000630000006f0000006e000000730000007400 *00007200000046000000720000006f0000006d000000450000006c000000650000006d00000065 *0000006e0000007400000073000000200000006200000075000000740000002000000064000000 *6f0000006500000073000000200000006e0000006f0000007400000020000000610000006c0000 *006c0000006f000000770000002000000064000000650000006600000061000000750000006c00 *000074000000690000006e0000006700000020000000690000006e000000200000006300000061 *0000007300000065000000200000006f000000660000000a021000000020000000610000002000 *00007000000061000000720000007300000065000000200000006500000072000000720000006f *000000720000002e0000000a000000005001030102420000004100000074000000740000006500 *00006d00000070000000740000007300000020000000740000006f000000200000007000000061 *000000720000007300000065000000200000007400000068000000650000002000000067000000 *6900000076000000650000006e00000020000000650000006c000000650000006d000000650000 *006e000000740000007300000020000000740000006f0000002000000062000000750000006900 *00006c000000640000002000000074000000680000006500000020000000700000006100000072 *000000740000006900000063000000750000006c00000061000000720000002000000074000000 *7900000070000000650000000a0228000000200000002000000020000000200000002000000067 *0000006900000076000000650000006e0000002000000062000000790000002000000074000000 *680000006500000020000000630000006f0000006e000000730000007400000072000000750000 *0063000000740000006f0000007200000020000000610000007200000067000000750000006d00 *0000650000006e000000740000002e0000000a00000000510103022c0000005200000065000000 *7400000075000000720000006e0000007300000020000000740000006800000065000000200000 *00650000006c000000650000006d000000650000006e0000007400000073000000200000006300 *0000750000007200000072000000650000006e000000740000006c000000790000002000000069 *0000006e0000002000000074000000680000006500000020000000730000007400000061000000 *74000000650000000a000000005201030235000000530000006500000074000000730000002000 *000074000000680000006500000020000000730000007400000061000000740000006500000020 *0000006f000000660000002000000074000000680000006500000020000000780000006d000000 *6c0000002000000070000000610000007200000073000000690000006e00000067000000200000 *00740000006f000000200000007400000068000000650000002000000067000000690000007600 *0000650000006e0000002000000076000000610000006c00000075000000650000000a00000000 *530103010249000000410000007400000074000000650000006d00000070000000740000007300 *000020000000740000006f00000020000000700000006100000072000000730000006500000020 *000000740000006800000065000000200000006300000075000000720000007200000065000000 *6e0000007400000020000000730000006500000074000000200000006f00000066000000200000 *00650000006c000000650000006d000000650000006e00000074000000730000002e0000002000 *000020000000490000006600000020000000690000007400000020000000660000006100000069 *0000006c0000007300000020000000740000006800000065000000200000006200000065000000 *680000006100000076000000690000006f000000720000000a01024b0000006900000073000000 *20000000640000006500000070000000650000006e00000064000000650000006e000000740000 *00200000006f0000006e0000002000000074000000680000006500000020000000520000006900 *00006700000069000000640000006900000074000000790000002e000000200000002000000049 *000000660000002000000069000000740000002000000069000000730000002000000052000000 *690000006700000069000000640000002c000000200000007400000068000000650000006e0000 *002000000069000000740000002000000077000000690000006c0000006c000000200000007200 *0000650000007400000075000000720000006e000000200000004e0000006f0000007400000068 *000000690000006e000000670000000a0102370000006200000075000000740000002000000069 *000000660000002000000069000000740000002000000069000000730000002000000046000000 *6c000000650000007800000069000000620000006c000000650000002000000069000000740000 *002000000077000000690000006c0000006c000000200000007200000065000000740000007500 *0000720000006e0000002000000074000000680000006500000020000000640000006500000066 *00000061000000750000006c0000007400000056000000610000006c0000007500000065000000 *2e0000000a01024a00000049000000660000002000000074000000680000006500000020000000 *70000000610000007200000073000000690000006e000000670000002000000073000000750000 *006300000063000000650000006500000064000000730000002c00000020000000690000007400 *00002000000077000000690000006c0000006c0000002000000072000000650000007400000075 *000000720000006e00000020000000740000006800000065000000200000007600000061000000 *6c000000750000006500000020000000610000006e000000640000002000000073000000740000 *006f00000072000000650000002000000074000000680000006500000020000000720000006500 *00006d00000061000000690000006e000000690000006e000000670000000a0222000000580000 *004d0000004c00000020000000650000006c000000650000006d000000650000006e0000007400 *00007300000020000000690000006e000000200000007400000068000000650000002000000070 *000000610000007200000073000000650000007200000020000000730000007400000061000000 *74000000650000002e0000000a0000000054010302600000004900000064000000650000006e00 *0000740000006900000063000000610000006c00000020000000740000006f0000002000000072 *0000006500000061000000640000004d000000580000006d0000006c0000002000000065000000 *780000006300000065000000700000007400000020000000740000006800000061000000740000 *0020000000690000006e0000002000000074000000680000006500000020000000630000006100 *00007300000065000000200000006f000000660000002000000061000000200000006600000061 *000000690000006c00000065000000640000002000000070000000610000007200000073000000 *690000006e000000670000002000000069000000740000002000000077000000690000006c0000 *006c000000200000006e0000006f00000074000000200000007500000073000000650000002000 *000064000000650000006600000061000000750000006c0000007400000056000000610000006c *00000075000000650000002e0000000a000000005500000000005601030224000000780000006d *0000006c00000053000000680000006f0000007700000043000000440000006100000074000000 *61000000200000006c000000690000006600000074000000650000006400000020000000740000 *006f00000020000000610000006300000074000000200000006f0000006e000000200000006c00 *0000690000007300000074000000730000000a0000000057010301024700000061000000750000 *00740000006f0000006d00000061000000740000006900000063000000610000006c0000006c00 *000079000000200000006300000072000000650000006100000074000000650000007300000020 *000000610000006e00000020000000580000006d0000006c000000200000006400000065000000 *66000000690000006e0000006900000074000000690000006f0000006e00000020000000660000 *006f00000072000000200000006100000020000000740000007900000070000000650000002000 *00007400000068000000610000007400000020000000690000007300000020000000610000006e *00000020000000690000006e0000007300000074000000610000006e0000006300000065000000 *0a025d0000006f000000660000002000000053000000680000006f000000770000002000000061 *0000006e0000006400000020000000520000006500000061000000640000002e00000020000000 *20000000540000006800000069000000730000002000000077000000690000006c0000006c0000 *0020000000720000006500000073000000750000006c0000007400000020000000690000006e00 *000020000000610000006e00000020000000690000006e0000007300000074000000610000006e *000000630000006500000020000000740000006800000061000000740000002000000063000000 *6f0000006e00000076000000650000007200000074000000730000002000000074000000680000 *0065000000200000007400000079000000700000006500000020000000740000006f0000002000 *0000610000006e000000640000002000000066000000720000006f0000006d0000002000000043 *000000440000006100000074000000610000002e0000000a000000005801030225000000780000 *006d0000006c00000043000000440000006100000074000000610000004c000000690000007300 *00007400000073000000200000006c000000690000006600000074000000650000006400000020 *000000740000006f00000020000000610000006300000074000000200000006f0000006e000000 *200000006c000000690000007300000074000000730000000a0000000059010301024400000043 *00000072000000650000006100000074000000650000007300000020000000610000006e000000 *20000000690000006e0000007300000074000000610000006e0000006300000065000000200000 *0073000000690000006d000000690000006c000000610000007200000020000000740000006f00 *000020000000780000006d0000006c00000053000000680000006f000000770000004300000044 *000000610000007400000061000000200000006500000078000000630000006500000070000000 *7400000020000000660000006f00000072000000200000006c0000006900000073000000740000 *0073000000200000006f00000066000000200000007400000068000000650000000a020f000000 *70000000720000006f000000760000006900000064000000650000006400000020000000740000 *00790000007000000065000000200000000a000000005a01030231000000520000006500000070 *0000006c0000006100000063000000650000007300000020000000630000006f0000006d000000 *6d000000610000007300000020000000690000006e000000200000007400000068000000650000 *0020000000730000007400000072000000690000006e0000006700000020000000770000006900 *000074000000680000002000000073000000690000006e000000670000006c0000006500000020 *0000007300000070000000610000006300000065000000730000000a000000005b0103021c0000 *005400000068000000720000006f000000770000007300000020000000610000006e0000002000 *00006500000072000000720000006f00000072000000200000007700000068000000650000006e *0000002000000063000000610000006c0000006c00000065000000640000000a003f0000001d00 *00001e0000001f0000002000000021000000220000002300000024000000250000002600000027 *00000028000000290000002a0000002b0000002c0000002d0000002e0000002f00000030000000 *3100000032000000330000003400000035000000360000003700000038000000390000003a0000 *003b0000003c0000003d0000003e0000003f000000400000004100000042000000430000004400 *000045000000460000004700000048000000490000004a0000004b0000004c0000004d0000004e *0000004f0000005000000051000000520000005300000054000000550000005600000057000000 *58000000590000005a0000005b0001003f0000001d020000001e0000001f0000001e000000001f *000000002000000000210400000022000000230000002400000025000000220000000023000000 *002400000000250000000026070000002700000028000000290000002a0000002b0000002c0000 *002d0000002700000000280000000029000000002a000000002b000000002c000000002d000000 *002e02000000300000002f0000002f000000003000000000310200000033000000320000003200 *000000330000000034030000003700000036000000350000003500000000360000000037000000 *00380000000039000000003a000000003b000000003c000000003d000000003e000000003f0000 *000040000000004100000000420000000043000000004400000000450000000046000000004700 *000000480000000049000000004a000000004b000000004c000000004d000000004e000000004f *000000005000000000510000000052000000005300000000540000000055000000005600000000 *5700000000580000000059000000005a000000005b00000000000000000700000000090000005c *00000000005d0103022b0000004c00000069000000660000007400000073000000200000007400 *00006f0000004800000061000000580000006d0000006c00000020000000740000006f00000020 *000000610000006300000074000000200000006f0000006e000000200000006c00000069000000 *730000007400000073000000200000006f0000006600000020000000450000006c000000650000 *006d000000650000006e0000007400000073000000200000000a000000005e0103010244000000 *430000006f0000006e000000760000006500000072000000740000007300000020000000740000 *00680000006500000020000000450000006c000000650000006d000000650000006e0000007400 *000020000000740000006f000000200000004800000061000000580000006d0000006c00000020 *000000450000006c000000650000006d000000650000006e000000740000002000000069000000 *660000002000000074000000680000006500000020000000450000006c000000650000006d0000 *00650000006e00000074000000200000006900000073000000200000006f000000660000002000 *000074000000680000006500000020000000660000006f000000720000006d0000000a020b0000 *0020000000450000006c000000650000006d000000200000005f000000200000005f0000002000 *00000a000000005f0103024a000000430000006f0000006e000000760000006500000072000000 *73000000690000006f0000006e0000002000000066000000750000006e00000063000000740000 *00690000006f0000006e0000002000000062000000650000007400000077000000650000006500 *00006e000000200000007400000068000000650000002000000048000000610000007000000070 *000000730000007400000061000000630000006b00000020000000450000006c00000065000000 *6d000000650000006e0000007400000020000000610000006e0000006400000020000000480000 *0061000000580000006d0000006c00000020000000430000006f0000006e000000740000006500 *00006e000000740000002000000074000000790000007000000065000000730000000a00000000 *600103010248000000430000006f0000006e000000760000006500000072000000740000007300 *000020000000610000006e00000020000000450000006c000000650000006d000000650000006e *000000740000002000000074000000680000006100000074000000200000006900000073000000 *20000000610000006e000000200000004100000074000000740000007200000020000000690000 *006e000000740000006f0000002000000061000000200000004800000061000000580000006d00 *00006c000000200000004100000074000000740000007200000069000000620000007500000074 *000000650000002e000000200000002000000057000000690000006c0000006c00000020000000 *7400000068000000720000006f000000770000000a022d00000020000000610000006e00000020 *0000006500000072000000720000006f0000007200000020000000690000006600000020000000 *70000000720000006f000000760000006900000064000000650000006400000020000000740000 *0068000000650000002000000077000000720000006f0000006e00000067000000200000006300 *00006f0000006e0000007300000074000000720000007500000063000000740000006f00000072 *0000002e0000000a0000000061010302240000004c000000690000006600000074000000730000 *002000000066000000720000006f0000006d0000004800000061000000580000006d0000006c00 *000020000000740000006f000000200000006f0000007000000065000000720000006100000074 *00000065000000200000006f0000006e000000200000006c000000690000007300000074000000 *730000000a000000006201030227000000430000006f0000006e00000076000000650000007200 *000074000000730000002000000061000000200000004800000061000000580000006d0000006c *00000020000000430000006f0000006e00000074000000650000006e0000007400000020000000 *740000006f00000020000000610000006e00000020000000450000006c000000650000006d0000 *00650000006e000000740000000a0000000063010302240000004c000000690000006600000074 *000000730000002000000066000000720000006f0000006d000000410000007400000074000000 *72000000690000006200000075000000740000006500000020000000740000006f000000200000 *00610000006300000074000000200000006f0000006e000000200000006c000000690000007300 *000074000000730000000a0000000064010301023a00000057000000690000006c0000006c0000 *0020000000630000006f0000006e00000076000000650000007200000074000000200000006100 *0000200000004800000061000000580000006d0000006c00000020000000610000007400000074 *000000720000006900000062000000750000007400000065000000200000007400000068000000 *6100000074000000200000006900000073000000200000006f0000006600000020000000740000 *00680000006500000020000000660000006f000000720000006d000000200000005b0000004c00 *0000650000006600000074000000200000005f0102010000005d01020600000020000000740000 *006f00000020000000610000000a02350000002000000048000000610000007000000070000000 *730000007400000061000000630000006b00000020000000450000006c000000650000006d0000 *00650000006e000000740000002e00000020000000200000004f00000074000000680000006500 *000072000000770000006900000073000000650000002c0000002000000077000000690000006c *0000006c000000200000007400000068000000720000006f000000770000002000000061000000 *6e000000200000006500000072000000720000006f000000720000002e0000000a00090000005c *0000005d0000005e0000005f0000006000000061000000620000006300000064090000005c0000 *005d0000005e0000005f000000600000006100000062000000630000006400090000005c000000 *005d000000005e000000005f000000006000000000610000000062000000006300000000640000 *0000000000000e000000000c000000650000000000660000000000670000000000680000000000 *6900000000006a00000000006b00000000006c00000000006d00000000006e00000000006f0000 *0000007000000c00000065000000660000006700000068000000690000006a0000006b0000006c *0000006d0000006e0000006f000000700001000c00000065010000006600000066000000006701 *00000068000000680000000069010000006a0000006a000000006b010000006c0000006c000000 *006d000000006e000000006f000000007000000000000000000f00000000000000010000000000 *000000000600000000004b0000001d0000001e0000001f00000020000000210000002200000023 *0000002400000025000000260000002700000028000000290000002a0000002b0000002c000000 *2d0000002e0000002f000000300000003100000032000000330000003400000035000000360000 *003700000038000000390000003a0000003b0000003c0000003d0000003e0000003f0000004000 *00004100000042000000430000004400000045000000460000004700000048000000490000004a *0000004b0000004c0000004d0000004e0000004f00000050000000510000005200000053000000 *5400000055000000560000005700000058000000590000005a0000005b00000065000000660000 *006700000068000000690000006a0000006b0000006c0000006d0000006e0000006f000000704b *000000340000003700000036000000350000003b0000003a00000039000000380000003c000000 *3d0000003100000033000000320000003e0000002e000000300000002f00000026000000270000 *0028000000290000002a0000002b0000002c0000002d0000002100000022000000230000002400 *0000250000003f0000004000000041000000420000004300000044000000450000004600000047 *00000048000000490000004a0000004b0000004c0000004d0000004e0000004f00000050000000 *200000001d0000001e0000001f0000005100000052000000530000005400000055000000560000 *005700000058000000590000005a0000005b000000690000006a0000006b0000006c0000007000 *00006f0000006e0000006d00000067000000680000006500000066000000000000000000080000 *00001b000000710000000000720000000000730000000000740000000000750103010238000000 *430000006f0000006e0000007600000065000000720000007400000073000000200000006c0000 *0069000000730000007400000073000000200000006f0000006600000020000000730000007400 *000072000000690000006e00000067000000200000007000000061000000690000007200000073 *00000020000000690000006e000000740000006f0000002000000061000000200000006c000000 *690000007300000074000000200000006f0000006600000020000000450000006c000000650000 *006d000000650000006e00000074000000730000002e0000000a01021900000020000000540000 *006800000065000000200000006200000061000000730000006900000063000000200000007300 *000074000000720000007500000063000000740000007500000072000000650000002000000069 *00000073000000200000000a01020e000000200000007000000061000000690000007200000073 *000000540000006f000000580000006d0000006c000000200000005b0000002801050300000066 *0000006f0000006f0102010000002c010503000000620000006100000072010201000000290102 *010000005d010209000000200000003d000000200000005b000000450000006c00000065000000 *6d00000020010503000000660000006f0000006f010208000000200000005b0000004300000044 *000000610000007400000061000000200105030000006200000061000000720102010000005d01 *02010000005d0102010000000a01020e0000002000000070000000610000006900000072000000 *73000000540000006f000000580000006d0000006c000000200000005b00000028010507000000 *660000006f0000006f0000002f0000006200000061000000720102010000002c01050300000062 *000000610000007a010201000000290102010000005d010209000000200000003d000000200000 *005b000000450000006c000000650000006d00000020010503000000660000006f0000006f0102 *07000000200000005b000000450000006c000000650000006d0000002001050300000062000000 *6100000072010208000000200000005b0000004300000044000000610000007400000061000000 *2001050300000062000000610000007a0102010000005d0102010000005d0102010000005d0202 *000000200000000a00000000a10000000000a20000000000760103010237000000430000006f00 *00006e00000076000000650000007200000074000000730000002000000061000000200000006c *000000690000007300000074000000200000006f0000006600000020000000450000006c000000 *650000006d000000650000006e000000740000007300000020000000740000006f000000200000 *0061000000200000006c000000690000007300000074000000200000006f000000660000002000 *0000530000007400000072000000690000006e0000006700000020000000700000006100000069 *00000072000000730000002e0000000a01021400000020000000780000006d0000006c00000054 *0000006f0000005000000061000000690000007200000073000000200000005b00000043000000 *44000000610000007400000061000000200000005f0102010000005d010209000000200000003d *000000200000006500000072000000720000006f000000720000000a0102120000002000000078 *0000006d0000006c000000540000006f0000005000000061000000690000007200000073000000 *200000005b000000450000006c000000650000006d00000020010503000000660000006f000000 *6f010208000000200000005b000000430000004400000061000000740000006100000020010503 *0000006200000061000000720102010000005d0102010000005d010205000000200000003d0000 *00200000005b00000028010503000000660000006f0000006f0102010000002c01050300000062 *0000006100000072010201000000290102010000005d0102010000000a01021200000020000000 *780000006d0000006c000000540000006f00000050000000610000006900000072000000730000 *00200000005b000000450000006c000000650000006d00000020010503000000660000006f0000 *006f010207000000200000005b000000450000006c000000650000006d00000020010503000000 *620000006100000072010208000000200000005b00000043000000440000006100000074000000 *610000002001050300000062000000610000007a0102010000005d0102010000005d0102010000 *005d010205000000200000003d000000200000005b00000028010507000000660000006f000000 *6f0000002f0000006200000061000000720102010000002c01050300000062000000610000007a *010201000000290102010000005d0102010000000a021e00000020000000780000006d0000006c *000000540000006f0000005000000061000000690000007200000073000000200000002e000000 *200000007000000061000000690000007200000073000000540000006f000000580000006d0000 *006c000000200000003d0000002000000069000000640000000a00000000a30000000000770103 *010248000000430000007200000065000000610000007400000065000000730000002000000074 *000000680000006500000020000000580000006d0000006c000000200000007300000074000000 *7200000075000000630000007400000075000000720000006500000020000000630000006f0000 *0072000000720000006500000073000000700000006f0000006e00000064000000690000006e00 *00006700000020000000740000006f000000200000007400000068000000650000002000000073 *000000700000006500000063000000690000006600000069000000630000006100000074000000 *690000006f0000006e000000200000006f0000006600000020000000610000006e000000200000 *0048000000540000004d0000004c0000000a024900000020000000660000006f00000072000000 *6d0000002e00000020000000200000005400000068000000650000002000000070000000720000 *006f00000076000000690000006400000065000000640000002000000070000000610000006900 *000072000000730000002000000073000000680000006f000000750000006c0000006400000020 *000000620000006500000020000000740000006800000065000000200000007300000070000000 *6500000063000000200000006f0000006600000020000000740000006800000065000000200000 *00690000006e0000007000000075000000740000007300000020000000740000006f0000002000 *000074000000680000006500000020000000660000006f000000720000006d0000002e0000000a *00000000a40000000000a500000000007801030254000000450000007100000075000000690000 *0076000000610000006c000000650000006e0000007400000020000000740000006f0000002000 *00007000000061000000690000007200000073000000540000006f00000048000000540000004d *0000004c000000460000006f000000720000006d00000020000000620000007500000074000000 *20000000660000006900000072000000730000007400000020000000630000006f0000006e0000 *007600000065000000720000007400000073000000200000007400000068000000650000002000 *0000580000006d0000006c00000020000000690000006e0000007300000074000000610000006e *000000630000006500000020000000740000006f000000200000006c0000006900000073000000 *74000000200000006f000000660000002000000070000000610000006900000072000000730000 *002e0000000a000000007900000000007a0103027b000000450000007100000075000000690000 *0076000000610000006c000000650000006e0000007400000020000000740000006f0000002000 *00007000000061000000690000007200000073000000540000006f00000048000000540000004d *0000004c000000460000006f000000720000006d00000020000000620000007500000074000000 *20000000660000006900000072000000730000007400000020000000630000006f0000006e0000 *007600000065000000720000007400000073000000200000007400000068000000650000002000 *0000580000006d0000006c00000020000000690000006e0000007300000074000000610000006e *000000630000006500000020000000740000006f000000200000006c0000006900000073000000 *74000000200000006f000000660000002000000070000000610000006900000072000000730000 *002e0000002000000020000000410000006e00000020000000610000006c000000690000006100 *00007300000020000000660000006f0000007200000020000000780000006d0000006c00000054 *0000006f00000048000000540000004d0000004c000000460000006f000000720000006d000000 *2000000063000000750000007200000072000000650000006e000000740000006c000000790000 *002e0000000a00000000a60000000000a70000000000a80000000000a90000000000aa00000000 *00ab0000000000ac0000000000ad0000000000ae0000000000af0000000000b00000000000b100 *000a00000071000000720000007300000074000000750000007600000077000000780000007900 *00007a0a00000075000000760000007700000078000000790000007a0000007400000071000000 *7200000073000a0000007102000000720000007300000072000000007300000000740000000075 *0000000076000000007700000000780000000079000000007a0000000000000000090000000007 *0000007b0103023c00000050000000720000006f00000078000000790000002000000069000000 *7300000020000000650000006d00000070000000740000007900000020000000610000006e0000 *006400000020000000690000007300000020000000750000007300000065000000640000002000 *000061000000730000002000000061000000200000007400000072000000610000006e00000073 *000000700000006f0000007200000074000000200000006f000000660000002000000061000000 *200000007000000068000000610000006e000000740000006f0000006d00000020000000740000 *007900000070000000650000000a000000007c00000000007d00000000007e00000000007f0103 *023400000043000000720000006500000061000000740000006500000073000000200000007400 *000068000000650000002000000050000000720000006f00000078000000790000002000000077 *000000690000007400000068000000200000006100000020000000740000007900000070000000 *65000000200000006d00000061000000740000006300000068000000690000006e000000670000 *002000000074000000680000006500000020000000610000007200000067000000750000006d00 *0000650000006e000000740000000a00000000800103020f000000520000006500000074000000 *75000000720000006e0000007300000020000000620000006f00000074000000740000006f0000 *006d0000000a000000008101030232000000410000006300000074000000730000002000000061 *000000730000002000000069000000640000002000000065000000780000006300000065000000 *700000007400000020000000660000006f000000720000002000000070000000720000006f0000 *00760000006900000064000000690000006e000000670000002000000074000000790000007000 *000065000000200000007200000065000000730000007400000072000000690000006300000074 *000000690000006f0000006e000000730000000a00070000007b0000007c0000007d0000007e00 *00007f0000008000000081070000007b0000007c0000007e0000007d0000007f00000080000000 *8100070000007b010000007c0000007c000000007d000000007e000000007f0000000080000000 *008100000000000000000a0000000023000000820103010251000000550000006e000000690000 *00660000006f000000720000006d00000020000000630000006f0000006e000000740000006100 *0000690000006e000000650000007200000020000000660000006f000000720000002000000061 *0000006e000000790000002000000073000000650000007200000069000000610000006c000000 *690000007a000000650000006400000020000000640000006100000074000000610000002e0000 *002000000020000000490000007400000020000000630000006f0000006e000000740000006100 *0000690000006e0000007300000020000000610000002000000073000000740000007200000069 *0000006e0000006700000020000000720000006500000070000000200000006f00000066000000 *2000000074000000680000006500000020000000740000007900000070000000650000000a0232 *00000020000000610000006e000000640000002000000074000000680000006500000020000000 *61000000630000007400000075000000610000006c000000200000006400000061000000740000 *00610000002000000073000000650000007200000069000000610000006c000000690000007a00 *0000650000006400000020000000740000006f0000002000000061000000200000006200000079 *000000740000006500000020000000730000007400000072000000690000006e00000067000000 *2e0000000a00000000b20000000000830000000000b30000000000840000000000850000000000 *860000000000870103010249000000540000006800000065000000200000005600000065000000 *7200000073000000690000006f0000006e00000020000000740000007900000070000000650000 *0020000000630000006c0000006100000073000000730000002000000069000000730000002000 *00007500000073000000650000006400000020000000740000006f000000200000006400000065 *000000730000006300000072000000690000006200000065000000200000007700000068000000 *650000007400000068000000650000007200000020000000610000002000000074000000790000 *0070000000650000002000000069000000730000002000000066000000750000006e0000006400 *0000610000006d000000650000006e00000074000000610000006c0000000a0102490000002000 *00006f000000720000002000000069000000660000002000000069000000740000002000000069 *00000073000000200000006d00000065000000610000006e000000740000002000000074000000 *6f00000020000000650000007800000074000000650000006e0000006400000020000000610000 *006e0000006f000000740000006800000065000000720000002000000074000000790000007000 *0000650000002e0000002000000020000000460000006f00000072000000200000006100000020 *000000750000007300000065000000720000002000000064000000650000006600000069000000 *6e0000006500000064000000200000007400000079000000700000006500000020000000740000 *006800000061000000740000000a01024f00000020000000640000006f00000065000000730000 *00200000006e0000006f0000007400000020000000650000007800000074000000650000006e00 *00006400000020000000610000006e00000079000000200000006f000000740000006800000065 *00000072000000730000002c000000200000006f0000006e000000650000002000000063000000 *610000006e00000020000000750000007300000065000000200000007400000068000000650000 *002000000064000000650000006600000061000000750000006c00000074000000200000006900 *00006e0000007300000074000000610000006e0000006300000065000000200000006f00000066 *0000002000000056000000650000007200000073000000690000006f0000006e0000002c000000 *20000000650000002e000000670000002e0000000a010201000000200107021700000069000000 *6e0000007300000074000000610000006e00000063000000650000002000000056000000650000 *007200000073000000690000006f0000006e000000200000004d00000079000000540000007900 *0000700000006501023800000020000000740000006f0000002000000064000000650000006600 *0000690000006e0000006500000020000000690000007400000020000000680000006100000073 *00000020000000680000006100000076000000690000006e000000670000002000000061000000 *2000000076000000650000007200000073000000690000006f0000006e00000020000000690000 *0064000000200000006f00000066000000200000003000000020000000610000006e0000006400 *00002000000070000000720000006500000076000000690000006f00000075000000730000000a *020700000020000000740000007900000070000000650000002e0000000a000000008800000000 *008900000000008a00000000008b010301020f0000004400000061000000740000006100000020 *0000006c00000061000000790000006f000000750000007400000020000000770000006f000000 *6e01020100000027022c00000074000000200000006300000068000000610000006e0000006700 *0000650000002e000000200000005500000073000000650000006400000020000000660000006f *00000072000000200000007400000079000000700000006500000073000000200000006c000000 *690000006b0000006500000020000000490000006e0000007400000020000000610000006e0000 *006400000020000000430000006800000061000000720000002e0000000a00000000b400000000 *00b50000000000b60000000000b70000000000b800000000008c0000000000b90000000000ba00 *000000008d010302280000004c0000006900000066000000740000007300000020000000740000 *0068000000650000002000000070000000720000006f0000007600000069000000640000006500 *0000640000002000000076000000610000006c000000750000006500000020000000690000006e *000000740000006f00000020000000430000006f0000006e000000740000006100000069000000 *6e00000065000000640000000a00000000bb00000000008e010301024f00000043000000720000 *0065000000610000007400000065000000730000002000000061000000200000004d0000006f00 *000064000000650000002000000074000000680000006100000074000000200000006900000073 *0000002000000061000000200000006e0000006500000077000000200000007600000065000000 *7200000073000000690000006f0000006e000000200000006f0000006600000020000000740000 *006800000065000000200000007400000079000000700000006500000020000000630000006100 *000072000000720000006900000065000000640000002000000062000000790000002000000074 *00000068000000650000002000000070000000720000006f000000760000006900000064000000 *65000000640000002000000070000000720000006f00000078000000790000000a010254000000 *20000000610000006e000000640000002000000077000000690000007400000068000000200000 *007400000068000000650000002000000070000000720000006f00000076000000690000006400 *000065000000640000002000000076000000650000007200000073000000690000006f0000006e *000000200000006e000000750000006d0000006200000065000000720000002e00000020000000 *200000004e0000006f000000740000006500000020000000740000006800000061000000740000 *002000000073000000690000006e00000063000000650000002000000056000000650000007200 *000073000000690000006f0000006e000000490000006400000020000000690000007300000020 *000000610000006e00000020000000690000006e0000007300000074000000610000006e000000 *6300000065000000200000006f000000660000000a010241000000200000004e00000075000000 *6d000000200000007400000068000000610000007400000020000000790000006f000000750000 *00200000006d000000610000007900000020000000750000007300000065000000200000006900 *00006e00000074000000200000006c00000069000000740000006500000072000000610000006c *00000073000000200000007700000068000000650000006e000000200000006300000061000000 *6c0000006c000000690000006e0000006700000020000000650000007800000074000000650000 *006e00000073000000690000006f0000006e0000002c00000020000000650000002e0000006700 *00002e000000200000000a01020100000020010702250000006500000078000000740000006500 *00006e00000073000000690000006f0000006e0000002000000031000000200000002800000050 *000000720000006f0000007800000079000000200000003a0000003a0000002000000050000000 *720000006f0000007800000079000000200000004f0000006c0000006400000053000000740000 *006100000074000000650000002902010000000a000000008f0000000000900000000000910103 *01023c0000004500000071000000750000006900000076000000610000006c000000650000006e *00000074000000200000006f000000660000002000000044000000610000007400000061000000 *2e00000042000000690000006e0000006100000072000000790000002e00000070000000750000 *007400000020000000660000006f0000007200000020000000690000006e000000730000007400 *0000610000006e000000630000006500000073000000200000006f000000660000002000000053 *000000650000007200000069000000610000006c000000690000007a000000650000002e000000 *20000000200000000a02290000002000000054000000610000006b000000650000007300000020 *000000690000006e000000740000006f000000200000006100000063000000630000006f000000 *750000006e000000740000002000000076000000650000007200000073000000690000006f0000 *006e000000690000006e00000067000000200000006f0000006600000020000000740000007900 *00007000000065000000730000002e0000000a0000000092010301023900000045000000710000 *00750000006900000076000000610000006c000000650000006e00000074000000200000006f00 *00006600000020000000440000006100000074000000610000002e00000042000000690000006e *0000006100000072000000790000002e0000006700000065000000740000002000000066000000 *6f0000007200000020000000690000006e0000007300000074000000610000006e000000630000 *006500000073000000200000006f00000066000000200000005300000065000000720000006900 *0000610000006c000000690000007a000000650000000a02290000002000000054000000610000 *006b000000650000007300000020000000690000006e000000740000006f000000200000006100 *000063000000630000006f000000750000006e0000007400000020000000760000006500000072 *00000073000000690000006f0000006e000000690000006e00000067000000200000006f000000 *660000002000000074000000790000007000000065000000730000002e0000000a00000000bc00 *00000000bd0103022b000000430000006f0000006d000000700000006100000072000000650000 *007300000020000000740000006800000065000000200000006e000000750000006d0000006500 *00007200000069000000630000002000000076000000610000006c000000750000006500000020 *0000006f0000006600000020000000740000006800000065000000200000007600000065000000 *7200000073000000690000006f0000006e000000730000000a0000000093010301021000000050 *000000750000007200000065000000200000007600000065000000720000007300000069000000 *6f0000006e000000200000006f000000660000002001040100000091021e0000002e0000002000 *00002000000053000000650000007200000069000000610000006c000000690000007a00000065 *0000007300000020000000740000006f0000002000000061000000200000004200000079000000 *7400000065000000530000007400000072000000690000006e000000670000000a000000009401 *030102100000005000000075000000720000006500000020000000760000006500000072000000 *73000000690000006f0000006e000000200000006f00000066000000200104010000009201022e *0000002e0000002000000020000000500000006100000072000000730000006500000073000000 *200000006100000020000000420000007900000074000000650000005300000074000000720000 *00690000006e0000006700000020000000690000006e000000740000006f000000200000007400 *000068000000650000002000000065000000780000007000000065000000630000007400000065 *0000006400000020000000740000007900000070000000650000000a0212000000200000006100 *00006e0000006400000020000000610000002000000072000000650000006d0000006100000069 *0000006e0000006400000065000000720000002e0000000a000000009501030210000000560000 *00650000007200000073000000690000006f0000006e000000200000006c0000006f0000006f00 *00006b0000007500000070000000730000000a0000000096010301040100000094021900000020 *0000007300000070000000650000006300000069000000610000006c000000690000007a000000 *650000006400000020000000740000006f000000200000004f000000620000006a000000650000 *00630000007400000073000000200000000a000000009701030102370000004100000074000000 *74000000650000006d00000070000000740000007300000020000000740000006f000000200000 *00630000006f0000006e0000007600000065000000720000007400000020000000610000006e00 *0000200000004f000000620000006a000000650000006300000074000000200000006200000061 *000000630000006b00000020000000690000006e000000740000006f0000002000000069000000 *740000007300000020000000620000006100000073000000650000002000000074000000790000 *0070000000650000002e0000000a01021900000020000000490000006600000020000000740000 *00680000006500000020000000630000006f0000006e0000007600000065000000720000007300 *0000690000006f0000006e000000200000006600000061000000690000006c0000007300000020 *010401000000be02110000002000000077000000690000006c0000006c00000020000000620000 *00650000002000000063000000610000006c0000006c00000065000000640000002e0000000a00 *000000980103024400000053000000650000007200000069000000610000006c00000069000000 *7a0000006500000073000000200000006400000061000000740000006100000020000000610000 *006e000000640000002000000073000000740000006f0000007200000065000000730000002000 *0000690000007400000020000000610000006c0000006f0000006e000000670000002000000077 *000000690000007400000068000000200000006900000074000000730000002000000074000000 *790000007000000065000000200000006e000000610000006d0000006500000020000000690000 *006e00000020000000610000006e000000200000004f000000620000006a000000650000006300 *0000740000000a002000000011000000120000007b0000007c0000007d0000007e0000007f0000 *008000000081000000820000008300000084000000850000008600000087000000880000008900 *00008a0000008b0000008c0000008d0000008e0000008f00000090000000910000009200000093 *000000940000009500000096000000970000009819000000840000008500000086000000870000 *00880000001100000012000000890000008b0000008a0000008c0000008d0000008e0000009200 *0000910000008f0000009000000093000000940000009500000082000000830000009800000096 *000000970017000000820100000083000000830000000084020000008500000086000000850000 *00008600000000870100000088000000880000000089020000008b0000008a0000008a00000000 *8b000000008c000000008d000000008e000000008f000000009000000000910000000092000000 *00930000000094000000009500000000960000000097000000009800000000000000000b000000 *0006000000bf0000000000c0000000000099010301023700000044000000650000007200000069 *00000076000000650000007300000020000000610000006e00000020000000690000006e000000 *7300000074000000610000006e0000006300000065000000200000006f00000066000000200000 *0053000000650000007200000069000000610000006c000000690000007a000000650000002000 *0000660000006f0000007200000020000000740000006800000065000000200000007000000072 *0000006f0000007600000069000000640000006500000064000000200000007400000079000000 *70000000650000000a01023f0000002000000053000000680000006f000000750000006c000000 *6400000020000000770000006f000000720000006b00000020000000690000006e000000200000 *006d0000006f000000730000007400000020000000630000006100000073000000650000007300 *000020000000690000006600000020000000740000006800000065000000200000007400000079 *000000700000006500000020000000690000007300000020000000610000006c00000072000000 *6500000061000000640000007900000020000000610000006e0000006400000020000000690000 *006e0000007300000074000000610000006e00000063000000650000000a01020f000000200000 *006f000000660000002000000056000000650000007200000073000000690000006f0000006e00 *00002e00000020000000200000000a0102050000002000000045000000780000003a0000002001 *070102120000002400000028000000640000006500000072000000690000007600000065000000 *53000000650000007200000069000000610000006c000000690000007a00000065000000200102 *0100000027010201000000270204000000460000006f0000006f0000002902010000000a000000 *009a01030226000000440000006500000072000000690000007600000065000000730000002000 *000053000000650000007200000069000000610000006c000000690000007a0000006500000020 *000000660000006f000000720000002000000061000000200000006c0000006900000073000000 *74000000200000006f000000660000002000000074000000790000007000000065000000730000 *000a00000000c10000000000c2000002000000990000009a02000000990000009a000200000099 *000000009a0000000000000000100000000000ba000000c3000000c4000000c5000000c6000000 *c7000000c8000000c9000000ca000000cb000000cc000000cd000000ce000000cf000000d00000 *00d1000000d2000000d3000000d4000000d5000000d6000000d7000000d8000000d9000000da00 *0000db000000dc000000dd000000de000000df000000e0000000e1000000e2000000e3000000e4 *000000e5000000e6000000e7000000e8000000e9000000ea000000000000000100000002000000 *030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000 *000d0000000e0000000f0000001000000011000000120000001300000014000000150000001600 *00001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f00000020 *000000210000002200000023000000240000002500000026000000270000002800000029000000 *2a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000330000 *003400000035000000360000003700000038000000390000003a0000003b0000003c0000003d00 *00003e0000003f0000004000000041000000420000004300000044000000450000004600000047 *00000048000000490000004a0000004b0000004c0000004d0000004e0000004f00000050000000 *5100000052000000530000005400000055000000560000005700000058000000590000005a0000 *005b00000065000000660000006700000068000000690000006a0000006b0000006c0000006d00 *00006e0000006f0000007000000071000000720000007300000074000000750000007600000077 *00000078000000790000007a0000007b0000007c0000007d0000007e0000007f00000080000000 *8100000082000000830000008400000085000000860000008700000088000000890000008a0000 *008b0000008c0000008d0000008e0000008f000000900000009100000092000000930000009400 *000095000000960000009700000098000000990000009a00000000000000000000eb0000000000 *000001000000001100000000000000010000000012000000000000000100000000130000000000 *000001000000001400000000000000010000000015000000000000000100000000160000000000 *000001000000001700000000000000020300000018000000000000000201000000180000000000 *00000200000000190000000000000002000000001a0000000000000002030000001b0000000000 *000002000000001c0000000000000002000000001d0000000000000002000000001e0000000000 *000002000000001f00000000000000020000000020000000000000000303000000210000000000 *000003000000002200000000000000040300000023000000000000000401000000230000000000 *000004000000002400000000000000040300000025000000000000000400000000260000000000 *000004000000002700000000000000040000000028000000000000000500000000290000000000 *000005000000002a0000000000000005000000002b000000000000000d030000002c0000000000 *00000d010000002c000000000000000d000000002d000000000000000d030000002e0000000000 *00000d030000002f000000000000000d010000002f000000000000000d00000000300000000000 *00000d0000000031000000000000000d0000000032000000000000000d03000000330000000000 *00000d0000000034000000000000000d0000000035000000000000000d00000000360000000000 *00000d0000000037000000000000000d0000000038000000000000000d00000000390000000000 *00000d000000003a000000000000000d030000003b000000000000000d010000003c0000000000 *00000d010000003d000000000000000d030000003e000000000000000d010000003f0000000000 *00000d010000003e000000000000000d0300000040000000000000000d01000000410000000000 *00000d0100000042000000000000000d0100000043000000000000000d00000000440000000000 *00000d0000000045000000000000000d0000000046000000000000000d00000000470000000000 *00000d0000000048000000000000000d0000000049000000000000000d000000004a0000000000 *00000d000000004b000000000000000d000000004c000000000000000d000000004d0000000000 *00000d000000004e000000000000000d000000004f000000000000000d00000000500000000000 *00000d0000000051000000000000000d0000000052000000000000000d00000000530000000000 *00000d0000000054000000000000000d0000000055000000000000000d00000000560000000000 *00000d0000000057000000000000000d0000000058000000000000000d00000000590000000000 *00000d000000005a000000000000000d000000005b000000000000000d000000005c0000000000 *00000d000000005d000000000000000d000000005e000000000000000d000000005f0000000000 *00000d0000000060000000000000000d0000000061000000000000000d00000000620000000000 *00000d0000000063000000000000000d0000000064000000000000000d00000000650000000000 *00000d0000000066000000000000000d0000000067000000000000000700000000680000000000 *00000700000000690000000000000007000000006a0000000000000007000000006b0000000000 *000007000000006c0000000000000007000000006d0000000000000007000000006e0000000000 *000007000000006f00000000000000070000000070000000000000000e03000000710000000000 *00000e0000000072000000000000000e0300000073000000000000000e00000000740000000000 *00000e0300000075000000000000000e0100000075000000000000000e03000000760000000000 *00000e0100000076000000000000000e0000000077000000000000000e00000000780000000000 *00000e0000000079000000000000000e000000007a0000000000000008030000007b0000000000 *000008000000007c0000000000000008000000007d0000000000000008030000007e0000000000 *000008000000007f00000000000000080000000080000000000000000800000000810000000000 *000008000000008200000000000000080000000083000000000000000800000000840000000000 *000009030000008500000000000000090100000085000000000000000900000000860000000000 *000009000000008700000000000000090000000088000000000000000900000000890000000000 *000009000000008a000000000000000a030000008b000000000000000a000000008c0000000000 *00000a030000008d000000000000000a000000008e000000000000000a000000008f0000000000 *00000a0300000090000000000000000a0000000091000000000000000a03000000920000000000 *00000a0100000093000000000000000a0100000094000000000000000a03000000950000000000 *00000a0000000096000000000000000a0000000097000000000000000a00000000980000000000 *00000a0000000099000000000000000a000000009a000000000000000a000000009b0000000000 *00000a000000009c000000000000000a000000009d000000000000000a000000009e0000000000 *00000a000000009f000000000000000a00000000a0000000000000000a00000000a10000000000 *00000b00000000a2000000000000000b00000000a3000000a4000000a500000000a60000000000 *00000500000000a7000000000000000500000000a8000000000000000500000000a90000000000 *00000500000000aa000000000000000500000000ab000000000000000800000000ac0000000000 *00000800000000ad000000000000000800000000ae000000000000000800000000af0000000000 *00000800000000b0000000000000000803000000b1000000000000000801000000b10000000000 *00000803000000b2000000000000000801000000b2000000000000000803000000b30000000000 *00000801000000b3000000000000000800000000b4000000000000000800000000b50000000000 *00000800000000b6000000000000000800000000b7000000000000000800000000b80000000000 *00000800000000b9000000000000000a010000008b000000000000000a00000000ba0000000000 *00000a03000000bb000000000000000a01000000bb000000000000000a00000000bc0000000000 *00000a03000000bd000000000000000a01000000bd000000000000000a01000000950000000000 *00000a00000000be000000000000000a00000000bf000000000000000a00000000c00000000000 *00000a00000000c1000000a4000000c200000000c3000000000000000b03000000c40000000000 *00000b01000000c5000000000000000b00000000c6000000000000000b00000000c7000000a400 *0000c803000000c9000000a4000000c803000000ca000000a4000000c803000000cb000000a400 *0000c803000000cc000000a4000000c803000000cd000000a4000000c803000000ce000000a400 *0000c803000000cf000000a4000000c803000000d0000000a4000000c800000000d1000000a400 *0000c800000000d2000000a4000000c800000000d3000000a4000000c800000000d4000000a400 *0000c800000000d5000000a4000000c800000000d6000000a4000000c800000000d7000000a400 *0000c800000000d8000000a4000000c800000000d9000000a4000000c800000000da000000a400 *0000c800000000db000000a4000000c800000000dc000000a4000000c800000000dd000000a400 *0000c800000000de000000a4000000c800000000df000000a4000000c800000000e0000000a400 *0000c800000000e1000000a4000000c800000000e2000000a4000000c800000000e3000000a400 *0000c800000000e4000000a4000000c800000000e5000000a4000000c800000000e6000000a400 *0000c800000000e7000000a4000000c800000000e8000000a4000000c800000000e9000000a400 *0000c800000000ea000000a4000000c803000000eb000000a4000000c803000000ec000000a400 *0000c800000000ed000000a4000000c800000000ee000000a4000000c800000000ef000000a400 *0000c800000000f000000000000000f1000000000000001468617070737461636b2d646174612d *302e352e30000000000000001348617070737461636b2e446174612e474f707300000000000000 *1848617070737461636b2e446174612e4e6f726d616c697a650000000000000016486170707374 *61636b2e446174612e4d696772617465000000000000001648617070737461636b2e446174612e *44656661756c74000000000000001848617070737461636b2e446174612e446572697665416c6c *000000000000001248617070737461636b2e446174612e586d6c00000000000000184861707073 *7461636b2e446174612e586d6c2e4861586d6c000000000000001448617070737461636b2e4461 *74612e5061697273000000000000001448617070737461636b2e446174612e50726f7879000000 *000000001848617070737461636b2e446174612e53657269616c697a65000000000000001a4861 *7070737461636b2e446174612e53657269616c697a655448000000000000001e48617070737461 *636b2e446174612e44656661756c742e47656e6572696300000000000000174861707073746163 *6b2e446174612e586d6c2e42617365000000000000001d48617070737461636b2e446174612e58 *6d6c2e5072696e745061727365000000000000001c48617070737461636b2e446174612e586d6c *2e496e7374616e636573000000000000000e48617070737461636b2e4461746100000000000000 *04675365740000000000000008675265706c61636500000000000000056746696e640000000000 *0000066746696e64270000000000000007674d6f6469667900000000000000046741736b000000 *000000000467476574000000000000000a4e6f726d616c697a6544000000000000000a6e6f726d *616c697a654400000000000000156e6f726d616c697a655265637572736976656c794400000000 *000000094e6f726d616c697a6500000000000000096e6f726d616c697a6500000000000000146e *6f726d616c697a655265637572736976656c79000000000000001064656661756c744e6f726d61 *6c697a65000000000000001b64656661756c744e6f726d616c697a655265637572736976656c79 *000000000000000e6e6f726d616c697a6550726f787900000000000000074d6967726174650000 *0000000000076d696772617465000000000000000844656661756c7444000000000000000d6465 *6661756c7456616c756544000000000000000744656661756c74000000000000000c6465666175 *6c7456616c7565000000000000001364656661756c7444656661756c7456616c75650000000000 *00000c64656661756c7450726f7879000000000000000d6465726976654e657744617461000000 *00000000166465726976654e6577446174614e6f44656661756c74000000000000000964657269 *7665416c6c00000000000000095265616453746174650000000000000004786d6c730000000000 *000005526561644d0000000000000004586d6c440000000000000006746f586d6c440000000000 *000009726561644d586d6c440000000000000016726561644d586d6c4e6f526f6f744465666175 *6c74440000000000000003586d6c0000000000000005746f586d6c000000000000000772656164 *586d6c000000000000000872656164586d6c27000000000000000c6e6f726d616c697a65586d6c *000000000000000776657273696f6e000000000000000c6f7468657256657273696f6e00000000 *00000003747970000000000000000852696769646974790000000000000008466c657869626c65 *0000000000000005526967696400000000000000054f7468657200000000000000074e6f4f7468 *65720000000000000007456c656d656e7400000000000000044174747200000000000000054344 *6174610000000000000004456c656d000000000000000c636f6e7374725b613734795d00000000 *0000000c636f6e7374725b6137347a5d000000000000000c636f6e7374725b613734415d000000 *000000000e64617461547970655b613734785d0000000000000005696e73456c00000000000000 *0766726f6d586d6c000000000000000b746f5075626c6963586d6c0000000000000008786d6c50 *726f787900000000000000056669727374000000000000000c64656661756c74546f586d6c0000 *0000000000107472616e73706172656e74546f586d6c00000000000000127472616e7370617265 *6e7452656164586d6c000000000000000e7472616e73706172656e74586d6c000000000000000e *64656661756c7452656164586d6c000000000000000f64656661756c7452656164586d6c270000 *00000000000b72656164586d6c5769746800000000000000147265616456657273696f6e656445 *6c656d656e74000000000000000969735468654174747200000000000000076765744174747200 *0000000000000b76657273696f6e41747472000000000000000874797065417474720000000000 *00000b72656164456c656d656e74000000000000001361436f6e73747246726f6d456c656d656e *7473000000000000001f636f6e73747246726f6d456c656d656e74734e6f526f6f744465666175 *6c740000000000000012636f6e73747246726f6d456c656d656e74730000000000000007676574 *586d6c730000000000000007707574586d6c730000000000000008726561644d586d6c00000000 *00000015726561644d586d6c4e6f526f6f7444656661756c740000000000000007786d6c417474 *72000000000000000d786d6c53686f77434461746173000000000000000c786d6c53686f774344 *617461000000000000000d786d6c43446174614c69737473000000000000000c786d6c43446174 *614c69737400000000000000086e6f436f6d6d6173000000000000000c747970654e6f7456616c *756500000000000000066973417474720000000000000008746f4861586d6c7300000000000000 *09746f4861586d6c456c0000000000000007746f4861586d6c000000000000000b746f41747472 *6962757465000000000000000a66726f6d4861586d6c73000000000000000966726f6d4861586d *6c000000000000000e66726f6d41747472696275746573000000000000000d66726f6d41747472 *6962757465000000000000000a46726f6d537472696e67000000000000000a66726f6d53747269 *6e670000000000000008546f537472696e670000000000000008746f537472696e670000000000 *0000014b000000000000000157000000000000000c636f6e7374725b616644645d000000000000 *000e64617461547970655b616644635d000000000000000c636f6e7374725b6166446e5d000000 *000000000e64617461547970655b6166446d5d0000000000000007417350616972730000000000 *000007746f5061697273000000000000000966726f6d5061697273000000000000000550616972 *73000000000000000a7061697273546f586d6c000000000000000a786d6c546f50616972730000 *00000000000f7061697273546f48544d4c466f726d000000000000000d786d6c546f48544d4c46 *6f726d0000000000000008746f506169727358000000000000000a746f48544d4c466f726d0000 *00000000000550726f7879000000000000000c636f6e7374725b61706f775d000000000000000e *64617461547970655b61706f765d000000000000000570726f78790000000000000007756e5072 *6f7879000000000000000b617350726f78795479706500000000000000064f626a656374000000 *000000000a6f626a65637454797065000000000000000953657269616c697a6500000000000000 *07676574436f70790000000000000007707574436f7079000000000000000756657273696f6e00 *000000000000046d6f646500000000000000044d6f6465000000000000000956657273696f6e65 *6400000000000000095072696d69746976650000000000000009436f6e7461696e656400000000 *00000007636f6e7461696e0000000000000009657874656e73696f6e000000000000000a676574 *53616665476574000000000000000a676574536166655075740000000000000007736166655075 *74000000000000000773616665476574000000000000000973657269616c697a65000000000000 *000b646573657269616c697a65000000000000000f636f6c6c65637456657273696f6e73000000 *0000000011646573657269616c697a654f626a656374000000000000000b70617273654f626a65 *637400000000000000086d6b4f626a656374000000000000000f64657269766553657269616c69 *7a65000000000000001264657269766553657269616c697a65466f720000000000000004626173 *6500000000000000084748432e426173650000000000000002696400000000000000116d6b4465 *6661756c74496e7374616e6365000000000000000f7479566172426e6472546f4e616d65000000 *000000001161646444657269766564436c6173736573000000000000000d646572697665446566 *61756c74000000000000000f6973446174614f724e6577747970650000000000000005736c6173 *68000000000000000b666f726d496e746f456c73000000000000000c786d6c496e746f50616972 *73000000000000000c7375626d6974427574746f6e000000000000000870546f496e7075740000 *00000000000450617373000000000000000455736572000000000000000855736572496e666f00 *0000000000000c636f6e7374725b616d77775d000000000000000e64617461547970655b616d77 *765d000000000000000c636f6e7374725b616d77485d000000000000000e64617461547970655b *616d77475d000000000000000c636f6e7374725b616d77525d000000000000000e646174615479 *70655b616d77515d000000000000000a6f626a6563744461746100000000000000095665727369 *6f6e49640000000000000009756e56657273696f6e000000000000000850726576696f75730000 *00000000000c756e73616665556e5061636b000000000000000a6d6b50726576696f7573000000 *00000000107361666547657456657273696f6e6564000000000000000f636f6d70617265566572 *73696f6e7300000000000000074748432e45727200000000000000056572726f72000000000000 *0005436c617373000000000000000654616767656400000000000000066d6b5479706500000000 *000000097061727365496e666f000000000000000d446174612e5479706561626c650000000000 *0000085479706561626c6500000000000000095479706561626c65310000000000000009547970 *6561626c653200000000000000095479706561626c653300000000000000095479706561626c65 *3400000000000000095479706561626c653500000000000000095479706561626c653600000000 *000000095479706561626c65370000000000000006676361737432000000000000000667636173 *743100000000000000056763617374000000000000000e747970654f663644656661756c740000 *00000000000e747970654f663544656661756c74000000000000000e747970654f663444656661 *756c74000000000000000e747970654f663344656661756c74000000000000000e747970654f66 *3244656661756c74000000000000000e747970654f663144656661756c74000000000000000d74 *7970654f6644656661756c74000000000000000c73686f77735479706552657000000000000000 *0b7479436f6e537472696e67000000000000000b7479706552657041726773000000000000000c *747970655265705479436f6e00000000000000076d6b4170705479000000000000000b66756e52 *6573756c745479000000000000000d73706c69745479436f6e41707000000000000000076d6b46 *756e5479000000000000000a747970655265704b65790000000000000007747970654f66310000 *000000000007747970654f66320000000000000007747970654f66330000000000000007747970 *654f66340000000000000007747970654f66350000000000000007747970654f66360000000000 *000007747970654f663700000000000000075479706552657000000000000000055479436f6e00 *00000000000006747970654f6600000000000000076d6b5479436f6e000000000000000a6d6b54 *79436f6e417070000000000000000463617374 addfile ./docs/0.5.0/happstack-data/haskell_icon.gif binary ./docs/0.5.0/happstack-data/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/happstack-data/index-frames.html hunk ./docs/0.5.0/happstack-data/index-frames.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries

    Happstack.Data
    Happstack.Data.Default
    Happstack.Data.Default.Generic
    Happstack.Data.DeriveAll
    Happstack.Data.GOps
    Happstack.Data.Migrate
    Happstack.Data.Normalize
    Happstack.Data.Pairs
    Happstack.Data.Proxy
    Happstack.Data.Serialize
    Happstack.Data.SerializeTH
    Happstack.Data.Xml
    Happstack.Data.Xml.HaXml

    addfile ./docs/0.5.0/happstack-data/index.html hunk ./docs/0.5.0/happstack-data/index.html 1 + + +happstack-data-0.5.0: Happstack data manipulation libraries
     happstack-data-0.5.0: Happstack data manipulation librariesContentsIndex
    happstack-data-0.5.0: Happstack data manipulation libraries

    This package provides libraries for: +

    • Deriving instances for your datatypes. +
    • Producing default values of Haskell datatypes. +
    • Normalizing values of Haskell datatypes. +
    • Marshalling Haskell values to and from XML. +
    • Marshalling Haskell values to and from HTML forms. +
    Modules
    show/hideHappstack
    show/hideHappstack.Data
    show/hideHappstack.Data.Default
    Happstack.Data.Default.Generic
    Happstack.Data.DeriveAll
    Happstack.Data.GOps
    Happstack.Data.Migrate
    Happstack.Data.Normalize
    Happstack.Data.Pairs
    Happstack.Data.Proxy
    Happstack.Data.Serialize
    Happstack.Data.SerializeTH
    show/hideHappstack.Data.Xml
    Happstack.Data.Xml.HaXml
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Default-Generic.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Default-Generic.html 1 + + +Happstack.Data.Default.Generic
    Happstack.Data.Default.Generic
    addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Default.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Default.html 1 + + +Happstack.Data.Default
    Happstack.Data.Default

    The interface +

    class Default a

    Writing your own instances +

    Advanced usage +

    data DefaultD a
    addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-DeriveAll.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-DeriveAll.html 1 + + +Happstack.Data.DeriveAll addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-GOps.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-GOps.html 1 + + +Happstack.Data.GOps addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Migrate.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Migrate.html 1 + + +Happstack.Data.Migrate
    Happstack.Data.Migrate
    class Migrate a b
    addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Normalize.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Normalize.html 1 + + +Happstack.Data.Normalize
    Happstack.Data.Normalize

    The interface +

    class Normalize a

    Writing your own instances +

    Advanced usage +

    data NormalizeD a
    addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Pairs.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Pairs.html 1 + + +Happstack.Data.Pairs addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Proxy.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Proxy.html 1 + + +Happstack.Data.Proxy
    Happstack.Data.Proxy
    addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Serialize.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Serialize.html 1 + + +Happstack.Data.Serialize addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-SerializeTH.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-SerializeTH.html 1 + + +Happstack.Data.SerializeTH
    Happstack.Data.SerializeTH
    addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Xml-HaXml.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Xml-HaXml.html 1 + + +Happstack.Data.Xml.HaXml addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data-Xml.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data-Xml.html 1 + + +Happstack.Data.Xml addfile ./docs/0.5.0/happstack-data/mini_Happstack-Data.html hunk ./docs/0.5.0/happstack-data/mini_Happstack-Data.html 1 + + +Happstack.Data
    Happstack.Data
    addfile ./docs/0.5.0/happstack-data/minus.gif binary ./docs/0.5.0/happstack-data/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/happstack-data/plus.gif binary ./docs/0.5.0/happstack-data/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b adddir ./docs/0.5.0/happstack-data/src addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Default-Generic.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Default-Generic.html 1 + + + + +src/Happstack/Data/Default/Generic.hs + + + +
    
    +{-# LANGUAGE OverlappingInstances, UndecidableInstances #-}
    +{-# OPTIONS -fno-warn-orphans #-}
    +
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Data.Default.Generic
    +-- Copyright   :  (c) 2009 Happstack.com; (c) 2007 HAppS LLC
    +-- License     :  BSD3
    +--
    +-- Maintainer  :  happs@googlegroups.com
    +-- Stability   :  experimental
    +-- Portability :  Not portable
    +--
    +-- Provides a 'Default' instance for all types. 'defaultDefaultValue' is
    +-- used for 'defaultValue'.
    +--
    +-----------------------------------------------------------------------------
    +
    +module Happstack.Data.Default.Generic () where
    +
    +import Happstack.Data.Default
    +import Data.Generics.SYB.WithClass.Basics
    +import Data.Generics.SYB.WithClass.Instances ()
    +
    +-- This is an orphaned instanced.  This means the existance of this file causes
    +-- ghc to visit its .hi every time any files that depend on it are compiled,
    +-- just to see if this instance is need
    +instance Data DefaultD a => Default a
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Default.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Default.html 1 + + + + +src/Happstack/Data/Default.hs + + + +
    {-# LANGUAGE OverlappingInstances, UndecidableInstances,
    +             FlexibleContexts #-}
    +
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Data.Default
    +-- Copyright   :  (c) 2009 Happstack.com; (c) 2007 HAppS LLC
    +-- License     :  BSD3
    +--
    +-- Maintainer  :  happs@googlegroups.com
    +-- Stability   :  experimental
    +-- Portability :  Not portable
    +--
    +-- Provides default values for Haskell datatypes.
    +--
    +-----------------------------------------------------------------------------
    +
    +module Happstack.Data.Default
    +    (
    +        -- * The interface
    +        Default(defaultValue),
    +
    +        -- * Writing your own instances
    +        defaultDefaultValue,
    +
    +        -- * Advanced usage
    +        DefaultD(..),
    +        defaultProxy,
    +    )
    +    where
    +
    +import qualified Data.ByteString.Char8 as BSC
    +import Data.Generics.SYB.WithClass.Basics
    +import Data.Generics.SYB.WithClass.Instances ()
    +import Data.Generics.SYB.WithClass.Instances.Text ()
    +import Data.Int
    +import Data.Word
    +import qualified Data.Map as M
    +import qualified Data.Set as S
    +import Foreign.ForeignPtr
    +import Data.Text      as T
    +import Data.Text.Lazy as L
    +
    +-- | The 'Default' class provides a 'defaultValue' value, which
    +-- is the default value for that type.
    +--
    +-- There is no instance for arbitrary types by default, but if you
    +-- declare an instance without providing the value then one will be
    +-- built using the first constructor. 'defaultValue' is used to provide
    +-- values for any arguments of the constructor.
    +--
    +-- If you want an instance for all types then import
    +-- "Happstack.Data.Default.Generic".
    +class (Data DefaultD a) => Default a where
    +    defaultValue :: a
    +    defaultValue = defaultDefaultValue
    +
    +-- | This is the 'defaultValue' that is used in an instance if you don't
    +-- specify one. It may be a useful building block when writing your own
    +-- instances.
    +defaultDefaultValue :: (Data DefaultD a,Default a) => a
    +defaultDefaultValue = res
    +    where res = case datarep $ dataTypeOf defaultProxy res of
    +                    AlgRep (c:_) ->
    +                        fromConstrB defaultProxy (defaultValueD dict) c
    +                    r ->
    +                        error ("defaultDefaultValue: Bad DataRep: " ++ show r)
    +
    +-- | When writing your own generic functions for 'Default' you may
    +-- need to access the class method through this datatype rather than
    +-- directly.
    +data DefaultD a = DefaultD { defaultValueD :: a }
    +
    +-- | When writing your own generic functions for 'Default' you may
    +-- need this, the proxy value.
    +defaultProxy :: Proxy DefaultD
    +defaultProxy = error "defaultProxy"
    +
    +instance Default t => Sat (DefaultD t) where
    +    dict = DefaultD { defaultValueD = defaultValue }
    +
    +instance Data DefaultD a => Default [a] where
    +    defaultValue = []
    +
    +instance Default Int     where defaultValue = 0
    +instance Default Int8    where defaultValue = 0
    +instance Default Int16   where defaultValue = 0
    +instance Default Int32   where defaultValue = 0
    +instance Default Int64   where defaultValue = 0
    +instance Default Word    where defaultValue = 0
    +instance Default Word8   where defaultValue = 0
    +instance Default Word16  where defaultValue = 0
    +instance Default Word32  where defaultValue = 0
    +instance Default Word64  where defaultValue = 0
    +instance Default Integer where defaultValue = 0
    +instance Default Float   where defaultValue = 0
    +instance Default Double  where defaultValue = 0
    +
    +instance (Default a, Default b) => Default (Either a b) where
    +    defaultValue = Left defaultValue
    +
    +instance Default () where
    +    defaultValue = ()
    +instance (Default a, Default b) => Default (a,b) where
    +    defaultValue = (defaultValue, defaultValue)
    +instance (Default a, Default b, Default c) => Default (a,b,c) where
    +    defaultValue = (defaultValue, defaultValue, defaultValue)
    +instance (Default a, Default b, Default c, Default d) => Default (a,b,c,d) where
    +    defaultValue = (defaultValue, defaultValue, defaultValue, defaultValue)
    +
    +
    +instance Default Char where
    +    defaultValue = 'A'
    +
    +instance Default a => Default (Maybe a) where
    +    defaultValue = Nothing
    +
    +instance Default BSC.ByteString where
    +    defaultValue = BSC.pack ""
    +    
    +instance Default T.Text where
    +    defaultValue = T.empty
    +    
    +instance Default L.Text where
    +    defaultValue = L.empty    
    +
    +-- We don't really want this instance, but we need it for the ByteString
    +-- instance
    +instance Default a => Default (ForeignPtr a) where
    +    defaultValue = error "defaultValue: ForeignPtr"
    +
    +instance (Data DefaultD a, Data DefaultD b, Ord a) => Default (M.Map a b) 
    +instance (Data DefaultD a, Ord a) => Default (S.Set a)
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-DeriveAll.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-DeriveAll.html 1 + + + + +src/Happstack/Data/DeriveAll.hs + + + +
    
    +{-# LANGUAGE TemplateHaskell, CPP #-}
    +{-# OPTIONS_GHC -Wall -Werror #-}
    +
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Data.DeriveAll
    +-- Copyright   :  (c) 2009 Happstack.com; (c) 2007 HAppS LLC
    +-- License     :  BSD3
    +--
    +-- Maintainer  :  happs@googlegroups.com
    +-- Stability   :  experimental
    +-- Portability :  Not portable
    +--
    +-- Concisely specify which classes to derive for your datatypes.
    +-- As well as the standard derivable classes, it can also
    +-- derive syb-with-class's 'New.Data' class and Happstack.Data.Default's
    +-- 'Default' class.
    +--
    +-----------------------------------------------------------------------------
    +
    +module Happstack.Data.DeriveAll (deriveAll, deriveNewData, deriveNewDataNoDefault)
    +    where
    +
    +import qualified Data.Generics as Old
    +import Data.Generics.SYB.WithClass.Derive
    +import Data.List
    +import Happstack.Data.Default
    +import Language.Haskell.TH
    +
    +{- | Derives instances for syb-with-class's Data class and 
    +   Happstack.Data.Default's Default class.
    +   The list of names should be of the form [''Foo,''Bar,..]
    +-}
    +deriveNewData :: [Name] -> Q [Dec]
    +deriveNewData names
    + = do nd <- deriveData names
    +      defaults <- mapM mkDefaultInstance names
    +      return (nd ++ concat defaults)
    +
    +{- | Derives instances for syb-with-class's Data class only.
    +   The list of names should be of the form [''Foo,''Bar,..]
    +-}
    +deriveNewDataNoDefault :: [Name] -> Q [Dec]
    +deriveNewDataNoDefault = deriveData
    +
    +mkDefaultInstance :: Name -> Q [Dec]
    +mkDefaultInstance name
    + = do info <- reify name
    +      case info of
    +          TyConI (NewtypeD _ nm tvs _ _) -> return $ deriveDefault True (conv tvs) nm
    +          TyConI (DataD    _ nm tvs _ _) -> return $ deriveDefault True (conv tvs) nm
    +          _ -> fail ("mkDefaultInstance: Bad info: " ++ pprint info)
    + where conv = map tyVarBndrToName
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +tyVarBndrToName :: TyVarBndr -> Name
    +tyVarBndrToName (PlainTV nm) = nm
    +tyVarBndrToName (KindedTV nm _) = nm
    +#else
    +tyVarBndrToName :: Name -> Name
    +tyVarBndrToName = id
    +#endif
    +
    +-- | The 'deriveAll' function takes a list of classes to derive and
    +-- a block of declarations. It will additionally derive instances for
    +-- Typeable, Old.Data and New.Data.
    +--
    +-- Example:
    +--
    +-- > $( deriveAll [''Show, ''Eq, ''Default] [d|
    +-- >        data Foo a = Foo a
    +-- >        data Bar = Baz | Quux
    +-- >  |] )
    +deriveAll :: [Name] -> Q [Dec] -> Q [Dec]
    +deriveAll classes0 qdecs
    + = do decs <- qdecs
    +      derivedDecs <- deriveDec (filter isDataOrNewtype decs)
    +      let (classDefault, classes1) = partition (''Default ==) classes0
    +          classes2 = ''Old.Data : classes1
    +          addDefaultInstance = not $ null classDefault
    +          f = addDerivedClasses addDefaultInstance classes2
    +          decs' = concatMap f decs
    +      return (decs' ++ derivedDecs)
    +
    +addDerivedClasses :: Bool -> [Name] -> Dec -> [Dec]
    +addDerivedClasses def cs (DataD ctxt nm tvs cons derivs)
    +    = DataD ctxt nm tvs cons (cs ++ derivs)
    +    : deriveDefault def (map tyVarBndrToName tvs) nm
    +addDerivedClasses def cs (NewtypeD ctxt nm tvs con derivs)
    +    = NewtypeD ctxt nm tvs con (cs ++ derivs)
    +    : deriveDefault def (map tyVarBndrToName tvs) nm
    +addDerivedClasses _ _ d = [d]
    +
    +deriveDefault :: Bool -> [Name] -> Name -> [Dec]
    +deriveDefault False _ _ = []
    +deriveDefault True tvs n = [InstanceD context instanceHead []]
    +    where tvs' = map VarT tvs
    +          mkDef x = ConT ''Default `AppT` x
    +          context = map mkCtx tvs'
    +          instanceHead = mkDef $ foldl AppT (ConT n) tvs'
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +          mkCtx x = ClassP ''Default [x]
    +#else
    +          mkCtx = mkDef
    +#endif
    +
    +
    +isDataOrNewtype :: Dec -> Bool
    +isDataOrNewtype (DataD {}) = True
    +isDataOrNewtype (NewtypeD {}) = True
    +isDataOrNewtype _ = False
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-GOps.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-GOps.html 1 + + + + +src/Happstack/Data/GOps.hs + + + +
    module Happstack.Data.GOps where
    +import Data.Generics hiding (GT)
    +import Control.Monad.Reader
    +import Control.Monad.State
    +import Data.Maybe
    +
    +-- useful generic functions with better names
    +
    +-- | @gSet x y@ will traveral @x@ and replace 
    +-- any instances of the type @a@ in its structure 
    +-- with @y@.
    +gSet :: (Data b, Typeable a) => a -> b -> b
    +gSet = gReplace . const
    +
    +-- | @gReplace f b@ will traverse @x@ and will act on
    +-- any instance of the type @a@ in its structure with
    +-- the function @f@.
    +gReplace :: (Typeable a, Data b) => (a -> a) -> b -> b
    +gReplace f x = everywhere (mkT f) x
    +
    +-- | @gFind a@ will extract any elements of type @b@ from
    +-- @a@'s structure in accordance with the MonadPlus
    +-- instance, e.g. Maybe Foo will return the first Foo
    +-- found while [Foo] will return the list of Foos found.
    +gFind :: (MonadPlus m, Data a, Typeable b) => a -> m b
    +gFind = msum . map return . listify (const True)
    +
    +-- | Acts as gFind but will throw an exception if
    +-- nothing is found.
    +gFind' :: (Data a, Typeable b) => a -> b
    +gFind' = fromJust . gFind
    +--Monad versions
    +
    +-- | A generalized modify that will apply the modification
    +-- function to the structure of the state.
    +gModify :: (MonadState s m,Typeable a,Data s) => (a->a) -> m ()
    +gModify = modify . gReplace
    +
    +-- | A generalized ask that will traverse the
    +-- stored type of the MonadReader in an attempt to find
    +-- an @a@ and will then apply the provided function if
    +-- found.
    +gAsk :: (Data r, Typeable a, MonadReader r m, MonadPlus n) =>
    +        (a -> n b) -> m (n b)
    +gAsk f = do st <- ask
    +            let y = gFind st 
    +            return $ maybe mzero f y
    +
    +-- | The equivalent of 'gAsk' for MonadState
    +gGet :: (Data s, Typeable a, MonadState s m, MonadPlus n) =>
    +        (a -> n b) -> c -> m (n b)
    +gGet f _ = do st <- get
    +              let y = gFind st 
    +              return $ maybe mzero f y
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Migrate.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Migrate.html 1 + + + + +src/Happstack/Data/Migrate.hs + + + +
    {-# LANGUAGE MultiParamTypeClasses #-}
    +module Happstack.Data.Migrate where
    +
    +{- | Migrate instances are needed to allow upgrades of MACID state.  It should be declared as instance Migrate Old New where migrate = transition_function
    +-}
    +class Migrate a b where
    +    migrate :: a -> b
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Normalize.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Normalize.html 1 + + + + +src/Happstack/Data/Normalize.hs + + + +
    {-# LANGUAGE OverlappingInstances, UndecidableInstances,
    +             FlexibleContexts, FlexibleInstances #-}
    +
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Data.Normalize
    +-- Copyright   :  (c) Happstack.com 2009; (c) HAppS LLC 2007
    +-- License     :  BSD3
    +--
    +-- Maintainer  :  happs@googlegroups.com
    +-- Stability   :  experimental
    +-- Portability :  Not portable
    +--
    +-- Normalizing Haskell values.
    +--
    +-----------------------------------------------------------------------------
    +
    +module Happstack.Data.Normalize
    +    (
    +        -- * The interface
    +        Normalize(normalize, normalizeRecursively),
    +
    +        -- * Writing your own instances
    +        defaultNormalize,
    +        defaultNormalizeRecursively,
    +
    +        -- * Advanced usage
    +        NormalizeD(..),
    +        normalizeProxy,
    +    )
    +    where
    +
    +import Data.Generics.SYB.WithClass.Basics
    +
    +-- | The 'Normalize' class provides a 'normalize' function, which
    +-- is intended to normalize values only at the top-level constructor,
    +-- and a 'normalizeRecursively' function, which is intended to
    +-- normalize all the subvalues and then normalize the top-level
    +-- constructor.
    +--
    +-- There is a default instance that matches all types, where 'normalize'
    +-- is 'id' and 'normalizeRecursively' applies 'normalizeRecursively' to
    +-- all of its children and then 'normalize' to the result.
    +--
    +-- If you want to actually do some normalization for a certain type,
    +-- then just define an instance for that type; this will take precedence
    +-- over the default instance.
    +class Data NormalizeD a => Normalize a where
    +    normalize :: a -> a
    +    normalize = defaultNormalize
    +    normalizeRecursively :: a -> a
    +    normalizeRecursively = defaultNormalizeRecursively
    +
    +-- | This is the 'normalize' function in the default 'Normalize'
    +-- instance. It may be a useful building block when writing your own
    +-- instances.
    +defaultNormalize :: Normalize a => a -> a
    +defaultNormalize x = x
    +
    +-- | This is the 'normalizeRecursively' function in the default
    +-- 'Normalize' instance. It may be a useful building block when writing
    +-- your own instances.
    +defaultNormalizeRecursively :: Normalize a => a -> a
    +defaultNormalizeRecursively = normalize . gmapT normalizeProxy (normalizeRecursivelyD dict)
    +
    +-- | When writing your own generic functions for 'Normalize' you may
    +-- need to access the class methods through this datatype rather than
    +-- directly.
    +data NormalizeD a = NormalizeD { normalizeD :: a -> a,
    +                                 normalizeRecursivelyD :: a -> a }
    +
    +-- | When writing your own generic functions for 'Normalize' you may
    +-- need this, the proxy value.
    +normalizeProxy :: Proxy NormalizeD
    +normalizeProxy = error "normalizeProxy"
    +
    +instance Normalize t => Sat (NormalizeD t) where
    +    dict = NormalizeD { normalizeD = normalize,
    +                        normalizeRecursivelyD = normalizeRecursively }
    +
    +instance Data NormalizeD a => Normalize a
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Pairs.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Pairs.html 1 + + + + +src/Happstack/Data/Pairs.hs + + + +
    {-# LANGUAGE TemplateHaskell, FlexibleInstances, UndecidableInstances -- just for example at the bottom
    +    ,CPP, DeriveDataTypeable, MultiParamTypeClasses
    +  #-}
    +module Happstack.Data.Pairs (pairsToXml,xmlToPairs,pairsToHTMLForm,xmlToHTMLForm
    +                        ,toPairs,toPairsX,fromPairs,toHTMLForm
    +                        ,Pairs,AsPairs
    +                        ) where
    +
    +import Data.Char
    +import Data.List
    +import Data.Maybe
    +
    +---stuff for examples
    +import Happstack.Data.DeriveAll
    +import Happstack.Util.Common
    +
    +import Data.Generics as G
    +import Happstack.Data.Default -- for pairs
    +import Happstack.Data.Xml
    +import Control.Monad.Identity
    +
    +type Pairs = [(String,String)]
    +
    +-- | Converts lists of string pairs into a list of Elements.
    +-- The basic structure is 
    +-- pairsToXml [("foo","bar")] = [Elem "foo" [CData "bar"]]
    +-- pairsToXml [("foo/bar","baz")] = [Elem "foo" [Elem "bar" [CData "baz"]]] 
    +pairsToXml :: Pairs -> [Element]
    +pairsToXml = fst . formIntoEls "" . map slash
    +
    +slash :: (String,t) -> (String,t)
    +slash p@('/':_,_) = p
    +slash (n,v) = ('/':n,v)
    +
    +formIntoEls :: String -> Pairs -> ([Element], Pairs)
    +formIntoEls _ [] = ([],[])
    +formIntoEls ctx pairs@((name,val):rest)
    +    | not $ isPrefixOf ctx name = ([],pairs)
    +    | isAttr = moreCtx $ Attr elName val
    +    | isLeaf = moreCtx $ Elem elName [CData val]
    +    | otherwise =
    +        let (es,pairs') = formIntoEls ctx' pairs
    +            (es',pairs'') = formIntoEls ctx pairs'
    +        in
    +        (Elem elName es:es',pairs'')
    +    where
    +    ctx' = ctx ++ "/" ++ top
    +    node =  tail $ drop (length ctx) name
    +    (top,subs) = break (=='/') node
    +    elName = takeWhile (/='[') top
    +    isLeaf = null subs
    +    isAttr = head top == '@'
    +    moreCtx el = let (restCtx,restPairs) = formIntoEls ctx rest
    +                 in (el:restCtx,restPairs)
    +
    +-- | Converts a list of Elements to a list of String pairs.
    +-- xmlToPairs [CData _] = error
    +-- xmlToPairs [Elem "foo" [CData "bar"]] = [("foo","bar")]
    +-- xmlToPairs [Elem "foo" [Elem "bar" [CData "baz"]]] = [("foo/bar","baz")]
    +-- xmlToPairs . pairsToXml = id
    +xmlToPairs :: [Element] -> Pairs
    +xmlToPairs =
    +    map (\(x,y)->(tail x,y)) .
    +    xmlIntoPairs 0 ""
    +
    +xmlIntoPairs :: Int -> String -> [Element] -> Pairs
    +xmlIntoPairs _ _ [] = []
    +xmlIntoPairs x ctx (Elem _ []:xs) = xmlIntoPairs x ctx xs
    +xmlIntoPairs x ctx (Attr n v:xs) = (ctx++"/"++n,v):xmlIntoPairs x ctx xs
    +xmlIntoPairs _ ctx (CData v:[]) = [(ctx,v)]
    +xmlIntoPairs _ _ (CData _:_) = []
    +xmlIntoPairs i ctx ((Elem n xs):xs') =
    +    thisElPairs ++ restPairs
    +    where
    +    --if we have two elements with the same name then we have to add [i]
    +    nIndex = n ++ "[" ++ (show i) ++ "]"
    +    (iNext,nName)
    +        | i/=0 = (i+1,nIndex)
    +        | null xs' = (0,n)
    +        | next==n = (i+1,nIndex)
    +        | otherwise = (0,n)
    +    Elem next _ = head xs'
    +    thisElPairs = (xmlIntoPairs 0 (ctx++"/"++nName) xs)
    +    restPairs = (xmlIntoPairs iNext ctx xs')
    +
    +-- | Creates the Xml structure corresponding to the specification of an HTML
    +-- form.  The provided pairs should be the spec of the inputs to the form.
    +pairsToHTMLForm :: String -> String -> String -> Pairs -> [Element]
    +pairsToHTMLForm iden action method pairs
    + = [Elem "form" (Attr "action" action :
    +                Attr "id" iden :
    +                Attr "method" method :
    +                map pToInput pairs ++
    +                [submitButton])]
    +
    +submitButton :: Element
    +submitButton = Elem "input" [Attr "type" "submit"]
    +
    +pToInput :: (String,String) -> Element
    +pToInput (n,v)=
    +    Elem "div" [Attr "class" "formEl",
    +                Elem "span" [Attr "class" "name"
    +                            ,CData $ map (\x->if x=='/' then ' ' else x) n]
    +               ,Elem "input" [Attr "name" n,Attr "value" v]]
    +
    +-- | Equivalent to pairsToHTMLForm but first converts the Xml instance to list of pairs.
    +xmlToHTMLForm :: (Xml a, Show a, Data a, Eq a) =>
    +                 String -> String -> String -> a -> [Element]
    +xmlToHTMLForm iden method action
    + = pairsToHTMLForm iden method action  . toPairsX -- xmlToPairs
    +
    +class (Xml x,Show x, G.Data x) => AsPairs x where
    +    toPairs::x->Pairs
    +    fromPairs::Pairs -> Maybe x
    +
    +instance (Xml a,Show a,G.Data a,Eq a) => AsPairs a where
    +    toPairs = xmlToPairs . toPublicXml
    +    fromPairs [] = Nothing
    +    fromPairs pairs = if res == dv && notRigidMatch then Nothing else Just res
    +        where
    +        xml = pairsToXml $ mapFst clean pairs
    +        res = runIdentity $ fromXml Flexible xml
    +        mbRigidMatch = fromXml Rigid xml
    +        _ = [mbRigidMatch,Just res]
    +        isRigidMatch = isJust mbRigidMatch
    +        notRigidMatch = not isRigidMatch
    +        dv = defaultValue
    +        (cons,_) = break (==' ') $ show dv
    +        clean n = if (map toLower parent)==(map toLower cons) || (head n == '/') 
    +                  then n
    +                  else cons++('/':name)
    +            where
    +            name = trimSlash n
    +            (parent,_) = break (=='/') name
    +        trimSlash n = if head n=='/' then tail n else n
    +
    +toPairsX :: (Xml a, Show a, Data a, Eq a) => a -> Pairs
    +toPairsX = map (\(n,v)->let (_,child)=break (=='/') n in
    +                            if null child then (n,v) else (tail child,v)) . toPairs
    +
    +-- | Equivalent to pairsToHTMLForm but first converts the Xml instance to list of pairs.  An alias for xmlToHTMLForm currently.
    +toHTMLForm :: (Xml a, Show a, Data a, Eq a) =>
    +              String -> String -> String -> a -> [Element]
    +toHTMLForm = xmlToHTMLForm
    +
    +--- example usage and tests here
    +$( deriveAll [''Show,''Default,''Eq]
    +   [d|
    +       data UserInfo = UserInfo User Pass 
    +       newtype User = User String 
    +       newtype Pass = Pass String 
    +    |]
    + )
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Proxy.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Proxy.html 1 + + + + +src/Happstack/Data/Proxy.hs + + + +
    {-# LANGUAGE CPP, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, TemplateHaskell, DeriveDataTypeable, UndecidableInstances #-}
    +module Happstack.Data.Proxy where
    +
    +import Happstack.Data.DeriveAll
    +import Happstack.Data.Default
    +
    +-- | Proxy is empty and is used as a transport of a phantom type
    +$(deriveAll [''Read,''Show,''Default]
    +  [d| data Proxy t = Proxy |]
    + )
    +
    +-- | Creates the Proxy with a type matching the argument
    +proxy :: t -> Proxy t
    +proxy _ = Proxy
    +
    +-- | Returns bottom
    +unProxy :: Proxy t -> t
    +unProxy _ = undefined
    +
    +-- | Acts as id except for providing type restrictions
    +asProxyType :: t -> Proxy t -> t
    +asProxyType t _ = t
    +
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Serialize.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Serialize.html 1 + + + + +src/Happstack/Data/Serialize.hs + + + +
    {-# LANGUAGE UndecidableInstances, OverlappingInstances, ScopedTypeVariables, GADTs,
    +    GeneralizedNewtypeDeriving, DeriveDataTypeable #-}
    +module Happstack.Data.Serialize
    +    ( Serialize(..), Version(..), Migrate(..), Mode(..), Contained, contain, extension,
    +      safeGet, safePut, getSafeGet, getSafePut, serialize, deserialize, collectVersions,
    +      Object(objectType), mkObject, deserializeObject, parseObject,
    +      module Happstack.Data.Proxy
    +    ) where
    +
    +import Control.Monad.Identity
    +import Data.Int()
    +import Data.Ratio ((%), Ratio, denominator, numerator)
    +import Data.Time (Day(..), DiffTime, LocalTime(..), NominalDiffTime, TimeOfDay(..)
    +                 ,TimeZone(..), UTCTime(..), UniversalTime(..), ZonedTime(..))
    +import Data.Time.Clock.TAI (AbsoluteTime, taiEpoch, addAbsoluteTime, diffAbsoluteTime)
    +import Foreign
    +import qualified Data.ByteString.Lazy.Char8 as L
    +import qualified Data.ByteString.Char8 as B
    +
    +import Happstack.Data.Migrate
    +import Happstack.Data.Proxy
    +
    +import Data.Typeable
    +import qualified Data.Map as Map
    +import qualified Data.IntMap as IntMap
    +import qualified Data.Set as Set
    +import qualified Data.Text as ST
    +import qualified Data.Text.Encoding as ST
    +import qualified Data.Text.Lazy as LT
    +import qualified Data.Text.Lazy.Encoding as LT
    +import Data.Binary     as B
    +import Data.Binary.Put as B
    +import Data.Binary.Get as B
    +
    +--------------------------------------------------------------
    +-- Core types
    +--------------------------------------------------------------
    +
    +data Contained a = Contained {unsafeUnPack :: a}
    +
    +-- | Lifts the provided value into Contained
    +contain :: a -> Contained a
    +contain = Contained
    +
    +data Previous a = forall b. (Serialize b, Migrate b a) => Previous (Proxy b)
    +
    +mkPrevious :: forall a b. (Serialize b, Migrate b a) => Proxy b -> Previous a
    +mkPrevious Proxy = Previous (Proxy :: Proxy b)
    +
    +-- | Creates a Mode that is a new version of the type carried by the provided proxy
    +-- and with the provided version number.  Note that since VersionId is an instance of
    +-- Num that you may use int literals when calling extension, e.g. 
    +-- @extension 1 (Proxy :: Proxy OldState)@
    +extension :: forall a b. (Serialize b, Migrate b a) => VersionId a -> Proxy b -> Mode a
    +extension vs prox = Versioned vs (Just (mkPrevious prox))
    +
    +newtype VersionId a = VersionId {unVersion :: Int} deriving (Num,Read,Show,Eq)
    +instance Binary (VersionId a) where
    +    get = liftM VersionId get
    +    put = put . unVersion
    +
    +
    +data Mode a = Primitive -- ^ Data layout won't change. Used for types like Int and Char.
    +            | Versioned (VersionId a) (Maybe (Previous a))
    +
    +-- | The Version type class is used to describe whether a type is fundamental
    +-- or if it is meant to extend another type.  For a user defined type that
    +-- does not extend any others, one can use the default instance of Version, e.g.
    +-- @instance Version MyType@ to define it has having a version id of 0 and previous
    +-- type.
    +class Version a where
    +    mode :: Mode a
    +    mode = Versioned 0 Nothing
    +
    +class (Typeable a, Version a) => Serialize a where
    +    getCopy :: Contained (Get a)
    +    putCopy :: a -> Contained Put
    +
    +--------------------------------------------------------------
    +-- Implementation
    +--------------------------------------------------------------
    +
    +getSafeGet :: forall a. Serialize a => Get (Get a)
    +getSafeGet = case mode :: Mode a of
    +               Primitive -> return (unsafeUnPack getCopy)
    +               Versioned wantedVersion mbPrevious
    +                         -> do storedVersion <- get
    +                               return (safeGetVersioned wantedVersion mbPrevious storedVersion)
    +
    +getSafePut :: forall a. Serialize a => PutM (a -> Put)
    +getSafePut = case mode :: Mode a of
    +               Primitive -> return (unsafeUnPack . putCopy)
    +               Versioned vs _
    +                         -> do B.put vs
    +                               return (unsafeUnPack . putCopy)
    +
    +
    +-- | Equivalent of Data.Binary.put for instances of Serialize.  
    +-- Takes into account versioning of types.
    +safePut :: forall a. Serialize a => a -> Put
    +safePut val = do fn <- getSafePut
    +                 fn val
    +
    +-- | Equivalent of Data.Binary.get for instances of Serialize
    +-- Takes into account versioning of types.
    +safeGet :: forall a. Serialize a => Get a
    +safeGet = join getSafeGet
    +
    +safeGetVersioned :: forall a b. (Serialize b) => VersionId b -> Maybe (Previous b) -> VersionId a -> B.Get b
    +safeGetVersioned wantedVersion mbPrevious storedVersion
    +    = case compareVersions storedVersion wantedVersion of
    +        GT -> error $ "Version tag too large: " ++ show (wantedVersion,storedVersion) ++ " (" ++ tStr ++ ")"
    +        EQ -> unsafeUnPack getCopy
    +        LT -> case mbPrevious of
    +                Nothing -> error $ "No previous version (" ++ tStr ++ ")"
    +                Just (Previous (_ :: Proxy f) :: Previous b)
    +                    -> case mode of
    +                         Primitive -> error $ "Previous version marked as a Primitive (" ++ tStr ++ ")"
    +                         Versioned wantedVersion' mbPrevious'
    +                             -> do old <- safeGetVersioned wantedVersion' mbPrevious' storedVersion :: B.Get f
    +                                   return $ migrate old
    +    where tStr = show (typeOf (error "huh?" :: b))
    +
    +-- | Compares the numeric value of the versions
    +compareVersions :: VersionId a -> VersionId b -> Ordering
    +compareVersions v1 v2 = compare (unVersion v1) (unVersion v2)
    +
    +-- | Pure version of 'safePut'.  Serializes to a ByteString
    +serialize :: Serialize a => a -> L.ByteString
    +serialize = runPut . safePut
    +
    +-- | Pure version of 'safeGet'.  Parses a ByteString into the expected type
    +-- and a remainder.
    +deserialize :: Serialize a => L.ByteString -> (a, L.ByteString)
    +deserialize bs = case runGetState safeGet bs 0 of
    +                   (val, rest, _offset) -> (val, rest)
    +
    +-- | Version lookups
    +collectVersions :: forall a . (Typeable a, Version a) => Proxy a -> [L.ByteString]
    +collectVersions prox
    +    = case mode :: Mode a of
    +        Primitive                          -> [thisType]
    +        Versioned _ Nothing                -> [thisType]
    +        Versioned _ (Just (Previous prev)) -> thisType : (collectVersions prev)
    +    where thisType = (L.pack . show . typeOf . unProxy) prox
    +
    +--------------------------------------------------------------
    +-- Instances
    +--------------------------------------------------------------
    +
    +instance Version Int where mode = Primitive
    +instance Serialize Int where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Integer where mode = Primitive
    +instance Serialize Integer where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Float where mode = Primitive
    +instance Serialize Float where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Double where mode = Primitive
    +instance Serialize Double where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version L.ByteString where mode = Primitive
    +instance Serialize L.ByteString where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version B.ByteString where mode = Primitive
    +instance Serialize B.ByteString where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Char where mode = Primitive
    +instance Serialize Char where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Word8 where mode = Primitive
    +instance Serialize Word8 where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Word16 where mode = Primitive
    +instance Serialize Word16 where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Word32 where mode = Primitive
    +instance Serialize Word32 where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Word64 where mode = Primitive
    +instance Serialize Word64 where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Ordering where mode = Primitive
    +instance Serialize Ordering where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Int8 where mode = Primitive
    +instance Serialize Int8 where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Int16 where mode = Primitive
    +instance Serialize Int16 where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Int32 where mode = Primitive
    +instance Serialize Int32 where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Int64 where mode = Primitive
    +instance Serialize Int64 where
    +    getCopy = contain get; putCopy = contain . put
    +{-
    +This instance requires base >= 4.2.0.0, which means GHC >= 6.12. We can add this back in when we drop support for GHC 6.10.
    +
    +instance Version (Fixed a)
    +instance (Typeable a, HasResolution a) => Serialize (Fixed a) where
    +    getCopy = contain $ liftM fromRational safeGet ; putCopy = contain . safePut . toRational
    +-}
    +instance (Typeable a)  => Version (Ratio a)
    +instance (Integral a, Serialize a) => Serialize (Ratio a) where
    +  getCopy = contain $ liftM2 (%) safeGet safeGet
    +  putCopy r = contain $ safePut (numerator r) >> safePut (denominator r)
    +instance Version () where mode = Primitive
    +instance Serialize () where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version Bool where mode = Primitive
    +instance Serialize Bool where
    +    getCopy = contain get; putCopy = contain . put
    +instance Version (Either a b) where mode = Primitive
    +instance (Serialize a, Serialize b) => Serialize (Either a b) where
    +    getCopy = contain $ do n <- get
    +                           if n then liftM Right safeGet
    +                                else liftM Left safeGet
    +    putCopy (Right a) = contain $ put True >> safePut a
    +    putCopy (Left a) = contain $ put False >> safePut a
    +instance Version (a,b) where mode = Primitive
    +instance (Serialize a, Serialize b) => Serialize (a,b) where
    +    getCopy = contain $ liftM2 (,) safeGet safeGet
    +    putCopy (a,b) = contain $ safePut a >> safePut b
    +instance Version (a,b,c) where mode = Primitive
    +instance (Serialize a, Serialize b, Serialize c) => Serialize (a,b,c) where
    +    getCopy = contain $ liftM3 (,,) safeGet safeGet safeGet
    +    putCopy (a,b,c) = contain $ safePut a >> safePut (b,c)
    +instance Version (a,b,c,d) where mode = Primitive
    +instance (Serialize a, Serialize b, Serialize c, Serialize d) => Serialize (a,b,c,d) where
    +    getCopy = contain $ liftM4 (,,,) safeGet safeGet safeGet safeGet
    +    putCopy (a,b,c,d) = contain $ safePut a >> safePut (b,c,d)
    +instance Version (a,b,c,d,e) where mode = Primitive
    +instance (Serialize a, Serialize b, Serialize c, Serialize d, Serialize e) => Serialize (a,b,c,d,e) where
    +    getCopy = contain $ liftM5 (,,,,) safeGet safeGet safeGet safeGet safeGet
    +    putCopy (a,b,c,d,e) = contain $ safePut a >> safePut (b,c,d,e)
    +
    +instance Version (Proxy a) where mode = Primitive
    +instance Typeable a => Serialize (Proxy a) where
    +    getCopy = contain $ return Proxy
    +    putCopy Proxy = contain $ return ()
    +
    +instance Version [a] where mode = Primitive
    +instance Serialize a => Serialize [a] where
    +    getCopy = contain $
    +              do n <- get
    +                 getSafeGet >>= replicateM n
    +    putCopy lst
    +        = contain $
    +          do put (length lst)
    +             getSafePut >>= forM_ lst
    +
    +instance Version (Maybe a) where mode = Primitive
    +instance Serialize a => Serialize (Maybe a) where
    +    getCopy = contain $ do n <- get
    +                           if n then liftM Just safeGet
    +                                else return Nothing
    +    putCopy (Just a) = contain $ put True >> safePut a
    +    putCopy Nothing = contain $ put False
    +
    +instance Version (Set.Set a) where mode = Primitive
    +instance (Serialize a, Ord a) => Serialize (Set.Set a) where
    +    getCopy = contain $ fmap Set.fromAscList safeGet
    +    putCopy = contain . safePut . Set.toList
    +
    +instance Version (Map.Map a b) where mode = Primitive
    +instance (Serialize a,Serialize b, Ord a) => Serialize (Map.Map a b) where
    +    getCopy = contain $ fmap Map.fromAscList safeGet
    +    putCopy = contain . safePut . Map.toList
    +
    +instance Version (IntMap.IntMap a) where mode = Primitive
    +instance (Serialize a) => Serialize (IntMap.IntMap a) where
    +    getCopy = contain $ fmap IntMap.fromAscList safeGet
    +    putCopy = contain . safePut . IntMap.toList
    +    
    +instance Version ST.Text
    +instance Serialize ST.Text where
    +    putCopy = putCopy . ST.encodeUtf8
    +    getCopy = contain $ fmap ST.decodeUtf8 safeGet
    +    
    +instance Version LT.Text
    +instance Serialize LT.Text where
    +    putCopy = putCopy . LT.encodeUtf8
    +    getCopy = contain $ fmap LT.decodeUtf8 safeGet
    +
    +
    +-- Data.Time instances
    +instance Version Day
    +instance Serialize Day where
    +  getCopy = contain $ liftM ModifiedJulianDay get ; putCopy = contain . put . toModifiedJulianDay
    +
    +instance Version UniversalTime
    +instance Serialize UniversalTime where
    +  getCopy = contain $ liftM ModJulianDate get ; putCopy = contain . put . getModJulianDate
    +
    +instance Version UTCTime
    +instance Serialize UTCTime where
    +  getCopy   = contain $ liftM2 UTCTime safeGet safeGet
    +  putCopy d = contain $ safePut (utctDay d) >> safePut (utctDayTime d)
    +
    +instance Version TimeZone
    +instance Serialize TimeZone where
    +  getCopy   = contain $ do minutes    <- safeGet
    +                           summerOnly <- safeGet
    +                           nam        <- safeGet
    +                           return (TimeZone minutes summerOnly nam)
    +  putCopy (TimeZone minutes summerOnly nam) =
    +    contain $ do safePut minutes
    +                 safePut summerOnly
    +                 safePut nam
    +
    +instance Version TimeOfDay
    +instance Serialize TimeOfDay where
    +  getCopy = contain $ do h <- safeGet
    +                         m <- safeGet
    +                         s <- safeGet
    +                         return (TimeOfDay h m (fromRational s))
    +  putCopy (TimeOfDay h m s) =
    +    contain $ do safePut h
    +                 safePut m
    +                 safePut (toRational s)
    +
    +instance Version ZonedTime
    +instance Serialize ZonedTime where
    +  getCopy   = contain $ liftM2 ZonedTime safeGet safeGet
    +  putCopy (ZonedTime lt tz) = contain $ safePut lt >> safePut tz
    +
    +instance Version LocalTime
    +instance Serialize LocalTime where
    +  getCopy   = contain $ liftM2 LocalTime safeGet safeGet
    +  putCopy (LocalTime day tod) = contain $ safePut day >> safePut tod
    +
    +instance Version DiffTime
    +instance Serialize DiffTime where
    +  getCopy = contain $ liftM fromRational safeGet ; putCopy = contain . safePut . toRational
    +
    +instance Version NominalDiffTime
    +instance Serialize NominalDiffTime where
    +  getCopy = contain $ liftM fromRational get ; putCopy = contain . put . toRational
    +
    +instance Version AbsoluteTime
    +instance Serialize AbsoluteTime where
    +  getCopy = contain $ liftM toAbsoluteTime safeGet
    +    where
    +      toAbsoluteTime :: DiffTime -> AbsoluteTime
    +      toAbsoluteTime dt = addAbsoluteTime dt taiEpoch
    +  putCopy = contain . safePut . fromAbsoluteTime
    +    where
    +      fromAbsoluteTime :: AbsoluteTime -> DiffTime
    +      fromAbsoluteTime at = diffAbsoluteTime at taiEpoch
    +
    +--------------------------------------------------------------
    +-- Object serialization
    +--------------------------------------------------------------
    +
    +
    +-- | 'deserialize' specialized to Objects 
    +deserializeObject :: L.ByteString -> (Object, L.ByteString)
    +deserializeObject = deserialize
    +
    +-- | Attempts to convert an Object back into its base type.
    +-- If the conversion fails 'error' will be called.
    +parseObject :: Serialize a => Object -> a
    +parseObject (Object objType objData)
    +    = let res = runGet safeGet objData
    +          resType = show (typeOf res)
    +      in if objType /= resType
    +         then error $ "Failed to parse object of type '" ++ objType ++ "'. Expected type '" ++ resType ++ "'"
    +         else res
    +
    +-- | Serializes data and stores it along with its type name in an Object
    +mkObject :: Serialize a => a -> Object
    +mkObject obj = Object { objectType = show (typeOf obj)
    +                      , objectData = serialize obj }
    +
    +-- | Uniform container for any serialized data.  It contains a string rep of the type
    +-- and the actual data serialized to a byte string.
    +data Object = Object { objectType :: String
    +                     , objectData :: L.ByteString
    +                     }  deriving (Typeable,Show)
    +
    +instance Version Object
    +instance Serialize Object where
    +    putCopy (Object objType objData) = contain $ put (objType, objData)
    +    getCopy = contain $
    +              do (objType, objData) <- get
    +                 return (Object objType objData)
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-SerializeTH.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-SerializeTH.html 1 + + + + +src/Happstack/Data/SerializeTH.hs + + + +
    {-# LANGUAGE TemplateHaskell, CPP #-}
    +module Happstack.Data.SerializeTH
    +    ( deriveSerialize
    +    , deriveSerializeFor
    +    ) where
    +
    +import Happstack.Data.Serialize
    +
    +import Language.Haskell.TH
    +import Control.Monad
    +import Data.Binary
    +
    +data Class = Tagged [(Name, Int)] Cxt [Name]
    +
    +-- | Derives an instance of Serialize for the provided type
    +-- Should work in most cases if the type is already and instance
    +-- of Version.  
    +-- Ex: @$(deriveSerialize ''Foo)@
    +deriveSerialize :: Name -> Q [Dec]
    +deriveSerialize name
    +    = do c <- parseInfo name
    +         case c of
    +           Tagged cons cx keys ->
    +               do let context = [ mkCtx ''Serialize [varT key] | key <- keys ] ++ map return cx
    +                  i <- instanceD (sequence context) (mkType ''Serialize [mkType name (map varT keys)])
    +                       [ putCopyFn cons
    +                       , getCopyFn cons
    +                       ]
    +                  return [i]
    +    where putCopyFn cons
    +              = do inp <- newName "inp"
    +                   let putCopyBody = appE (varE 'contain) $
    +                                     caseE (varE inp) $
    +                                       [ do args <- replicateM nArgs (newName "arg")
    +                                            let matchCon = conP conName (map varP args)
    +                                            match matchCon (normalB (putCopyWork args i)) []
    +                                             | ((conName,nArgs), i) <- zip cons [0..]]
    +                       putCopyWork args i
    +                           = doE $ [noBindS [| putWord8 $(litE (integerL i)) |]] ++
    +                                   [ noBindS [| safePut $(varE arg) |] | arg <- args ]
    +                   funD 'putCopy [clause [varP inp] (normalB putCopyBody) []]
    +          getCopyFn cons
    +              = let getCopyBody = do c <- newName "c"
    +                                     appE (varE 'contain) $
    +                                      doE [bindS (varP c) [| getWord8 |]
    +                                          , noBindS $ caseE (varE c) $
    +                                                        [ do args <- replicateM nArgs (newName "arg")
    +                                                             match (litP (integerL i)) (normalB $ getCopyWork conName args) []
    +                                                          | ((conName, nArgs), i) <- zip cons [0..]]
    +                                                        ++ [match (return WildP) (normalB [|error "Wrong serialization type"|]) []]
    +                                          ]
    +                    getCopyWork conName args
    +                        = doE $ [ bindS (varP arg) [| safeGet |] | arg <- args ] ++
    +                                [ noBindS [| return $(foldl appE (conE conName) (map varE args)) |] ]
    +                in funD 'getCopy [clause [] (normalB getCopyBody) []]
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +          mkCtx = classP
    +#else
    +          mkCtx = mkType
    +#endif
    +
    +-- | Derives Serialize for a list of types
    +deriveSerializeFor :: [Name] -> Q [Dec]
    +deriveSerializeFor = liftM concat . mapM deriveSerialize
    +
    +
    +mkType :: Name -> [TypeQ] -> TypeQ
    +mkType con = foldl appT (conT con)
    +
    +parseInfo :: Name -> Q Class
    +parseInfo name
    +    = do info <- reify name
    +         case info of
    +           TyConI (DataD cx _ keys cs _)    -> return $ Tagged (map conInfo cs) cx $ map conv keys
    +           TyConI (NewtypeD cx _ keys con _)-> return $ Tagged [conInfo con] cx $ map conv keys
    +           _                            -> error "Invalid input"
    +    where conInfo (NormalC n args) = (n, length args)
    +          conInfo (RecC n args) = (n, length args)
    +          conInfo (InfixC _ n _) = (n, 2)
    +          conInfo (ForallC _ _ con) = conInfo con
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +          conv (PlainTV nm) = nm
    +          conv (KindedTV nm _) = nm
    +#else
    +          conv = id
    +#endif
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml-Base.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml-Base.html 1 + + + + +src/Happstack/Data/Xml/Base.hs + + + +
    {-# LANGUAGE TemplateHaskell, FlexibleInstances,
    +             OverlappingInstances, UndecidableInstances, CPP,
    +             ScopedTypeVariables, GADTs,
    +             PolymorphicComponents, FlexibleContexts,
    +             MultiParamTypeClasses, DeriveDataTypeable,
    +             ScopedTypeVariables, PatternGuards #-}
    +
    +module Happstack.Data.Xml.Base where
    +
    +import Control.Monad.Identity
    +import Control.Monad.State
    +import Data.Char
    +import Data.List
    +import Data.Generics.SYB.WithClass.Basics
    +import Data.Generics.SYB.WithClass.Instances ()
    +import Data.Maybe
    +import           Data.ByteString.Char8 (ByteString)
    +import qualified Data.ByteString.Char8 as BS
    +import Happstack.Data.Default
    +import Happstack.Data.DeriveAll
    +import Happstack.Data.Migrate
    +import Happstack.Data.Normalize
    +import Happstack.Util.TH
    +import Language.Haskell.TH
    +
    +{-| Element recursively represents XML data.  
    +    Elem n elems -> XML element with name n and described by elems.  Note that elems contains sub-elements as well as the attributes or literal data of the element.
    +    CData d -> Literal string data
    +    Attr key val -> Key/Value pair of the element attribute.
    +-}
    +
    +$(deriveAll [''Default, ''Eq,''Read,''Ord] [d|
    +    data Element = Elem String [Element]
    +                 | CData String
    +                 | Attr String String
    + |])
    +
    +
    +-- | insEl a b will convert a to xml and insert it into the
    +-- xml of b if b results in an Elem constructor.
    +insEl :: (Data XmlD a, Default a, Data NormalizeD a,
    +          Data XmlD b, Default b, Data NormalizeD b) =>
    +         a -> b -> Element
    +insEl a b = case toXml b  of
    +            (Elem n xs:_) -> Elem n $ toPublicXml a ++ xs
    +            _ -> error "can't insert a into b"
    +
    +
    +-- This is a more readable representation than the default, but is still
    +-- Haskell syntax
    +instance Show Element where
    +    show (Elem s es) = "Elem " ++ show s ++ " ["
    +                       ++ fiddle (unlines (indent (concatMap lines $ comma $ map show es)))
    +                       
    +                      ++ "]"
    +        where indent = map ("    " ++)
    +              comma::[String]->[String]
    +              comma [] = []
    +              comma (x:xs) = (' ':x):map (',':) xs
    +              fiddle "" = ""
    +              fiddle xs = '\n' : (if last xs == '\n' then init xs else xs)
    +    show (CData s) = "CData " ++ show s
    +    show (Attr k v) = "Attr " ++ show k ++ " " ++ show v
    +
    +-- | Wrapper around the Xml class method readXml.
    +-- The Rigidity will determine the behavior in the case of a failed parsing:  Rigid will return Nothing and Flexible will return Identity (defaultValue)
    +fromXml :: forall m a . (Monad m, Xml a) => Rigidity m -> [Element] -> m a
    +fromXml r xs = case readXml r xs of
    +               Just (_, v) ->
    +                   return v
    +               Nothing ->
    +                   case r of
    +                   Rigid -> fail "fromXml XXX"
    +                   Flexible -> return defaultValue
    +
    +data Other b = forall a . (Migrate a b, Xml a) => Other a
    +             | NoOther
    +
    +-- | Identical to toXml from Xml class except that it will remove attributes named haskellType or haskellTypeVersion
    +toPublicXml :: Xml a => a -> [Element]
    +toPublicXml x = clean $ toXml x
    +    where
    +    clean [] = []
    +    clean ((Elem n xs):rest) = (Elem n $ clean xs): clean rest
    +    clean (CData s:rest)=CData s:clean rest
    +    clean (Attr n v:rest) = if n `elem` [typeAttr,versionAttr] then clean rest
    +                            else Attr n v:clean rest
    +-- | Rigidity is used to designate the result of a failed Xml parsing.
    +data Rigidity m where
    +    Rigid :: Rigidity Maybe
    +    Flexible :: Rigidity Identity
    +
    +instance Show (Rigidity m) where
    +    show Rigid = "Rigid"
    +    show Flexible = "Flexible"
    +
    +class (Data XmlD a,
    +       Default a, -- We'd rather have this only in the Flexible case,
    +                  -- but bugs in GHC 6.6.1 and problems getting the
    +                  -- instance for child types in constrFromElements
    +                  -- mean it's a constraint of the Xml class for now.
    +       Normalize a)
    +   => Xml a where
    +    toXml :: a -> [Element]
    +    toXml = defaultToXml
    +
    +   -- readXml is like readXml' except it normalises the Elements and
    +    -- the result
    +    readXml :: Monad m => Rigidity m -> [Element] -> Maybe ([Element], a)
    +    readXml = defaultReadXml
    +
    +    readXml' :: Monad m => Rigidity m -> [Element] -> Maybe ([Element], a)
    +    readXml' = defaultReadXml'
    +
    +    normalizeXml :: a{- can't look at this value -} -> [Element] -> [Element]
    +    normalizeXml _ = id
    +
    +    version :: a{- can't look at this value -} -> Maybe String
    +    version _ = Just "0"
    +
    +    otherVersion :: a{- can't look at this value -} -> Other a
    +    otherVersion _ = NoOther
    +
    +    typ :: a{- can't look at this value -} -> String
    +    typ _ = dataTypeName (dataTypeOf xmlProxy (undefined :: a))
    +
    +instance (Data XmlD t, Default t, Normalize t) => Xml t
    +
    +data XmlD a = XmlD { toXmlD :: a -> [Element],
    +                     readMXmlD :: forall m . Monad m
    +                               => Rigidity m -> ReadM m a,
    +                     readMXmlNoRootDefaultD :: forall m . Monad m
    +                                            => Rigidity m -> ReadM Maybe a }
    +
    +-- | Used as a type witness for usage with syb-with-class Data class.
    +xmlProxy :: Proxy XmlD
    +xmlProxy = error "xmlProxy"
    +
    +instance Xml t => Sat (XmlD t) where
    +    dict = XmlD { toXmlD = toXml,
    +                  readMXmlD = readMXml,
    +                  readMXmlNoRootDefaultD = readMXmlNoRootDefault }
    +
    +-- | Applies function to only first element of the list.  Safe on empty lists.
    +first :: (a -> a) -> [a] -> [a]
    +first _ [] = []
    +first f (x:xs) = f x : xs
    +
    +
    +{- | Converts the argument to an Xml element with the constructor 
    +   name as the root of the Elem and the additional attributes corresponding 
    +   to haskellType and haskellTypeVersion added
    +-}
    +defaultToXml :: Xml t => t -> [Element]
    +defaultToXml x
    + = let me = first toLower $ constring $ toConstr xmlProxy x
    +       rest = Attr typeAttr (dataTypeName (dataTypeOf xmlProxy x)) :
    +            transparentToXml x
    +       rest' = case version x of
    +                   Nothing -> rest
    +                   Just v -> Attr versionAttr v : rest
    +   in [Elem me rest']
    +
    +-- | Generically traverses an instance of Xml and converts it into a list of elements 
    +transparentToXml :: Xml t => t -> [Element]
    +transparentToXml = concat . gmapQ xmlProxy (toXmlD dict)
    +
    +-- | Attempts to parse the set of elements and return the first constructor it
    +-- can successfully parse of the inferred type.
    +transparentReadXml :: forall m t . (Monad m, Xml t)
    +                   => Rigidity m -> [Element] -> Maybe ([Element], t)
    +transparentReadXml r es
    + = aConstrFromElements r (dataTypeConstrs (dataTypeOf xmlProxy resType)) es
    +   where resType :: t
    +         resType = typeNotValue resType
    +
    +-- | Create an Xml instance using transparentToXml and transparentReadXml
    +transparentXml :: Name -> Q [Dec]
    +transparentXml n
    + = do i <- reify n
    +      case i of
    +          TyConI (DataD _ _ vs _ _) ->
    +              do argNames <- replicateM (length vs) (newName "a")
    +                 let args = map varT argNames
    +                     mkXml a = conT ''Xml `appT` a
    +#if MIN_VERSION_template_haskell(2,4,0)
    +                     mkXmlPred a = classP ''Xml [a]
    +                     ctxt = cxt $ map mkXmlPred args
    +#else
    +                     ctxt = cxt $ map mkXml args
    +#endif
    +                     instanceHead = mkXml $ foldl appT (conT n) args
    +                     decs = [d|
    +                                toXml :: Xml a => a -> [Element]
    +                                toXml = transparentToXml
    +
    +                                readXml :: (Monad m, Xml a)
    +                                        => Rigidity m -> [Element]
    +                                        -> Maybe ([Element], a)
    +                                readXml = transparentReadXml
    +                              |]
    +                 d <- instanceD' ctxt instanceHead decs
    +                 return [d]
    +          _ ->
    +              fail ("transparentXml: Not given a type constructor's name: " ++
    +                    show n)
    +
    +-- Don't do any defaulting here, as these functions can be implemented
    +-- differently by the user. We do the defaulting elsewhere instead.
    +-- The t' type is thus not used.
    +
    +defaultReadXml :: (Monad m, Xml t)
    +               => Rigidity m -> [Element] -> Maybe ([Element], t)
    +defaultReadXml r es = res
    +    where res = case readXml' r $ normalizeXml valType es of
    +                    Nothing -> Nothing
    +                    Just (es', v) -> Just (es', normalize v)
    +          valType = snd $ fromJust res
    +
    +defaultReadXml' :: (Monad m, Xml t)
    +                => Rigidity m -> [Element] -> Maybe ([Element], t)
    +defaultReadXml' = readXmlWith readVersionedElement
    +
    +readXmlWith :: Xml t
    +            => (Rigidity m -> Element -> Maybe t)
    +            -> Rigidity m
    +            -> [Element]
    +            -> Maybe ([Element], t)
    +readXmlWith f r@Rigid es = case es of
    +                               e : es' ->
    +                                   case f r e of
    +                                       Just v -> Just (es', v)
    +                                       Nothing -> Nothing
    +                               [] ->
    +                                   Nothing
    +readXmlWith f r@Flexible es = readXmlWith' [] es
    +    where readXmlWith' acc (x:xs)
    +           = case f r x of
    +                 Nothing -> readXmlWith' (x:acc) xs
    +                 Just v -> Just (reverse acc ++ xs, v)
    +          readXmlWith' _ [] = Nothing
    +
    +readVersionedElement :: forall m t . (Monad m, Xml t)
    +                     => Rigidity m -> Element -> Maybe t
    +readVersionedElement r (Elem n es)
    +    = case getAttr typeAttr es of
    +      Nothing ->
    +          readElement r (Elem n es)
    +      Just (t, es')
    +       | t == typ resType ->
    +          case version resType of
    +          Nothing ->
    +              readElement r (Elem n es')
    +          Just v ->
    +              case getAttr versionAttr es' of
    +              Nothing -> readElement r (Elem n es')
    +              Just (v', es'')
    +               | v == v' -> readElement r (Elem n es'')
    +               | otherwise ->
    +                  case otherVersion resType of
    +                  NoOther ->
    +                      Nothing
    +                  Other (_ :: u) ->
    +                      case readVersionedElement r (Elem n es'') of
    +                      Just (res :: u) ->
    +                          Just (migrate res)
    +                      Nothing -> Nothing
    +       | otherwise ->
    +          Nothing
    +    where resType :: t
    +          resType = typeNotValue resType
    +readVersionedElement _ _ = Nothing
    +
    +-- | Matches the provided string to the key of an attribute.  Returns False if any other Element constructor is given.
    +isTheAttr :: String -> Element -> Bool
    +isTheAttr a (Attr k _) = a == k
    +isTheAttr _ _          = False
    +
    +-- | Fetch the value of the given attribute if present, if not present will return Nothing
    +getAttr :: String -> [Element] -> Maybe (String, [Element])
    +getAttr a es = case break (isTheAttr a) es of
    +                (prefix, Attr _ v : suffix) -> Just (v, prefix ++ suffix)
    +                _ -> Nothing
    +
    +-- | Attribute used for Xml class version information
    +versionAttr :: String
    +versionAttr = "haskellTypeVersion"
    +
    +-- | Attribute used for recording the actual Haskell type in the xml serialization 
    +typeAttr :: String
    +typeAttr = "haskellType"
    +
    +
    +readElement :: forall m t . (Monad m, Xml t) => Rigidity m -> Element -> Maybe t
    +readElement r (Elem n es) = res
    +    where resType = dataTypeOf xmlProxy (undefined :: t)
    +          res = case readConstr resType $ first toUpper n of
    +                Just c -> f c
    +                Nothing -> if endsWithNum n then readElement r (Elem (noNum n) es) else Nothing
    +          f :: Constr -> Maybe t
    +          f c =     let m :: m ([Element], t)
    +                        m = constrFromElements r c es
    +                    in case r of
    +                       Rigid -> case m of
    +                                    Just ([], x) -> Just x
    +                                    _ -> Nothing
    +                       Flexible -> case runIdentity m of
    +                                       -- We ignore left over elements
    +                                       (_, x) -> Just x
    +          endsWithNum m = (last m) `elem` "0123456789"
    +          noNum  = reverse . dropWhile (`elem` "012344566789") . reverse 
    +
    +readElement _ _ = Nothing
    +
    +-- When just trying all the constructors of a type, if defaulting is
    +-- allowed we would always get the first constructor as all of its
    +-- arguments could be defaulted. Therefore we have the choice of
    +--  * accepting this
    +--  * turning off defaulting for this level only
    +--  * turning off defaulting recursively
    +-- We choose the second option, and thus have to duplicate
    +-- constrFromElements and readXml(D).
    +
    +-- | aConstrFromElements will return the results of the first constructor
    +-- that parses correctly.
    +aConstrFromElements :: forall m t . (Monad m, Xml t)
    +                    => Rigidity m -> [Constr] -> [Element]
    +                    -> Maybe ([Element], t)
    +aConstrFromElements r cs es
    + = msum [ constrFromElementsNoRootDefault r c es | c <- cs ]
    +
    +
    +-- | Like constrFromElements but does not allow defaulting in case of
    +-- a parse error.
    +constrFromElementsNoRootDefault :: forall m t . (Monad m, Xml t)
    +                                => Rigidity m -> Constr -> [Element]
    +                                -> Maybe ([Element], t)
    +constrFromElementsNoRootDefault r c es
    + = do let st = ReadState { xmls = es }
    +          m :: ReadM Maybe t
    +          m = fromConstrM xmlProxy (readMXmlNoRootDefaultD dict r) c
    +      -- XXX Should we flip the result order?
    +      (x, st') <- runStateT m st
    +      return (xmls st', x)
    +
    +{- | Attempts to parse the given elements to build the particular type
    +     given by the constructor argument.
    +-}
    +constrFromElements :: forall m t . (Monad m, Xml t)
    +                   => Rigidity m -> Constr -> [Element]
    +                   -> m ([Element], t)
    +constrFromElements r c es
    + = do let st = ReadState { xmls = es }
    +          m :: ReadM m t
    +          m = fromConstrM xmlProxy (readMXmlD dict r) c
    +      -- XXX Should we flip the result order?
    +      (x, st') <- runStateT m st
    +      return (xmls st', x)
    +
    +type ReadM m = StateT ReadState m
    +
    +data ReadState = ReadState {
    +                     xmls :: [Element]
    +                 }
    +
    +-- | Returns the elements currently in the state
    +getXmls :: Monad m => ReadM m [Element]
    +getXmls = do st <- get
    +             return $ xmls st
    +
    +-- | Sets the state of the xml parsing to the given value
    +putXmls :: Monad m => [Element] -> ReadM m ()
    +putXmls xs = do st <- get
    +                put $ st { xmls = xs }
    +
    +{- | Attempts to parse the current set of elements.  If it fails the behavior
    +is dependent on the Rigidity.  If it is Rigid, then it will return Nothing
    +but if it is Flexible it will return the defaultValue.
    +If the parsing succeeds, it will return the value and store the remaining
    +XML elements in the parser state.
    +-}
    +readMXml :: (Monad m, Xml a) => Rigidity m -> ReadM m a
    +readMXml r
    + = do xs <- getXmls
    +      case readXml r xs of
    +          Nothing ->
    +              case r of
    +              Rigid -> fail "Cannot read value"
    +              Flexible -> return defaultValue
    +          Just (xs', v) ->
    +              do putXmls xs'
    +                 return v
    +-- | Identical to readMXml except that in the case of a failed parsing it will not use defaultValue.
    +readMXmlNoRootDefault :: (Monad m, Xml a) => Rigidity m -> ReadM Maybe a
    +readMXmlNoRootDefault r
    + = do xs <- getXmls
    +      case readXml r xs of
    +          Nothing -> fail "Cannot read value"
    +          Just (xs', v) ->
    +              do putXmls xs'
    +                 return v
    +
    +xmlAttr :: Name -> Q [Dec]
    +xmlAttr newTypeName
    + = do i <- reify newTypeName
    +      case i of
    +          TyConI (NewtypeD _ n _ (NormalC c [(_, ConT t)]) _)
    +           | t == ''ByteString -> mkDecs n c t
    +          _ -> fail "xmlAttr: Didn't get what I wanted"
    +
    +    where mkDecs n c t =
    +            do let x = mkName "x"
    +                   f = mkName "f"
    +                   cstr = stringL $ first toLower $ nameBase c
    +                   toFun = funD
    +                             'toXml
    +                             [clause
    +                                 [conP c [varP x]]
    +                                 (normalB [| [Attr $(litE cstr)
    +                                                   $ BS.unpack $(varE x)] |])
    +                                 []]
    +
    +                   readFun = funD
    +                             'readXml
    +                             [clause
    +                                 []
    +                                 (normalB [| readXmlWith $(varE f) |])
    +                                 [readHelper]]
    +
    +                   readHelper
    +                    = funD f
    +                           [
    +                            clause [conP 'Attr [litP cstr, (varP x)]]
    +                                   (normalB [| Just $ $(conE c)
    +                                                    $ BS.pack $(varE x) |])
    +                                   [],
    +                            clause [wildP]
    +                                   (normalB [| Nothing |])
    +                                   []
    +                           ]
    +               inst <- instanceD (cxt [])
    +                                 ( conT ''Xml `appT` conT n)
    +                                 [toFun, readFun]
    +               return [inst]
    +
    +-- | xmlShowCData lifted to act on lists
    +xmlShowCDatas :: [Name] -> Q [Dec]
    +xmlShowCDatas = liftM concat . mapM xmlShowCData
    +
    +{- | automatically creates an Xml definition for a type that is an instance
    +of Show and Read.  This will result in an instance that converts the type to and from CData.
    +-}
    +xmlShowCData :: Name -> Q [Dec]
    +xmlShowCData newTypeName
    + = do d <- instanceD' (cxt [])
    +                      (conT ''Xml `appT` conT newTypeName)
    +                      [d|
    +                          toXml :: (Show a, Xml a) => a -> [Element]
    +                          toXml x = [CData $ show x]
    +
    +                          readXml :: (Read a, Xml a)
    +                                  => Rigidity m -> [Element]
    +                                  -> Maybe ([Element], a)
    +                          readXml = readXmlWith f
    +                              where f _ (CData x)
    +                                     | [(v, "")] <- reads x = Just v
    +                                    f _ _ = Nothing
    +                        |]
    +      return [d]
    +
    +-- | xmlCDataLists lifted to act on lists
    +xmlCDataLists :: [Name] -> Q [Dec]
    +xmlCDataLists = liftM concat . mapM xmlCDataList
    +
    +{- | Creates an instance similar to xmlShowCData except for lists of the
    +provided type -}
    +xmlCDataList :: Name -> Q [Dec]
    +xmlCDataList newTypeName
    + = do d <- instanceD' (cxt [])
    +                      (conT ''Xml `appT` (listT `appT` conT newTypeName))
    +                      [d|
    +                        toXml :: (Show a, Xml a) => [a] -> [Element]
    +                        toXml xs = [CData $ concat $ intersperse ","
    +                                          $ map show xs]
    +
    +                        readXml :: (Read a, Xml a)
    +                                => Rigidity m -> [Element]
    +                                -> Maybe ([Element], [a])
    +                        readXml = readXmlWith f
    +                            where f _ (CData x) =
    +                                      let list = words $ noCommas x
    +                                          is = concatMap reads list
    +                                      in if length is == length list
    +                                         then Just $ map fst is
    +                                         else Nothing
    +                                  f _ _ = Nothing
    +                       |]
    +      return [d]
    +
    +-- | Replaces commas in the string with single spaces
    +noCommas :: String -> String
    +noCommas = map (\x -> if x == ',' then ' ' else x)
    +
    +-- | Throws an error when called
    +typeNotValue :: Xml a => a -> a
    +typeNotValue t = error ("Type used as value: " ++ typeName)
    +    where typeName = dataTypeName (dataTypeOf xmlProxy t)
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml-HaXml.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml-HaXml.html 1 + + + + +src/Happstack/Data/Xml/HaXml.hs + + + +
    {-# LANGUAGE TemplateHaskell, FlexibleInstances,
    +             OverlappingInstances, UndecidableInstances #-}
    +
    +module Happstack.Data.Xml.HaXml where
    +
    +import Data.List
    +import Happstack.Data.Xml.Base
    +import qualified Text.XML.HaXml.Types as H
    +
    +-- | 
    +isAttr :: Element -> Bool
    +isAttr (Attr {}) = True
    +isAttr _ = False
    +
    +-- | Lifts toHaXml to act on lists of Elements 
    +toHaXmls :: [Element] -> [H.Content]
    +toHaXmls = map toHaXml
    +
    +-- | Converts the Element to HaXml Element if the Element is of the form
    +-- Elem _ _ 
    +toHaXmlEl :: Element -> H.Element
    +toHaXmlEl el = let H.CElem el' = toHaXml el in el'
    +
    +-- | Conversion function between the Happstack Element and HaXml Content types
    +toHaXml :: Element -> H.Content
    +toHaXml (Elem n es) = case partition isAttr es of
    +                      (as, xs) ->
    +                          H.CElem (H.Elem n (map toAttribute as) (toHaXmls xs))
    +toHaXml (CData x) = H.CString True x
    +-- We can't do better than wrap an attribute up in a fake element.
    +-- This shouldn't be happening in the real world anyway.
    +toHaXml a@(Attr {}) = toHaXml (Elem "JustAnAttr" [a])
    +
    +-- | Converts an Element that is an Attr into a HaXml Attribute.  Will throw
    +-- an error if provided the wrong constructor.
    +toAttribute :: Element -> H.Attribute
    +toAttribute (Attr k v) = (k, H.AttValue [Left v])
    +toAttribute _ = error "toAttribute: Can't happen"
    +
    +-- Is this function really necessary?
    +-- | Lifts fromHaXml to operate on lists
    +fromHaXmls :: [H.Content] -> [Element]
    +fromHaXmls = map fromHaXml
    +
    +-- | Converts a HaXml Content to an Element
    +fromHaXml :: H.Content -> Element
    +fromHaXml (H.CElem (H.Elem n as xs))
    +    = Elem n (fromAttributes as ++ fromHaXmls xs)
    +fromHaXml (H.CString _ x) = CData x
    +fromHaXml (H.CRef (H.RefEntity "amp")) = CData "&"
    +fromHaXml (H.CRef (H.RefEntity "lt")) = CData "<"
    +fromHaXml (H.CRef (H.RefEntity "gt")) = CData ">"
    +fromHaXml (H.CRef (H.RefEntity "apos")) = CData "'"
    +fromHaXml (H.CRef (H.RefEntity "quot")) = CData "\""
    +fromHaXml (H.CRef (H.RefEntity x)) = 
    +    error $ "fromHaXml: Not implemented ref:" ++ x
    +fromHaXml (H.CRef (H.RefChar x)) = 
    +    error $ "fromHaXml: Not implemented ref:" ++ (show x)
    +fromHaXml (H.CMisc (H.Comment _)) = CData ""
    +fromHaXml (H.CMisc (H.PI (_,_))) = CData ""
    +
    +-- | Lifts fromAttribute to act on lists
    +fromAttributes :: [H.Attribute] -> [Element]
    +fromAttributes = map fromAttribute
    +
    +-- | Will convert a HaXml attribute that is of the form [Left _] to a
    +-- Happstack Element.  Otherwise, will throw an error.
    +fromAttribute :: H.Attribute -> Element
    +fromAttribute (k, H.AttValue [Left v]) = Attr k v
    +fromAttribute _ = error "fromAttribute: Not implemented"
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml-Instances.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml-Instances.html 1 + + + + +src/Happstack/Data/Xml/Instances.hs + + + +
    {-# LANGUAGE TemplateHaskell, FlexibleInstances,
    +             OverlappingInstances, UndecidableInstances, CPP,
    +             TypeSynonymInstances, PatternGuards,
    +             MultiParamTypeClasses #-}
    +{-# OPTIONS -fno-warn-orphans #-}
    +-- These are orphaned instances This means the existance of this file causes
    +-- ghc to visit its .hi every time any file that depends on it in any way is
    +-- compiled, just to see if this instance is needed
    +
    +module Happstack.Data.Xml.Instances where
    +
    +import Data.List
    +import Happstack.Data.Xml.Base
    +import Data.Generics.SYB.WithClass.Basics
    +import Data.Generics.SYB.WithClass.Instances ()
    +import           Data.ByteString.Char8 (ByteString)
    +import qualified Data.ByteString.Char8 as BS
    +
    +import Happstack.Data.Default
    +
    +
    +
    +instance Xml Element where
    +    toXml = (:[])
    +
    +
    +-- The Xml [a] context is a bit scary, but if we don't have it then
    +-- GHC complains about overlapping instances
    +instance (Xml a, Xml [a]) => Xml [a] where
    +    toXml = concatMap toXml
    +    readXml r = f [] []
    +        where f acc_xs acc_vs [] = Just (reverse acc_xs, reverse acc_vs)
    +              f acc_xs acc_vs (x:xs) = case readXml r [x] of
    +                                           Just ([], v) ->
    +                                               f acc_xs (v:acc_vs) xs
    +                                           _ ->
    +                                               f (x:acc_xs) acc_vs xs
    +
    +
    +instance Xml Bool where
    +    toXml True = [CData "1"]
    +    toXml False = [CData "0"]
    +    readXml = readXmlWith f
    +        where f _ (CData "1") = Just True
    +              f _ (CData "0") = Just False
    +              f _ (CData "True") = Just True
    +              f _ (CData "False") = Just False
    +              f _ (CData "T") = Just True
    +              f _ (CData "F") = Just False
    +              f _ _ = Nothing
    +
    +instance Default Bool where defaultValue= False
    +
    +instance Xml String where
    +    toXml x = [CData x]
    +    readXml = readXmlWith f
    +        where f _ (CData x) = Just x
    +              f _ _ = Nothing
    +
    +instance Xml Char where
    +    toXml x = [CData [x]]
    +    readXml = readXmlWith f
    +        where f _ (CData [x]) = Just x
    +              f _ _ = Nothing
    +
    +instance Xml ByteString where
    +    toXml x = [CData $ BS.unpack x]
    +    readXml = readXmlWith f
    +        where f _ (CData x) = Just $ BS.pack x
    +              f _ _ = Nothing
    +
    +instance Xml [String] where
    +    toXml xs = [CData $ concat $ intersperse "," xs]
    +    readXml = readXmlWith f
    +        where f _ (CData x) = Just $ words $ noCommas x
    +              f _ _ = Nothing
    +
    +$( xmlShowCDatas [''Int, ''Integer, ''Float, ''Double] )
    +$( xmlCDataLists [''Int, ''Integer, ''Float, ''Double] )
    +
    +
    +instance Xml a => Xml (Maybe a) where
    +    toXml = transparentToXml
    +    -- We can't use transparentReadXml or Nothing would always win, as
    +    -- it is first in the list of constructors
    +    readXml r = aConstrFromElements r
    +              $ map (toConstr xmlProxy) [Just (), Nothing]
    +
    +$( transparentXml ''Either )
    +$( transparentXml ''() )
    +$( transparentXml ''(,) )
    +$( transparentXml ''(,,) )
    +$( transparentXml ''(,,,) )
    +
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml-PrintParse.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml-PrintParse.html 1 + + + + +src/Happstack/Data/Xml/PrintParse.hs + + + +
    {-# LANGUAGE TemplateHaskell, FlexibleInstances, CPP,
    +             OverlappingInstances, UndecidableInstances,
    +             DeriveDataTypeable, MultiParamTypeClasses #-}
    +
    +module Happstack.Data.Xml.PrintParse where
    +
    +import Control.Monad
    +import Text.PrettyPrint.HughesPJ
    +import Text.XML.HaXml.Parse
    +import Text.XML.HaXml.Pretty
    +import Text.XML.HaXml.Types (Document(Document), Content(CElem))
    +import Happstack.Data.Xml.Base
    +import Happstack.Data.Xml.HaXml
    +import Data.Generics as G
    +import Happstack.Data.DeriveAll
    +import Happstack.Data.Default
    +
    +$(deriveAll [''Read,''Show,''Default]
    +  [d|
    +      data W = W [K]
    +      data K = K String
    +   |]
    + )
    +
    +
    +class ToString a where toString::a->String
    +instance ToString [Element] where
    +    toString = render . vcat . map (content . toHaXml)
    +
    +instance ToString Element where
    +    toString = render . content . toHaXml
    +
    +instance (Xml a,G.Data a) => ToString a where 
    +    toString = toString . toXml
    +
    +
    +class FromString a where
    +    fromString :: Monad m => Rigidity m -> String -> m a
    +
    +instance FromString Element where
    +    fromString _ s = case xmlParse "NoFile" s of
    +                       Document _ _ e _ ->
    +                           return $ fromHaXml $ CElem e
    +                       -- XXX Currently we assume this always succeeds,
    +                       -- but we should be allowing for the possibility of
    +                       -- failure
    +                       -- _ -> Nothing
    +
    +instance FromString [Element] where
    +    fromString r s = liftM (: []) $ fromString r s
    +
    +instance (Xml a,G.Data a) => FromString a where
    +    fromString r x = fromString r x >>= fromXml r
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data-Xml.html 1 + + + + +src/Happstack/Data/Xml.hs + + + +
    
    +module Happstack.Data.Xml (
    +    module Happstack.Data.Xml.Base,
    +    module Happstack.Data.Xml.PrintParse) where
    +
    +import Happstack.Data.Xml.Base
    +import Happstack.Data.Xml.PrintParse
    +import Happstack.Data.Xml.Instances ()
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/Happstack-Data.html hunk ./docs/0.5.0/happstack-data/src/Happstack-Data.html 1 + + + + +src/Happstack/Data.hs + + + +
    module Happstack.Data
    +   (
    +    module Data.Typeable
    +   ,module Happstack.Data.Default
    +   ,module Happstack.Data.DeriveAll
    +   ,module Happstack.Data.Migrate
    +   ,module Happstack.Data.Normalize
    +   ,module Happstack.Data.Pairs
    +   ,module Happstack.Data.Xml
    +   ,module Happstack.Data.GOps
    +   ,module Happstack.Data.Serialize
    +   ,module Happstack.Data.SerializeTH
    +   )
    +where
    +
    +import Happstack.Data.GOps
    +import Data.Typeable
    +import Happstack.Data.Default
    +import Happstack.Data.DeriveAll
    +import Happstack.Data.Migrate
    +import Happstack.Data.Normalize
    +import Happstack.Data.Pairs
    +import Happstack.Data.Xml
    +import Happstack.Data.Serialize hiding (migrate, Migrate)
    +import Happstack.Data.SerializeTH
    +
    +
    + addfile ./docs/0.5.0/happstack-data/src/hscolour.css hunk ./docs/0.5.0/happstack-data/src/hscolour.css 1 +.hs-keyglyph, .hs-layout {color: red;} +.hs-keyword {color: blue;} +.hs-comment, .hs-comment a {color: green;} +.hs-str, .hs-chr {color: teal;} +.hs-keyword, .hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {} adddir ./docs/0.5.0/happstack-ixset addfile ./docs/0.5.0/happstack-ixset.haddock binary ./docs/0.5.0/happstack-ixset.haddock oldhex * newhex *0d0cface000f00005c0d0000587731000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000002000000 *050000000000000002000000060000000000000002000000070000000000000002000000080000 *0000000000020000000900000000000000020000000a00000000000000020000000b0000000000 *0000020000000c00000000000000020000000d00000000000000020000000e0000000000000002 *0000000f0000000000000002000000100000000000000002000000110000000000000002000000 *120000000000000002000000130000000000000002000000140000000000000002000000150000 *000000000002000000160000000000000002000000170000000000000002000000180000000000 *0000020000001900000000000000020000001a00000000000000020000001b0000000000000002 *0000001c00000000000000020000001d00000000000000020000001e0000000000000002000000 *1f0000000000000002000000200000000000000002000000210000000000000002000000220000 *000000000002000000230000000000000002000000240000000000000002000000250000000000 *000002000000260000000000000002000000270000000000000002000000280000000000000002 *0000002900000000000000020000002a00000000000000020000002b0000000000000002000000 *2c00000000000000020000002d00000000000000020000002e00000000000000020000002f0000 *000000000002000000300000000000000002020000000000000001000000000800000000010301 *040200000001000000000102060000002000000069000000730000002000000061000000200104 *010000003101020b0000002000000066000000720000006f0000006d0000002000000073000000 *6f0000006d00000065000000200104010000003201021c000000200000006b0000006500000079 *00000020000000740000006f000000200000006100000020000000730000006500000074000000 *200000006f000000660000002000000076000000610000006c0000007500000065000000730000 *0020000000660000006f000000720000000a01020c000000200000007400000068000000610000 *0074000000200000006b00000065000000790000002e0000002000000020010402000000010000 *000002220000002000000063000000610000007200000072000000690000006500000073000000 *200000007400000079000000700000006500000020000000690000006e000000660000006f0000 *00720000006d0000006100000074000000690000006f0000006e00000020000000690000006e00 *0000730000006900000064000000650000002e0000000a00000000010000000000330000000000 *340000000000350000000000360000000000020103010228000000430000006f0000006e000000 *76000000650000006e00000069000000650000006e000000630000006500000020000000660000 *00750000006e0000006300000074000000690000006f0000006e00000020000000660000006f00 *00007200000020000000690000006e00000073000000650000007200000074000000690000006e *0000006700000020000000690000006e000000740000006f000000200104010000003101020500 *000073000000200000006f00000066000000200104010000003701020800000073000000200000 *00610000007300000020000000690000006e0000000a0102100000002000000074000000680000 *00650000002000000063000000610000007300000065000000200000006f000000660000002000 *0000610000006e00000020010402000000010000000001022c0000002e00000020000000200000 *0049000000660000002000000074000000680000006500000079000000200000006b0000006500 *00007900000020000000640000006900000064000000200000006e0000006f0000007400000020 *000000610000006c00000072000000650000006100000064000000790000002000000065000000 *7800000069000000730000007400000020000000690000006e0000002000000074000000680000 *00650000000a010201000000200104010000003101020d0000002c000000200000007400000068 *000000650000006e0000002000000061000000200000006e000000650000007700000020010401 *000000370219000000200000006900000073000000200000006100000064000000640000006500 *000064000000200000007400000072000000610000006e00000073000000700000006100000072 *000000650000006e000000740000006c000000790000002e0000000a0000000003010301022700 *0000430000006f0000006e00000076000000650000006e00000069000000650000006e00000063 *000000650000002000000066000000750000006e0000006300000074000000690000006f000000 *6e00000020000000660000006f000000720000002000000064000000650000006c000000650000 *0074000000690000006e000000670000002000000066000000720000006f0000006d0000002001 *04010000003101020500000073000000200000006f000000660000002001040100000037010209 *00000073000000200000004900000066000000200000007400000068000000650000000a01020b *00000020000000720000006500000073000000750000006c00000074000000690000006e000000 *67000000200104010000003701022e00000020000000690000007300000020000000650000006d *0000007000000074000000790000002c000000200000007400000068000000650000006e000000 *2000000074000000680000006500000020000000650000006e0000007400000072000000790000 *002000000069000000730000002000000072000000650000006d0000006f000000760000006500 *0000640000002000000066000000720000006f0000006d00000020000000740000006800000065 *000000200104010000003102020000002e0000000a000400000000000000010000000200000003 *040000000000000001000000020000000300040000000001000000010000000100000000020000 *00000300000000000000000201022f000000410000006e00000020000000650000006600000066 *000000690000006300000069000000650000006e0000007400000020000000690000006d000000 *700000006c000000650000006d000000650000006e000000740000006100000074000000690000 *006f0000006e000000200000006f00000066000000200000007100000075000000650000007200 *00007900000061000000620000006c000000650000002000000073000000650000007400000073 *0000002e0000000a000000360000000400000000000501030104010000000501022e0000002000 *0000630000006c0000006100000073000000730000002000000064000000650000006600000069 *0000006e0000006500000073000000200000006f000000620000006a0000006500000063000000 *740000007300000020000000740000006800000061000000740000002000000063000000610000 *006e000000200000006200000065000000200000006d000000650000006d000000620000006500 *00007200000073000000200000006f0000006600000020010401000000080102030000002e0000 *00200000000a01020f000000200000002000000020000000200000002000000049000000660000 *0020000000790000006f0000007500000020000000640000006f0000006e010201000000270102 *1d000000740000002000000077000000610000006e000000740000002000000063000000610000 *006c00000063000000750000006c00000061000000740000006500000064000000200000007600 *0000610000006c0000007500000065000000730000002000000075000000730000006500000020 *0107010401000000050205000000200000006100000020000000280000002902020000002e0000 *000a000000000601030102070000004d0000006500000074000000680000006f00000064000000 *200104010000000601021700000020000000640000006500000066000000690000006e00000065 *00000073000000200000007700000068000000610000007400000020000000610000006e000000 *20000000650000006d000000700000007400000079000000200104010000000801020a00000020 *000000660000006f0000007200000020000000740000006800000069000000730000000a010241 *00000020000000700000006100000072000000740000006900000063000000750000006c000000 *610000007200000020000000740000007900000070000000650000002000000073000000680000 *006f000000750000006c00000064000000200000006c0000006f0000006f0000006b0000002000 *00006c000000690000006b000000650000002e0000002000000020000000490000007400000020 *00000073000000680000006f000000750000006c00000064000000200000006800000061000000 *760000006500000020000000610000006c0000006c000000200000006e00000065000000630000 *006500000073000000730000006100000072000000790000000a01020e00000020000000690000 *006e00000064000000690000006300000065000000730000002e00000020000000550000007300 *0000650000002001040100000009021d0000002000000066000000750000006e00000063000000 *74000000690000006f0000006e00000020000000740000006f0000002000000063000000720000 *006500000061000000740000006500000020000000740000006800000065000000200000007300 *000065000000740000002e0000000a000000000701030102070000004d00000065000000740000 *00680000006f000000640000002001040100000007010228000000200000006100000064000000 *640000007300000020000000690000006e00000064000000650000007800000061000000620000 *006c000000650000002000000076000000610000006c0000007500000065000000730000002000 *00006e0000006f0000007400000020000000660000006f000000750000006e0000006400000020 *000000690000006e000000200000007400000068000000650000000a01023e0000002000000074 *0000007900000070000000650000002e0000002000000054000000680000006f00000073000000 *6500000020000000650000006e0000006400000020000000750000007000000020000000690000 *006e00000020000000690000006e00000064000000690000006300000065000000730000002000 *00006a000000750000007300000074000000200000006c000000690000006b0000006500000020 *0000006f0000007400000068000000650000007200000020000000740000007900000070000000 *650000007300000020000000660000006f000000750000006e0000006400000020000000690000 *006e0000000a010214000000200000006f000000620000006a0000006500000063000000740000 *00730000002e00000020000000490000006600000020000000790000006f000000750000002000 *0000640000006f0000006e01020100000027010226000000740000002000000077000000610000 *006e0000007400000020000000610000006e000000790000002000000063000000610000006c00 *000063000000750000006c00000061000000740000006500000064000000200000007600000061 *0000006c000000750000006500000073000000200000006a000000750000007300000074000000 *200000007500000073000000650000000a010201000000200104010000000a02020000002e0000 *000a0000000008000000000038000000000009010301020a000000430000007200000065000000 *61000000740000006500000020000000610000006e000000200104010000000801022200000020 *0000007500000073000000690000006e00000067000000200000006c0000006900000073000000 *74000000200000006f0000006600000020000000690000006e0000006400000069000000630000 *0065000000730000002e0000002000000055000000730000006500000066000000750000006c00 *000020000000690000006e00000020010401000000050102010000000a01020100000020010401 *000000060209000000200000006d0000006500000074000000680000006f000000640000002e00 *00000a000000003900000000003a00000000000a010301021800000046000000750000006e0000 *006300000074000000690000006f0000006e00000020000000740000006f000000200000006200 *000065000000200000007500000073000000650000006400000020000000660000006f00000072 *000000200104010000000701021300000020000000690000006e00000020000000740000006800 *0000650000002000000063000000610000007300000065000000200000006f0000006600000020 *000000610000006e00000020010701040100000005020500000020000000610000002000000028 *000000290102010000000a020b00000020000000690000006e0000007300000074000000610000 *006e00000063000000650000002e0000000a000000000b01010301023f00000054000000650000 *006d000000700000006c0000006100000074000000650000002000000048000000610000007300 *00006b000000650000006c0000006c0000002000000068000000650000006c0000007000000065 *000000720000002000000066000000750000006e0000006300000074000000690000006f000000 *6e00000020000000660000006f00000072000000200000006100000075000000740000006f0000 *006d00000061000000740000006900000063000000610000006c0000006c000000790000002000 *00006200000075000000690000006c00000064000000690000006e000000670000002000000061 *0000006e0000000a01020300000020000000200000002001040100000005022100000020000000 *690000006e0000007300000074000000610000006e000000630000006500000020000000660000 *00720000006f0000006d0000002000000061000000200000006400000061000000740000006100 *000020000000740000007900000070000000650000002c00000020000000650000002e00000067 *0000002e0000000a01070219000000640000006100000074000000610000002000000046000000 *6f0000006f000000200000003d00000020000000460000006f0000006f00000020000000490000 *006e0000007400000020000000530000007400000072000000690000006e000000670103020400 *0000610000006e000000640000000a010701020d0000002400000028000000690000006e000000 *660000006500000072000000490000007800000053000000650000007400000020010201000000 *22010205000000460000006f0000006f0000004400000042010201000000220102010000002001 *02010000002701020100000027010204000000460000006f0000006f0000002001020100000027 *0102090000006e0000006f00000043000000610000006c0000006300000073000000200000005b *0102010000002701020100000027010204000000490000006e000000740000002c010201000000 *2701020100000027010206000000530000007400000072000000690000006e0000006701020100 *00005d0201000000290103021b00000077000000690000006c0000006c00000020000000620000 *0075000000690000006c0000006400000020000000610000002000000074000000790000007000 *0000650000002000000073000000790000006e0000006f0000006e000000790000006d00000020 *0000000a010702160000007400000079000000700000006500000020000000460000006f000000 *6f0000004400000042000000200000003d00000020000000490000007800000053000000650000 *007400000020000000460000006f0000006f010301020500000077000000690000007400000068 *0000002001070203000000490000006e0000007401020500000020000000610000006e00000064 *0000002001070206000000530000007400000072000000690000006e00000067020d0000002000 *0000610000007300000020000000690000006e0000006400000069000000630000006500000073 *0000002e0000000a01030102440000005700000041000000520000004e000000490000004e0000 *00470000003a000000200000005400000068000000650000002000000074000000790000007000 *000065000000200000007300000070000000650000006300000069000000660000006900000065 *000000640000002000000061000000730000002000000074000000680000006500000020000000 *660000006900000072000000730000007400000020000000690000006e00000064000000650000 *0078000000200000006d0000007500000073000000740000002000000062000000650000002000 *000061000000200000007400000079000000700000006500000020000000770000006800000069 *00000063000000680000000a010220000000200000002000000020000000610000007000000070 *0000006500000061000000720000007300000020000000690000006e0000002000000061000000 *6c0000006c0000002000000076000000610000006c000000750000006500000073000000200000 *00690000006e000000200000007400000068000000650000002001040100000008010204000000 *200000006f00000072000000200104010000001501020500000020000000610000006e00000064 *00000020010401000000110102060000002000000077000000690000006c0000006c0000000a01 *024e0000002000000020000000200000006e0000006f0000007400000020000000660000007500 *00006e0000006300000074000000690000006f0000006e0000002000000070000000720000006f *0000007000000065000000720000006c000000790000002e00000020000000590000006f000000 *750000002000000077000000690000006c0000006c000000200000006200000065000000200000 *007700000061000000720000006e0000006500000064000000200000006e0000006f0000007400 *000020000000740000006f00000020000000640000006f00000020000000740000006800000069 *000000730000002000000062000000790000002000000072000000750000006e00000074000000 *690000006d00000065000000200000006500000072000000720000006f000000720000002e0000 *000a023c000000200000002000000020000000590000006f000000750000002000000063000000 *610000006e00000020000000610000006c00000077000000610000007900000073000000200000 *007500000073000000650000002000000074000000680000006500000020000000650000006c00 *0000650000006d000000650000006e000000740000002000000074000000790000007000000065 *00000020000000690000007400000073000000650000006c000000660000002e00000020000000 *460000006f00000072000000200000006500000078000000610000006d000000700000006c0000 *00650000003a0000000a0701020d0000002400000028000000690000006e000000660000006500 *000072000000490000007800000053000000650000007400000020010201000000220102050000 *00460000006f0000006f0000004400000042010201000000220102010000002001020100000027 *01020100000027010204000000460000006f0000006f0000002001020100000027010209000000 *6e0000006f00000043000000610000006c0000006300000073000000200000005b010201000000 *2701020100000027010205000000460000006f0000006f0000002c000000200102010000002701 *020100000027010205000000490000006e000000740000002c0000002001020100000027010201 *00000027010206000000530000007400000072000000690000006e000000670102010000005d02 *0100000029000000003b00000000003c01010301024200000047000000650000006e0000006500 *0000720000006900000063000000610000006c0000006c00000079000000200000007400000072 *000000610000007600000065000000720000007300000065000000730000002000000074000000 *680000006500000020000000610000007200000067000000750000006d000000650000006e0000 *007400000020000000610000006e0000006400000020000000630000006f0000006e0000007600 *00006500000072000000740000007300000020000000610000006c0000006c0000002000000064 *00000061000000740000006100000020000000690000006e000000200000006900000074000000 *20000000740000006f0000000a0102010000002001020700000044000000790000006e00000061 *0000006d000000690000006301023000000020000000610000006e000000640000002000000072 *000000650000007400000075000000720000006e0000007300000020000000610000006c000000 *6c0000002000000074000000680000006500000020000000690000006e00000074000000650000 *00720000006e000000610000006c00000020000000640000006100000074000000610000002000 *000061000000730000002000000061000000200000006c00000069000000730000007400000020 *0000006f000000660000002001020700000044000000790000006e000000610000006d00000069 *0000006302020000002e0000000a0301021f000000540000006800000069000000730000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000002000000070 *000000720000006f0000007000000065000000720000006c000000790000002000000068000000 *610000006e000000640000006c0000006500000073000000200104010000003d01020400000020 *0000006100000073000000200104010000003d010208000000200000006e0000006f0000007400 *00002000000061000000730000002001070102010000005b0104010000003e02010000005d0202 *0000002e0000000a000000000c0103010224000000480000006900000067000000680000006500 *000072000000200000006f00000072000000640000006500000072000000200000006f00000070 *000000650000007200000061000000740000006f0000007200000020000000660000006f000000 *72000000200000006d0000006f00000064000000690000006600000079000000690000006e0000 *00670000002001040100000008010217000000730000002e000000200000002000000055000000 *730000006500000020000000740000006800000069000000730000002000000077000000680000 *00650000006e00000020000000790000006f00000075000000720000000a010225000000200000 *0066000000690000006e000000610000006c0000002000000066000000750000006e0000006300 *000074000000690000006f0000006e0000002000000073000000680000006f000000750000006c *000000640000002000000068000000610000007600000065000000200000007400000068000000 *6500000020000000660000006f000000720000006d000000200107021700000061000000200000 *002d0000003e000000200000004900000078000000530000006500000074000000200000006100 *0000200000002d0000003e00000020000000490000007800000053000000650000007400000020 *000000610102020000002c0000000a01020600000020000000650000002e000000670000002e00 *0000200104010000000d010204000000200000006f00000072000000200104010000000e020200 *00002e0000000a000000000d0103010219000000490000006e0000007300000065000000720000 *00740000007300000020000000610000006e000000200000006900000074000000650000006d00 *000020000000690000006e000000740000006f0000002000000074000000680000006500000020 *0104010000000801021f0000002e00000020000000490000006600000020000000790000006f00 *000075000000720000002000000064000000610000007400000061000000200000006800000061 *0000007000000070000000650000006e0000007300000020000000740000006f00000020000000 *680000006100000076000000650000000a01023b00000020000000700000007200000069000000 *6d000000610000007200000079000000200000006b000000650000007900000020000000740000 *006800000069000000730000002000000066000000750000006e00000063000000740000006900 *00006f0000006e000000200000006d00000069000000670000006800000074000000200000006e *0000006f0000007400000020000000620000006500000020000000770000006800000061000000 *7400000020000000790000006f000000750000002000000077000000610000006e000000740000 *002e000000200000005300000065000000650000000a010201000000200104010000000f020200 *00002e0000000a000000000e010301021900000052000000650000006d0000006f000000760000 *00650000007300000020000000610000006e000000200000006900000074000000650000006d00 *00002000000066000000720000006f0000006d0000002000000074000000680000006500000020 *0104010000000802020000002e0000000a000000000f010301023f00000057000000690000006c *0000006c000000200000007200000065000000700000006c000000610000006300000065000000 *20000000740000006800000065000000200000006900000074000000650000006d000000200000 *007700000069000000740000006800000020000000690000006e00000064000000650000007800 *0000200000006b0000002e00000020000000200000004f0000006e0000006c0000007900000020 *000000770000006f000000720000006b0000007300000020000000690000006600000020000000 *740000006800000065000000720000006500000020000000690000007300000020000000610000 *00740000000a010226000000200000006d0000006f0000007300000074000000200000006f0000 *006e00000065000000200000006900000074000000650000006d00000020000000770000006900 *00007400000068000000200000007400000068000000610000007400000020000000690000006e *00000064000000650000007800000020000000690000006e000000200000007400000068000000 *6500000020010401000000080102120000002e0000002000000057000000690000006c0000006c *000000200000006e0000006f00000074000000200000006300000068000000610000006e000000 *67000000650000000a010201000000200104010000000802300000002000000069000000660000 *0020000000790000006f0000007500000020000000680000006100000076000000650000002000 *00006d0000006f0000007200000065000000200000007400000068000000650000006e00000020 *00000031000000200000006900000074000000650000006d000000200000007700000069000000 *740000006800000020000000670000006900000076000000650000006e00000020000000690000 *006e0000006400000065000000780000002e0000000a0000000010010301023e00000057000000 *690000006c0000006c0000002000000064000000650000006c0000006500000074000000650000 *0020000000740000006800000065000000200000006900000074000000650000006d0000002000 *00007700000069000000740000006800000020000000690000006e000000640000006500000078 *000000200000006b0000002e00000020000000200000004f0000006e0000006c00000079000000 *20000000770000006f000000720000006b00000073000000200000006900000066000000200000 *007400000068000000650000007200000065000000200000006900000073000000200000006100 *0000740000000a010226000000200000006d0000006f0000007300000074000000200000006f00 *00006e00000065000000200000006900000074000000650000006d000000200000007700000069 *000000740000006800000020000000740000006800000061000000740000002000000069000000 *6e00000064000000650000007800000020000000690000006e0000002000000074000000680000 *006500000020010401000000080102120000002e0000002000000057000000690000006c000000 *6c000000200000006e0000006f00000074000000200000006300000068000000610000006e0000 *0067000000650000000a0102010000002001040100000008023000000020000000690000006600 *000020000000790000006f00000075000000200000006800000061000000760000006500000020 *0000006d0000006f0000007200000065000000200000007400000068000000650000006e000000 *2000000031000000200000006900000074000000650000006d0000002000000077000000690000 *00740000006800000020000000670000006900000076000000650000006e000000200000006900 *00006e0000006400000065000000780000002e0000000a0000000011010301020c000000430000 *006f0000006e000000760000006500000072000000740000007300000020000000610000006e00 *0000200104010000000801020600000020000000740000006f0000002000000061000000200104 *01000000370212000000200000006f000000660000002000000069000000740000007300000020 *000000650000006c000000650000006d000000650000006e00000074000000730000002e000000 *0a000000003f010301021000000054000000610000006b00000065000000730000002000000061 *000000200000006c000000690000007300000074000000200000006f0000006600000020010402 *00000001000000000102190000007300000020000000610000006e000000640000002000000063 *0000006f0000006e00000076000000650000007200000074000000730000002000000069000000 *7400000020000000690000006e000000740000006f000000200000006100000020010401000000 *3702020000002e0000000a0000000012010301020b000000430000006f0000006e000000760000 *006500000072000000740000007300000020000000610000002001040100000037010207000000 *20000000740000006f00000020000000610000006e000000200104010000000802020000002e00 *00000a0000000040010301020b000000430000006f0000006e0000007600000065000000720000 *007400000073000000200000006100000020010401000000370102070000002000000074000000 *6f00000020000000610000006e000000200104010000000802020000002e0000000a0000000013 *0103010216000000430000006f0000006e00000076000000650000007200000074000000730000 *002000000061000000200000006c00000069000000730000007400000020000000740000006f00 *000020000000610000006e000000200104010000000802020000002e0000000a00000000140103 *01022a00000052000000650000007400000075000000720000006e000000730000002000000074 *0000006800000065000000200000006e000000750000006d000000620000006500000072000000 *200000006f0000006600000020000000750000006e000000690000007100000075000000650000 *00200000006900000074000000650000006d0000007300000020000000690000006e0000002000 *0000740000006800000065000000200104010000000802020000002e0000000a00000000150103 *01020c000000430000006f0000006e000000760000006500000072000000740000007300000020 *000000610000006e0000002001040100000008021a00000020000000740000006f000000200000 *00690000007400000073000000200000006c000000690000007300000074000000200000006f00 *00006600000020000000650000006c000000650000006d000000650000006e0000007400000073 *0000002e0000000a00000000410103010213000000430000006f0000006e000000760000006500 *00007200000074000000730000002000000061000000200000006c000000690000007300000074 *000000200000006f00000066000000200104020000000100000000021800000073000000200000 *00740000006f000000200000006c000000690000007300000074000000200000006f0000006600 *000020000000650000006c000000650000006d000000650000006e00000074000000730000002e *000000200000000a00000000160103010207000000490000006600000020000000740000006800 *000065000000200104010000000801023a00000020000000690000007300000020000000610000 *002000000073000000690000006e000000670000006c00000065000000740000006f0000006e00 *00002000000069000000740000002000000077000000690000006c0000006c0000002000000072 *000000650000007400000075000000720000006e00000020000000740000006800000065000000 *200000006f0000006e00000065000000200000006900000074000000650000006d000000200000 *0073000000740000006f00000072000000650000006400000020000000690000006e0000002000 *000069000000740000002e0000000a010204000000200000004900000066000000200104010000 *000801023500000020000000690000007300000020000000650000006d00000070000000740000 *0079000000200000006f0000007200000020000000680000006100000073000000200000006d00 *0000610000006e0000007900000020000000650000006c000000650000006d000000650000006e *000000740000007300000020000000740000006800000069000000730000002000000066000000 *750000006e0000006300000074000000690000006f0000006e0000002000000072000000650000 *007400000075000000720000006e00000073000000200104010000004202020000002e0000000a *000000001701030102050000004c000000690000006b000000650000002001040100000016021f *000000200000007700000069000000740000006800000020000000610000002000000075000000 *7300000065000000720000002000000070000000720000006f0000007600000069000000640000 *0065000000640000002000000064000000650000006600000061000000750000006c0000007400 *00002e0000000a0000000018010301020700000052000000650000007400000075000000720000 *006e00000020010401000000430102080000002000000069000000660000002000000074000000 *6800000065000000200104010000000801020b0000002000000069000000730000002000000065 *0000006d0000007000000074000000790000002c0000002001040100000044020c000000200000 *006f00000074000000680000006500000072000000770000006900000073000000650000002e00 *00000a00000000190103010209000000410000006e00000020000000690000006e000000660000 *006900000078000000200104010000001c020c000000200000006f000000700000006500000072 *0000006100000074000000690000006f0000006e0000002e0000000a000000001a010301020900 *0000410000006e00000020000000690000006e0000006600000069000000780000002001040100 *00001b020c000000200000006f0000007000000065000000720000006100000074000000690000 *006f0000006e0000002e0000000a000000001b010301021b00000054000000610000006b000000 *65000000730000002000000074000000680000006500000020000000750000006e000000690000 *006f0000006e000000200000006f00000066000000200000007400000068000000650000002000 *000074000000770000006f00000020010401000000080203000000730000002e0000000a000000 *001c010301022200000054000000610000006b0000006500000073000000200000007400000068 *0000006500000020000000690000006e0000007400000065000000720000007300000065000000 *6300000074000000690000006f0000006e000000200000006f0000006600000020000000740000 *0068000000650000002000000074000000770000006f0000002001040100000008020300000073 *0000002e0000000a000000001d0103010211000000490000006e00000066000000690000007800 *00002000000076000000650000007200000073000000690000006f0000006e000000200000006f *00000066000000200104010000002802020000002e0000000a000000001e010301021100000049 *0000006e0000006600000069000000780000002000000076000000650000007200000073000000 *690000006f0000006e000000200000006f00000066000000200104010000002902020000002e00 *00000a000000001f0103010211000000490000006e000000660000006900000078000000200000 *0076000000650000007200000073000000690000006f0000006e000000200000006f0000006600 *0000200104010000002a02020000002e0000000a00000000200103010211000000490000006e00 *00006600000069000000780000002000000076000000650000007200000073000000690000006f *0000006e000000200000006f00000066000000200104010000002b02020000002e0000000a0000 *0000210103010211000000490000006e0000006600000069000000780000002000000076000000 *650000007200000073000000690000006f0000006e000000200000006f00000066000000200104 *010000002c02020000002e0000000a00000000220103023c000000520000006500000074000000 *75000000720000006e000000730000002000000074000000680000006500000020000000730000 *007500000062000000730000006500000074000000200000007700000069000000740000006800 *000020000000690000006e00000064000000690000006300000065000000730000002000000069 *0000006e00000020000000740000006800000065000000200000006f0000007000000065000000 *6e00000020000000690000006e00000074000000650000007200000076000000610000006c0000 *0020000000280000006b0000002c0000006b000000290000002e0000000a00000000230103022a *00000052000000650000007400000075000000720000006e000000730000002000000074000000 *680000006500000020000000730000007500000062000000730000006500000074000000200000 *007700000069000000740000006800000020000000690000006e00000064000000690000006300 *0000650000007300000020000000690000006e000000200000005b0000006b0000002c0000006b *000000290000002e0000000a000000002401030102270000005200000065000000740000007500 *0000720000006e0000007300000020000000740000006800000065000000200000007300000075 *000000620000007300000065000000740000002000000077000000690000007400000068000000 *20000000690000006e000000640000006900000063000000650000007300000020000000690000 *006e00000020000000280000006b0000002c0000006b0102010000005d02020000002e0000000a *0000000025010301022700000052000000650000007400000075000000720000006e0000007300 *000020000000740000006800000065000000200000007300000075000000620000007300000065 *00000074000000200000007700000069000000740000006800000020000000690000006e000000 *640000006900000063000000650000007300000020000000690000006e000000200000005b0000 *006b0000002c0000006b0102010000005d02020000002e0000000a00000000260103023b000000 *430000007200000065000000610000007400000065000000730000002000000074000000680000 *006500000020000000730000007500000062000000730000006500000074000000200000007400 *00006800000061000000740000002000000068000000610000007300000020000000610000006e *00000020000000690000006e00000064000000650000007800000020000000690000006e000000 *200000007400000068000000650000002000000070000000720000006f00000076000000690000 *00640000006500000064000000200000006c0000006900000073000000740000002e0000000a00 *000000270103023a00000043000000720000006500000061000000740000006500000073000000 *200000007400000068000000650000002000000073000000750000006200000073000000650000 *00740000002000000074000000680000006100000074000000200000006d000000610000007400 *00006300000068000000650000007300000020000000610000006c0000006c0000002000000074 *00000068000000650000002000000070000000720000006f000000760000006900000064000000 *650000006400000020000000690000006e00000064000000690000006300000065000000730000 *002e0000000a000000002801030102410000005200000065000000740000007500000072000000 *6e0000007300000020000000740000006800000065000000200000007300000075000000620000 *007300000065000000740000002000000077000000690000007400000068000000200000006100 *00006e00000020000000690000006e000000640000006500000078000000200000006500000071 *00000075000000610000006c00000020000000740000006f000000200000007400000068000000 *650000002000000070000000720000006f00000076000000690000006400000065000000640000 *00200000006b00000065000000790000002e000000200000002000000054000000680000006500 *00000a01023f00000020000000730000006500000074000000200000006d000000750000007300 *00007400000020000000620000006500000020000000690000006e000000640000006500000078 *0000006500000064000000200000006f000000760000006500000072000000200000006b000000 *650000007900000020000000740000007900000070000000650000002c00000020000000640000 *006f000000690000006e00000067000000200000006f0000007400000068000000650000007200 *00007700000069000000730000006500000020000000720000006500000073000000750000006c *000000740000007300000020000000690000006e0000000a021000000020000000720000007500 *00006e00000074000000690000006d00000065000000200000006500000072000000720000006f *000000720000002e0000000a000000002901030102420000005200000065000000740000007500 *0000720000006e0000007300000020000000740000006800000065000000200000007300000075 *000000620000007300000065000000740000002000000077000000690000007400000068000000 *20000000610000006e00000020000000690000006e000000640000006500000078000000200000 *006c000000650000007300000073000000200000007400000068000000610000006e0000002000 *00007400000068000000650000002000000070000000720000006f000000760000006900000064 *0000006500000064000000200000006b00000065000000790000002e0000002000000020000000 *5400000068000000650000000a01023f0000002000000073000000650000007400000020000000 *6d00000075000000730000007400000020000000620000006500000020000000690000006e0000 *006400000065000000780000006500000064000000200000006f00000076000000650000007200 *0000200000006b000000650000007900000020000000740000007900000070000000650000002c *00000020000000640000006f000000690000006e00000067000000200000006f00000074000000 *680000006500000072000000770000006900000073000000650000002000000072000000650000 *0073000000750000006c000000740000007300000020000000690000006e0000000a0210000000 *2000000072000000750000006e00000074000000690000006d0000006500000020000000650000 *0072000000720000006f000000720000002e0000000a000000002a010301024000000052000000 *650000007400000075000000720000006e00000073000000200000007400000068000000650000 *002000000073000000750000006200000073000000650000007400000020000000770000006900 *0000740000006800000020000000610000006e00000020000000690000006e0000006400000065 *000000780000002000000067000000720000006500000061000000740000006500000072000000 *200000007400000068000000610000006e00000020000000740000006800000065000000200000 *0070000000720000006f0000007600000069000000640000006500000064000000200000006b00 *000065000000790000002e0000000a010243000000200000005400000068000000650000002000 *0000730000006500000074000000200000006d0000007500000073000000740000002000000062 *0000006500000020000000690000006e0000006400000065000000780000006500000064000000 *200000006f000000760000006500000072000000200000006b0000006500000079000000200000 *00740000007900000070000000650000002c00000020000000640000006f000000690000006e00 *000067000000200000006f00000074000000680000006500000072000000770000006900000073 *0000006500000020000000720000006500000073000000750000006c0000007400000073000000 *20000000690000006e0000000a02100000002000000072000000750000006e0000007400000069 *0000006d00000065000000200000006500000072000000720000006f000000720000002e000000 *0a000000002b010301023b00000052000000650000007400000075000000720000006e00000073 *000000200000007400000068000000650000002000000073000000750000006200000073000000 *6500000074000000200000007700000069000000740000006800000020000000610000006e0000 *0020000000690000006e000000640000006500000078000000200000006c000000650000007300 *000073000000200000007400000068000000610000006e000000200000006f0000007200000020 *000000650000007100000075000000610000006c00000020000000740000006f00000020000000 *7400000068000000650000000a01023d0000002000000070000000720000006f00000076000000 *69000000640000006500000064000000200000006b00000065000000790000002e000000200000 *002000000054000000680000006500000020000000730000006500000074000000200000006d00 *000075000000730000007400000020000000620000006500000020000000690000006e00000064 *00000065000000780000006500000064000000200000006f000000760000006500000072000000 *200000006b000000650000007900000020000000740000007900000070000000650000002c0000 *0020000000640000006f000000690000006e000000670000000a0225000000200000006f000000 *740000006800000065000000720000007700000069000000730000006500000020000000720000 *006500000073000000750000006c000000740000007300000020000000690000006e0000002000 *000072000000750000006e00000074000000690000006d00000065000000200000006500000072 *000000720000006f000000720000002e0000000a000000002c010301023e000000520000006500 *00007400000075000000720000006e000000730000002000000074000000680000006500000020 *000000730000007500000062000000730000006500000074000000200000007700000069000000 *740000006800000020000000610000006e00000020000000690000006e00000064000000650000 *007800000020000000670000007200000065000000610000007400000065000000720000002000 *00007400000068000000610000006e000000200000006f00000072000000200000006500000071 *00000075000000610000006c00000020000000740000006f000000200000007400000068000000 *650000000a01023d0000002000000070000000720000006f000000760000006900000064000000 *6500000064000000200000006b00000065000000790000002e0000002000000020000000540000 *00680000006500000020000000730000006500000074000000200000006d000000750000007300 *00007400000020000000620000006500000020000000690000006e000000640000006500000078 *0000006500000064000000200000006f000000760000006500000072000000200000006b000000 *650000007900000020000000740000007900000070000000650000002c00000020000000640000 *006f000000690000006e000000670000000a0225000000200000006f0000007400000068000000 *650000007200000077000000690000007300000065000000200000007200000065000000730000 *00750000006c000000740000007300000020000000690000006e00000020000000720000007500 *00006e00000074000000690000006d00000065000000200000006500000072000000720000006f *000000720000002e0000000a000000002d010301023f0000005200000065000000740000007500 *0000720000006e0000007300000020000000740000006800000065000000200000007300000075 *000000620000007300000065000000740000002000000077000000690000007400000068000000 *20000000610000006e00000020000000690000006e000000640000006500000078000000200000 *0077000000690000007400000068000000690000006e0000002000000074000000680000006500 *000020000000690000006e00000074000000650000007200000076000000610000006c00000020 *00000070000000720000006f00000076000000690000006400000065000000640000002e000000 *0a01023b0000002000000054000000680000006500000020000000620000006f00000074000000 *740000006f0000006d000000200000006f00000066000000200000007400000068000000650000 *0020000000690000006e00000074000000650000007200000076000000610000006c0000002000 *0000690000007300000020000000630000006c0000006f00000073000000650000006400000020 *000000610000006e00000064000000200000007400000068000000650000002000000074000000 *6f00000070000000200000006900000073000000200000006f00000070000000650000006e0000 *002c0000000a01023e00000020000000690000002e00000020000000650000002e000000200000 *005b0000006b000000310000003b0000006b00000032000000290000002e000000200000002000 *000054000000680000006500000020000000730000006500000074000000200000006d00000075 *000000730000007400000020000000620000006500000020000000690000006e00000064000000 *65000000780000006500000064000000200000006f000000760000006500000072000000200000 *006b000000650000007900000020000000740000007900000070000000650000002c0000002000 *0000640000006f000000690000006e000000670000000a0225000000200000006f000000740000 *006800000065000000720000007700000069000000730000006500000020000000720000006500 *000073000000750000006c000000740000007300000020000000690000006e0000002000000072 *000000750000006e00000074000000690000006d00000065000000200000006500000072000000 *720000006f000000720000002e0000000a000000002e0103010240000000520000006500000074 *00000075000000720000006e00000073000000200000006c000000690000007300000074000000 *73000000200000006f0000006600000020000000650000006c000000650000006d000000650000 *006e00000074000000730000002000000070000000610000006900000072000000650000006400 *000020000000770000006900000074000000680000002000000074000000680000006500000020 *000000690000006e00000064000000690000006300000065000000730000002000000064000000 *650000007400000065000000720000006d000000690000006e0000006500000064000000200000 *0062000000790000000a0211000000200000007400000079000000700000006500000020000000 *690000006e000000660000006500000072000000650000006e00000063000000650000002e0000 *000a000000002f0103010228000000410000002000000066000000750000006e00000063000000 *74000000690000006f0000006e00000020000000660000006f0000007200000020000000620000 *0075000000690000006c00000064000000690000006e0000006700000020000000750000007000 *00002000000073000000650000006c0000006500000063000000740000006f0000007200000073 *000000200000006f0000006e0000002001040100000008010210000000730000002e0000002000 *0000200000005500000073000000650000006400000020000000690000006e0000002000000074 *00000068000000650000000a01024100000020000000760000006100000072000000690000006f *0000007500000073000000200000006700000065000000740000002a0000002000000066000000 *750000006e0000006300000074000000690000006f0000006e000000730000002e000000200000 *002000000054000000680000006500000020000000730000006500000074000000200000006d00 *000075000000730000007400000020000000620000006500000020000000690000006e00000064 *00000065000000780000006500000064000000200000006f000000760000006500000072000000 *200000006b000000650000007900000020000000740000007900000070000000650000002c0000 *000a022b00000020000000640000006f000000690000006e00000067000000200000006f000000 *740000006800000065000000720000007700000069000000730000006500000020000000720000 *006500000073000000750000006c000000740000007300000020000000690000006e0000002000 *000072000000750000006e00000074000000690000006d00000065000000200000006500000072 *000000720000006f000000720000002e0000000a00000000450103010228000000410000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000002000000066 *0000006f00000072000000200000006200000075000000690000006c0000006400000069000000 *6e000000670000002000000075000000700000002000000073000000650000006c000000650000 *0063000000740000006f0000007200000073000000200000006f0000006e000000200104010000 *0008010210000000730000002e0000002000000020000000550000007300000065000000640000 *0020000000690000006e000000200000007400000068000000650000000a010241000000200000 *00760000006100000072000000690000006f000000750000007300000020000000670000006500 *0000740000002a0000002000000066000000750000006e0000006300000074000000690000006f *0000006e000000730000002e000000200000002000000054000000680000006500000020000000 *730000006500000074000000200000006d00000075000000730000007400000020000000620000 *006500000020000000690000006e00000064000000650000007800000065000000640000002000 *00006f000000760000006500000072000000200000006b00000065000000790000002000000074 *0000007900000070000000650000002c0000000a022b00000020000000640000006f0000006900 *00006e00000067000000200000006f000000740000006800000065000000720000007700000069 *000000730000006500000020000000720000006500000073000000750000006c00000074000000 *7300000020000000690000006e0000002000000072000000750000006e00000074000000690000 *006d00000065000000200000006500000072000000720000006f000000720000002e0000000a00 *000000300103010211000000530000007400000061000000740000006900000073000000740000 *006900000063000000730000002000000061000000620000006f00000075000000740000002001 *0401000000080102220000002e0000002000000054000000680000006900000073000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000007200 *0000650000007400000075000000720000006e0000007300000020000000710000007500000061 *000000640000007200000075000000700000006c000000650000000a0102430000002000000063 *0000006f0000006e00000073000000690000007300000074000000690000006e00000067000000 *200000006f0000006600000020000000310000002e00000020000000740000006f000000740000 *00610000006c000000200000006e000000750000006d0000006200000065000000720000002000 *00006f0000006600000020000000650000006c000000650000006d000000650000006e00000074 *0000007300000020000000690000006e0000002000000074000000680000006500000020000000 *73000000650000007400000020000000320000002e000000200000006e000000750000006d0000 *00620000006500000072000000200000006f000000660000000a01024000000020000000640000 *0065000000630000006c0000006100000072000000650000006400000020000000690000006e00 *0000640000006900000063000000650000007300000020000000330000002e000000200000006e *000000750000006d000000620000006500000072000000200000006f0000006600000020000000 *6b00000065000000790000007300000020000000690000006e00000020000000610000006c0000 *006c00000020000000690000006e00000064000000690000006300000065000000730000002000 *0000340000002e000000200000006e000000750000006d00000062000000650000007200000020 *0000006f000000660000000a0102420000002000000076000000610000006c0000007500000065 *0000007300000020000000690000006e00000020000000610000006c0000006c00000020000000 *6b00000065000000790000007300000020000000690000006e00000020000000610000006c0000 *006c00000020000000690000006e00000064000000690000006300000065000000730000002e00 *000020000000540000006800000069000000730000002000000063000000610000006e00000020 *00000061000000690000006400000020000000790000006f000000750000002000000069000000 *6e00000020000000640000006500000062000000750000006700000067000000690000006e0000 *00670000000a021300000020000000610000006e00000064000000200000006f00000070000000 *74000000690000006d00000069000000730000006100000074000000690000006f0000006e0000 *002e0000000a002f00000000000000010000000400000005000000060000000700000008000000 *090000000a0000000b0000000c0000000d0000000e0000000f0000001000000011000000120000 *00130000001400000015000000160000001700000018000000190000001a0000001b0000001c00 *00001d0000001e0000001f00000020000000210000002200000023000000240000002500000026 *0000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000 *302d000000080000000500000006000000070000000a0000000b00000009000000040000000c00 *00000d0000000e0000000f00000010000000120000001300000011000000150000001600000017 *0000001400000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000 *200000002100000022000000230000002400000025000000260000002700000028000000290000 *002a0000002b0000002c0000002d0000002e0000002f00000030002d0000000400000000050200 *0000060000000700000006000000000700000000080000000009000000000a000000000b000000 *000c000000000d000000000e000000000f00000000100000000011000000001200000000130000 *00001400000000150000000016000000001700000000180000000019000000001a000000001b00 *0000001c000000001d000000001e000000001f0000000020000000002100000000220000000023 *000000002400000000250000000026000000002700000000280000000029000000002a00000000 *2b000000002c000000002d000000002e000000002f000000003000000000000000004600000000 *000000010300000003000000000000000101000000030000000000000001000000000400000000 *000000010000000005000000000000000203000000060000000000000002030000000700000000 *000000020000000008000000000000000200000000090000000000000002030000000a00000000 *00000002000000000b0000000000000002000000000c0000000000000002000000000d00000000 *00000002000000000e000000000000000200000000040000000000000002000000000500000000 *00000002000000000f000000000000000200000000100000000000000002000000001100000000 *000000020000000012000000000000000200000000130000000000000002000000001400000000 *000000020000000015000000000000000200000000160000000000000002000000001700000000 *000000020000000018000000000000000200000000190000000000000002000000001a00000000 *00000002000000001b0000000000000002000000001c0000000000000002000000001d00000000 *00000002000000001e0000000000000002000000001f0000000000000002000000002000000000 *000000020000000021000000000000000200000000220000000000000002000000002300000000 *000000020000000024000000000000000200000000250000000000000002000000002600000000 *000000020000000027000000000000000200000000280000000000000002000000002900000000 *00000002000000002a0000000000000002000000002b0000000000000002000000002c00000000 *00000002000000002d0000000000000002000000002e0000000000000002000000002f00000000 *000000020000000030000000310000003203000000330000003400000035030000003600000000 *000000010000000037000000000000000100000000380000000000000001000000003900000000 *00000001000000003a000000310000003b030000003c0000000000000002010000000a00000000 *00000002000000003d0000000000000002000000003e0000000000000002000000003f00000000 *000000020000000040000000340000004103000000420000004300000044030000004500000000 *000000020000000046000000000000000200000000470000000000000002000000004800000034 *00000049010000004a000000430000004b010000004c000000430000004b010000004d00000000 *00000002000000004e000000000000004f000000000000001568617070737461636b2d69787365 *742d302e352e30000000000000001748617070737461636b2e446174612e49785365742e497800 *0000000000001448617070737461636b2e446174612e4978536574000000000000000249780000 *000000000006696e73657274000000000000000664656c6574650000000000000007496e646578 *4f700000000000000009496e64657861626c650000000000000005656d70747900000000000000 *0563616c6373000000000000000549785365740000000000000005697853657400000000000000 *076e6f43616c6373000000000000000a696e666572497853657400000000000000066368616e67 *6500000000000000087570646174654978000000000000000864656c6574654978000000000000 *0005746f536574000000000000000766726f6d536574000000000000000866726f6d4c69737400 *0000000000000473697a650000000000000006746f4c69737400000000000000066765744f6e65 *00000000000000086765744f6e654f7200000000000000046e756c6c0000000000000003262626 *00000000000000037c7c7c0000000000000005756e696f6e000000000000000c696e7465727365 *6374696f6e0000000000000002403d0000000000000002403c0000000000000002403e00000000 *00000003403c3d0000000000000003403e3d0000000000000003403e3c0000000000000004403e *3d3c0000000000000004403e3c3d0000000000000005403e3d3c3d0000000000000002402b0000 *000000000002402a0000000000000005676574455100000000000000056765744c540000000000 *000005676574475400000000000000066765744c54450000000000000006676574475445000000 *000000000867657452616e6765000000000000000767726f757042790000000000000006676574 *4f7264000000000000000573746174730000000000000012636f6e7461696e6572732d302e332e *302e300000000000000008446174612e4d617000000000000000034d6170000000000000000462 *617365000000000000000d446174612e5479706561626c6500000000000000085479706561626c *65000000000000000b636f6e5f49785f44617461000000000000000b6978547970655f44617461 *00000000000000086978436f6e737472000000000000000a697844617461547970650000000000 *000008446174612e5365740000000000000003536574000000000000000b6978536574436f6e73 *7472000000000000000d69785365744461746154797065000000000000000f7479566172426e64 *72546f4e616d650000000000000007666c617474656e00000000000000084748432e4261736500 *00000000000006537472696e6700000000000000086768632d7072696d00000000000000094748 *432e54797065730000000000000004436861720000000000000006746f53657427000000000000 *000866726f6d536574270000000000000007746f4c69737427000000000000000a446174612e4d *6179626500000000000000074e6f7468696e6700000000000000084748432e426f6f6c00000000 *0000000454727565000000000000000546616c736500000000000000076765744f726432 addfile ./docs/0.5.0/happstack-ixset/Happstack-Data-IxSet-Ix.html hunk ./docs/0.5.0/happstack-ixset/Happstack-Data-IxSet-Ix.html 1 + + +Happstack.Data.IxSet.Ix
     happstack-ixset-0.5.0: Efficient relational queries on Haskell sets.Source codeContentsIndex
    Happstack.Data.IxSet.Ix
    Description
    This module defines typable indices and convenience functions. Should +be probably considered private to Happstack.Data.IxSet. +
    Synopsis
    data Ix a = forall key . (Typeable key, Ord key) => Ix (Map key (Set a))
    insert :: (Ord a, Ord k) => k -> a -> Map k (Set a) -> Map k (Set a)
    delete :: (Ord a, Ord k) => k -> a -> Map k (Set a) -> Map k (Set a)
    Documentation
    data Ix a Source
    Ix is a Map from some Typeable key to a set of values for + that key. Ix carries type information inside. +
    Constructors
    forall key . (Typeable key, Ord key) => Ix (Map key (Set a))
    insert :: (Ord a, Ord k) => k -> a -> Map k (Set a) -> Map k (Set a)Source
    Convenience function for inserting into Maps of Sets as in + the case of an Ix. If they key did not already exist in the + Map, then a new Set is added transparently. +
    delete :: (Ord a, Ord k) => k -> a -> Map k (Set a) -> Map k (Set a)Source
    Convenience function for deleting from Maps of Sets If the + resulting Set is empty, then the entry is removed from the Map. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-ixset/Happstack-Data-IxSet.html hunk ./docs/0.5.0/happstack-ixset/Happstack-Data-IxSet.html 1 + + +Happstack.Data.IxSet
     happstack-ixset-0.5.0: Efficient relational queries on Haskell sets.Source codeContentsIndex
    Happstack.Data.IxSet
    Contents
    Set type +
    Changes to set +
    Creation +
    Conversion +
    Size checking +
    Set operations +
    Indexing +
    Debugging and optimisation +
    Description

    Assume you have a type like: +

    data Entry = Entry Author [Author] Updated Id Content
    +  newtype Updated = Updated EpochTime
    +  newtype Id = Id Int64
    +  newtype Content = Content String
    +  newtype Author = Author Email
    +  type Email = String

    1. Decide what parts of your type you want indexed and + make your type an instance of Indexable +

    instance Indexable Entry () where
    +    empty = ixSet 
    +                [ Ix (Map.empty::Map Author (Set Entry)) -- out of order
    +                , Ix (Map.empty::Map Id (Set Entry))
    +                , Ix (Map.empty::Map Updated (Set Entry))
    +                , Ix (Map.empty::Map Test (Set Entry))   -- bogus index
    +                , Ix (Map.empty::Map Word (Set Entry))   -- text index
    +                ]
    +    calcs entry = () -- words for text indexing purposes

    3. Use insert, delete, updateIx, deleteIx and empty to build + up an IxSet collection +

    entries = foldr insert empty [e1,e2,e3,e4] + entries' = foldr delete entries [e1,e3] + entries'' = update e4 e5 entries +

    4. Use the query functions below to grab data from it. e.g. +

    entries @< (Updated t1) @= (Author "john@doe.com")

    will find all items in entries updated earlier than t1 by + john@doe.com. +

    5. Text Index +

    If you want to do add a text index extract the words in entry and pass +them in the calc method of the Indexable class. Then if you want +all entries with either word1 or word2, you change the instance to +

    getWords entry = let Just (Content s) =
    +                           gGet entry in map Word $ words s
    instance Indexable Entry [Word] where
    +    ....
    +    calcs entry = getWords entry

    Now you can do this query to find entries with any of the words +

    entries @+ [Word "word1",Word "word2"]

    And if you want all entries with both: +

    entries @* [Word "word1",Word "word2"]

    6. Find only the first author +

    If an Entry has multiple authors and you want to be able to query +on the first author, define a FirstAuthor datatype and add it to the +result of calc. calc e = (toWords e, getFirstAuthor e) and now you can +do +

    newtype FirstAuthor = FirstAuthor Email
    getFirstAuthor = let Just (Author a) = 
    +                          gGet Entry in FirstAuthor a
    instance Indexable Entry ([Word],FirstAuthor)
    +    ...
    +    empty = ....
    +             Ix (Map.empty::Map FirstAuthor (Set Entry))]
    +    calcs entry = (getWords Entry,getFirstAuthor entry)
    +
    +entries @= (FirstAuthor "john@doe.com")  -- guess what this does
    Synopsis
    module Ix
    data IxSet a
    class Data b => Indexable a b | a -> b where
    empty :: IxSet a
    calcs :: a -> b
    noCalcs :: t -> ()
    inferIxSet :: String -> Name -> Name -> [Name] -> Q [Dec]
    ixSet :: [Ix a] -> IxSet a
    type IndexOp = forall k a. (Ord k, Ord a) => k -> a -> Map k (Set a) -> Map k (Set a)
    change :: (Data a, Ord a, Data b, Indexable a b) => IndexOp -> a -> IxSet a -> IxSet a
    insert :: (Data a, Ord a, Data b, Indexable a b) => a -> IxSet a -> IxSet a
    delete :: (Data a, Ord a, Data b, Indexable a b) => a -> IxSet a -> IxSet a
    updateIx :: (Indexable a b, Ord a, Data a, Typeable k) => k -> a -> IxSet a -> IxSet a
    deleteIx :: (Indexable a b, Ord a, Data a, Typeable k) => k -> IxSet a -> IxSet a
    fromSet :: (Indexable a b, Ord a, Data a) => Set a -> IxSet a
    fromList :: (Indexable a b, Ord a, Data a) => [a] -> IxSet a
    toSet :: Ord a => IxSet a -> Set a
    toList :: Ord a => IxSet a -> [a]
    getOne :: Ord a => IxSet a -> Maybe a
    getOneOr :: Ord a => a -> IxSet a -> a
    size :: Ord a => IxSet a -> Int
    null :: IxSet a -> Bool
    (&&&) :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet a
    (|||) :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet a
    union :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet a
    intersection :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet a
    (@=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet a
    (@<) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet a
    (@>) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet a
    (@<=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet a
    (@>=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet a
    (@><) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> (k, k) -> IxSet a
    (@>=<) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> (k, k) -> IxSet a
    (@><=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> (k, k) -> IxSet a
    (@>=<=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> (k, k) -> IxSet a
    (@+) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> [k] -> IxSet a
    (@*) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> [k] -> IxSet a
    getEQ :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet a
    getLT :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet a
    getGT :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet a
    getLTE :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet a
    getGTE :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet a
    getRange :: (Indexable a b, Typeable k, Ord a, Data a) => k -> k -> IxSet a -> IxSet a
    groupBy :: (Typeable k, Typeable t) => IxSet t -> [(k, [t])]
    getOrd :: (Indexable a b, Ord a, Data a, Typeable k) => Ordering -> k -> IxSet a -> IxSet a
    stats :: Ord a => IxSet a -> (Int, Int, Int, Int)
    Documentation
    module Ix
    Set type +
    data IxSet a Source
    class Data b => Indexable a b | a -> b whereSource
    Indexable class defines objects that can be members of IxSet. + If you don't want calculated values use Indexable a (). +
    Methods
    empty :: IxSet aSource
    Method empty defines what an empty IxSet for this + particular type should look like. It should have all necessary + indices. Use ixSet function to create the set. +
    calcs :: a -> bSource
    Method calcs adds indexable values not found in the + type. Those end up in indices just like other types found in + objects. If you don't want any calculated values just use + noCalcs. +
    noCalcs :: t -> ()Source
    Function to be used for calcs in the case of an Indexable a () + instance. +
    inferIxSet :: String -> Name -> Name -> [Name] -> Q [Dec]Source

    Template Haskell helper function for automatically building an + Indexable instance from a data type, e.g. +

    data Foo = Foo Int String

    and +

    $(inferIxSet "FooDB" ''Foo 'noCalcs [''Int,''String])

    will build a type synonym +

    type FooDB = IxSet Foo

    with Int and String as indices. +

    WARNING: The type specified as the first index must be a type which + appears in all values in the IxSet or toList and toSet will + not function properly. You will be warned not to do this by runtime error. + You can always use the element type itself. For example: +

    $(inferIxSet "FooDB" ''Foo 'noCalcs [''Foo, ''Int, ''String])
    ixSet :: [Ix a] -> IxSet aSource
    Create an IxSet using list of indices. Useful in Indexable + empty method. +
    Changes to set +
    type IndexOp = forall k a. (Ord k, Ord a) => k -> a -> Map k (Set a) -> Map k (Set a)Source
    change :: (Data a, Ord a, Data b, Indexable a b) => IndexOp -> a -> IxSet a -> IxSet aSource
    Higher order operator for modifying IxSets. Use this when your + final function should have the form a -> IxSet a -> IxSet a, + e.g. insert or delete. +
    insert :: (Data a, Ord a, Data b, Indexable a b) => a -> IxSet a -> IxSet aSource
    Inserts an item into the IxSet. If your data happens to have + primary key this function might not be what you want. See + updateIx. +
    delete :: (Data a, Ord a, Data b, Indexable a b) => a -> IxSet a -> IxSet aSource
    Removes an item from the IxSet. +
    updateIx :: (Indexable a b, Ord a, Data a, Typeable k) => k -> a -> IxSet a -> IxSet aSource
    Will replace the item with index k. Only works if there is at + most one item with that index in the IxSet. Will not change + IxSet if you have more then 1 item with given index. +
    deleteIx :: (Indexable a b, Ord a, Data a, Typeable k) => k -> IxSet a -> IxSet aSource
    Will delete the item with index k. Only works if there is at + most one item with that index in the IxSet. Will not change + IxSet if you have more then 1 item with given index. +
    Creation +
    fromSet :: (Indexable a b, Ord a, Data a) => Set a -> IxSet aSource
    Converts a Set to an IxSet. +
    fromList :: (Indexable a b, Ord a, Data a) => [a] -> IxSet aSource
    Converts a list to an IxSet. +
    Conversion +
    toSet :: Ord a => IxSet a -> Set aSource
    Converts an IxSet to a Set of its elements. +
    toList :: Ord a => IxSet a -> [a]Source
    Converts an IxSet to its list of elements. +
    getOne :: Ord a => IxSet a -> Maybe aSource
    If the IxSet is a singleton it will return the one item stored in it. + If IxSet is empty or has many elements this function returns Nothing. +
    getOneOr :: Ord a => a -> IxSet a -> aSource
    Like getOne with a user provided default. +
    Size checking +
    size :: Ord a => IxSet a -> IntSource
    Returns the number of unique items in the IxSet. +
    null :: IxSet a -> BoolSource
    Return True if the IxSet is empty, False otherwise. +
    Set operations +
    (&&&) :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet aSource
    An infix intersection operation. +
    (|||) :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet aSource
    An infix union operation. +
    union :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet aSource
    Takes the union of the two IxSets. +
    intersection :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet aSource
    Takes the intersection of the two IxSets. +
    Indexing +
    (@=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet aSource
    Infix version of getEQ. +
    (@<) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet aSource
    Infix version of getLT. +
    (@>) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet aSource
    Infix version of getGT. +
    (@<=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet aSource
    Infix version of getLTE. +
    (@>=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> k -> IxSet aSource
    Infix version of getGTE. +
    (@><) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> (k, k) -> IxSet aSource
    Returns the subset with indices in the open interval (k,k). +
    (@>=<) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> (k, k) -> IxSet aSource
    Returns the subset with indices in [k,k). +
    (@><=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> (k, k) -> IxSet aSource
    Returns the subset with indices in (k,k]. +
    (@>=<=) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> (k, k) -> IxSet aSource
    Returns the subset with indices in [k,k]. +
    (@+) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> [k] -> IxSet aSource
    Creates the subset that has an index in the provided list. +
    (@*) :: (Indexable a b, Data a, Ord a, Typeable k) => IxSet a -> [k] -> IxSet aSource
    Creates the subset that matches all the provided indices. +
    getEQ :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet aSource
    Returns the subset with an index equal to the provided key. The + set must be indexed over key type, doing otherwise results in + runtime error. +
    getLT :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet aSource
    Returns the subset with an index less than the provided key. The + set must be indexed over key type, doing otherwise results in + runtime error. +
    getGT :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet aSource
    Returns the subset with an index greater than the provided key. + The set must be indexed over key type, doing otherwise results in + runtime error. +
    getLTE :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet aSource
    Returns the subset with an index less than or equal to the + provided key. The set must be indexed over key type, doing + otherwise results in runtime error. +
    getGTE :: (Indexable a b, Data a, Ord a, Typeable k) => k -> IxSet a -> IxSet aSource
    Returns the subset with an index greater than or equal to the + provided key. The set must be indexed over key type, doing + otherwise results in runtime error. +
    getRange :: (Indexable a b, Typeable k, Ord a, Data a) => k -> k -> IxSet a -> IxSet aSource
    Returns the subset with an index within the interval provided. + The bottom of the interval is closed and the top is open, + i. e. [k1;k2). The set must be indexed over key type, doing + otherwise results in runtime error. +
    groupBy :: (Typeable k, Typeable t) => IxSet t -> [(k, [t])]Source
    Returns lists of elements paired with the indices determined by + type inference. +
    getOrd :: (Indexable a b, Ord a, Data a, Typeable k) => Ordering -> k -> IxSet a -> IxSet aSource
    A function for building up selectors on IxSets. Used in the + various get* functions. The set must be indexed over key type, + doing otherwise results in runtime error. +
    Debugging and optimisation +
    stats :: Ord a => IxSet a -> (Int, Int, Int, Int)Source
    Statistics about IxSet. This function returns quadruple + consisting of 1. total number of elements in the set 2. number of + declared indices 3. number of keys in all indices 4. number of + values in all keys in all indices. This can aid you in debugging + and optimisation. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-ixset/doc-index.html hunk ./docs/0.5.0/happstack-ixset/doc-index.html 1 + + +happstack-ixset-0.5.0: Efficient relational queries on Haskell sets. (Index)
     happstack-ixset-0.5.0: Efficient relational queries on Haskell sets.ContentsIndex
    &&&
    @*
    @+
    @<
    @<=
    @=
    @>
    @><
    @><=
    @>=
    @>=<
    @>=<=
    calcs
    change
    delete
    1 (Function)
    2 (Function)
    deleteIx
    empty
    fromList
    fromSet
    getEQ
    getGT
    getGTE
    getLT
    getLTE
    getOne
    getOneOr
    getOrd
    getRange
    groupBy
    Indexable
    IndexOp
    inferIxSet
    insert
    1 (Function)
    2 (Function)
    intersection
    Ix
    1 (Type/Class)
    2 (Data Constructor)
    IxSet
    ixSet
    noCalcs
    null
    size
    stats
    toList
    toSet
    union
    updateIx
    |||
    addfile ./docs/0.5.0/happstack-ixset/frames.html hunk ./docs/0.5.0/happstack-ixset/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/happstack-ixset/haddock-util.js hunk ./docs/0.5.0/happstack-ixset/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/happstack-ixset/haddock.css hunk ./docs/0.5.0/happstack-ixset/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + addfile ./docs/0.5.0/happstack-ixset/happstack-ixset.haddock binary ./docs/0.5.0/happstack-ixset/happstack-ixset.haddock oldhex * newhex *0d0cface000f00005c0d0000587731000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000002000000 *050000000000000002000000060000000000000002000000070000000000000002000000080000 *0000000000020000000900000000000000020000000a00000000000000020000000b0000000000 *0000020000000c00000000000000020000000d00000000000000020000000e0000000000000002 *0000000f0000000000000002000000100000000000000002000000110000000000000002000000 *120000000000000002000000130000000000000002000000140000000000000002000000150000 *000000000002000000160000000000000002000000170000000000000002000000180000000000 *0000020000001900000000000000020000001a00000000000000020000001b0000000000000002 *0000001c00000000000000020000001d00000000000000020000001e0000000000000002000000 *1f0000000000000002000000200000000000000002000000210000000000000002000000220000 *000000000002000000230000000000000002000000240000000000000002000000250000000000 *000002000000260000000000000002000000270000000000000002000000280000000000000002 *0000002900000000000000020000002a00000000000000020000002b0000000000000002000000 *2c00000000000000020000002d00000000000000020000002e00000000000000020000002f0000 *000000000002000000300000000000000002020000000000000001000000000800000000010301 *040200000001000000000102060000002000000069000000730000002000000061000000200104 *010000003101020b0000002000000066000000720000006f0000006d0000002000000073000000 *6f0000006d00000065000000200104010000003201021c000000200000006b0000006500000079 *00000020000000740000006f000000200000006100000020000000730000006500000074000000 *200000006f000000660000002000000076000000610000006c0000007500000065000000730000 *0020000000660000006f000000720000000a01020c000000200000007400000068000000610000 *0074000000200000006b00000065000000790000002e0000002000000020010402000000010000 *000002220000002000000063000000610000007200000072000000690000006500000073000000 *200000007400000079000000700000006500000020000000690000006e000000660000006f0000 *00720000006d0000006100000074000000690000006f0000006e00000020000000690000006e00 *0000730000006900000064000000650000002e0000000a00000000010000000000330000000000 *340000000000350000000000360000000000020103010228000000430000006f0000006e000000 *76000000650000006e00000069000000650000006e000000630000006500000020000000660000 *00750000006e0000006300000074000000690000006f0000006e00000020000000660000006f00 *00007200000020000000690000006e00000073000000650000007200000074000000690000006e *0000006700000020000000690000006e000000740000006f000000200104010000003101020500 *000073000000200000006f00000066000000200104010000003701020800000073000000200000 *00610000007300000020000000690000006e0000000a0102100000002000000074000000680000 *00650000002000000063000000610000007300000065000000200000006f000000660000002000 *0000610000006e00000020010402000000010000000001022c0000002e00000020000000200000 *0049000000660000002000000074000000680000006500000079000000200000006b0000006500 *00007900000020000000640000006900000064000000200000006e0000006f0000007400000020 *000000610000006c00000072000000650000006100000064000000790000002000000065000000 *7800000069000000730000007400000020000000690000006e0000002000000074000000680000 *00650000000a010201000000200104010000003101020d0000002c000000200000007400000068 *000000650000006e0000002000000061000000200000006e000000650000007700000020010401 *000000370219000000200000006900000073000000200000006100000064000000640000006500 *000064000000200000007400000072000000610000006e00000073000000700000006100000072 *000000650000006e000000740000006c000000790000002e0000000a0000000003010301022700 *0000430000006f0000006e00000076000000650000006e00000069000000650000006e00000063 *000000650000002000000066000000750000006e0000006300000074000000690000006f000000 *6e00000020000000660000006f000000720000002000000064000000650000006c000000650000 *0074000000690000006e000000670000002000000066000000720000006f0000006d0000002001 *04010000003101020500000073000000200000006f000000660000002001040100000037010209 *00000073000000200000004900000066000000200000007400000068000000650000000a01020b *00000020000000720000006500000073000000750000006c00000074000000690000006e000000 *67000000200104010000003701022e00000020000000690000007300000020000000650000006d *0000007000000074000000790000002c000000200000007400000068000000650000006e000000 *2000000074000000680000006500000020000000650000006e0000007400000072000000790000 *002000000069000000730000002000000072000000650000006d0000006f000000760000006500 *0000640000002000000066000000720000006f0000006d00000020000000740000006800000065 *000000200104010000003102020000002e0000000a000400000000000000010000000200000003 *040000000000000001000000020000000300040000000001000000010000000100000000020000 *00000300000000000000000201022f000000410000006e00000020000000650000006600000066 *000000690000006300000069000000650000006e0000007400000020000000690000006d000000 *700000006c000000650000006d000000650000006e000000740000006100000074000000690000 *006f0000006e000000200000006f00000066000000200000007100000075000000650000007200 *00007900000061000000620000006c000000650000002000000073000000650000007400000073 *0000002e0000000a000000360000000400000000000501030104010000000501022e0000002000 *0000630000006c0000006100000073000000730000002000000064000000650000006600000069 *0000006e0000006500000073000000200000006f000000620000006a0000006500000063000000 *740000007300000020000000740000006800000061000000740000002000000063000000610000 *006e000000200000006200000065000000200000006d000000650000006d000000620000006500 *00007200000073000000200000006f0000006600000020010401000000080102030000002e0000 *00200000000a01020f000000200000002000000020000000200000002000000049000000660000 *0020000000790000006f0000007500000020000000640000006f0000006e010201000000270102 *1d000000740000002000000077000000610000006e000000740000002000000063000000610000 *006c00000063000000750000006c00000061000000740000006500000064000000200000007600 *0000610000006c0000007500000065000000730000002000000075000000730000006500000020 *0107010401000000050205000000200000006100000020000000280000002902020000002e0000 *000a000000000601030102070000004d0000006500000074000000680000006f00000064000000 *200104010000000601021700000020000000640000006500000066000000690000006e00000065 *00000073000000200000007700000068000000610000007400000020000000610000006e000000 *20000000650000006d000000700000007400000079000000200104010000000801020a00000020 *000000660000006f0000007200000020000000740000006800000069000000730000000a010241 *00000020000000700000006100000072000000740000006900000063000000750000006c000000 *610000007200000020000000740000007900000070000000650000002000000073000000680000 *006f000000750000006c00000064000000200000006c0000006f0000006f0000006b0000002000 *00006c000000690000006b000000650000002e0000002000000020000000490000007400000020 *00000073000000680000006f000000750000006c00000064000000200000006800000061000000 *760000006500000020000000610000006c0000006c000000200000006e00000065000000630000 *006500000073000000730000006100000072000000790000000a01020e00000020000000690000 *006e00000064000000690000006300000065000000730000002e00000020000000550000007300 *0000650000002001040100000009021d0000002000000066000000750000006e00000063000000 *74000000690000006f0000006e00000020000000740000006f0000002000000063000000720000 *006500000061000000740000006500000020000000740000006800000065000000200000007300 *000065000000740000002e0000000a000000000701030102070000004d00000065000000740000 *00680000006f000000640000002001040100000007010228000000200000006100000064000000 *640000007300000020000000690000006e00000064000000650000007800000061000000620000 *006c000000650000002000000076000000610000006c0000007500000065000000730000002000 *00006e0000006f0000007400000020000000660000006f000000750000006e0000006400000020 *000000690000006e000000200000007400000068000000650000000a01023e0000002000000074 *0000007900000070000000650000002e0000002000000054000000680000006f00000073000000 *6500000020000000650000006e0000006400000020000000750000007000000020000000690000 *006e00000020000000690000006e00000064000000690000006300000065000000730000002000 *00006a000000750000007300000074000000200000006c000000690000006b0000006500000020 *0000006f0000007400000068000000650000007200000020000000740000007900000070000000 *650000007300000020000000660000006f000000750000006e0000006400000020000000690000 *006e0000000a010214000000200000006f000000620000006a0000006500000063000000740000 *00730000002e00000020000000490000006600000020000000790000006f000000750000002000 *0000640000006f0000006e01020100000027010226000000740000002000000077000000610000 *006e0000007400000020000000610000006e000000790000002000000063000000610000006c00 *000063000000750000006c00000061000000740000006500000064000000200000007600000061 *0000006c000000750000006500000073000000200000006a000000750000007300000074000000 *200000007500000073000000650000000a010201000000200104010000000a02020000002e0000 *000a0000000008000000000038000000000009010301020a000000430000007200000065000000 *61000000740000006500000020000000610000006e000000200104010000000801022200000020 *0000007500000073000000690000006e00000067000000200000006c0000006900000073000000 *74000000200000006f0000006600000020000000690000006e0000006400000069000000630000 *0065000000730000002e0000002000000055000000730000006500000066000000750000006c00 *000020000000690000006e00000020010401000000050102010000000a01020100000020010401 *000000060209000000200000006d0000006500000074000000680000006f000000640000002e00 *00000a000000003900000000003a00000000000a010301021800000046000000750000006e0000 *006300000074000000690000006f0000006e00000020000000740000006f000000200000006200 *000065000000200000007500000073000000650000006400000020000000660000006f00000072 *000000200104010000000701021300000020000000690000006e00000020000000740000006800 *0000650000002000000063000000610000007300000065000000200000006f0000006600000020 *000000610000006e00000020010701040100000005020500000020000000610000002000000028 *000000290102010000000a020b00000020000000690000006e0000007300000074000000610000 *006e00000063000000650000002e0000000a000000000b01010301023f00000054000000650000 *006d000000700000006c0000006100000074000000650000002000000048000000610000007300 *00006b000000650000006c0000006c0000002000000068000000650000006c0000007000000065 *000000720000002000000066000000750000006e0000006300000074000000690000006f000000 *6e00000020000000660000006f00000072000000200000006100000075000000740000006f0000 *006d00000061000000740000006900000063000000610000006c0000006c000000790000002000 *00006200000075000000690000006c00000064000000690000006e000000670000002000000061 *0000006e0000000a01020300000020000000200000002001040100000005022100000020000000 *690000006e0000007300000074000000610000006e000000630000006500000020000000660000 *00720000006f0000006d0000002000000061000000200000006400000061000000740000006100 *000020000000740000007900000070000000650000002c00000020000000650000002e00000067 *0000002e0000000a01070219000000640000006100000074000000610000002000000046000000 *6f0000006f000000200000003d00000020000000460000006f0000006f00000020000000490000 *006e0000007400000020000000530000007400000072000000690000006e000000670103020400 *0000610000006e000000640000000a010701020d0000002400000028000000690000006e000000 *660000006500000072000000490000007800000053000000650000007400000020010201000000 *22010205000000460000006f0000006f0000004400000042010201000000220102010000002001 *02010000002701020100000027010204000000460000006f0000006f0000002001020100000027 *0102090000006e0000006f00000043000000610000006c0000006300000073000000200000005b *0102010000002701020100000027010204000000490000006e000000740000002c010201000000 *2701020100000027010206000000530000007400000072000000690000006e0000006701020100 *00005d0201000000290103021b00000077000000690000006c0000006c00000020000000620000 *0075000000690000006c0000006400000020000000610000002000000074000000790000007000 *0000650000002000000073000000790000006e0000006f0000006e000000790000006d00000020 *0000000a010702160000007400000079000000700000006500000020000000460000006f000000 *6f0000004400000042000000200000003d00000020000000490000007800000053000000650000 *007400000020000000460000006f0000006f010301020500000077000000690000007400000068 *0000002001070203000000490000006e0000007401020500000020000000610000006e00000064 *0000002001070206000000530000007400000072000000690000006e00000067020d0000002000 *0000610000007300000020000000690000006e0000006400000069000000630000006500000073 *0000002e0000000a01030102440000005700000041000000520000004e000000490000004e0000 *00470000003a000000200000005400000068000000650000002000000074000000790000007000 *000065000000200000007300000070000000650000006300000069000000660000006900000065 *000000640000002000000061000000730000002000000074000000680000006500000020000000 *660000006900000072000000730000007400000020000000690000006e00000064000000650000 *0078000000200000006d0000007500000073000000740000002000000062000000650000002000 *000061000000200000007400000079000000700000006500000020000000770000006800000069 *00000063000000680000000a010220000000200000002000000020000000610000007000000070 *0000006500000061000000720000007300000020000000690000006e0000002000000061000000 *6c0000006c0000002000000076000000610000006c000000750000006500000073000000200000 *00690000006e000000200000007400000068000000650000002001040100000008010204000000 *200000006f00000072000000200104010000001501020500000020000000610000006e00000064 *00000020010401000000110102060000002000000077000000690000006c0000006c0000000a01 *024e0000002000000020000000200000006e0000006f0000007400000020000000660000007500 *00006e0000006300000074000000690000006f0000006e0000002000000070000000720000006f *0000007000000065000000720000006c000000790000002e00000020000000590000006f000000 *750000002000000077000000690000006c0000006c000000200000006200000065000000200000 *007700000061000000720000006e0000006500000064000000200000006e0000006f0000007400 *000020000000740000006f00000020000000640000006f00000020000000740000006800000069 *000000730000002000000062000000790000002000000072000000750000006e00000074000000 *690000006d00000065000000200000006500000072000000720000006f000000720000002e0000 *000a023c000000200000002000000020000000590000006f000000750000002000000063000000 *610000006e00000020000000610000006c00000077000000610000007900000073000000200000 *007500000073000000650000002000000074000000680000006500000020000000650000006c00 *0000650000006d000000650000006e000000740000002000000074000000790000007000000065 *00000020000000690000007400000073000000650000006c000000660000002e00000020000000 *460000006f00000072000000200000006500000078000000610000006d000000700000006c0000 *00650000003a0000000a0701020d0000002400000028000000690000006e000000660000006500 *000072000000490000007800000053000000650000007400000020010201000000220102050000 *00460000006f0000006f0000004400000042010201000000220102010000002001020100000027 *01020100000027010204000000460000006f0000006f0000002001020100000027010209000000 *6e0000006f00000043000000610000006c0000006300000073000000200000005b010201000000 *2701020100000027010205000000460000006f0000006f0000002c000000200102010000002701 *020100000027010205000000490000006e000000740000002c0000002001020100000027010201 *00000027010206000000530000007400000072000000690000006e000000670102010000005d02 *0100000029000000003b00000000003c01010301024200000047000000650000006e0000006500 *0000720000006900000063000000610000006c0000006c00000079000000200000007400000072 *000000610000007600000065000000720000007300000065000000730000002000000074000000 *680000006500000020000000610000007200000067000000750000006d000000650000006e0000 *007400000020000000610000006e0000006400000020000000630000006f0000006e0000007600 *00006500000072000000740000007300000020000000610000006c0000006c0000002000000064 *00000061000000740000006100000020000000690000006e000000200000006900000074000000 *20000000740000006f0000000a0102010000002001020700000044000000790000006e00000061 *0000006d000000690000006301023000000020000000610000006e000000640000002000000072 *000000650000007400000075000000720000006e0000007300000020000000610000006c000000 *6c0000002000000074000000680000006500000020000000690000006e00000074000000650000 *00720000006e000000610000006c00000020000000640000006100000074000000610000002000 *000061000000730000002000000061000000200000006c00000069000000730000007400000020 *0000006f000000660000002001020700000044000000790000006e000000610000006d00000069 *0000006302020000002e0000000a0301021f000000540000006800000069000000730000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000002000000070 *000000720000006f0000007000000065000000720000006c000000790000002000000068000000 *610000006e000000640000006c0000006500000073000000200104010000003d01020400000020 *0000006100000073000000200104010000003d010208000000200000006e0000006f0000007400 *00002000000061000000730000002001070102010000005b0104010000003e02010000005d0202 *0000002e0000000a000000000c0103010224000000480000006900000067000000680000006500 *000072000000200000006f00000072000000640000006500000072000000200000006f00000070 *000000650000007200000061000000740000006f0000007200000020000000660000006f000000 *72000000200000006d0000006f00000064000000690000006600000079000000690000006e0000 *00670000002001040100000008010217000000730000002e000000200000002000000055000000 *730000006500000020000000740000006800000069000000730000002000000077000000680000 *00650000006e00000020000000790000006f00000075000000720000000a010225000000200000 *0066000000690000006e000000610000006c0000002000000066000000750000006e0000006300 *000074000000690000006f0000006e0000002000000073000000680000006f000000750000006c *000000640000002000000068000000610000007600000065000000200000007400000068000000 *6500000020000000660000006f000000720000006d000000200107021700000061000000200000 *002d0000003e000000200000004900000078000000530000006500000074000000200000006100 *0000200000002d0000003e00000020000000490000007800000053000000650000007400000020 *000000610102020000002c0000000a01020600000020000000650000002e000000670000002e00 *0000200104010000000d010204000000200000006f00000072000000200104010000000e020200 *00002e0000000a000000000d0103010219000000490000006e0000007300000065000000720000 *00740000007300000020000000610000006e000000200000006900000074000000650000006d00 *000020000000690000006e000000740000006f0000002000000074000000680000006500000020 *0104010000000801021f0000002e00000020000000490000006600000020000000790000006f00 *000075000000720000002000000064000000610000007400000061000000200000006800000061 *0000007000000070000000650000006e0000007300000020000000740000006f00000020000000 *680000006100000076000000650000000a01023b00000020000000700000007200000069000000 *6d000000610000007200000079000000200000006b000000650000007900000020000000740000 *006800000069000000730000002000000066000000750000006e00000063000000740000006900 *00006f0000006e000000200000006d00000069000000670000006800000074000000200000006e *0000006f0000007400000020000000620000006500000020000000770000006800000061000000 *7400000020000000790000006f000000750000002000000077000000610000006e000000740000 *002e000000200000005300000065000000650000000a010201000000200104010000000f020200 *00002e0000000a000000000e010301021900000052000000650000006d0000006f000000760000 *00650000007300000020000000610000006e000000200000006900000074000000650000006d00 *00002000000066000000720000006f0000006d0000002000000074000000680000006500000020 *0104010000000802020000002e0000000a000000000f010301023f00000057000000690000006c *0000006c000000200000007200000065000000700000006c000000610000006300000065000000 *20000000740000006800000065000000200000006900000074000000650000006d000000200000 *007700000069000000740000006800000020000000690000006e00000064000000650000007800 *0000200000006b0000002e00000020000000200000004f0000006e0000006c0000007900000020 *000000770000006f000000720000006b0000007300000020000000690000006600000020000000 *740000006800000065000000720000006500000020000000690000007300000020000000610000 *00740000000a010226000000200000006d0000006f0000007300000074000000200000006f0000 *006e00000065000000200000006900000074000000650000006d00000020000000770000006900 *00007400000068000000200000007400000068000000610000007400000020000000690000006e *00000064000000650000007800000020000000690000006e000000200000007400000068000000 *6500000020010401000000080102120000002e0000002000000057000000690000006c0000006c *000000200000006e0000006f00000074000000200000006300000068000000610000006e000000 *67000000650000000a010201000000200104010000000802300000002000000069000000660000 *0020000000790000006f0000007500000020000000680000006100000076000000650000002000 *00006d0000006f0000007200000065000000200000007400000068000000650000006e00000020 *00000031000000200000006900000074000000650000006d000000200000007700000069000000 *740000006800000020000000670000006900000076000000650000006e00000020000000690000 *006e0000006400000065000000780000002e0000000a0000000010010301023e00000057000000 *690000006c0000006c0000002000000064000000650000006c0000006500000074000000650000 *0020000000740000006800000065000000200000006900000074000000650000006d0000002000 *00007700000069000000740000006800000020000000690000006e000000640000006500000078 *000000200000006b0000002e00000020000000200000004f0000006e0000006c00000079000000 *20000000770000006f000000720000006b00000073000000200000006900000066000000200000 *007400000068000000650000007200000065000000200000006900000073000000200000006100 *0000740000000a010226000000200000006d0000006f0000007300000074000000200000006f00 *00006e00000065000000200000006900000074000000650000006d000000200000007700000069 *000000740000006800000020000000740000006800000061000000740000002000000069000000 *6e00000064000000650000007800000020000000690000006e0000002000000074000000680000 *006500000020010401000000080102120000002e0000002000000057000000690000006c000000 *6c000000200000006e0000006f00000074000000200000006300000068000000610000006e0000 *0067000000650000000a0102010000002001040100000008023000000020000000690000006600 *000020000000790000006f00000075000000200000006800000061000000760000006500000020 *0000006d0000006f0000007200000065000000200000007400000068000000650000006e000000 *2000000031000000200000006900000074000000650000006d0000002000000077000000690000 *00740000006800000020000000670000006900000076000000650000006e000000200000006900 *00006e0000006400000065000000780000002e0000000a0000000011010301020c000000430000 *006f0000006e000000760000006500000072000000740000007300000020000000610000006e00 *0000200104010000000801020600000020000000740000006f0000002000000061000000200104 *01000000370212000000200000006f000000660000002000000069000000740000007300000020 *000000650000006c000000650000006d000000650000006e00000074000000730000002e000000 *0a000000003f010301021000000054000000610000006b00000065000000730000002000000061 *000000200000006c000000690000007300000074000000200000006f0000006600000020010402 *00000001000000000102190000007300000020000000610000006e000000640000002000000063 *0000006f0000006e00000076000000650000007200000074000000730000002000000069000000 *7400000020000000690000006e000000740000006f000000200000006100000020010401000000 *3702020000002e0000000a0000000012010301020b000000430000006f0000006e000000760000 *006500000072000000740000007300000020000000610000002001040100000037010207000000 *20000000740000006f00000020000000610000006e000000200104010000000802020000002e00 *00000a0000000040010301020b000000430000006f0000006e0000007600000065000000720000 *007400000073000000200000006100000020010401000000370102070000002000000074000000 *6f00000020000000610000006e000000200104010000000802020000002e0000000a0000000013 *0103010216000000430000006f0000006e00000076000000650000007200000074000000730000 *002000000061000000200000006c00000069000000730000007400000020000000740000006f00 *000020000000610000006e000000200104010000000802020000002e0000000a00000000140103 *01022a00000052000000650000007400000075000000720000006e000000730000002000000074 *0000006800000065000000200000006e000000750000006d000000620000006500000072000000 *200000006f0000006600000020000000750000006e000000690000007100000075000000650000 *00200000006900000074000000650000006d0000007300000020000000690000006e0000002000 *0000740000006800000065000000200104010000000802020000002e0000000a00000000150103 *01020c000000430000006f0000006e000000760000006500000072000000740000007300000020 *000000610000006e0000002001040100000008021a00000020000000740000006f000000200000 *00690000007400000073000000200000006c000000690000007300000074000000200000006f00 *00006600000020000000650000006c000000650000006d000000650000006e0000007400000073 *0000002e0000000a00000000410103010213000000430000006f0000006e000000760000006500 *00007200000074000000730000002000000061000000200000006c000000690000007300000074 *000000200000006f00000066000000200104020000000100000000021800000073000000200000 *00740000006f000000200000006c000000690000007300000074000000200000006f0000006600 *000020000000650000006c000000650000006d000000650000006e00000074000000730000002e *000000200000000a00000000160103010207000000490000006600000020000000740000006800 *000065000000200104010000000801023a00000020000000690000007300000020000000610000 *002000000073000000690000006e000000670000006c00000065000000740000006f0000006e00 *00002000000069000000740000002000000077000000690000006c0000006c0000002000000072 *000000650000007400000075000000720000006e00000020000000740000006800000065000000 *200000006f0000006e00000065000000200000006900000074000000650000006d000000200000 *0073000000740000006f00000072000000650000006400000020000000690000006e0000002000 *000069000000740000002e0000000a010204000000200000004900000066000000200104010000 *000801023500000020000000690000007300000020000000650000006d00000070000000740000 *0079000000200000006f0000007200000020000000680000006100000073000000200000006d00 *0000610000006e0000007900000020000000650000006c000000650000006d000000650000006e *000000740000007300000020000000740000006800000069000000730000002000000066000000 *750000006e0000006300000074000000690000006f0000006e0000002000000072000000650000 *007400000075000000720000006e00000073000000200104010000004202020000002e0000000a *000000001701030102050000004c000000690000006b000000650000002001040100000016021f *000000200000007700000069000000740000006800000020000000610000002000000075000000 *7300000065000000720000002000000070000000720000006f0000007600000069000000640000 *0065000000640000002000000064000000650000006600000061000000750000006c0000007400 *00002e0000000a0000000018010301020700000052000000650000007400000075000000720000 *006e00000020010401000000430102080000002000000069000000660000002000000074000000 *6800000065000000200104010000000801020b0000002000000069000000730000002000000065 *0000006d0000007000000074000000790000002c0000002001040100000044020c000000200000 *006f00000074000000680000006500000072000000770000006900000073000000650000002e00 *00000a00000000190103010209000000410000006e00000020000000690000006e000000660000 *006900000078000000200104010000001c020c000000200000006f000000700000006500000072 *0000006100000074000000690000006f0000006e0000002e0000000a000000001a010301020900 *0000410000006e00000020000000690000006e0000006600000069000000780000002001040100 *00001b020c000000200000006f0000007000000065000000720000006100000074000000690000 *006f0000006e0000002e0000000a000000001b010301021b00000054000000610000006b000000 *65000000730000002000000074000000680000006500000020000000750000006e000000690000 *006f0000006e000000200000006f00000066000000200000007400000068000000650000002000 *000074000000770000006f00000020010401000000080203000000730000002e0000000a000000 *001c010301022200000054000000610000006b0000006500000073000000200000007400000068 *0000006500000020000000690000006e0000007400000065000000720000007300000065000000 *6300000074000000690000006f0000006e000000200000006f0000006600000020000000740000 *0068000000650000002000000074000000770000006f0000002001040100000008020300000073 *0000002e0000000a000000001d0103010211000000490000006e00000066000000690000007800 *00002000000076000000650000007200000073000000690000006f0000006e000000200000006f *00000066000000200104010000002802020000002e0000000a000000001e010301021100000049 *0000006e0000006600000069000000780000002000000076000000650000007200000073000000 *690000006f0000006e000000200000006f00000066000000200104010000002902020000002e00 *00000a000000001f0103010211000000490000006e000000660000006900000078000000200000 *0076000000650000007200000073000000690000006f0000006e000000200000006f0000006600 *0000200104010000002a02020000002e0000000a00000000200103010211000000490000006e00 *00006600000069000000780000002000000076000000650000007200000073000000690000006f *0000006e000000200000006f00000066000000200104010000002b02020000002e0000000a0000 *0000210103010211000000490000006e0000006600000069000000780000002000000076000000 *650000007200000073000000690000006f0000006e000000200000006f00000066000000200104 *010000002c02020000002e0000000a00000000220103023c000000520000006500000074000000 *75000000720000006e000000730000002000000074000000680000006500000020000000730000 *007500000062000000730000006500000074000000200000007700000069000000740000006800 *000020000000690000006e00000064000000690000006300000065000000730000002000000069 *0000006e00000020000000740000006800000065000000200000006f0000007000000065000000 *6e00000020000000690000006e00000074000000650000007200000076000000610000006c0000 *0020000000280000006b0000002c0000006b000000290000002e0000000a00000000230103022a *00000052000000650000007400000075000000720000006e000000730000002000000074000000 *680000006500000020000000730000007500000062000000730000006500000074000000200000 *007700000069000000740000006800000020000000690000006e00000064000000690000006300 *0000650000007300000020000000690000006e000000200000005b0000006b0000002c0000006b *000000290000002e0000000a000000002401030102270000005200000065000000740000007500 *0000720000006e0000007300000020000000740000006800000065000000200000007300000075 *000000620000007300000065000000740000002000000077000000690000007400000068000000 *20000000690000006e000000640000006900000063000000650000007300000020000000690000 *006e00000020000000280000006b0000002c0000006b0102010000005d02020000002e0000000a *0000000025010301022700000052000000650000007400000075000000720000006e0000007300 *000020000000740000006800000065000000200000007300000075000000620000007300000065 *00000074000000200000007700000069000000740000006800000020000000690000006e000000 *640000006900000063000000650000007300000020000000690000006e000000200000005b0000 *006b0000002c0000006b0102010000005d02020000002e0000000a00000000260103023b000000 *430000007200000065000000610000007400000065000000730000002000000074000000680000 *006500000020000000730000007500000062000000730000006500000074000000200000007400 *00006800000061000000740000002000000068000000610000007300000020000000610000006e *00000020000000690000006e00000064000000650000007800000020000000690000006e000000 *200000007400000068000000650000002000000070000000720000006f00000076000000690000 *00640000006500000064000000200000006c0000006900000073000000740000002e0000000a00 *000000270103023a00000043000000720000006500000061000000740000006500000073000000 *200000007400000068000000650000002000000073000000750000006200000073000000650000 *00740000002000000074000000680000006100000074000000200000006d000000610000007400 *00006300000068000000650000007300000020000000610000006c0000006c0000002000000074 *00000068000000650000002000000070000000720000006f000000760000006900000064000000 *650000006400000020000000690000006e00000064000000690000006300000065000000730000 *002e0000000a000000002801030102410000005200000065000000740000007500000072000000 *6e0000007300000020000000740000006800000065000000200000007300000075000000620000 *007300000065000000740000002000000077000000690000007400000068000000200000006100 *00006e00000020000000690000006e000000640000006500000078000000200000006500000071 *00000075000000610000006c00000020000000740000006f000000200000007400000068000000 *650000002000000070000000720000006f00000076000000690000006400000065000000640000 *00200000006b00000065000000790000002e000000200000002000000054000000680000006500 *00000a01023f00000020000000730000006500000074000000200000006d000000750000007300 *00007400000020000000620000006500000020000000690000006e000000640000006500000078 *0000006500000064000000200000006f000000760000006500000072000000200000006b000000 *650000007900000020000000740000007900000070000000650000002c00000020000000640000 *006f000000690000006e00000067000000200000006f0000007400000068000000650000007200 *00007700000069000000730000006500000020000000720000006500000073000000750000006c *000000740000007300000020000000690000006e0000000a021000000020000000720000007500 *00006e00000074000000690000006d00000065000000200000006500000072000000720000006f *000000720000002e0000000a000000002901030102420000005200000065000000740000007500 *0000720000006e0000007300000020000000740000006800000065000000200000007300000075 *000000620000007300000065000000740000002000000077000000690000007400000068000000 *20000000610000006e00000020000000690000006e000000640000006500000078000000200000 *006c000000650000007300000073000000200000007400000068000000610000006e0000002000 *00007400000068000000650000002000000070000000720000006f000000760000006900000064 *0000006500000064000000200000006b00000065000000790000002e0000002000000020000000 *5400000068000000650000000a01023f0000002000000073000000650000007400000020000000 *6d00000075000000730000007400000020000000620000006500000020000000690000006e0000 *006400000065000000780000006500000064000000200000006f00000076000000650000007200 *0000200000006b000000650000007900000020000000740000007900000070000000650000002c *00000020000000640000006f000000690000006e00000067000000200000006f00000074000000 *680000006500000072000000770000006900000073000000650000002000000072000000650000 *0073000000750000006c000000740000007300000020000000690000006e0000000a0210000000 *2000000072000000750000006e00000074000000690000006d0000006500000020000000650000 *0072000000720000006f000000720000002e0000000a000000002a010301024000000052000000 *650000007400000075000000720000006e00000073000000200000007400000068000000650000 *002000000073000000750000006200000073000000650000007400000020000000770000006900 *0000740000006800000020000000610000006e00000020000000690000006e0000006400000065 *000000780000002000000067000000720000006500000061000000740000006500000072000000 *200000007400000068000000610000006e00000020000000740000006800000065000000200000 *0070000000720000006f0000007600000069000000640000006500000064000000200000006b00 *000065000000790000002e0000000a010243000000200000005400000068000000650000002000 *0000730000006500000074000000200000006d0000007500000073000000740000002000000062 *0000006500000020000000690000006e0000006400000065000000780000006500000064000000 *200000006f000000760000006500000072000000200000006b0000006500000079000000200000 *00740000007900000070000000650000002c00000020000000640000006f000000690000006e00 *000067000000200000006f00000074000000680000006500000072000000770000006900000073 *0000006500000020000000720000006500000073000000750000006c0000007400000073000000 *20000000690000006e0000000a02100000002000000072000000750000006e0000007400000069 *0000006d00000065000000200000006500000072000000720000006f000000720000002e000000 *0a000000002b010301023b00000052000000650000007400000075000000720000006e00000073 *000000200000007400000068000000650000002000000073000000750000006200000073000000 *6500000074000000200000007700000069000000740000006800000020000000610000006e0000 *0020000000690000006e000000640000006500000078000000200000006c000000650000007300 *000073000000200000007400000068000000610000006e000000200000006f0000007200000020 *000000650000007100000075000000610000006c00000020000000740000006f00000020000000 *7400000068000000650000000a01023d0000002000000070000000720000006f00000076000000 *69000000640000006500000064000000200000006b00000065000000790000002e000000200000 *002000000054000000680000006500000020000000730000006500000074000000200000006d00 *000075000000730000007400000020000000620000006500000020000000690000006e00000064 *00000065000000780000006500000064000000200000006f000000760000006500000072000000 *200000006b000000650000007900000020000000740000007900000070000000650000002c0000 *0020000000640000006f000000690000006e000000670000000a0225000000200000006f000000 *740000006800000065000000720000007700000069000000730000006500000020000000720000 *006500000073000000750000006c000000740000007300000020000000690000006e0000002000 *000072000000750000006e00000074000000690000006d00000065000000200000006500000072 *000000720000006f000000720000002e0000000a000000002c010301023e000000520000006500 *00007400000075000000720000006e000000730000002000000074000000680000006500000020 *000000730000007500000062000000730000006500000074000000200000007700000069000000 *740000006800000020000000610000006e00000020000000690000006e00000064000000650000 *007800000020000000670000007200000065000000610000007400000065000000720000002000 *00007400000068000000610000006e000000200000006f00000072000000200000006500000071 *00000075000000610000006c00000020000000740000006f000000200000007400000068000000 *650000000a01023d0000002000000070000000720000006f000000760000006900000064000000 *6500000064000000200000006b00000065000000790000002e0000002000000020000000540000 *00680000006500000020000000730000006500000074000000200000006d000000750000007300 *00007400000020000000620000006500000020000000690000006e000000640000006500000078 *0000006500000064000000200000006f000000760000006500000072000000200000006b000000 *650000007900000020000000740000007900000070000000650000002c00000020000000640000 *006f000000690000006e000000670000000a0225000000200000006f0000007400000068000000 *650000007200000077000000690000007300000065000000200000007200000065000000730000 *00750000006c000000740000007300000020000000690000006e00000020000000720000007500 *00006e00000074000000690000006d00000065000000200000006500000072000000720000006f *000000720000002e0000000a000000002d010301023f0000005200000065000000740000007500 *0000720000006e0000007300000020000000740000006800000065000000200000007300000075 *000000620000007300000065000000740000002000000077000000690000007400000068000000 *20000000610000006e00000020000000690000006e000000640000006500000078000000200000 *0077000000690000007400000068000000690000006e0000002000000074000000680000006500 *000020000000690000006e00000074000000650000007200000076000000610000006c00000020 *00000070000000720000006f00000076000000690000006400000065000000640000002e000000 *0a01023b0000002000000054000000680000006500000020000000620000006f00000074000000 *740000006f0000006d000000200000006f00000066000000200000007400000068000000650000 *0020000000690000006e00000074000000650000007200000076000000610000006c0000002000 *0000690000007300000020000000630000006c0000006f00000073000000650000006400000020 *000000610000006e00000064000000200000007400000068000000650000002000000074000000 *6f00000070000000200000006900000073000000200000006f00000070000000650000006e0000 *002c0000000a01023e00000020000000690000002e00000020000000650000002e000000200000 *005b0000006b000000310000003b0000006b00000032000000290000002e000000200000002000 *000054000000680000006500000020000000730000006500000074000000200000006d00000075 *000000730000007400000020000000620000006500000020000000690000006e00000064000000 *65000000780000006500000064000000200000006f000000760000006500000072000000200000 *006b000000650000007900000020000000740000007900000070000000650000002c0000002000 *0000640000006f000000690000006e000000670000000a0225000000200000006f000000740000 *006800000065000000720000007700000069000000730000006500000020000000720000006500 *000073000000750000006c000000740000007300000020000000690000006e0000002000000072 *000000750000006e00000074000000690000006d00000065000000200000006500000072000000 *720000006f000000720000002e0000000a000000002e0103010240000000520000006500000074 *00000075000000720000006e00000073000000200000006c000000690000007300000074000000 *73000000200000006f0000006600000020000000650000006c000000650000006d000000650000 *006e00000074000000730000002000000070000000610000006900000072000000650000006400 *000020000000770000006900000074000000680000002000000074000000680000006500000020 *000000690000006e00000064000000690000006300000065000000730000002000000064000000 *650000007400000065000000720000006d000000690000006e0000006500000064000000200000 *0062000000790000000a0211000000200000007400000079000000700000006500000020000000 *690000006e000000660000006500000072000000650000006e00000063000000650000002e0000 *000a000000002f0103010228000000410000002000000066000000750000006e00000063000000 *74000000690000006f0000006e00000020000000660000006f0000007200000020000000620000 *0075000000690000006c00000064000000690000006e0000006700000020000000750000007000 *00002000000073000000650000006c0000006500000063000000740000006f0000007200000073 *000000200000006f0000006e0000002001040100000008010210000000730000002e0000002000 *0000200000005500000073000000650000006400000020000000690000006e0000002000000074 *00000068000000650000000a01024100000020000000760000006100000072000000690000006f *0000007500000073000000200000006700000065000000740000002a0000002000000066000000 *750000006e0000006300000074000000690000006f0000006e000000730000002e000000200000 *002000000054000000680000006500000020000000730000006500000074000000200000006d00 *000075000000730000007400000020000000620000006500000020000000690000006e00000064 *00000065000000780000006500000064000000200000006f000000760000006500000072000000 *200000006b000000650000007900000020000000740000007900000070000000650000002c0000 *000a022b00000020000000640000006f000000690000006e00000067000000200000006f000000 *740000006800000065000000720000007700000069000000730000006500000020000000720000 *006500000073000000750000006c000000740000007300000020000000690000006e0000002000 *000072000000750000006e00000074000000690000006d00000065000000200000006500000072 *000000720000006f000000720000002e0000000a00000000450103010228000000410000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000002000000066 *0000006f00000072000000200000006200000075000000690000006c0000006400000069000000 *6e000000670000002000000075000000700000002000000073000000650000006c000000650000 *0063000000740000006f0000007200000073000000200000006f0000006e000000200104010000 *0008010210000000730000002e0000002000000020000000550000007300000065000000640000 *0020000000690000006e000000200000007400000068000000650000000a010241000000200000 *00760000006100000072000000690000006f000000750000007300000020000000670000006500 *0000740000002a0000002000000066000000750000006e0000006300000074000000690000006f *0000006e000000730000002e000000200000002000000054000000680000006500000020000000 *730000006500000074000000200000006d00000075000000730000007400000020000000620000 *006500000020000000690000006e00000064000000650000007800000065000000640000002000 *00006f000000760000006500000072000000200000006b00000065000000790000002000000074 *0000007900000070000000650000002c0000000a022b00000020000000640000006f0000006900 *00006e00000067000000200000006f000000740000006800000065000000720000007700000069 *000000730000006500000020000000720000006500000073000000750000006c00000074000000 *7300000020000000690000006e0000002000000072000000750000006e00000074000000690000 *006d00000065000000200000006500000072000000720000006f000000720000002e0000000a00 *000000300103010211000000530000007400000061000000740000006900000073000000740000 *006900000063000000730000002000000061000000620000006f00000075000000740000002001 *0401000000080102220000002e0000002000000054000000680000006900000073000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000007200 *0000650000007400000075000000720000006e0000007300000020000000710000007500000061 *000000640000007200000075000000700000006c000000650000000a0102430000002000000063 *0000006f0000006e00000073000000690000007300000074000000690000006e00000067000000 *200000006f0000006600000020000000310000002e00000020000000740000006f000000740000 *00610000006c000000200000006e000000750000006d0000006200000065000000720000002000 *00006f0000006600000020000000650000006c000000650000006d000000650000006e00000074 *0000007300000020000000690000006e0000002000000074000000680000006500000020000000 *73000000650000007400000020000000320000002e000000200000006e000000750000006d0000 *00620000006500000072000000200000006f000000660000000a01024000000020000000640000 *0065000000630000006c0000006100000072000000650000006400000020000000690000006e00 *0000640000006900000063000000650000007300000020000000330000002e000000200000006e *000000750000006d000000620000006500000072000000200000006f0000006600000020000000 *6b00000065000000790000007300000020000000690000006e00000020000000610000006c0000 *006c00000020000000690000006e00000064000000690000006300000065000000730000002000 *0000340000002e000000200000006e000000750000006d00000062000000650000007200000020 *0000006f000000660000000a0102420000002000000076000000610000006c0000007500000065 *0000007300000020000000690000006e00000020000000610000006c0000006c00000020000000 *6b00000065000000790000007300000020000000690000006e00000020000000610000006c0000 *006c00000020000000690000006e00000064000000690000006300000065000000730000002e00 *000020000000540000006800000069000000730000002000000063000000610000006e00000020 *00000061000000690000006400000020000000790000006f000000750000002000000069000000 *6e00000020000000640000006500000062000000750000006700000067000000690000006e0000 *00670000000a021300000020000000610000006e00000064000000200000006f00000070000000 *74000000690000006d00000069000000730000006100000074000000690000006f0000006e0000 *002e0000000a002f00000000000000010000000400000005000000060000000700000008000000 *090000000a0000000b0000000c0000000d0000000e0000000f0000001000000011000000120000 *00130000001400000015000000160000001700000018000000190000001a0000001b0000001c00 *00001d0000001e0000001f00000020000000210000002200000023000000240000002500000026 *0000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000 *302d000000080000000500000006000000070000000a0000000b00000009000000040000000c00 *00000d0000000e0000000f00000010000000120000001300000011000000150000001600000017 *0000001400000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000 *200000002100000022000000230000002400000025000000260000002700000028000000290000 *002a0000002b0000002c0000002d0000002e0000002f00000030002d0000000400000000050200 *0000060000000700000006000000000700000000080000000009000000000a000000000b000000 *000c000000000d000000000e000000000f00000000100000000011000000001200000000130000 *00001400000000150000000016000000001700000000180000000019000000001a000000001b00 *0000001c000000001d000000001e000000001f0000000020000000002100000000220000000023 *000000002400000000250000000026000000002700000000280000000029000000002a00000000 *2b000000002c000000002d000000002e000000002f000000003000000000000000004600000000 *000000010300000003000000000000000101000000030000000000000001000000000400000000 *000000010000000005000000000000000203000000060000000000000002030000000700000000 *000000020000000008000000000000000200000000090000000000000002030000000a00000000 *00000002000000000b0000000000000002000000000c0000000000000002000000000d00000000 *00000002000000000e000000000000000200000000040000000000000002000000000500000000 *00000002000000000f000000000000000200000000100000000000000002000000001100000000 *000000020000000012000000000000000200000000130000000000000002000000001400000000 *000000020000000015000000000000000200000000160000000000000002000000001700000000 *000000020000000018000000000000000200000000190000000000000002000000001a00000000 *00000002000000001b0000000000000002000000001c0000000000000002000000001d00000000 *00000002000000001e0000000000000002000000001f0000000000000002000000002000000000 *000000020000000021000000000000000200000000220000000000000002000000002300000000 *000000020000000024000000000000000200000000250000000000000002000000002600000000 *000000020000000027000000000000000200000000280000000000000002000000002900000000 *00000002000000002a0000000000000002000000002b0000000000000002000000002c00000000 *00000002000000002d0000000000000002000000002e0000000000000002000000002f00000000 *000000020000000030000000310000003203000000330000003400000035030000003600000000 *000000010000000037000000000000000100000000380000000000000001000000003900000000 *00000001000000003a000000310000003b030000003c0000000000000002010000000a00000000 *00000002000000003d0000000000000002000000003e0000000000000002000000003f00000000 *000000020000000040000000340000004103000000420000004300000044030000004500000000 *000000020000000046000000000000000200000000470000000000000002000000004800000034 *00000049010000004a000000430000004b010000004c000000430000004b010000004d00000000 *00000002000000004e000000000000004f000000000000001568617070737461636b2d69787365 *742d302e352e30000000000000001748617070737461636b2e446174612e49785365742e497800 *0000000000001448617070737461636b2e446174612e4978536574000000000000000249780000 *000000000006696e73657274000000000000000664656c6574650000000000000007496e646578 *4f700000000000000009496e64657861626c650000000000000005656d70747900000000000000 *0563616c6373000000000000000549785365740000000000000005697853657400000000000000 *076e6f43616c6373000000000000000a696e666572497853657400000000000000066368616e67 *6500000000000000087570646174654978000000000000000864656c6574654978000000000000 *0005746f536574000000000000000766726f6d536574000000000000000866726f6d4c69737400 *0000000000000473697a650000000000000006746f4c69737400000000000000066765744f6e65 *00000000000000086765744f6e654f7200000000000000046e756c6c0000000000000003262626 *00000000000000037c7c7c0000000000000005756e696f6e000000000000000c696e7465727365 *6374696f6e0000000000000002403d0000000000000002403c0000000000000002403e00000000 *00000003403c3d0000000000000003403e3d0000000000000003403e3c0000000000000004403e *3d3c0000000000000004403e3c3d0000000000000005403e3d3c3d0000000000000002402b0000 *000000000002402a0000000000000005676574455100000000000000056765744c540000000000 *000005676574475400000000000000066765744c54450000000000000006676574475445000000 *000000000867657452616e6765000000000000000767726f757042790000000000000006676574 *4f7264000000000000000573746174730000000000000012636f6e7461696e6572732d302e332e *302e300000000000000008446174612e4d617000000000000000034d6170000000000000000462 *617365000000000000000d446174612e5479706561626c6500000000000000085479706561626c *65000000000000000b636f6e5f49785f44617461000000000000000b6978547970655f44617461 *00000000000000086978436f6e737472000000000000000a697844617461547970650000000000 *000008446174612e5365740000000000000003536574000000000000000b6978536574436f6e73 *7472000000000000000d69785365744461746154797065000000000000000f7479566172426e64 *72546f4e616d650000000000000007666c617474656e00000000000000084748432e4261736500 *00000000000006537472696e6700000000000000086768632d7072696d00000000000000094748 *432e54797065730000000000000004436861720000000000000006746f53657427000000000000 *000866726f6d536574270000000000000007746f4c69737427000000000000000a446174612e4d *6179626500000000000000074e6f7468696e6700000000000000084748432e426f6f6c00000000 *0000000454727565000000000000000546616c736500000000000000076765744f726432 addfile ./docs/0.5.0/happstack-ixset/haskell_icon.gif binary ./docs/0.5.0/happstack-ixset/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/happstack-ixset/index-frames.html hunk ./docs/0.5.0/happstack-ixset/index-frames.html 1 + + +happstack-ixset-0.5.0: Efficient relational queries on Haskell sets.

    Happstack.Data.IxSet
    Happstack.Data.IxSet.Ix

    addfile ./docs/0.5.0/happstack-ixset/index.html hunk ./docs/0.5.0/happstack-ixset/index.html 1 + + +happstack-ixset-0.5.0: Efficient relational queries on Haskell sets.
     happstack-ixset-0.5.0: Efficient relational queries on Haskell sets.ContentsIndex
    happstack-ixset-0.5.0: Efficient relational queries on Haskell sets.
    Just pick which parts of your data structures you want indexed using an easy to use template-haskell function. Spare yourself the need to write, run, and maintain code that marshalls your data to/from an external relational database just for efficient queries. happstack-ixset relies on generics and TH to spare you the boilerplate normally required for such tasks. +
    Modules
    show/hideHappstack
    show/hideData
    show/hideHappstack.Data.IxSetAn efficient implementation of queryable sets. +
    Happstack.Data.IxSet.Ix
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-ixset/mini_Happstack-Data-IxSet-Ix.html hunk ./docs/0.5.0/happstack-ixset/mini_Happstack-Data-IxSet-Ix.html 1 + + +Happstack.Data.IxSet.Ix
    Happstack.Data.IxSet.Ix
    data Ix a
    addfile ./docs/0.5.0/happstack-ixset/mini_Happstack-Data-IxSet.html hunk ./docs/0.5.0/happstack-ixset/mini_Happstack-Data-IxSet.html 1 + + +Happstack.Data.IxSet
    Happstack.Data.IxSet

    Set type +

    data IxSet a
    class Indexable a b

    Changes to set +

    type IndexOp

    Creation +

    Conversion +

    Size checking +

    Set operations +

    Indexing +

    Debugging and optimisation +

    addfile ./docs/0.5.0/happstack-ixset/minus.gif binary ./docs/0.5.0/happstack-ixset/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/happstack-ixset/plus.gif binary ./docs/0.5.0/happstack-ixset/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b adddir ./docs/0.5.0/happstack-ixset/src addfile ./docs/0.5.0/happstack-ixset/src/Happstack-Data-IxSet-Ix.html hunk ./docs/0.5.0/happstack-ixset/src/Happstack-Data-IxSet-Ix.html 1 + + + + +src/Happstack/Data/IxSet/Ix.hs + + + +
    {-# LANGUAGE UndecidableInstances, OverlappingInstances, FlexibleInstances,
    +             MultiParamTypeClasses, TemplateHaskell, PolymorphicComponents,
    +             DeriveDataTypeable,ExistentialQuantification #-}
    +
    +{- |
    +
    +This module defines typable indices and convenience functions. Should
    +be probably considered private to 'Happstack.Data.IxSet'.
    +
    +-}
    +module Happstack.Data.IxSet.Ix 
    +    ( Ix(..)
    +    , insert
    +    , delete
    +    ) 
    +    where
    +
    +import Data.Generics hiding (GT)
    +import           Data.Map (Map)
    +import qualified Data.Map as Map
    +import           Data.Set (Set)
    +import qualified Data.Set as Set
    +import qualified Data.Generics.SYB.WithClass.Basics as SYBWC
    +
    +-- the core datatypes
    +
    +-- | 'Ix' is a 'Map' from some 'Typeable' key to a set of values for
    +-- that key.  'Ix' carries type information inside.
    +data Ix a = forall key . (Typeable key, Ord key) => Ix (Map key (Set a))
    +    deriving Typeable
    +
    + -- minimal hacky instance
    +instance Data a => Data (Ix a) where
    +    toConstr (Ix _) = con_Ix_Data
    +    gunfold _ _     = error "gunfold"
    +    dataTypeOf _    = ixType_Data
    +
    +
    +con_Ix_Data :: Constr
    +con_Ix_Data = mkConstr ixType_Data "Ix" [] Prefix
    +ixType_Data :: DataType
    +ixType_Data = mkDataType "Happstack.Data.IxSet.Ix" [con_Ix_Data]
    +
    +ixConstr :: SYBWC.Constr
    +ixConstr = SYBWC.mkConstr ixDataType "Ix" [] SYBWC.Prefix
    +ixDataType :: SYBWC.DataType
    +ixDataType = SYBWC.mkDataType "Ix" [ixConstr]
    +
    +instance (SYBWC.Data ctx a, SYBWC.Sat (ctx (Ix a)))
    +       => SYBWC.Data ctx (Ix a) where
    +    gfoldl = error "gfoldl Ix"
    +    toConstr _ (Ix _)    = ixConstr
    +    gunfold = error "gunfold Ix"
    +    dataTypeOf _ _ = ixDataType
    +
    +-- modification operations
    +
    +-- | Convenience function for inserting into 'Map's of 'Set's as in
    +-- the case of an 'Ix'.  If they key did not already exist in the
    +-- 'Map', then a new 'Set' is added transparently.
    +insert :: (Ord a, Ord k)
    +       => k -> a -> Map k (Set a) -> Map k (Set a)
    +insert k v index = Map.insertWith Set.union k (Set.singleton v) index
    +
    +-- | Convenience function for deleting from 'Map's of 'Set's If the
    +-- resulting 'Set' is empty, then the entry is removed from the 'Map'.
    +delete :: (Ord a, Ord k)
    +       => k -> a -> Map k (Set a) -> Map k (Set a)
    +delete k v index = Map.update remove k index
    +    where
    +    remove set = let set' = Set.delete v set
    +                 in if Set.null set' then Nothing else Just set'
    +
    +
    + addfile ./docs/0.5.0/happstack-ixset/src/Happstack-Data-IxSet.html hunk ./docs/0.5.0/happstack-ixset/src/Happstack-Data-IxSet.html 1 + + + + +src/Happstack/Data/IxSet.hs + + + +
    {-# LANGUAGE UndecidableInstances, OverlappingInstances, FlexibleInstances,
    +             MultiParamTypeClasses, TemplateHaskell, RankNTypes,
    +             FunctionalDependencies, DeriveDataTypeable,
    +             GADTs, CPP, ScopedTypeVariables #-}
    +
    +
    +{- |
    +Description:
    +
    +An efficient implementation of queryable sets.
    +
    +Assume you have a type like:
    +
    + @data Entry = Entry Author [Author] Updated Id Content
    +  newtype Updated = Updated EpochTime
    +  newtype Id = Id Int64
    +  newtype Content = Content String
    +  newtype Author = Author Email
    +  type Email = String@
    +
    +1. Decide what parts of your type you want indexed and
    +   make your type an instance of Indexable
    +
    +  @instance Indexable Entry () where
    +    empty = ixSet 
    +                [ Ix (Map.empty::Map Author (Set Entry)) -- out of order
    +                , Ix (Map.empty::Map Id (Set Entry))
    +                , Ix (Map.empty::Map Updated (Set Entry))
    +                , Ix (Map.empty::Map Test (Set Entry))   -- bogus index
    +                , Ix (Map.empty::Map Word (Set Entry))   -- text index
    +                ]
    +    calcs entry = () -- words for text indexing purposes @
    +
    +3. Use 'insert', 'delete', 'updateIx', 'deleteIx' and 'empty' to build
    +   up an 'IxSet' collection
    +
    +    @entries = foldr insert empty [e1,e2,e3,e4]@
    +    @entries' = foldr delete entries [e1,e3]@
    +    @entries'' = update e4 e5 entries@
    +
    +4. Use the query functions below to grab data from it.  e.g.
    +
    +     @entries \@< (Updated t1) \@= (Author \"john\@doe.com\")@
    +
    +  will find all items in entries updated earlier than @t1@ by
    +  @john\@doe.com@.
    +
    +5. Text Index
    +
    +If you want to do add a text index extract the words in entry and pass
    +them in the 'calc' method of the 'Indexable' class.  Then if you want
    +all entries with either word1 or word2, you change the instance to
    +
    +    @getWords entry = let Just (Content s) =
    +                           gGet entry in map Word $ words s@
    +
    +    @instance Indexable Entry [Word] where
    +    ....
    +    calcs entry = getWords entry@
    +
    +Now you can do this query to find entries with any of the words
    +
    +   @entries \@+ [Word \"word1\",Word \"word2\"]@
    +
    +And if you want all entries with both:
    +
    +   @entries \@* [Word \"word1\",Word \"word2\"]@
    +
    +6. Find only the first author
    +
    +If an Entry has multiple authors and you want to be able to query
    +on the first author, define a @FirstAuthor@ datatype and add it to the
    +result of calc.  calc @e = (toWords e, getFirstAuthor e)@ and now you can
    +do
    +
    +   @newtype FirstAuthor = FirstAuthor Email@
    +   
    +   @getFirstAuthor = let Just (Author a) = 
    +                          gGet Entry in FirstAuthor a@
    +
    +   @instance Indexable Entry ([Word],FirstAuthor)
    +    ...
    +    empty = ....
    +             Ix (Map.empty::Map FirstAuthor (Set Entry))]
    +    calcs entry = (getWords Entry,getFirstAuthor entry)
    +
    +    entries \@= (FirstAuthor \"john\@doe.com\")  -- guess what this does@
    +
    +-}
    +
    +module Happstack.Data.IxSet 
    +    (
    +     module Ix,
    +         
    +     -- * Set type
    +     IxSet,
    +     Indexable(..),
    +     noCalcs,
    +     inferIxSet,
    +     ixSet,
    +               
    +     -- * Changes to set
    +     IndexOp,
    +     change,
    +     insert,
    +     delete,
    +     updateIx,
    +     deleteIx,
    +
    +     -- * Creation
    +     fromSet,
    +     fromList,
    +
    +     -- * Conversion
    +     toSet,
    +     toList,
    +     getOne,
    +     getOneOr,
    +
    +     -- * Size checking
    +     size,
    +     null,
    +
    +     -- * Set operations
    +     (&&&),
    +     (|||),
    +     union,
    +     intersection,
    +
    +     -- * Indexing
    +     (@=),
    +     (@<),
    +     (@>),
    +     (@<=),
    +     (@>=),
    +     (@><),
    +     (@>=<),
    +     (@><=),
    +     (@>=<=),
    +     (@+),
    +     (@*),
    +     getEQ,
    +     getLT,
    +     getGT,
    +     getLTE,
    +     getGTE,
    +     getRange,
    +     groupBy,
    +     getOrd,
    +
    +     -- * Debugging and optimisation
    +     stats
    +)
    +where
    +
    +import qualified Happstack.Data.IxSet.Ix as Ix
    +import           Happstack.Data.IxSet.Ix (Ix(Ix))
    +import Data.Generics (Data, gmapQ)
    +import Data.Maybe
    +import Data.Monoid
    +import           Data.List (partition)
    +import qualified Data.List as List
    +import           Data.Map (Map)
    +import qualified Data.Map as Map
    +import           Data.Set (Set)
    +import qualified Data.Set as Set
    +import Happstack.Util.Common
    +import Control.Monad.Reader
    +import Language.Haskell.TH as TH
    +
    +import Happstack.Util.TH
    +import Happstack.Data
    +import qualified Data.Generics.SYB.WithClass.Basics as SYBWC
    +import Prelude hiding (null)
    +
    +-- the core datatypes
    +
    +data IxSet a = IxSet [Ix a]
    +    deriving (Data, Typeable)
    +
    +-- | Create an 'IxSet' using list of indices. Useful in 'Indexable'
    +-- 'empty' method.
    +ixSet :: [Ix a] -> IxSet a
    +ixSet = IxSet
    +
    +instance (Eq a,Ord a,Typeable a) => Eq (IxSet a) where
    +    IxSet (Ix a:_) == IxSet (Ix b:_) = 
    +        case cast b of
    +          Just b' -> a==b'
    +          Nothing -> error "trying to compare two sets with different types of first indices, this is a bug in library"
    +    _ == _ = error "comparing sets without indices, this is a bug in library"
    +
    +instance (Eq a,Ord a,Typeable a) => Ord (IxSet a) where
    +    compare a b = compare (toSet a) (toSet b)
    +
    +instance Version (IxSet a)
    +instance (Serialize a, Ord a, Data a, Indexable a b) => Serialize (IxSet a) where
    +    putCopy = contain . safePut . toList
    +    getCopy = contain $ liftM fromList safeGet
    +
    +instance (SYBWC.Data ctx a, SYBWC.Sat (ctx (IxSet a)), SYBWC.Sat (ctx [a]),
    +          Indexable a b, Data a, Ord a)
    +       => SYBWC.Data ctx (IxSet a) where
    +    gfoldl _ f z (IxSet x)  = z fromList `f` toList' x
    +    toConstr _ (IxSet _) = ixSetConstr
    +    gunfold _ k z c  = case SYBWC.constrIndex c of
    +                       1 -> k (z fromList)
    +                       _ -> error "IxSet.SYBWC.Data.gunfold unexpected match"
    +    dataTypeOf _ _ = ixSetDataType
    +
    +ixSetConstr :: SYBWC.Constr
    +ixSetConstr = SYBWC.mkConstr ixSetDataType "IxSet" [] SYBWC.Prefix
    +ixSetDataType :: SYBWC.DataType
    +ixSetDataType = SYBWC.mkDataType "IxSet" [ixSetConstr]
    +
    +
    +
    +instance (Indexable a b, Data a, Ord a, Default a) => Default (IxSet a) where
    +    defaultValue = empty
    +
    +instance (Ord a,Show a) => Show (IxSet a) where show = show . toSet
    +
    +instance (Ord a,Read a,Data a,Indexable a b) => Read (IxSet a) where
    +    readsPrec n = mapFst fromSet . readsPrec n
    +
    +{- | 'Indexable' class defines objects that can be members of 'IxSet'. 
    +     If you don't want calculated values use @'Indexable' a ()@.
    +-}
    +class (Data b) => Indexable a b | a -> b where
    +    -- | Method 'empty' defines what an empty 'IxSet' for this
    +    -- particular type should look like.  It should have all necessary
    +    -- indices. Use 'ixSet' function to create the set.
    +    empty :: IxSet a
    +    -- | Method 'calcs' adds indexable values not found in the
    +    -- type. Those end up in indices just like other types found in
    +    -- objects. If you don't want any calculated values just use
    +    -- 'noCalcs'.
    +    calcs :: a -> b
    +        --should this be a fromDyn so we can provide a default impl?
    +           
    +-- | Function to be used for 'calcs' in the case of an @'Indexable' a ()@
    +-- instance.
    +noCalcs :: t -> ()
    +noCalcs _ = ()
    +
    +{- | Template Haskell helper function for automatically building an
    +   'Indexable' instance from a data type, e.g.
    +
    +   @data Foo = Foo Int String@ 
    +   
    +   and
    +   
    +   @$(inferIxSet \"FooDB\" ''Foo 'noCalcs [''Int,''String])@ 
    +   
    +   will build a type synonym 
    +
    +   @type FooDB = IxSet Foo@ 
    +   
    +   with @Int@ and @String@ as indices.
    +
    +   WARNING: The type specified as the first index must be a type which
    +   appears in all values in the 'IxSet' or 'toList' and 'toSet' will
    +   not function properly. You will be warned not to do this by runtime error.
    +   You can always use the element type itself. For example:
    +  
    +   @$(inferIxSet \"FooDB\" ''Foo 'noCalcs [''Foo, ''Int, ''String])@
    +
    +-} 
    +inferIxSet :: String -> TH.Name -> TH.Name -> [TH.Name] -> Q [Dec]
    +inferIxSet _ _ _ [] = error "inferIxSet needs at least one index"
    +inferIxSet ixset typeName calName entryPoints
    +    = do calInfo <- reify calName
    +         typeInfo <- reify typeName
    +         let (context,binders) = case typeInfo of
    +                                 TyConI (DataD ctxt _ nms _ _) -> (ctxt,nms)
    +                                 TyConI (NewtypeD ctxt _ nms _ _) -> (ctxt,nms)
    +                                 TyConI (TySynD _ nms _) -> ([],nms)
    +                                 _ -> error "IxSet.inferIxSet typeInfo unexpected match"
    +
    +             names = map tyVarBndrToName binders
    +
    +             typeCon = foldl appT (conT typeName) (map varT names)
    +         case calInfo of
    +           VarI _ t _ _ ->
    +               let calType = getCalType t
    +                   getCalType (ForallT _names _ t') = getCalType t'
    +                   getCalType (AppT (AppT ArrowT _) t') = t'
    +                   getCalType t' = error ("Unexpected type in getCalType: " ++ pprint t')
    +                   mkEntryPoint n = appE (conE 'Ix) (sigE (varE 'Map.empty) (forallT binders (return context) $
    +                                                                             appT (appT (conT ''Map) (conT n)) (appT (conT ''Set) typeCon)))
    +               in do i <- instanceD' (return context) (appT (appT (conT ''Indexable) typeCon) (return calType))
    +                          [d| empty :: IxSet a
    +                              empty = ixSet $(listE (map mkEntryPoint entryPoints))
    +                              calcs :: a -> b
    +                              calcs = $(varE calName) |]
    +                     let ixType = appT (conT ''IxSet) typeCon
    +                     ixType' <- tySynD (mkName ixset) binders ixType
    +                     return $ [i, ixType']  -- ++ d
    +           _ -> error "IxSet.inferIxSet calInfo unexpected match"
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +tyVarBndrToName :: TyVarBndr -> Name
    +tyVarBndrToName (PlainTV nm) = nm
    +tyVarBndrToName (KindedTV nm _) = nm
    +#else
    +tyVarBndrToName :: a -> a
    +tyVarBndrToName = id
    +#endif
    +
    +
    +
    +-- modification operations
    +
    +type IndexOp =
    +    forall k a. (Ord k,Ord a) => k -> a -> Map k (Set a) -> Map k (Set a)
    +
    +-- | Generically traverses the argument and converts all data in it to
    +-- 'Dynamic' and returns all the internal data as a list of 'Dynamic'.
    +--
    +-- This function properly handles 'String' as 'String' not as @['Char']@.
    +flatten :: (Typeable a, Data a, Typeable b) => a -> [b]
    +flatten x = case cast x of
    +              Just y -> case cast (y :: String) of
    +                          Just v -> [v]
    +                          Nothing -> []
    +              Nothing -> case cast x of
    +                           Just v -> v : concat (gmapQ flatten x)
    +                           Nothing -> concat (gmapQ flatten x)
    +
    +-- | Higher order operator for modifying 'IxSet's.  Use this when your
    +-- final function should have the form @a -> IxSet a -> IxSet a@,
    +-- e.g. 'insert' or 'delete'.
    +change :: (Data a, Ord a,Data b,Indexable a b) =>
    +          IndexOp -> a -> IxSet a -> IxSet a
    +change op x (IxSet indices) = 
    +    IxSet v
    +    where
    +    v = zipWith update (True:repeat False) indices
    +    a = (x,calcs x)
    +    update firstindex (Ix index) = Ix index'
    +        where
    +        keyType = typeOf ((undefined :: Map key (Set a) -> key) index)
    +        ds = flatten a
    +        ii dkey = op dkey x
    +        index' = if firstindex && List.null ds
    +                 then error $ "Happstack.Data.IxSet.change: all values must appear in first declared index " ++ show keyType ++ " of " ++ show (typeOf x)
    +                 else foldr ii index ds -- handle multiple values
    +
    +-- | Inserts an item into the 'IxSet'. If your data happens to have
    +-- primary key this function might not be what you want. See
    +-- 'updateIx'.
    +insert :: (Data a, Ord a,Data b,Indexable a b) => a -> IxSet a -> IxSet a
    +insert = change Ix.insert
    +
    +-- | Removes an item from the 'IxSet'.
    +delete :: (Data a, Ord a,Data b,Indexable a b) => a -> IxSet a -> IxSet a
    +delete = change Ix.delete
    +
    +-- | Will replace the item with index k.  Only works if there is at
    +-- most one item with that index in the 'IxSet'. Will not change
    +-- 'IxSet' if you have more then 1 item with given index.
    +updateIx :: (Indexable a b, Ord a, Data a, Typeable k)
    +         => k -> a -> IxSet a -> IxSet a
    +updateIx i new ixset = insert new $
    +                     maybe ixset (flip delete ixset) $
    +                     getOne $ ixset @= i
    +
    +-- | Will delete the item with index k.  Only works if there is at
    +-- most one item with that index in the 'IxSet'. Will not change
    +-- 'IxSet' if you have more then 1 item with given index.
    +deleteIx :: (Indexable a b, Ord a, Data a, Typeable k)
    +         => k -> IxSet a -> IxSet a
    +deleteIx i ixset = maybe ixset (flip delete ixset) $
    +                       getOne $ ixset @= i
    +
    +-- conversion operations
    +
    +-- | Converts an 'IxSet' to a 'Set' of its elements.
    +toSet :: Ord a => IxSet a -> Set a
    +toSet (IxSet idxs) = toSet' idxs
    +
    +-- | Takes a list of 'Ix's and converts it into a 'Set'.
    +toSet' :: Ord a => [Ix a] -> Set a
    +toSet' (Ix ix:_) = Map.fold Set.union Set.empty ix
    +toSet' [] = Set.empty
    +
    +-- | Converts a 'Set' to an 'IxSet'.
    +fromSet :: (Indexable a b, Ord a, Data a) => Set a -> IxSet a
    +fromSet set = Set.fold insert empty set
    +
    +-- | Converts a 'Set' to an 'IxSet'.
    +fromSet' :: (Indexable a b, Ord a, Data a) => Set a -> IxSet a
    +fromSet' set = Set.fold insert empty set
    +
    +-- | Converts a list to an 'IxSet'.
    +fromList :: (Indexable a b, Ord a, Data a) => [a] -> IxSet a
    +fromList = fromSet . Set.fromList
    +
    +-- | Returns the number of unique items in the 'IxSet'.
    +size :: Ord a => IxSet a -> Int
    +size = Set.size . toSet
    +
    +-- | Converts an 'IxSet' to its list of elements.
    +toList :: Ord a => IxSet a -> [a]
    +toList = Set.toList . toSet
    +
    +-- | Converts a list of 'Ix's to list of elements. 
    +toList' :: Ord a => [Ix a] -> [a]
    +toList' = Set.toList . toSet'
    +
    +-- | If the 'IxSet' is a singleton it will return the one item stored in it.
    +-- If 'IxSet' is empty or has many elements this function returns 'Nothing'.
    +getOne :: Ord a => IxSet a -> Maybe a
    +getOne ixset = case toList ixset of
    +                   [x] -> Just x
    +                   _   -> Nothing
    +
    +-- | Like 'getOne' with a user provided default.
    +getOneOr :: Ord a => a -> IxSet a -> a
    +getOneOr def = fromMaybe def . getOne
    +
    +-- | Return 'True' if the 'IxSet' is empty, 'False' otherwise.
    +null :: IxSet a -> Bool
    +null (IxSet (Ix ix:_)) = Map.null ix
    +null (IxSet [])        = True
    +
    +-- set operations
    +
    +-- | An infix 'intersection' operation.
    +(&&&) :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet a
    +(&&&) = intersection
    +
    +-- | An infix 'union' operation.
    +(|||) :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet a
    +(|||) = union
    +
    +infixr 5 &&&
    +infixr 5 |||
    +
    +-- | Takes the union of the two 'IxSet's.
    +union :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet a
    +union x1 x2 = fromSet $ Set.union (toSet x1) (toSet x2)
    +
    +-- | Takes the intersection of the two 'IxSet's.
    +intersection :: (Ord a, Data a, Indexable a b) => IxSet a -> IxSet a -> IxSet a
    +intersection x1 x2 = fromSet $ Set.intersection (toSet x1) (toSet x2)
    +
    +
    +-- query operators
    +
    +-- | Infix version of 'getEQ'.
    +(@=) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> k -> IxSet a
    +ix @= v = getEQ v ix
    +
    +-- | Infix version of 'getLT'.
    +(@<) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> k -> IxSet a
    +ix @< v = getLT v ix
    +
    +-- | Infix version of 'getGT'.
    +(@>) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> k -> IxSet a
    +ix @> v = getGT v ix
    +
    +-- | Infix version of 'getLTE'.
    +(@<=) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> k -> IxSet a
    +ix @<= v = getLTE v ix
    +
    +-- | Infix version of 'getGTE'.
    +(@>=) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> k -> IxSet a
    +ix @>= v = getGTE v ix
    +
    +-- | Returns the subset with indices in the open interval (k,k).
    +(@><) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> (k, k) -> IxSet a
    +ix @>< (v1,v2) = getLT v2 $ getGT v1 ix
    +
    +-- | Returns the subset with indices in [k,k).
    +(@>=<) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> (k, k) -> IxSet a
    +ix @>=< (v1,v2) = getLT v2 $ getGTE v1 ix
    +
    +-- | Returns the subset with indices in (k,k].
    +(@><=) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> (k, k) -> IxSet a
    +ix @><= (v1,v2) = getLTE v2 $ getGT v1 ix
    +
    +-- | Returns the subset with indices in [k,k].
    +(@>=<=) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> (k, k) -> IxSet a
    +ix @>=<= (v1,v2) = getLTE v2 $ getGTE v1 ix
    +
    +-- | Creates the subset that has an index in the provided list.
    +(@+) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> [k] -> IxSet a
    +ix @+ list = foldr union empty        $ map (ix @=) list
    +
    +-- | Creates the subset that matches all the provided indices.
    +(@*) :: (Indexable a b, Data a, Ord a, Typeable k)
    +    => IxSet a -> [k] -> IxSet a
    +ix @* list = foldr intersection empty $ map (ix @=) list
    +
    +-- | Returns the subset with an index equal to the provided key.  The
    +-- set must be indexed over key type, doing otherwise results in
    +-- runtime error.
    +getEQ :: (Indexable a b, Data a, Ord a, Typeable k)
    +      => k -> IxSet a -> IxSet a
    +getEQ = getOrd EQ
    +
    +-- | Returns the subset with an index less than the provided key.  The
    +-- set must be indexed over key type, doing otherwise results in
    +-- runtime error.
    +getLT :: (Indexable a b, Data a, Ord a, Typeable k)
    +      => k -> IxSet a -> IxSet a
    +getLT = getOrd LT
    +
    +-- | Returns the subset with an index greater than the provided key.
    +-- The set must be indexed over key type, doing otherwise results in
    +-- runtime error.
    +getGT :: (Indexable a b, Data a, Ord a, Typeable k)
    +      => k -> IxSet a -> IxSet a
    +getGT = getOrd GT
    +
    +-- | Returns the subset with an index less than or equal to the
    +-- provided key.  The set must be indexed over key type, doing
    +-- otherwise results in runtime error.
    +getLTE :: (Indexable a b, Data a, Ord a, Typeable k)
    +       => k -> IxSet a -> IxSet a
    +getLTE = getOrd2 True True False
    +
    +-- | Returns the subset with an index greater than or equal to the
    +-- provided key.  The set must be indexed over key type, doing
    +-- otherwise results in runtime error.
    +getGTE :: (Indexable a b, Data a, Ord a, Typeable k)
    +       => k -> IxSet a -> IxSet a
    +getGTE = getOrd2 False True True
    +
    +-- | Returns the subset with an index within the interval provided.
    +-- The bottom of the interval is closed and the top is open,
    +-- i. e. [k1;k2).  The set must be indexed over key type, doing
    +-- otherwise results in runtime error.
    +getRange :: (Indexable a b, Typeable k, Ord a, Data a)
    +         => k -> k -> IxSet a -> IxSet a
    +getRange k1 k2 ixset = getGTE k1 (getLT k2 ixset)
    +
    +-- | Returns lists of elements paired with the indices determined by
    +-- type inference.
    +groupBy::(Typeable k,Typeable t) =>  IxSet t -> [(k, [t])]
    +groupBy (IxSet indices) = collect indices
    +    where
    +    collect [] = []
    +    collect (Ix index:is) = maybe (collect is) f (cast index)
    +    f = mapSnd Set.toList . Map.toList
    +    
    +--query impl function
    +
    +-- | A function for building up selectors on 'IxSet's.  Used in the
    +-- various get* functions.  The set must be indexed over key type,
    +-- doing otherwise results in runtime error.
    +
    +getOrd :: (Indexable a b, Ord a, Data a, Typeable k)
    +       => Ordering -> k -> IxSet a -> IxSet a
    +getOrd LT = getOrd2 True False False
    +getOrd EQ = getOrd2 False True False
    +getOrd GT = getOrd2 False False True
    +
    +-- | A function for building up selectors on 'IxSet's.  Used in the
    +-- various get* functions.  The set must be indexed over key type,
    +-- doing otherwise results in runtime error.
    +getOrd2 :: (Indexable a b, Ord a, Data a, Typeable k)
    +       => Bool -> Bool -> Bool -> k -> IxSet a -> IxSet a
    +getOrd2 inclt inceq incgt v ixset@(IxSet indices) = collect indices
    +    where
    +    collect [] = error $ "IxSet: there is no index " ++ show (typeOf v) ++ 
    +                 " in " ++ show (typeOf ixset)
    +    collect (Ix index:is) = maybe (collect is) f $ cast v
    +        where
    +        f v'' = foldr insert empty (lt ++ eq ++ gt)
    +            where
    +            (lt',eq',gt') = Map.splitLookup v'' index
    +            lt = if inclt 
    +                 then concatMap Set.toList $ Map.elems lt'
    +                 else []
    +            gt = if incgt 
    +                 then concatMap Set.toList $ Map.elems gt'
    +                 else []
    +            eq = if inceq
    +                 then maybe [] Set.toList eq'
    +                 else []
    +
    +--we want a gGets that returns a list of all matches
    +
    +{--
    +Optimization todo:
    +
    +* can we avoid rebuilding the collection every time we query?
    +  does laziness take care of everything?
    +
    +* nicer operators?
    +
    +* nice way to do updates that doesn't involve reinserting the entire data
    +
    +* can we index on xpath rather than just type?
    +
    +--}
    +
    +instance (Indexable a b, Data a, Ord a) => Monoid (IxSet a) where
    +    mempty = empty
    +    mappend = union
    +
    +-- | Statistics about 'IxSet'. This function returns quadruple
    +-- consisting of 1. total number of elements in the set 2. number of
    +-- declared indices 3. number of keys in all indices 4. number of
    +-- values in all keys in all indices. This can aid you in debugging
    +-- and optimisation.
    +stats :: (Ord a) => IxSet a -> (Int,Int,Int,Int)
    +stats (IxSet indices) = (no_elements,no_indices,no_keys,no_values)
    +    where
    +      no_elements = size (IxSet indices)
    +      no_indices = length indices
    +      no_keys = sum [Map.size m | Ix m <- indices]
    +      no_values = sum [sum [Set.size s | s <- Map.elems m] | Ix m <- indices]
    +
    +
    + addfile ./docs/0.5.0/happstack-ixset/src/hscolour.css hunk ./docs/0.5.0/happstack-ixset/src/hscolour.css 1 +.hs-keyglyph, .hs-layout {color: red;} +.hs-keyword {color: blue;} +.hs-comment, .hs-comment a {color: green;} +.hs-str, .hs-chr {color: teal;} +.hs-keyword, .hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {} adddir ./docs/0.5.0/happstack-server addfile ./docs/0.5.0/happstack-server.haddock binary ./docs/0.5.0/happstack-server.haddock oldhex * newhex *0d0cface000f0002860d0002621eff0000015d0000000000000000000000010000000100000000 *000000010000000200000000000000010000000300000000000000010000000400000000000000 *010000000500000000000000020000000600000000000000020000000700000000000000020000 *000800000000000000020000000900000000000000020000000a00000000000000020000000b00 *000000000000020000000c00000000000000020000000d00000000000000020000000e00000000 *000000020000000f00000000000000020000001000000000000000020000001100000000000000 *020000001200000000000000020000001300000000000000020000001400000000000000020000 *001500000000000000020000001600000000000000020000001700000000000000020000001800 *000000000000020000001900000000000000020000001a00000000000000020000001b00000000 *000000020000001c00000000000000020000001d00000000000000020000001e00000000000000 *020000001f00000000000000020000002000000000000000020000002100000000000000020000 *002200000000000000020000002300000000000000020000002400000000000000020000002500 *000000000000020000002600000000000000020000002700000000000000020000002800000000 *000000020000002900000000000000020000002a00000000000000020000002b00000000000000 *020000002c00000000000000020000002d00000000000000020000002e00000000000000020000 *002f00000000000000020000003000000000000000020000003100000000000000020000003200 *000000000000030000003300000000000000030000003400000000000000030000003500000000 *000000030000003600000000000000030000003700000000000000030000003800000000000000 *030000003900000000000000030000003a00000000000000030000003b00000000000000030000 *003c00000000000000030000003d00000000000000030000003e00000000000000030000003f00 *000000000000030000004000000000000000030000004100000000000000030000004200000000 *000000030000004300000000000000030000004400000000000000030000004500000000000000 *040000004600000000000000040000004700000000000000040000004800000000000000040000 *004900000000000000040000004a00000000000000040000004b00000000000000040000004c00 *000000000000040000004d00000000000000040000004e00000000000000040000004f00000000 *000000040000005000000000000000040000005100000000000000040000005200000000000000 *040000005300000000000000040000005400000000000000040000005500000000000000010000 *005600000000000000010000005700000000000000010000005800000000000000010000005900 *000000000000010000005a00000000000000010000005b00000000000000010000005c00000000 *000000010000005d00000000000000010000005e00000000000000010000005f00000000000000 *010000006000000000000000010000006100000000000000010000006200000000000000010000 *006300000000000000010000006400000000000000010000006500000000000000010000006600 *000000000000010000006700000000000000010000006800000000000000010000006900000000 *000000010000006a00000000000000010000006b00000000000000010000006c00000000000000 *010000006d00000000000000010000006e00000000000000010000006f00000000000000010000 *007000000000000000010000007100000000000000010000007200000000000000010000007300 *000000000000010000007400000000000000010000007500000000000000010000007600000000 *000000010000007700000000000000010000007800000000000000010000007900000000000000 *010000007a00000000000000010000007b00000000000000010000007c00000000000000010000 *007d00000000000000010000007e00000000000000010000007f00000000000000010000008000 *000000000000010000008100000000000000010000008200000000000000010000008300000000 *000000010000008400000000000000010000008500000000000000010000008600000000000000 *010000008700000000000000010000008800000000000000010000008900000000000000010000 *008a00000000000000010000008b00000000000000010000008c00000000000000010000008d00 *000000000000010000008e00000000000000010000008f00000000000000010000009000000000 *000000010000009100000000000000010000009200000000000000010000009300000000000000 *010000009400000000000000010000009500000000000000010000009600000000000000010000 *009700000000000000010000009800000000000000010000009900000000000000010000009a00 *000000000000010000009b00000000000000010000009c00000000000000010000009d00000000 *000000010000009e00000000000000010000009f0000000000000001000000a000000000000000 *01000000a10000000000000005000000a20000000000000005000000a300000000000000050000 *00a40000000000000005000000a50000000000000005000000a60000000000000005000000a700 *00000000000005000000a80000000000000005000000a90000000000000005000000aa00000000 *00000005000000ab0000000000000005000000ac0000000000000006000000ad00000000000000 *06000000ae0000000000000006000000af0000000000000006000000b000000000000000060000 *00b10000000000000006000000b20000000000000007000000b30000000000000007000000b400 *00000000000007000000b50000000000000008000000b60000000000000008000000b700000000 *00000008000000b80000000000000008000000b90000000000000008000000ba00000000000000 *08000000bb0000000000000008000000bc0000000000000008000000bd00000000000000080000 *00be0000000000000008000000bf0000000000000008000000c00000000000000008000000c100 *00000000000009000000c20000000000000009000000c30000000000000009000000c400000000 *00000009000000c50000000000000009000000c60000000000000009000000c700000000000000 *09000000c80000000000000009000000c90000000000000009000000ca00000000000000090000 *00cb0000000000000009000000cc0000000000000009000000cd0000000000000009000000ce00 *00000000000009000000cf0000000000000009000000d00000000000000009000000d100000000 *00000009000000d20000000000000009000000d30000000000000009000000d400000000000000 *09000000d50000000000000009000000d60000000000000009000000d700000000000000090000 *00d80000000000000009000000d90000000000000009000000da0000000000000009000000db00 *00000000000009000000dc0000000000000009000000dd0000000000000009000000de00000000 *00000009000000df0000000000000009000000e00000000000000009000000e100000000000000 *09000000e20000000000000009000000e30000000000000009000000e400000000000000090000 *00e50000000000000009000000e60000000000000009000000e70000000000000009000000e800 *00000000000009000000e90000000000000009000000ea0000000000000009000000eb00000000 *00000009000000ec0000000000000009000000ed0000000000000009000000ee00000000000000 *09000000ef0000000000000009000000f00000000000000009000000f100000000000000090000 *00f20000000000000009000000f30000000000000009000000f40000000000000009000000f500 *00000000000009000000f60000000000000009000000f70000000000000009000000f800000000 *00000009000000f90000000000000009000000fa0000000000000009000000fb00000000000000 *09000000fc0000000000000009000000fd0000000000000009000000fe00000000000000090000 *00ff00000000000000090000010000000000000000090000010100000000000000090000010200 *000000000000090000010300000000000000090000010400000000000000090000010500000000 *000000090000010600000000000000090000010700000000000000090000010800000000000000 *090000010900000000000000090000010a00000000000000090000010b00000000000000090000 *010c00000000000000090000010d00000000000000090000010e00000000000000090000010f00 *000000000000090000011000000000000000090000011100000000000000090000011200000000 *000000090000011300000000000000090000011400000000000000090000011500000000000000 *090000011600000000000000090000011700000000000000090000011800000000000000090000 *011900000000000000090000011a00000000000000090000011b00000000000000090000011c00 *000000000000090000011d00000000000000090000011e00000000000000090000011f00000000 *000000090000012000000000000000090000012100000000000000090000012200000000000000 *090000012300000000000000090000012400000000000000090000012500000000000000090000 *012600000000000000090000012700000000000000090000012800000000000000090000012900 *000000000000090000012a00000000000000090000012b00000000000000090000012c00000000 *000000090000012d00000000000000090000012e00000000000000090000012f00000000000000 *090000013000000000000000090000013100000000000000090000013200000000000000090000 *013300000000000000090000013400000000000000090000013500000000000000090000013600 *000000000000090000013700000000000000090000013800000000000000090000013900000000 *000000090000013a00000000000000090000013b00000000000000090000013c00000000000000 *090000013d000000000000000a0000013e000000000000000a0000013f000000000000000a0000 *0140000000000000000a00000141000000000000000a00000142000000000000000a0000014300 *0000000000000a00000144000000000000000a00000145000000000000000a0000014600000000 *0000000a00000147000000000000000a00000148000000000000000a0000014900000000000000 *0a0000014a000000000000000a0000014b000000000000000a0000014c000000000000000a0000 *014d000000000000000a0000014e000000000000000a0000014f000000000000000a0000015000 *0000000000000a00000151000000000000000a00000152000000000000000a0000015300000000 *0000000a00000154000000000000000a00000155000000000000000a0000015600000000000000 *0b00000157000000000000000b00000158000000000000000b00000159000000000000000c0000 *015a000000000000000c0000015b000000000000000c0000015c000000000000000c1a00000000 *0000000d00000000010000015d0000010000015d000100010000015d00000000000000000e0000 *0000010000015e01030245000000610000006c0000007400000065000000720000006e00000061 *0000007400000069000000760000006500000020000000690000006d000000700000006c000000 *650000006d000000650000006e000000740000006100000074000000690000006f0000006e0000 *00200000006f000000660000002000000061000000630000006300000065000000700000007400 *000020000000740000006f00000020000000770000006f000000720000006b0000002000000061 *000000720000006f000000750000006e0000006400000020000000450000004100000049000000 *5f000000410000004700000041000000490000004e000000200000006500000072000000720000 *006f00000072000000730000000a00010000015e000100010000015e00000000000000000f0000 *0000080000015f0000000001600000000001610000000001620000000001630000000001640000 *00000165000000000166000007000001670000015f000001610000016200000163000001640000 *0165000100060000015f0000000161000000016200000001630000000164000000016500000000 *0000000010000000000b0000016800000000016900000000016a00000000016b00000000016c00 *000000016d00000000016e00000000016f00000000017000000000017100000000017200000100 *0001680001000100000168000000000000000011000108000000700000006f0000007200000074 *00000061000000620000006c00000065010c000000650000007800000070000000650000007200 *0000690000006d000000650000006e00000074000000610000006c010d0000006c000000650000 *006d0000006d000000690000006800000040000000760000006f0000002e000000630000006f00 *00006d290000017300000000017400000000017500000000017600000000000001030102190000 *0041000000200000004d000000490000004d00000045000000200000006d000000650000006400 *000069000000610000002000000074000000790000007000000065000000200000007600000061 *0000006c00000075000000650000002e0000000a01020700000020000000200000002000000054 *0000006800000065000000200104010000017701022400000020000000690000006e0000007300 *000074000000610000006e00000063000000650000002000000069000000730000002000000064 *000000650000007200000069000000760000006500000064000000200000006100000075000000 *740000006f0000006d00000061000000740000006900000063000000610000006c0000006c0000 *00790000002e0000000a0102070000002000000020000000200000005500000073000000650000 *00200104010000017801021800000020000000740000006f000000200000006f00000062000000 *7400000061000000690000006e0000002000000074000000680000006500000020000000730000 *0074000000610000006e000000640000006100000072000000640000000a01021a000000200000 *002000000020000000730000007400000072000000690000006e00000067000000200000007200 *00006500000070000000720000006500000073000000650000006e000000740000006100000074 *000000690000006f0000006e0000002e0000000a01020700000020000000200000002000000053 *000000650000006500000020010c23000000680000007400000074000000700000003a0000002f *0000002f0000007700000077000000770000002e00000069000000650000007400000066000000 *2e0000006f00000072000000670000002f0000007200000066000000630000002f000000720000 *006600000063000000320000003000000034000000360000002e00000074000000780000007401 *020a00000020000000660000006f00000072000000200000006d0000006f000000720000006500 *00000a0227000000200000002000000020000000690000006e000000660000006f000000720000 *006d0000006100000074000000690000006f0000006e0000002000000061000000620000006f00 *00007500000074000000200000004d000000490000004d00000045000000200000006d00000065 *000000640000006900000061000000200000007400000079000000700000006500000073000000 *2e0000000a0000000001000000000002010301022b000000540000006800000065000000200000 *00740000006f000000700000002d0000006c0000006500000076000000650000006c0000002000 *00006d000000650000006400000069000000610000002000000074000000790000007000000065 *0000002c000000200000007400000068000000650000002000000067000000650000006e000000 *6500000072000000610000006c00000020000000740000007900000070000000650000000a0102 *240000002000000020000000200000006f00000066000000200000007400000068000000650000 *0020000000640000006100000074000000610000002e00000020000000430000006f0000006d00 *00006d0000006f0000006e000000200000006500000078000000610000006d000000700000006c *0000006500000073000000200000006100000072000000650000000a0102030000002000000020 *000000200102010000002201020400000074000000650000007800000074010201000000220102 *020000002c0000002001020100000022010205000000690000006d000000610000006700000065 *010201000000220102020000002c00000020010201000000220102050000006100000075000000 *64000000690000006f010201000000220102020000002c00000020010201000000220102050000 *00760000006900000064000000650000006f010201000000220102020000002c0000000a010203 *000000200000002000000020010201000000220102090000006d000000750000006c0000007400 *00006900000070000000610000007200000074010201000000220102060000002c000000200000 *00610000006e00000064000000200102010000002201020b000000610000007000000070000000 *6c00000069000000630000006100000074000000690000006f0000006e01020100000022020200 *00002e0000000a0000000003010301022d000000540000006800000065000000200000006d0000 *006500000064000000690000006100000020000000730000007500000062000000740000007900 *000070000000650000002c00000020000000740000006800000065000000200000007300000070 *000000650000006300000069000000660000006900000063000000200000006400000061000000 *740000006100000020000000660000006f000000720000006d00000061000000740000002e0000 *000a0102140000002000000020000000200000004500000078000000610000006d000000700000 *006c000000650000007300000020000000690000006e000000630000006c000000750000006400 *0000650000002001020100000022010205000000700000006c00000061000000690000006e0102 *01000000220102020000002c000000200102010000002201020400000068000000740000006d00 *00006c010201000000220102020000002c0000000a010203000000200000002000000020010201 *000000220102040000006a000000700000006500000067010201000000220102020000002c0000 *002001020100000022010209000000660000006f000000720000006d0000002d00000064000000 *6100000074000000610102010000002202070000002c0000002000000065000000740000006300 *00002e0000000a0000000004010301022c0000004d000000650000006400000069000000610000 *002000000074000000790000007000000065000000200000007000000061000000720000006100 *00006d00000065000000740000006500000072000000730000002e000000200000004f0000006e *00000020000000630000006f0000006d0000006d0000006f0000006e0000002000000065000000 *78000000610000006d000000700000006c000000650000002000000069000000730000000a0102 *210000002000000020000000200000007400000068000000650000002000000063000000680000 *006100000072000000730000006500000074000000200000007000000061000000720000006100 *00006d0000006500000074000000650000007200000020000000660000006f0000007200000020 *000000740000006800000065000000200102010000002201020400000074000000650000007800 *00007401020100000022010202000000200000000a010218000000200000002000000020000000 *740000006f000000700000002d0000006c0000006500000076000000650000006c000000200000 *00740000007900000070000000650000002c00000020000000650000002e000000670000002e00 *000020010701020100000028010201000000220102070000006300000068000000610000007200 *0000730000006500000074010201000000220102010000002c0102010000002201020a00000049 *000000530000004f0000002d000000380000003800000035000000390000002d00000031010201 *0000002202010000002902020000002e0000000a000000017900000000017a00000000017b0000 *0000017c00000000017d00000000017e00000000017f000000000178010301023e000000500000 *00720000006f000000640000007500000063000000650000002000000074000000680000006500 *0000200000007300000074000000610000006e0000006400000061000000720000006400000020 *000000730000007400000072000000690000006e00000067000000200000007200000065000000 *70000000720000006500000073000000650000006e000000740000006100000074000000690000 *006f0000006e000000200000006f00000066000000200000006100000020000000630000006f00 *00006e00000074000000650000006e000000740000002d00000074000000790000007000000065 *0000002c0000000a010208000000200000002000000020000000650000002e000000670000002e *0000002001020100000022010204000000740000006500000078000000740102010000002f0102 *1800000068000000740000006d0000006c0000003b000000200000006300000068000000610000 *00720000007300000065000000740000003d00000049000000530000004f0000002d0000003800 *00003800000035000000390000002d000000310102010000002202020000002e0000000a000000 *018000000000018101030102350000005000000061000000720000007300000065000000200000 *00740000006800000065000000200000007300000074000000610000006e000000640000006100 *000072000000640000002000000072000000650000007000000072000000650000007300000065 *0000006e000000740000006100000074000000690000006f0000006e000000200000006f000000 *66000000200000006100000020000000630000006f0000006e00000074000000650000006e0000 *00740000002d000000740000007900000070000000650000002e0000000a010236000000200000 *002000000020000000490000006600000020000000740000006800000065000000200000006900 *00006e0000007000000075000000740000002000000063000000610000006e0000006e0000006f *000000740000002000000062000000650000002000000070000000610000007200000073000000 *65000000640000002c000000200000007400000068000000690000007300000020000000660000 *00750000006e0000006300000074000000690000006f0000006e00000020000000630000006100 *00006c0000006c000000730000000a01020300000020000000200000002001040100000182022f *000000200000007700000069000000740000006800000020000000610000002000000028000000 *680000006f000000700000006500000066000000750000006c0000006c00000079000000290000 *0020000000690000006e000000660000006f000000720000006d00000061000000740000006900 *00007600000065000000200000006500000072000000720000006f00000072000000200000006d *0000006500000073000000730000006100000067000000650000002e0000000a00000001830000 *000001840000000001850000000001860000000001870000000001880000000001890000000001 *8a00000000018b00000000018c0103021200000052000000460000004300000020000000380000 *003200000032000000200000004c0000005700000053000000500000002d000000630000006800 *000061000000720000000a000000018d00000000018e0103022300000052000000460000004300 *0000200000003800000032000000320000002000000043000000520000004c0000004600000020 *00000028000000620000007500000074000000200000006d0000006f0000007200000065000000 *200000007000000065000000720000006d00000069000000730000007300000069000000760000 *0065000000290000000a000000018f010302090000004f0000006e00000065000000200000006c *000000690000006e000000650000000a0000000190000000000191000000000192000000000193 *000000000194000000000195000000000196000000000197000000000198000015000001730000 *017400000175000001760000000000000001000000020000000300000004000001790000017a00 *00017b0000017c000001780000018100000183000001850000018600000188000001890000018a *000100150000017301000001740000017400000001750100000176000001760000000000040000 *000100000002000000030000000400000001000000000200000000030000000004000000017900 *0000017a000000017b000000017c00000001780000000181000000018300000001850000000186 *00000001880000000189000000018a00000000000000001200000000040000019900000000019a *00000000019b00000000019c0000010000019c000100010000019c000000000000000013000119 *0000006e0000006f0000006e0000002d000000700000006f000000720000007400000061000000 *620000006c0000006500000020000000280000006e0000006f0000007400000020000000740000 *00650000007300000074000000650000006400000029010c000000650000007800000070000000 *6500000072000000690000006d000000650000006e00000074000000610000006c011200000062 *0000006a0000006f000000720000006e000000400000006200000072000000690000006e000000 *670000006500000072000000740000002e0000006e0000006500000074110000019d0103010217 *000000410000006c0000006c0000006f0000007700000073000000200000007300000074000000 *7200000065000000610000006d000000200000006c0000006f0000006700000067000000690000 *006e000000670000002e0000000a01020a00000020000000520000006500000066000000650000 *007200000020000000740000006f000000200104010000019e0208000000200000006200000065 *0000006c0000006f000000770000002e0000000a000000019f0000000001a001010301023f0000 *0053000000740000007200000065000000610000006d0000007300000020000000730000006800 *00006f000000750000006c00000064000000200000006d000000610000006b0000006500000020 *0000006c00000061000000790000006500000072000000690000006e0000006700000020000000 *6f0000006600000020000000540000004c000000530000002000000070000000720000006f0000 *00740000006f000000630000006f0000006c000000200000006500000061000000730000006900 *0000650000007200000020000000690000006e0000002000000066000000750000007400000075 *00000072000000650000002c0000000a0102130000002000000074000000680000006500000079 *00000020000000610000006c0000006c0000006f00000077000000200000007200000065000000 *6100000064000000690000006e000000670102010000002f010224000000770000007200000069 *00000074000000690000006e0000006700000020000000740000006f0000002000000066000000 *690000006c00000065000000730000002000000065000000740000006300000020000000660000 *006f00000072000000200000006400000065000000620000007500000067000000670000006900 *00006e000000670000002c0000000a01022b000000200000007400000068000000650000007900 *000020000000610000006c0000006c0000006f0000007700000020000000750000007300000065 *000000200000006f000000660000002000000070000000720000006f000000740000006f000000 *630000006f0000006c00000073000000200000006f000000740000006800000065000000720000 *00200000007400000068000000610000006e000000200000005400000043000000500102010000 *002f01020300000049000000500000000a021f00000020000000610000006e0000006400000020 *0000007400000068000000650000007900000020000000610000006c0000006c0000006f000000 *7700000020000000630000007500000073000000740000006f0000006d00000069000000730000 *006100000074000000690000006f0000006e0000002e0000000a03010228000000490000006e00 *00007300000074000000610000006e000000630000006500000073000000200000006f00000066 *000000200000007400000068000000690000007300000020000000630000006c00000061000000 *73000000730000002000000073000000680000006f000000750000006c00000064000000200000 *006e0000006f00000074000000200000007400000072000000690000006d0000000a01022d0000 *002000000074000000680000006500000020000000690000006e00000070000000750000007400 *000020000000690000006e00000020000000610000006e00000079000000200000007700000061 *000000790000002c00000020000000650000002e000000670000002e000000200000006c000000 *65000000610000007600000065000000200000004c00000046000000200000006f0000006e0000 *00200000006c000000690000006e000000650000000a01023300000020000000650000006e0000 *0064000000690000006e0000006700000073000000200000006500000074000000630000002e00 *000020000000550000006e0000006c000000650000007300000073000000200000007400000068 *000000610000007400000020000000690000007300000020000000650000007800000061000000 *63000000740000006c000000790000002000000074000000680000006500000020000000620000 *0065000000680000006100000076000000690000006f00000075000000720000000a0229000000 *20000000790000006f000000750000002000000077000000610000006e00000074000000200000 *0066000000720000006f0000006d00000020000000790000006f00000075000000720000002000 *00007400000077000000690000007300000074000000650000006400000020000000690000006e *0000007300000074000000610000006e000000630000006500000073000000200000003b000000 *290000000a00000001a10000000001a20000000001a30000000001a40000000001a50103023e00 *000054000000680000006900000073000000200000006900000073000000200000007400000068 *000000650000002000000074000000790000007000000065000000200000007200000065000000 *7400000075000000720000006e0000006500000064000000200000006200000079000000200000 *006d000000610000006e00000079000000200000006500000078000000700000006f0000007200 *0000740000006500000064000000200000006e0000006500000074000000770000006f00000072 *0000006b0000002000000066000000750000006e0000006300000074000000690000006f000000 *6e000000730000002e0000000a00000001a60000000001a70000000001a80000000001a9000000 *0001aa0000000001ab0000000001ac0000000001ad00000000019e010301021d00000057000000 *720000006100000070000000730000002000000061000000200000007300000074000000720000 *0065000000610000006d0000002000000077000000690000007400000068000000200000006c00 *00006f0000006700000067000000690000006e0000006700000020000000490102010000002f01 *020d0000004f0000002c0000002000000074000000680000006500000020000000660000006900 *00007200000073000000740000000a023700000020000000610000007200000067000000750000 *006d000000650000006e0000007400000020000000690000007300000020000000610000002000 *000066000000690000006c000000650000006e000000610000006d000000650000002000000077 *00000068000000690000006300000068000000200000006900000073000000200000006f000000 *70000000650000006e000000650000006400000020000000690000006e00000020000000410000 *007000000070000000650000006e000000640000004d0000006f00000064000000650000002e00 *00000a00100000019d000001a0000001a1000001a2000001a3000001a4000001a5000001a60000 *01a7000001a8000001a9000001aa000001ab000001ac000001ad0000019e000100100000019d00 *000001a004000001a1000001a2000001a3000001a4000001a100000001a200000001a300000001 *a400000001a500000001a604000001aa000001a9000001a8000001a7000001a700000001a80000 *0001a900000001aa00000001ab00000001ac00000001ad000000019e0000000000000000140001 *190000006e0000006f0000006e0000002d000000700000006f0000007200000074000000610000 *00620000006c0000006500000020000000280000006e0000006f00000074000000200000007400 *0000650000007300000074000000650000006400000029010c0000006500000078000000700000 *006500000072000000690000006d000000650000006e00000074000000610000006c0112000000 *620000006a0000006f000000720000006e000000400000006200000072000000690000006e0000 *00670000006500000072000000740000002e0000006e00000065000000740d000001ae01030102 *0400000054000000680000006500000020010401000001ae010234000000200000006f00000062 *0000006a00000065000000630000007400000020000000610000006c0000006c0000006f000000 *770000007300000020000000690000006e00000070000000750000007400000020000000620000 *007500000066000000660000006500000072000000690000006e000000670000002c0000002000 *0000610000006e00000064000000200000006d00000061000000690000006e0000007400000065 *0000006e000000610000006e0000006300000065000000200000006f0000006600000020000000 *0a021700000020000000730000006f0000006d000000650000002000000061000000640000006d *000000690000006e0000002d000000740000007900000070000000650000002000000064000000 *6100000074000000610000002e0000000a00000001af0000000001b00000000001b10000000001 *b20000000001b30000000001b40000000001b50103010204000000540000006800000065000000 *20010401000001b501022d000000200000006e0000006500000077000000740000007900000070 *000000650000002000000069000000730000002000000061000000200000007700000072000000 *610000007000000070000000650000007200000020000000740000006800000061000000740000 *0020000000610000006c0000006c0000006f000000770000007300000020000000750000007300 *000020000000740000006f000000200000006d000000610000006b000000650000000a01022800 *000020000000630000006f0000006e0000006e000000650000006300000074000000690000006f *0000006e0000007300000020000000610000006e00000020000000690000006e00000073000000 *74000000610000006e0000006300000065000000200000006f0000006600000020000000740000 *0068000000650000002000000053000000740000007200000065000000610000006d0000004900 *00006e0102010000002f0102250000004f000000750000007400000020000000630000006c0000 *0061000000730000007300000065000000730000002c0000002000000077000000690000007400 *0000680000006f0000007500000074000000200000006700000068000000630000002000000065 *0000007800000074000000650000006e00000073000000690000006f0000006e00000073000000 *2e0000000a010244000000200000005700000068000000690000006c0000006500000020000000 *74000000680000006900000073000000200000006c0000006f0000006f0000006b000000730000 *0020000000730000006f0000007200000074000000200000006f00000066000000200000006c00 *0000690000006b0000006500000020000000610000002000000067000000650000006e00000065 *000000720000006900000063000000200000007200000065000000660000006500000072000000 *650000006e000000630000006500000020000000740000006f0000002000000074000000680000 *0065000000200000007400000072000000610000006e00000073000000700000006f0000007200 *0000740000000a01023d000000200000006c000000610000007900000065000000720000002000 *000069000000740000002000000069000000730000002000000061000000630000007400000075 *000000610000006c0000006c000000790000002000000054000000430000005000000020000000 *73000000700000006500000063000000690000006600000069000000630000002c000000200000 *0077000000680000006900000063000000680000002000000063000000610000006e0000002000 *00006200000065000000200000007300000065000000650000006e00000020000000690000006e *000000200000007400000068000000650000000a01021700000020000000690000006d00000070 *0000006c000000650000006d000000650000006e00000074000000610000007400000069000000 *6f0000006e000000200000006f0000006600000020000000740000006800000065000000200102 *010000002701021100000053000000740000007200000065000000610000006d00000020000000 *430000006f0000006e0000006e000000650000006300000074000000690000006f0000006e0102 *0100000027020b00000020000000690000006e0000007300000074000000610000006e00000063 *000000650000002e0000000a00000001b60000000001b70000000001b80103022f0000004f0000 *0070000000650000006e000000200000006100000020000000630000006f0000006e0000006e00 *0000650000006300000074000000690000006f0000006e00000020000000740000006f00000020 *000000700000006f0000007200000074000000200000003800000030000000200000006f000000 *6e00000020000000610000002000000072000000650000006d0000006f00000074000000650000 *0020000000680000006f00000073000000740000002e0000000a00000001b90101030102330000 *00540000006800000069000000730000002000000066000000750000006e000000630000007400 *0000690000006f0000006e0000002000000065000000730000007400000061000000620000006c *000000690000007300000068000000650000007300000020000000610000002000000063000000 *6f0000006e0000006e000000650000006300000074000000690000006f0000006e000000200000 *00740000006f00000020000000610000002000000072000000650000006d0000006f0000007400 *0000650000000a01020f00000020000000680000006f00000073000000740000002c0000002000 *0000690000007400000020000000750000007300000065000000730000002001050d0000006700 *00006500000074000000480000006f000000730000007400000042000000790000004e00000061 *0000006d0000006501021800000020000000770000006800000069000000630000006800000020 *000000690000006e000000740000006500000072000000720000006f0000006700000061000000 *740000006500000073000000200000007400000068000000650000000a02350000002000000044 *0000004e000000530000002000000073000000790000007300000074000000650000006d000000 *2c0000002000000068000000650000006e0000006300000065000000200000006d000000610000 *007900000020000000740000007200000069000000670000006700000065000000720000002000 *000061000000200000006e0000006500000074000000770000006f000000720000006b00000020 *000000630000006f0000006e0000006e000000650000006300000074000000690000006f000000 *6e0000002e0000000a030102060000004100000064000000640000002000000061000000200105 *0a00000070000000650000007200000073000000690000007300000074000000610000006e0000 *0074010229000000200000006f0000007000000074000000690000006f0000006e0000003f0000 *00200000002000000043000000750000007200000072000000650000006e000000740000002000 *000070000000650000007200000073000000690000007300000074000000610000006e00000074 *000000200000006900000073000000200000006400000065000000660000006100000075000000 *6c000000740000002e0000000a0102050000002000000055000000730000006500000020010506 *000000520000006500000073000000750000006c00000074022b00000020000000740000007900 *0000700000006500000020000000660000006f000000720000002000000073000000790000006e *0000006300000068000000720000006f0000006e0000006f000000750000007300000020000000 *650000007800000063000000650000007000000074000000690000006f0000006e000000200000 *007200000065000000700000006f0000007200000074000000690000006e000000670000003f00 *00000a00000001ba0103010234000000430000006800000065000000630000006b000000730000 *0020000000620000006f0000007400000068000000200000007400000068000000610000007400 *00002000000074000000680000006500000020000000750000006e000000640000006500000072 *0000006c00000079000000690000006e0000006700000020000000530000006f00000063000000 *6b000000650000007400000020000000690000007300000020000000630000006f0000006e0000 *006e00000065000000630000007400000065000000640000000a01023000000020000000610000 *006e00000064000000200000007400000068000000610000007400000020000000740000006800 *00006500000020000000630000006f0000006e0000006e00000065000000630000007400000069 *0000006f0000006e0000002000000070000000650000006500000072000000200000006d000000 *610000007400000063000000680000006500000073000000200000007400000068000000650000 *0020000000670000006900000076000000650000006e0000000a02280000002000000068000000 *6f0000007300000074000000200000006e000000610000006d0000006500000020000000280000 *007700000068000000690000006300000068000000200000006900000073000000200000007200 *000065000000630000006f00000072000000640000006500000064000000200000006c0000006f *00000063000000610000006c0000006c00000079000000290000002e0000000a000d000001ae00 *0001af000001b0000001b1000001b2000001b3000001b4000001b5000001b6000001b7000001b8 *000001b9000001ba0001000d000001ae06000001b0000001af000001b1000001b2000001b30000 *01b4000001af00000001b000000001b100000001b200000001b300000001b400000001b5020000 *01b6000001b7000001b600000001b700000001b800000001b900000001ba000000000000000015 *0001190000006e0000006f0000006e0000002d000000700000006f000000720000007400000061 *000000620000006c0000006500000020000000280000006e0000006f0000007400000020000000 *74000000650000007300000074000000650000006400000029010c000000650000007800000070 *0000006500000072000000690000006d000000650000006e00000074000000610000006c011200 *0000620000006a0000006f000000720000006e000000400000006200000072000000690000006e *000000670000006500000072000000740000002e0000006e00000065000000747b000001bb0000 *000001bc0000000001bd0000000001be0000000001bf0000000001c00000000001c10103010212 *000000410000006e00000020000000480000005400000054000000500000002000000052000000 *6500000073000000700000006f0000006e00000073000000650000002e0000000a010205000000 *20000000540000006800000065000000200104010000017701023a00000020000000690000006e *0000007300000074000000610000006e0000006300000065000000200000006f00000066000000 *200000007400000068000000690000007300000020000000740000007900000070000000650000 *002000000069000000730000002000000075000000730000006500000064000000200000006600 *00006f00000072000000200000006d000000650000007300000073000000610000006700000065 *0000002000000073000000650000007200000069000000610000006c0000006900000073000000 *6100000074000000690000006f0000006e0000002c0000000a0102420000002000000077000000 *68000000690000006300000068000000200000006d00000065000000610000006e000000730000 *00200000006e0000006f00000020000000620000006f0000006400000079000000200000006400 *0000610000007400000061000000200000006900000073000000200000006f0000007500000074 *0000007000000075000000740000002c0000002000000061000000640000006400000069000000 *74000000690000006f0000006e000000610000006c0000006c0000007900000020000000740000 *006800000065000000200000006f00000075000000740000007000000075000000740000002000 *000077000000690000006c0000006c0000000a0102440000002000000073000000680000006f00 *00007700000020000000610000006e000000200000004800000054000000540000005000000020 *00000076000000650000007200000073000000690000006f0000006e000000200000006f000000 *6600000020000000310000002e0000003100000020000000690000006e00000073000000740000 *00650000006100000064000000200000006f000000660000002000000074000000680000006500 *00002000000061000000630000007400000075000000610000006c000000200000007600000065 *0000007200000073000000690000006f0000006e00000020000000720000006500000074000000 *75000000720000006e00000065000000640000000a020e00000020000000620000007900000020 *00000061000000200000007300000065000000720000007600000065000000720000002e000000 *0a00000001c20000000001c30000000001c40000000001c50000000001c60000000001c7000000 *0001c80000000001c90000000001ca0103010211000000410000006e0000002000000048000000 *540000005400000050000000200000005200000065000000710000007500000065000000730000 *00740000002e0000000a0102050000002000000054000000680000006500000020010401000001 *7701023a00000020000000690000006e0000007300000074000000610000006e00000063000000 *65000000200000006f000000660000002000000074000000680000006900000073000000200000 *007400000079000000700000006500000020000000690000007300000020000000750000007300 *0000650000006400000020000000660000006f00000072000000200000006d0000006500000073 *000000730000006100000067000000650000002000000073000000650000007200000069000000 *610000006c00000069000000730000006100000074000000690000006f0000006e0000002c0000 *000a0225000000200000007700000068000000690000006300000068000000200000006d000000 *65000000610000006e00000073000000200000006e0000006f00000020000000620000006f0000 *006400000079000000200000006400000061000000740000006100000020000000690000007300 *0000200000006f00000075000000740000007000000075000000740000002e0000000a00000001 *cb0000000001cc010301021e0000006d0000006900000067000000680000007400000020000000 *6e000000650000006500000064000000200000006300000068000000610000006e000000670000 *00690000006e0000006700000020000000690000006e0000002000000066000000750000007400 *00007500000072000000650000000a010210000000200000002000000031000000290000002000 *0000740000006f00000020000000730000007500000070000000700000006f0000007200000074 *00000020010401000001cd01021800000020000000750000007200000069000000200000006900 *00006e000000200000004f0000005000000054000000490000004f0000004e0000005300000020 *000000720000006500000071000000750000006500000073000000740000000a01022b00000020 *000000200000003200000029000000200000007400000072000000610000006e00000073000000 *700000006100000072000000650000006e00000074000000200000007300000075000000700000 *00700000006f000000720000007400000020000000660000006f00000072000000200000006200 *00006f00000074000000680000002000000072000000650000006c000000610000007400000069 *00000076000000650000000a010205000000200000002000000020000000200000002001020100 *000026010225000000200000006100000062000000730000006f0000006c000000750000007400 *00006500000020000000750000007200000069000000730000002c00000020000000610000006c *00000074000000680000006f000000750000006700000068000000200000007400000068000000 *69000000730000002000000073000000680000006f000000750000006c000000640000000a0102 *200000002000000020000000200000002000000020000000610000006c00000072000000650000 *0061000000640000007900000020000000770000006f000000720000006b000000200000002800 *00006c000000650000006100000076000000650000002000000073000000630000006800000065 *0000006d000000650000002001020100000026021400000020000000680000006f000000730000 *007400000020000000700000006100000072000000740000007300000020000000650000006d00 *0000700000007400000079000000290000002e0000000a00000001ce0000000001cf0000000001 *d00000000001d1010301022b000000540000006800000065000000200000004800000054000000 *540000005000000020000000720000006500000071000000750000006500000073000000740000 *00200000006d0000006500000074000000680000006f000000640000002c000000200000007400 *00006f000000200000006200000065000000200000007500000073000000650000006400000020 *000000690000006e0000002000000074000000680000006500000020010402000001cb000001ca *010209000000200000006f000000620000006a0000006500000063000000740000002e0000000a *01023d00000020000000570000006500000020000000610000007200000065000000200000006d *000000690000007300000073000000690000006e00000067000000200000006100000020000000 *660000006500000077000000200000006f00000066000000200000007400000068000000650000 *0020000000730000007400000072000000610000006e0000006700000065000000720000002000 *00006d0000006500000074000000680000006f00000064000000730000002c0000002000000062 *000000750000007400000020000000740000006800000065000000730000006500000020000000 *6100000072000000650000000a022d000000200000006e0000006f000000740000002000000072 *00000065000000610000006c0000006c00000079000000200000006e0000006500000063000000 *65000000730000007300000061000000720000007900000020000000750000006e000000740000 *00690000006c000000200000007700000065000000200000006100000064000000640000002000 *000066000000750000006c0000006c00000020000000540000004c000000530000002e0000000a *00000001d20000000001d30000000001d40000000001d50000000001d60000000001d700000000 *01d80000000001d901030102440000005400000068000000690000007300000020000000630000 *006c00000061000000730000007300000020000000610000006c0000006c0000006f0000007700 *00007300000020000000750000007300000020000000740000006f000000200000007700000072 *0000006900000074000000650000002000000067000000650000006e0000006500000072000000 *690000006300000020000000680000006500000061000000640000006500000072000000200000 *006d000000610000006e0000006900000070000000750000006c00000061000000740000006900 *00006f0000006e0000002000000066000000750000006e0000006300000074000000690000006f *0000006e000000730000000a01020a00000020000000660000006f000000720000002000000062 *0000006f000000740000006800000020010402000001cb000001ca010205000000200000006100 *00006e0000006400000020010402000001c2000001c1020d000000200000006400000061000000 *74000000610000002000000074000000790000007000000065000000730000002e0000000a0000 *0001da0000000001db0000000001dc010103010217000000480000005400000054000000500000 *0020000000480000006500000061000000640000006500000072000000200000004e0000006100 *00006d0000006500000020000000740000007900000070000000650000003a0000000a01023000 *0000200000002000000057000000680000007900000020000000690000006e000000630000006c *000000750000006400000065000000200000007400000068000000690000007300000020000000 *610000007400000020000000610000006c0000006c0000003f0000002000000020000000490000 *00200000006800000061000000760000006500000020000000730000006f0000006d0000006500 *000020000000720000006500000061000000730000006f0000006e000000730000000a01022f00 *000020000000200000002000000031000000290000002000000070000000720000006500000076 *000000650000006e00000074000000200000007300000070000000650000006c0000006c000000 *690000006e00000067000000200000006500000072000000720000006f00000072000000730000 *00200000006f000000660000002000000068000000650000006100000064000000650000007200 *0000200000006e000000610000006d00000065000000730000002c0000000a0102350000002000 *0000200000002000000032000000290000002000000072000000650000006d000000690000006e *000000640000002000000065000000760000006500000072000000790000006f0000006e000000 *65000000200000006f000000660000002000000077000000680000006100000074000000200000 *006800000065000000610000006400000065000000720000007300000020000000610000007200 *00006500000020000000610000007600000061000000690000006c00000061000000620000006c *000000650000002c0000000a023400000020000000200000002000000033000000290000002000 *00006d000000690000006700000068000000740000002000000073000000700000006500000065 *000000640000002000000075000000700000002000000073000000650000006100000072000000 *6300000068000000650000007300000020000000660000006f0000007200000020000000730000 *007000000065000000630000006900000066000000690000006300000020000000680000006500 *000061000000640000006500000072000000730000002e0000000a030102130000004100000072 *00000067000000750000006d000000650000006e00000074000000730000002000000061000000 *6700000061000000690000006e00000073000000740000003a0000000a01022f00000020000000 *20000000200000003100000029000000200000006d000000610000006b00000065000000730000 *0020000000630000007500000073000000740000006f0000006d00000069000000730000006900 *00006e000000670000002000000068000000650000006100000064000000650000007200000020 *0000006e000000610000006d0000006500000073000000200000006c0000006100000062000000 *6f00000072000000690000006f00000075000000730000000a021d000000200000002000000020 *000000320000002900000020000000690000006e00000063000000720000006500000061000000 *73000000650000007300000020000000630000006f000000640000006500000020000000760000 *006f0000006c000000750000006d000000650000002e0000000a00000001dd0103023100000041 *0000006c0000006c0000006f000000770000007300000020000000660000006f00000072000000 *20000000750000006e0000007200000065000000630000006f000000670000006e000000690000 *00730000006500000064000000200000006f000000720000002000000065000000780000007000 *00006500000072000000690000006d000000650000006e00000074000000610000006c00000020 *000000680000006500000061000000640000006500000072000000730000002e0000000a000000 *01de0000000001df0000000001e00000000001e10000000001e20000000001e30000000001e400 *00000001e50000000001e60000000001e70000000001e80000000001e90000000001ea00000000 *01eb0000000001ec0000000001ed0000000001ee0000000001ef0000000001f00000000001f100 *00000001f20000000001f30000000001f40000000001f50000000001f60000000001f700000000 *01f80000000001f90000000001fa0000000001fb0000000001fc0000000001fd0000000001fe00 *00000001ff00000000020000000000020100000000020200000000020300000000020400000000 *020500000000020600000000020700000000020800000000020900000000020a00000000020b00 *000000020c00000000020d00000000020e00000000020f01030102280000005400000068000000 *650000002000000048000000650000006100000064000000650000007200000020000000640000 *006100000074000000610000002000000074000000790000007000000065000000200000007000 *000061000000690000007200000073000000200000006800000065000000610000006400000065 *00000072000000200000006e000000610000006d00000065000000730000002001020100000026 *02090000002000000076000000610000006c0000007500000065000000730000002e0000000a00 *000002100000000002110000000002120000000002130000000002140000000002150000000002 *1600000000021700000000021800000000021900000000021a00000000021b0101010103010230 *000000490000006e00000073000000650000007200000074000000730000002000000061000000 *200000006800000065000000610000006400000065000000720000002000000077000000690000 *007400000068000000200000007400000068000000650000002000000067000000690000007600 *0000650000006e000000200000006e000000610000006d0000006500000020000000610000006e *000000640000002000000076000000610000006c00000075000000650000002e0000000a022000 *000020000000410000006c0000006c0000006f0000007700000073000000200000006400000075 *000000700000006c00000069000000630000006100000074000000650000002000000068000000 *6500000061000000640000006500000072000000200000006e000000610000006d000000650000 *00730000002e0000000a0301023600000041000000640000006400000073000000200000007400 *00006800000065000000200000006e000000650000007700000020000000680000006500000061 *000000640000006500000072000000200000006f0000006e0000006c0000007900000020000000 *6900000066000000200000006e0000006f00000020000000700000007200000065000000760000 *00690000006f000000750000007300000020000000680000006500000061000000640000006500 *000072000000200000007300000068000000610000007200000065000000730000000a02100000 *00200000007400000068000000650000002000000073000000610000006d000000650000002000 *00006e000000610000006d000000650000002e0000000a03022900000052000000650000006d00 *00006f000000760000006500000073000000200000006f0000006c000000640000002000000068 *000000650000006100000064000000650000007200000073000000200000007700000069000000 *7400000068000000200000006400000075000000700000006c0000006900000063000000610000 *007400000065000000200000006e000000610000006d000000650000002e0000000a03021a0000 *00490000006e0000007300000065000000720000007400000073000000200000006d0000007500 *00006c0000007400000069000000700000006c0000006500000020000000680000006500000061 *000000640000006500000072000000730000002e0000000a000000021c01030102290000004700 *00006500000074000000730000002000000061000000200000006c000000690000007300000074 *000000200000006f00000066000000200000006800000065000000610000006400000065000000 *720000007300000020000000770000006900000074000000680000002000000061000000200000 *00700000006100000072000000740000006900000063000000750000006c000000610000007200 *000020010401000001dc02020000002e0000000a000000021d010301023c0000004c0000006f00 *00006f0000006b0000007500000070000000200000007000000072000000650000007300000065 *0000006e0000006300000065000000200000006f00000066000000200000007300000070000000 *650000006300000069000000660000006900000063000000200000004800000065000000610000 *006400000065000000720000004e000000610000006d0000006500000020000000690000006e00 *00002000000061000000200000006c000000690000007300000074000000200000006f00000066 *00000020000000480000006500000061000000640000006500000072000000730000000a023300 *00002000000052000000650000007400000075000000720000006e000000730000002000000074 *00000068000000650000002000000076000000610000006c000000750000006500000020000000 *66000000720000006f0000006d0000002000000074000000680000006500000020000000660000 *0069000000720000007300000074000000200000006d0000006100000074000000630000006800 *0000690000006e0000006700000020000000680000006500000061000000640000006500000072 *0000002e0000000a000000021e00000000021f0000000002200000000002210000000002220000 *00000223000000000224000000000225000000000226010301024100000053000000690000006d *000000700000006c00000065000000200000007700000061000000790000002000000074000000 *6f0000002000000067000000650000007400000020000000610000002000000072000000650000 *00730000006f000000750000007200000063000000650000002000000061000000630000007200 *00006f00000073000000730000002000000061000000200000006e0000006f0000006e0000002d *00000070000000650000007200000073000000690000007300000074000000610000006e000000 *7400000020000000630000006f0000006e0000006e000000650000006300000074000000690000 *006f0000006e0000002e0000000a01021e00000020000000480000006500000061000000640000 *006500000072000000730000002000000074000000680000006100000074000000200000006d00 *0000610000007900000020000000620000006500000020000000610000006c0000007400000065 *0000007200000065000000640000003a0000000a01023e0000002000000020000000480000006f *000000730000007400000020000000200000002000000020000000200000002000000020000000 *20000000410000006c0000007400000065000000720000006500000064000000200000006f0000 *006e0000006c00000079000000200000006900000066000000200000006e0000006f0000002000 *0000480000006f0000007300000074000000200000006800000065000000610000006400000065 *000000720000002000000069000000730000002000000073000000750000007000000070000000 *6c0000006900000065000000640000002c00000020000000480000005400000054000000500102 *010000002f010204000000310000002e000000310000000a010226000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *200000002000000072000000650000007100000075000000690000007200000065000000730000 *00200000006100000020000000480000006f000000730000007400000020000000680000006500 *0000610000006400000065000000720000002e0000000a01024400000020000000200000004300 *00006f0000006e0000006e000000650000006300000074000000690000006f0000006e00000020 *000000200000005700000068000000650000007200000065000000200000006e0000006f000000 *20000000610000006c0000006c0000006f00000077000000610000006e00000063000000650000 *00200000006900000073000000200000006d000000610000006400000065000000200000006600 *00006f000000720000002000000070000000650000007200000073000000690000007300000074 *000000610000006e0000007400000020000000630000006f0000006e0000006e00000065000000 *6300000074000000690000006f0000006e000000730000000a0102330000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *00200000002000000074000000680000006500000020000000430000006f0000006e0000006e00 *0000650000006300000074000000690000006f0000006e00000020000000680000006500000061 *0000006400000065000000720000002000000077000000690000006c0000006c00000020000000 *62000000650000002000000073000000650000007400000020000000740000006f000000200105 *05000000630000006c0000006f000000730000006502010000000a000000022701030102050000 *004c000000690000006b000000650000002001040100000226022a0000002c0000002000000062 *000000750000007400000020000000610000006300000074000000690000006e00000067000000 *200000006f0000006e00000020000000610000006e00000020000000610000006c000000720000 *0065000000610000006400000079000000200000006f00000070000000650000006e0000006500 *0000640000002000000073000000740000007200000065000000610000006d0000002e0000000a *000000022801010301023200000074000000680000006900000073000000200000006900000073 *000000200000006e0000006f000000740000002000000074000000680000006500000020000000 *6d0000006f00000073000000740000002000000067000000720000006100000063000000650000 *0066000000750000006c000000200000006f0000006600000020000000690000006d0000007000 *00006c000000650000006d000000650000006e000000740000006100000074000000690000006f *0000006e000000730000002e0000000a01022e0000002000000054000000680000006500000020 *00000070000000720000006f000000620000006c000000650000006d0000002000000069000000 *730000002000000074000000680000006100000074000000200000004e00000065000000740000 *00770000006f000000720000006b0000002e0000005500000052000000490000002e0000006100 *00007500000074000000680000006f000000720000006900000074000000790000002000000069 *000000730000000a02360000002000000064000000650000007000000072000000650000006300 *0000610000007400000065000000640000002e0000002000000020000000410000006e00000064 *0000002000000077000000650000002000000077000000610000006e0000007400000020000000 *740000006f00000020000000750000007300000065000000200000004e00000065000000740000 *00770000006f000000720000006b0000002e0000005500000052000000490000002e0000005500 *00005200000049000000410000007500000074000000680000002e0000000a0301021e00000053 *0000006f0000002000000074000000680000006900000073000000200000006d00000065000000 *74000000680000006f000000640000002000000075000000730000006500000020000000740000 *006f00000020000000700000006100000072000000730000006500000020000000610000002001 *0504000000680000006f0000007300000074010210000000200000006600000069000000650000 *006c00000064000000200000006100000073000000200000006100000020000000550000005200 *0000490000000a01023000000020000000610000007500000074000000680000002c0000002000 *00007700000068000000690000006300000068000000200000006900000073000000200000006e *0000006f000000740000002000000073000000740000006900000063000000740000006c000000 *7900000020000000630000006f00000072000000720000006500000063000000740000002e0000 *0020000000200000005700000065000000200000007300000074000000690000006c0000006c00 *0000200000000a021a0000002000000066000000610000006b0000006500000020000000740000 *006800000061000000740000002000000062000000650000006800000061000000760000006900 *00006f0000007200000020000000680000006500000072000000650000002e0000000a00000002 *2900000000022a00000000022b0103010248000000520000006500000063000000650000006900 *0000760000006500000020000000610000006e0000006400000020000000700000006100000072 *000000730000006500000020000000610000002000000048000000540000005400000050000000 *200000007200000065000000710000007500000065000000730000007400000020000000660000 *00720000006f0000006d0000002000000074000000680000006500000020000000670000006900 *000076000000650000006e0000002000000053000000740000007200000065000000610000006d *0000002e0000002000000053000000680000006f000000750000006c0000006400000020000000 *62000000650000002000000075000000730000006500000064000000200000000a022100000020 *0000002000000020000000660000006f0000007200000020000000730000006500000072000000 *760000006500000072000000200000007300000069000000640000006500000020000000690000 *006e000000740000006500000072000000610000006300000074000000690000006f0000006e00 *0000730000002e0000000a000000022c0103010248000000560000006500000072000000790000 *002000000073000000690000006d000000700000006c0000006500000020000000660000007500 *00006e0000006300000074000000690000006f0000006e0000002c000000200000007300000065 *0000006e0000006400000020000000610000002000000048000000540000005400000050000000 *20000000720000006500000073000000700000006f0000006e0000007300000065000000200000 *006f00000076000000650000007200000020000000740000006800000065000000200000006700 *00006900000076000000650000006e000000200000007300000074000000720000006500000061 *0000006d0000002e0000002000000054000000680000006900000073000000200000000a023900 *0000200000002000000020000000630000006f000000750000006c000000640000002000000062 *0000006500000020000000690000006d00000070000000720000006f0000007600000065000000 *64000000200000006f0000006e00000020000000740000006f0000002000000075000000730000 *006500000020000000640000006900000066000000660000006500000072000000650000006e00 *000074000000200000007400000072000000610000006e00000073000000660000006500000072 *0000002000000074000000790000007000000065000000730000002e0000000a000000022d0103 *023400000055000000730000006500000064000000200000007700000068000000650000006e00 *0000200000007700000065000000200000006b0000006e0000006f000000770000002000000065 *000000780000006100000063000000740000006c0000007900000020000000680000006f000000 *77000000200000006d000000610000006e00000079000000200000006200000079000000740000 *00650000007300000020000000740000006f000000200000006500000078000000700000006500 *000063000000740000002e0000000a000000022e01030102270000005500000073000000650000 *0064000000200000007700000068000000650000006e000000200000006e0000006f0000007400 *000068000000690000006e000000670000002000000061000000620000006f0000007500000074 *000000200000006400000061000000740000006100000020000000690000007300000020000000 *6b0000006e0000006f000000770000006e0000002c0000000a01022e0000002000000020000000 *20000000550000006e000000660000006f0000007200000074000000750000006e000000610000 *0074000000650000006c0000007900000020000000770000006100000069000000740000006900 *00006e0000006700000020000000660000006f0000007200000020000000610000002000000073 *0000006f000000630000006b000000650000007400000020000000630000006c0000006f000000 *730000007500000072000000650000000a01022700000020000000200000002000000063000000 *610000007500000073000000650000007300000020000000620000006100000064000000200000 *006200000065000000680000006100000076000000690000006f00000075000000720000002e00 *000020000000200000004800000065000000720000006500000020000000770000006500000020 *0000006a0000007500000073000000740000000a02280000002000000020000000200000007400 *0000610000006b000000650000002000000064000000610000007400000061000000200000006f *0000006e000000630000006500000020000000610000006e000000640000002000000067000000 *690000007600000065000000200000007500000070000000200000007400000068000000650000 *0020000000720000006500000073000000740000002e0000000a000000022f010301021b000000 *41000000200000006e000000650000006300000065000000730000007300000061000000720000 *007900000020000000660000006500000061000000740000007500000072000000650000002000 *00006f0000006600000020000000480000005400000054000000500102010000002f0102040000 *00310000002e000000310000000a01022c000000200000002000000020000000410000006c0000 *00730000006f00000020000000740000006800000065000000200000006f0000006e0000006c00 *000079000000200000007400000072000000610000006e00000073000000660000006500000072 *000000200000007600000061000000720000006900000065000000740000007900000020000000 *6c000000690000006b000000650000006c0000007900000020000000740000006f0000000a0217 *00000020000000200000002000000072000000650000007400000075000000720000006e000000 *20000000610000006e0000007900000020000000660000006f0000006f00000074000000650000 *0072000000730000002e0000000a000000023000000000023101030102320000004d0000006100 *000079000000620000006500000020000000690000006e00000020000000740000006800000065 *000000200000006600000075000000740000007500000072000000650000002000000077000000 *650000002000000077000000690000006c0000006c000000200000006800000061000000760000 *006500000020000000610000002000000073000000650000006e00000073000000690000006200 *00006c00000065000000200000007400000068000000690000006e000000670000000a01023400 *0000200000002000000020000000740000006f00000020000000640000006f0000002000000068 *0000006500000072000000650000002c0000002000000061000000740000002000000074000000 *6800000061000000740000002000000074000000690000006d0000006500000020000000770000 *0065000000200000006d0000006900000067000000680000007400000020000000770000006100 *00006e0000007400000020000000740000006f000000200000006300000068000000610000006e *00000067000000650000000a020d00000020000000200000002000000074000000680000006500 *0000200000006e000000610000006d000000650000002e0000000a000000023201030244000000 *52000000650000006d0000006f0000007600000065000000200000006c00000065000000610000 *0064000000690000006e000000670000002000000063000000720000006c000000660000007300 *0000200000007400000068000000650000006e0000002000000063000000610000006c0000006c *000000200000007200000065000000610000006400000054000000690000006c0000006c000000 *450000006d0000007000000074000000790000003200000020000000280000006e0000006f0000 *007400000020000000720000006500000071000000750000006900000072000000650000006400 *000020000000620000007900000020000000520000004600000043000000290000000a00000002 *33010301022700000052000000650000006100000064000000200000006c000000690000006e00 *0000650000007300000020000000750000006e00000074000000690000006c0000002000000061 *0000006e00000020000000650000006d000000700000007400000079000000200000006c000000 *690000006e00000065000000200000002800000043000000520000004c00000046000000290000 *002c0000000a01022d000000200000002000000020000000610000006c000000730000006f0000 *002000000061000000630000006300000065000000700000007400000073000000200000006100 *000020000000630000006f0000006e0000006e000000650000006300000074000000690000006f *0000006e00000020000000630000006c0000006f00000073000000650000002000000061000000 *7300000020000000650000006e00000064000000200000006f000000660000000a01021e000000 *200000002000000020000000690000006e0000007000000075000000740000002c000000200000 *007700000068000000690000006300000068000000200000006900000073000000200000006e00 *00006f0000007400000020000000610000006e0000002000000048000000540000005400000050 *0102010000002f01020e000000310000002e0000003100000020000000630000006f0000006d00 *0000700000006c00000069000000610000006e000000740000000a01022a000000200000002000 *0000200000007400000068000000690000006e0000006700000020000000740000006f00000020 *000000640000006f000000200000002d00000020000000730000006f0000002000000070000000 *720000006f0000006200000061000000620000006c0000007900000020000000690000006e0000 *006400000069000000630000006100000074000000650000007300000020000000610000006e00 *00000a02140000002000000020000000200000006500000072000000720000006f000000720000 *0020000000630000006f0000006e000000640000006900000074000000690000006f0000006e00 *00002e0000000a00000002340000000002350000000002360000770000019d000001a0000001a1 *000001a2000001a3000001a4000001a5000001a6000001a7000001a8000001a9000001aa000001 *ab000001ac000001ad0000019e000001ae000001af000001b0000001b1000001b2000001b30000 *01b4000001b5000001b6000001b7000001b8000001b9000001ba000001c1000001c2000001c300 *0001c4000001c5000001c6000001ca000001cb000001cc000001ce000001cf000001d0000001d1 *000001d2000001d3000001d4000001d5000001d6000001d7000001d8000001d9000001dc000001 *dd000001de000001df000001e0000001e1000001e2000001e3000001e4000001e5000001e60000 *01e7000001e8000001e9000001ea000001eb000001ec000001ed000001ee000001ef000001f000 *0001f1000001f2000001f3000001f4000001f5000001f6000001f7000001f8000001f9000001fa *000001fb000001fc000001fd000001fe000001ff00000200000002010000020200000203000002 *0400000205000002060000020700000208000002090000020a0000020b0000020c0000020d0000 *020e0000020f0000021000000218000002190000021a0000021b0000021c0000021d0000021f00 *00022600000227000002290000022a0000022b0000022c0000023400000235000002360001005a *000001c105000001c2000001c3000001c4000001c5000001c6000001c200000001c300000001c4 *00000001c500000001c600000001ca05000001cb000001cc000001ce000001cf000001d0000001 *cb00000001cc00000001ce00000001cf00000001d000000001d107000001d8000001d7000001d6 *000001d5000001d4000001d3000001d2000001d200000001d300000001d400000001d500000001 *d600000001d700000001d800000001d900000001dc320000020e0000020d0000020c0000020b00 *00020a000002090000020800000207000002060000020500000204000002030000020200000201 *00000200000001ff000001fe000001fd000001fc000001fb000001fa000001f9000001f8000001 *f7000001f6000001f5000001f4000001f3000001f2000001f1000001f0000001ef000001ee0000 *01ed000001ec000001eb000001ea000001e9000001e8000001e7000001e6000001e5000001e400 *0001e3000001e2000001e1000001e0000001df000001de000001dd000001dd00000001de000000 *01df00000001e000000001e100000001e200000001e300000001e400000001e500000001e60000 *0001e700000001e800000001e900000001ea00000001eb00000001ec00000001ed00000001ee00 *000001ef00000001f000000001f100000001f200000001f300000001f400000001f500000001f6 *00000001f700000001f800000001f900000001fa00000001fb00000001fc00000001fd00000001 *fe00000001ff000000020000000002010000000202000000020300000002040000000205000000 *0206000000020700000002080000000209000000020a000000020b000000020c000000020d0000 *00020e000000020f01000002100000021000000002180000000219000000021a000000021b0000 *00021c000000021d000000021f000000022600000002270000000229000000022a000000022b00 *0000022c000000023400000002350000000236000000000000000002000000002d000000050000 *0000000600000000000700000000000800000000000900000000000a00000000000b0000000000 *0c00000000000d00000000000e00000000000f0000000000100000000000110000000000120000 *000000130000000000140000000000150000000000160000000000170000000000180000000000 *1900000000001a00000000001b00000000001c00000000001d00000000001e00000000001f0000 *000000200000000000210000000000220000000000230000000000240000000000250000000000 *2600000000002700000000002800000000002900000000002a00000000002b00000000002c0000 *0000002d00000000002e00000000002f00000000003000000000003100002d0000000500000006 *0000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000 *100000001100000012000000130000001400000015000000160000001700000018000000190000 *001a0000001b0000001c0000001d0000001e0000001f0000002000000021000000220000002300 *00002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d *0000002e0000002f00000030000000312e000000120000000d000000110000000f0000000e0000 *001000000010000000130000000c00000014000000150000001600000017000000180000001900 *00001a0000001b0000001c0000001d0000001e0000001f00000020000000210000002200000023 *00000024000000250000002600000027000000280000000a0000000b0000000800000009000000 *290000002a0000002b0000002c0000002d0000002e0000002f0000003000000031000000050000 *000600000007002d00000005020000000600000007000000060000000007000000000801000000 *0900000009000000000a010000000b0000000b000000000c000000000d05000000110000000f00 *00000e00000010000000100000000e000000000f00000000100000000011000000001200000000 *13000000001400000000150000000016000000001700000000180000000019000000001a000000 *001b000000001c000000001d000000001e000000001f0000000020000000002100000000220000 *000023000000002400000000250000000026000000002700000000280000000029000000002a00 *0000002b000000002c000000002d000000002e000000002f000000003000000000310000000000 *00000016000000000a0000023700000000023800000000023900000000023a00000000023b0000 *0000023c00000000023d00000000023e00000000023f000000000240000006000002370000023c *0000023d0000023e0000023f000002400001000600000237000000023c000000023d000000023e *000000023f000000024000000000000000001700010e00000078000000620000006e0000006f00 *00006e0000002d000000700000006f000000720000007400000061000000620000006c00000065 *010c0000006500000078000000700000006500000072000000690000006d000000650000006e00 *000074000000610000006c010d0000006c000000650000006d0000006d00000069000000680000 *0040000000760000006f0000002e000000630000006f0000006d15000002410000000002420000 *000002430000000002440000000002450103010221000000520000006500000061000000640000 *002000000061000000200000006d000000750000006c00000074000000690000002d0000007000 *0000610000007200000074000000200000006d0000006500000073000000730000006100000067 *000000650000002000000066000000720000006f0000006d000000200000006100000020010401 *0000024602020000002e0000000a010000000000000000030209000000420000006f0000007500 *00006e000000640000006100000072000000790000000a00000247010301022100000052000000 *6500000061000000640000002000000061000000200000006d000000750000006c000000740000 *00690000002d00000070000000610000007200000074000000200000006d000000650000007300 *0000730000006100000067000000650000002000000066000000720000006f0000006d00000020 *0000006100000020010401000002480102020000002e0000000a021a0000002000000020000000 *200000004600000061000000690000006c00000073000000200000006f0000006e000000200000 *007000000061000000720000007300000065000000200000006500000072000000720000006f00 *000072000000730000002e0000000a010000000000000000030209000000420000006f00000075 *0000006e000000640000006100000072000000790000000a0000024900000000024a0103023400 *000053000000700000006c00000069000000740000002000000061000000200000006d00000075 *0000006c000000740000006900000070000000610000007200000074000000200000006d000000 *65000000730000007300000061000000670000006500000020000000690000006e000000740000 *006f00000020000000740000006800000065000000200000006d000000750000006c0000007400 *000069000000700000006100000072000000740000002000000070000000610000007200000074 *000000730000002e0000000a010000000000000000030229000000540000006800000065000000 *20000000620000006f000000750000006e000000640000006100000072000000790000002c0000 *0020000000770000006900000074000000680000006f0000007500000074000000200000007400 *0000680000006500000020000000690000006e000000690000007400000069000000610000006c *000000200000006400000061000000730000006800000065000000730000000a0000024b010301 *023d00000044000000720000006f00000070000000200000006500000076000000650000007200 *0000790000007400000068000000690000006e0000006700000020000000750000007000000020 *000000740000006f00000020000000610000006e0000006400000020000000690000006e000000 *630000006c0000007500000064000000690000006e000000670000002000000074000000680000 *0065000000200000006600000069000000720000007300000074000000200000006c0000006900 *00006e00000065000000200000007300000074000000610000007200000074000000690000006e *00000067000000200000000a01021e000000200000002000000020000000770000006900000074 *000000680000002000000074000000680000006500000020000000620000006f00000075000000 *6e000000640000006100000072000000790000002e000000200000005200000065000000740000 *0075000000720000006e00000073000000200104010000024c0102110000002000000069000000 *660000002000000074000000680000006500000072000000650000002000000069000000730000 *00200000006e0000006f000000200000000a02220000002000000020000000200000006c000000 *690000006e00000065000000200000007300000074000000610000007200000074000000690000 *006e00000067000000200000007700000069000000740000006800000020000000610000002000 *0000620000006f000000750000006e000000640000006100000072000000790000002e0000000a *01000000000000000003022900000054000000680000006500000020000000620000006f000000 *750000006e000000640000006100000072000000790000002c0000002000000077000000690000 *0074000000680000006f0000007500000074000000200000007400000068000000650000002000 *0000690000006e000000690000007400000069000000610000006c000000200000006400000061 *000000730000006800000065000000730000000a0000024d0103022b0000005300000070000000 *6c0000006900000074000000200000006100000020000000730000007400000072000000690000 *006e00000067000000200000006100000074000000200000007400000068000000650000002000 *0000660000006900000072000000730000007400000020000000620000006f000000750000006e *00000064000000610000007200000079000000200000006c000000690000006e00000065000000 *2e0000000a03000000000000000003022900000054000000680000006500000020000000620000 *006f000000750000006e000000640000006100000072000000790000002c000000200000007700 *00006900000074000000680000006f000000750000007400000020000000740000006800000065 *00000020000000690000006e000000690000007400000069000000610000006c00000020000000 *6400000061000000730000006800000065000000730000000a0000000000000001030211000000 *530000007400000072000000690000006e0000006700000020000000740000006f000000200000 *0073000000700000006c00000069000000740000002e0000000a00000000000000020301023100 *000054000000680000006500000020000000700000006100000072000000740000002000000062 *00000065000000660000006f000000720000006500000020000000740000006800000065000000 *20000000620000006f000000750000006e000000640000006100000072000000790000002c0000 *002000000074000000680000006500000020000000620000006f000000750000006e0000006400 *0000610000007200000079000000200000006c000000690000006e000000650000002c0000000a *010232000000200000002000000020000000610000006e00000064000000200000007400000068 *000000650000002000000070000000610000007200000074000000200000006100000066000000 *7400000065000000720000002000000074000000680000006500000020000000620000006f0000 *00750000006e00000064000000610000007200000079000000200000006c000000690000006e00 *0000650000002e000000200000005400000068000000650000002000000043000000520000004c *000000460000000a0102380000002000000020000000200000006200000065000000660000006f *000000720000006500000020000000610000006e00000064000000200000007400000068000000 *650000002000000043000000520000004c00000046000000200000002800000069000000660000 *0020000000610000006e0000007900000029000000200000006100000066000000740000006500 *0000720000002000000074000000680000006500000020000000620000006f000000750000006e *00000064000000610000007200000079000000200000006c000000690000006e00000065000000 *0a010234000000200000002000000020000000610000007200000065000000200000006e000000 *6f0000007400000020000000690000006e000000630000006c0000007500000064000000650000 *006400000020000000690000006e00000020000000610000006e00000079000000200000006f00 *000066000000200000007400000068000000650000002000000073000000740000007200000069 *0000006e0000006700000073000000200000007200000065000000740000007500000072000000 *6e00000065000000640000002e0000000a01020b00000020000000200000002000000052000000 *650000007400000075000000720000006e00000073000000200104010000024c021a0000002000 *000069000000660000002000000074000000680000006500000072000000650000002000000069 *00000073000000200000006e0000006f00000020000000620000006f000000750000006e000000 *640000006100000072000000790000002e0000000a0000024e010301023a000000430000006800 *000065000000630000006b00000020000000770000006800000065000000740000006800000065 *00000072000000200000006100000020000000730000007400000072000000690000006e000000 *670000002000000073000000740000006100000072000000740000007300000020000000770000 *006900000074000000680000002000000074000000770000006f00000020000000640000006100 *00007300000068000000650000007300000020000000660000006f0000006c0000006c0000006f *0000007700000065000000640000002000000062000000790000000a021e000000200000002000 *00002000000074000000680000006500000020000000670000006900000076000000650000006e *00000020000000620000006f000000750000006e00000064000000610000007200000079000000 *20000000730000007400000072000000690000006e000000670000002e0000000a010000000000 *00000003022900000054000000680000006500000020000000620000006f000000750000006e00 *0000640000006100000072000000790000002c0000002000000077000000690000007400000068 *0000006f0000007500000074000000200000007400000068000000650000002000000069000000 *6e000000690000007400000069000000610000006c000000200000006400000061000000730000 *006800000065000000730000000a0000024f010301022100000043000000680000006500000063 *0000006b0000002000000077000000680000006500000074000000680000006500000072000000 *200000006100000020000000730000007400000072000000690000006e00000067000000200000 *00660000006f000000720000002000000077000000680000006900000063000000680000002001 *04010000024e01020e0000002000000072000000650000007400000075000000720000006e0000 *007300000020000000740000007200000075000000650000000a022c0000002000000020000000 *200000006800000061000000730000002000000074000000770000006f00000020000000640000 *006100000073000000680000006500000073000000200000006100000066000000740000006500 *0000720000002000000074000000680000006500000020000000620000006f0000007500000064 *00000061000000720000007900000020000000730000007400000072000000690000006e000000 *670000002e0000000a010000000000000000030229000000540000006800000065000000200000 *00620000006f000000750000006e000000640000006100000072000000790000002c0000002000 *0000770000006900000074000000680000006f0000007500000074000000200000007400000068 *0000006500000020000000690000006e000000690000007400000069000000610000006c000000 *200000006400000061000000730000006800000065000000730000000a00000250010302300000 *00430000006800000065000000630000006b000000730000002000000077000000680000006500 *000074000000680000006500000072000000200000006100000020000000730000007400000072 *000000690000006e00000067000000200000007300000074000000610000007200000074000000 *7300000020000000770000006900000074000000680000002000000074000000770000006f0000 *00200000006400000061000000730000006800000065000000730000002e0000000a0000000251 *0103023400000044000000720000006f0000007000000020000000650000007600000065000000 *72000000790000007400000068000000690000006e000000670000002000000075000000700000 *0020000000740000006f00000020000000610000006e0000006400000020000000690000006e00 *0000630000006c0000007500000064000000690000006e00000067000000200000007400000068 *000000650000002000000066000000690000007200000073000000740000002000000043000000 *520000004c000000460000002e0000000a0000000252010301024500000053000000700000006c *000000690000007400000020000000610000002000000073000000740000007200000069000000 *6e0000006700000020000000610000007400000020000000740000006800000065000000200000 *00660000006900000072000000730000007400000020000000650000006d000000700000007400 *000079000000200000006c000000690000006e000000650000002e000000200000005400000068 *000000650000002000000043000000520000004c00000046000000200000002800000069000000 *6600000020000000610000006e0000007900000029000000200000006200000065000000660000 *006f0000007200000065000000200000007400000068000000650000000a010242000000200000 *002000000020000000650000006d000000700000007400000079000000200000006c0000006900 *00006e0000006500000020000000690000007300000020000000690000006e000000630000006c *0000007500000064000000650000006400000020000000690000006e0000002000000074000000 *680000006500000020000000660000006900000072000000730000007400000020000000720000 *006500000073000000750000006c000000740000002e0000002000000054000000680000006500 *00002000000043000000520000004c000000460000002000000061000000660000007400000065 *00000072000000200000007400000068000000650000000a01022d000000200000002000000020 *000000650000006d000000700000007400000079000000200000006c000000690000006e000000 *65000000200000006900000073000000200000006e0000006f0000007400000020000000690000 *006e000000630000006c0000007500000064000000650000006400000020000000690000006e00 *00002000000074000000680000006500000020000000720000006500000073000000750000006c *000000740000002e0000000a0102030000002000000020000000200104010000024c0228000000 *2000000069000000730000002000000072000000650000007400000075000000720000006e0000 *006500000064000000200000006900000066000000200000007400000068000000650000007200 *000065000000200000006900000073000000200000006e0000006f00000020000000650000006d *000000700000007400000079000000200000006c000000690000006e000000650000002e000000 *0a0000000253010301023b00000053000000700000006c00000069000000740000002000000061 *00000020000000730000007400000072000000690000006e000000670000002000000061000000 *740000002000000074000000680000006500000020000000660000006900000072000000730000 *00740000002000000043000000520000004c000000460000002e00000020000000540000006800 *0000650000002000000043000000520000004c0000004600000020000000690000007300000020 *0000006e0000006f0000007400000020000000690000006e000000630000006c00000075000000 *6400000065000000640000000a0223000000200000002000000020000000690000006e00000020 *000000610000006e00000079000000200000006f00000066000000200000007400000068000000 *650000002000000072000000650000007400000075000000720000006e00000065000000640000 *0020000000730000007400000072000000690000006e00000067000000730000002e0000000a02 *0000000000000000030211000000530000007400000072000000690000006e0000006700000020 *000000740000006f0000002000000073000000700000006c00000069000000740000002e000000 *0a00000000000000010301020800000052000000650000007400000075000000720000006e0000 *0073000000200104010000024c0216000000200000006900000066000000200000007400000068 *000000650000007200000065000000200000006900000073000000200000006e0000006f000000 *2000000043000000520000004c000000460000002e0000000a0000025401030102050000004c00 *0000690000006b0000006500000020010401000002530102250000002c00000020000000620000 *007500000074000000200000006900000066000000200000006e0000006f000000200000004300 *0000520000004c0000004600000020000000690000007300000020000000660000006f00000075 *0000006e000000640000002c000000200000007400000068000000650000002000000066000000 *690000007200000073000000740000000a02420000002000000020000000200000007200000065 *00000073000000750000006c000000740000002000000069000000730000002000000074000000 *680000006500000020000000610000007200000067000000750000006d000000650000006e0000 *007400000020000000730000007400000072000000690000006e000000670000002c0000002000 *0000610000006e0000006400000020000000740000006800000065000000200000007300000065 *000000630000006f0000006e000000640000002000000072000000650000007300000075000000 *6c0000007400000020000000690000007300000020000000650000006d00000070000000740000 *00790000002e0000000a0000000255010302340000004700000065000000740000002000000074 *000000680000006500000020000000690000006e00000064000000650000007800000020000000 *610000006e00000064000000200000006c000000650000006e0000006700000074000000680000 *00200000006f000000660000002000000074000000680000006500000020000000660000006900 *00007200000073000000740000002000000043000000520000004c000000460000002c00000020 *000000690000006600000020000000610000006e000000790000002e0000000a01000000000000 *0000030211000000530000007400000072000000690000006e0000006700000020000000740000 *006f0000002000000073000000700000006c00000069000000740000002e0000000a0000025600 *0000000257000000000258010301023700000044000000720000006f0000007000000020000000 *610000006e00000020000000690000006e000000690000007400000069000000610000006c0000 *002000000043000000520000004c000000460000002c0000002000000069000000660000002000 *0000610000006e000000790000002e000000200000004900000066000000200000007400000068 *0000006500000020000000730000007400000072000000690000006e0000006700000020000000 *690000007300000020000000650000006d0000007000000074000000790000002c000000200000 *000a01023c0000002000000020000000200000006e0000006f0000007400000068000000690000 *006e0000006700000020000000690000007300000020000000640000006f0000006e0000006500 *00002e000000200000004900000066000000200000007400000068000000650000002000000073 *0000007400000072000000690000006e0000006700000020000000640000006f00000065000000 *73000000200000006e0000006f0000007400000020000000730000007400000061000000720000 *007400000020000000770000006900000074000000680000002000000043000000520000004c00 *0000460000002c0000000a02230000002000000020000000200000007400000068000000650000 *002000000066000000690000007200000073000000740000002000000063000000680000006100 *000072000000610000006300000074000000650000007200000020000000690000007300000020 *00000064000000720000006f000000700000007000000065000000640000002e0000000a001800 *000173000001740000017500000176000000000000000100000002000000030000000400000179 *000001810000018300000185000001860000018800000189000002410000024200000243000002 *440000024500000247000002520000025300010008000002410100000242000002420000000243 *010000024400000244000000024500000002470000000252000000025300000000000000000300 *000000130000003200000000003300000000003401030234000000430000006f0000006e000000 *76000000650000006e00000069000000650000006e000000630000006500000020000000630000 *006c00000061000000730000007300000020000000660000006f00000072000000200000006300 *00006f0000006e00000076000000650000007200000074000000690000006e0000006700000020 *000000640000006100000074000000610000002000000074000000790000007000000065000000 *7300000020000000740000006f00000020000000550000005200000049000000730000000a0000 *0000350000000000360000000000370000000000380000000000390103022a0000005200000065 *000000740000007200000069000000650000007600000065000000730000002000000074000000 *6800000065000000200000007000000061000000740000006800000020000000630000006f0000 *006d000000700000006f0000006e000000650000006e0000007400000020000000660000007200 *00006f0000006d0000002000000074000000680000006500000020000000550000005200000049 *0000000a000000003a0103022b0000005200000065000000740000007200000069000000650000 *007600000065000000730000002000000074000000680000006500000020000000710000007500 *000065000000720000007900000020000000630000006f0000006d000000700000006f0000006e *000000650000006e000000740000002000000066000000720000006f0000006d00000020000000 *740000006800000065000000200000005500000052000000490000000a000000003b0103022c00 *000052000000650000007400000072000000690000006500000076000000650000007300000020 *00000074000000680000006500000020000000730000006300000068000000650000006d000000 *6500000020000000630000006f0000006d000000700000006f0000006e000000650000006e0000 *00740000002000000066000000720000006f0000006d0000002000000074000000680000006500 *0000200000005500000052000000490000000a000000003c010302450000004d0000006f000000 *640000006900000066000000690000006500000073000000200000007400000068000000650000 *0020000000730000006300000068000000650000006d0000006500000020000000630000006f00 *00006d000000700000006f0000006e000000650000006e00000074000000200000006f00000066 *000000200000007400000068000000650000002000000055000000520000004900000020000000 *7500000073000000690000006e0000006700000020000000740000006800000065000000200000 *0070000000720000006f0000007600000069000000640000006500000064000000200000006600 *0000750000006e0000006300000074000000690000006f0000006e0000000a000000003d010302 *430000004d0000006f000000640000006900000066000000690000006500000073000000200000 *007400000068000000650000002000000070000000610000007400000068000000200000006300 *00006f0000006d000000700000006f0000006e000000650000006e00000074000000200000006f *000000660000002000000074000000680000006500000020000000550000005200000049000000 *200000007500000073000000690000006e00000067000000200000007400000068000000650000 *002000000070000000720000006f00000076000000690000006400000065000000640000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000000a00000000 *3e0103022500000053000000650000007400000073000000200000007400000068000000650000 *0020000000730000006300000068000000650000006d0000006500000020000000630000006f00 *00006d000000700000006f0000006e000000650000006e00000074000000200000006f00000066 *00000020000000740000006800000065000000200000005500000052000000490000000a000000 *003f01030223000000530000006500000074000000730000002000000074000000680000006500 *0000200000007000000061000000740000006800000020000000630000006f0000006d00000070 *0000006f0000006e000000650000006e00000074000000200000006f0000006600000020000000 *740000006800000065000000200000005500000052000000490000000a00000000400000000000 *410000000000420103022400000052000000650000007400000075000000720000006e00000073 *000000200000007400000072000000750000006500000020000000690000006600000020000000 *740000006800000065000000200000005500000052000000490000002000000069000000730000 *00200000006100000062000000730000006f0000006c0000007500000074000000650000000a00 *000000430103022f00000052000000650000006e00000064000000650000007200000020000000 *73000000680000006f000000750000006c00000064000000200000006200000065000000200000 *007500000073000000650000006400000020000000660000006f00000072000000200000007000 *000072000000650000007400000074000000790000007000000072000000690000006e00000074 *000000690000006e0000006700000020000000550000005200000049000000730000002e000000 *0a0000000044010302390000005000000061000000720000007300000065000000730000002000 *000061000000200000005500000052000000490000002000000066000000720000006f0000006d *000000200000006100000020000000530000007400000072000000690000006e00000067000000 *2e000000200000002000000052000000650000007400000075000000720000006e000000730000 *00200000004e0000006f0000007400000068000000690000006e00000067000000200000006f00 *00006e000000200000006600000061000000690000006c0000007500000072000000650000002e *0000000a0013000000320000003300000034000000350000003600000037000000380000003900 *00003a0000003b0000003c0000003d0000003e0000003f00000040000000410000004200000043 *0000004413000000390000003a0000003b0000003c0000003d0000003e0000003f000000400000 *004100000042000000360000003700000038000000430000004400000034000000350000003200 *000033001300000032010000003300000033000000003401000000350000003500000000360200 *000037000000380000003700000000380000000039000000003a000000003b000000003c000000 *003d000000003e000000003f000000004000000000410000000042000000004300000000440000 *000000000000040000000012000000450000000000460000000000470000000000480000000000 *4900000000004a00000000004b00000000004c00000000004d0103010239000000430000007200 *00006500000061000000740000006500000073000000200000006100000020000000630000006f *0000006f0000006b00000069000000650000002000000077000000690000007400000068000000 *20000000610000002000000064000000650000006600000061000000750000006c000000740000 *002000000076000000650000007200000073000000690000006f0000006e000000200000006f00 *000066000000200000003100000020000000610000006e00000064000000200000007000000061 *0000007400000068000000200000006f00000066000000200105010000002f02010000000a0000 *00004e010301021c00000053000000650000007400000020000000610000002000000043000000 *6f0000006f0000006b000000690000006500000020000000690000006e00000020000000740000 *00680000006500000020000000520000006500000073000000750000006c000000740000002e00 *00000a01023f000000200000005400000068000000650000002000000076000000610000006c00 *000075000000650000007300000020000000610000007200000065000000200000006500000073 *000000630000006100000070000000650000006400000020000000610000007300000020000000 *700000006500000072000000200000005200000046000000430000002000000032000000310000 *0030000000390000002c0000002000000062000000750000007400000020000000730000006f00 *00006d000000650000002000000062000000720000006f00000077000000730000006500000072 *00000073000000200000006d00000061000000790000000a010230000000200000006800000061 *000000760000006500000020000000620000007500000067000000670000007900000020000000 *730000007500000070000000700000006f000000720000007400000020000000660000006f0000 *007200000020000000630000006f0000006f0000006b0000006900000065000000730000002000 *0000630000006f0000006e0000007400000061000000690000006e000000690000006e00000067 *00000020000000650000002e000000670000002e00000020010701020100000027010201000000 *22020100000027010204000000200000006f000000720000002001070102010000002701020100 *00002002010000002702020000002e0000000a000000025900000000004f01030102390000004e *0000006f0000007400000020000000610000006e00000020000000730000007500000070000000 *700000006f00000072000000740000006500000064000000200000006100000070000000690000 *002e000000200000002000000054000000610000006b0000006500000073000000200000006100 *000020000000630000006f0000006f0000006b0000006900000065000000200000006800000065 *0000006100000064000000650000007200000020000000610000006e0000006400000020000000 *72000000650000007400000075000000720000006e000000730000000a023d0000002000000065 *000000690000007400000068000000650000007200000020000000610000002000000053000000 *7400000072000000690000006e00000067000000200000006500000072000000720000006f0000 *0072000000200000006d0000006500000073000000730000006100000067000000650000002000 *00006f0000007200000020000000610000006e0000002000000061000000720000007200000061 *00000079000000200000006f000000660000002000000070000000610000007200000073000000 *650000006400000020000000630000006f0000006f0000006b0000006900000065000000730000 *000a0000000050010302340000006e0000006f0000007400000020000000610000002000000073 *0000007500000070000000700000006f0000007200000074000000650000006400000020000000 *6100000070000000690000002e0000002000000020000000410000002000000070000000610000 *007200000073000000650000007200000020000000660000006f00000072000000200000005200 *00004600000043000000200000003200000031000000300000003900000020000000630000006f *0000006f0000006b0000006900000065000000730000000a0000000051010301024c0000004700 *0000650000007400000020000000610000006c0000006c00000020000000630000006f0000006f *0000006b0000006900000065000000730000002000000066000000720000006f0000006d000000 *200000007400000068000000650000002000000048000000540000005400000050000000200000 *00720000006500000071000000750000006500000073000000740000002e000000200000005400 *0000680000006500000020000000630000006f0000006f0000006b000000690000006500000073 *00000020000000610000007200000065000000200000006f000000720000006400000065000000 *720000006500000064000000200000007000000065000000720000002000000052000000460000 *00430000002000000066000000720000006f0000006d0000000a01024900000020000000740000 *006800000065000000200000006d0000006f000000730000007400000020000000730000007000 *000065000000630000006900000066000000690000006300000020000000740000006f00000020 *000000740000006800000065000000200000006c00000065000000610000007300000074000000 *2000000073000000700000006500000063000000690000006600000069000000630000002e0000 *00200000004d000000750000006c0000007400000069000000700000006c000000650000002000 *0000630000006f0000006f0000006b000000690000006500000073000000200000007700000069 *000000740000006800000020000000740000006800000065000000200000007300000061000000 *6d000000650000000a021c000000200000006e000000610000006d000000650000002000000061 *000000720000006500000020000000610000006c0000006c0000006f0000007700000065000000 *6400000020000000740000006f0000002000000065000000780000006900000073000000740000 *002e0000000a0000000052010301024c0000004700000065000000740000002000000074000000 *6800000065000000200000006d0000006f00000073000000740000002000000073000000700000 *0065000000630000006900000066000000690000006300000020000000630000006f0000006f00 *00006b000000690000006500000020000000770000006900000074000000680000002000000074 *000000680000006500000020000000670000006900000076000000650000006e00000020000000 *6e000000610000006d000000650000002e000000200000004600000061000000690000006c0000 *007300000020000000690000006600000020000000740000006800000065000000720000006500 *0000200000006900000073000000200000006e0000006f00000020000000730000007500000063 *000000680000000a01024600000020000000630000006f0000006f0000006b0000006900000065 *000000200000006f00000072000000200000006900000066000000200000007400000068000000 *650000002000000062000000720000006f00000077000000730000006500000072000000200000 *00640000006900000064000000200000006e0000006f0000007400000020000000650000007300 *00006300000061000000700000006500000020000000630000006f0000006f0000006b00000069 *000000650000007300000020000000690000006e00000020000000610000002000000070000000 *720000006f00000070000000650000007200000020000000660000006100000073000000680000 *00690000006f0000006e0000002e0000000a02400000002000000042000000720000006f000000 *7700000073000000650000007200000020000000730000007500000070000000700000006f0000 *00720000007400000020000000660000006f000000720000002000000065000000730000006300 *00006100000070000000690000006e0000006700000020000000630000006f0000006f0000006b *0000006900000065000000730000002000000070000000720000006f0000007000000065000000 *720000006c00000079000000200000006900000073000000200000007600000065000000720000 *007900000020000000640000006900000076000000650000007200000073000000650000002e00 *00000a000000005300000000005400000000025a00001000000045000000460000004700000048 *000000490000004a0000004b0000004c0000004d0000004e0000004f0000005000000051000000 *5200000053000000541000000045000000460000004700000048000000490000004a0000004b00 *00004c0000004d0000004e000000510000005200000053000000540000004f0000005000100000 *004507000000460000004700000048000000490000004a0000004b0000004c0000004600000000 *4700000000480000000049000000004a000000004b000000004c000000004d000000004e000000 *004f00000000500000000051000000005200000000530000000054000000000000000001000000 *00580000005500000000005600000000025b00000000025c00000000025d000000000057000000 *00005800000000005900000000005a00000000005b00000000005c00000000005d00000000005e *00000000005f000000000060000000000061000000000062000000000063000000000064000000 *00006500000000006600000000006700000000006800000000006900000000006a00000000006b *00000000006c00000000006d00000000006e00000000006f000000000070000000000071000000 *0000720000000000730000000000740103020d000000520000006500000073000000750000006c *0000007400000020000000660000006c0000006100000067000000730000000a00000000750000 *000000760103023d00000077000000680000006500000074000000680000006500000072000000 *200000006100000020000000630000006f0000006e00000074000000650000006e000000740000 *002d0000006c000000650000006e00000067000000740000006800000020000000680000006500 *0000610000006400000065000000720000002000000077000000690000006c0000006c00000020 *000000620000006500000020000000610000006400000064000000650000006400000020000000 *740000006f00000020000000740000006800000065000000200000007200000065000000730000 *00750000006c000000740000002e0000000a000000007701030212000000430000006f0000006d *00000062000000690000006e000000650000006400000020000000680000006500000061000000 *640000006500000072000000730000002e0000000a000000007800000000007900000000007a00 *000000007b00000000007c01030214000000480000005400000054000000500000002000000072 *000000650000007100000075000000650000007300000074000000200000006d00000065000000 *74000000680000006f000000640000000a000000007d00000000007e00000000007f0000000000 *800000000000810000000000820000000000830000000000840000000000850103021300000048 *00000054000000540000005000000020000000630000006f0000006e0000006600000069000000 *6700000075000000720000006100000074000000690000006f0000006e0000000a000000008600 *000000008701030222000000500000006f000000720000007400000020000000660000006f0000 *007200000020000000740000006800000065000000200000007300000065000000720000007600 *0000650000007200000020000000740000006f000000200000006c000000690000007300000074 *000000650000006e000000200000006f0000006e0000002e0000000a0000000088000000000089 *0103020d0000004800000054000000540000005000000020000000760000006500000072000000 *73000000690000006f0000006e0000000a000000008a00000000025e00000000025f0000000000 *8b010301023f00000053000000680000006f000000750000006c00000064000000200000007400 *0000680000006500000020000000630000006f0000006e0000006e000000650000006300000074 *000000690000006f0000006e000000200000006200000065000000200000007500000073000000 *650000006400000020000000660000006f00000072000000200000006600000075000000720000 *0074000000680000006500000072000000200000006d0000006500000073000000730000006100 *000067000000650000007300000020000000610000006600000074000000650000007200000020 *000000740000006800000069000000730000002e0000000a01020d000000200000007c00000020 *000000690000007300000048000000540000005400000050000000310000005f00000030000000 *20010201000000260102010000002601021b000000200000006800000061000000730000004b00 *0000650000006500000070000000410000006c000000690000007600000065000000200000007c *0000007c0000002000000069000000730000004800000054000000540000005000000031000000 *5f0000003100000020010201000000260102010000002602170000002000000068000000610000 *00730000004e0000006f00000074000000430000006f0000006e0000006e000000650000006300 *000074000000690000006f0000006e000000430000006c0000006f00000073000000650000000a *000000008c0103024800000044000000650000006600000061000000750000006c000000740000 *0020000000630000006f0000006e00000066000000690000006700000075000000720000006100 *000074000000690000006f0000006e00000020000000630000006f0000006e0000007400000061 *000000690000006e00000073000000200000006e0000006f000000200000007600000061000000 *6c000000690000006400000061000000740000006f0000007200000020000000610000006e0000 *00640000002000000074000000680000006500000020000000700000006f000000720000007400 *00002000000069000000730000002000000073000000650000007400000020000000740000006f *00000020000000380000003000000030000000300000000a000000008d0103023c000000440000 *00650000006600000061000000750000006c000000740000002000000052000000730000004600 *00006c000000610000006700000073000000200000007400000068000000610000007400000020 *00000077000000690000006c0000006c00000020000000690000006e000000630000006c000000 *7500000064000000650000002000000074000000680000006500000020000000630000006f0000 *006e00000074000000650000006e000000740000002d0000006c000000650000006e0000006700 *00007400000068000000200000006800000065000000610000006400000065000000720000000a *000000008e0103010203000000440000006f0000006e0102010000002701022900000074000000 *20000000640000006900000073000000700000006c000000610000007900000020000000610000 *0020000000430000006f0000006e00000074000000650000006e000000740000002d0000004c00 *0000650000006e000000670000006800000074000000200000006600000069000000650000006c *0000006400000020000000660000006f0000007200000020000000740000006800000065000000 *20010206000000520000006500000073000000750000006c0000007402020000002e0000000a00 *0000008f01030244000000430000006f0000006e00000076000000650000007200000074000000 *730000002000000061000000200000005200000065000000710000007500000065000000730000 *007400000020000000690000006e000000740000006f0000002000000061000000200000005300 *00007400000072000000690000006e000000670000002000000072000000650000007000000072 *0000006500000073000000650000006e00000074000000690000006e0000006700000020000000 *74000000680000006500000020000000630000006f000000720000007200000065000000730000 *00700000006f0000006e00000064000000690000006e0000006700000020000000550000005200 *00004c0000000a0000000090010301024c00000053000000650000007400000073000000200000 *0074000000680000006500000020000000520000006500000073000000700000006f0000006e00 *000073000000650000002000000073000000740000006100000074000000750000007300000020 *000000630000006f000000640000006500000020000000740000006f0000002000000074000000 *68000000650000002000000070000000720000006f000000760000006900000064000000650000 *006400000020000000490000006e0000007400000020000000610000006e000000640000002000 *00006c000000690000006600000074000000730000002000000074000000680000006500000020 *000000630000006f0000006d000000700000007500000074000000610000007400000069000000 *6f0000006e0000000a020f00000020000000690000006e000000740000006f0000002000000061 *000000200000004d0000006f0000006e00000061000000640000002e0000000a00000000910103 *01024300000054000000610000006b00000065000000730000002000000061000000200000006c *000000690000007300000074000000200000006f0000006600000020000000280000006b000000 *65000000790000002c00000076000000610000006c000000290000002000000070000000610000 *0069000000720000007300000020000000610000006e0000006400000020000000630000006f00 *00006e000000760000006500000072000000740000007300000020000000690000007400000020 *000000690000006e000000740000006f0000002000000048000000650000006100000064000000 *6500000072000000730000002e00000020000000200000005400000068000000650000000a0225 *000000200000006b0000006500000079000000730000002000000077000000690000006c000000 *6c00000020000000620000006500000020000000630000006f0000006e00000076000000650000 *007200000074000000650000006400000020000000740000006f000000200000006c0000006f00 *0000770000006500000072000000630000006100000073000000650000000a0000000092010302 *2e0000004c0000006f0000006f0000006b00000075000000700000002000000068000000650000 *00610000006400000065000000720000002000000076000000610000006c000000750000006500 *00002e000000200000004b00000065000000790000002000000069000000730000002000000063 *0000006100000073000000650000002d000000690000006e00000073000000650000006e000000 *7300000069000000740000006900000076000000650000002e0000000a00000000930103023b00 *00004c0000006f0000006f0000006b000000750000007000000020000000680000006500000061 *0000006400000065000000720000002000000076000000610000006c0000007500000065000000 *2e000000200000004b000000650000007900000020000000690000007300000020000000610000 *0020000000630000006100000073000000650000002d000000690000006e000000730000006500 *00006e000000730000006900000074000000690000007600000065000000200000006200000079 *0000007400000065000000730000007400000072000000690000006e000000670000002e000000 *0a00000000940103024a0000004c0000006f0000006f0000006b00000075000000700000002000 *00006800000065000000610000006400000065000000720000002000000076000000610000006c *000000750000006500000020000000770000006900000074000000680000002000000061000000 *20000000630000006100000073000000650000002d00000073000000650000006e000000730000 *006900000074000000690000007600000065000000200000006b00000065000000790000002e00 *000020000000540000006800000065000000200000006b0000006500000079000000200000006d *000000750000007300000074000000200000006200000065000000200000006c0000006f000000 *770000006500000072000000630000006100000073000000650000002e0000000a000000026001 *0302440000004c0000006f0000006f0000006b0000007500000070000000200000006800000065 *000000610000006400000065000000720000002000000077000000690000007400000068000000 *200000006100000020000000630000006100000073000000650000002d00000073000000650000 *006e000000730000006900000074000000690000007600000065000000200000006b0000006500 *0000790000002e00000020000000540000006800000065000000200000006b0000006500000079 *000000200000006d00000075000000730000007400000020000000620000006500000020000000 *6c0000006f000000770000006500000072000000630000006100000073000000650000002e0000 *000a0000000095010301024800000052000000650000007400000075000000720000006e000000 *730000002000000054000000720000007500000065000000200000006900000066000000200000 *00740000006800000065000000200000006100000073000000730000006f000000630000006900 *000061000000740000006500000064000000200000006b00000065000000790000002000000069 *0000007300000020000000660000006f000000750000006e000000640000002000000069000000 *6e0000002000000074000000680000006500000020000000480000006500000061000000640000 *006500000072000000730000002e00000020000000200000005400000068000000650000002000 *00006c0000006f0000006f0000006b00000075000000700000000a021600000020000000690000 *0073000000200000006300000061000000730000006500000020000000690000006e0000007300 *0000650000006e0000007300000069000000740000006900000076000000650000002e0000000a *000000009601030102080000004100000063000000740000007300000020000000610000007300 *000020010401000000950212000000200000007700000069000000740000006800000020000000 *42000000790000007400000065000000530000007400000072000000690000006e000000670000 *00730000000a000000009701030102080000004100000063000000740000007300000020000000 *6100000073000000200104010000009601022e0000002000000062000000750000007400000020 *000000740000006800000065000000200000006b00000065000000790000002000000069000000 *7300000020000000630000006100000073000000650000002000000073000000650000006e0000 *007300000069000000740000006900000076000000650000002e00000020000000200000004900 *0000740000002000000073000000680000006f000000750000006c000000640000002000000062 *000000650000000a020f00000020000000690000006e000000200000006c0000006f0000007700 *00006500000072000000630000006100000073000000650000002e0000000a0000000261000000 *00026200000000009801030102120000004100000073000000730000006f000000630000006900 *00006100000074000000650000007300000020000000740000006800000065000000200000006b *00000065000000790102010000002f01023100000076000000610000006c000000750000006500 *0000200000007000000061000000690000007200000020000000690000006e0000002000000074 *000000680000006500000020000000680000006500000061000000640000006500000072000000 *730000002e0000002000000020000000460000006f000000720000006300000065000000730000 *0020000000740000006800000065000000200000006b0000006500000079000000200000007400 *00006f0000002000000062000000650000000a020c000000200000006c0000006f000000770000 *006500000072000000630000006100000073000000650000002e0000000a000000009901030102 *080000004100000063000000740000007300000020000000610000007300000020010401000000 *980217000000200000006200000075000000740000002000000077000000690000007400000068 *000000200000004200000079000000740000006500000053000000740000007200000069000000 *6e00000067000000730000002e0000000a000000009a0103010249000000530000006500000074 *0000007300000020000000740000006800000065000000200000006b0000006500000079000000 *20000000740000006f000000200000007400000068000000650000002000000048000000650000 *0061000000640000006500000072000000500000006100000069000000720000002e0000002000 *000020000000540000006800000069000000730000002000000069000000730000002000000074 *0000006800000065000000200000006f0000006e0000006c000000790000002000000077000000 *610000007900000020000000740000006f000000200000006100000073000000730000006f0000 *0063000000690000006100000074000000650000002000000061000000200000006b0000006500 *0000790000000a01024c0000002000000077000000690000007400000068000000200000006d00 *0000750000006c0000007400000069000000700000006c00000065000000200000007600000061 *0000006c0000007500000065000000730000002000000076000000690000006100000020000000 *740000006800000065000000200000007300000065000000740000004800000065000000610000 *006400000065000000720000002a0000002000000066000000750000006e000000630000007400 *0000690000006f0000006e000000730000002e0000002000000020000000440000006f00000065 *00000073000000200000006e0000006f0000007400000020000000660000006f00000072000000 *630000006500000020000000740000006800000065000000200000006b00000065000000790000 *000a025f00000020000000740000006f0000002000000062000000650000002000000069000000 *6e000000200000006c0000006f0000007700000065000000720000006300000061000000730000 *0065000000200000006f0000007200000020000000670000007500000061000000720000006100 *00006e000000740000006500000065000000200000007400000068000000610000007400000020 *00000074000000680000006500000020000000670000006900000076000000650000006e000000 *200000006b000000650000007900000020000000610000006e0000006400000020000000740000 *006800000065000000200000006b000000650000007900000020000000690000006e0000002000 *000074000000680000006500000020000000480000006500000061000000640000006500000072 *000000500000006100000069000000720000002000000077000000690000006c0000006c000000 *200000006d000000610000007400000063000000680000002e000000200000000a000000009b01 *030102090000004100000064000000640000002000000061000000200000006b00000065000000 *790102010000002f01023a00000076000000610000006c00000075000000650000002000000070 *00000061000000690000007200000020000000740000006f000000200000007400000068000000 *65000000200000006800000065000000610000006400000065000000720000002e000000200000 *0020000000490000006600000020000000740000006800000065000000200000006b0000006500 *00007900000020000000610000006c000000720000006500000061000000640000007900000020 *00000068000000610000007300000020000000610000002000000076000000610000006c000000 *75000000650000000a010238000000200000006100000073000000730000006f00000063000000 *690000006100000074000000650000006400000020000000770000006900000074000000680000 *002000000069000000740000002c000000200000007400000068000000650000006e0000002000 *00007400000068000000650000002000000076000000610000006c000000750000006500000020 *00000077000000690000006c0000006c0000002000000062000000650000002000000061000000 *7000000070000000650000006e0000006400000065000000640000002e00000020000000200000 *000a022100000020000000460000006f0000007200000063000000650000007300000020000000 *740000006800000065000000200000006b000000650000007900000020000000740000006f0000 *00200000006200000065000000200000006c0000006f0000007700000065000000720000006300 *00006100000073000000650000002e0000000a000000009c010302290000004100000063000000 *740000007300000020000000610000007300000020000000610000006400000064000000480000 *006500000061000000640000006500000072000000200000006500000078000000630000006500 *0000700000007400000020000000660000006f0000007200000020000000420000007900000074 *00000065000000530000007400000072000000690000006e00000067000000730000000a000000 *009d01030102090000004100000064000000640000002000000061000000200000006b00000065 *000000790102010000002f01023e00000076000000610000006c00000075000000650000002000 *00007000000061000000690000007200000020000000740000006f000000200000007400000068 *000000650000002000000068000000650000006100000064000000650000007200000020000000 *7500000073000000690000006e0000006700000020000000740000006800000065000000200000 *00750000006e0000006400000065000000720000006c00000079000000690000006e0000006700 *000020000000480000006500000061000000640000006500000072000000500000006100000069 *0000007200000020000000640000006100000074000000610000000a027d000000200000007400 *00007900000070000000650000002e0000002000000020000000440000006f0000006500000073 *000000200000006e0000006f0000007400000020000000660000006f0000007200000063000000 *6500000020000000740000006800000065000000200000006b0000006500000079000000200000 *00740000006f00000020000000620000006500000020000000690000006e000000200000006c00 *00006f00000077000000650000007200000063000000610000007300000065000000200000006f *000000720000002000000067000000750000006100000072000000610000006e00000074000000 *650000006500000020000000740000006800000061000000740000002000000074000000680000 *006500000020000000670000006900000076000000650000006e000000200000006b0000006500 *00007900000020000000610000006e000000640000002000000074000000680000006500000020 *0000006b000000650000007900000020000000690000006e000000200000007400000068000000 *650000002000000048000000650000006100000064000000650000007200000050000000610000 *0069000000720000002000000077000000690000006c0000006c000000200000006d0000006100 *00007400000063000000680000002e000000200000000a000000009e010301024a000000430000 *007200000065000000610000007400000065000000730000002000000061000000200000005200 *00006500000073000000700000006f0000006e0000007300000065000000200000007700000069 *000000740000006800000020000000740000006800000065000000200000006700000069000000 *76000000650000006e00000020000000490000006e000000740000002000000061000000730000 *002000000074000000680000006500000020000000730000007400000061000000740000007500 *00007300000020000000630000006f000000640000006500000020000000610000006e00000064 *000000200000007400000068000000650000002000000070000000720000006f00000076000000 *690000006400000065000000640000000a02250000002000000053000000740000007200000069 *0000006e0000006700000020000000610000007300000020000000740000006800000065000000 *20000000620000006f0000006400000079000000200000006f0000006600000020000000740000 *00680000006500000020000000520000006500000073000000700000006f0000006e0000007300 *000065000000200000000a000000009f0103010208000000410000006300000074000000730000 *00200000006100000073000000200104010000009e022600000020000000620000007500000074 *00000020000000770000006f000000720000006b00000073000000200000007700000069000000 *740000006800000020000000420000007900000074000000650000005300000074000000720000 *00690000006e000000670000007300000020000000640000006900000072000000650000006300 *0000740000006c000000790000002e0000000a00000000a0010301021100000053000000650000 *007400000073000000200000007400000068000000650000002000000052000000650000007300 *0000700000006f0000006e000000730000006501020100000027023e0000007300000020000000 *73000000740000006100000074000000750000007300000020000000630000006f000000640000 *006500000020000000740000006f00000020000000740000006800000065000000200000006700 *00006900000076000000650000006e00000020000000490000006e000000740000002000000061 *0000006e0000006400000020000000720000006500000064000000690000007200000065000000 *63000000740000007300000020000000740000006f000000200000007400000068000000650000 *0020000000670000006900000076000000650000006e0000002000000055000000520000004900 *00000a000000026300000000026400000000026500000000026600005100000000000000010000 *0002000000030000000400000055000000560000005700000058000000590000005a0000005b00 *00005c0000005d0000005e0000005f000000600000006100000062000000630000006400000065 *000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e000000 *6f0000007000000071000000720000007300000074000000750000007600000077000000780000 *00790000007a0000007b0000007c0000007d0000007e0000007f00000080000000810000008200 *0000830000008400000085000000860000008700000088000000890000008a0000008b0000008c *0000008d0000008e0000008f000000900000009100000092000000930000009400000095000000 *960000009700000098000000990000009a0000009b0000009c0000009d0000009e0000009f0000 *00a0550000005700000058000000590000005a0000005b0000005c0000005d0000005e0000005f *000000600000006100000062000000630000006800000064000000690000006a0000006b000000 *6c0000006d000000690000006a0000006b0000006d000000650000006600000067000000550000 *00560000006f0000007000000071000000720000007300000078000000790000007a0000007b00 *00008f000000910000009200000093000000940000009500000096000000970000009800000099 *0000009a0000009b0000009c0000009d0000009000000085000000860000008700000088000000 *8c0000009e0000009f000000a00000007400000075000000760000008d0000008e000000890000 *008a0000007c00000084000000830000008200000081000000800000007f0000007e0000007d00 *0000770000008b0000006e0000000000000001000000020000000300000004004c000000550100 *0000560000005600000000570b00000058000000590000005a0000005b0000005c0000005d0000 *005e0000005f000000600000006100000062000000580000000059000000005a000000005b0000 *00005c000000005d000000005e000000005f00000000600000000061000000006200000000630e *0000006800000064000000690000006a0000006b0000006c0000006d000000690000006a000000 *6b0000006d00000065000000660000006700000064000000006500000000660000000067000000 *00680000000069000000006a000000006b000000006c000000006d000000006e000000006f0400 *000070000000710000007200000073000000700000000071000000007200000000730000000074 *0200000075000000760000007500000000760000000077000000007803000000790000007a0000 *007b00000079000000007a000000007b000000007c080000008400000083000000820000008100 *0000800000007f0000007e0000007d0000007d000000007e000000007f00000000800000000081 *000000008200000000830000000084000000008503000000860000008700000088000000860000 *00008700000000880000000089010000008a0000008a000000008b000000008c000000008d0000 *00008e000000008f00000000900000000091000000009200000000930000000094000000009500 *00000096000000009700000000980000000099000000009a000000009b000000009c000000009d *000000009e000000009f00000000a0000000000000000005000000000b000000a1010301020500 *00004c000000690000006b00000065000000200104010000026702260000002000000065000000 *780000006300000065000000700000007400000020000000530000007400000072000000690000 *006e000000670000007300000020000000610000006e0000006400000020000000430000006800 *0000610000007200000073000000200000006e0000006f00000074000000200000007100000075 *0000006f0000007400000065000000640000002e0000000a00000000a20000000000a300000000 *00a40000000000a501030102130000004400000065000000630000006f00000064000000650000 *0073000000200000006100000070000000700000006c0000006900000063000000610000007400 *0000690000006f0000006e0102010000002f0224000000780000002d0000007700000077000000 *770000002d000000660000006f000000720000006d0000002d00000075000000720000006c0000 *00650000006e000000630000006f00000064000000650000006400000020000000690000006e00 *0000700000007500000074000000730000002e0000002000000020000000200000002000000020 *000000200000000a00000000a60000000000a70103010211000000440000006500000063000000 *6f000000640000006500000073000000200000006d000000750000006c00000074000000690000 *00700000006100000072000000740102010000002f0211000000660000006f000000720000006d *0000002d0000006400000061000000740000006100000020000000690000006e00000070000000 *75000000740000002e0000000a030000000000000000030218000000430000006f0000006e0000 *0074000000650000006e000000740000002d000000740000007900000070000000650000002000 *0000700000006100000072000000610000006d0000006500000074000000650000007200000073 *0000000a000000000000000103020d000000520000006500000071000000750000006500000073 *0000007400000020000000620000006f00000064000000790000000a000000000000000203021c *000000490000006e00000070000000750000007400000020000000760000006100000072000000 *6900000061000000620000006c000000650000007300000020000000610000006e000000640000 *002000000076000000610000006c0000007500000065000000730000002e0000000a000000a800 *00000000a901030102250000005000000061000000630000006b00000073000000200000006100 *000020000000730000007400000072000000690000006e0000006700000020000000690000006e *000000740000006f00000020000000610000006e00000020000000490000006e00000070000000 *7500000074000000200000006f0000006600000020000000740000007900000070000000650000 *002001050a000000740000006500000078000000740000002f000000700000006c000000610000 *00690000006e02010000000a00000000aa01030228000000540000006800000065000000200000 *0064000000650000006600000061000000750000006c0000007400000020000000630000006f00 *00006e00000074000000650000006e000000740000002d00000074000000790000007000000065 *00000020000000660000006f000000720000002000000076000000610000007200000069000000 *61000000620000006c00000065000000730000002e0000000a00000000ab010302270000004700 *000065000000740000002000000074000000680000006500000020000000700000006100000074 *0000006800000020000000630000006f0000006d000000700000006f0000006e00000065000000 *6e00000074000000730000002000000066000000720000006f0000006d00000020000000610000 *0020000000530000007400000072000000690000006e000000670000002e0000000a000b000000 *a1000000a2000000a3000000a4000000a5000000a6000000a7000000a8000000a9000000aa0000 *00ab0b000000a3000000a4000000a5000000a6000000a7000000a8000000a9000000aa000000ab *000000a1000000a2000b000000a101000000a2000000a200000000a300000000a400000000a500 *000000a600000000a700000000a800000000a900000000aa00000000ab00000000000000001800 *00000026000002680000000002690000000000ac00000000026a00000000026b00000000026c00 *00000000ad010301023d000000550000006e000000730000006500000072000000690000006100 *00006c000000690000007a00000065000000730000002000000074000000680000006500000020 *00000062000000790000007400000065000000730000007400000072000000690000006e000000 *6700000020000000690000006e000000740000006f000000200000006100000020000000720000 *006500000073000000700000006f0000006e00000073000000650000002e000000200000002000 *000049000000660000002000000074000000680000006500000072000000650000002000000069 *0000007300000020000000610000006e0000000a01021600000020000000650000007200000072 *0000006f000000720000002000000069000000740000002000000077000000690000006c000000 *6c0000002000000072000000650000007400000075000000720000006e00000020010702080000 *004c000000650000006600000074000000200000006d000000730000006702020000002e000000 *0a000000026d00000000026e00000000026f000000000270000000000271000000000272000000 *0002730000000002740000000002750000000002760000000000ae0103022b0000005300000065 *0000007200000069000000610000006c000000690000007a000000650000007300000020000000 *740000006800000065000000200000007200000065000000710000007500000065000000730000 *007400000020000000740000006f00000020000000740000006800000065000000200000006700 *00006900000076000000650000006e0000002000000068000000610000006e000000640000006c *000000650000000a000000027700000000027800000000027900000000027a00000000027b0000 *0000027c00000000027d00000000027e00000000027f0000000002800000000002810000000002 *820000000002830000000002840000000002850000000002860000000002870000000002880000 *0000028900000000028a000003000000ac000000ad000000ae00010003000000ac00000000ad00 *000000ae00000000000000001900000000040000028b0000000000af0000000000b00103021500 *000042000000690000006e0000006400000020000000610000006e00000064000000200000006c *000000690000007300000074000000650000006e00000020000000700000006f00000072000000 *740000000a00000000b10103022600000055000000730000006500000020000000610000002000 *000070000000720000006500000076000000690000006f00000075000000730000006c00000079 *0000002000000062000000690000006e0000006400000020000000700000006f00000072000000 *7400000020000000610000006e00000064000000200000006c0000006900000073000000740000 *00650000006e0000000a0003000000af000000b0000000b100010003000000af00000000b00000 *0000b1000000000000000006000000000057000000000000000100000002000000030000000400 *000055000000560000005700000058000000590000005a0000005b0000005c0000005d0000005e *0000005f0000006000000061000000620000006300000064000000650000006600000067000000 *68000000690000006a0000006b0000006c0000006d0000006e0000006f00000070000000710000 *0072000000730000007400000075000000760000007700000078000000790000007a0000007b00 *00007c0000007d0000007e0000007f000000800000008100000082000000830000008400000085 *000000860000008700000088000000890000008a0000008b0000008c0000008d0000008e000000 *8f0000009000000091000000920000009300000094000000950000009600000097000000980000 *00990000009a0000009b0000009c0000009d0000009e0000009f000000a0000000ac000000ad00 *0000ae000000af000000b0000000b106000000ac000000ad000000ae000000b0000000b1000000 *af000000000000000000070000000003000000b2010301024000000053000000650000006e0000 *006400000073000000200000007400000068000000650000002000000073000000650000007200 *000069000000610000006c000000690000007a0000006500000064000000200000007200000065 *000000710000007500000065000000730000007400000020000000740000006f00000020000000 *74000000680000006500000020000000680000006f000000730000007400000020000000640000 *006500000066000000690000006e000000650000006400000020000000690000006e0000002000 *000074000000680000006500000020000000720000006500000071000000750000006500000073 *000000740000000a022e00000020000000610000006e0000006400000020000000610000007400 *000074000000650000006d00000070000000740000007300000020000000740000006f00000020 *000000700000006100000072000000730000006500000020000000720000006500000073000000 *700000006f0000006e00000073000000650000002000000075000000700000006f0000006e0000 *00200000006100000072000000720000006900000076000000610000006c0000002e0000000a00 *000000b30000000000b4000003000000b2000000b3000000b403000000b2000000b3000000b400 *03000000b200000000b300000000b4000000000000000008000000001a000000b500000000028c *0000000000b60000000000b700000000028d00000000028e00000000028f000000000290000000 *0002910000000002920000000000b8010301020500000055000000730000006500000073000000 *20010401000000bd01021c00000020000000740000006f00000020000000740000007200000061 *0000006e00000073000000660000006f000000720000006d000000200000007400000068000000 *6500000020000000670000006900000076000000650000006e00000020000000580000004d0000 *004c000000200104010000000c01020800000020000000690000006e000000740000006f000000 *20000000610000000a0102030000002000000061000000200104010000029302060000002e0000 *00200000002000000020000000200000000a00000000b90000000000ba0000000000bb01030102 *44000000500000006500000072000000660000006f000000720000006d00000073000000200000 *00610000006e0000002000000058000000530000004c0000002000000074000000720000006100 *00006e00000073000000660000006f000000720000006d0000006100000074000000690000006f *0000006e0000002000000077000000690000007400000068000000200000006c00000069000000 *730000007400000073000000200000006f00000066000000200000004200000079000000740000 *0065000000530000007400000072000000690000006e0000006700000073000000200000006900 *00006e0000007300000074000000650000006100000064000000200000006f000000660000000a *020b000000200000006100000020000000530000007400000072000000690000006e0000006700 *00002e0000000a00000000bc010301020e00000045000000710000007500000069000000760000 *00610000006c000000650000006e0000007400000020000000740000006f000000200104010000 *00bb0102340000002000000062000000750000007400000020000000640000006f000000650000 *0073000000200000006e0000006f00000074000000200000006800000069000000640000006500 *00002000000074000000680000006500000020000000690000006e000000680000006500000072 *000000650000006e0000007400000020000000490000004f000000200000006f00000066000000 *20000000740000006800000065000000200000006c0000006f000000770000002d0000006c0000 *006500000076000000650000006c0000000a021800000020000000420000007900000074000000 *65000000530000007400000072000000690000006e00000067000000200000006f000000700000 *0065000000720000006100000074000000690000006f0000006e000000730000002e0000000a00 *000000bd010301023a000000550000007300000065000000730000002000000074000000680000 *00650000002000000070000000720000006f000000760000006900000064000000650000006400 *00002000000078000000730000006c0000002000000066000000690000006c0000006500000020 *000000740000006f000000200000007400000072000000610000006e0000007300000066000000 *6f000000720000006d000000200000007400000068000000650000002000000067000000690000 *0076000000650000006e00000020000000730000007400000072000000690000006e0000006700 *00002e0000000a0102410000002000000054000000680000006900000073000000200000006600 *0000750000006e0000006300000074000000690000006f0000006e000000200000006300000072 *00000065000000610000007400000065000000730000002000000074000000650000006d000000 *700000006f000000720000006100000072000000790000002000000066000000690000006c0000 *00650000007300000020000000640000007500000072000000690000006e000000670000002000 *000069000000740000007300000020000000650000007800000065000000630000007500000074 *000000690000006f0000006e0000002c000000200000006200000075000000740000000a021b00 *00002000000067000000750000006100000072000000610000006e000000740000006500000065 *000000730000002000000074000000680000006500000069000000720000002000000063000000 *6c00000065000000610000006e00000075000000700000002e0000000a00000000be0103022e00 *00004e0000006f0000007400000065000000200000007400000068000000610000007400000020 *0000007400000068000000650000002000000078000000730000006c0000002000000066000000 *690000006c00000065000000200000006d00000075000000730000007400000020000000680000 *00610000007600000065000000200000002e00000078000000730000006c000000200000007300 *000075000000660000006600000069000000780000002e0000000a00000000bf01030102040000 *00550000007300000065000000200107020800000078000000730000006c000000740000007000 *0000720000006f00000063021300000020000000740000006f0000002000000074000000720000 *00610000006e00000073000000660000006f000000720000006d00000020000000580000004d00 *00004c0000002e0000000a00000002940000000000c00103010204000000550000007300000065 *00000020010702050000007300000061000000780000006f0000006e0213000000200000007400 *00006f000000200000007400000072000000610000006e00000073000000660000006f00000072 *0000006d00000020000000580000004d0000004c0000002e0000000a0000000295000000000296 *00000000029700000000029800000000029900000000029a00000c000000b5000000b6000000b7 *000000b8000000b9000000ba000000bb000000bc000000bd000000be000000bf000000c00c0000 *00be000000bd000000b8000000bb000000bc000000b5000000bf000000c0000000ba000000b900 *0000b6000000b7000c000000b500000000b600000000b700000000b800000000b900000000ba00 *000000bb00000000bc00000000bd00000000be00000000bf00000000c000000000000000000900 *010c00000072000000650000007100000075000000690000007200000065000000730000002000 *00006d000000740000006c010b00000070000000720000006f0000007600000069000000730000 *00690000006f0000006e000000610000006c010d0000006c000000650000006d0000006d000000 *690000006800000040000000760000006f0000002e000000630000006f0000006d870000029b00 *000000029c0000000000c101010301024e00000055000000730000006500000064000000200000 *00740000006f00000020000000630000006f0000006e0000007600000065000000720000007400 *000020000000610000007200000062000000690000007400000072000000610000007200000079 *00000020000000740000007900000070000000650000007300000020000000690000006e000000 *740000006f00000020000000610000006e00000020000000480000005400000054000000500000 *0020000000720000006500000073000000700000006f0000006e00000073000000650000002e00 *00002000000020000000590000006f00000075000000200000006e000000650000006500000064 *00000020000000740000006f00000020000000690000006d000000700000006c00000065000000 *6d000000650000006e000000740000000a01021b00000020000000200000007400000068000000 *690000007300000020000000690000006600000020000000790000006f00000075000000200000 *0077000000610000006e0000007400000020000000740000006f00000020000000700000006100 *00007300000073000000200107020d000000530000006500000072000000760000006500000072 *0000005000000061000000720000007400000054000000200000006d01021b0000002000000063 *0000006f0000006e0000007400000061000000690000006e000000690000006e00000067000000 *20000000790000006f000000750000007200000020000000740000007900000070000000650000 *0020000000690000006e000000740000006f00000020010401000000f002020000002e0000000a *030102140000004d000000690000006e000000690000006d000000610000006c00000020000000 *640000006500000066000000690000006e0000006900000074000000690000006f0000006e0000 *003a00000020010401000000c302020000002e0000000a00000000c20000000000c30000000000 *c40000000000c5010301020b00000055000000730000006500000066000000750000006c000000 *20000000660000006f00000072000000200104010000010d01020500000020000000610000006e *000000640000002001020800000067000000650000007400000044000000610000007400000061 *000000270102280000002000000020000000690000006d000000700000006c000000650000006d *000000650000006e00000074000000200000007400000068000000690000007300000020000000 *6f0000006e00000020000000790000006f00000075000000720000002000000070000000720000 *006500000066000000650000007200000072000000650000006400000020000000740000007900 *000070000000650000000a021900000020000000740000006f0000002000000075000000730000 *00650000002000000074000000680000006f000000730000006500000020000000660000007500 *00006e0000006300000074000000690000006f0000006e000000730000002e0000000a00000000 *c60000000000c70000000000c80101030102160000005400000068000000690000007300000020 *000000630000006c00000061000000730000007300000020000000690000007300000020000000 *750000007300000065000000640000002000000062000000790000002001040100000106010229 *00000020000000740000006f000000200000007000000061000000720000007300000065000000 *2000000061000000200000007000000061000000740000006800000020000000630000006f0000 *006d000000700000006f0000006e000000650000006e0000007400000020000000690000006e00 *0000740000006f00000020000000610000002000000076000000610000006c0000007500000065 *0000002e0000000a01024300000020000000410000007400000020000000700000007200000065 *00000073000000650000006e000000740000002c00000020000000740000006800000065000000 *20000000690000006e0000007300000074000000610000006e0000006300000065000000730000 *0020000000660000006f00000072000000200000006e000000750000006d000000620000006500 *000072000000200000007400000079000000700000006500000073000000200000002800000049 *0000006e000000740000002c00000020000000460000006c0000006f0000006100000074000000 *2c0000002000000065000000740000006300000029000000200000006a00000075000000730000 *00740000000a0102060000002000000063000000610000006c0000006c00000020010401000002 *9d0102130000002e0000002000000054000000680000006500000020000000690000006e000000 *7300000074000000610000006e000000630000006500000020000000660000006f000000720000 *00200104010000029301021a00000020000000680000006f000000770000006500000076000000 *65000000720000002c000000200000006a00000075000000730000007400000020000000700000 *006100000073000000730000006500000073000000200000007400000068000000650000000a01 *0241000000200000007000000061000000740000006800000020000000630000006f0000006d00 *0000700000006f0000006e000000650000006e0000007400000020000000730000007400000072 *000000610000006900000067000000680000007400000020000000740000006800000072000000 *6f0000007500000067000000680000002e00000020000000540000006800000069000000730000 *0020000000690000007300000020000000730000006f0000002000000074000000680000006100 *00007400000020000000790000006f000000750000002000000063000000610000006e00000020 *0000007200000065000000610000006400000020000000610000000a01022b0000002000000070 *00000061000000740000006800000020000000630000006f0000006d000000700000006f000000 *6e000000650000006e000000740000002000000077000000680000006900000063000000680000 *00200000006c0000006f0000006f0000006b00000073000000200000006c000000690000006b00 *000065000000200000007400000068000000690000007300000020000000610000007300000020 *00000061000000200104010000029302020000003a0000000a01030102010000002f01020a0000 *00730000006f0000006d00000065000000730000007400000072000000690000006e0000006701 *02010000002f02010000000a01030236000000690000006e000000730000007400000065000000 *6100000064000000200000006f0000006600000020000000720000006500000071000000750000 *006900000072000000690000006e00000067000000200000007400000068000000650000002000 *00007000000061000000740000006800000020000000630000006f0000006d000000700000006f *0000006e000000650000006e0000007400000020000000740000006f000000200000006c000000 *6f0000006f0000006b000000200000006c000000690000006b000000650000003a0000000a0301 *02010000002f0102010000002201020a000000730000006f0000006d0000006500000073000000 *7400000072000000690000006e00000067010201000000220102010000002f02010000000a0000 *0000c90000000000ca0000000000cb0101030102160000004100000020000000630000006f0000 *006e00000074000000720000006f0000006c000000200000007300000074000000720000007500 *000063000000740000007500000072000000650000002e000000200000000a0102290000002000 *0000490000007400000020000000650000006e0000006400000073000000200000007400000068 *0000006500000020000000630000006f0000006d00000070000000750000007400000061000000 *74000000690000006f0000006e00000020000000610000006e0000006400000020000000720000 *00650000007400000075000000720000006e000000730000002000000074000000680000006500 *000020010402000000680000006301021400000020000000790000006f00000075000000200000 *0070000000610000007300000073000000650000006400000020000000690000006e0000007400 *00006f0000002000000069000000740000000a01024700000020000000690000006d0000006d00 *00006500000064000000690000006100000074000000650000006c000000790000002e00000020 *00000020000000540000006800000069000000730000002000000070000000720000006f000000 *760000006900000064000000650000007300000020000000610000006e00000020000000610000 *006c0000007400000065000000720000006e000000610000007400000065000000200000006500 *0000730000006300000061000000700000006500000020000000720000006f0000007500000074 *000000650000002e0000002000000020000000490000006e000000200000007000000061000000 *72000000740000006900000063000000750000006c00000061000000720000000a01023a000000 *200000006900000074000000200000006800000061000000730000002000000061000000200000 *006d0000006f0000006e0000006100000064000000690000006300000020000000760000006100 *00006c0000007500000065000000200000006f0000006600000020000000610000006e00000079 *00000020000000740000007900000070000000650000002e000000200000002000000041000000 *6e0000006400000020000000750000006e0000006c000000650000007300000073000000200000 *00790000006f000000750000002000000063000000610000006c0000006c000000200107010401 *000000d102030000002000000069000000640102010000000a0237000000200000006600000069 *00000072000000730000007400000020000000790000006f000000750000007200000020000000 *720000006500000073000000700000006f0000006e000000730000006500000020000000660000 *00690000006c000000740000006500000072000000730000002000000077000000690000006c00 *00006c000000200000006200000065000000200000006100000070000000700000006c00000069 *0000006500000064000000200000006e0000006f000000720000006d000000610000006c000000 *6c000000790000002e0000000a0301021900000045000000780000007400000072000000650000 *006d000000650000006c0000007900000020000000750000007300000065000000660000007500 *00006c000000200000007700000068000000650000006e00000020000000790000006f00000075 *0102010000002701022b0000007200000065000000200000006400000065000000650000007000 *000020000000690000006e00000073000000690000006400000065000000200000006100000020 *0000006d0000006f0000006e000000610000006400000020000000610000006e00000064000000 *200000006400000065000000630000006900000064000000650000002000000074000000680000 *00610000007400000020000000790000006f000000750000000a01024300000020000000770000 *00610000006e0000007400000020000000740000006f0000002000000072000000650000007400 *000075000000720000006e000000200000006100000020000000630000006f0000006d00000070 *0000006c0000006500000074000000650000006c00000079000000200000006400000069000000 *66000000660000006500000072000000650000006e0000007400000020000000630000006f0000 *006e00000074000000650000006e00000074000000200000007400000079000000700000006500 *00002c0000002000000073000000690000006e0000006300000065000000200000006900000074 *00000020000000640000006f00000065000000730000006e010201000000270102020000007400 *00000a01022f00000020000000660000006f000000720000006300000065000000200000007900 *00006f0000007500000020000000740000006f00000020000000630000006f0000006e00000076 *00000065000000720000007400000020000000610000006c0000006c0000002000000079000000 *6f00000075000000720000002000000072000000650000007400000075000000720000006e0000 *0020000000740000007900000070000000650000007300000020000000740000006f0000002001 *0402000000680000006301020f000000200000006500000061000000720000006c000000790000 *00200000006a00000075000000730000007400000020000000740000006f0000000a0212000000 *200000006100000063000000630000006f0000006d0000006f0000006400000061000000740000 *006500000020000000740000006800000069000000730000002e0000000a00000000cc01010301 *0231000000490000007400000020000000690000007300000020000000770000006f0000007200 *000074000000680000002000000064000000690000007300000063000000750000007300000073 *000000690000006e00000067000000200000007400000068000000650000002000000075000000 *6e0000007000000061000000630000006b00000065000000640000002000000073000000740000 *0072000000750000006300000074000000750000007200000065000000200000006f0000006600 *000020010402000000ce000000cd01020c00000020000000610000002000000062000000690000 *00740000002000000061000000730000002000000069000000740102010000002701020a000000 *73000000200000006500000078000000700000006f0000007300000065000000640000000a0102 *050000002000000020000000690000006e00000020010401000000e50102050000002000000061 *0000006e0000006400000020010401000000eb02020000002e0000000a01030102110000004100 *00002000000066000000750000006c0000006c0000007900000020000000750000006e00000070 *00000061000000630000006b000000650000006400000020010402000000ce000000cd02220000 *002000000068000000610000007300000020000000610000002000000073000000740000007200 *000075000000630000007400000075000000720000006500000020000000740000006800000061 *00000074000000200000006c0000006f0000006f0000006b00000073000000200000006c000000 *690000006b000000650000003a0000000a0107024a00000020000000750000006e000000750000 *006e00000057000000650000006200000054000000200000002400000020000000570000006500 *00006200000054000000200000006d0000002000000061000000200000003a0000003a00000020 *0000006d00000020000000280000004d0000006100000079000000620000006500000020000000 *280000004500000069000000740000006800000065000000720000002000000052000000650000 *0073000000700000006f0000006e000000730000006500000020000000610000002c0000002000 *000046000000690000006c00000074000000650000007200000046000000750000006e00000020 *000000520000006500000073000000700000006f0000006e000000730000006500000029000000 *290000000a010301020d000000530000006f0000002c0000002000000069000000670000006e00 *00006f00000072000000690000006e0000006700000020010702010000006d01021f0000002c00 *000020000000610000007300000020000000690000007400000020000000690000007300000020 *0000006a0000007500000073000000740000002000000074000000680000006500000020000000 *630000006f0000006e0000007400000061000000690000006e000000690000006e000000670000 *00200104010000029e0102190000002c0000002000000074000000680000006500000020000000 *6f000000750000007400000065000000720000006d0000006f0000007300000074000000200000 *006c000000610000007900000065000000720000002000000069000000730000000a0102040000 *00200000002000000061000000200104010000029f01020b0000002e0000002000000020000000 *54000000680000006900000073000000200000006900000073000000200104010000024c010204 *00000020000000690000006600000020010401000002a001020f00000020000000770000006100 *0000730000002000000063000000610000006c0000006c0000006500000064000000200000006f *00000072000000200107010401000002a10102020000002000000028010401000002a201020100 *00002001040200000068000000630102010000000a010205000000200000002000000061000000 *2c00000020010401000000d80102020000002000000028010402000002a3000002a40102010000 *002001040200000068000000630202000000290000002901020400000020000000690000006600 *000020010401000002a0010205000000200000007700000061000000730000006e010201000000 *27010216000000740000002000000063000000610000006c0000006c0000006500000064000000 *2e0000002000000020000000490000006e00000073000000690000006400000065000000200000 *00740000006800000065000000200104010000029f0102020000002c0000000a01024a00000020 *000000200000007400000068000000650000007200000065000000200000006900000073000000 *200000006100000020000000700000006100000069000000720000002e00000020000000200000 *00540000006800000065000000200000007300000065000000630000006f0000006e0000006400 *000020000000650000006c000000650000006d000000650000006e00000074000000200000006f *000000660000002000000074000000680000006500000020000000700000006100000069000000 *72000000200000006900000073000000200000006f000000750000007200000020000000660000 *00690000006c0000007400000065000000720000002000000066000000750000006e0000006300 *000074000000690000006f0000006e0000000a01020200000020000000200107010401000000d7 *01020100000020040200000068000000630102030000002e000000200000002001070104010000 *00d701020100000020040200000068000000630102150000002000000069000000730000002000 *000061000000200000007400000079000000700000006500000020000000610000006c00000069 *000000610000007300000020000000660000006f00000072000000200107010401000000d80102 *010000000a010203000000200000002000000028010402000002a5000002a60102020000002000 *000028010402000002a3000002a401020100000020010402000000680000006302020000002900 *0000290102200000002e0000002000000020000000540000006800000069000000730000002000 *00006900000073000000200000006a000000750000007300000074000000200000006100000020 *000000770000007200000061000000700000007000000065000000720000002000000066000000 *6f0000007200000020000000610000002001070104020000006800000063010204000000200000 *002d0000003e00000020040200000068000000630102010000000a01021d000000200000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000002000000077 *000000690000007400000068000000200000006100000020000000700000006100000072000000 *740000006900000063000000750000006c000000610000007200000020010401000002a7021600 *0000200000006200000065000000680000006100000076000000690000006f000000720000002e *00000020000000200000005400000068000000650000002000000076000000610000006c000000 *75000000650000000a010702190000002000000020000000410000007000000070000000650000 *006e0000006400000020000000280000004400000075000000610000006c000000200000002800 *0000450000006e000000640000006f000000200000006600000029000000290000000a01030232 *000000430000006100000075000000730000006500000073000000200000006600000020000000 *740000006f00000020000000620000006500000020000000630000006f0000006d000000700000 *006f00000073000000650000006400000020000000770000006900000074000000680000002000 *00007400000068000000650000002000000070000000720000006500000076000000690000006f *00000075000000730000002000000066000000690000006c000000740000006500000072000000 *2e0000000a01070216000000200000002000000053000000650000007400000020000000280000 *004400000075000000610000006c0000002000000028000000450000006e000000640000006f00 *0000200000006600000029000000290000000a0103023600000043000000610000007500000073 *0000006500000073000000200000006600000020000000740000006f000000200000006e000000 *6f0000007400000020000000620000006500000020000000630000006f0000006d000000700000 *006f00000073000000650000006400000020000000770000006900000074000000680000002000 *00007400000068000000650000002000000070000000720000006500000076000000690000006f *00000075000000730000002000000066000000690000006c000000740000006500000072000000 *2e0000000a010301023100000046000000690000006e000000610000006c0000006c0000007900 *00002c000000200000007400000068000000650000002000000066000000690000007200000073 *0000007400000020000000650000006c000000650000006d000000650000006e00000074000000 *200000006f00000066000000200000007400000068000000650000002000000070000000610000 *006900000072000000200000006900000073000000200000006500000069000000740000006800 *00006500000072000000200107020d0000004c0000006500000066000000740000002000000052 *0000006500000073000000700000006f0000006e0000007300000065010204000000200000006f *000000720000002001070207000000520000006900000067000000680000007400000020000000 *6102020000002e0000000a0103010241000000410000006e0000006f0000007400000068000000 *650000007200000020000000770000006100000079000000200000006f00000066000000200000 *006c0000006f0000006f0000006b000000690000006e0000006700000020000000610000007400 *000020000000610000006c0000006c000000200000007400000068000000650000007300000065 *000000200000007000000069000000650000006300000065000000730000002000000069000000 *730000002000000066000000720000006f0000006d000000200000007400000068000000650000 *00200000006200000065000000680000006100000076000000690000006f000000720000007300 *00000a010215000000200000002000000074000000680000006500000079000000200000006300 *00006f0000006e00000074000000720000006f0000006c0000002e000000200000002000000054 *0000006800000065000000200104010000029f01020e00000020000000630000006f0000006e00 *000074000000720000006f0000006c000000730000002000000074000000680000006500000020 *010401000002a001020c0000002000000062000000650000006800000061000000760000006900 *00006f000000720000002e00000020000000200107010204000000530000006500000074000000 *0a020a000000200000002000000028000000450000006e000000640000006f0000002000000066 *0000002901021000000020000000630000006f0000006d00000065000000730000002000000066 *000000720000006f0000006d0000002000000074000000680000006500000020010401000000d1 *010216000000200000006200000065000000680000006100000076000000690000006f00000072 *0000002e00000020000000200000004c000000690000006b000000650000007700000069000000 *73000000650000002c000000200107010207000000410000007000000070000000650000006e00 *0000640000000a020a000000200000002000000028000000450000006e000000640000006f0000 *002000000066000000290102090000002000000069000000730000002000000066000000720000 *006f0000006d00000020010401000000d20102030000002e00000020000000200107020d000000 *4c00000065000000660000007400000020000000520000006500000073000000700000006f0000 *006e000000730000006501020d0000002000000069000000730000002000000077000000680000 *00610000007400000020000000790000006f000000750000000a01021400000020000000200000 *00670000006500000074000000200000007700000068000000650000006e000000200000007900 *00006f000000750000002000000063000000610000006c0000006c00000020010401000000cb01 *020500000020000000610000006e00000064000000200107020700000052000000690000006700 *000068000000740000002000000061021500000020000000690000007300000020000000740000 *006800000065000000200000006e0000006f000000720000006d000000610000006c0000002000 *0000650000007800000069000000740000002e0000000a01030226000000410000006e00000020 *0000006500000078000000610000006d000000700000006c000000650000002000000063000000 *6100000073000000650000002000000073000000740000006100000074000000650000006d0000 *00650000006e00000074000000200000006c0000006f0000006f0000006b000000730000002000 *00006c000000690000006b000000650000003a0000000a07010210000000200000002000000065 *00000078000000310000002000000077000000650000006200000074000000200000003d000000 *20000000640000006f0000000a0102190000002000000020000000200000002000000076000000 *610000006c000000200000003c0000002d00000020000000750000006e000000750000006e0000 *005700000065000000620000005400000020000000770000006500000062000000740000000a01 *021000000020000000200000002000000020000000630000006100000073000000650000002000 *000076000000610000006c000000200000006f000000660000000a01024e000000200000002000 *00002000000020000000200000002000000020000000200000004e0000006f0000007400000068 *000000690000006e00000067000000200000002d0000003e000000200000004e0000006f000000 *7400000068000000690000006e0000006700000020000000200000002d0000002d000000200000 *007400000068000000690000007300000020000000690000007300000020000000740000006800 *00006500000020000000690000006e000000740000006500000072000000690000006f00000072 *0000002000000076000000610000006c0000007500000065000000200000007700000068000000 *650000006e000000200000006d0000007a00000065000000720000006f00000020000000770000 *00610000007300000020000000750000007300000065000000640000000a010261000000200000 *00200000002000000020000000200000002000000020000000200000004a000000750000007300 *00007400000020000000280000004c00000065000000660000007400000020000000720000002c *000000200000006600000029000000200000002d0000003e000000200000004a00000075000000 *730000007400000020000000280000004c00000065000000660000007400000020000000720000 *002c000000200000006600000029000000200000002d0000002d00000020000000720000002000 *00006900000073000000200000007400000068000000650000002000000076000000610000006c *000000750000006500000020000000740000006800000061000000740000002000000077000000 *610000007300000020000000700000006100000073000000730000006500000064000000200000 *00690000006e000000740000006f000000200000002200000066000000690000006e0000006900 *0000730000006800000057000000690000007400000068000000220000000a0102490000002000 *000020000000200000002000000020000000200000002000000020000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *000020000000200000002000000020000000200000002d0000002d000000200000006600000020 *0000006900000073000000200000006f0000007500000072000000200000006600000069000000 *6c0000007400000065000000720000002000000066000000750000006e00000063000000740000 *00690000006f0000006e0000000a01025000000020000000200000002000000020000000200000 *002000000020000000200000004a00000075000000730000007400000020000000280000005200 *00006900000067000000680000007400000020000000610000002c000000200000006600000029 *000000200000002d0000003e000000200000004a00000075000000730000007400000020000000 *28000000520000006900000067000000680000007400000020000000610000002c000000200000 *006600000029000000200000002d0000002d000000200000006100000020000000690000007300 *0000200000006f0000007500000072000000200000006e0000006f000000720000006d00000061 *0000006c000000200000006d0000006f0000006e00000061000000640000006900000063000000 *2000000076000000610000006c00000075000000650000000a0251000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *000020000000200000002000000020000000200000002000000020000000200000002000000020 *00000020000000200000002000000020000000200000002d0000002d0000002000000066000000 *200000006900000073000000200000007300000074000000690000006c0000006c000000200000 *006f00000075000000720000002000000066000000690000006c00000074000000650000007200 *00002000000066000000750000006e0000006300000074000000690000006f0000006e0000000a *00000000cd01030224000000540000006800000065000000200000006200000061000000730000 *00690000006300000020000000720000006500000073000000700000006f0000006e0000007300 *000065000000200000006200000075000000690000006c00000064000000690000006e00000067 *000000200000006f000000620000006a0000006500000063000000740000002e0000000a000000 *00ce0000000000cf0000000000d001030102300000004100000020000000730000006500000074 *000000200000006f000000660000002000000066000000750000006e0000006300000074000000 *690000006f0000006e0000007300000020000000660000006f00000072000000200000006d0000 *00610000006e0000006900000070000000750000006c0000006100000074000000690000006e00 *0000670000002000000066000000690000006c000000740000006500000072000000730000002e *00000020000000200000004100000020010402000000df000000de01020c000000200000006900 *00006d000000700000006c000000650000006d000000650000006e00000074000000730000000a *01020100000020010401000000d001020100000020010402000000680000006301022e00000020 *000000730000006f00000020000000740000006800000065000000730000006500000020000000 *6d0000006500000074000000680000006f00000064000000730000002000000061000000720000 *0065000000200000007400000068000000650000002000000066000000750000006e0000006400 *0000610000006d000000650000006e00000074000000610000006c000000200000007700000061 *0000007900000073000000200000006f000000660000000a010238000000200000006d00000061 *0000006e0000006900000070000000750000006c0000006100000074000000690000006e000000 *670000002000000074000000680000006500000020000000720000006500000073000000700000 *006f0000006e0000007300000065000000200000006f000000620000006a000000650000006300 *0000740000002c0000002000000065000000730000007000000065000000630000006900000061 *0000006c0000006c00000079000000200000006200000065000000660000006f00000072000000 *6500000020000000790000006f0000007501020100000027010212000000760000006500000020 *000000630000006f0000006e000000760000006500000072000000740000006500000064000000 *20000000790000006f00000075000000720000000a010214000000200000006d0000006f000000 *6e000000610000006400000069000000630000002000000076000000610000006c000000750000 *006500000020000000740000006f00000020000000610000002001040200000068000000630202 *0000002e0000000a00000000d1010103023000000049000000670000006e0000006f0000007200 *0000650000007300000020000000610000006c0000006c00000020000000700000007200000065 *00000076000000690000006f000000750000007300000020000000610000006c00000074000000 *65000000720000006100000074000000690000006f0000006e0000007300000020000000740000 *006f00000020000000790000006f00000075000000720000002000000066000000690000006c00 *00007400000065000000720000000a0103020f000000410000007300000020000000610000006e *000000200000006500000078000000610000006d000000700000006c000000650000003a000000 *0a010701020400000020000000640000006f0000000a0102130000002000000020000000200000 *00630000006f0000006d000000700000006f000000730000006500000046000000690000006c00 *000074000000650000007200000020000000660000000a01020f00000020000000200000002000 *000073000000650000007400000046000000690000006c00000074000000650000007200000020 *000000670000000a02180000002000000020000000200000007200000065000000740000007500 *0000720000006e000000200000002200000048000000650000006c0000006c0000006f00000020 *000000570000006f000000720000006c00000064000000220000000a03023e0000007300000065 *0000007400000046000000690000006c0000007400000065000000720000002000000067000000 *2000000077000000690000006c0000006c00000020000000630000006100000075000000730000 *006500000020000000740000006800000065000000200000006600000069000000720000007300 *00007400000020000000630000006f0000006d000000700000006f000000730000006500000046 *000000690000006c00000074000000650000007200000020000000740000006f00000020000000 *62000000650000002000000069000000670000006e0000006f0000007200000065000000640000 *002e0000000a00000000d20103010237000000430000006f0000006d000000700000006f000000 *73000000650000007300000020000000790000006f000000750000007200000020000000660000 *00690000006c0000007400000065000000720000002000000066000000750000006e0000006300 *000074000000690000006f0000006e000000200000007700000069000000740000006800000020 *000000740000006800000065000000200000006500000078000000690000007300000074000000 *690000006e000000670000002000000066000000690000006c0000007400000065000000720000 *000a020b0000002000000066000000750000006e0000006300000074000000690000006f000000 *6e0000002e0000000a00000000d30103022a000000520000006500000074000000720000006900 *000076000000650000007300000020000000740000006800000065000000200000006600000069 *0000006c0000007400000065000000720000002000000066000000720000006f0000006d000000 *2000000074000000680000006500000020000000650000006e0000007600000069000000720000 *006f0000006e0000006d000000650000006e000000740000002e0000000a00000000d400000000 *00d50000000000d60000000000d701030107020900000046000000690000006c00000074000000 *650000007200000046000000750000006e01022000000020000000690000007300000020000000 *61000000200000006c0000006f00000074000000200000006d0000006f00000072000000650000 *002000000066000000750000006e00000020000000740000006f00000020000000740000007900 *00007000000065000000200000007400000068000000610000006e000000200107021900000053 *0000006500000074000000410000007000000070000000650000006e0000006400000020000000 *280000004400000075000000610000006c0000002000000028000000450000006e000000640000 *006f0000002000000061000000290000002902020000002e0000000a00000000d801010301021e *00000041000000200000006d0000006f0000006e0000006f000000690000006400000020000000 *6f0000007000000065000000720000006100000074000000690000006f0000006e000000200000 *00630000006f0000006e0000007400000061000000690000006e00000065000000720000002e00 *00000a010218000000200000004900000066000000200000006100000020000000690000007300 *00002000000061000000200000006d0000006f0000006e0000006f00000069000000640000002c *000000200000007400000068000000650000006e00000020010401000000d8022b000000200000 *0069000000730000002000000061000000200000006d0000006f0000006e0000006f0000006900 *000064000000200000007700000069000000740000006800000020000000740000006800000065 *00000020000000660000006f0000006c0000006c0000006f00000077000000690000006e000000 *67000000200000006200000065000000680000006100000076000000690000006f000000720000 *00730000003a0000000a0107010237000000200000002000000053000000650000007400000020 *0000002000000020000000200000007800000020000000600000006d0000006100000070000000 *70000000650000006e000000640000006000000020000000410000007000000070000000650000 *006e000000640000002000000079000000200000003d0000002000000053000000650000007400 *000020000000200000002000000020000000280000007800000020000000600000006d00000061 *0000007000000070000000650000006e0000006400000060000000200000007900000029000000 *0a0102370000002000000020000000410000007000000070000000650000006e00000064000000 *200000007800000020000000600000006d000000610000007000000070000000650000006e0000 *00640000006000000020000000410000007000000070000000650000006e000000640000002000 *000079000000200000003d00000020000000410000007000000070000000650000006e00000064 *00000020000000280000007800000020000000600000006d000000610000007000000070000000 *650000006e00000064000000600000002000000079000000290000000a02260000002000000020 *0000005f0000002000000020000000200000002000000020000000200000002000000020000000 *600000006d000000610000007000000070000000650000006e0000006400000060000000200000 *005300000065000000740000002000000079000000200000002000000020000000200000003d00 *00002000000053000000650000007400000020000000790000000a0301023a0000004100000020 *00000073000000690000006d000000700000006c00000065000000200000007700000061000000 *79000000200000006f000000660000002000000073000000750000006d0000006d000000610000 *0072000000690000007a000000690000006e000000670000002000000074000000680000006900 *0000730000002000000069000000730000002c0000002000000069000000660000002000000074 *000000680000006500000020000000720000006900000067000000680000007400000020000000 *730000006900000064000000650000002000000069000000730000002001070206000000410000 *007000000070000000650000006e0000006401020b0000002c0000002000000074000000680000 *00650000006e000000200000007400000068000000650000000a01023600000020000000720000 *006900000067000000680000007400000020000000690000007300000020000000610000007000 *000070000000650000006e00000064000000650000006400000020000000740000006f00000020 *000000740000006800000065000000200000006c0000006500000066000000740000002e000000 *200000002000000049000000660000002000000074000000680000006500000020000000720000 *006900000067000000680000007400000020000000730000006900000064000000650000002000 *0000690000007300000020010702030000005300000065000000740102150000002c0000002000 *00007400000068000000650000006e00000020000000740000006800000065000000200000006c *00000065000000660000007400000020000000730000006900000064000000650000000a020d00 *00002000000069000000730000002000000069000000670000006e0000006f0000007200000065 *000000640000002e0000000a00000000d90000000000da0000000000db010301021a0000005900 *000065000000730000002c00000020000000740000006800000069000000730000002000000069 *000000730000002000000065000000780000006100000063000000740000006c00000079000000 *200000006c000000690000006b0000006500000020010402000002a8000002a901021100000020 *00000077000000690000007400000068000000200000006e000000650000007700000020000000 *6e000000610000006d00000065000000730000002e0000000a0102160000002000000057000000 *680000007900000020000000790000006f000000750000002000000061000000730000006b0000 *003f00000020000000420000006500000063000000610000007500000073000000650000002001 *02070000005300000065000000720000007600000065000000720000005401020f000000200000 *0063000000610000006e000000200000006c000000690000006600000074000000200000007500 *000070000000200000006100000020010402000002a8000002a90102020000002e0000000a0102 *2900000020000000490000006600000020000000790000006f0000007500000020000000640000 *00690000006400000020000000740000006800000061000000740000002c000000200000006900 *00007400000020000000770000006f000000750000006c00000064000000200000007300000068 *00000061000000640000006f000000770000002000000053000000650000007200000076000000 *6500000072000000540102010000002701020b0000007300000020000000620000006500000068 *0000006100000076000000690000006f000000720000000a010236000000200000006100000073 *000000200000006100000020000000520000006500000061000000640000006500000072000000 *540000002c0000002000000074000000680000007500000073000000200000006d000000650000 *00610000006e000000690000006e00000067000000200000006900000066000000200000007900 *00006f00000075000000200000006c000000690000006600000074000000650000006400000020 *000000740000006800000065000000200000005200000065000000610000006400000065000000 *72000000540000000a01022000000020000000790000006f000000750000002000000063000000 *6f000000750000006c00000064000000200000006e0000006f000000200000006c0000006f0000 *006e000000670000006500000072000000200000006d0000006f00000064000000690000006600 *0000790000002000000074000000680000006500000020010402000000580000005701020c0000 *002e00000020000000200000005400000068000000690000007300000020000000770000006100 *0000790000000a01020f00000020000000790000006f0000007500000020000000630000006100 *00006e00000020000000610000006400000064000000200000006100000020010402000002a800 *0002a901021d00000020000000740000006f00000020000000790000006f000000750000007200 *0000200000006d0000006f0000006e000000610000006400000020000000730000007400000061 *000000630000006b00000020000000770000006900000074000000680000006f00000075000000 *740000000a020e00000020000000610000006e000000790000002000000074000000720000006f *00000075000000620000006c000000650000002e0000000a00000000dc0000000000dd00000000 *00de0103024a000000530000006500000072000000760000006500000072000000500000006100 *000072000000740000005400000020000000690000007300000020000000610000002000000063 *0000006f0000006e0000007400000061000000690000006e000000650000007200000020000000 *660000006f000000720000002000000070000000720000006f0000006300000065000000730000 *0073000000690000006e0000006700000020000000720000006500000071000000750000006500 *000073000000740000007300000020000000610000006e00000064000000200000007200000065 *0000007400000075000000720000006e000000690000006e000000670000002000000072000000 *6500000073000000750000006c00000074000000730000002e0000000a00000000df0000000000 *e00000000000e101030232000000410000006e00000020000000610000006c0000006900000061 *0000007300000020000000660000006f0000007200000020000000750000007300000069000000 *6e0000006700000020000000530000006500000072000000760000006500000072000000500000 *0061000000720000007400000054000000200000007700000068000000650000006e0000002000 *00007500000073000000690000006e000000670000002000000074000000680000006500000020 *000000490000004f0000002e0000000a00000000e201030221000000410000006e000000200000 *00610000006c00000069000000610000007300000020000000660000006f000000720000002000 *000057000000650000006200000054000000200000007700000068000000650000006e00000020 *0000007500000073000000690000006e0000006700000020000000490000004f0000002e000000 *0a00000000e3010301023a00000070000000610000007200000074000000690000006300000075 *0000006c00000061000000720000006c0000007900000020000000750000007300000065000000 *66000000750000006c000000200000007700000068000000650000006e00000020000000630000 *006f0000006d00000062000000690000006e000000650000006400000020000000770000006900 *000074000000680000002000000072000000750000006e00000057000000650000006200000054 *00000020000000740000006f0000002000000070000000720000006f0000006400000075000000 *63000000650000000a010203000000200000006100000020010702120000006d00000020000000 *280000004d00000061000000790000006200000065000000200000005200000065000000730000 *00700000006f0000006e0000007300000065000000290211000000200000006600000072000000 *6f0000006d00000020000000610000002000000072000000650000007100000075000000650000 *0073000000740000002e0000000a00000000e40000000000e50101030102470000005500000073 *000000650000006400000020000000740000006f000000200000006d000000610000006e000000 *6900000070000000750000006c0000006100000074000000650000002000000074000000680000 *006500000020000000630000006f0000006e0000007400000061000000690000006e0000006900 *00006e00000067000000200000006d0000006f0000006e00000061000000640000002e00000020 *000000200000005600000065000000720000007900000020000000750000007300000065000000 *66000000750000006c000000200000007700000068000000650000006e00000020000000650000 *006d00000062000000650000006400000064000000690000006e00000067000000200000006100 *00000a01020e000000200000006d0000006f0000006e0000006100000064000000200000006900 *00006e000000740000006f000000200000006100000020010402000000df000000de0102080000 *002c0000002000000073000000690000006e000000630000006500000020010401000000f00102 *0c0000002000000072000000650000007100000075000000690000007200000065000000730000 *002000000061000000200107021000000053000000650000007200000076000000650000007200 *0000500000006100000072000000740000005400000020000000490000004f0000002000000061 *0102020000002e0000000a01020a00000020000000520000006500000066000000650000007200 *000020000000740000006f00000020010402000000ce000000cd02330000002000000066000000 *6f0000007200000020000000610000006e000000200000006500000078000000700000006c0000 *00610000006e0000006100000074000000690000006f0000006e000000200000006f0000006600 *000020000000740000006800000065000000200000007300000074000000720000007500000063 *00000074000000750000007200000065000000200000006f000000660000002000000074000000 *6800000065000000200000006d0000006f0000006e00000061000000640000002e0000000a0103 *010232000000480000006500000072000000650000002000000069000000730000002000000061 *0000006e000000200000006500000078000000610000006d000000700000006c00000065000000 *2e0000002000000020000000530000007500000070000000700000006f00000073000000650000 *0020000000790000006f000000750000002000000077000000610000006e000000740000002000 *0000740000006f00000020000000650000006d0000006200000065000000640000002000000061 *0000006e00000020010402000002aa000002ab01020b00000020000000690000006e0000007400 *00006f00000020000000790000006f00000075000000720000000a010201000000200104020000 *00df000000de01020b00000020000000740000006f00000020000000650000006e000000610000 *00620000006c0000006500000020010401000002ac01020500000020000000610000006e000000 *6400000020010401000002ad01020900000020000000690000006e00000020000000790000006f *0000007500000072000000200104010000029e02020000002e0000000a01070237000000200000 *0074000000790000007000000065000000200000004d0000007900000053000000650000007200 *000076000000650000007200000050000000610000007200000074000000540000002000000065 *000000200000006d0000002000000061000000200000003d000000200000005300000065000000 *720000007600000065000000720000005000000061000000720000007400000054000000200000 *00280000004500000072000000720000006f000000720000005400000020000000650000002000 *00006d0000002900000020000000610000000a010301021d0000004e0000006f00000077000000 *20000000730000007500000070000000700000006f000000730000006500000020000000790000 *006f000000750000002000000077000000610000006e0000007400000020000000740000006f00 *00002000000070000000610000007300000073000000200107020d0000004d0000007900000053 *000000650000007200000076000000650000007200000050000000610000007200000074000000 *5401021100000020000000690000006e000000740000006f000000200000006100000020000000 *66000000750000006e0000006300000074000000690000006f0000006e0000000a010210000000 *20000000740000006800000061000000740000002000000064000000650000006d000000610000 *006e00000064000000730000002000000061000000200107021000000053000000650000007200 *000076000000650000007200000050000000610000007200000074000000540000002000000049 *0000004f00000020000000610102070000002000000028000000650000002e000000670000002e *00000020010401000000f0010208000000290000002e0000002000000020000000590000006f00 *0000750000000a021b0000002000000063000000610000006e0000002000000070000000720000 *006f00000076000000690000006400000065000000200000007400000068000000650000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000003a0000000a *010701024b000000200000002000000020000000750000006e0000007000000061000000630000 *006b0000004500000072000000720000006f00000072000000540000003a0000003a0000002000 *0000280000004d0000006f0000006e0000006100000064000000200000006d0000002c00000020 *00000053000000680000006f00000077000000200000006500000029000000200000003d000000 *3e00000020000000550000006e0000005700000065000000620000005400000020000000280000 *004500000072000000720000006f00000072000000540000002000000065000000200000006d00 *0000290000002000000061000000200000002d0000003e00000020000000550000006e00000057 *000000650000006200000054000000200000006d00000020000000610000000a01022000000020 *0000002000000020000000750000006e0000007000000061000000630000006b00000045000000 *72000000720000006f00000072000000540000002000000068000000610000006e000000640000 *006c0000006500000072000000200000006500000074000000200000003d000000200000006400 *00006f0000000a01021e0000002000000020000000200000002000000020000000200000006500 *0000690000007400000068000000650000007200000056000000200000003c0000002d00000020 *00000072000000750000006e0000004500000072000000720000006f0000007200000054000000 *2000000065000000740000000a01021f0000002000000020000000200000002000000020000000 *2000000072000000650000007400000075000000720000006e0000002000000024000000200000 *006300000061000000730000006500000020000000650000006900000074000000680000006500 *00007200000056000000200000006f000000660000000a01024300000020000000200000002000 *0000200000002000000020000000200000002000000020000000200000004c0000006500000066 *0000007400000020000000650000007200000072000000200000002d0000003e00000020000000 *4a00000075000000730000007400000020000000280000004c0000006500000066000000740000 *002000000022000000430000006100000074000000610000007300000074000000720000006f00 *000070000000680000006900000063000000200000006600000061000000690000006c00000075 *00000072000000650000002000000022000000200000002b0000002b0000002000000073000000 *680000006f0000007700000020000000650000000a010241000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *0000200000002000000020000000200000002c0000002000000053000000650000007400000020 *0000002400000020000000450000006e000000640000006f000000200000002400000020000000 *5c00000072000000200000002d0000003e00000020000000720000007b00000072000000730000 *00430000006f0000006400000065000000200000003d0000002000000035000000300000003000 *00007d000000290000000a02170000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000052000000690000006700000068000000740000002000 *000078000000200000002d0000003e00000020000000780000000a010301020500000057000000 *690000007400000068000000200107020c000000750000006e0000007000000061000000630000 *006b0000004500000072000000720000006f000000720000005401021200000020000000790000 *006f000000750000002000000063000000610000006e000000200000006e0000006f0000007700 *00002000000063000000610000006c0000006c00000020010401000000f00102110000002e0000 *00200000004a000000750000007300000074000000200000007700000072000000610000007000 *000020000000790000006f0000007500000072000000200107020b000000530000006500000072 *000000760000006500000072000000500000006100000072000000740000005402070000002000 *00006c0000006900000073000000740000002e0000000a01070254000000200000002000000073 *000000690000006d000000700000006c0000006500000048000000540000005400000050000000 *200000006e000000750000006c0000006c000000430000006f0000006e00000066000000200000 *0024000000200000006d0000006100000070000000530000006500000072000000760000006500 *000072000000500000006100000072000000740000005400000020000000750000006e00000070 *00000061000000630000006b0000004500000072000000720000006f0000007200000054000000 *20000000280000006d000000790000005000000061000000720000007400000020000000600000 *0063000000610000007400000063000000680000004500000072000000720000006f0000007200 *000060000000200000006d0000007900000048000000610000006e000000640000006c00000065 *00000072000000290000000a010302120000004f0000007200000020000000610000006c000000 *7400000065000000720000006e00000061000000740000006900000076000000650000006c0000 *00790000003a0000000a01070244000000200000002000000073000000690000006d0000007000 *00006c00000065000000480000005400000054000000500000002700000020000000750000006e *0000007000000061000000630000006b0000004500000072000000720000006f00000072000000 *54000000200000006e000000750000006c0000006c000000430000006f0000006e000000660000 *0020000000280000006d0000007900000050000000610000007200000074000000200000006000 *000063000000610000007400000063000000680000004500000072000000720000006f00000072 *00000060000000200000006d0000007900000048000000610000006e000000640000006c000000 *6500000072000000290000000a03010209000000410000006c000000730000006f000000200000 *007300000065000000650000002001040100000135023400000020000000660000006f00000072 *0000002000000061000000200000006d0000006f00000072000000650000002000000073000000 *6f0000007000000068000000690000007300000074000000690000006300000061000000740000 *0065000000640000002000000076000000650000007200000073000000690000006f0000006e00 *0000200000006f0000006600000020000000740000006800000069000000730000002000000066 *000000750000006e0000006300000074000000690000006f0000006e0000002e0000000a000000 *00e6010301020d000000410000002000000076000000610000007200000069000000610000006e *00000074000000200000006f0000006600000020010401000000e5010230000000200000007700 *000068000000650000007200000065000000200000007400000068000000650000002000000066 *000000690000007200000073000000740000002000000061000000720000006700000075000000 *6d000000650000006e0000007400000020000000610000006c000000730000006f000000200000 *0074000000610000006b0000006500000073000000200000006100000020000000720000006500 *000071000000750000006500000073000000740000002e0000000a010217000000200000005500 *0000730000006500000066000000750000006c0000002000000069000000660000002000000079 *0000006f000000750000002000000077000000610000006e000000740000002000000074000000 *6f00000020010401000000e3010210000000200000006f0000006e000000200000006100000020 *000000640000006900000066000000660000006500000072000000650000006e00000074000000 *20010402000000df000000de01020d00000020000000690000006e000000730000006900000064 *0000006500000020000000790000006f00000075000000720000000a01020c000000200000006d *0000006f0000006e00000061000000640000002000000028000000730000006500000065000000 *20010401000001350203000000290000002e0000000a00000002ae010301022400000045000000 *780000007400000072000000610000006300000074000000200000007400000068000000650000 *002000000076000000610000006c00000075000000650000002000000066000000720000006f00 *00006d000000200000006100000020000000530000006500000074000000410000007000000070 *000000650000006e000000640000002e0000000a010235000000200000004e0000006f00000074 *000000650000002000000074000000680000006100000074000000200000006100000020000000 *530000006500000074000000410000007000000070000000650000006e00000064000000200000 *0069000000730000002000000061000000630000007400000075000000610000006c0000006c00 *000079000000200000006100000020000000430000006f000000500000006f000000690000006e *0000007400000065000000640000002000000066000000720000006f0000006d0000003a000000 *0a01020100000020010c68000000680000007400000074000000700000003a0000002f0000002f *0000006800000061000000630000006b0000006100000067000000650000002e00000068000000 *61000000730000006b000000650000006c0000006c0000002e0000006f00000072000000670000 *002f0000007000000061000000630000006b000000610000006700000065000000730000002f00 *0000610000007200000063000000680000006900000076000000650000002f0000006300000061 *0000007400000065000000670000006f00000072000000790000002d0000006500000078000000 *740000007200000061000000730000002f0000006c000000610000007400000065000000730000 *00740000002f000000640000006f000000630000002f00000068000000740000006d0000006c00 *00002f000000430000006f0000006e00000074000000720000006f0000006c0000002d00000046 *000000750000006e00000063000000740000006f000000720000002d000000500000006f000000 *690000006e0000007400000065000000640000002e00000068000000740000006d0000006c0102 *010000000a022e00000020000000420000007500000074000000200000006c0000006500000074 *00000073000000200000006e0000006f0000007400000020000000640000007200000061000000 *6700000020000000690000006e0000002000000074000000680000006100000074000000200000 *00640000006500000070000000650000006e00000064000000650000006e000000630000007900 *00002e000000200000007900000065000000740000002e0000002e0000002e0000000a00000002 *af0000000000e70103010210000000440000006500000070000000720000006500000063000000 *610000007400000065000000640000003a00000020000000750000007300000065000000200104 *01000002a002020000002e0000000a00000000e8010301020b00000054000000610000006b0000 *00650000007300000020000000790000006f000000750000007200000020010402000000ce0000 *00cd01020b0000002c000000200000006900000066000000200000006900000074000000200000 *00690000007300000020010401000002b001020c00000020000000690000007400000020000000 *72000000650000007400000075000000720000006e00000073000000200104010000024c010209 *00000020000000650000006c00000073000000650000002000000069000000740000000a010219 *00000020000000630000006f0000006e0000007600000065000000720000007400000073000000 *200000007400000068000000650000002000000076000000610000006c00000075000000650000 *0020000000740000006f0000002000000061000000200104020000006800000063022000000020 *000000610000006e00000064000000200000006100000070000000700000006c00000069000000 *650000007300000020000000790000006f00000075000000720000002000000066000000690000 *006c00000074000000650000007200000020000000740000006f00000020000000690000007400 *00002e0000000a00000000e90103010225000000460000006f0000007200000020000000770000 *0068000000650000006e00000020000000790000006f0000007500000020000000720000006500 *0000610000006c0000006c00000079000000200000006e00000065000000650000006400000020 *000000740000006f00000020000000750000006e0000007000000061000000630000006b000000 *200000006100000020010402000000ce000000cd01021300000020000000650000006e00000074 *0000006900000072000000650000006c000000790000002000000028000000610000006e000000 *64000000200000006e0000006f000000740000000a010222000000200000006a00000075000000 *730000007400000020000000750000006e00000077000000720000006100000070000000200000 *007400000068000000650000002000000066000000690000007200000073000000740000002000 *00006c000000610000007900000065000000720000002000000077000000690000007400000068 *00000020010401000000cf0203000000290000002e0000000a00000000ea010301020f00000046 *0000006f0000007200000020000000770000007200000061000000700000007000000069000000 *6e00000067000000200000006100000020010402000000ce000000cd01020b0000002000000062 *00000061000000630000006b0000002000000075000000700000002e0000002000000020010702 *160000006d0000006b00000057000000650000006200000054000000200000002e000000200000 *00750000006e000000750000006e00000057000000650000006200000054000000200000003d00 *000020000000690000006402010000000a00000000eb0103010204000000530000006500000065 *00000020010401000000e5022400000020000000660000006f0000007200000020000000610000 *002000000064000000690000007300000063000000750000007300000073000000690000006f00 *00006e000000200000006f00000066000000200000007400000068000000690000007300000020 *00000066000000750000006e0000006300000074000000690000006f0000006e0000002e000000 *0a00000000ec010301020d000000410000006e00000020000000610000006c0000006900000061 *0000007300000020000000660000006f00000072000000200107020c0000007300000065000000 *7400000046000000690000006c000000740000006500000072000000200000006900000064021d *000000200000004900000074000000200000007200000065000000730000006500000074000000 *7300000020000000610000006c0000006c00000020000000790000006f00000075000000720000 *002000000066000000690000006c000000740000006500000072000000730000002e0000000a00 *000000ed01030102380000005500000073000000650000006400000020000000740000006f0000 *002000000069000000670000006e0000006f000000720000006500000020000000610000006c00 *00006c00000020000000790000006f00000075000000720000002000000066000000690000006c *0000007400000065000000720000007300000020000000610000006e0000006400000020000000 *690000006d0000006d0000006500000064000000690000006100000074000000650000006c0000 *007900000020000000650000006e00000064000000200000007400000068000000650000000a01 *022000000020000000630000006f0000006d000000700000007500000074000000610000007400 *0000690000006f0000006e0000002e00000020000000200000004100000020000000630000006f *0000006d00000062000000690000006e0000006100000074000000690000006f0000006e000000 *200000006f0000006600000020010401000000ec01020500000020000000610000006e00000064 *00000020010401000000cb02020000002e0000000a00000000ee0103010215000000410000006e *00000020000000610000006c0000007400000065000000720000006e0000006100000074000000 *6500000020000000660000006f000000720000006d000000200000006f00000066000000200104 *01000000ed01022500000020000000740000006800000061000000740000002000000063000000 *610000006e00000020000000620000006500000020000000650000006100000073000000690000 *006c00000079000000200000007500000073000000650000006400000020000000770000006900 *00007400000068000000690000006e000000200000006100000020000000640000006f0000000a *020800000020000000620000006c0000006f000000630000006b0000002e0000000a00000002b1 *010301020c000000410000006e0000002000000061000000720000007200000061000000790000 *00200000006f0000006600000020010401000002b20102180000002c0000002000000075000000 *730000006500000066000000750000006c00000020000000660000006f00000072000000200000 *0070000000720000006f00000063000000650000007300000073000000690000006e0000006700 *00000a01021e00000020000000630000006f0000006d0000006d000000610000006e0000006400 *0000200000006c000000690000006e00000065000000200000006f000000700000007400000069 *0000006f0000006e0000007300000020000000690000006e000000740000006f00000020000000 *610000006e00000020010402000000860000008501020500000020000000660000006f00000072 *00000020010401000000f002020000002e0000000a00000000ef01030102220000005000000061 *00000072000000730000006500000020000000630000006f0000006d0000006d00000061000000 *6e00000064000000200000006c000000690000006e00000065000000200000006f000000700000 *0074000000690000006f0000006e0000007300000020000000690000006e000000740000006f00 *0000200000006100000020010402000000860000008502020000002e0000000a00000000f00103 *01023d000000550000007300000065000000200000007400000068000000650000002000000062 *00000075000000690000006c000000740000002d000000690000006e0000002000000077000000 *65000000620000002d000000730000006500000072000000760000006500000072000000200000 *00740000006f000000200000007300000065000000720000007600000065000000200000007200 *000065000000710000007500000065000000730000007400000073000000200000006100000063 *000000630000006f0000007200000064000000690000006e000000670000002000000074000000 *6f00000020000000610000000a01020100000020010402000000df000000de0102070000002e00 *0000200000002000000055000000730000006500000020010401000002b301022a000000200000 *00740000006f000000200000007000000069000000630000006b00000020000000740000006800 *000065000000200000006600000069000000720000007300000074000000200000006800000061 *0000006e000000640000006c00000065000000720000002000000066000000720000006f000000 *6d0000002000000061000000200000006c000000690000007300000074000000200000006f0000 *00660000000a0102140000002000000068000000610000006e000000640000006c000000650000 *007200000073000000200000007400000068000000610000007400000020000000640000006f00 *000065000000730000006e01020100000027010207000000740000002000000063000000610000 *006c0000006c00000020010401000002a001021f0000002e000000200000005400000068000000 *69000000730000002000000066000000750000006e0000006300000074000000690000006f0000 *006e00000020000000610000006c00000077000000610000007900000073000000200000006200 *0000690000006e0000006400000073000000200000006f0000000a01023f000000200000004900 *000050000000760000003400000020000000700000006f00000072000000740000007300000020 *000000750000006e00000074000000690000006c000000200000004e0000006500000074000000 *770000006f000000720000006b000000200000006d0000006f00000064000000750000006c0000 *006500000020000000690000007300000020000000660000006900000078000000650000006400 *000020000000740000006f00000020000000730000007500000070000000700000006f00000072 *00000074000000200000004900000050000000760000003600000020000000690000006e000000 *20000000610000000a01021300000020000000700000006f000000720000007400000061000000 *620000006c00000065000000200000007700000061000000790000002e00000020000000550000 *00730000006500000020010401000000f301021b00000020000000770000006900000074000000 *6800000020000000630000007500000073000000740000006f0000006d00000020000000730000 *006f000000630000006b0000006500000074000000200000006900000066000000200000007900 *00006f000000750000000a021b0000002000000077000000610000006e00000074000000200000 *00640000006900000066000000660000006500000072000000650000006e000000740000002000 *00006200000065000000680000006100000076000000690000006f00000075000000720000002e *0000000a00000000f101030102110000004100000020000000630000006f0000006d0000006200 *0000690000006e0000006100000074000000690000006f0000006e000000200000006f00000066 *00000020010401000000f201020500000020000000610000006e00000064000000200104010000 *00e50102070000002e00000020000000200000005300000065000000650000000a010201000000 *20010401000000e501023000000020000000660000006f00000072000000200000006100000020 *00000064000000690000007300000063000000750000007300000073000000690000006f000000 *6e000000200000006f000000660000002000000074000000680000006500000020000000660000 *006900000072000000730000007400000020000000610000007200000067000000750000006d00 *0000650000006e00000074000000200000006f0000006600000020000000740000006800000069 *000000730000000a0102420000002000000066000000750000006e000000630000007400000069 *0000006f0000006e0000002e000000200000005400000068000000690000007300000020000000 *66000000750000006e0000006300000074000000690000006f0000006e00000020000000610000 *006c000000770000006100000079000000730000002000000062000000690000006e0000006400 *00007300000020000000740000006f000000200000004900000050000000760000003400000020 *000000700000006f00000072000000740000007300000020000000750000006e00000074000000 *690000006c000000200000004e0000006500000074000000770000006f000000720000006b0000 *000a010238000000200000006d0000006f00000064000000750000006c00000065000000200000 *006900000073000000200000006600000069000000780000006500000064000000200000007400 *00006f00000020000000730000007500000070000000700000006f000000720000007400000020 *0000004900000050000000760000003600000020000000690000006e0000002000000061000000 *20000000700000006f000000720000007400000061000000620000006c00000065000000200000 *007700000061000000790000002e000000200000005500000073000000650000000a0102010000 *0020010401000000f301022a000000200000007700000069000000740000006800000020000000 *630000007500000073000000740000006f0000006d00000020000000730000006f000000630000 *006b000000650000007400000020000000690000006600000020000000790000006f0000007500 *00002000000077000000610000006e000000740000002000000064000000690000006600000066 *0000006500000072000000650000006e000000740000000a020c00000020000000620000006500 *0000680000006100000076000000690000006f00000075000000720000002e0000000a00000000 *f2010301021900000047000000650000006e000000650000007200000061000000740000006500 *0000200000006100000020000000720000006500000073000000750000006c0000007400000020 *00000066000000720000006f0000006d000000200000006100000020010402000000df000000de *01020700000020000000610000006e000000640000002000000061000000200104020000005800 *0000570102160000002e0000002000000054000000680000006900000073000000200000006900 *000073000000200000006d00000061000000690000006e0000006c000000790000002000000075 *0000007300000065000000640000000a0221000000200000006200000079000000200000004300 *000047000000490000002000000028000000610000006e00000064000000200000006600000061 *00000073000000740000002d000000630000006700000069000000290000002000000077000000 *720000006100000070000000700000006500000072000000730000002e0000000a00000000f301 *010301020400000052000000750000006e00000020010401000000f001023b0000002000000077 *000000690000007400000068000000200000006100000020000000700000007200000065000000 *76000000690000006f00000075000000730000006c0000007900000020000000620000006f0000 *00750000006e0000006400000020000000730000006f000000630000006b000000650000007400 *00002e0000002000000055000000730000006500000066000000750000006c0000002000000069 *0000006600000020000000790000006f000000750000002000000077000000610000006e000000 *7400000020000000740000006f0000002000000072000000750000006e0000000a023800000020 *00000068000000610000007000000070000000730000007400000061000000630000006b000000 *2000000061000000730000002000000075000000730000006500000072000000200000006f0000 *006e00000020000000700000006f00000072000000740000002000000038000000300000002e00 *00002000000055000000730000006500000020000000730000006f0000006d0000006500000074 *00000068000000690000006e00000067000000200000006c000000690000006b00000065000000 *20000000740000006800000069000000730000003a0000000a010701024a000000200000006900 *00006d000000700000006f00000072000000740000002000000053000000790000007300000074 *000000650000006d0000002e000000500000006f0000007300000069000000780000002e000000 *550000007300000065000000720000002000000028000000730000006500000074000000550000 *0073000000650000007200000049000000440000002c0000002000000055000000730000006500 *000072000000450000006e000000740000007200000079000000280000002e0000002e00000029 *0000002c0000002000000067000000650000007400000055000000730000006500000072000000 *450000006e000000740000007200000079000000460000006f000000720000004e000000610000 *006d00000065000000290000000a0102010000000a01020b000000200000006d00000061000000 *690000006e000000200000003d00000020000000640000006f0000000a01022700000020000000 *200000002000000020000000200000006c000000650000007400000020000000630000006f0000 *006e00000066000000200000003d000000200000006e000000750000006c0000006c0000004300 *00006f0000006e00000066000000200000007b00000020000000700000006f0000007200000074 *000000200000003d000000200000003800000030000000200000007d0000000a01021d00000020 *00000020000000200000002000000020000000730000006f000000630000006b00000065000000 *74000000200000003c0000002d0000002000000062000000690000006e00000064000000500000 *006f000000720000007400000020000000630000006f0000006e000000660000000a0102240000 *0020000000200000002000000020000000200000002d0000002d00000020000000640000006f00 *0000200000006f0000007400000068000000650000007200000020000000730000007400000075 *000000660000006600000020000000610000007300000020000000720000006f0000006f000000 *7400000020000000680000006500000072000000650000000a0102360000002000000020000000 *200000002000000020000000670000006500000074000000550000007300000065000000720000 *00450000006e000000740000007200000079000000460000006f000000720000004e0000006100 *00006d00000065000000200000002200000077000000770000007700000022000000200000003e *0000003e0000003d00000020000000730000006500000074000000550000007300000065000000 *720000004900000044000000200000002e00000020000000750000007300000065000000720000 *0049000000440000000a01023100000020000000200000002000000020000000200000002d0000 *002d0000002000000066000000690000006e000000610000006c0000006c000000790000002000 *000073000000740000006100000072000000740000002000000068000000610000006e00000064 *0000006c000000690000006e0000006700000020000000690000006e000000630000006f000000 *6d000000690000006e000000670000002000000072000000650000007100000075000000650000 *007300000074000000730000000a023b0000002000000020000000200000002000000020000000 *740000006900000064000000200000003c0000002d00000020000000660000006f000000720000 *006b000000490000004f00000020000000240000002000000073000000690000006d0000007000 *00006c000000650000004800000054000000540000005000000057000000690000007400000068 *000000530000006f000000630000006b000000650000007400000020000000730000006f000000 *630000006b000000650000007400000020000000630000006f0000006e00000066000000200000 *00690000006d000000700000006c0000000a030102080000004e0000006f000000740000006500 *00003a000000200000004900000074010201000000270102410000007300000020000000690000 *006d000000700000006f0000007200000074000000610000006e00000074000000200000007400 *00006f000000200000007500000073000000650000002000000074000000680000006500000020 *00000073000000610000006d0000006500000020000000630000006f0000006e00000066000000 *20000000280000006f00000072000000200000006100000074000000200000006c000000650000 *006100000073000000740000002000000074000000680000006500000020000000730000006100 *00006d0000006500000020000000700000006f0000007200000074000000290000002000000066 *0000006f000000720000000a01020100000020010401000000f501020500000020000000610000 *006e0000006400000020010401000000f302020000002e0000000a00000000f401030102050000 *004c000000690000006b0000006500000020010401000000f10210000000200000007700000069 *0000007400000068000000200000006100000020000000730000006f000000630000006b000000 *65000000740000002e0000000a00000000f5010301022400000042000000690000006e00000064 *00000020000000700000006f000000720000007400000020000000610000006e00000064000000 *2000000072000000650000007400000075000000720000006e0000002000000074000000680000 *006500000020000000730000006f000000630000006b0000006500000074000000200000006600 *00006f0000007200000020010401000000f30102070000002e0000002000000054000000680000 *0069000000730000000a0102460000002000000066000000750000006e00000063000000740000 *00690000006f0000006e00000020000000610000006c0000007700000061000000790000007300 *00002000000062000000690000006e000000640000007300000020000000740000006f00000020 *0000004900000050000000760000003400000020000000700000006f0000007200000074000000 *7300000020000000750000006e00000074000000690000006c000000200000004e000000650000 *0074000000770000006f000000720000006b000000200000006d0000006f000000640000007500 *00006c000000650000002000000069000000730000002000000066000000690000007800000065 *0000006400000020000000740000006f0000000a02210000002000000073000000750000007000 *0000700000006f0000007200000074000000200000004900000050000000760000003600000020 *000000690000006e000000200000006100000020000000700000006f0000007200000074000000 *61000000620000006c00000065000000200000007700000061000000790000002e0000000a0000 *0000f601010301021e0000006c0000006f000000770000002d0000006c00000065000000760000 *00650000006c0000002000000066000000750000006e0000006300000074000000690000006f00 *00006e00000020000000740000006f000000200000006200000075000000690000006c00000064 *000000200000006100000020010402000000680000006301021b00000020000000660000007200 *00006f0000006d000000200000006100000020000000630000006f0000006e0000007400000065 *0000006e000000740000002d000000740000007900000070000000650000002000000061000000 *6e0000006400000020000000610000000a0102010000002001020a000000420000007900000074 *00000065000000530000007400000072000000690000006e0000006702010000000a0301020a00 *000043000000720000006500000061000000740000006500000073000000200000006100000020 *010402000000680000006301021c00000020000000690000006e00000020000000610000002000 *00006d000000610000006e0000006e00000065000000720000002000000073000000690000006d *000000690000006c000000610000007200000020000000740000006f0000002000000074000000 *680000006500000020010401000000c101020800000020000000630000006c0000006100000073 *000000730000002c0000000a023100000020000000620000007500000074000000200000007700 *0000690000007400000068000000200000006f0000007500000074000000200000007200000065 *00000071000000750000006900000072000000690000006e000000670000002000000061000000 *6e00000020000000690000006e0000007300000074000000610000006e00000063000000650000 *00200000006400000065000000630000006c000000610000007200000061000000740000006900 *00006f0000006e0000002e0000000a02000000000000000003020d000000630000006f0000006e *00000074000000650000006e000000740000002d00000074000000790000007000000065000000 *0a000000000000000103020e000000720000006500000073000000700000006f0000006e000000 *730000006500000020000000620000006f00000064000000790000000a000000f7010301040100 *0000f7010216000000200000007400000075000000720000006e00000073000000200000007900 *00006f000000750000007200000020000000610000007200000062000000690000007400000072 *00000061000000720000007900000020010702030000006d000000200000006101021500000020 *000000610000006e0000006400000020000000630000006f0000006e0000007600000065000000 *72000000740000007300000020000000690000007400000020000000740000006f0000006f0000 *000a01020300000020000000610000002001070102020000006d00000020040200000068000000 *63010206000000200000007700000069000000740000006800000020010401000000c402020000 *002e0000000a00000000f801030102270000005400000068000000690000007300000020000000 *6900000073000000200000006b000000690000006e0000006400000061000000200000006c0000 *00690000006b000000650000002000000061000000200000007600000065000000720000007900 *0000200000006f00000064000000640000006c0000007900000020000000730000006800000061 *00000070000000650000006400000020010401000000e5010204000000200000006f0000007200 *000020010401000000eb0102010000000a022e00000020000000590000006f0000007500000020 *00000070000000720000006f0000006200000061000000620000006c0000007900000020000000 *77000000610000006e00000074000000200000006f0000006e00000065000000200000006f0000 *007200000020000000740000006800000065000000200000006f00000074000000680000006500 *000072000000200000006f000000660000002000000074000000680000006f0000007300000065 *0000002e0000000a00000000f90103022100000047000000650000007400000020000000610000 *0020000000680000006500000061000000640000006500000072000000200000006f0000007500 *000074000000200000006f00000066000000200000007400000068000000650000002000000072 *0000006500000071000000750000006500000073000000740000002e0000000a00000000fa0103 *01021f000000410000006400000064000000200000006800000065000000610000006400000065 *000000720000007300000020000000690000006e000000740000006f0000002000000074000000 *680000006500000020000000720000006500000073000000700000006f0000006e000000730000 *00650000002e0000000a0102390000002000000020000000200000005400000068000000690000 *0073000000200000006d0000006500000074000000680000006f00000064000000200000006400 *00006f0000006500000073000000200000006e0000006f00000074000000200000006f00000076 *000000650000007200000077000000720000006900000074000000650000002000000061000000 *6e00000079000000200000006500000078000000690000007300000074000000690000006e0000 *006700000020000000680000006500000061000000640000006500000072000000200000006f00 *0000660000000a0102210000002000000020000000200000007400000068000000650000002000 *000073000000610000006d00000065000000200000006e000000610000006d000000650000002c *0000002000000068000000650000006e0000006300000065000000200000007400000068000000 *65000000200000006e000000610000006d0000006500000020010401000000fa01020a0000002e *0000002000000020000000490000006600000020000000790000006f000000750000000a010220 *00000020000000200000002000000077000000610000006e000000740000002000000074000000 *6f000000200000007200000065000000700000006c000000610000006300000065000000200000 *006100000020000000680000006500000061000000640000006500000072000000200000007500 *0000730000006500000020010401000000fb02020000002e0000000a00000000fb010301023300 *000053000000650000007400000020000000610000002000000068000000650000006100000064 *000000650000007200000020000000690000006e000000740000006f0000002000000074000000 *680000006500000020000000720000006500000073000000700000006f0000006e000000730000 *00650000002e000000200000002000000054000000680000006900000073000000200000007700 *0000690000006c0000006c000000200000007200000065000000700000006c0000006100000063 *000000650000000a01022b00000020000000610000006e00000020000000650000007800000069 *0000007300000074000000690000006e0000006700000020000000680000006500000061000000 *640000006500000072000000200000006f00000066000000200000007400000068000000650000 *002000000073000000610000006d00000065000000200000006e000000610000006d0000006500 *00002e000000200000002000000055000000730000006500000020010401000000fa0102080000 *0020000000690000006600000020000000790000006f000000750000000a023400000020000000 *77000000610000006e0000007400000020000000740000006f0000002000000061000000640000 *0064000000200000006d0000006f00000072000000650000002000000074000000680000006100 *00006e000000200000006f0000006e000000650000002000000068000000650000006100000064 *0000006500000072000000200000006f0000006600000020000000740000006800000065000000 *2000000073000000610000006d00000065000000200000006e000000610000006d000000650000 *002e0000000a00000000fc01030232000000470000007500000061000000720000006400000020 *0000007500000073000000690000006e0000006700000020000000610000006e00000020000000 *610000007200000062000000690000007400000072000000610000007200000079000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000006f00 *00006e000000200000007400000068000000650000002000000072000000650000007100000075 *0000006500000073000000740000002e0000000a00000000fd010301023c000000470000007500 *000061000000720000006400000020000000610000006700000061000000690000006e00000073 *0000007400000020000000740000006800000065000000200000006d0000006500000074000000 *680000006f000000640000002e0000002000000054000000680000006900000073000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000006100 *00006c000000730000006f00000020000000670000007500000061000000720000006400000073 *00000020000000610000006700000061000000690000006e00000073000000740000000a010222 *00000020000000610000006e000000790000002000000072000000650000006d00000061000000 *690000006e000000690000006e0000006700000020000000700000006100000074000000680000 *00200000007300000065000000670000006d000000650000006e00000074000000730000002e00 *00002000000053000000650000006500000020010401000000fe01021100000020000000660000 *006f00000072000000200000007400000068000000650000002000000076000000650000007200 *000073000000690000006f0000006e0000000a021c000000200000007400000068000000610000 *007400000020000000670000007500000061000000720000006400000073000000200000006f00 *00006e0000006c00000079000000200000006200000079000000200000006d0000006500000074 *000000680000006f000000640000000a00000000fe010301022e00000047000000750000006100 *0000720000006400000020000000610000006700000061000000690000006e0000007300000074 *00000020000000740000006800000065000000200000006d000000650000007400000068000000 *6f00000064000000200000006f0000006e0000006c000000790000002e00000020000000280000 *006100000073000000200000006f00000070000000700000006f00000073000000650000006400 *000020000000740000006f00000020010401000000fd0202000000290000000a00000000ff0103 *010246000000470000007500000061000000720000006400000020000000610000006700000061 *000000690000006e00000073000000740000002000000074000000680000006500000020000000 *6d0000006500000074000000680000006f000000640000002e000000200000004e0000006f0000 *0074000000650000002c0000002000000074000000680000006900000073000000200000006600 *0000750000006e0000006300000074000000690000006f0000006e00000020000000610000006c *000000730000006f00000020000000670000007500000061000000720000006400000073000000 *20000000610000006700000061000000690000006e000000730000007400000020000000610000 *006e000000790000000a021c00000020000000200000002000000072000000650000006d000000 *61000000690000006e000000690000006e00000067000000200000007000000061000000740000 *0068000000200000007300000065000000670000006d000000650000006e000000740000007300 *00002e0000000a0000000100010301024600000047000000750000006100000072000000640000 *0020000000610000006700000061000000690000006e0000007300000074000000200000007400 *00006800000065000000200000006d0000006500000074000000680000006f000000640000002e *000000200000004e0000006f00000074000000650000002c000000200000007400000068000000 *69000000730000002000000066000000750000006e0000006300000074000000690000006f0000 *006e00000020000000610000006c000000730000006f0000002000000067000000750000006100 *000072000000640000007300000020000000610000006700000061000000690000006e00000073 *0000007400000020000000610000006e000000790000000a01024a000000200000007200000065 *0000006d00000061000000690000006e000000690000006e000000670000002000000070000000 *610000007400000068000000200000007300000065000000670000006d000000650000006e0000 *0074000000730000002e0000002000000020000000540000006800000069000000730000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000002000000069 *000000730000002000000064000000650000007000000072000000650000006300000061000000 *7400000065000000640000002e0000002000000020000000590000006f00000075000000200000 *0063000000610000006e0000002000000070000000720000006f00000062000000610000006200 *00006c000000790000000a0225000000200000006a000000750000007300000074000000200000 *00750000007300000065000000200000006d0000006500000074000000680000006f0000006400 *0000530000005000000020000000280000006f00000072000000200000006d0000006500000074 *000000680000006f000000640000004d00000029000000200000006e0000006f00000077000000 *2e0000000a00000001010103023100000047000000750000006100000072000000640000002000 *0000610000006700000061000000690000006e0000007300000074000000200000006e0000006f *0000006e0000002d000000650000006d0000007000000074000000790000002000000072000000 *650000006d00000061000000690000006e000000690000006e0000006700000020000000700000 *00610000007400000068000000200000007300000065000000670000006d000000650000006e00 *000074000000730000002e0000000a000000010201010301021f000000500000006f0000007000 *00002000000061000000200000007000000061000000740000006800000020000000650000006c *000000650000006d000000650000006e0000007400000020000000610000006e00000064000000 *2000000072000000750000006e0000002000000074000000680000006500000020010402000000 *df000000de0221000000200000006900000066000000200000006900000074000000200000006d *000000610000007400000063000000680000006500000073000000200000007400000068000000 *6500000020000000670000006900000076000000650000006e0000002000000073000000740000 *0072000000690000006e000000670000002e0000000a0301022100000054000000680000006500 *0000200000007000000061000000740000006800000020000000650000006c000000650000006d *000000650000006e000000740000002000000063000000610000006e000000200000006e000000 *6f0000007400000020000000630000006f0000006e0000007400000061000000690000006e0000 *0020010201000000270102010000002f0102010000002701020b0000002e000000200000005300 *0000650000006500000020000000610000006c000000730000006f000000200104010000010302 *020000002e0000000a000000010301010301021000000047000000750000006100000072000000 *6400000020000000610000006700000061000000690000006e0000007300000074000000200000 *006100000020010401000002b40102090000002e00000020000000550000006e0000006c000000 *690000006b00000065000000200104010000010201020500000020000000740000006800000065 *00000020010401000002b4010205000000200000006d00000061000000790000000a0102090000 *0020000000630000006f0000006e0000007400000061000000690000006e000000200102010000 *00270102010000002f010201000000270102360000002e00000020000000490000006600000020 *000000740000006800000065000000200000006700000075000000610000007200000064000000 *2000000073000000750000006300000063000000650000006500000064000000730000002c0000 *0020000000740000006800000065000000200000006d0000006100000074000000630000006800 *0000650000006400000020000000650000006c000000650000006d000000650000006e00000074 *000000730000002000000077000000690000006c0000006c000000200000006200000065000000 *0a022200000020000000700000006f000000700000007000000065000000640000002000000066 *000000720000006f0000006d000000200000007400000068000000650000002000000064000000 *69000000720000006500000063000000740000006f000000720000007900000020000000730000 *007400000061000000630000006b0000002e0000000a0107021600000020000000640000006900 *000072000000730000002000000022000000660000006f0000006f0000002f0000006200000061 *00000072000000220000002000000024000000200000002e0000002e0000002e0000000a030102 *0a00000053000000650000006500000020000000610000006c000000730000006f0000003a0000 *00200104010000010202020000002e0000000a0000000104010302180000004700000075000000 *61000000720000006400000020000000610000006700000061000000690000006e000000730000 *00740000002000000074000000680000006500000020000000680000006f000000730000007400 *00002e0000000a0000000105010302330000004c0000006f0000006f0000006b00000075000000 *700000002000000074000000680000006500000020000000680000006f00000073000000740000 *002000000068000000650000006100000064000000650000007200000020000000610000006e00 *000064000000200000007000000061000000730000007300000020000000690000007400000020 *000000740000006f00000020000000740000006800000065000000200000006800000061000000 *6e000000640000006c00000065000000720000002e0000000a0000000106010301022a00000050 *0000006f0000007000000020000000610000002000000070000000610000007400000068000000 *20000000650000006c000000650000006d000000650000006e0000007400000020000000610000 *006e00000064000000200000007000000061000000720000007300000065000000200000006900 *000074000000200000007500000073000000690000006e00000067000000200000007400000068 *0000006500000020010401000000c901020800000020000000690000006e000000200000007400 *0000680000006500000020010401000000c8020800000020000000630000006c00000061000000 *73000000730000002e0000000a0000000107010302470000004700000072000000610000006200 *000020000000740000006800000065000000200000007200000065000000730000007400000020 *0000006f0000006600000020000000740000006800000065000000200000005500000052000000 *4c000000200000002800000064000000690000007200000073000000200000002b000000200000 *0071000000750000006500000072000000790000002900000020000000610000006e0000006400 *000020000000700000006100000073000000730000006500000073000000200000006900000074 *00000020000000740000006f00000020000000790000006f000000750000007200000020000000 *68000000610000006e000000640000006c00000065000000720000002e0000000a000000010801 *0301022f000000500000006f0000007000000020000000610000006e0000007900000020000000 *7000000061000000740000006800000020000000650000006c000000650000006d000000650000 *006e0000007400000020000000610000006e000000640000002000000069000000670000006e00 *00006f0000007200000065000000200000007700000068000000650000006e0000002000000063 *000000680000006f00000073000000690000006e00000067000000200000006100000020010402 *000000df000000de01020400000020000000740000006f0000000a021500000020000000680000 *00610000006e000000640000006c00000065000000200000007400000068000000650000002000 *0000720000006500000071000000750000006500000073000000740000002e0000000a00000001 *090103010210000000440000006500000070000000720000006500000063000000610000007400 *000065000000640000003a00000020000000750000007300000065000000200104010000010802 *020000002e0000000a000000010a01030102300000004700000075000000610000007200000064 *000000200000007700000068000000690000006300000068000000200000006300000068000000 *65000000630000006b000000730000002000000074000000680000006100000074000000200000 *007400000068000000650000002000000052000000650000007100000075000000650000007300 *0000740000002000000055000000520000004900000020000000650000006e0000006400000073 *00000020000000690000006e00000020010201000000270102010000002f010201000000270102 *030000002e000000200000000a0102230000002000000055000000730000006500000066000000 *750000006c00000020000000660000006f00000072000000200000006400000069000000730000 *0074000000690000006e0000006700000075000000690000007300000068000000690000006e00 *000067000000200000006200000065000000740000007700000065000000650000006e00000020 *01070203000000660000006f0000006f01020500000020000000610000006e0000006400000020 *0107010203000000660000006f0000006f02010000002f02010000000a000000010b0101030102 *1a000000500000006100000072000000730000006500000020000000790000006f000000750000 *007200000020000000720000006500000071000000750000006500000073000000740000002000 *000077000000690000007400000068000000200000006100000020010401000000c70102180000 *002000000028000000610000002000000052000000650000006100000064000000650000007200 *0000540000002c000000200000006200000061000000730000006900000063000000610000006c *0000006c00000079000000290000000a01021e00000020000000460000006f0000007200000020 *0000006500000078000000610000006d000000700000006c000000650000002000000068000000 *650000007200000065000000200000006900000073000000200000006100000020000000730000 *00690000006d000000700000006c00000065000000200107020300000047000000450000005401 *0204000000200000006f000000720000002001070204000000500000004f000000530000005401 *021f000000200000007600000061000000720000006900000061000000620000006c0000006500 *000020000000620000006100000073000000650000006400000020000000610000007500000074 *00000068000000650000006e000000740000006900000063000000610000007400000069000000 *6f0000006e0000000a010225000000200000006700000075000000610000007200000064000000 *2e000000200000002000000049000000740000002000000068000000610000006e000000640000 *006c00000065000000730000002000000074000000680000006500000020000000720000006500 *000071000000750000006500000073000000740000002000000077000000690000007400000068 *0000002001020c0000006500000072000000720000006f0000007200000048000000610000006e *000000640000006c0000006500000072021a000000200000006900000066000000200000006100 *0000750000007400000068000000650000006e0000007400000069000000630000006100000074 *000000690000006f0000006e000000200000006600000061000000690000006c00000073000000 *2e0000000a0701020f000000200000006d00000079000000520000007100000044000000610000 *007400000061000000200000003d00000020000000640000006f0000000a010226000000200000 *0020000000200000002000000020000000750000007300000065000000720000006e0000006100 *00006d00000065000000200000003c0000002d000000200000006c0000006f0000006f0000006b *000000490000006e00000070000000750000007400000020000000220000007500000073000000 *65000000720000006e000000610000006d00000065000000220000000a01022600000020000000 *2000000020000000200000002000000070000000610000007300000073000000770000006f0000 *007200000064000000200000003c0000002d000000200000006c0000006f0000006f0000006b00 *0000490000006e0000007000000075000000740000002000000022000000700000006100000073 *00000073000000770000006f0000007200000064000000220000000a0102210000002000000020 *00000020000000200000002000000072000000650000007400000075000000720000006e000000 *2000000028000000750000007300000065000000720000006e000000610000006d000000650000 *002c0000002000000070000000610000007300000073000000770000006f000000720000006400 *0000290000000a01021d00000020000000630000006800000065000000630000006b0000004100 *0000750000007400000068000000200000006500000072000000720000006f0000007200000048 *000000610000006e000000640000006c0000006500000072000000200000003d00000020000000 *640000006f0000000a01021c000000200000002000000020000000200000002000000064000000 *200000003c0000002d000000200000006700000065000000740000004400000061000000740000 *0061000000200000006d0000007900000052000000710000004400000061000000740000006100 *0000410000000a01020f0000002000000020000000200000002000000020000000630000006100 *000073000000650000002000000064000000200000006f000000660000000a0102210000002000 *000020000000200000002000000020000000200000002000000020000000200000004e0000006f *0000007400000068000000690000006e00000067000000200000002d0000003e00000020000000 *6500000072000000720000006f0000007200000048000000610000006e000000640000006c0000 *0065000000720000000a0102250000002000000020000000200000002000000020000000200000 *002000000020000000200000004a00000075000000730000007400000020000000610000002000 *00007c00000020000000690000007300000056000000610000006c000000690000006400000020 *00000061000000200000002d0000003e000000200000006d0000007a0000006500000072000000 *6f0000000a022c0000002000000020000000200000002000000020000000200000002000000020 *000000200000004a0000007500000073000000740000002000000061000000200000007c000000 *200000006f00000074000000680000006500000072000000770000006900000073000000650000 *00200000002d0000003e000000200000006500000072000000720000006f000000720000004800 *0000610000006e000000640000006c00000065000000720000000a000000010c01010301020e00 *0000410000006e0000002000000076000000610000007200000069000000610000006e00000074 *000000200000006f00000066000000200104010000010c01020b00000020000000740000006800 *00006100000074000000200000007500000073000000650000007300000020010401000000c501 *020f00000020000000740000006f0000002000000063000000680000006f000000730000006500 *000020000000790000006f00000075000000720000000a01020100000020010401000000c70102 *1c00000020000000660000006f0000007200000020000000790000006f000000750000002e0000 *002000000020000000540000006800000065000000200000006500000078000000610000006d00 *0000700000006c000000650000002000000066000000720000006f0000006d0000002001040100 *00010c020a000000200000006200000065000000630000006f0000006d00000065000000730000 *003a0000000a0701021000000020000000200000006d0000007900000052000000710000004400 *0000610000007400000061000000200000003d00000020000000640000006f0000000a01022600 *00002000000020000000200000002000000020000000750000007300000065000000720000006e *000000610000006d00000065000000200000003c0000002d000000200000006c0000006f000000 *6f0000006b000000490000006e0000007000000075000000740000002000000022000000750000 *007300000065000000720000006e000000610000006d00000065000000220000000a0102260000 *002000000020000000200000002000000020000000700000006100000073000000730000007700 *00006f0000007200000064000000200000003c0000002d000000200000006c0000006f0000006f *0000006b000000490000006e000000700000007500000074000000200000002200000070000000 *610000007300000073000000770000006f0000007200000064000000220000000a010221000000 *200000002000000020000000200000002000000072000000650000007400000075000000720000 *006e0000002000000028000000750000007300000065000000720000006e000000610000006d00 *0000650000002c0000002000000070000000610000007300000073000000770000006f00000072 *00000064000000290000000a01022a0000002000000020000000690000006e0000007300000074 *000000610000006e00000063000000650000002000000046000000720000006f0000006d000000 *440000006100000074000000610000002000000028000000530000007400000072000000690000 *006e000000670000002c000000530000007400000072000000690000006e000000670000002900 *00002000000077000000680000006500000072000000650000000a010219000000200000002000 *000020000000200000002000000066000000720000006f0000006d000000440000006100000074 *00000061000000200000003d000000200000006d00000079000000520000007100000044000000 *6100000074000000610000000a01021e0000002000000020000000630000006800000065000000 *630000006b00000041000000750000007400000068000000200000006500000072000000720000 *006f0000007200000048000000610000006e000000640000006c00000065000000720000002000 *00003d00000020000000640000006f0000000a0102130000002000000020000000200000002000 *00002000000064000000200000003c0000002d0000002000000067000000650000007400000044 *000000610000007400000061000000270000000a01020f00000020000000200000002000000020 *00000020000000630000006100000073000000650000002000000064000000200000006f000000 *660000000a01022100000020000000200000002000000020000000200000002000000020000000 *20000000200000004e0000006f0000007400000068000000690000006e00000067000000200000 *002d0000003e000000200000006500000072000000720000006f00000072000000480000006100 *00006e000000640000006c00000065000000720000000a01022500000020000000200000002000 *00002000000020000000200000002000000020000000200000004a000000750000007300000074 *0000002000000061000000200000007c0000002000000069000000730000005600000061000000 *6c00000069000000640000002000000061000000200000002d0000003e000000200000006d0000 *007a00000065000000720000006f0000000a022c00000020000000200000002000000020000000 *20000000200000002000000020000000200000004a000000750000007300000074000000200000 *0061000000200000007c000000200000006f000000740000006800000065000000720000007700 *0000690000007300000065000000200000002d0000003e00000020000000650000007200000072 *0000006f0000007200000048000000610000006e000000640000006c0000006500000072000000 *0a000000010d010302330000005200000065000000740000007200000069000000650000007600 *00006500000020000000640000006100000074000000610000002000000066000000720000006f *0000006d0000002000000074000000680000006500000020000000690000006e00000070000000 *7500000074000000200000007100000075000000650000007200000079000000200000006f0000 *00720000002000000074000000680000006500000020000000630000006f0000006f0000006b00 *00006900000065000000730000002e0000000a000000010e01030104010000010e010209000000 *200000006900000073000000200000006c000000690000006b0000006500000020010401000001 *0d0102140000002c0000002000000062000000750000007400000020000000790000006f000000 *75000000200000007000000061000000730000007300000020000000690000006e000000200000 *006100000020010401000000c7010207000000200000006d0000006f0000006e00000061000000 *640000000a020e00000020000000660000006f0000007200000020000000720000006500000061 *00000064000000690000006e000000670000002e0000000a000000010f0101030104010000010f *01021100000020000000690000007300000020000000660000006f000000720000002000000063 *00000072000000650000006100000074000000690000006e0000006700000020010402000000df *000000de01020e0000007300000020000000740000006800000061000000740000002000000070 *000000720000006f00000078000000790000002e0000000a010213000000200000005400000068 *0000006500000020000000730000006f0000006c00000065000000200000006100000072000000 *67000000750000006d000000650000006e000000740000002001070102070000005b0000005300 *00007400000072000000690000006e0000006702010000005d0102220000002000000069000000 *730000002000000061000000200000006c000000690000007300000074000000200000006f0000 *006600000020000000610000006c0000006c0000006f0000007700000065000000640000002000 *0000640000006f0000006d00000061000000690000006e0000007300000020000000660000006f *000000720000000a0102380000002000000070000000720000006f000000780000007900000069 *0000006e000000670000002e000000200000002000000054000000680000006900000073000000 *200000006d00000061000000740000006300000068000000650000007300000020000000740000 *00680000006500000020000000640000006f0000006d00000061000000690000006e0000002000 *000070000000610000007200000074000000200000006f00000066000000200000007400000068 *000000650000002000000072000000650000007100000075000000650000007300000074000000 *0a022600000020000000610000006e000000640000002000000074000000680000006500000020 *00000077000000690000006c000000640000006300000061000000720000006400000020000000 *2a0000002000000063000000610000006e00000020000000620000006500000020000000750000 *007300000065000000640000002e00000020000000450000002e000000670000002e0000000a01 *08030301020100000020010201000000220102010000002a010201000000220214000000200000 *00740000006f000000200000006d00000061000000740000006300000068000000200000006100 *00006e000000790000007400000068000000690000006e000000670000002e0000000a03010201 *000000200102010000002201020d0000002a0000002e0000006500000078000000610000006d00 *0000700000006c000000650000002e000000630000006f0000006d010201000000220225000000 *20000000740000006f000000200000006d00000061000000740000006300000068000000200000 *00610000006e000000790000007400000068000000690000006e00000067000000200000007500 *00006e000000640000006500000072000000200000006500000078000000610000006d00000070 *0000006c000000650000002e000000630000006f0000006d0000000a0301020100000020010201 *0000002201020b0000006500000078000000610000006d000000700000006c000000650000002e *000000630000006f0000006d01020100000022021b00000020000000740000006f000000200000 *006d00000061000000740000006300000068000000200000006a00000075000000730000007400 *0000200000006500000078000000610000006d000000700000006c000000650000002e00000063 *0000006f0000006d0000000a03010241000000540000004f000000440000004f0000003a000000 *20000000610000006e0000006e0000006f00000079000000690000006e000000670000006c0000 *007900000020000000650000006e0000006f0000007500000067000000680000002c0000002000 *000074000000680000006900000073000000200000006d0000006500000074000000680000006f *00000064000000200000006500000076000000650000006e000000740000007500000061000000 *6c0000006c000000790000002000000063000000610000006c0000006c00000073000000200000 *006500000073000000630000006100000070000000650000002c00000020000000730000006f00 *00000a0102190000002000000020000000610000006e0000007900000020000000680000006500 *0000610000006400000065000000720000007300000020000000790000006f0000007500000020 *00000073000000650000007400000020000000770000006f0000006e0102010000002702300000 *007400000020000000620000006500000020000000750000007300000065000000640000002c00 *000020000000610000006e00000064000000200000007400000068000000650000002000000063 *0000006f0000006d0000007000000075000000740000006100000074000000690000006f000000 *6e00000020000000690000006d0000006d00000065000000640000006900000061000000740000 *006c0000007900000020000000650000006e00000064000000730000002e0000000a00000002b5 *01010301020e00000054000000610000006b000000650000007300000020000000610000002000 *000070000000720000006f000000780000007900000020010402000000580000005701020f0000 *0020000000610000006e0000006400000020000000630000007200000065000000610000007400 *0000650000007300000020000000610000002001040200000068000000630102140000002e0000 *002000000020000000590000006f00000075000000720000002000000062000000610000007300 *000069000000630000002000000070000000720000006f00000078000000790000000a01021600 *0000200000006200000075000000690000006c00000064000000690000006e0000006700000020 *000000620000006c0000006f000000630000006b0000002e000000200000002000000053000000 *650000006500000020010401000000b302020000002e0000000a0301022a000000540000004f00 *0000440000004f0000003a00000020000000740000006800000069000000730000002000000077 *0000006f000000750000006c00000064000000200000006200000065000000200000006d000000 *6f00000072000000650000002000000075000000730000006500000066000000750000006c0000 *002000000069000000660000002000000069000000740000002000000064000000690000006400 *00006e01020100000027010207000000740000002000000063000000610000006c0000006c0000 *0020010401000000ed0102120000002000000028000000650000002e000000670000002e000000 *200000006900000074000000200000006c000000650000007400000020000000790000006f0000 *00750000000a023c000000200000006d0000006f00000064000000690000006600000079000000 *2000000074000000680000006500000020000000720000006500000073000000700000006f0000 *006e00000073000000650000002000000061000000660000007400000065000000720000007700 *0000610000007200000064000000730000002c000000200000006f000000720000002000000073 *000000650000007400000020000000610000006400000064000000690000007400000069000000 *6f0000006e000000610000006c0000002000000068000000650000006100000064000000650000 *007200000073000000290000000a00000001100101030102280000005400000068000000690000 *007300000020000000690000007300000020000000610000002000000072000000650000007600 *0000650000007200000073000000650000002000000070000000720000006f0000007800000079 *00000020000000690000006d000000700000006c000000650000006d000000650000006e000000 *740000006100000074000000690000006f0000006e0000002e0000000a01020500000020000000 *53000000650000006500000020010401000000b402020000002e0000000a0301022a0000005400 *00004f000000440000004f0000003a000000200000007400000068000000690000007300000020 *000000770000006f000000750000006c0000006400000020000000620000006500000020000000 *6d0000006f00000072000000650000002000000075000000730000006500000066000000750000 *006c00000020000000690000006600000020000000690000007400000020000000640000006900 *0000640000006e01020100000027010207000000740000002000000063000000610000006c0000 *006c00000020010401000000ed01020c0000002c000000200000006a0000007500000073000000 *74000000200000006c000000690000006b000000650000000a01020b0000002000000070000000 *720000006f00000078000000790000005300000065000000720000007600000065010201000000 *2702020000002e0000000a03000000000000000003020c00000064000000650000006600000061 *000000750000006c00000074000000480000006f00000073000000740000000a00000000000000 *010302390000006d000000610000007000000020000000740000006f000000200000006c000000 *6f0000006f0000006b00000020000000750000007000000020000000680000006f000000730000 *00740000006e000000610000006d00000065000000200000006d00000061000000700000007000 *0000690000006e00000067000000730000002e0000002000000020000000460000006f00000072 *000000200000007400000068000000650000002000000072000000650000007600000065000000 *7200000073000000650000002000000070000000720000006f00000078000000790000000a0000 *00000000000203023d000000740000006800000065000000200000007200000065000000730000 *00750000006c000000740000002000000069000000730000002000000061000000200000005300 *000065000000720000007600000065000000720000005000000061000000720000007400000054 *00000020000000740000006800000061000000740000002000000077000000690000006c000000 *6c0000002000000072000000650000007600000065000000720000007300000065000000200000 *0070000000720000006f000000780000007900000020000000660000006f000000720000002000 *0000790000006f000000750000002e0000000a0000011101030102240000005200000075000000 *6e00000020000000610000006e00000020000000490000004f0000002000000061000000630000 *0074000000690000006f0000006e00000020000000610000006e000000640000002c0000002000 *000069000000660000002000000069000000740000002000000072000000650000007400000075 *000000720000006e0000007300000020010702040000004a000000750000007300000074022200 *00002c000000200000007000000061000000730000007300000020000000690000007400000020 *000000740000006f00000020000000740000006800000065000000200000007300000065000000 *630000006f0000006e0000006400000020000000610000007200000067000000750000006d0000 *00650000006e000000740000002e0000000a00000001120103023d000000410000002000000076 *000000610000007200000069000000610000006e00000074000000200000006f00000066000000 *200000007200000065000000710000007500000069000000720000006500000020000000740000 *006800000061000000740000002000000063000000610000006e00000020000000720000007500 *00006e00000020000000690000006e00000020000000610000006e00000079000000200000006d *0000006f0000006e00000061000000640000002c000000200000006e0000006f00000074000000 *200000006a00000075000000730000007400000020000000490000004f0000002e0000000a0000 *00011301030102040000005500000073000000650000002001070203000000630000006d000000 *6401021a00000020000000740000006f000000200000007400000072000000610000006e000000 *73000000660000006f000000720000006d00000020000000580000004d0000004c000000200000 *00610000006700000061000000690000006e000000730000007400000020010702070000007800 *0000730000006c000000500000006100000074000000680102020000002e0000000a0102320000 *002000000020000000200000005400000068000000690000007300000020000000660000007500 *00006e0000006300000074000000690000006f0000006e000000200000006f0000006e0000006c *000000790000002000000061000000630000007400000073000000200000006900000066000000 *2000000074000000680000006500000020000000630000006f0000006e00000074000000650000 *006e000000740000002d0000007400000079000000700000006500000020000000690000007300 *000020010701020b0000006100000070000000700000006c000000690000006300000061000000 *74000000690000006f0000006e0102010000002f0203000000780000006d0000006c0202000000 *2e0000000a0300000000000000000301021b00000058000000530000004c000000540000002000 *000070000000720000006500000070000000720000006f00000063000000650000007300000073 *0000006f000000720000002e00000020000000550000007300000075000000610000006c000000 *6c000000790000002001020800000078000000730000006c000000740000007000000072000000 *6f00000063010204000000200000006f0000007200000020010205000000730000006100000078 *0000006f0000006e02020000002e0000000a000000000000000103021900000050000000610000 *00740000006800000020000000740000006f0000002000000078000000730000006c0000007400 *0000200000007300000074000000790000006c0000006500000073000000680000006500000065 *000000740000002e0000000a000000000000000203010209000000410000006600000066000000 *6500000063000000740000006500000064000000200107020b0000005300000065000000720000 *00760000006500000072000000500000006100000072000000740000007302020000002e000000 *0a0000011400000000011501030102110000004400000065000000700000007200000065000000 *63000000610000007400000065000000640000003a000000200000002000000075000000730000 *006500000020010401000000d202020000002e0000000a00000001160103022600000053000000 *650000007400000020000000740000006800000065000000200000007200000065000000740000 *0075000000720000006e00000020000000630000006f0000006400000065000000200000006900 *00006e00000020000000790000006f000000750000007200000020000000720000006500000073 *000000700000006f0000006e00000073000000650000002e0000000a00000001170103022f0000 *004100000064000000640000002000000074000000680000006500000020000000630000006f00 *00006f0000006b0000006900000065000000200000007700000069000000740000006800000020 *000000610000002000000074000000690000006d000000650000006f0000007500000074000000 *20000000740000006f000000200000007400000068000000650000002000000072000000650000 *0073000000700000006f0000006e00000073000000650000002e0000000a000000011801030236 *00000041000000640000006400000020000000740000006800000065000000200000006c000000 *690000007300000074000000200000006f0000006600000020000000630000006f0000006f0000 *006b00000069000000650000002000000074000000690000006d000000650000006f0000007500 *00007400000020000000700000006100000069000000720000007300000020000000740000006f *000000200000007400000068000000650000002000000072000000650000007300000070000000 *6f0000006e00000073000000650000002e0000000a00000001190103021f000000450000007800 *000070000000690000007200000065000000200000007400000068000000650000002000000063 *0000006f0000006f0000006b000000690000006500000020000000690000006d0000006d000000 *6500000064000000690000006100000074000000650000006c000000790000002e0000000a0000 *00011a0103010209000000480000006f0000006e0000006f000000720000002000000061000000 *6e000000200107021100000069000000660000002d0000006d0000006f00000064000000690000 *00660000006900000065000000640000002d00000073000000690000006e000000630000006501 *020d00000020000000680000006500000061000000640000006500000072000000200000006900 *00006e00000020000000610000002001040200000058000000570102020000002e0000000a0102 *080000002000000049000000660000002000000074000000680000006500000020010402000000 *580000005701020e00000020000000690000006e000000630000006c0000007500000064000000 *650000007300000020000000740000006800000065000000200107021100000069000000660000 *002d0000006d0000006f0000006400000069000000660000006900000065000000640000002d00 *000073000000690000006e00000063000000650102100000002000000068000000650000006100 *000064000000650000007200000020000000610000006e00000064000000200000007400000068 *000000650000000a01020100000020010402000000680000006301023800000020000000680000 *006100000073000000200000006e0000006f000000740000002000000062000000650000006500 *00006e000000200000006d0000006f000000640000006900000066000000690000006500000064 *0000002c000000200000007400000068000000650000006e000000200000007200000065000000 *7400000075000000720000006e0000002000000033000000300000003400000020000000280000 *004e0000006f00000074000000200000004d0000006f0000006400000069000000660000006900 *00006500000064000000290000002c0000000a010216000000200000006f000000740000006800 *000065000000720000007700000069000000730000006500000020000000720000006500000074 *00000075000000720000006e000000200000007400000068000000650000002001040200000068 *0000006302020000002e0000000a030000000000000000030102380000006d0000006f00000064 *0000002d00000074000000690000006d0000006500000020000000660000006f00000072000000 *2000000074000000680000006500000020000000520000006500000073000000700000006f0000 *006e000000730000006500000020000000280000004d0000005500000053000000540000002000 *00004e0000004f00000054000000200000006200000065000000200000006c0000006100000074 *0000006500000072000000200000007400000068000000610000006e0000002000000073000000 *650000007200000076000000650000007201020100000027021f00000073000000200000007400 *0000690000006d00000065000000200000006f00000066000000200000006d0000006500000073 *00000073000000610000006700000065000000200000006f000000720000006900000067000000 *690000006e0000006100000074000000690000006f0000006e000000290000000a000000000000 *0001030237000000690000006e000000630000006f0000006d000000690000006e000000670000 *002000000072000000650000007100000075000000650000007300000074000000200000002800 *00007500000073000000650000006400000020000000740000006f000000200000006300000068 *00000065000000630000006b00000020000000660000006f000000720000002000000069000000 *660000002d0000006d0000006f0000006400000069000000660000006900000065000000640000 *002d00000073000000690000006e0000006300000065000000290000000a000000000000000203 *022c000000520000006500000073000000700000006f0000006e00000073000000650000002000 *0000740000006f0000002000000073000000650000006e00000064000000200000006900000066 *000000200000007400000068000000650000007200000065000000200000006100000072000000 *65000000200000006d0000006f0000006400000069000000660000006900000063000000610000 *0074000000690000006f0000006e000000730000000a000002b601030102080000005300000061 *0000006d0000006500000020000000610000007300000020010701040100000116021500000020 *000000730000007400000061000000740000007500000073000000200000003e0000003e000000 *2000000072000000650000007400000075000000720000006e0000002000000076000000610000 *006c02020000002e0000000a000000011b010301020d0000005200000065000000730000007000 *00006f0000006e0000006400000020000000770000006900000074000000680000002001070206 *000000320000003000000030000000200000004f0000004b02020000002e0000000a000000011c *010301020d000000520000006500000073000000700000006f0000006e00000064000000200000 *007700000069000000740000006800000020010702180000003500000030000000300000002000 *0000490000006e000000740000006500000072000000610000006c000000200000005300000065 *00000072000000760000006500000072000000200000004500000072000000720000006f000000 *7202020000002e0000000a000000011d010301020e000000520000006500000073000000700000 *006f0000006e000000640000007300000020000000770000006900000074000000680000002001 *07020f000000350000003000000032000000200000004200000061000000640000002000000047 *00000061000000740000006500000077000000610000007902020000002e0000000a000000011e *010301020d000000520000006500000073000000700000006f0000006e00000064000000200000 *0077000000690000007400000068000000200107020f0000003400000030000000300000002000 *000042000000610000006400000020000000520000006500000071000000750000006500000073 *0000007402020000002e0000000a000000011f010301020d000000520000006500000073000000 *700000006f0000006e000000640000002000000077000000690000007400000068000000200107 *021000000034000000300000003100000020000000550000006e00000061000000750000007400 *0000680000006f00000072000000690000007a000000650000006402020000002e0000000a0000 *000120010301020d000000520000006500000073000000700000006f0000006e00000064000000 *2000000077000000690000007400000068000000200107020d0000003400000030000000330000 *0020000000460000006f0000007200000062000000690000006400000064000000650000006e02 *020000002e0000000a0000000121010301020d000000520000006500000073000000700000006f *0000006e000000640000002000000077000000690000007400000068000000200107020d000000 *340000003000000034000000200000004e0000006f0000007400000020000000460000006f0000 *00750000006e0000006402020000002e0000000a0000000122010301020d000000520000006500 *000073000000700000006f0000006e000000640000002000000077000000690000007400000068 *000000200107020d00000033000000300000003300000020000000530000006500000065000000 *200000004f0000007400000068000000650000007202020000002e0000000a0000000123010301 *020d000000520000006500000073000000700000006f0000006e00000064000000200000007700 *000069000000740000006800000020010702090000003300000030000000320000002000000046 *0000006f000000750000006e0000006402020000002e0000000a0000000124010301020d000000 *520000006500000073000000700000006f0000006e000000640000002000000077000000690000 *0074000000680000002001070215000000330000003000000031000000200000004d0000006f00 *0000760000006500000064000000200000005000000065000000720000006d000000610000006e *000000650000006e000000740000006c0000007902020000002e0000000a000000012501030102 *0d000000520000006500000073000000700000006f0000006e0000006400000020000000770000 *006900000074000000680000002001070216000000330000003000000037000000200000005400 *0000650000006d000000700000006f000000720000006100000072000000790000002000000052 *0000006500000064000000690000007200000065000000630000007402020000002e0000000a00 *000001260103010210000000440000006500000070000000720000006500000063000000610000 *007400000065000000640000003a00000020000000750000007300000065000000200104010000 *02b302020000002e0000000a000000012701030102210000005700000068000000610000007400 *000020000000690000007300000020000000740000006800000069000000730000002000000066 *0000006f000000720000002c000000200000006500000078000000610000006300000074000000 *6c000000790000003f00000020000000200000004900000020000000640000006f0000006e0102 *01000000270102110000007400000020000000750000006e000000640000006500000072000000 *7300000074000000610000006e0000006400000020000000770000006800000079000000200107 *020600000053000000680000006f00000077000000200000006101021800000020000000690000 *0073000000200000006500000076000000650000006e00000020000000690000006e0000002000 *000074000000680000006500000020000000630000006f0000006e000000740000006500000078 *000000740000000a02240000002000000054000000680000006900000073000000200000006100 *000070000000700000006500000061000000720000007300000020000000740000006f00000020 *000000640000006f000000200000006e0000006f0000007400000068000000690000006e000000 *6700000020000000610000007400000020000000610000006c0000006c0000002e0000000a0000 *00012801030102140000004100000020000000630000006f0000006e0000007300000074000000 *720000007500000063000000740000006f0000007200000020000000660000006f000000720000 *00200000006100000020010402000000df000000de01020d000000200000007700000068000000 *650000006e00000020000000790000006f0000007500000020000000640000006f0000006e0102 *0100000027021a0000007400000020000000630000006100000072000000650000002000000061 *000000620000006f00000075000000740000002000000074000000680000006500000020000000 *720000006500000071000000750000006500000073000000740000002e0000000a000000012901 *03021b000000410000006700000061000000690000006e0000002c000000200000007700000068 *000000790000002000000069000000730000002000000074000000680000006900000073000000 *2000000075000000730000006500000066000000750000006c0000003f0000000a000000012a01 *03022a000000410000002000000073000000690000006d000000700000006c0000006500000020 *000000480000005400000054000000500000002000000062000000610000007300000069000000 *630000002000000061000000750000007400000068000000650000006e00000074000000690000 *00630000006100000074000000690000006f0000006e0000002000000067000000750000006100 *000072000000640000002e0000000a03000000000000000003020f000000740000006800000065 *000000200000007200000065000000610000006c0000006d000000200000006e00000061000000 *6d000000650000000a000000000000000103021a00000074000000680000006500000020000000 *750000007300000065000000720000006e000000610000006d0000006500000020000000700000 *00610000007300000073000000770000006f0000007200000064000000200000006d0000006100 *0000700000000a0000000000000002030212000000740000006800000065000000200000007000 *000061000000720000007400000020000000740000006f00000020000000670000007500000061 *00000072000000640000000a0000012b0103010212000000550000007300000065000000660000 *00750000006c00000020000000690000006e000000730000006900000064000000650000002000 *000074000000680000006500000020010401000000c7010228000000200000006d0000006f0000 *006e00000061000000640000002e00000020000000200000004700000065000000740000007300 *000020000000740000006800000065000000200000006e000000610000006d0000006500000064 *00000020000000690000006e000000700000007500000074000000200000007000000061000000 *72000000610000006d000000650000007400000065000000720000000a01021000000020000000 *280000006500000069000000740000006800000065000000720000002000000066000000720000 *006f0000006d00000020000000610000002001070204000000500000004f000000530000005401 *0206000000200000006f0000007200000020000000610000002001070203000000470000004500 *000054020b00000020000000720000006500000071000000750000006500000073000000740000 *00290000002e0000000a000000012c010301022300000047000000650000007400000020000000 *740000006800000065000000200000006e000000610000006d0000006500000064000000200000 *00690000006e000000700000007500000074000000200000007000000061000000720000006100 *00006d000000650000007400000065000000720000002000000061000000730000002000000061 *000000200104010000024602020000002e0000000a000000012d01030102190000004700000065 *0000007400000020000000740000006800000065000000200000006e000000610000006d000000 *650000006400000020000000690000006e00000070000000750000007400000020000000610000 *00730000002000000061000000200104010000029302020000002e0000000a000000012e010301 *021600000047000000650000007400000020000000740000006800000065000000200000006e00 *0000610000006d000000650000006400000020000000630000006f0000006f0000006b00000069 *000000650000002e0000000a022600000020000000540000006800000065000000200000006300 *00006f0000006f0000006b0000006900000065000000200000006e000000610000006d00000065 *000000200000006900000073000000200000006300000061000000730000006500000020000000 *690000006e00000073000000650000006e00000073000000690000007400000069000000760000 *00650000002e0000000a000000012f010301021a00000047000000650000007400000020000000 *740000006800000065000000200000006e000000610000006d0000006500000064000000200000 *00630000006f0000006f0000006b00000069000000650000002000000061000000730000002000 *000061000000200104010000029302020000002e0000000a000000013001030102260000004700 *0000650000007400000020000000740000006800000065000000200000006e000000610000006d *000000650000006400000020000000630000006f0000006f0000006b0000006900000065000000 *200000006100000073000000200000007400000068000000650000002000000072000000650000 *007100000075000000650000007300000074000000650000006400000020010401000002670207 *00000020000000740000007900000070000000650000002e0000000a0000000131010301020500 *00004c000000690000006b00000065000000200104010000012d0102060000002c000000200000 *006200000075000000740000002001040100000267020b0000007300000020000000660000006f *0000007200000020000000790000006f000000750000002e0000000a0000000132010301023300 *000047000000650000007400000020000000610000006c0000006c000000200000007400000068 *0000006500000020000000690000006e0000007000000075000000740000002000000070000000 *6100000072000000610000006d0000006500000074000000650000007200000073000000200000 *00610000006e0000006400000020000000630000006f0000006e00000076000000650000007200 *000074000000200000007400000068000000650000006d00000020000000740000006f00000020 *00000061000000200104010000029302020000002e0000000a0000000133010103010205000000 *5400000068000000690000007300000020010401000000e101021d000000200000006d0000006f *00000064000000690000006600000069000000650000007200000020000000650000006e000000 *61000000620000006c000000650000007300000020000000740000006800000065000000200000 *00750000007300000065000000200000006f0000006600000020010401000002ac010205000000 *20000000610000006e0000006400000020010401000002ad01020c00000020000000690000006e *00000073000000690000006400000065000000200000007400000068000000650000000a010203 *000000200000002000000020010402000000ce000000cd01021800000020000000610000006300 *000074000000690000006f0000006e000000730000002c00000020000000620000007900000020 *000000610000006400000064000000690000006e00000067000000200000007400000068000000 *6500000020010402000002aa000002ab0221000000200000006d0000006f0000006e0000006100 *000064000000200000007400000072000000610000006e00000073000000660000006f00000072 *0000006d000000650000007200000020000000740000006f000000200000007400000068000000 *6500000020000000730000007400000061000000630000006b0000002e0000000a0301022d0000 *00590000006f000000750000002000000063000000610000006e00000020000000770000007200 *000061000000700000002000000074000000680000006500000020000000630000006f0000006d *000000700000006c00000065000000740000006500000020000000730000006500000063000000 *6f0000006e0000006400000020000000610000007200000067000000750000006d000000650000 *006e0000007400000020000000740000006f00000020010401000000f002130000002000000069 *0000006e0000002000000074000000680000006900000073000000200000006600000075000000 *6e0000006300000074000000690000006f0000006e0000002e0000000a00000001340101030102 *29000000410000006e000000200000006500000078000000610000006d000000700000006c0000 *0065000000200000006500000072000000720000006f0000007200000020000000480000006100 *00006e000000640000006c000000650000007200000020000000740000006f0000002000000062 *000000650000002000000075000000730000006500000064000000200000007700000069000000 *74000000680000002001020e0000007300000070000000550000006e0000005700000072000000 *61000000700000004500000072000000720000006f00000072000000540102140000002c000000 *200000007700000068000000690000006300000068000000200000007200000065000000740000 *0075000000720000006e00000073000000200000007400000068000000650000000a0239000000 *2000000020000000200000006500000072000000720000006f00000072000000200000006d0000 *006500000073000000730000006100000067000000650000002000000061000000730000002000 *00006100000020000000700000006c00000061000000690000006e000000200000007400000065 *0000007800000074000000200000006d0000006500000073000000730000006100000067000000 *6500000020000000740000006f0000002000000074000000680000006500000020000000620000 *00720000006f000000770000007300000065000000720000002e0000000a0301024b0000004100 *00006e0000006f0000007400000068000000650000007200000020000000700000006f00000073 *000000730000006900000062000000690000006c00000069000000740000007900000020000000 *690000007300000020000000740000006f0000002000000073000000740000006f000000720000 *006500000020000000740000006800000065000000200000006500000072000000720000006f00 *000072000000200000006d0000006500000073000000730000006100000067000000650000002c *00000020000000650000002e000000670000002e00000020000000610000007300000020000000 *6100000020000000460000006c0000006100000073000000680000004d00000073000000670000 *002c00000020000000610000006e000000640000000a0225000000200000002000000020000000 *7400000068000000650000006e0000002000000072000000650000006400000069000000720000 *006500000063000000740000002000000074000000680000006500000020000000750000007300 *0000650000007200000020000000730000006f0000006d00000065000000770000006800000065 *00000072000000650000002e0000000a0000000135010103010217000000540000006800000069 *00000073000000200000006900000073000000200000006100000020000000660000006f000000 *720000002000000075000000730000006500000020000000770000006900000074000000680000 *0020010212000000270000006d0000006100000070000000530000006500000072000000760000 *00650000007200000050000000610000007200000074000000540000005c000000270000002701 *021300000020000000490000007400000020000000690000007400000020000000750000006e00 *00007700000072000000610000007000000073000000200000007400000068000000650000000a *01021d00000020000000690000006e000000740000006500000072000000690000006f00000072 *000000200000006d0000006f0000006e000000610000006400000020000000660000006f000000 *720000002000000075000000730000006500000020000000770000006900000074000000680000 *0020010401000000f00102110000002e0000002000000020000000490000006600000020000000 *790000006f00000075000000200000006800000061000000760000006500000020000000610000 *000a010201000000200107021a0000005300000065000000720000007600000065000000720000 *005000000061000000720000007400000054000000200000002800000045000000720000007200 *00006f00000072000000540000002000000065000000200000006d000000290000002000000061 *0102260000002c0000002000000074000000680000006900000073000000200000007700000069 *0000006c0000006c00000020000000630000006f0000006e000000760000006500000072000000 *740000002000000074000000680000006100000074000000200000006d0000006f0000006e0000 *00610000006400000020000000690000006e000000740000006f00000020000000610000000a01 *0201000000200107020f0000005300000065000000720000007600000065000000720000005000 *000061000000720000007400000054000000200000006d000000200000006101020d0000002e00 *000020000000200000005500000073000000650000006400000020000000770000006900000074 *0000006800000020010212000000270000006d0000006100000070000000530000006500000072 *00000076000000650000007200000050000000610000007200000074000000540000005c000000 *270000002701020a00000020000000740000006f00000020000000610000006c0000006c000000 *6f000000770000000a01020100000020010401000002ac01020500000020000000610000006e00 *00006400000020010401000002ad021900000020000000690000006e0000007300000069000000 *640000006500000020000000790000006f0000007500000072000000200000006d0000006f0000 *006e00000061000000640000002e000000200000002000000045000000670000002e0000000a01 *0702610000002000000073000000690000006d000000700000006c000000650000004800000054 *000000540000005000000020000000630000006f0000006e000000660000002000000024000000 *200000006d00000061000000700000005300000065000000720000007600000065000000720000 *005000000061000000720000007400000054000000270000002000000028000000730000007000 *0000550000006e000000570000007200000061000000700000004500000072000000720000006f *0000007200000054000000200000006600000061000000690000006c0000007500000072000000 *650000005000000061000000720000007400000029000000200000002000000024000000200000 *006d00000079000000500000006100000072000000740000002000000060000000630000006100 *00007400000063000000680000004500000072000000720000006f000000720000006000000020 *0000006500000072000000720000006f0000007200000050000000610000007200000074000000 *0a0301020a0000004e0000006f0000007400000065000000200000007400000068000000610000 *0074000000200107020b0000006600000061000000690000006c00000075000000720000006500 *0000500000006100000072000000740102150000002000000077000000690000006c0000006c00 *0000200000006f0000006e0000006c000000790000002000000062000000650000002000000072 *000000750000006e00000020000000690000006600000020010702090000006500000072000000 *720000006f00000072000000500000006100000072000000740102100000002000000074000000 *6800000072000000650000007700000020000000610000006e0000002000000065000000720000 *00720000006f000000720000000a01020c00000020000000730000006f00000020000000690000 *007400000020000000640000006f00000065000000730000006e01020100000027021b00000074 *000000200000006800000061000000760000006500000020000000740000006f00000020000000 *6200000065000000200000007600000065000000720000007900000020000000630000006f0000 *006d000000700000006c00000065000000780000002e0000000a000000013601010301023b0000 *005300000065000000740000002000000074000000680000006500000020000000760000006100 *00006c000000690000006400000061000000740000006f00000072000000200000007700000068 *0000006900000063000000680000002000000073000000680000006f000000750000006c000000 *640000002000000062000000650000002000000075000000730000006500000064000000200000 *00660000006f000000720000002000000074000000680000006900000073000000200000007000 *00006100000072000000740000006900000063000000750000006c000000610000007200000020 *01040200000068000000630102010000000a021d00000020000000770000006800000065000000 *6e0000002000000076000000610000006c00000069000000640000006100000074000000690000 *006f0000006e00000020000000690000007300000020000000650000006e000000610000006200 *00006c00000065000000640000002e0000000a010301024300000043000000610000006c000000 *6c000000690000006e000000670000002000000074000000680000006900000073000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000006400 *00006f0000006500000073000000200000006e0000006f0000007400000020000000650000006e *00000061000000620000006c000000650000002000000076000000610000006c00000069000000 *640000006100000074000000690000006f0000006e0000002e0000002000000054000000680000 *0061000000740000002000000063000000610000006e000000200000006f0000006e0000006c00 *0000790000002000000062000000650000000a01022800000020000000640000006f0000006e00 *00006500000020000000620000007900000020000000650000006e00000061000000620000006c *000000690000006e00000067000000200000007400000068000000650000002000000076000000 *610000006c00000069000000640000006100000074000000690000006f0000006e000000200000 *00690000006e000000200000007400000068000000650000002001040200000086000000850102 *130000002000000074000000680000006100000074000000200000006900000073000000200000 *0070000000610000007300000073000000650000006400000020000000740000006f0000000a01 *020100000020010401000000f002020000002e0000000a010301023e000000590000006f000000 *7500000020000000640000006f000000200000006e0000006f00000074000000200000006e0000 *0065000000650000006400000020000000740000006f0000002000000063000000610000006c00 *00006c00000020000000740000006800000069000000730000002000000066000000750000006e *0000006300000074000000690000006f0000006e00000020000000690000006600000020000000 *7400000068000000650000002000000076000000610000006c0000006900000064000000610000 *00740000006f000000720000002000000073000000650000007400000020000000690000006e00 *00000a010201000000200104020000008600000085021d00000020000000640000006f00000065 *00000073000000200000007700000068000000610000007400000020000000790000006f000000 *750000002000000077000000610000006e0000007400000020000000610000006c000000720000 *00650000006100000064000000790000002e0000000a010301020e000000450000007800000061 *0000006d000000700000006c000000650000003a00000020000000280000007500000073000000 *65000000200104010000013b01022400000020000000690000006e000000730000007400000065 *0000006100000064000000200000006f0000006600000020000000740000006800000065000000 *2000000064000000650000006600000061000000750000006c0000007400000020000000730000 *007500000070000000700000006c00000069000000650000006400000020000000620000007900 *000020010401000001380202000000290000000a01070255000000200000007300000069000000 *6d000000700000006c000000650000004800000054000000540000005000000020000000760000 *00610000006c0000006900000064000000610000007400000065000000430000006f0000006e00 *000066000000200000002e00000020000000610000006e00000079000000520000006500000071 *000000750000006500000073000000740000002000000024000000200000006f0000006b000000 *200000002e0000002000000073000000650000007400000056000000610000006c000000690000 *006400000061000000740000006f00000072000000200000006e0000006f0000006f0000007000 *000056000000610000006c000000690000006400000061000000740000006f0000007200000020 *0000003d0000003c0000003c0000002000000068000000740000006d0000006c00000050000000 *6100000067000000650000000a0301020a00000053000000650000006500000020000000610000 *006c000000730000006f0000003a00000020010401000001380102020000002c00000020010401 *0000013a0102020000002c000000200104010000013b0102020000002c00000020010401000001 *3c02010000000a0000000137010103010216000000530000006500000072000000760000006500 *000072000000500000006100000072000000740000002000000076000000650000007200000073 *000000690000006f0000006e000000200000006f00000066000000200104010000013602020000 *002e0000000a010301021b0000004500000078000000610000006d000000700000006c00000065 *0000003a0000002000000028000000530000006500000074000000200000007600000061000000 *6c000000690000006400000061000000740000006f0000007200000020000000740000006f0000 *00200104010000013b0202000000290000000a07024b0000002000000020000000730000006900 *00006d000000700000006c00000065000000480000005400000054000000500000002000000076 *000000610000006c0000006900000064000000610000007400000065000000430000006f000000 *6e0000006600000020000000240000002000000073000000650000007400000056000000610000 *006c000000690000006400000061000000740000006f0000007200000053000000500000002000 *00006e0000006f0000006f0000007000000056000000610000006c000000690000006400000061 *000000740000006f00000072000000200000002800000064000000690000007200000020000000 *22000000610000006a000000610000007800000022000000200000002e0000002e0000002e0000 *0020000000290000000a0000000138010103010207000000450000007800000074000000650000 *006e00000064000000200104010000008c01022400000020000000620000007900000020000000 *650000006e00000061000000620000006c000000690000006e0000006700000020000000760000 *00610000006c00000069000000640000006100000074000000690000006f0000006e0000002000 *0000610000006e000000640000002000000073000000650000007400000074000000690000006e *000000670000000a010201000000200104010000013a01021e0000002000000061000000730000 *002000000074000000680000006500000020000000640000006500000066000000610000007500 *00006c000000740000002000000076000000610000006c00000069000000640000006100000074 *0000006f0000007200000020000000660000006f00000072000000200107010204000000740000 *006500000078000000740102010000002f020400000068000000740000006d0000006c02020000 *002e0000000a010302090000004500000078000000610000006d000000700000006c0000006500 *00003a0000000a0702340000002000000073000000690000006d000000700000006c0000006500 *0000480000005400000054000000500000002000000076000000610000006c0000006900000064 *000000610000007400000065000000430000006f0000006e00000066000000200000002e000000 *20000000610000006e000000790000005200000065000000710000007500000065000000730000 *00740000002000000024000000200000006f0000006b0000002000000068000000740000006d00 *00006c000000500000006100000067000000650000000a00000001390101030102250000004100 *0000630000007400000075000000610000006c0000006c00000079000000200000007000000065 *00000072000000660000006f000000720000006d00000020000000740000006800000065000000 *2000000076000000610000006c00000069000000640000006100000074000000690000006f0000 *006e000000200000006f0000006e00000020000000610000002001040200000068000000630202 *0000002e0000000a010301022300000052000000750000006e0000002000000074000000680000 *00650000002000000076000000610000006c000000690000006400000061000000740000006f00 *000072000000200000007300000070000000650000006300000069000000660000006900000065 *0000006400000020000000690000006e0000002000000074000000680000006500000020010402 *00000068000000630102150000002e000000200000004900000066000000200000006e0000006f *0000006e000000650000002000000069000000730000002000000070000000720000006f000000 *760000006900000064000000650000000a02230000002000000075000000730000006500000020 *00000074000000680000006500000020000000730000007500000070000000700000006c000000 *6900000065000000640000002000000064000000650000006600000061000000750000006c0000 *007400000020000000690000006e00000073000000740000006500000061000000640000002e00 *00000a0301023d0000004e0000006f00000074000000650000003a000000200000005400000068 *00000069000000730000002000000066000000750000006e000000630000007400000069000000 *6f0000006e0000002000000077000000690000006c0000006c0000002000000072000000750000 *006e0000002000000076000000610000006c000000690000006400000061000000740000006900 *00006f0000006e00000020000000750000006e000000630000006f0000006e0000006400000069 *00000074000000690000006f0000006e000000610000006c0000006c000000790000002e000000 *20000000590000006f000000750000000a01020f0000002000000070000000720000006f000000 *6200000061000000620000006c000000790000002000000077000000610000006e000000740000 *002001040100000136010204000000200000006f00000072000000200104010000013802020000 *002e0000000a000000013a01010301020900000056000000610000006c00000069000000640000 *006100000074000000650000002001070102040000007400000065000000780000007401020100 *00002f020400000068000000740000006d0000006c01020e00000020000000630000006f000000 *6e00000074000000650000006e0000007400000020000000770000006900000074000000680000 *0020010702120000005700000044000000470000002000000048000000540000004d0000004c00 *00002000000056000000610000006c000000690000006400000061000000740000006f00000072 *02020000002e0000000a0103010231000000540000006800000069000000730000002000000066 *000000750000006e0000006300000074000000690000006f0000006e0000002000000065000000 *780000007000000065000000630000007400000073000000200000007400000068000000650000 *002000000065000000780000006500000063000000750000007400000061000000620000006c00 *00006500000020000000740000006f000000200000006200000065000000200000006e00000061 *0000006d0000006500000064000000200107020800000076000000610000006c00000069000000 *640000006100000074000000650102010000000a01021f00000020000000610000006e00000064 *000000200000006900000074000000200000006d00000075000000730000007400000020000000 *620000006500000020000000690000006e00000020000000740000006800000065000000200000 *0064000000650000006600000061000000750000006c0000007400000020010702040000005000 *000041000000540000004802020000002e0000000a0301020a0000005300000065000000650000 *0020000000610000006c000000730000006f0000003a0000002001040100000136010202000000 *2c00000020010401000001380102020000002c000000200104010000013c02020000002e000000 *0a000000013b0101030223000000410000002000000076000000610000006c0000006900000064 *00000061000000740000006f000000720000002000000077000000680000006900000063000000 *6800000020000000610000006c0000007700000061000000790000007300000020000000730000 *00750000006300000063000000650000006500000064000000730000002e0000000a0301024100 *000055000000730000006500000066000000750000006c00000020000000660000006f00000072 *0000002000000073000000650000006c0000006500000063000000740000006900000076000000 *650000006c000000790000002000000064000000690000007300000061000000620000006c0000 *00690000006e000000670000002000000076000000610000006c00000069000000640000006100 *000074000000690000006f0000006e0000002e00000020000000460000006f0000007200000020 *0000006500000078000000610000006d000000700000006c000000650000002c00000020000000 *690000006600000020000000790000006f000000750000000a0102400000002000000061000000 *72000000650000002000000073000000650000006e00000064000000690000006e000000670000 *0020000000640000006f000000770000006e0000002000000048000000540000004d0000004c00 *000020000000660000007200000061000000670000006d000000650000006e0000007400000073 *00000020000000740000006f00000020000000610000006e00000020000000410000004a000000 *4100000058000000200000006100000070000000700000006c0000006900000063000000610000 *0074000000690000006f0000006e00000020000000610000006e00000064000000200000007400 *000068000000650000000a02380000002000000064000000650000006600000061000000750000 *006c000000740000002000000076000000610000006c0000006900000064000000610000007400 *00006f00000072000000200000006f0000006e0000006c0000007900000020000000750000006e *0000006400000065000000720000007300000074000000610000006e0000006400000073000000 *20000000630000006f0000006d000000700000006c000000650000007400000065000000200000 *00640000006f00000063000000750000006d000000650000006e00000074000000730000002e00 *00000a000000013c01010301020d00000056000000610000006c00000069000000640000006100 *000074000000650000002000000074000000680000006500000020010402000000680000006302 *20000000200000007500000073000000690000006e0000006700000020000000610000006e0000 *002000000065000000780000007400000065000000720000006e000000610000006c0000002000 *00006100000070000000700000006c00000069000000630000006100000074000000690000006f *0000006e0000002e0000000a010301024000000049000000660000002000000074000000680000 *00650000002000000065000000780000007400000065000000720000006e000000610000006c00 *0000200000006100000070000000700000006c0000006900000063000000610000007400000069 *0000006f0000006e0000002000000072000000650000007400000075000000720000006e000000 *7300000020000000300000002c00000020000000740000006800000065000000200000006f0000 *00720000006900000067000000690000006e000000610000006c00000020000000720000006500 *000073000000700000006f0000006e00000073000000650000002000000069000000730000000a *0102460000002000000072000000650000007400000075000000720000006e0000006500000064 *00000020000000750000006e0000006d0000006f00000064000000690000006600000069000000 *65000000640000002e000000200000004900000066000000200000007400000068000000650000 *002000000065000000780000007400000065000000720000006e000000610000006c0000002000 *00006100000070000000700000006c00000069000000630000006100000074000000690000006f *0000006e0000002000000072000000650000007400000075000000720000006e00000073000000 *200000006e0000006f0000006e0000002d0000007a00000065000000720000006f0000002c0000 *0020000000610000002001040200000068000000630102010000000a01023d0000002000000063 *0000006f0000006e0000007400000061000000690000006e000000690000006e00000067000000 *20000000740000006800000065000000200000006500000072000000720000006f000000720000 *00200000006d000000650000007300000073000000610000006700000065000000730000002000 *0000610000006e00000064000000200000006f000000720000006900000067000000690000006e *000000610000006c00000020000000720000006500000073000000700000006f0000006e000000 *730000006500000020000000620000006f00000064000000790000002000000069000000730000 *000a02130000002000000072000000650000007400000075000000720000006e00000065000000 *6400000020000000690000006e00000073000000740000006500000061000000640000002e0000 *000a0103010244000000540000006800000069000000730000002000000066000000750000006e *0000006300000074000000690000006f0000006e00000020000000610000006c00000073000000 *6f0000002000000074000000610000006b00000065000000730000002000000061000000200000 *007000000072000000650000006400000069000000630000006100000074000000650000002000 *000066000000690000006c00000074000000650000007200000020000000770000006800000069 *000000630000006800000020000000690000007300000020000000610000007000000070000000 *6c00000069000000650000006400000020000000740000006f0000002000000074000000680000 *00650000000a01024200000020000000630000006f0000006e00000074000000650000006e0000 *00740000002d00000074000000790000007000000065000000200000006f000000660000002000 *000074000000680000006500000020000000720000006500000073000000700000006f0000006e *00000073000000650000002e000000200000005400000068000000650000002000000066000000 *690000006c0000007400000065000000720000002000000077000000690000006c0000006c0000 *00200000006f0000006e0000006c00000079000000200000006200000065000000200000006100 *000070000000700000006c0000006900000065000000640000002000000069000000660000000a *021d00000020000000740000006800000065000000200000007000000072000000650000006400 *000069000000630000006100000074000000650000002000000072000000650000007400000075 *000000720000006e0000007300000020000000740000007200000075000000650000002e000000 *0a01030102450000004e0000004f00000054000000450000003a00000020000000540000006800 *000069000000730000002000000066000000750000006e0000006300000074000000690000006f *0000006e0000002000000072000000650000007100000075000000690000007200000073000000 *650000002000000074000000680000006500000020000000750000007300000065000000200000 *006f00000066000000200000002d00000074000000680000007200000065000000610000006400 *0000650000006400000020000000740000006f0000002000000061000000760000006f00000069 *0000006400000020000000620000006c0000006f000000630000006b000000690000006e000000 *670000002e0000000a023700000020000000480000006f00000077000000650000007600000065 *000000720000002c00000020000000790000006f00000075000000200000007000000072000000 *6f0000006200000061000000620000006c00000079000000200000006e00000065000000650000 *0064000000200000007400000068000000610000007400000020000000660000006f0000007200 *00002000000048000000610000007000000070000000730000007400000061000000630000006b *00000020000000610000006e000000790000007700000061000000790000002e0000000a030102 *0a00000053000000650000006500000020000000610000006c000000730000006f0000003a0000 *00200104010000013a02020000002e0000000a0600000000000000000302130000006e00000061 *0000006d00000065000000200000006f0000006600000020000000650000007800000065000000 *63000000750000007400000061000000620000006c000000650000000a00000000000000010302 *2500000061000000720000006700000075000000650000006d000000650000006e000000740000 *007300000020000000740000006f00000020000000700000006100000073000000730000002000 *0000740000006f0000002000000074000000680000006500000020000000650000007800000065 *00000063000000750000007400000061000000620000006c000000650000000a00000000000000 *020302230000006f0000007000000074000000690000006f0000006e000000610000006c000000 *200000007000000061000000740000006800000020000000740000006f00000020000000770000 *006f000000720000006b000000690000006e000000670000002000000064000000690000007200 *00006500000063000000740000006f00000072000000790000000a000000000000000303022900 *00006f0000007000000074000000690000006f0000006e000000610000006c0000002000000065 *0000006e0000007600000069000000720000006f0000006e0000006d000000650000006e000000 *7400000020000000280000006f0000007400000068000000650000007200000077000000690000 *00730000006500000020000000690000006e000000680000006500000072000000690000007400 *0000290000000a0000000000000004030214000000630000006f0000006e000000740000006500 *00006e000000740000002d00000074000000790000007000000065000000200000006600000069 *0000006c0000007400000065000000720000000a00000000000000050302150000005200000065 *00000073000000700000006f0000006e000000730000006500000020000000740000006f000000 *2000000076000000610000006c00000069000000640000006100000074000000650000000a0000 *02b70000000002b80000000002b90000000002ba0000db00000000000000010000000200000003 *0000000400000045000000460000004700000048000000490000004a0000004b0000004c000000 *4d0000004e0000004f000000500000005100000052000000530000005400000055000000560000 *005700000058000000590000005a0000005b0000005c0000005d0000005e0000005f0000006000 *00006100000062000000630000006400000065000000660000006700000068000000690000006a *0000006b0000006c0000006d0000006e0000006f00000070000000710000007200000073000000 *7400000075000000760000007700000078000000790000007a0000007b0000007c0000007d0000 *007e0000007f000000800000008100000082000000830000008400000085000000860000008700 *0000880000008b0000008c0000008d0000008e0000008f00000090000000910000009200000093 *0000009400000095000000960000009700000098000000990000009a0000009b0000009c000000 *9d0000009e0000009f000000a0000000c1000000c2000000c3000000c4000000c5000000c60000 *00c7000000c8000000c9000000ca000000cb000000cc000000cd000000ce000000cf000000d000 *0000d1000000d2000000d3000000d4000000d5000000d6000000d7000000d8000000d9000000da *000000db000000dc000000dd000000de000000df000000e0000000e1000000e2000000e3000000 *e4000000e5000000e6000000e7000000e8000000e9000000ea000000eb000000ec000000ed0000 *00ee000000ef000000f0000000f1000000f2000000f3000000f4000000f5000000f6000000f700 *0000f8000000f9000000fa000000fb000000fc000000fd000000fe000000ff0000010000000101 *00000102000001030000010400000105000001060000010700000108000001090000010a000001 *0b0000010c0000010d0000010e0000010f00000110000001110000011200000113000001140000 *0115000001160000011700000118000001190000011a0000011b0000011c0000011d0000011e00 *00011f000001200000012100000122000001230000012400000125000001260000012700000128 *000001290000012a0000012b0000012c0000012d0000012e0000012f0000013000000131000001 *32000001330000013400000135000001360000013700000138000001390000013a0000013b0000 *013c7c000000f0000000f1000000f2000000f3000000f4000000f5000000ef000000de000000df *000000e0000000e1000000e3000000e5000000e6000000e400000128000000cd000000ce000000 *cf000000cc000000d7000000e2000000ea000000e9000000e8000000eb000000c8000000c90000 *00c1000000c2000000c3000000c4000000c5000000c6000000db000000dc000000dd000000c700 *0000e7000000f9000000ed000000ee00000126000000d0000000d1000000d2000000d3000000ec *000000d8000000da000000d9000000d4000000d5000000d6000000ca000000cb0000011b000001 *15000000f6000001160000011d0000011c0000011e0000011f0000012000000121000001220000 *01230000012400000125000001170000011800000119000000fa000000fb0000011a000000fc00 *00010200000103000001040000010500000100000000ff000000fd000000fe0000010100000106 *00000108000001090000010a0000010d0000010e0000010b0000010c0000011100000112000001 *2a00000107000000f7000000f80000010f0000011000000127000001290000012b0000012c0000 *012d0000012e0000012f0000013000000131000001320000011300000114000001330000013400 *000135000001360000013700000138000001390000013a0000013b0000013c007c000000c10300 *0000c2000000c3000000c4000000c200000000c300000000c400000000c501000000c6000000c6 *00000000c700000000c801000000c9000000c900000000ca01000000cb000000cb00000000cc00 *000000cd02000000ce000000cf000000ce00000000cf00000000d003000000d1000000d2000000 *d3000000d100000000d200000000d300000000d402000000d5000000d6000000d500000000d600 *000000d700000000d802000000da000000d9000000d900000000da00000000db02000000dc0000 *00dd000000dc00000000dd00000000de02000000df000000e0000000df00000000e000000000e1 *00000000e200000000e300000000e400000000e500000000e600000000e700000000e800000000 *e900000000ea00000000eb00000000ec00000000ed00000000ee00000000ef00000000f0000000 *00f100000000f200000000f300000000f400000000f500000000f600000000f700000000f80000 *0000f900000000fa00000000fb00000000fc00000000fd00000000fe00000000ff000000010000 *000001010000000102000000010300000001040000000105000000010600000001070000000108 *0000000109000000010a000000010b000000010c000000010d000000010e000000010f00000001 *100000000111000000011200000001130000000114000000011500000001160000000117000000 *01180000000119000000011a000000011b000000011c000000011d000000011e000000011f0000 *000120000000012100000001220000000123000000012400000001250000000126000000012700 *000001280000000129000000012a000000012b000000012c000000012d000000012e000000012f *000000013000000001310000000132000000013300000001340000000135000000013600000001 *3700000001380000000139000000013a000000013b000000013c00000000000000000a00000000 *1c0000013d0000000002bb00000000013e00000000013f01030102270000005200000065000000 *61000000640000007900000020000000630000006f0000006c0000006c00000065000000630000 *0074000000690000006f0000006e000000200000006f0000006600000020000000630000006f00 *00006d0000006d0000006f0000006e000000200000006d000000690000006d0000006500000020 *00000074000000790000007000000065000000730000002e0000000a0102490000002000000045 *000000780000006300000065000000700000007400000020000000660000006f00000072000000 *200000007400000068000000650000002000000066000000690000007200000073000000740000 *002000000074000000770000006f00000020000000650000006e00000074000000720000006900 *000065000000730000002c00000020000000740000006800000065000000200000006d00000061 *0000007000000070000000690000006e000000670000007300000020000000630000006f000000 *6d000000650000002000000066000000720000006f0000006d00000020000000610000006e0000 *00200000005500000062000000750000006e000000740000007500000020000000380000002e00 *00003000000034000000200106020300000065000000740000006302110000006d000000690000 *006d000000650000002e0000007400000079000000700000006500000073000000200000006600 *0000690000006c000000650000002e0000000a0000000140000000000141000000000142000000 *0001430000000002bc0000000002bd010301020b00000053000000690000006d00000069000000 *6c000000610000007200000020000000740000006f00000020010401000002be02330000002000 *000062000000750000007400000020000000640000006f0000006500000073000000200000006e *0000006f0000007400000020000000690000006e000000630000006c0000007500000064000000 *650000002000000074000000680000006500000020000000650000007800000074000000650000 *006e00000073000000690000006f0000006e000000200000007300000065000000700000006100 *00007200000061000000740000006f000000720000002000000063000000680000006100000072 *0000000a0000000144010301021b00000050000000720000006500000076000000650000006e00 *000074000000730000002000000066000000690000006c0000006500000073000000200000006f *000000660000002000000074000000680000006500000020000000660000006f00000072000000 *6d00000020010206000000270000002e000000660000006f0000006f0000002701020400000020 *0000006f000000720000002001020a000000270000006200000061000000720000002f0000002e *000000660000006f0000006f0000002702130000002000000066000000720000006f0000006d00 *0000200000006200000065000000690000006e0000006700000020000000730000006500000072 *0000007600000065000000640000000a0000000145010301024a00000052000000650000007400 *000075000000720000006e00000073000000200000005400000072000000750000006500000020 *000000690000006600000020000000740000006800000065000000200000006700000069000000 *76000000650000006e00000020000000530000007400000072000000690000006e000000670000 *002000000065000000690000007400000068000000650000007200000020000000730000007400 *000061000000720000007400000073000000200000007700000069000000740000006800000020 *00000061000000200000002e000000200000006f00000072000000200000006900000073000000 *200000006f000000660000002000000074000000680000006500000020000000660000006f0000 *00720000006d0000000a01020100000020010508000000660000006f0000006f0000002f000000 *2e00000062000000610000007202350000002c00000020000000650000002e000000670000002e *000000200000007400000068000000650000002000000074000000790000007000000069000000 *63000000610000006c000000200000002a0000006e000000690000007800000020000000630000 *006f0000006e00000076000000650000006e00000074000000690000006f0000006e0000002000 *0000660000006f000000720000002000000068000000690000006400000064000000650000006e *0000002000000066000000690000006c00000065000000730000002e0000000a00000001460103 *022e0000005500000073000000650000002000000073000000650000006e000000640000004600 *0000690000006c0000006500000020000000740000006f0000002000000073000000650000006e *000000640000002000000074000000680000006500000020000000630000006f0000006e000000 *74000000650000006e0000007400000073000000200000006f0000006600000020000000610000 *002000000048000000610000006e000000640000006c000000650000000a050000000000000000 *030214000000630000006f0000006e00000074000000650000006e000000740000002d00000074 *00000079000000700000006500000020000000730000007400000072000000690000006e000000 *670000000a000000000000000103021e00000066000000690000006c0000006500000020000000 *7000000061000000740000006800000020000000660000006f0000007200000020000000630000 *006f0000006e00000074000000650000006e0000007400000020000000740000006f0000002000 *000073000000650000006e000000640000000a0000000000000002030102360000006d0000006f *000000640000002d00000074000000690000006d0000006500000020000000660000006f000000 *72000000200000007400000068000000650000002000000068000000610000006e000000640000 *006c0000006500000020000000280000004d000000550000005300000054000000200000004e00 *00004f00000054000000200000006200000065000000200000006c000000610000007400000065 *00000072000000200000007400000068000000610000006e000000200000007300000065000000 *7200000076000000650000007201020100000027025e0000007300000020000000740000006900 *00006d00000065000000200000006f00000066000000200000006d000000650000007300000073 *000000610000006700000065000000200000006f00000072000000690000006700000069000000 *6e0000006100000074000000690000006f0000006e000000290000002c00000020000000690000 *006e000000630000006f0000006d000000690000006e0000006700000020000000720000006500 *000071000000750000006500000073000000740000002000000028000000750000007300000065 *0000006400000020000000740000006f0000002000000063000000680000006500000063000000 *6b00000020000000660000006f000000720000002000000069000000660000002d0000006d0000 *006f0000006400000069000000660000006900000065000000640000002d000000730000006900 *00006e000000630000006500000020000000680000006500000061000000640000006500000072 *000000290000000a00000000000000030302130000006f00000066000000660000007300000065 *0000007400000020000000690000006e000000740000006f000000200000004800000061000000 *6e000000640000006c000000650000000a00000000000000040302180000006e00000075000000 *6d000000620000006500000072000000200000006f000000660000002000000062000000790000 *0074000000650000007300000020000000740000006f0000002000000073000000650000006e00 *0000640000000a000001470103022700000053000000650000006e000000640000002000000074 *000000680000006500000020000000630000006f0000006e00000074000000650000006e000000 *7400000073000000200000006f000000660000002000000061000000200000004c000000610000 *007a00000079000000200000004200000079000000740000006500000053000000740000007200 *0000690000006e000000670000000a0500000000000000000301021a000000630000006f000000 *6e00000074000000650000006e000000740000002d000000740000007900000070000000650000 *0020000000730000007400000072000000690000006e0000006700000020000000280000006500 *00002e000000670000002e00000020010701020100000022010204000000740000006500000078 *000000740102010000002f010214000000700000006c00000061000000690000006e0000003b00 *000020000000630000006800000061000000720000007300000065000000740000003d00000075 *00000074000000660000002d000000380201000000220202000000290000000a00000000000000 *010302200000006c000000610000007a0000007900000020000000620000007900000074000000 *65000000730000007400000072000000690000006e0000006700000020000000630000006f0000 *006e00000074000000650000006e0000007400000020000000740000006f000000200000007300 *0000650000006e000000640000000a000000000000000203025b0000006d0000006f0000006400 *00002d00000074000000690000006d0000006500000020000000660000006f0000007200000020 *000000740000006800000065000000200000006200000079000000740000006500000073000000 *7400000072000000690000006e000000670000002c00000020000000690000006e000000630000 *006f0000006d000000690000006e00000067000000200000007200000065000000710000007500 *000065000000730000007400000020000000280000007500000073000000650000006400000020 *000000740000006f00000020000000630000006800000065000000630000006b00000020000000 *660000006f000000720000002000000069000000660000002d0000006d0000006f000000640000 *0069000000660000006900000065000000640000002d00000073000000690000006e0000006300 *00006500000020000000680000006500000061000000640000006500000072000000290000000a *000000000000000303021b0000006f000000660000006600000073000000650000007400000020 *000000690000006e000000740000006f0000002000000074000000680000006500000020000000 *62000000790000007400000065000000730000007400000072000000690000006e000000670000 *000a00000000000000040302640000006e000000750000006d0000006200000065000000720000 *00200000006f000000660000002000000062000000790000007400000065000000730000002000 *0000740000006f0000002000000073000000650000006e0000006400000020000000280000006f *0000006600000066000000730000006500000074000000200000002b0000002000000063000000 *6f000000750000006e00000074000000200000006d000000750000007300000074000000200000 *006200000065000000200000006c00000065000000730000007300000020000000740000006800 *0000610000006e000000200000006f000000720000002000000065000000710000007500000061 *0000006c00000020000000740000006f0000002000000074000000680000006500000020000000 *6c000000650000006e000000670000007400000068000000200000006f00000066000000200000 *007400000068000000650000002000000062000000790000007400000065000000730000007400 *000072000000690000006e00000067000000290000000a00000148010302270000005300000065 *0000006e000000640000002000000074000000680000006500000020000000630000006f000000 *6e00000074000000650000006e0000007400000073000000200000006f00000066000000200000 *0061000000200000004c000000610000007a000000790000002000000042000000790000007400 *000065000000530000007400000072000000690000006e000000670000000a0500000000000000 *000301021a000000630000006f0000006e00000074000000650000006e000000740000002d0000 *007400000079000000700000006500000020000000730000007400000072000000690000006e00 *0000670000002000000028000000650000002e000000670000002e000000200107010201000000 *22010204000000740000006500000078000000740102010000002f010214000000700000006c00 *000061000000690000006e0000003b000000200000006300000068000000610000007200000073 *00000065000000740000003d0000007500000074000000660000002d0000003802010000002202 *02000000290000000a00000000000000010302200000006c000000610000007a00000079000000 *2000000062000000790000007400000065000000730000007400000072000000690000006e0000 *006700000020000000630000006f0000006e00000074000000650000006e000000740000002000 *0000740000006f0000002000000073000000650000006e000000640000000a0000000000000002 *03025b0000006d0000006f000000640000002d00000074000000690000006d0000006500000020 *000000660000006f00000072000000200000007400000068000000650000002000000062000000 *790000007400000065000000730000007400000072000000690000006e000000670000002c0000 *0020000000690000006e000000630000006f0000006d000000690000006e000000670000002000 *000072000000650000007100000075000000650000007300000074000000200000002800000075 *00000073000000650000006400000020000000740000006f000000200000006300000068000000 *65000000630000006b00000020000000660000006f000000720000002000000069000000660000 *002d0000006d0000006f0000006400000069000000660000006900000065000000640000002d00 *000073000000690000006e00000063000000650000002000000068000000650000006100000064 *0000006500000072000000290000000a000000000000000303021b0000006f0000006600000066 *00000073000000650000007400000020000000690000006e000000740000006f00000020000000 *740000006800000065000000200000006200000079000000740000006500000073000000740000 *0072000000690000006e000000670000000a00000000000000040302640000006e000000750000 *006d000000620000006500000072000000200000006f0000006600000020000000620000007900 *000074000000650000007300000020000000740000006f0000002000000073000000650000006e *0000006400000020000000280000006f0000006600000066000000730000006500000074000000 *200000002b00000020000000630000006f000000750000006e00000074000000200000006d0000 *00750000007300000074000000200000006200000065000000200000006c000000650000007300 *000073000000200000007400000068000000610000006e000000200000006f0000007200000020 *000000650000007100000075000000610000006c00000020000000740000006f00000020000000 *740000006800000065000000200000006c000000650000006e0000006700000074000000680000 *00200000006f000000660000002000000074000000680000006500000020000000620000007900 *00007400000065000000730000007400000072000000690000006e00000067000000290000000a *00000149010103024600000053000000650000006e000000640000002000000074000000680000 *006500000020000000730000007000000065000000630000006900000066000000690000006500 *0000640000002000000066000000690000006c0000006500000020000000770000006900000074 *000000680000002000000074000000680000006500000020000000730000007000000065000000 *630000006900000066000000690000006500000064000000200000006d000000690000006d0000 *00650000002d000000740000007900000070000000650000002000000075000000730000006900 *00006e000000670000002000000073000000650000006e0000006400000046000000690000006c *0000006500000028000000290000000a010301023d0000004e0000004f00000054000000450000 *003a00000020000000610000007300000073000000750000006d00000065000000730000002000 *000066000000690000006c00000065000000200000006500000078000000690000007300000074 *0000007300000020000000610000006e0000006400000020000000690000007300000020000000 *7200000065000000610000006400000061000000620000006c0000006500000020000000620000 *007900000020000000740000006800000065000000200000007300000065000000720000007600 *000065000000720000002e00000020000000530000006500000065000000200104010000014c02 *020000002e0000000a03022b0000005700000041000000520000004e000000490000004e000000 *470000003a000000200000004e0000006f00000020000000730000006500000063000000750000 *007200000069000000740000007900000020000000630000006800000065000000630000006b00 *000073000000200000006100000072000000650000002000000070000000650000007200000066 *0000006f000000720000006d00000065000000640000002e0000000a0200000000000000000302 *14000000630000006f0000006e00000074000000650000006e000000740000002d000000740000 *0079000000700000006500000020000000730000007400000072000000690000006e0000006700 *00000a000000000000000103021500000070000000610000007400000068000000200000007400 *00006f0000002000000066000000690000006c00000065000000200000006f0000006e00000020 *0000006400000069000000730000006b0000000a0000014a010103024c00000053000000650000 *006e00000064000000200000007400000068000000650000002000000073000000700000006500 *00006300000069000000660000006900000065000000640000002000000066000000690000006c *000000650000002000000077000000690000007400000068000000200000007400000068000000 *650000002000000073000000700000006500000063000000690000006600000069000000650000 *0064000000200000006d000000690000006d000000650000002d00000074000000790000007000 *000065000000200000007500000073000000690000006e00000067000000200000004c00000061 *0000007a0000007900000020000000420000007900000074000000650000005300000074000000 *72000000690000006e00000067000000730000000a010301023d0000004e0000004f0000005400 *0000450000003a00000020000000610000007300000073000000750000006d0000006500000073 *0000002000000066000000690000006c0000006500000020000000650000007800000069000000 *73000000740000007300000020000000610000006e000000640000002000000069000000730000 *00200000007200000065000000610000006400000061000000620000006c000000650000002000 *000062000000790000002000000074000000680000006500000020000000730000006500000072 *0000007600000065000000720000002e0000002000000053000000650000006500000020010401 *0000014c02020000002e0000000a03022b0000005700000041000000520000004e000000490000 *004e000000470000003a000000200000004e0000006f0000002000000073000000650000006300 *000075000000720000006900000074000000790000002000000063000000680000006500000063 *0000006b0000007300000020000000610000007200000065000000200000007000000065000000 *72000000660000006f000000720000006d00000065000000640000002e0000000a020000000000 *000000030214000000630000006f0000006e00000074000000650000006e000000740000002d00 *00007400000079000000700000006500000020000000730000007400000072000000690000006e *000000670000000a00000000000000010302150000007000000061000000740000006800000020 *000000740000006f0000002000000066000000690000006c00000065000000200000006f000000 *6e000000200000006400000069000000730000006b0000000a0000014b010103024c0000005300 *0000650000006e0000006400000020000000740000006800000065000000200000007300000070 *000000650000006300000069000000660000006900000065000000640000002000000066000000 *690000006c00000065000000200000007700000069000000740000006800000020000000740000 *006800000065000000200000007300000070000000650000006300000069000000660000006900 *00006500000064000000200000006d000000690000006d000000650000002d0000007400000079 *0000007000000065000000200000007500000073000000690000006e0000006700000020000000 *4c000000610000007a000000790000002000000042000000790000007400000065000000530000 *007400000072000000690000006e00000067000000730000000a010301023d0000004e0000004f *00000054000000450000003a00000020000000610000007300000073000000750000006d000000 *65000000730000002000000066000000690000006c000000650000002000000065000000780000 *006900000073000000740000007300000020000000610000006e00000064000000200000006900 *000073000000200000007200000065000000610000006400000061000000620000006c00000065 *000000200000006200000079000000200000007400000068000000650000002000000073000000 *65000000720000007600000065000000720000002e000000200000005300000065000000650000 *00200104010000014c02020000002e0000000a03022b0000005700000041000000520000004e00 *0000490000004e000000470000003a000000200000004e0000006f000000200000007300000065 *000000630000007500000072000000690000007400000079000000200000006300000068000000 *65000000630000006b000000730000002000000061000000720000006500000020000000700000 *006500000072000000660000006f000000720000006d00000065000000640000002e0000000a02 *0000000000000000030214000000630000006f0000006e00000074000000650000006e00000074 *0000002d0000007400000079000000700000006500000020000000730000007400000072000000 *690000006e000000670000000a0000000000000001030215000000700000006100000074000000 *6800000020000000740000006f0000002000000066000000690000006c00000065000000200000 *006f0000006e000000200000006400000069000000730000006b0000000a0000014c0101030220 *000000530000006500000072000000760000006500000020000000610000002000000073000000 *690000006e000000670000006c000000650000002c000000200000007300000070000000650000 *006300000069000000660000006900000065000000640000002000000066000000690000006c00 *0000650000002e0000000a0103020b0000006500000078000000610000006d000000700000006c *0000006500000020000000310000003a0000000a01030236000000530000006500000072000000 *7600000065000000200000007500000073000000690000006e0000006700000020000000730000 *00650000006e0000006400000066000000690000006c0000006500000028000000290000002000 *0000610000006e0000006400000020000000740000006800000065000000200000007300000070 *000000650000006300000069000000660000006900000065000000640000002000000063000000 *6f0000006e00000074000000650000006e000000740000002d0000007400000079000000700000 *00650000000a010702540000002000000073000000650000007200000076000000650000004600 *0000690000006c000000650000005500000073000000690000006e000000670000002000000066 *000000690000006c00000065000000500000006100000074000000680000005300000065000000 *6e0000006400000046000000690000006c00000065000000200000002800000061000000730000 *00430000006f0000006e00000074000000650000006e0000007400000054000000790000007000 *0000650000002000000022000000690000006d0000006100000067000000650000002f0000006a *000000700000006500000067000000220000002900000020000000220000002f00000073000000 *72000000760000002f000000640000006100000074000000610000002f000000690000006d0000 *006100000067000000650000002e0000006a0000007000000067000000220000000a0103020b00 *00006500000078000000610000006d000000700000006c0000006500000020000000320000003a *0000000a0103025000000053000000650000007200000076000000650000002000000075000000 *73000000690000006e000000670000002000000061000000200000006c000000610000007a0000 *007900000020000000420000007900000074000000650000005300000074000000720000006900 *00006e0000006700000020000000610000006e0000006400000020000000740000006800000065 *000000200000006700000075000000650000007300000073000000200000007400000068000000 *6500000020000000630000006f0000006e00000074000000650000006e000000740000002d0000 *00740000007900000070000000650000002000000066000000720000006f0000006d0000002000 *000074000000680000006500000020000000650000007800000074000000650000006e00000073 *000000690000006f0000006e0000000a0107025100000020000000730000006500000072000000 *760000006500000046000000690000006c000000650000005500000073000000690000006e0000 *00670000002000000066000000690000006c000000650000005000000061000000740000006800 *00004c000000610000007a00000079000000200000002800000067000000750000006500000073 *00000073000000430000006f0000006e00000074000000650000006e0000007400000054000000 *7900000070000000650000004d000000200000006d000000690000006d00000065000000540000 *00790000007000000065000000730000002900000020000000220000002f000000730000007200 *0000760000002f000000640000006100000074000000610000002f000000690000006d00000061 *00000067000000650000002e0000006a0000007000000067000000220000000a03022b00000057 *00000041000000520000004e000000490000004e000000470000003a000000200000004e000000 *6f0000002000000073000000650000006300000075000000720000006900000074000000790000 *0020000000630000006800000065000000630000006b0000007300000020000000610000007200 *00006500000020000000700000006500000072000000660000006f000000720000006d00000065 *000000640000002e0000000a0300000000000000000301020a0000007400000079000000700000 *006900000063000000610000006c0000006c000000790000002001040100000149010202000000 *2c000000200104010000014a0102050000002c000000200000006f000000720000002001040100 *00014b02010000000a00000000000000010301023900000066000000750000006e000000630000 *0074000000690000006f0000006e00000020000000660000006f00000072000000200000006400 *0000650000007400000065000000720000006d000000690000006e000000690000006e00000067 *00000020000000630000006f0000006e00000074000000650000006e000000740000002d000000 *74000000790000007000000065000000200000006f000000660000002000000066000000690000 *006c000000650000002e0000002000000054000000790000007000000069000000630000006100 *00006c0000006c000000790000002001040100000142010204000000200000006f000000720000 *00200104010000014102010000000a000000000000000203021a00000070000000610000007400 *00006800000020000000740000006f000000200000007400000068000000650000002000000066 *000000690000006c0000006500000020000000740000006f000000200000007300000065000000 *7200000076000000650000000a0000014d010301020a000000410000006c000000690000006100 *00007300000020000000660000006f00000072000000200104010000014c010201000000200104 *010000014902010000000a000000014e010103024e000000530000006500000072000000760000 *00650000002000000066000000690000006c000000650000007300000020000000660000007200 *00006f0000006d0000002000000061000000200000006400000069000000720000006500000063 *000000740000006f000000720000007900000020000000610000006e0000006400000020000000 *690000007400000073000000200000007300000075000000620000006400000069000000720000 *006500000063000000740000006f00000072000000690000006500000073000000200000002800 *0000700000006100000072000000610000006d0000006500000074000000650000007200000069 *0000007a00000061000000620000006c0000006500000020000000760000006500000072000000 *73000000690000006f0000006e000000290000000a010301023500000050000000610000007200 *0000610000006d00000065000000740000006500000072000000690000007a0000006500000020 *000000740000006800000069000000730000002000000066000000750000006e00000063000000 *74000000690000006f0000006e00000020000000740000006f0000002000000063000000720000 *00650000006100000074000000650000002000000066000000750000006e000000630000007400 *0000690000006f0000006e00000073000000200000006c000000690000006b000000650000002c *000000200104010000014f0102020000002c00000020010401000001500102060000002c000000 *20000000610000006e00000064000000200104010000015102010000000a0103020c0000005900 *00006f0000007500000020000000730000007500000070000000700000006c000000790000003a *0000000a0103010237000000310000002e0000002000000061000000200000006c0000006f0000 *00770000002d0000006c0000006500000076000000650000006c00000020000000660000007500 *00006e0000006300000074000000690000006f0000006e00000020000000770000006800000069 *00000063000000680000002000000074000000610000006b000000650000007300000020000000 *6100000020000000630000006f0000006e00000074000000650000006e000000740000002d0000 *007400000079000000700000006500000020000000610000006e00000064000000200104010000 *02b401021a00000020000000610000006e000000640000002000000067000000650000006e0000 *006500000072000000610000007400000065000000730000002000000061000000200000005200 *00006500000073000000700000006f0000006e00000073000000650000000a01023b0000002000 *000020000000320000002e00000020000000610000002000000066000000750000006e00000063 *00000074000000690000006f0000006e0000002000000077000000680000006900000063000000 *680000002000000064000000650000007400000065000000720000006d000000690000006e0000 *0065000000730000002000000074000000680000006500000020000000630000006f0000006e00 *000074000000650000006e000000740000002d0000007400000079000000700000006500000020 *00000066000000720000006f0000006d0000002000000074000000680000006500000020010401 *000002b40102010000000a022b0000002000000020000000330000002e00000020000000610000 *00200000006c000000690000007300000074000000200000006f00000066000000200000006100 *00006c0000006c0000002000000074000000680000006500000020000000640000006500000066 *00000061000000750000006c0000007400000020000000690000006e0000006400000065000000 *780000002000000066000000690000006c00000065000000730000000a030102410000004e0000 *004f00000054000000450000003a00000020000000750000006e0000006c000000690000006b00 *0000650000002000000066000000690000006c0000006500000053000000650000007200000076 *000000650000002c00000020000000740000006800000065000000720000006500000020000000 *610000007200000065000000200000006e0000006f00000020000000690000006e000000640000 *0065000000780000002000000066000000690000006c0000006500000073000000200000006200 *0000790000002000000064000000650000006600000061000000750000006c000000740000002e *00000020000000530000006500000065000000200104010000014302020000002e0000000a0400 *000000000000000301025500000066000000750000006e0000006300000074000000690000006f *0000006e0000002000000077000000680000006900000063000000680000002000000074000000 *610000006b0000006500000073000000200000006100000020000000630000006f0000006e0000 *0074000000650000006e000000740000002d000000740000007900000070000000650000002000 *0000610000006e000000640000002000000066000000690000006c000000650000007000000061 *000000740000006800000020000000610000006e00000064000000200000006700000065000000 *6e0000006500000072000000610000007400000065000000730000002000000061000000200000 *00720000006500000073000000700000006f0000006e0000007300000065000000200000002800 *00007400000079000000700000006900000063000000610000006c0000006c0000007900000020 *010401000001490102020000002c000000200104010000014a0102050000002c00000020000000 *6f00000072000000200104010000014b0202000000290000000a00000000000000010302320000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000007700 *000068000000690000006300000068000000200000007200000065000000740000007500000072 *0000006e0000007300000020000000740000006800000065000000200000006d00000069000000 *6d000000650000002d0000007400000079000000700000006500000020000000660000006f0000 *00720000002000000046000000690000006c000000650000005000000061000000740000006800 *00000a000000000000000203023c000000690000006e0000006400000065000000780000002000 *000066000000690000006c00000065000000200000006e000000610000006d0000006500000073 *0000002c00000020000000690000006e0000002000000063000000610000007300000065000000 *200000007400000068000000650000002000000072000000650000007100000075000000650000 *007300000074000000650000006400000020000000700000006100000074000000680000002000 *000069000000730000002000000061000000200000006400000069000000720000006500000063 *000000740000006f00000072000000790000000a00000000000000030301020400000066000000 *690000006c000000650102010000002f0213000000640000006900000072000000650000006300 *0000740000006f000000720000007900000020000000740000006f000000200000007300000065 *0000007200000076000000650000000a0000014f0103027a000000530000006500000072000000 *76000000650000002000000066000000690000006c000000650000007300000020000000660000 *00720000006f0000006d0000002000000061000000200000006400000069000000720000006500 *000063000000740000006f000000720000007900000020000000610000006e0000006400000020 *000000690000007400000073000000200000007300000075000000620000006400000069000000 *720000006500000063000000740000006f00000072000000690000006500000073000000200000 *002800000073000000650000006e0000006400000046000000690000006c000000650000002000 *000076000000650000007200000073000000690000006f0000006e000000290000002e00000020 *00000053000000680000006f000000750000006c00000064000000200000007000000065000000 *72000000660000006f000000720000006d000000200000006d0000007500000063000000680000 *002000000062000000650000007400000074000000650000007200000020000000740000006800 *0000610000006e0000002000000069000000740000007300000020000000700000007200000065 *0000006400000065000000630000006500000073000000730000006f0000007200000073000000 *2e0000000a02000000000000000003023c000000690000006e0000006400000065000000780000 *002000000066000000690000006c00000065000000200000006e000000610000006d0000006500 *0000730000002c00000020000000690000006e0000002000000063000000610000007300000065 *000000200000007400000068000000650000002000000072000000650000007100000075000000 *650000007300000074000000650000006400000020000000700000006100000074000000680000 *002000000069000000730000002000000061000000200000006400000069000000720000006500 *000063000000740000006f00000072000000790000000a00000000000000010301020400000066 *000000690000006c000000650102010000002f0213000000640000006900000072000000650000 *0063000000740000006f000000720000007900000020000000740000006f000000200000007300 *0000650000007200000076000000650000000a00000150010103024f0000005300000065000000 *7200000076000000650000002000000066000000690000006c0000006500000073000000200000 *0066000000720000006f0000006d00000020000000610000002000000064000000690000007200 *00006500000063000000740000006f000000720000007900000020000000610000006e00000064 *000000200000006900000074000000730000002000000073000000750000006200000064000000 *69000000720000006500000063000000740000006f000000720000006900000065000000730000 *0020000000280000006c000000610000007a000000790000002000000042000000790000007400 *000065000000530000007400000072000000690000006e00000067000000200000007600000065 *0000007200000073000000690000006f0000006e000000290000002e0000000a0302170000004d *0000006100000079000000200000006c00000065000000610000006b0000002000000066000000 *690000006c000000650000002000000068000000610000006e000000640000006c000000650000 *00730000002e0000000a02000000000000000003023c000000690000006e000000640000006500 *0000780000002000000066000000690000006c00000065000000200000006e000000610000006d *00000065000000730000002c00000020000000690000006e000000200000006300000061000000 *730000006500000020000000740000006800000065000000200000007200000065000000710000 *007500000065000000730000007400000065000000640000002000000070000000610000007400 *000068000000200000006900000073000000200000006100000020000000640000006900000072 *0000006500000063000000740000006f00000072000000790000000a0000000000000001030102 *0400000066000000690000006c000000650102010000002f021300000064000000690000007200 *00006500000063000000740000006f000000720000007900000020000000740000006f00000020 *00000073000000650000007200000076000000650000000a000001510103025200000053000000 *650000007200000076000000650000002000000066000000690000006c00000065000000730000 *002000000066000000720000006f0000006d000000200000006100000020000000640000006900 *0000720000006500000063000000740000006f000000720000007900000020000000610000006e *000000640000002000000069000000740000007300000020000000730000007500000062000000 *6400000069000000720000006500000063000000740000006f0000007200000069000000650000 *007300000020000000280000007300000074000000720000006900000063000000740000002000 *000042000000790000007400000065000000530000007400000072000000690000006e00000067 *0000002000000076000000650000007200000073000000690000006f0000006e00000029000000 *2e000000200000000a02000000000000000003023b000000690000006e00000064000000650000 *00780000002000000066000000690000006c00000065000000200000006e000000610000006d00 *000065000000730000002c00000020000000690000006e00000020000000630000006100000073 *0000006500000020000000740000006800000065000000200000006e0000006500000078000000 *7400000020000000610000007200000067000000750000006d000000650000006e000000740000 *002000000069000000730000002000000061000000200000006400000069000000720000006500 *000063000000740000006f00000072000000790000000a00000000000000010301020400000066 *000000690000006c000000650102010000002f0213000000640000006900000072000000650000 *0063000000740000006f000000720000007900000020000000740000006f000000200000007300 *0000650000007200000076000000650000000a0000015200000000015300000000015400000000 *01550000190000013d0000013e0000013f00000140000001410000014200000143000001440000 *0145000001460000014700000148000001490000014a0000014b0000014c0000014d0000014e00 *00014f000001500000015100000152000001530000015400000155190000013d0000013f000001 *420000014000000141000001460000014700000148000001490000014a0000014b0000014d0000 *014c0000014e0000014f0000015000000151000001440000014300000152000001550000015300 *0001540000013e0000014500190000013d000000013e000000013f000000014000000001410000 *000142000000014300000001440000000145000000014600000001470000000148000000014900 *0000014a000000014b000000014c000000014d000000014e000000014f00000001500000000151 *000000015200000001530000000154000000015500000000000000000b00000000030000015601 *0301020c000000490000007300000020000000650000007100000075000000610000006c000000 *20000000740000006f0000002001050c0000006800000061000000730000006b00000065000000 *6c0000006c0000002f0000004d00000061000000690000006e02010000000a0000000157010301 *020c000000490000007300000020000000650000007100000075000000610000006c0000002000 *0000740000006f0000002001050a0000007000000075000000620000006c000000690000006300 *00002f0000006c0000006f0000006702010000000a0000000158010301021c000000430000006f *0000006e00000076000000650000006e00000069000000650000006e0000006300000065000000 *2000000066000000750000006e0000006300000074000000690000006f0000006e000000200000 *0061000000720000006f000000750000006e00000064000000200104010000013e010201000000 *0a0102290000002000000077000000690000007400000068000000200000007400000068000000 *650000002000000064000000650000006600000061000000750000006c00000074000000200000 *0062000000690000006e000000610000007200000079000000200000006c0000006f0000006300 *00006100000074000000690000006f0000006e0000002000000073000000650000007400000020 *000000740000006f000000200104010000015601020900000020000000610000006e0000006400 *0000200000007400000068000000650000000a010215000000200000006c0000006f0000006700 *0000200000006c0000006f000000630000006100000074000000690000006f0000006e00000020 *00000073000000650000007400000020000000740000006f000000200104010000015702030000 *002e000000200000000a0003000001560000015700000158030000015600000157000001580003 *000001560000000157000000015800000000000000000c00000000080000015901010301020a00 *000072000000650000006100000064000000730000002000000074000000680000006500000020 *0102010000002201020f0000004100000063000000630000006500000070000000740000002d00 *0000450000006e000000630000006f00000064000000690000006e000000670102010000002201 *021c000000200000006800000065000000610000006400000065000000720000002e0000002000 *0000200000005400000068000000650000006e0000002c00000020000000690000006600000020 *000000700000006f000000730000007300000069000000620000006c000000650000000a01022e *0000002000000077000000690000006c0000006c00000020000000630000006f0000006d000000 *700000007200000065000000730000007300000020000000740000006800000065000000200000 *00720000006500000073000000700000006f0000006e0000007300000065000000200000006200 *00006f00000064000000790000002000000077000000690000007400000068000000200000006d *0000006500000074000000680000006f000000640000007300000020010504000000670000007a *0000006900000070010204000000200000006f0000007200000020010507000000640000006500 *0000660000006c00000061000000740000006502010000000a0302260000005200000065000000 *7400000075000000720000006e0000007300000020000000740000006800000065000000200000 *006e000000610000006d00000065000000200000006f0000006600000020000000740000006800 *00006500000020000000630000006f00000064000000690000006e000000670000002000000063 *000000680000006f00000073000000650000006e0000000a000000015a010301022f0000006300 *00006f0000006d0000007000000072000000650000007300000073000000650000007300000020 *00000074000000680000006500000020000000620000006f000000640000007900000020000000 *6f0000006600000020000000740000006800000065000000200000007200000065000000730000 *00700000006f0000006e0000007300000065000000200000007700000069000000740000006800 *000020000000670000007a00000069000000700000002e0000000a021b00000020000000640000 *006f0000006500000073000000200000006e0000006f0000007400000020000000730000006500 *00007400000020000000610000006e000000790000002000000068000000650000006100000064 *0000006500000072000000730000002e0000000a000000015b010301022d000000630000006f00 *00006d000000700000007200000065000000730000007300000065000000730000002000000074 *000000680000006500000020000000620000006f0000006400000079000000200000006f000000 *660000002000000074000000680000006500000020000000720000006500000073000000700000 *006f0000006e000000730000006500000020000000770000006900000074000000680000002000 *00007a0000006c000000690000006201020100000027010202000000730000000a010210000000 *200000006400000065000000660000006c000000610000007400000065000000200000006d0000 *006500000074000000680000006f000000640000000a021b00000020000000640000006f000000 *6500000073000000200000006e0000006f00000074000000200000007300000065000000740000 *0020000000610000006e0000007900000020000000680000006500000061000000640000006500 *000072000000730000002e0000000a00000002bf01030231000000620000006100000073000000 *6500000064000000200000006f0000006e00000020000000740000006800000065000000200000 *0072000000750000006c0000006500000073000000200000006400000065000000730000006300 *00007200000069000000620000006500000020000000690000006e000000200000007200000066 *000000630000003200000036000000310000003600000020000000730000006500000063000000 *2e0000002000000031000000340000002e000000330000000a00000002c00000000002c1000000 *0002c200000000015c01030236000000750000006e000000730000007500000070000000700000 *006f000000720000007400000065000000640000003a0000002000000020000000610000002000 *000070000000610000007200000073000000650000007200000020000000660000006f00000072 *000000200000007400000068000000650000002000000041000000630000006300000065000000 *70000000740000002d000000450000006e000000630000006f00000064000000690000006e0000 *0067000000200000006800000065000000610000006400000065000000720000000a0004000001 *590000015a0000015b0000015c04000001590000015a0000015b0000015c000400000159000000 *015a000000015b000000015c00000000000000001a0000000000ff000001110000000000000001 *00000002000000030000000400000045000000460000004700000048000000490000004a000000 *4b0000004c0000004d0000004e0000004f00000050000000510000005200000053000000540000 *0055000000560000005700000058000000590000005a0000005b0000005c0000005d0000005e00 *00005f000000600000006100000062000000630000006400000065000000660000006700000068 *000000690000006a0000006b0000006c0000006d0000006e0000006f0000007000000071000000 *72000000730000007400000075000000760000007700000078000000790000007a0000007b0000 *007c0000007d0000007e0000007f00000080000000810000008200000083000000840000008500 *00008600000087000000880000008b0000008c0000008d0000008e0000008f0000009000000091 *00000092000000930000009400000095000000960000009700000098000000990000009a000000 *9b0000009c0000009d0000009e0000009f000000a0000000a1000000a2000000a3000000a40000 *00a5000000a6000000a7000000a8000000a9000000aa000000ab000000b2000000b3000000b400 *0000b5000000b6000000b7000000b8000000b9000000ba000000bb000000bc000000bd000000be *000000bf000000c0000000c1000000c2000000c3000000c4000000c5000000c6000000c7000000 *c8000000c9000000ca000000cb000000cc000000cd000000ce000000cf000000d0000000d10000 *00d2000000d3000000d4000000d5000000d6000000d7000000d8000000d9000000da000000db00 *0000dc000000dd000000de000000df000000e0000000e1000000e2000000e3000000e4000000e5 *000000e6000000e7000000e8000000e9000000ea000000eb000000ec000000ed000000ee000000 *ef000000f0000000f1000000f2000000f3000000f4000000f5000000f6000000f7000000f80000 *00f9000000fa000000fb000000fc000000fd000000fe000000ff00000100000001010000010200 *0001030000010400000105000001060000010700000108000001090000010a0000010b0000010c *0000010d0000010e0000010f000001100000011100000112000001130000011400000115000001 *160000011700000118000001190000011a0000011b0000011c0000011d0000011e0000011f0000 *012000000121000001220000012300000124000001250000012600000127000001280000012900 *00012a0000012b0000012c0000012d0000012e0000012f00000130000001310000013200000133 *0000013400000135000001360000013700000138000001390000013a0000013b0000013c000001 *3d0000013e0000013f000001400000014100000142000001430000014400000145000001460000 *014700000148000001490000014a0000014b0000014c0000014d0000014e0000014f0000015000 *000151000001520000015300000154000001550000015600000157000001580000000000000000 *0002c30000000000000011030000001b0000000000000011010000001b00000000000000110000 *00001c0000000000000011000000001d0000000000000011000000001e00000000000000020300 *00001f0000000000000002010000001f0000000000000002000000002000000000000000020300 *000021000000000000000200000000220000000000000002030000002300000000000000020100 *000023000000000000000203000000240000000000000002030000002500000000000000020100 *000026000000000000000201000000270000000000000002000000002800000000000000020100 *0000290000000000000002030000002a0000000000000002000000002b00000000000000020000 *00002c0000000000000002000000002d0000000000000002000000002e00000000000000020000 *00002f000000000000000200000000300000000000000002000000003100000000000000020000 *000032000000000000000200000000330000000000000002000000003400000000000000020000 *000035000000000000000200000000360000000000000002000000003700000000000000020000 *000038000000000000000200000000390000000000000002000000003a00000000000000020000 *00003b0000000000000002000000003c0000000000000002000000003d00000000000000020000 *00003e0000000000000002000000003f0000000000000002000000004000000000000000020000 *000041000000000000000200000000420000000000000002000000004300000000000000020000 *000044000000000000000200000000450000000000000002000000004600000000000000020000 *000047000000000000000200000000480000000000000002000000004900000000000000030300 *00004a0000000000000003000000004b0000000000000003030000004c00000000000000030000 *00004d0000000000000003030000004e0000000000000003010000004e00000000000000030000 *00004f000000000000000300000000500000000000000003000000005100000000000000030000 *000052000000000000000300000000530000000000000003000000005400000000000000030000 *000055000000000000000300000000560000000000000003000000005700000000000000030000 *000058000000000000000300000000590000000000000003000000005a00000000000000030000 *00005b0000000000000004030000005c0000000000000004010000005c00000000000000040000 *00005d0000000000000004000000005e0000000000000004000000005f00000000000000040000 *000060000000000000000400000000610000000000000004000000006200000000000000040000 *000063000000000000000400000000640000000000000004000000006500000000000000040000 *000066000000000000000400000000670000000000000004000000006800000000000000040000 *0000690000000000000004000000006a0000000000000001030000006b00000000000000010100 *00006c0000000000000001030000006d0000000000000001010000006d00000000000000010000 *00006e0000000000000001000000006f0000000000000001000000007000000000000000010000 *000071000000000000000100000000720000000000000001000000007300000000000000010000 *000074000000000000000100000000750000000000000001000000007600000000000000010000 *000077000000000000000103000000780000000000000001010000007900000000000000010000 *00007a0000000000000001000000007b0000000000000001000000007c00000000000000010100 *0000780000000000000001000000007d0000000000000001000000007e00000000000000010000 *00007f000000000000000100000000800000000000000001000000008100000000000000010300 *000082000000000000000103000000830000000000000001010000008300000000000000010000 *000084000000000000000100000000850000000000000001000000008600000000000000010300 *000087000000000000000101000000870000000000000001000000008800000000000000010300 *0000890000000000000001030000008a0000000000000001010000008a00000000000000010000 *00008b0000000000000001000000008c0000000000000001030000008d00000000000000010100 *00008e0000000000000001010000008f0000000000000001010000009000000000000000010100 *000091000000000000000101000000920000000000000001010000009300000000000000010100 *000094000000000000000101000000950000000000000001030000009600000000000000010100 *000096000000000000000100000000970000000000000001000000009800000000000000010300 *000099000000000000000101000000990000000000000001000000009a00000000000000010000 *00009b0000000000000001000000009c0000000000000001000000009d00000000000000010000 *00009e0000000000000001000000009f000000000000000100000000a000000000000000010000 *0000a1000000000000000100000000a2000000000000000100000000a300000000000000010000 *0000a4000000000000000100000000a5000000000000000100000000a600000000000000010000 *0000a7000000000000000100000000a8000000000000000100000000a900000000000000010000 *0000aa000000000000000100000000ab000000000000000100000000ac00000000000000010000 *0000ad000000000000000100000000ae000000000000000100000000af00000000000000050300 *0000b0000000000000000500000000b1000000000000000500000000b200000000000000050000 *0000b3000000000000000500000000b4000000000000000500000000b500000000000000050000 *0000b6000000000000000500000000b7000000000000000500000000b800000000000000050000 *0000b9000000000000000500000000ba000000000000001800000000bb00000000000000180000 *0000bc000000000000001800000000bd000000000000001900000000be00000000000000190000 *0000bf000000000000001900000000c0000000000000000700000000c100000000000000070000 *0000c2000000000000000700000000c3000000000000000803000000c400000000000000080300 *0000c5000000000000000803000000c6000000000000000800000000c700000000000000080000 *0000c8000000000000000800000000c9000000000000000800000000ca00000000000000080000 *0000cb000000000000000800000000cc000000000000000800000000cd00000000000000080000 *0000ce000000000000000800000000cf000000000000000903000000d000000000000000090000 *0000d1000000000000000900000000d2000000000000000900000000d300000000000000090300 *0000d4000000000000000900000000d5000000000000000903000000d600000000000000090300 *0000d7000000000000000900000000d8000000000000000903000000d900000000000000090000 *0000da000000000000000903000000db000000000000000903000000dc00000000000000090100 *0000dc000000000000000900000000dd000000000000000903000000de00000000000000090000 *0000df000000000000000900000000e0000000000000000900000000e100000000000000090300 *0000e2000000000000000901000000e2000000000000000900000000e300000000000000090300 *0000e4000000000000000903000000e5000000000000000901000000e600000000000000090100 *0000e7000000000000000903000000e8000000000000000900000000e900000000000000090000 *0000ea000000000000000903000000eb000000000000000901000000eb00000000000000090000 *0000ec000000000000000903000000ed000000000000000903000000ee00000000000000090000 *0000ef000000000000000900000000f0000000000000000900000000f100000000000000090000 *0000f2000000000000000900000000f3000000000000000900000000f400000000000000090000 *0000f5000000000000000900000000f6000000000000000900000000f700000000000000090000 *0000f800000000000000090000000058000000000000000900000000f900000000000000090000 *0000fa000000000000000900000000fb000000000000000900000000fc00000000000000090000 *0000fd000000000000000900000000fe000000000000000900000000ff00000000000000090000 *000100000000000000000900000001010000000000000009000000010200000000000000090000 *000103000000000000000900000001040000000000000009000000010500000000000000090000 *000106000000000000000900000001070000000000000009000000010800000000000000090000 *0001090000000000000009000000010a0000000000000009000000010b00000000000000090000 *00010c0000000000000009000000010d0000000000000009000000010e00000000000000090000 *00010f000000000000000900000001100000000000000009000000005000000000000000090000 *000111000000000000000900000001120000000000000009000000011300000000000000090000 *000114000000000000000900000001150000000000000009000000011600000000000000090000 *000117000000000000000900000001180000000000000009000000011900000000000000090000 *00011a0000000000000009000000011b0000000000000009000000011c00000000000000090000 *00011d0000000000000009000000011e0000000000000009000000011f00000000000000090000 *000120000000000000000900000001210000000000000009000000012200000000000000090000 *000123000000000000000900000001240000000000000009000000012500000000000000090000 *000126000000000000000900000001270000000000000009000000012800000000000000090000 *0001290000000000000009000000012a0000000000000009000000012b00000000000000090000 *00012c0000000000000009000000012d0000000000000009000000012e00000000000000090000 *00012f000000000000000900000001300000000000000009000000013100000000000000090000 *000132000000000000000900000001330000000000000009000000013400000000000000090000 *000135000000000000000900000001360000000000000009000000013700000000000000090000 *000138000000000000000900000001390000000000000009000000013a00000000000000090000 *00013b0000000000000009000000013c0000000000000009000000013d00000000000000090000 *00013e0000000000000009000000013f0000000000000009000000014000000000000000090000 *000141000000000000000900000001420000000000000009000000014300000000000000090000 *0001440000000000000009000000014500000000000000090000000146000000000000000a0300 *000147000000000000000a0000000148000000000000000a0000000149000000000000000a0000 *00014a000000000000000a000000014b000000000000000a000000014c000000000000000a0000 *00014d000000000000000a000000014e000000000000000a000000014f000000000000000a0000 *000150000000000000000a0000000151000000000000000a0000000152000000000000000a0000 *000153000000000000000a0000000154000000000000000a0000000155000000000000000a0000 *000156000000000000000a0000000157000000000000000a0000000158000000000000000a0000 *000159000000000000000a000000015a000000000000000a000000015b000000000000000a0000 *00015c000000000000000a000000015d000000000000000a000000015e000000000000000a0000 *00015f000000000000000b0000000160000000000000000b0000000161000000000000000b0000 *000162000000000000000c0000000163000000000000000c0000000164000000000000000c0000 *000165000000000000000c0000000166000000000000000d0000000167000000000000000e0000 *000168000000000000000f0300000169000000000000000f0100000169000000000000000f0000 *00016a000000000000000f000000016b000000000000000f000000016c000000000000000f0000 *00016d000000000000000f000000016e000000000000000f000000016f00000170000001710000 *000172000000000000001000000001730000000000000010000000017400000000000000100000 *000175000000000000001000000001760000000000000010000000017700000000000000100000 *000178000000000000001000000001790000000000000010000000017a00000000000000100000 *00017b0000000000000010000000017c0000000000000010000000017d00000000000000110300 *00017e0000000000000011010000017e0000000000000011030000017f00000000000000110100 *00017f000001800000018103000001820000000000000011000000018300000000000000110300 *000184000000000000001100000001850000000000000011000000018600000000000000110000 *000187000000000000001100000001880000000000000011000000018900000000000000110000 *00018a0000000000000011000000018b0000000000000011000000018c000001800000018d0000 *00018e0000000000000011000000018f0000000000000011000000019000000000000000110000 *000191000000000000001100000001920000000000000011000000019300000000000000110000 *000194000000000000001100000001950000000000000011000000019600000000000000110000 *000197000000000000001100000001980000000000000011000000019900000000000000110000 *00019a0000000000000011000000019b0000000000000011000000019c00000000000000110000 *00019d0000000000000011000000019e0000000000000011000000019f00000000000000110000 *0001a0000000000000001100000001a1000000000000001100000001a200000000000000110000 *0001a3000000000000001100000001a4000000000000001200000001a500000000000000120000 *0001a6000000000000001200000001a7000000000000001200000001a800000000000000130300 *0001a9000000000000001300000001aa000000000000001301000001ab00000000000000130300 *0001ac000000000000001300000001ad000000000000001300000001ae00000000000000130000 *0001af000000000000001300000001b0000000000000001303000001b100000000000000130300 *0001b2000000000000001301000001b3000000000000001301000001b400000000000000130100 *0001b5000000000000001301000001b6000000000000001300000001b700000000000000130000 *0001b8000000000000001300000001b9000000000000001403000001ba00000000000000140100 *0001bb000000000000001401000001bc000000000000001400000001bd00000000000000140000 *0001be000000000000001400000001bf000000000000001400000001c000000000000000140300 *0001c1000000000000001401000001c2000000000000001400000001c300000000000000140000 *0001c4000000000000001400000001c5000000000000001400000001c600000000000000150300 *0001c7000000000000001501000001c8000000000000001501000001c900000000000000150100 *0001ca000000000000001501000001cb000000000000001501000001cc00000000000000150300 *00007800000000000000150100000078000000000000001500000001cd00000000000000150000 *0001ce000000000000001500000001cf000000000000001500000001d000000000000000150300 *0001d1000000000000001503000001d2000000000000001503000001d300000000000000150300 *00006d0000000000000015010000006d000000000000001500000001d400000180000001d50000 *0001d60000000000000015000000006e0000000000000015000000007500000000000000150000 *000076000000000000001503000001d70000000000000015010000009100000000000000150100 *0000900000000000000015010000008f0000000000000015010000009300000000000000150100 *000095000000000000001501000000920000000000000015010000009400000000000000150300 *0001d8000000000000001500000001d9000000000000001500000001da00000000000000150300 *0001db000000000000001501000001dc000000000000001501000001dd00000000000000150100 *0001de000000000000001501000001df000000000000001501000001e000000000000000150100 *0001e1000000000000001501000001e2000000000000001501000001e300000000000000150100 *0001e4000000000000001501000001e5000000000000001501000001e600000000000000150100 *0001e7000000000000001501000001e8000000000000001501000001e900000000000000150100 *0001ea000000000000001501000001eb000000000000001501000001ec00000000000000150100 *0001ed000000000000001501000001ee000000000000001501000001ef00000000000000150100 *0001f0000000000000001501000001f1000000000000001501000001f200000000000000150100 *0001f3000000000000001501000001f4000000000000001501000001f500000000000000150100 *0001f6000000000000001501000001f7000000000000001501000001f800000000000000150100 *0001f9000000000000001501000001fa000000000000001501000001fb00000000000000150100 *0001fc000000000000001501000001fd000000000000001501000001fe00000000000000150100 *0001ff000000000000001501000002000000000000000015010000020100000000000000150100 *000202000000000000001501000002030000000000000015010000020400000000000000150100 *000205000000000000001501000002060000000000000015010000020700000000000000150100 *000208000000000000001501000002090000000000000015010000020a00000000000000150100 *00020b0000000000000015010000020c0000000000000015010000020d00000000000000150300 *000184000000000000001501000001840000000000000015000000020e00000000000000150000 *00020f000000000000001500000002100000000000000015000000021100000000000000150000 *000212000000000000001500000002130000000000000015000000021400000000000000150000 *000215000000000000001500000002160000000000000015000000021700000000000000150000 *000218000000000000001500000002190000000000000015000000021a00000000000000150000 *00021b0000000000000015000000021c0000000000000015000000021d00000000000000150000 *00021e000000000000001500000001860000000000000015000000021f00000000000000150000 *00022000000000000000150000000221000000000000001500000000fb00000000000000150000 *000222000000000000001500000002230000000000000015000000022400000000000000150000 *000225000000000000001500000002260000000000000015000000022700000000000000150000 *000228000000000000001500000002290000000000000015000000022a00000000000000150000 *00022b0000000000000015000000022c0000000000000015000000022d00000000000000150000 *00022e0000000000000015000000022f0000000000000015000000023000000000000000150000 *000231000000000000001600000002320000000000000016000000023300000000000000160000 *000234000000000000001600000002350000000000000016000000023600000000000000160000 *000237000000000000001600000002380000000000000016000000023900000000000000160000 *00023a0000000000000016000000023b0000000000000017030000023c00000000000000170100 *00023c0000000000000017030000023d0000000000000017010000023d00000000000000170000 *00023e000001700000023f03000002400000000000000017000000024100000180000002420300 *000243000000000000001700000002440000000000000017000000024500000000000000170000 *000246000001800000024701000002480000000000000017000000024900000000000000170000 *00024a0000000000000017000000024b0000000000000017000000024c00000000000000170000 *00024d0000000000000017000000024e0000000000000017000000024f00000000000000170000 *000250000000000000001700000002510000000000000017000000025200000000000000170000 *000253000000000000001700000002540000000000000004000000025500000000000000040000 *000256000000000000000103000001d80000000000000001000000025700000000000000010000 *000258000000000000000100000002590000000000000001000000025a00000000000000010000 *00025b0000000000000001000000025c0000000000000001000000025d00000000000000010000 *00025e0000000000000001000000025f0000000000000001000000026000000000000000010000 *000261000001800000026203000002630000000000000018000000026400000000000000180000 *000265000000000000001800000002660000000000000018000000026700000000000000180000 *000268000000000000001800000002690000000000000018000000026a00000000000000180000 *00026b0000000000000018000000026c0000000000000018000000026d00000000000000180000 *00026e0000000000000018000000010b0000000000000018000000026f00000000000000180000 *000270000000000000001800000002710000000000000018000000027200000000000000180000 *000232000000000000001800000002730000000000000018000000027400000000000000180000 *000275000000000000001800000002600000000000000018000000027600000000000000180000 *00025f000000000000001800000002770000000000000018000000027800000000000000180000 *0002790000000000000018000000027a0000000000000018000000027b00000000000000180000 *00027c0000000000000018000000027d0000000000000018000000027e00000000000000180000 *00027f000000000000001800000002800000000000000018000000028100000000000000180000 *000282000000000000001900000002830000000000000008000000028400000000000000080100 *000285000000000000000801000002860000000000000008000000028700000000000000080000 *000288000000000000000800000002890000000000000008000000028a000001800000018d0300 *00028b0000000000000008000000028c0000000000000008000000028d00000000000000080000 *00028e0000000000000008000000028f0000000000000008000000029000000000000000080000 *000291000000000000000800000002920000000000000009030000029300000000000000090000 *00029400000295000002960000000297000001800000018d030000029800000180000002470300 *000299000001800000029a000000029b0000018000000247010000029c000001800000029d0300 *00029e000001800000029f01000002a0000001800000029f03000002a0000001800000029f0100 *0002a1000001800000029f03000002a1000001800000029f03000002a2000002a3000002a40100 *0002a5000002a3000002a403000002a5000002a3000002a601000002a7000002a3000002a60300 *0002a7000002a3000002a800000002a9000002a3000002a800000002aa00000000000000090000 *0002ab000000000000000900000002ac000001800000029f00000002ad00000000000000090000 *0002ae00000180000002af03000002b0000001800000029a00000002b100000180000002b20300 *0002b3000000000000000900000002b4000000000000000900000002b500000000000000090000 *0002b6000000000000000900000002b7000000000000000900000002b800000000000000090000 *0002b9000000000000000a00000002ba000000000000000a00000002bb000000000000000a0000 *0002bc000002bd000002be00000002bf000000000000000c00000002c0000000000000000c0000 *0002c1000000000000000c00000002c2000000000000000c00000002c300000000000002c40000 *00000000001668617070737461636b2d7365727665722d302e352e30000000000000001b486170 *70737461636b2e5365727665722e485454502e5479706573000000000000001948617070737461 *636b2e5365727665722e4d696e4861584d4c000000000000001548617070737461636b2e536572 *7665722e53555249000000000000001748617070737461636b2e5365727665722e436f6f6b6965 *000000000000001c48617070737461636b2e5365727665722e4d65737361676557726170000000 *000000001e48617070737461636b2e5365727665722e485454502e4c6f774c6576656c00000000 *0000001c48617070737461636b2e5365727665722e485454502e436c69656e7400000000000000 *1548617070737461636b2e5365727665722e58534c54000000000000001b48617070737461636b *2e5365727665722e53696d706c6548545450000000000000001f48617070737461636b2e536572 *7665722e485454502e46696c655365727665000000000000001a48617070737461636b2e536572 *7665722e537464436f6e666967000000000000001648617070737461636b2e5365727665722e50 *61727473000000000000001e48617070737461636b2e5365727665722e485454502e536f636b65 *745448000000000000001c48617070737461636b2e5365727665722e485454502e536f636b6574 *000000000000001f48617070737461636b2e5365727665722e485454502e4c617a794c696e6572 *000000000000001e48617070737461636b2e5365727665722e535552492e506172736555524900 *0000000000002348617070737461636b2e5365727665722e485454502e52464338323248656164 *657273000000000000001b48617070737461636b2e5365727665722e485454502e436c6f636b00 *0000000000002248617070737461636b2e5365727665722e48545450436c69656e742e53747265 *616d000000000000001f48617070737461636b2e5365727665722e48545450436c69656e742e54 *4350000000000000002048617070737461636b2e5365727665722e48545450436c69656e742e48 *545450000000000000001650617468735f68617070737461636b5f736572766572000000000000 *001f48617070737461636b2e5365727665722e485454502e4d756c746970617274000000000000 *001d48617070737461636b2e5365727665722e485454502e48616e646c6572000000000000001c *48617070737461636b2e5365727665722e485454502e4c697374656e0000000000000010486170 *70737461636b2e536572766572000000000000000b436f6e74656e745479706500000000000000 *066374547970650000000000000009637453756274797065000000000000000c6374506172616d *65746572730000000000000008456c537472696e670000000000000008656c537472696e670000 *000000000009546f456c656d656e740000000000000009746f456c656d656e7400000000000000 *03584d4c0000000000000007456c656d656e74000000000000000a5374796c6553686565740000 *00000000000358534c000000000000000343535300000000000000087374796c6555524c000000 *00000000074e6f5374796c6500000000000000085374796c6555524c000000000000000b686173 *5374796c6555524c000000000000000569734353530000000000000005697358534c0000000000 *0000017400000000000000016c00000000000000016500000000000000033c2f3c000000000000 *00023c3e0000000000000007786d6c456c656d000000000000000874657874456c656d00000000 *00000009656d707479456c656d00000000000000086c697374456c656d00000000000000096364 *617461456c656d000000000000000c73696d706c65446f634f6c64000000000000000973696d70 *6c65446f63000000000000000a73696d706c65446f6327000000000000000a786d6c4573636170 *6572000000000000000c786d6c537464457363617065000000000000000676657262696d000000 *000000000c73696d706c6550726f6c6f6700000000000000086e6f6e456d707479000000000000 *0007676574526f6f74000000000000000877726170456c656d0000000000000003656c46000000 *000000000561747472460000000000000006617474724653000000000000000761747472464d62 *000000000000000871756f74654573630000000000000007726563546f456c0000000000000008 *6c697374546f456c0000000000000007746f4174747273000000000000000846726f6d50617468 *000000000000000866726f6d506174680000000000000006546f53555249000000000000000674 *6f5355524900000000000000045355524900000000000000047375726900000000000000047061 *7468000000000000000571756572790000000000000006736368656d650000000000000008755f *736368656d650000000000000006755f706174680000000000000008615f736368656d65000000 *0000000006615f706174680000000000000008756e457363617065000000000000000665736361 *706500000000000000056973416273000000000000000672656e64657200000000000000057061 *7273650000000000000006436f6f6b6965000000000000000d636f6f6b696556657273696f6e00 *0000000000000a636f6f6b696550617468000000000000000c636f6f6b6965446f6d61696e0000 *00000000000a636f6f6b69654e616d65000000000000000b636f6f6b696556616c756500000000 *0000000673656375726500000000000000086d6b436f6f6b6965000000000000000e6d6b436f6f *6b6965486561646572000000000000000c7061727365436f6f6b696573000000000000000d636f *6f6b696573506172736572000000000000000a676574436f6f6b69657300000000000000096765 *74436f6f6b6965000000000000000b676574436f6f6b69657327000000000000000a676574436f *6f6b69652700000000000000065271426f64790000000000000004426f64790000000000000007 *52657175657374000000000000000872714d6574686f6400000000000000077271506174687300 *00000000000005727155726900000000000000077271517565727900000000000000087271496e *7075747300000000000000097271436f6f6b6965730000000000000009727156657273696f6e00 *0000000000000972714865616465727300000000000000067271426f6479000000000000000672 *71506565720000000000000008526573706f6e7365000000000000000853656e6446696c650000 *00000000000a736646696c6550617468000000000000000873664f666673657400000000000000 *077366436f756e7400000000000000067273436f64650000000000000009727348656164657273 *00000000000000077273466c61677300000000000000067273426f6479000000000000000b7273 *56616c696461746f720000000000000004486f73740000000000000005496e7075740000000000 *00000a696e70757456616c7565000000000000000d696e70757446696c656e616d650000000000 *000010696e707574436f6e74656e745479706500000000000000075273466c6167730000000000 *000010727366436f6e74656e744c656e6774680000000000000007486561646572730000000000 *00000a486561646572506169720000000000000005684e616d6500000000000000066856616c75 *6500000000000000064d6574686f640000000000000007434f4e4e45435400000000000000074f *5054494f4e5300000000000000055452414345000000000000000644454c455445000000000000 *00035055540000000000000004504f535400000000000000044845414400000000000000034745 *540000000000000004436f6e660000000000000004706f7274000000000000000976616c696461 *746f72000000000000000756657273696f6e000000000000000c636f6e74696e75654854545000 *000000000000086e756c6c436f6e66000000000000000b6e756c6c5273466c6167730000000000 *00000f6e6f436f6e74656e744c656e6774680000000000000005727155524c0000000000000009 *7365745273436f646500000000000000096d6b4865616465727300000000000000096765744865 *61646572000000000000000b6765744865616465724253000000000000000f6765744865616465 *72556e736166650000000000000009686173486561646572000000000000000b68617348656164 *65724253000000000000000f686173486561646572556e73616665000000000000000973657448 *6561646572000000000000000b7365744865616465724253000000000000000f73657448656164 *6572556e736166650000000000000009616464486561646572000000000000000b616464486561 *6465724253000000000000000f616464486561646572556e736166650000000000000006726573 *756c740000000000000008726573756c7442530000000000000008726564697265637400000000 *0000000a52656164537472696e67000000000000000a72656164537472696e6700000000000000 *0a7175657279496e7075740000000000000009626f6479496e707574000000000000000a666f72 *6d4465636f6465000000000000000a6465636f6465426f6479000000000000000f6d756c746970 *6172744465636f6465000000000000000f626f647950617274546f496e70757400000000000000 *0b73696d706c65496e707574000000000000001064656661756c74496e70757454797065000000 *000000000770617468456c73000000000000000772657175657374000000000000000d70617273 *65526573706f6e7365000000000000000a7075745265717565737400000000000000086c697374 *656e4f6e00000000000000066c697374656e00000000000000076c697374656e27000000000000 *000b676574526573706f6e73650000000000000009756e70726f78696679000000000000000a75 *6e7270726f78696679000000000000000758534c50617468000000000000000b58534c54436f6d *6d616e64000000000000000758534c54436d64000000000000000878736c74456c656d00000000 *0000000970726f634c4253494f000000000000000970726f63465053494f000000000000000778 *736c74465053000000000000000978736c74465053494f000000000000000a78736c7453747269 *6e67000000000000000878736c7446696c65000000000000000878736c7470726f630000000000 *0000057361786f6e0000000000000009546f4d657373616765000000000000000d746f436f6e74 *656e74547970650000000000000009746f4d657373616765000000000000000a746f526573706f *6e7365000000000000000846726f6d44617461000000000000000866726f6d4461746100000000 *00000006527144617461000000000000000a46726f6d526571555249000000000000000a66726f *6d52657155524900000000000000085765624d6f6e6164000000000000000a66696e6973685769 *74680000000000000006556e576562540000000000000004576562540000000000000006756e57 *656254000000000000000b46696c7465724d6f6e6164000000000000000973657446696c746572 *000000000000000d636f6d706f736546696c746572000000000000000967657446696c74657200 *0000000000000746696c746572540000000000000009756e46696c746572540000000000000009 *46696c74657246756e0000000000000009536574417070656e640000000000000006417070656e *640000000000000003536574000000000000000b5365727665724d6f6e61640000000000000005 *61736b527100000000000000076c6f63616c5271000000000000000b5365727665725061727454 *000000000000000d756e5365727665725061727454000000000000000a53657276657250617274 *0000000000000003576562000000000000000e72756e5365727665725061727454000000000000 *000b7769746852657175657374000000000000000e6d6170536572766572506172745400000000 *0000000f6d617053657276657250617274542700000000000000086e6f48616e646c6500000000 *0000000772756e576562540000000000000008756e756e5765625400000000000000066d6b5765 *625400000000000000076d617057656254000000000000000d69676e6f726546696c7465727300 *0000000000000765736361706527000000000000000b7061727365436f6e666967000000000000 *000a73696d706c6548545450000000000000000b73696d706c654854545027000000000000000c *73696d706c65485454502727000000000000001473696d706c654854545057697468536f636b65 *74000000000000001573696d706c654854545057697468536f636b657427000000000000000862 *696e64506f7274000000000000000c746f526573706f6e736542530000000000000007666c6174 *74656e000000000000000c6c6f63616c436f6e74657874000000000000000a6765744865616465 *724d000000000000000a6164644865616465724d000000000000000a7365744865616465724d00 *000000000000076775617264527100000000000000076d6574686f644d000000000000000a6d65 *74686f644f6e6c7900000000000000086d6574686f64535000000000000000066d6574686f6400 *000000000000076e756c6c44697200000000000000036469720000000000000004646972730000 *000000000004686f7374000000000000000877697468486f737400000000000000077572695265 *73740000000000000007616e79506174680000000000000008616e795061746827000000000000 *000d747261696c696e67536c617368000000000000000967657444617461466e00000000000000 *076765744461746100000000000000087769746844617461000000000000000a77697468446174 *61466e000000000000000a70726f78795365727665000000000000000b7270726f787953657276 *650000000000000007726571756972650000000000000008726571756972654d00000000000000 *0478736c740000000000000006646f58736c74000000000000000e6d6f64696679526573706f6e *7365000000000000000f736574526573706f6e7365436f64650000000000000009616464436f6f *6b6965000000000000000a616464436f6f6b696573000000000000000c657870697265436f6f6b *6965000000000000000f69664d6f64696669656453696e636500000000000000026f6b00000000 *00000013696e7465726e616c5365727665724572726f72000000000000000a6261644761746577 *6179000000000000000a62616452657175657374000000000000000c756e617574686f72697a65 *640000000000000009666f7262696464656e00000000000000086e6f74466f756e640000000000 *0000087365654f746865720000000000000005666f756e6400000000000000106d6f7665645065 *726d616e656e746c79000000000000000c74656d70526564697265637400000000000000056d75 *6c7469000000000000000b646562756746696c746572000000000000000a616e79526571756573 *74000000000000000c6170706c7952657175657374000000000000000962617369634175746800 *000000000000096c6f6f6b496e70757400000000000000066c6f6f6b425300000000000000046c *6f6f6b000000000000000a6c6f6f6b436f6f6b6965000000000000000f6c6f6f6b436f6f6b6965 *56616c7565000000000000000f72656164436f6f6b696556616c756500000000000000086c6f6f *6b5265616400000000000000096c6f6f6b5061697273000000000000000e6572726f7248616e64 *6c65725350000000000000001273696d706c654572726f7248616e646c6572000000000000000e *7370556e777261704572726f7254000000000000000c73657456616c696461746f720000000000 *00000e73657456616c696461746f725350000000000000000c76616c6964617465436f6e660000 *00000000000c72756e56616c696461746f72000000000000001077646748544d4c56616c696461 *746f72000000000000000d6e6f6f7056616c696461746f7200000000000000116c617a7950726f *6356616c696461746f7200000000000000074d696d654d6170000000000000000c6572726f7277 *72617070657200000000000000096d696d65547970657300000000000000106775657373436f6e *74656e745479706500000000000000116775657373436f6e74656e74547970654d000000000000 *000d6173436f6e74656e7454797065000000000000000e64656661756c74497846696c65730000 *00000000000d626c6f636b446f7446696c657300000000000000056973446f7400000000000000 *1073656e6446696c65526573706f6e736500000000000000166c617a7942797465537472696e67 *526573706f6e7365000000000000001873747269637442797465537472696e67526573706f6e73 *65000000000000001066696c655061746853656e6446696c65000000000000000c66696c655061 *74684c617a79000000000000000e66696c6550617468537472696374000000000000000e736572 *766546696c655573696e670000000000000009736572766546696c65000000000000000a66696c *65536572766527000000000000000966696c655365727665000000000000000d66696c65536572 *76654c617a79000000000000000f66696c6553657276655374726963740000000000000007646f *496e646578000000000000000b646f496e6465784c617a79000000000000000d646f496e646578 *5374726963740000000000000008646f496e64657827000000000000000e62696e6172796c6f63 *6174696f6e000000000000000b6c6f676c6f636174696f6e000000000000000765727257726170 *0000000000000018636f6d70726573736564526573706f6e736546696c74657200000000000000 *0a677a697046696c746572000000000000000d6465666c61746546696c74657200000000000000 *09656e636f64696e6773000000000000000c737570706f72747349507636000000000000000a61 *63636570744c69746500000000000000044c617a79000000000000000e6e65774c696e65724861 *6e646c65000000000000000b6865616465724c696e6573000000000000000e6765744279746573 *537472696374000000000000000867657442797465730000000000000007676574526573740000 *000000000008746f537472696374000000000000001262797465737472696e672d302e392e312e *350000000000000014446174612e42797465537472696e672e4c617a790000000000000008746f *4368756e6b73000000000000000b70617273655552495265660000000000000007706162737572 *69000000000000000a70617574686f72697479000000000000000a7061757468696e6e65720000 *0000000000097061757468706f7274000000000000000770757269726566000000000000000670 *7175657279000000000000000970667261676d656e74000000000000000a756e73616665546169 *6c000000000000000a756e7361666548656164000000000000000b756e73616665496e64657800 *00000000000012436f6e74656e74446973706f736974696f6e0000000000000017436f6e74656e *745472616e73666572456e636f64696e6700000000000000046261736500000000000000084748 *432e53686f77000000000000000453686f77000000000000000f73686f77436f6e74656e745479 *706500000000000000064865616465720000000000000008704865616465727300000000000000 *0c706172736548656164657273000000000000000770486561646572000000000000000e657874 *72614669656c644c696e65000000000000000e73686f77506172616d6574657273000000000000 *000b705f706172616d65746572000000000000000c70436f6e74656e7454797065000000000000 *00107061727365436f6e74656e745479706500000000000000084748432e426173650000000000 *0000046661696c000000000000000e676574436f6e74656e745479706500000000000000187043 *6f6e74656e745472616e73666572456e636f64696e67000000000000001c7061727365436f6e74 *656e745472616e73666572456e636f64696e67000000000000001a676574436f6e74656e745472 *616e73666572456e636f64696e67000000000000001370436f6e74656e74446973706f73697469 *6f6e00000000000000177061727365436f6e74656e74446973706f736974696f6e000000000000 *0015676574436f6e74656e74446973706f736974696f6e000000000000000670617273654d0000 *0000000000076c6f6f6b75704d000000000000000377733100000000000000066c6578656d6500 *0000000000000463724c66000000000000000a6c696e65537472696e67000000000000000d6c69 *746572616c537472696e67000000000000001262756767794c69746572616c537472696e670000 *00000000000e6865616465724e616d65436861720000000000000009657370656369616c730000 *000000000009746f6b656e636861720000000000000007705f746f6b656e000000000000000a74 *6578745f63686172730000000000000006705f74657874000000000000000b71756f7465645f70 *61697200000000000000066d6b54696d650000000000000005636c6f636b000000000000000775 *7064617465720000000000000012676574417070726f78696d61746554696d6500000000000000 *054465627567000000000000000b646562756753747265616d0000000000000003446267000000 *000000000653747265616d0000000000000008726561644c696e65000000000000000972656164 *426c6f636b000000000000000a7772697465426c6f636b0000000000000005636c6f7365000000 *0000000006526573756c740000000000000009436f6e6e4572726f720000000000000009457272 *6f724d697363000000000000000a4572726f725061727365000000000000000b4572726f72436c *6f736564000000000000000a4572726f725265736574000000000000000562696e644500000000 *0000001168616e646c65536f636b65744572726f7200000000000000066d797265637600000000 *00000004436f6e6e000000000000000a436f6e6e436c6f73656400000000000000064d6b436f6e *6e0000000000000008636f6e6e536f636b0000000000000008636f6e6e41646472000000000000 *0008636f6e6e426666720000000000000008636f6e6e486f7374000000000000000a436f6e6e65 *6374696f6e0000000000000007436f6e6e52656600000000000000066765745265660000000000 *0000076f70656e544350000000000000000b6f70656e544350506f7274000000000000000d6973 *436f6e6e6563746564546f00000000000000094265686176696f7572000000000000000b446965 *486f727269626c79000000000000000c457870656374456e746974790000000000000004446f6e *65000000000000000552657472790000000000000008436f6e74696e7565000000000000000772 *7370436f64650000000000000009727370526561736f6e000000000000000a7273704865616465 *72730000000000000007727370426f6479000000000000000b5265717565737444617461000000 *000000000c526573706f6e736544617461000000000000000c526573706f6e7365436f64650000 *000000000005727155524900000000000000074748432e4e756d00000000000000012a00000000 *0000000d526571756573744d6574686f64000000000000000a4861734865616465727300000000 *0000000a67657448656164657273000000000000000a7365744865616465727300000000000000 *0a4865616465724e616d650000000000000009486472437573746f6d000000000000001a486472 *436f6e74656e745472616e73666572456e636f64696e67000000000000000f4864724c6173744d *6f646966696564000000000000000a486472457870697265730000000000000007486472455461 *67000000000000000e486472436f6e74656e7454797065000000000000000f486472436f6e7465 *6e7452616e6765000000000000000d486472436f6e74656e744d44350000000000000012486472 *436f6e74656e744c6f636174696f6e0000000000000010486472436f6e74656e744c656e677468 *0000000000000012486472436f6e74656e744c616e67756167650000000000000012486472436f *6e74656e74456e636f64696e67000000000000000e486472436f6e74656e744261736500000000 *00000008486472416c6c6f77000000000000001248647257575741757468656e74696361746500 *0000000000000a4864725761726e696e6700000000000000074864725661727900000000000000 *0c486472536574436f6f6b69650000000000000009486472536572766572000000000000000d48 *64725265747279416674657200000000000000094864725075626c696300000000000000144864 *7250726f787941757468656e746963617465000000000000000b4864724c6f636174696f6e0000 *000000000006486472416765000000000000000c486472557365724167656e7400000000000000 *0a48647252656665726572000000000000000848647252616e6765000000000000001548647250 *726f7879417574686f72697a6174696f6e000000000000000e4864724d6178466f727761726473 *00000000000000144864724966556e6d6f64696669656453696e6365000000000000000a486472 *496652616e6765000000000000000e48647249664e6f6e654d61746368000000000000000a4864 *7249664d61746368000000000000001248647249664d6f64696669656453696e63650000000000 *000007486472486f7374000000000000000748647246726f6d0000000000000009486472457870 *6563740000000000000009486472436f6f6b69650000000000000010486472417574686f72697a *6174696f6e00000000000000114864724163636570744c616e6775616765000000000000001148 *6472416363657074456e636f64696e670000000000000010486472416363657074436861727365 *740000000000000009486472416363657074000000000000000648647256696100000000000000 *0a4864725570677261646500000000000000134864725472616e73666572456e636f64696e6700 *00000000000009486472507261676d61000000000000000748647244617465000000000000000d *486472436f6e6e656374696f6e000000000000000f4864724361636865436f6e74726f6c000000 *00000000056465627567000000000000000b687474704c6f6746696c6500000000000000047472 *696d000000000000000573706c6974000000000000000463726c66000000000000000273700000 *0000000000096865616465724d6170000000000000000c696e7365727448656164657200000000 *00000015696e7365727448656164657249664d697373696e67000000000000000d7265706c6163 *65486561646572000000000000000d696e7365727448656164657273000000000000000f726574 *726965766548656164657273000000000000000a66696e64486561646572000000000000000c6c *6f6f6b7570486561646572000000000000000b6874747056657273696f6e000000000000000b72 *714d6574686f644d6170000000000000000b706172736548656164657200000000000000107061 *727365526571756573744865616400000000000000117061727365526573706f6e736548656164 *000000000000000d6d61746368526573706f6e7365000000000000000b73696d706c6548545450 *5f000000000000000767657441757468000000000000000873656e644854545000000000000000 *1173656e6448545450506970656c696e6564000000000000000b72656365697665485454500000 *00000000000b726573706f6e6448545450000000000000000e6c696e6561725472616e73666572 *000000000000000f686f706566756c5472616e73666572000000000000000f6368756e6b656454 *72616e7366657200000000000000106368756e6b65645472616e73666572430000000000000011 *75676c7944656174685472616e73666572000000000000000e7265616454696c6c456d70747931 *000000000000000e7265616454696c6c456d70747932000000000000000975726c4465636f6465 *000000000000000975726c456e636f6465000000000000000d75726c456e636f64655661727300 *0000000000000776657273696f6e000000000000000662696e64697200000000000000066c6962 *646972000000000000000764617461646972000000000000000a6c696265786563646972000000 *000000000967657442696e44697200000000000000096765744c6962446972000000000000000a *67657444617461446972000000000000000d6765744c696265786563446972000000000000000f *6765744461746146696c654e616d650000000000000008426f6479506172740000000000000009 *4d756c746950617274000000000000001270617273654d756c746970617274426f647900000000 *0000001d446174612e42797465537472696e672e4c617a792e496e7465726e616c000000000000 *000a42797465537472696e670000000000000011684765744d756c746970617274426f64790000 *0000000000134748432e494f2e48616e646c652e5479706573000000000000000648616e646c65 *000000000000000d7061727365426f647950617274000000000000000a73706c69745061727473 *000000000000000c64726f70507265616d626c65000000000000000a446174612e4d6179626500 *000000000000074e6f7468696e67000000000000000f73706c69744174426f756e646172790000 *00000000000a6973426f756e6461727900000000000000076973436c6f73650000000000000010 *73746172747357697468446173686573000000000000000864726f704c696e6500000000000000 *1073706c69744174456d7074794c696e65000000000000000b73706c6974417443524c46000000 *000000000c73706c6974417443524c465f000000000000000866696e6443524c46000000000000 *000a66696e6443526f724c46000000000000000e7374617274735769746843524c460000000000 *00000864726f7043524c4600000000000000046663746c00000000000000036c6f770000000000 *00000d757064617465486561646572730000000000000007686561646572730000000000000009 *697348545450315f310000000000000009697348545450315f3000000000000000106765744865 *61646572556e7361666527000000000000000d636865636b486561646572425300000000000000 *11636865636b486561646572556e7361666500000000000000096c6f636174696f6e4300000000 *00000006636c6f736543000000000000000b636f6e6e656374696f6e43000000000000000a6b65 *6570616c6976654300000000000000084748432e52656164000000000000000452656164000000 *000000000d68476574436f6e74656e74734e000000000000000d68476574436f6e74656e747327 *0000000000000008726571756972656400000000000000117472616e73666572456e636f64696e *67430000000000000005726c6f6f70000000000000000d636f6e73756d654368756e6b73000000 *0000000011636f6e73756d654368756e6b73496d706c000000000000000663726c664c43000000 *00000000096c617a796c696e6573000000000000000b726571756573744c696e65000000000000 *000c726573706f6e73654c696e65000000000000000d7374617469634865616465727300000000 *000000127075744175676d656e746564526573756c74000000000000000e6175676d656e744865 *616465727300000000000000087076657273696f6e000000000000000668747470303900000000 *0000000668747470313000000000000000066874747031310000000000000010636f6e6e656374 *696f6e434c6f776572000000000000000a6b656570416c69766543000000000000000563726c66 *4300000000000000056673657043000000000000000c636f6e74656e7454797065430000000000 *00000e636f6e74656e744c656e67746843000000000000000e636f6e74656e746c656e67746843 *00000000000000056461746543000000000000000a64617465434c6f7765720000000000000007 *73657276657243000000000000000668617070734300000000000000097465787448746d6c4300 *0000000000000f726573706f6e73654d65737361676500000000000000046c6f67270000000000 *0000056c6f674d5800000000000000055361786f6e000000000000000858534c5450726f630000 *00000000000c636f6e7374725b615662495d000000000000000c636f6e7374725b6156624a5d00 *0000000000000e64617461547970655b615662485d000000000000000778736c74436d64000000 *0000000006537472696e67000000000000000978736c7470726f63270000000000000006736178 *6f6e27000000000000000a78736c7446696c654578000000000000000c7769746854656d704669 *6c65000000000000000e7265616446696c65537472696374000000000000000774656d70446972 *0000000000000006747279416e79000000000000000b4d617463684d6574686f64000000000000 *000b6d617463684d6574686f64000000000000001468617070737461636b2d7574696c2d302e35 *2e30000000000000001548617070737461636b2e5574696c2e436f6d6d6f6e0000000000000005 *726561644d00000000000000054d6f6e616400000000000000054d61796265000000000000000d *436f6e74726f6c2e4d6f6e616400000000000000056d7a65726f00000000000000044a75737400 *0000000000000b446174612e456974686572000000000000000645697468657200000000000000 *0b446174612e4d6f6e6f69640000000000000004456e646f00000000000000044475616c000000 *00000000064d6f6e6f6964000000000000000b6d746c2d312e312e302e32000000000000001443 *6f6e74726f6c2e4d6f6e61642e5265616465720000000000000007526561646572540000000000 *000013436f6e74726f6c2e4d6f6e61642e4572726f7200000000000000064572726f7254000000 *0000000019436f6e74726f6c2e4d6f6e61642e4572726f722e436c617373000000000000000a74 *68726f774572726f72000000000000000a63617463684572726f72000000000000000765787472 *616374000000000000000b756e46696c74657246756e00000000000000066d656d707479000000 *0000000002686f000000000000001553797374656d2e436f6e736f6c652e4765744f7074000000 *00000000084f7074446573637200000000000000046d73756d00000000000000064748432e494f *000000000000000846696c6550617468000000000000000b70726f787953657276652700000000 *0000000472657370000000000000000d6d6b4661696c4d65737361676500000000000000086661 *696c48746d6c000000000000000c657363617065537472696e67000000000000000c6e6f74466f *756e6448746d6c0000000000000008696f4572726f7273000000000000000c66696c654e6f7446 *6f756e640000000000000006676574457874000000000000001066696c65706174682d312e312e *302e33000000000000001553797374656d2e46696c65506174682e506f73697800000000000000 *0d74616b65457874656e73696f6e000000000000000c62657374456e636f64696e670000000000 *000013616c6c456e636f64696e6748616e646c657273000000000000000c616c6c456e636f6469 *6e6773000000000000000868616e646c657273 addfile ./docs/0.5.0/happstack-server/Happstack-Server-Cookie.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-Cookie.html 1 + + +Happstack.Server.Cookie
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.Cookie
    Synopsis
    data Cookie = Cookie {
    cookieVersion :: String
    cookiePath :: String
    cookieDomain :: String
    cookieName :: String
    cookieValue :: String
    secure :: Bool
    }
    mkCookie :: String -> String -> Cookie
    mkCookieHeader :: Seconds -> Cookie -> String
    getCookies :: Monad m => ByteString -> m [Cookie]
    getCookie :: Monad m => String -> ByteString -> m Cookie
    getCookies' :: Monad m => ByteString -> m (Either String [Cookie])
    getCookie' :: Monad m => String -> ByteString -> m (Either String Cookie)
    parseCookies :: String -> Either String [Cookie]
    cookiesParser :: GenParser Char st [Cookie]
    Documentation
    data Cookie Source
    Constructors
    Cookie
    cookieVersion :: String
    cookiePath :: String
    cookieDomain :: String
    cookieName :: String
    cookieValue :: String
    secure :: Bool
    mkCookie :: String -> String -> CookieSource
    Creates a cookie with a default version of 1 and path of / +
    mkCookieHeader :: Seconds -> Cookie -> StringSource
    Set a Cookie in the Result. + The values are escaped as per RFC 2109, but some browsers may + have buggy support for cookies containing e.g. '"' or ' '. +
    getCookies :: Monad m => ByteString -> m [Cookie]Source
    Get all cookies from the HTTP request. The cookies are ordered per RFC from + the most specific to the least specific. Multiple cookies with the same + name are allowed to exist. +
    getCookie :: Monad m => String -> ByteString -> m CookieSource
    Get the most specific cookie with the given name. Fails if there is no such + cookie or if the browser did not escape cookies in a proper fashion. + Browser support for escaping cookies properly is very diverse. +
    getCookies' :: Monad m => ByteString -> m (Either String [Cookie])Source
    getCookie' :: Monad m => String -> ByteString -> m (Either String Cookie)Source
    parseCookies :: String -> Either String [Cookie]Source
    Not an supported api. Takes a cookie header and returns + either a String error message or an array of parsed cookies +
    cookiesParser :: GenParser Char st [Cookie]Source
    not a supported api. A parser for RFC 2109 cookies +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-HTTP-Client.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-HTTP-Client.html 1 + + +Happstack.Server.HTTP.Client
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.HTTP.Client
    Synopsis
    getResponse :: Request -> IO (Either String Response)
    unproxify :: Request -> Request
    unrproxify :: String -> [(String, String)] -> Request -> Request
    Documentation
    getResponse :: Request -> IO (Either String Response)Source
    Sends the serialized request to the host defined in the request + and attempts to parse response upon arrival. +
    unproxify :: Request -> RequestSource
    unrproxify :: String -> [(String, String)] -> Request -> RequestSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-HTTP-FileServe.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-HTTP-FileServe.html 1 + + +Happstack.Server.HTTP.FileServe
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.HTTP.FileServe
    Contents
    Content-Type / Mime-Type +
    Low-Level +
    High-Level +
    Serving a single file +
    Serving files from a directory +
    Other +
    Description
    File Serving functions +
    Synopsis
    type MimeMap = Map String String
    mimeTypes :: MimeMap
    asContentType :: Monad m => String -> FilePath -> m String
    guessContentType :: MimeMap -> FilePath -> Maybe String
    guessContentTypeM :: Monad m => MimeMap -> FilePath -> m String
    sendFileResponse :: String -> FilePath -> Maybe (CalendarTime, Request) -> Integer -> Integer -> Response
    lazyByteStringResponse :: String -> ByteString -> Maybe (CalendarTime, Request) -> Integer -> Integer -> Response
    strictByteStringResponse :: String -> ByteString -> Maybe (CalendarTime, Request) -> Integer -> Integer -> Response
    filePathSendFile :: (ServerMonad m, MonadIO m) => String -> FilePath -> m Response
    filePathLazy :: (ServerMonad m, MonadIO m) => String -> FilePath -> m Response
    filePathStrict :: (ServerMonad m, MonadIO m) => String -> FilePath -> m Response
    serveFile :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => (FilePath -> m String) -> FilePath -> m Response
    serveFileUsing :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => (String -> FilePath -> m Response) -> (FilePath -> m String) -> FilePath -> m Response
    fileServe' :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => (String -> FilePath -> m Response) -> (FilePath -> m String) -> [FilePath] -> FilePath -> m Response
    fileServe :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [FilePath] -> FilePath -> m Response
    fileServeLazy :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [FilePath] -> FilePath -> m Response
    fileServeStrict :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [FilePath] -> FilePath -> m Response
    blockDotFiles :: (Request -> IO Response) -> Request -> IO Response
    defaultIxFiles :: [String]
    doIndex :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [String] -> MimeMap -> String -> m Response
    doIndex' :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => (String -> FilePath -> m Response) -> (FilePath -> m String) -> [String] -> String -> m Response
    doIndexLazy :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [String] -> MimeMap -> String -> m Response
    doIndexStrict :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [String] -> MimeMap -> String -> m Response
    errorwrapper :: (MonadIO m, MonadPlus m, FilterMonad Response m) => String -> String -> m Response
    isDot :: String -> Bool
    Content-Type / Mime-Type +
    type MimeMap = Map String StringSource
    mimeTypes :: MimeMapSource
    Ready collection of common mime types. + Except for the first two entries, the mappings come from an Ubuntu 8.04 etcmime.types file. +
    asContentType :: Monad m => String -> FilePath -> m StringSource
    guessContentType :: MimeMap -> FilePath -> Maybe StringSource
    guessContentTypeM :: Monad m => MimeMap -> FilePath -> m StringSource
    Low-Level +
    sendFileResponseSource
    :: Stringcontent-type string +
    -> FilePathfile path for content to send +
    -> Maybe (CalendarTime, Request)mod-time for the handle (MUST NOT be later than server's time of message origination), incoming request (used to check for if-modified-since header) +
    -> Integeroffset into Handle +
    -> Integernumber of bytes to send +
    -> Response
    Use sendFile to send the contents of a Handle +
    lazyByteStringResponseSource
    :: Stringcontent-type string (e.g. "text/plain; charset=utf-8") +
    -> ByteStringlazy bytestring content to send +
    -> Maybe (CalendarTime, Request)mod-time for the bytestring, incoming request (used to check for if-modified-since header) +
    -> Integeroffset into the bytestring +
    -> Integernumber of bytes to send (offset + count must be less than or equal to the length of the bytestring) +
    -> Response
    Send the contents of a Lazy ByteString +
    strictByteStringResponseSource
    :: Stringcontent-type string (e.g. "text/plain; charset=utf-8") +
    -> ByteStringlazy bytestring content to send +
    -> Maybe (CalendarTime, Request)mod-time for the bytestring, incoming request (used to check for if-modified-since header) +
    -> Integeroffset into the bytestring +
    -> Integernumber of bytes to send (offset + count must be less than or equal to the length of the bytestring) +
    -> Response
    Send the contents of a Lazy ByteString +
    filePathSendFileSource
    :: (ServerMonad m, MonadIO m)
    => Stringpath to file on disk +
    -> FilePath
    -> m Response

    Send the specified file with the specified mime-type using sendFile() +

    NOTE: assumes file exists and is readable by the server. See serveFileUsing. +

    WARNING: No security checks are performed. +

    filePathLazySource
    :: (ServerMonad m, MonadIO m)
    => Stringpath to file on disk +
    -> FilePath
    -> m Response

    Send the specified file with the specified mime-type using Lazy ByteStrings +

    NOTE: assumes file exists and is readable by the server. See serveFileUsing. +

    WARNING: No security checks are performed. +

    filePathStrictSource
    :: (ServerMonad m, MonadIO m)
    => Stringpath to file on disk +
    -> FilePath
    -> m Response

    Send the specified file with the specified mime-type using Lazy ByteStrings +

    NOTE: assumes file exists and is readable by the server. See serveFileUsing. +

    WARNING: No security checks are performed. +

    High-Level +
    Serving a single file +
    serveFile :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => (FilePath -> m String) -> FilePath -> m ResponseSource
    Alias for serveFileUsing filePathSendFile +
    serveFileUsingSource
    :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    => String -> FilePath -> m Responsefunction for determining content-type of file. Typically asContentType or guessContentTypeM +
    -> FilePath -> m Stringpath to the file to serve +
    -> FilePath
    -> m Response

    Serve a single, specified file. +

    example 1: +

    Serve using sendfile() and the specified content-type +

     serveFileUsing filePathSendFile (asContentType "image/jpeg") "/srv/data/image.jpg"
    +

    example 2: +

    Serve using a lazy ByteString and the guess the content-type from the extension +

     serveFileUsing filePathLazy (guessContentTypeM mimeTypes) "/srv/data/image.jpg"
    +

    WARNING: No security checks are performed. +

    Serving files from a directory +
    fileServe'Source
    :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    => String -> FilePath -> m Responsefunction which returns the mime-type for FilePath +
    -> FilePath -> m Stringindex file names, in case the requested path is a directory +
    -> [FilePath]file/directory to serve +
    -> FilePath
    -> m Response

    Serve files from a directory and its subdirectories (parameterizable version) +

    Parameterize this function to create functions like, fileServe, fileServeLazy, and fileServeStrict +

    You supply: +

    1. a low-level function which takes a content-type and FilePath and generates a Response + 2. a function which determines the content-type from the FilePath + 3. a list of all the default index files +

    NOTE: unlike fileServe, there are no index files by default. See defaultIxFiles. +

    fileServeSource
    :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    => [FilePath]file/directory to serve +
    -> FilePath
    -> m Response
    Serve files from a directory and its subdirectories (sendFile version). Should perform much better than its predecessors. +
    fileServeLazySource
    :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    => [FilePath]file/directory to serve +
    -> FilePath
    -> m Response

    Serve files from a directory and its subdirectories (lazy ByteString version). +

    May leak file handles. +

    fileServeStrictSource
    :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    => [FilePath]file/directory to serve +
    -> FilePath
    -> m Response
    Serve files from a directory and its subdirectories (strict ByteString version). +
    Other +
    blockDotFiles :: (Request -> IO Response) -> Request -> IO ResponseSource
    Prevents files of the form '.foo' or 'bar/.foo' from being served +
    defaultIxFiles :: [String]Source
    doIndex :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [String] -> MimeMap -> String -> m ResponseSource
    doIndex' :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => (String -> FilePath -> m Response) -> (FilePath -> m String) -> [String] -> String -> m ResponseSource
    doIndexLazy :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [String] -> MimeMap -> String -> m ResponseSource
    doIndexStrict :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => [String] -> MimeMap -> String -> m ResponseSource
    errorwrapper :: (MonadIO m, MonadPlus m, FilterMonad Response m) => String -> String -> m ResponseSource
    isDot :: String -> BoolSource
    Returns True if the given String either starts with a . or is of the form + foo/.bar, e.g. the typical *nix convention for hidden files. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-HTTP-LowLevel.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-HTTP-LowLevel.html 1 + + +Happstack.Server.HTTP.LowLevel
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.HTTP.LowLevel
    Contents
    HTTP Implementation +
    Problems +
    API +
    Synopsis
    request :: Conf -> Handle -> Host -> (Request -> IO Response) -> IO ()
    parseResponse :: ByteString -> Either String Response
    putRequest :: Handle -> Request -> IO ()
    listen :: Conf -> (Request -> IO Response) -> IO ()
    listen' :: Socket -> Conf -> (Request -> IO Response) -> IO ()
    listenOn :: Int -> IO Socket
    module Happstack.Server.HTTP.Types
    HTTP Implementation +
    The Happstack HTTP implementation supports HTTP 1.0 and 1.1. + Multiple request on a connection including pipelining is supported. +
    Problems +

    Currently if a client sends an invalid HTTP request the whole + connection is aborted and no further processing is done. +

    When the connection times out Happstack closes it. In future it could + send a 408 response but this may be problematic if the sending + of a response caused the problem. +

    API +
    request :: Conf -> Handle -> Host -> (Request -> IO Response) -> IO ()Source
    parseResponse :: ByteString -> Either String ResponseSource
    Unserializes the bytestring into a response. If there is an + error it will return Left msg. +
    putRequest :: Handle -> Request -> IO ()Source
    Serializes the request to the given handle +
    listen :: Conf -> (Request -> IO Response) -> IO ()Source
    Bind and listen port +
    listen' :: Socket -> Conf -> (Request -> IO Response) -> IO ()Source
    Use a previously bind port and listen +
    listenOn :: Int -> IO SocketSource
    module Happstack.Server.HTTP.Types
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-HTTP-Types.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-HTTP-Types.html 1 + + +Happstack.Server.HTTP.Types
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.HTTP.Types
    Synopsis
    data Request = Request {
    rqMethod :: Method
    rqPaths :: [String]
    rqUri :: String
    rqQuery :: String
    rqInputs :: [(String, Input)]
    rqCookies :: [(String, Cookie)]
    rqVersion :: Version
    rqHeaders :: Headers
    rqBody :: RqBody
    rqPeer :: Host
    }
    data Response
    = Response {
    rsCode :: Int
    rsHeaders :: Headers
    rsFlags :: RsFlags
    rsBody :: ByteString
    rsValidator :: Maybe (Response -> IO Response)
    }
    | SendFile {
    rsCode :: Int
    rsHeaders :: Headers
    rsFlags :: RsFlags
    rsValidator :: Maybe (Response -> IO Response)
    sfFilePath :: FilePath
    sfOffset :: Integer
    sfCount :: Integer
    }
    newtype RqBody = Body ByteString
    data Input = Input {
    inputValue :: ByteString
    inputFilename :: Maybe String
    inputContentType :: ContentType
    }
    data HeaderPair = HeaderPair {
    hName :: ByteString
    hValue :: [ByteString]
    }
    rqURL :: Request -> String
    mkHeaders :: [(String, String)] -> Headers
    getHeader :: HasHeaders r => String -> r -> Maybe ByteString
    getHeaderBS :: HasHeaders r => ByteString -> r -> Maybe ByteString
    getHeaderUnsafe :: HasHeaders r => ByteString -> r -> Maybe ByteString
    hasHeader :: HasHeaders r => String -> r -> Bool
    hasHeaderBS :: HasHeaders r => ByteString -> r -> Bool
    hasHeaderUnsafe :: HasHeaders r => ByteString -> r -> Bool
    setHeader :: HasHeaders r => String -> String -> r -> r
    setHeaderBS :: HasHeaders r => ByteString -> ByteString -> r -> r
    setHeaderUnsafe :: HasHeaders r => ByteString -> HeaderPair -> r -> r
    addHeader :: HasHeaders r => String -> String -> r -> r
    addHeaderBS :: HasHeaders r => ByteString -> ByteString -> r -> r
    addHeaderUnsafe :: HasHeaders r => ByteString -> HeaderPair -> r -> r
    setRsCode :: Monad m => Int -> Response -> m Response
    data Conf = Conf {
    port :: Int
    validator :: Maybe (Response -> IO Response)
    }
    nullConf :: Conf
    result :: Int -> String -> Response
    resultBS :: Int -> ByteString -> Response
    redirect :: ToSURI s => Int -> s -> Response -> Response
    data RsFlags = RsFlags {
    rsfContentLength :: Bool
    }
    nullRsFlags :: RsFlags
    noContentLength :: Response -> Response
    data Version = Version Int Int
    data Method
    = GET
    | HEAD
    | POST
    | PUT
    | DELETE
    | TRACE
    | OPTIONS
    | CONNECT
    type Headers = Map ByteString HeaderPair
    continueHTTP :: Request -> Response -> Bool
    type Host = (String, Int)
    data ContentType = ContentType {
    ctType :: String
    ctSubtype :: String
    ctParameters :: [(String, String)]
    }
    Documentation
    data Request Source
    Constructors
    Request
    rqMethod :: Method
    rqPaths :: [String]
    rqUri :: String
    rqQuery :: String
    rqInputs :: [(String, Input)]
    rqCookies :: [(String, Cookie)]
    rqVersion :: Version
    rqHeaders :: Headers
    rqBody :: RqBody
    rqPeer :: Host
    data Response Source
    Constructors
    Response
    rsCode :: Int
    rsHeaders :: Headers
    rsFlags :: RsFlags
    rsBody :: ByteString
    rsValidator :: Maybe (Response -> IO Response)
    SendFile
    rsCode :: Int
    rsHeaders :: Headers
    rsFlags :: RsFlags
    rsValidator :: Maybe (Response -> IO Response)
    sfFilePath :: FilePath
    sfOffset :: Integer
    sfCount :: Integer
    newtype RqBody Source
    Constructors
    Body ByteString
    data Input Source
    Constructors
    Input
    inputValue :: ByteString
    inputFilename :: Maybe String
    inputContentType :: ContentType
    data HeaderPair Source
    Constructors
    HeaderPair
    hName :: ByteString
    hValue :: [ByteString]
    rqURL :: Request -> StringSource
    Converts a Request into a String representing the corresponding URL +
    mkHeaders :: [(String, String)] -> HeadersSource
    Takes a list of (key,val) pairs and converts it into Headers. The + keys will be converted to lowercase +
    getHeader :: HasHeaders r => String -> r -> Maybe ByteStringSource
    Lookup header value. Key is case-insensitive. +
    getHeaderBS :: HasHeaders r => ByteString -> r -> Maybe ByteStringSource
    Lookup header value. Key is a case-insensitive bytestring. +
    getHeaderUnsafe :: HasHeaders r => ByteString -> r -> Maybe ByteStringSource
    Lookup header value with a case-sensitive key. The key must be lowercase. +
    hasHeader :: HasHeaders r => String -> r -> BoolSource
    Returns True if the associated key is found in the Headers. The lookup + is case insensitive. +
    hasHeaderBS :: HasHeaders r => ByteString -> r -> BoolSource
    Acts as hasHeader with ByteStrings +
    hasHeaderUnsafe :: HasHeaders r => ByteString -> r -> BoolSource
    Acts as hasHeaderBS but the key is case sensitive. It should be + in lowercase. +
    setHeader :: HasHeaders r => String -> String -> r -> rSource
    Associates the key/value pair in the headers. Forces the key to be + lowercase. +
    setHeaderBS :: HasHeaders r => ByteString -> ByteString -> r -> rSource
    Acts as setHeader but with ByteStrings. +
    setHeaderUnsafe :: HasHeaders r => ByteString -> HeaderPair -> r -> rSource
    Sets the key to the HeaderPair. This is the only way to associate a key + with multiple values via the setHeader* functions. Does not force the key + to be in lowercase or guarantee that the given key and the key in the HeaderPair will match. +
    addHeader :: HasHeaders r => String -> String -> r -> rSource
    Add a key/value pair to the header. If the key already has a value + associated with it, then the value will be appended. + Forces the key to be lowercase. +
    addHeaderBS :: HasHeaders r => ByteString -> ByteString -> r -> rSource
    Acts as addHeader except for ByteStrings +
    addHeaderUnsafe :: HasHeaders r => ByteString -> HeaderPair -> r -> rSource
    Add a key/value pair to the header using the underlying HeaderPair data + type. Does not force the key to be in lowercase or guarantee that the given key and the key in the HeaderPair will match. +
    setRsCode :: Monad m => Int -> Response -> m ResponseSource
    Sets the Response status code to the provided Int and lifts the computation + into a Monad. +
    data Conf Source
    HTTP configuration +
    Constructors
    Conf
    port :: IntPort for the server to listen on. +
    validator :: Maybe (Response -> IO Response)
    nullConf :: ConfSource
    Default configuration contains no validator and the port is set to 8000 +
    result :: Int -> String -> ResponseSource
    Creates a Response with the given Int as the status code and the provided + String as the body of the Response +
    resultBS :: Int -> ByteString -> ResponseSource
    Acts as result but works with ByteStrings directly. +
    redirect :: ToSURI s => Int -> s -> Response -> ResponseSource
    Sets the Response's status code to the given Int and redirects to the given URI +
    data RsFlags Source
    Result flags +
    Constructors
    RsFlags
    rsfContentLength :: Boolwhether a content-length header will be added to the result. +
    nullRsFlags :: RsFlagsSource
    Default RsFlags that will include the content-length header +
    noContentLength :: Response -> ResponseSource
    Don't display a Content-Lenght field for the Result. +
    data Version Source
    HTTP version +
    Constructors
    Version Int Int
    data Method Source
    HTTP request method +
    Constructors
    GET
    HEAD
    POST
    PUT
    DELETE
    TRACE
    OPTIONS
    CONNECT
    type Headers = Map ByteString HeaderPairSource
    Combined headers. +
    continueHTTP :: Request -> Response -> BoolSource
    Should the connection be used for further messages after this. + | isHTTP1_0 && hasKeepAlive || isHTTP1_1 && hasNotConnectionClose +
    type Host = (String, Int)Source
    data ContentType Source
    A MIME media type value. + The Show instance is derived automatically. + Use showContentType to obtain the standard + string representation. + See http://www.ietf.org/rfc/rfc2046.txt for more + information about MIME media types. +
    Constructors
    ContentType
    ctType :: StringThe top-level media type, the general type + of the data. Common examples are + "text", "image", "audio", "video", + "multipart", and "application". +
    ctSubtype :: StringThe media subtype, the specific data format. + Examples include "plain", "html", + "jpeg", "form-data", etc. +
    ctParameters :: [(String, String)]Media type parameters. On common example is + the charset parameter for the "text" + top-level type, e.g. ("charset","ISO-8859-1"). +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-MessageWrap.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-MessageWrap.html 1 + + +Happstack.Server.MessageWrap
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.MessageWrap
    Synopsis
    queryInput :: SURI -> [(String, Input)]
    bodyInput :: Request -> [(String, Input)]
    formDecode :: String -> [(String, Input)]
    decodeBody :: Maybe ContentType -> ByteString -> [(String, Input)]
    multipartDecode :: [(String, String)] -> ByteString -> [(String, Input)]
    bodyPartToInput :: BodyPart -> (String, Input)
    simpleInput :: String -> Input
    defaultInputType :: ContentType
    pathEls :: String -> [String]
    class Read a => ReadString a where
    readString :: String -> a
    Documentation
    queryInput :: SURI -> [(String, Input)]Source
    bodyInput :: Request -> [(String, Input)]Source
    formDecode :: String -> [(String, Input)]Source
    Decodes application/x-www-form-urlencoded inputs. +
    decodeBody :: Maybe ContentType -> ByteString -> [(String, Input)]Source
    multipartDecodeSource
    :: [(String, String)]Content-type parameters +
    -> ByteStringRequest body +
    -> [(String, Input)]Input variables and values. +
    Decodes multipart/form-data input. +
    bodyPartToInput :: BodyPart -> (String, Input)Source
    simpleInput :: String -> InputSource
    Packs a string into an Input of type text/plain +
    defaultInputType :: ContentTypeSource
    The default content-type for variables. +
    pathEls :: String -> [String]Source
    Get the path components from a String. +
    class Read a => ReadString a whereSource
    Like Read except Strings and Chars not quoted. +
    Methods
    readString :: String -> aSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-MinHaXML.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-MinHaXML.html 1 + + +Happstack.Server.MinHaXML
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.MinHaXML
    Documentation
    type StyleURL = StringSource
    data StyleSheet Source
    Constructors
    NoStyle
    CSS
    styleURL :: StyleURL
    XSL
    styleURL :: StyleURL
    hasStyleURL :: StyleSheet -> BoolSource
    type Element = ElementSource
    isCSS :: StyleSheet -> BoolSource
    isXSL :: StyleSheet -> BoolSource
    t :: Name -> [(Name, String)] -> CharData -> ElementSource
    l :: Name -> [(Name, String)] -> [Element] -> ElementSource
    e :: Name -> [(Name, String)] -> ElementSource
    (</<) :: Name -> [(Name, String)] -> [Element] -> ElementSource
    (<>) :: Name -> [(Name, String)] -> CharData -> ElementSource
    xmlElem :: (t -> [Content]) -> Name -> [(Name, String)] -> t -> ElementSource
    textElem :: Name -> [(Name, String)] -> CharData -> ElementSource
    emptyElem :: Name -> [(Name, String)] -> ElementSource
    listElem :: Name -> [(Name, String)] -> [Element] -> ElementSource
    cdataElem :: CharData -> ContentSource
    simpleDocOld :: StyleSheet -> Element -> StringSource
    simpleDoc :: StyleSheet -> Element -> StringSource
    simpleDoc' :: StyleSheet -> Element -> StringSource
    xmlEscaper :: XmlEscaperSource
    xmlStdEscape :: Element -> ElementSource
    verbim :: Verbatim a => a -> StringSource
    simpleProlog :: StyleSheet -> PrologSource
    nonEmpty :: Name -> String -> Maybe ElementSource
    getRoot :: Document -> ElementSource
    data XML a Source
    Constructors
    XML StyleSheet a
    class ToElement x whereSource
    Methods
    toElement :: x -> ElementSource
    wrapElem :: ToElement x => Name -> x -> ElementSource
    elF :: ToElement b => Name -> (a -> b) -> a -> ElementSource
    attrF :: t1 -> (t -> String) -> t -> (t1, String)Source
    attrFS :: Show a => t1 -> (t -> a) -> t -> (t1, String)Source
    attrFMb :: (a -> String) -> String -> (a1 -> Maybe a) -> a1 -> (String, String)Source
    quoteEsc :: String -> StringSource
    recToEl :: Name -> [a -> (String, String)] -> [a -> Element] -> a -> ElementSource
    listToEl :: ToElement a => Name -> [(Name, String)] -> [a] -> ElementSource
    toAttrs :: t -> [(t1, t -> t2)] -> [(t1, t2)]Source
    newtype ElString Source
    Constructors
    ElString
    elString :: String
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-Parts.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-Parts.html 1 + + +Happstack.Server.Parts
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.Parts
    Synopsis
    compressedResponseFilter :: (FilterMonad Response m, MonadPlus m, WebMonad Response m, ServerMonad m) => m String
    gzipFilter :: FilterMonad Response m => m ()
    deflateFilter :: FilterMonad Response m => m ()
    encodings :: GenParser Char st [([Char], Maybe Double)]
    Documentation
    compressedResponseFilter :: (FilterMonad Response m, MonadPlus m, WebMonad Response m, ServerMonad m) => m StringSource

    reads the "Accept-Encoding" header. Then, if possible + will compress the response body with methods gzip or deflate +

    Returns the name of the coding chosen +

    gzipFilter :: FilterMonad Response m => m ()Source
    compresses the body of the response with gzip. + does not set any headers. +
    deflateFilter :: FilterMonad Response m => m ()Source
    compresses the body of the response with zlib's + deflate method + does not set any headers. +
    encodings :: GenParser Char st [([Char], Maybe Double)]Source
    unsupported: a parser for the Accept-Encoding header +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-SURI.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-SURI.html 1 + + +Happstack.Server.SURI
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.SURI
    Synopsis
    path :: SURI -> String
    query :: SURI -> String
    scheme :: SURI -> String
    u_scheme :: (String -> String) -> SURI -> SURI
    u_path :: (String -> String) -> SURI -> SURI
    a_scheme :: String -> SURI -> SURI
    a_path :: String -> SURI -> SURI
    unEscape :: String -> String
    escape :: String -> String
    isAbs :: SURI -> Bool
    newtype SURI = SURI {
    suri :: URI
    }
    render :: ToSURI a => a -> String
    parse :: String -> Maybe SURI
    class ToSURI x where
    toSURI :: x -> SURI
    class FromPath x where
    fromPath :: String -> x
    Documentation
    path :: SURI -> StringSource
    Retrieves the path component from the URI +
    query :: SURI -> StringSource
    Retrieves the query component from the URI +
    scheme :: SURI -> StringSource
    Retrieves the scheme component from the URI +
    u_scheme :: (String -> String) -> SURI -> SURISource
    Modifies the scheme component of the URI using the provided function +
    u_path :: (String -> String) -> SURI -> SURISource
    Modifies the path component of the URI using the provided function +
    a_scheme :: String -> SURI -> SURISource
    Sets the scheme component of the URI +
    a_path :: String -> SURI -> SURISource
    Sets the path component of the URI +
    unEscape :: String -> StringSource
    escape :: String -> StringSource
    isAbs :: SURI -> BoolSource
    Returns true if the URI is absolute +
    newtype SURI Source
    Constructors
    SURI
    suri :: URI
    render :: ToSURI a => a -> StringSource
    Render should be used for prettyprinting URIs. +
    parse :: String -> Maybe SURISource
    Parses a URI from a String. Returns Nothing on failure. +
    class ToSURI x whereSource
    Convenience class for converting data types to URIs +
    Methods
    toSURI :: x -> SURISource
    class FromPath x whereSource
    Methods
    fromPath :: String -> xSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-SimpleHTTP.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-SimpleHTTP.html 1 + + +Happstack.Server.SimpleHTTP
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.SimpleHTTP
    Portabilityrequires mtl
    Stabilityprovisional
    Maintainerlemmih@vo.com
    Contents
    SimpleHTTP +
    ServerPartT +
    WebT +
    Type Classes +
    Manipulating requests +
    Manipulating responses +
    guards and building blocks +
    proxying +
    unknown +
    Parsing input and cookies +
    XSLT +
    Error Handlng +
    Output Validation +
    Description

    SimpleHTTP provides a back-end independent API for handling HTTP requests. +

    By default, the built-in HTTP server will be used. However, other back-ends + like CGI/FastCGI can be used if so desired. +

    So the general nature of simpleHTTP is just what you'd expect + from a web application container. First you figure out which function is + going to process your request, process the request to generate a response, + then return that response to the client. The web application container is + started with simpleHTTP, which takes a configuration and a + response-building structure (ServerPartT which I'll return to in a + moment), picks the first handler that is willing to accept the request, and + passes the request in to the handler. A simple hello world style Happstack + simpleHTTP server looks like: +

      main = simpleHTTP nullConf $ return "Hello World!"
    +

    simpleHTTP nullConf creates a HTTP server on port 8000. + return "Hello World!" creates a ServerPartT that just returns that text. +

    ServerPartT is the basic response builder. As you might expect, it's a + container for a function that takes a Request and converts it to a response + suitable for sending back to the server. Most of the time though you don't + even need to worry about that as ServerPartT hides almost all the machinery + for building your response by exposing a few type classes. +

    ServerPartT is a pretty rich monad. You can interact with your request, + your response, do IO, etc. Here is a do block that validates basic + authentication. It takes a realm name as a string, a Map of username to + password and a server part to run if authentication fails. +

    basicAuth acts like a guard, and only produces a response when + authentication fails. So put it before any ServerPartT for which you want to demand + authentication, in any collection of ServerPartTs. +

     main = simpleHTTP nullConf $ myAuth, return "Hello World!"
    +     where
    +         myAuth = basicAuth' "Test"
    +             (M.fromList [("hello", "world")]) (return "Login Failed")
    +
     basicAuth' realmName authMap unauthorizedPart =
    +    do
    +        let validLogin name pass = M.lookup name authMap == Just pass
    +        let parseHeader = break (':'==) . Base64.decode . B.unpack . B.drop 6
    +        authHeader <- getHeaderM "authorization"
    +        case authHeader of
    +            Nothing -> err
    +            Just x  -> case parseHeader x of
    +                (name, ':':pass) | validLogin name pass -> mzero
    +                                   | otherwise -> err
    +                _                                       -> err
    +    where
    +        err = do
    +            unauthorized ()
    +            setHeaderM headerName headerValue
    +            unauthorizedPart
    +        headerValue = "Basic realm=\"" ++ realmName ++ "\""
    +        headerName  = "WWW-Authenticate"
    +

    Here is another example that uses liftIO to embed IO in a request process: +

      main = simpleHTTP nullConf $ myPart
    +  myPart = do
    +    line <- liftIO $ do -- IO
    +        putStr "return? "
    +        getLine
    +    when (take 2 line /= "ok") $ (notfound () >> return "refused")
    +    return "Hello World!"
    +

    This example will ask in the console "return? " if you type "ok" it will + show "Hello World!" and if you type anything else it will return a 404. +

    Synopsis
    module Happstack.Server.HTTP.Types
    module Happstack.Server.Cookie
    simpleHTTP :: ToMessage a => Conf -> ServerPartT IO a -> IO ()
    simpleHTTP' :: (ToMessage b, Monad m, Functor m) => (UnWebT m a -> UnWebT IO b) -> Conf -> ServerPartT m a -> IO ()
    simpleHTTP'' :: (ToMessage b, Monad m, Functor m) => ServerPartT m b -> Request -> m Response
    simpleHTTPWithSocket :: ToMessage a => Socket -> Conf -> ServerPartT IO a -> IO ()
    simpleHTTPWithSocket' :: (ToMessage b, Monad m, Functor m) => (UnWebT m a -> UnWebT IO b) -> Socket -> Conf -> ServerPartT m a -> IO ()
    bindPort :: Conf -> IO Socket
    parseConfig :: [String] -> Either [String] Conf
    newtype ServerPartT m a = ServerPartT {
    unServerPartT :: ReaderT Request (WebT m) a
    }
    type ServerPart a = ServerPartT IO a
    runServerPartT :: ServerPartT m a -> Request -> WebT m a
    mapServerPartT :: (UnWebT m a -> UnWebT n b) -> ServerPartT m a -> ServerPartT n b
    mapServerPartT' :: (Request -> UnWebT m a -> UnWebT n b) -> ServerPartT m a -> ServerPartT n b
    withRequest :: (Request -> WebT m a) -> ServerPartT m a
    anyRequest :: Monad m => WebT m a -> ServerPartT m a
    newtype WebT m a = WebT {
    unWebT :: ErrorT Response (FilterT Response (MaybeT m)) a
    }
    type UnWebT m a = m (Maybe (Either Response a, FilterFun Response))
    type FilterFun a = SetAppend (Dual (Endo a))
    type Web a = WebT IO a
    mkWebT :: UnWebT m a -> WebT m a
    ununWebT :: WebT m a -> UnWebT m a
    runWebT :: forall m b. (Functor m, ToMessage b) => WebT m b -> m (Maybe Response)
    mapWebT :: (UnWebT m a -> UnWebT n b) -> WebT m a -> WebT n b
    class FromReqURI a where
    fromReqURI :: String -> Maybe a
    class ToMessage a where
    toContentType :: a -> ByteString
    toMessage :: a -> ByteString
    toResponse :: a -> Response
    class FromData a where
    fromData :: RqData a
    class Monad m => ServerMonad m where
    askRq :: m Request
    localRq :: (Request -> Request) -> m a -> m a
    type RqData a = ReaderT ([(String, Input)], [(String, Cookie)]) Maybe a
    noHandle :: MonadPlus m => m a
    getHeaderM :: ServerMonad m => String -> m (Maybe ByteString)
    escape :: (WebMonad a m, FilterMonad a m) => m a -> m b
    escape' :: (WebMonad a m, FilterMonad a m) => a -> m b
    multi :: Monad m => [ServerPartT m a] -> ServerPartT m a
    class Monad m => FilterMonad a m | m -> a where
    setFilter :: (a -> a) -> m ()
    composeFilter :: (a -> a) -> m ()
    getFilter :: m b -> m (b, a -> a)
    ignoreFilters :: FilterMonad a m => m ()
    data SetAppend a
    = Set a
    | Append a
    newtype FilterT a m b = FilterT {
    unFilterT :: WriterT (FilterFun a) m b
    }
    class Monad m => WebMonad a m | m -> a where
    finishWith :: a -> m b
    ok :: FilterMonad Response m => a -> m a
    modifyResponse :: FilterMonad a m => (a -> a) -> m ()
    toResponseBS :: ByteString -> ByteString -> Response
    setResponseCode :: FilterMonad Response m => Int -> m ()
    badGateway :: FilterMonad Response m => a -> m a
    internalServerError :: FilterMonad Response m => a -> m a
    badRequest :: FilterMonad Response m => a -> m a
    unauthorized :: FilterMonad Response m => a -> m a
    forbidden :: FilterMonad Response m => a -> m a
    notFound :: FilterMonad Response m => a -> m a
    seeOther :: (FilterMonad Response m, ToSURI uri) => uri -> res -> m res
    found :: (FilterMonad Response m, ToSURI uri) => uri -> res -> m res
    movedPermanently :: (FilterMonad Response m, ToSURI a) => a -> res -> m res
    tempRedirect :: (FilterMonad Response m, ToSURI a) => a -> res -> m res
    addCookie :: FilterMonad Response m => Seconds -> Cookie -> m ()
    addCookies :: FilterMonad Response m => [(Seconds, Cookie)] -> m ()
    expireCookie :: FilterMonad Response m => String -> m ()
    addHeaderM :: FilterMonad Response m => String -> String -> m ()
    setHeaderM :: FilterMonad Response m => String -> String -> m ()
    ifModifiedSince :: CalendarTime -> Request -> Response -> Response
    guardRq :: (ServerMonad m, MonadPlus m) => (Request -> Bool) -> m ()
    dir :: (ServerMonad m, MonadPlus m) => String -> m a -> m a
    dirs :: (ServerMonad m, MonadPlus m) => FilePath -> m a -> m a
    host :: (ServerMonad m, MonadPlus m) => String -> m a -> m a
    withHost :: (ServerMonad m, MonadPlus m) => (String -> m a) -> m a
    method :: (MatchMethod method, Monad m) => method -> WebT m a -> ServerPartT m a
    methodSP :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m b -> m b
    methodM :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m ()
    methodOnly :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m ()
    nullDir :: (ServerMonad m, MonadPlus m) => m ()
    path :: (FromReqURI a, MonadPlus m, ServerMonad m) => (a -> m b) -> m b
    anyPath :: (ServerMonad m, MonadPlus m) => m r -> m r
    anyPath' :: (ServerMonad m, MonadPlus m) => m r -> m r
    trailingSlash :: (ServerMonad m, MonadPlus m) => m ()
    withData :: (FromData a, MonadPlus m, ServerMonad m) => (a -> m r) -> m r
    withDataFn :: (MonadPlus m, ServerMonad m) => RqData a -> (a -> m r) -> m r
    getDataFn :: ServerMonad m => RqData a -> m (Maybe a)
    getData :: (ServerMonad m, FromData a) => m (Maybe a)
    require :: (MonadIO m, MonadPlus m) => IO (Maybe a) -> (a -> m r) -> m r
    requireM :: (MonadTrans t, Monad m, MonadPlus (t m)) => m (Maybe a) -> (a -> t m r) -> t m r
    basicAuth :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadPlus m) => String -> Map String String -> m a -> m a
    uriRest :: ServerMonad m => (String -> m a) -> m a
    flatten :: (ToMessage a, Functor f) => f a -> f Response
    localContext :: Monad m => (WebT m a -> WebT m' a) -> ServerPartT m a -> ServerPartT m' a
    proxyServe :: (MonadIO m, WebMonad Response m, ServerMonad m, MonadPlus m, FilterMonad Response m) => [String] -> m Response
    rproxyServe :: MonadIO m => String -> [(String, String)] -> ServerPartT m Response
    debugFilter :: (MonadIO m, Show a) => ServerPartT m a -> ServerPartT m a
    applyRequest :: (ToMessage a, Monad m, Functor m) => ServerPartT m a -> Request -> Either (m Response) b
    lookInput :: String -> RqData Input
    lookBS :: String -> RqData ByteString
    look :: String -> RqData String
    lookCookie :: String -> RqData Cookie
    lookCookieValue :: String -> RqData String
    readCookieValue :: Read a => String -> RqData a
    lookRead :: Read a => String -> RqData a
    lookPairs :: RqData [(String, String)]
    xslt :: (MonadIO m, MonadPlus m, ToMessage r) => XSLTCmd -> XSLPath -> m r -> m Response
    doXslt :: MonadIO m => XSLTCmd -> XSLPath -> Response -> m Response
    errorHandlerSP :: (Monad m, Error e) => (Request -> e -> WebT m a) -> ServerPartT (ErrorT e m) a -> ServerPartT m a
    simpleErrorHandler :: Monad m => String -> ServerPartT m Response
    spUnwrapErrorT :: Monad m => (e -> ServerPartT m a) -> Request -> UnWebT (ErrorT e m) a -> UnWebT m a
    setValidator :: (Response -> IO Response) -> Response -> Response
    setValidatorSP :: (Monad m, ToMessage r) => (Response -> IO Response) -> m r -> m Response
    validateConf :: Conf
    runValidator :: (Response -> IO Response) -> Response -> IO Response
    wdgHTMLValidator :: (MonadIO m, ToMessage r) => r -> m Response
    noopValidator :: Response -> IO Response
    lazyProcValidator :: FilePath -> [String] -> Maybe FilePath -> Maybe [(String, String)] -> (Maybe ByteString -> Bool) -> Response -> IO Response
    Documentation
    module Happstack.Server.HTTP.Types
    module Happstack.Server.Cookie
    SimpleHTTP +
    simpleHTTP :: ToMessage a => Conf -> ServerPartT IO a -> IO ()Source
    Use the built-in web-server to serve requests according to a + ServerPartT. Use msum to pick the first handler from a list of + handlers that doesn't call mzero. This function always binds o + IPv4 ports until Network module is fixed to support IPv6 in a + portable way. Use simpleHTTPWithSocket with custom socket if you + want different behaviour. +
    simpleHTTP' :: (ToMessage b, Monad m, Functor m) => (UnWebT m a -> UnWebT IO b) -> Conf -> ServerPartT m a -> IO ()Source
    A combination of simpleHTTP'' and mapServerPartT. See + mapServerPartT for a discussion of the first argument of this + function. This function always binds to IPv4 ports until Network + module is fixed to support IPv6 in a portable way. Use + simpleHTTPWithSocket with custom socket if you want different + behaviour. +
    simpleHTTP'' :: (ToMessage b, Monad m, Functor m) => ServerPartT m b -> Request -> m ResponseSource
    Generate a result from a ServerPartT and a Request. This is mainly used + by CGI (and fast-cgi) wrappers. +
    simpleHTTPWithSocket :: ToMessage a => Socket -> Conf -> ServerPartT IO a -> IO ()Source

    Run simpleHTTP with a previously bound socket. Useful if you want to run + happstack as user on port 80. Use something like this: +

     import System.Posix.User (setUserID, UserEntry(..), getUserEntryForName)
    +
    + main = do
    +     let conf = nullConf { port = 80 }
    +     socket <- bindPort conf
    +     -- do other stuff as root here
    +     getUserEntryForName "www" >>= setUserID . userID
    +     -- finally start handling incoming requests
    +     tid <- forkIO $ simpleHTTPWithSocket socket conf impl
    +

    Note: It's important to use the same conf (or at least the same port) for + bindPort and simpleHTTPWithSocket. +

    simpleHTTPWithSocket' :: (ToMessage b, Monad m, Functor m) => (UnWebT m a -> UnWebT IO b) -> Socket -> Conf -> ServerPartT m a -> IO ()Source
    Like simpleHTTP' with a socket. +
    bindPort :: Conf -> IO SocketSource
    Bind port and return the socket for simpleHTTPWithSocket. This + function always binds to IPv4 ports until Network module is fixed to + support IPv6 in a portable way. +
    parseConfig :: [String] -> Either [String] ConfSource
    Parse command line options into a Conf. +
    ServerPartT +
    newtype ServerPartT m a Source
    ServerPartT is a container for processing requests and returning results. +
    Constructors
    ServerPartT
    unServerPartT :: ReaderT Request (WebT m) a
    type ServerPart a = ServerPartT IO aSource
    An alias for using ServerPartT when using the IO. +
    runServerPartT :: ServerPartT m a -> Request -> WebT m aSource
    particularly useful when combined with runWebT to produce + a m (Maybe Response) from a request. +
    mapServerPartT :: (UnWebT m a -> UnWebT n b) -> ServerPartT m a -> ServerPartT n bSource

    Used to manipulate the containing monad. Very useful when embedding a + monad into a ServerPartT, since simpleHTTP requires a ServerPartT IO a. + Refer to WebT for an explanation of the structure of the monad. +

    Here is an example. Suppose you want to embed an ErrorT into your + ServerPartT to enable throwError and catchError in your Monad. +

     type MyServerPartT e m a = ServerPartT (ErrorT e m) a
    +

    Now suppose you want to pass MyServerPartT into a function + that demands a ServerPartT IO a (e.g. simpleHTTP). You + can provide the function: +

       unpackErrorT:: (Monad m, Show e) => UnWebT (ErrorT e m) a -> UnWebT m a
    +   unpackErrorT handler et = do
    +      eitherV <- runErrorT et
    +      return $ case eitherV of
    +          Left err -> Just (Left "Catastrophic failure " ++ show e
    +                           , Set $ Endo $ \r -> r{rsCode = 500})
    +          Right x -> x
    +

    With unpackErrorT you can now call simpleHTTP. Just wrap your ServerPartT list. +

      simpleHTTP nullConf $ mapServerPartT unpackErrorT (myPart `catchError` myHandler)
    +

    Or alternatively: +

      simpleHTTP' unpackErrorT nullConf (myPart `catchError` myHandler)
    +

    Also see spUnwrapErrorT for a more sophisticated version of this function. +

    mapServerPartT' :: (Request -> UnWebT m a -> UnWebT n b) -> ServerPartT m a -> ServerPartT n bSource
    A variant of mapServerPartT where the first argument also takes a request. + Useful if you want to runServerPartT on a different ServerPartT inside your + monad (see spUnwrapErrorT). +
    withRequest :: (Request -> WebT m a) -> ServerPartT m aSource
    anyRequest :: Monad m => WebT m a -> ServerPartT m aSource
    A constructor for a ServerPartT when you don't care about the request. +
    WebT +
    newtype WebT m a Source
    The basic response building object. +
    Constructors
    WebT
    unWebT :: ErrorT Response (FilterT Response (MaybeT m)) a
    type UnWebT m a = m (Maybe (Either Response a, FilterFun Response))Source

    It is worth discussing the unpacked structure of WebT a bit as it's exposed + in mapServerPartT and mapWebT. +

    A fully unpacked WebT has a structure that looks like: +

     ununWebT $ WebT m a :: m (Maybe (Either Response a, FilterFun Response))
    +

    So, ignoring m, as it is just the containing Monad, the outermost layer is + a Maybe. This is Nothing if mzero was called or Just (Either Response + a, SetAppend (Endo Response)) if mzero wasn't called. Inside the Maybe, + there is a pair. The second element of the pair is our filter function + FilterFun Response. FilterFun Response is a type alias for SetAppend + (Dual (Endo Response)). This is just a wrapper for a Response -> Response + function with a particular Monoid behavior. The value +

      Append (Dual (Endo f))
    +

    Causes f to be composed with the previous filter. +

      Set (Dual (Endo f))
    +

    Causes f to not be composed with the previous filter. +

    Finally, the first element of the pair is either Left Response or Right a. +

    Another way of looking at all these pieces is from the behaviors + they control. The Maybe controls the mzero behavior. Set + (Endo f) comes from the setFilter behavior. Likewise, Append + (Endo f) is from composeFilter. Left Response is what you + get when you call finishWith and Right a is the normal exit. +

    An example case statement looks like: +

      ex1 webt = do
    +    val <- ununWebT webt
    +    case val of
    +        Nothing -> Nothing  -- this is the interior value when mzero was used
    +        Just (Left r, f) -> Just (Left r, f) -- r is the value that was passed into "finishWith"
    +                                             -- f is our filter function
    +        Just (Right a, f) -> Just (Right a, f) -- a is our normal monadic value
    +                                               -- f is still our filter function
    +
    type FilterFun a = SetAppend (Dual (Endo a))Source
    FilterFun is a lot more fun to type than SetAppend (Dual (Endo a)). +
    type Web a = WebT IO aSource
    An alias for WebT when using IO. +
    mkWebT :: UnWebT m a -> WebT m aSource
    For wrapping a WebT back up. mkWebT . ununWebT = id +
    ununWebT :: WebT m a -> UnWebT m aSource
    For when you really need to unpack a WebT entirely (and not + just unwrap the first layer with unWebT). +
    runWebT :: forall m b. (Functor m, ToMessage b) => WebT m b -> m (Maybe Response)Source
    Takes your WebT, if it is mempty it returns Nothing else it + converts the value to a Response and applies your filter to it. +
    mapWebT :: (UnWebT m a -> UnWebT n b) -> WebT m a -> WebT n bSource
    See mapServerPartT for a discussion of this function. +
    Type Classes +
    class FromReqURI a whereSource

    This class is used by path to parse a path component into a value. + At present, the instances for number types (Int, Float, etc) just + call readM. The instance for String however, just passes the + path component straight through. This is so that you can read a + path component which looks like this as a String: +

    /somestring/ +

    instead of requiring the path component to look like: +

    /"somestring"/ +

    Methods
    fromReqURI :: String -> Maybe aSource
    class ToMessage a whereSource

    Used to convert arbitrary types into an HTTP response. You need to implement + this if you want to pass ServerPartT m containing your type into simpleHTTP. +

    Minimal definition: toMessage. +

    Methods
    toContentType :: a -> ByteStringSource
    toMessage :: a -> ByteStringSource
    toResponse :: a -> ResponseSource
    Manipulating requests +
    class FromData a whereSource
    Useful for withData and getData' implement this on your preferred type + to use those functions. +
    Methods
    fromData :: RqData aSource
    class Monad m => ServerMonad m whereSource
    Yes, this is exactly like ReaderT with new names. + Why you ask? Because ServerT can lift up a ReaderT. + If you did that, it would shadow ServerT's behavior + as a ReaderT, thus meaning if you lifted the ReaderT + you could no longer modify the Request. This way + you can add a ReaderT to your monad stack without + any trouble. +
    Methods
    askRq :: m RequestSource
    localRq :: (Request -> Request) -> m a -> m aSource
    type RqData a = ReaderT ([(String, Input)], [(String, Cookie)]) Maybe aSource
    noHandle :: MonadPlus m => m aSource
    Deprecated: use mzero. +
    getHeaderM :: ServerMonad m => String -> m (Maybe ByteString)Source
    Get a header out of the request. +
    escape :: (WebMonad a m, FilterMonad a m) => m a -> m bSource
    Used to ignore all your filters and immediately end the + computation. A combination of ignoreFilters and finishWith. +
    escape' :: (WebMonad a m, FilterMonad a m) => a -> m bSource
    An alternate form of escape that can be easily used within a do + block. +
    multi :: Monad m => [ServerPartT m a] -> ServerPartT m aSource
    Deprecated: use msum. +
    Manipulating responses +
    class Monad m => FilterMonad a m | m -> a whereSource
    A set of functions for manipulating filters. A ServerPartT implements + FilterMonad Response so these methods are the fundamental ways of + manipulating the response object, especially before you've converted your + monadic value to a Response. +
    Methods
    setFilter :: (a -> a) -> m ()Source

    Ignores all previous alterations to your filter +

    As an example: +

     do
    +   composeFilter f
    +   setFilter g
    +   return "Hello World"
    +

    setFilter g will cause the first composeFilter to be ignored. +

    composeFilter :: (a -> a) -> m ()Source
    Composes your filter function with the existing filter + function. +
    getFilter :: m b -> m (b, a -> a)Source
    Retrives the filter from the environment. +
    ignoreFilters :: FilterMonad a m => m ()Source
    An alias for setFilter id It resets all your filters. +
    data SetAppend a Source

    A monoid operation container. + If a is a monoid, then SetAppend is a monoid with the following behaviors: +

      Set    x `mappend` Append y = Set    (x `mappend` y)
    +  Append x `mappend` Append y = Append (x `mappend` y)
    +  _        `mappend` Set y    = Set y
    +

    A simple way of summarizing this is, if the right side is Append, then the + right is appended to the left. If the right side is Set, then the left side + is ignored. +

    Constructors
    Set a
    Append a
    newtype FilterT a m b Source
    Constructors
    FilterT
    unFilterT :: WriterT (FilterFun a) m b
    class Monad m => WebMonad a m | m -> a whereSource
    Methods
    finishWith :: a -> m bSource

    A control structure. + It ends the computation and returns the Response you passed into it + immediately. This provides an alternate escape route. In particular + it has a monadic value of any type. And unless you call setFilter id + first your response filters will be applied normally. +

    Extremely useful when you're deep inside a monad and decide that you + want to return a completely different content type, since it doesn't + force you to convert all your return types to Response early just to + accomodate this. +

    ok :: FilterMonad Response m => a -> m aSource
    Respond with 200 OK. +
    modifyResponse :: FilterMonad a m => (a -> a) -> m ()Source
    Deprecated: use composeFilter. +
    toResponseBSSource
    :: ByteStringcontent-type +
    -> ByteStringresponse body +
    -> Response

    low-level function to build a Response from a content-type and a + ByteString +

    Creates a Response in a manner similar to the ToMessage class, + but with out requiring an instance declaration. +

    setResponseCode :: FilterMonad Response m => Int -> m ()Source
    Set the return code in your response. +
    badGateway :: FilterMonad Response m => a -> m aSource
    Responds with 502 Bad Gateway. +
    internalServerError :: FilterMonad Response m => a -> m aSource
    Respond with 500 Interal Server Error. +
    badRequest :: FilterMonad Response m => a -> m aSource
    Respond with 400 Bad Request. +
    unauthorized :: FilterMonad Response m => a -> m aSource
    Respond with 401 Unauthorized. +
    forbidden :: FilterMonad Response m => a -> m aSource
    Respond with 403 Forbidden. +
    notFound :: FilterMonad Response m => a -> m aSource
    Respond with 404 Not Found. +
    seeOther :: (FilterMonad Response m, ToSURI uri) => uri -> res -> m resSource
    Respond with 303 See Other. +
    found :: (FilterMonad Response m, ToSURI uri) => uri -> res -> m resSource
    Respond with 302 Found. +
    movedPermanently :: (FilterMonad Response m, ToSURI a) => a -> res -> m resSource
    Respond with 301 Moved Permanently. +
    tempRedirect :: (FilterMonad Response m, ToSURI a) => a -> res -> m resSource
    Respond with 307 Temporary Redirect. +
    addCookie :: FilterMonad Response m => Seconds -> Cookie -> m ()Source
    Add the cookie with a timeout to the response. +
    addCookies :: FilterMonad Response m => [(Seconds, Cookie)] -> m ()Source
    Add the list of cookie timeout pairs to the response. +
    expireCookie :: FilterMonad Response m => String -> m ()Source
    Expire the cookie immediately. +
    addHeaderM :: FilterMonad Response m => String -> String -> m ()Source
    Add headers into the response. + This method does not overwrite any existing header of + the same name, hence the name addHeaderM. If you + want to replace a header use setHeaderM. +
    setHeaderM :: FilterMonad Response m => String -> String -> m ()Source
    Set a header into the response. This will replace + an existing header of the same name. Use addHeaderM if you + want to add more than one header of the same name. +
    ifModifiedSinceSource
    :: CalendarTimemod-time for the Response (MUST NOT be later than server's time of message origination) +
    -> Requestincoming request (used to check for if-modified-since) +
    -> ResponseResponse to send if there are modifications +
    -> Response
    Honor an if-modified-since header in a Request. + If the Request includes the if-modified-since header and the + Response has not been modified, then return 304 (Not Modified), + otherwise return the Response. +
    guards and building blocks +
    guardRq :: (ServerMonad m, MonadPlus m) => (Request -> Bool) -> m ()Source
    Guard using an arbitrary function on the request. +
    dir :: (ServerMonad m, MonadPlus m) => String -> m a -> m aSource

    Pop a path element and run the ServerPartT if it matches the given string. +

    The path element can not contain '/'. See also dirs. +

    dirs :: (ServerMonad m, MonadPlus m) => FilePath -> m a -> m aSource

    Guard against a FilePath. Unlike dir the FilePath may + contain '/'. If the guard succeeds, the matched elements will be + popped from the directory stack. +

     dirs "foo/bar" $ ...
    +

    See also: dir. +

    host :: (ServerMonad m, MonadPlus m) => String -> m a -> m aSource
    Guard against the host. +
    withHost :: (ServerMonad m, MonadPlus m) => (String -> m a) -> m aSource
    Lookup the host header and pass it to the handler. +
    method :: (MatchMethod method, Monad m) => method -> WebT m a -> ServerPartT m aSource
    Guard against the method. Note, this function also guards against any + remaining path segments. This function is deprecated. You can probably + just use methodSP (or methodM) now. +
    methodSP :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m b -> m bSource
    Guard against the method. Note, this function also guards against any + remaining path segments. +
    methodM :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m ()Source
    Guard against the method. This function also guards against + any remaining path segments. See methodOnly for the version + that guards only by method +
    methodOnly :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m ()Source
    Guard against the method only. (as opposed to methodM) +
    nullDir :: (ServerMonad m, MonadPlus m) => m ()Source
    Guard against non-empty remaining path segments. +
    path :: (FromReqURI a, MonadPlus m, ServerMonad m) => (a -> m b) -> m bSource
    Pop a path element and parse it using the fromReqURI in the FromReqURI class. +
    anyPath :: (ServerMonad m, MonadPlus m) => m r -> m rSource
    Pop any path element and ignore when chosing a ServerPartT to + handle the request. +
    anyPath' :: (ServerMonad m, MonadPlus m) => m r -> m rSource
    Deprecated: use anyPath. +
    trailingSlash :: (ServerMonad m, MonadPlus m) => m ()Source
    Guard which checks that the Request URI ends in '/'. + Useful for distinguishing between foo and foo/ +
    withData :: (FromData a, MonadPlus m, ServerMonad m) => (a -> m r) -> m rSource
    Retrieve data from the input query or the cookies. +
    withDataFn :: (MonadPlus m, ServerMonad m) => RqData a -> (a -> m r) -> m rSource
    withDataFn is like withData, but you pass in a RqData monad + for reading. +
    getDataFn :: ServerMonad m => RqData a -> m (Maybe a)Source

    Parse your request with a RqData (a ReaderT, basically) + For example here is a simple GET or POST variable based authentication + guard. It handles the request with errorHandler if authentication fails. +

     myRqData = do
    +     username <- lookInput "username"
    +     password <- lookInput "password"
    +     return (username, password)
    + checkAuth errorHandler = do
    +     d <- getData myRqDataA
    +     case d of
    +         Nothing -> errorHandler
    +         Just a | isValid a -> mzero
    +         Just a | otherwise -> errorHandler
    +
    getData :: (ServerMonad m, FromData a) => m (Maybe a)Source

    An variant of getData that uses FromData to chose your + RqData for you. The example from getData becomes: +

      myRqData = do
    +     username <- lookInput "username"
    +     password <- lookInput "password"
    +     return (username, password)
    +  instance FromData (String,String) where
    +     fromData = myRqData
    +  checkAuth errorHandler = do
    +     d <- getData'
    +     case d of
    +         Nothing -> errorHandler
    +         Just a | isValid a -> mzero
    +         Just a | otherwise -> errorHandler
    +
    require :: (MonadIO m, MonadPlus m) => IO (Maybe a) -> (a -> m r) -> m rSource
    Run an IO action and, if it returns Just, pass it to the second argument. +
    requireM :: (MonadTrans t, Monad m, MonadPlus (t m)) => m (Maybe a) -> (a -> t m r) -> t m rSource
    A variant of require that can run in any monad, not just IO. +
    basicAuthSource
    :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadPlus m)
    => Stringthe username password map +
    -> Map String Stringthe part to guard +
    -> m a
    -> m a
    A simple HTTP basic authentication guard. +
    uriRest :: ServerMonad m => (String -> m a) -> m aSource
    Grab the rest of the URL (dirs + query) and passes it to your handler. +
    flatten :: (ToMessage a, Functor f) => f a -> f ResponseSource
    flatten turns your arbitrary m a and converts it too + a m Response with toResponse. +
    localContext :: Monad m => (WebT m a -> WebT m' a) -> ServerPartT m a -> ServerPartT m' aSource
    This is kinda like a very oddly shaped mapServerPartT or mapWebT + You probably want one or the other of those. +
    proxying +
    proxyServe :: (MonadIO m, WebMonad Response m, ServerMonad m, MonadPlus m, FilterMonad Response m) => [String] -> m ResponseSource

    proxyServe is for creating ServerPartTs that proxy. + The sole argument [String] is a list of allowed domains for + proxying. This matches the domain part of the request + and the wildcard * can be used. E.g. +

    • "*" to match anything. +
    • "*.example.com" to match anything under example.com +
    • "example.com" to match just example.com +

    TODO: annoyingly enough, this method eventually calls escape, so + any headers you set won't be used, and the computation immediatly ends. +

    rproxyServeSource
    :: MonadIO m
    => Stringmap to look up hostname mappings. For the reverse proxy +
    -> [(String, String)]the result is a ServerPartT that will reverse proxy for you. +
    -> ServerPartT m Response

    This is a reverse proxy implementation. + See unrproxify. +

    TODO: this would be more useful if it didn't call escape, just like + proxyServe'. +

    unknown +
    debugFilter :: (MonadIO m, Show a) => ServerPartT m a -> ServerPartT m aSource
    What is this for, exactly? I don't understand why Show a is even in the context + This appears to do nothing at all. +
    applyRequest :: (ToMessage a, Monad m, Functor m) => ServerPartT m a -> Request -> Either (m Response) bSource
    Again, why is this useful? +
    Parsing input and cookies +
    lookInput :: String -> RqData InputSource
    Useful inside the RqData monad. Gets the named input parameter + (either from a POST or a GET request). +
    lookBS :: String -> RqData ByteStringSource
    Get the named input parameter as a ByteString. +
    look :: String -> RqData StringSource
    Get the named input as a String. +
    lookCookie :: String -> RqData CookieSource
    Get the named cookie. + The cookie name is case insensitive. +
    lookCookieValue :: String -> RqData StringSource
    Get the named cookie as a String. +
    readCookieValue :: Read a => String -> RqData aSource
    Get the named cookie as the requested Read type. +
    lookRead :: Read a => String -> RqData aSource
    Like look, but Reads for you. +
    lookPairs :: RqData [(String, String)]Source
    Get all the input parameters and convert them to a String. +
    XSLT +
    xsltSource
    :: (MonadIO m, MonadPlus m, ToMessage r)
    => XSLTCmdPath to xslt stylesheet. +
    -> XSLPathAffected ServerParts. +
    -> m r
    -> m Response
    Use cmd to transform XML against xslPath. + This function only acts if the content-type is application/xml. +
    doXslt :: MonadIO m => XSLTCmd -> XSLPath -> Response -> m ResponseSource
    Error Handlng +
    errorHandlerSP :: (Monad m, Error e) => (Request -> e -> WebT m a) -> ServerPartT (ErrorT e m) a -> ServerPartT m aSource

    This ServerPart modifier enables the use of throwError and catchError inside the + WebT actions, by adding the ErrorT monad transformer to the stack. +

    You can wrap the complete second argument to simpleHTTP in this function. +

    simpleErrorHandler :: Monad m => String -> ServerPartT m ResponseSource

    An example error Handler to be used with spUnWrapErrorT, which returns the + error message as a plain text message to the browser. +

    Another possibility is to store the error message, e.g. as a FlashMsg, and + then redirect the user somewhere. +

    spUnwrapErrorT :: Monad m => (e -> ServerPartT m a) -> Request -> UnWebT (ErrorT e m) a -> UnWebT m aSource

    This is a for use with 'mapServerPartT\'' It it unwraps the + interior monad for use with simpleHTTP. If you have a + ServerPartT (ErrorT e m) a, this will convert that monad into a + ServerPartT m a. Used with 'mapServerPartT\'' to allow + throwError and catchError inside your monad. Eg. +

     simpleHTTP conf $ mapServerPartT' (spUnWrapErrorT failurePart)  $ myPart `catchError` errorPart
    +

    Note that failurePart will only be run if errorPart threw an error + so it doesn't have to be very complex. +

    Output Validation +
    setValidator :: (Response -> IO Response) -> Response -> ResponseSource

    Set the validator which should be used for this particular Response + when validation is enabled. +

    Calling this function does not enable validation. That can only be + done by enabling the validation in the Conf that is passed to + simpleHTTP. +

    You do not need to call this function if the validator set in + Conf does what you want already. +

    Example: (use noopValidator instead of the default supplied by validateConf) +

     simpleHTTP validateConf . anyRequest $ ok . setValidator noopValidator =<< htmlPage
    +

    See also: validateConf, wdgHTMLValidator, noopValidator, lazyProcValidator +

    setValidatorSP :: (Monad m, ToMessage r) => (Response -> IO Response) -> m r -> m ResponseSource

    ServerPart version of setValidator. +

    Example: (Set validator to noopValidator) +

      simpleHTTP validateConf $ setValidatorSP noopValidator (dir "ajax" ... )
    +
    validateConf :: ConfSource

    Extend nullConf by enabling validation and setting + wdgHTMLValidator as the default validator for text/html. +

    Example: +

     simpleHTTP validateConf . anyRequest $ ok htmlPage
    +
    runValidator :: (Response -> IO Response) -> Response -> IO ResponseSource

    Actually perform the validation on a Response. +

    Run the validator specified in the Response. If none is provide + use the supplied default instead. +

    Note: This function will run validation unconditionally. You + probably want setValidator or validateConf. +

    wdgHTMLValidator :: (MonadIO m, ToMessage r) => r -> m ResponseSource

    Validate text/html content with WDG HTML Validator. +

    This function expects the executable to be named validate + and it must be in the default PATH. +

    See also: setValidator, validateConf, lazyProcValidator. +

    noopValidator :: Response -> IO ResponseSource

    A validator which always succeeds. +

    Useful for selectively disabling validation. For example, if you + are sending down HTML fragments to an AJAX application and the + default validator only understands complete documents. +

    lazyProcValidatorSource
    :: FilePathname of executable +
    -> [String]arguements to pass to the executable +
    -> Maybe FilePathoptional path to working directory +
    -> Maybe [(String, String)]optional environment (otherwise inherit) +
    -> Maybe ByteString -> Boolcontent-type filter +
    -> ResponseResponse to validate +
    -> IO Response

    Validate the Response using an external application. +

    If the external application returns 0, the original response is + returned unmodified. If the external application returns non-zero, a Response + containing the error messages and original response body is + returned instead. +

    This function also takes a predicate filter which is applied to the + content-type of the response. The filter will only be applied if + the predicate returns true. +

    NOTE: This function requirse the use of -threaded to avoid blocking. + However, you probably need that for Happstack anyway. +

    See also: wdgHTMLValidator. +

    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-StdConfig.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-StdConfig.html 1 + + +Happstack.Server.StdConfig
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.StdConfig
    Synopsis
    binarylocation :: String
    loglocation :: String
    errWrap :: (MonadPlus m, FilterMonad Response m, MonadIO m) => m Response
    Documentation
    binarylocation :: StringSource
    Is equal to haskell/Main +
    loglocation :: StringSource
    Is equal to public/log +
    errWrap :: (MonadPlus m, FilterMonad Response m, MonadIO m) => m ResponseSource
    Convenience function around errorwrapper + with the default binary location set to binarylocation and the + log location set to loglocation. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server-XSLT.html hunk ./docs/0.5.0/happstack-server/Happstack-Server-XSLT.html 1 + + +Happstack.Server.XSLT
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server.XSLT
    Synopsis
    xsltFile :: XSLPath -> FilePath -> FilePath -> IO ()
    xsltString :: XSLPath -> String -> String
    xsltElem :: XSLPath -> Element -> String
    xsltFPS :: XSLPath -> [ByteString] -> [ByteString]
    xsltFPSIO :: XSLPath -> [ByteString] -> IO [ByteString]
    type XSLPath = FilePath
    xsltproc :: XSLTCmd
    saxon :: XSLTCmd
    procFPSIO :: XSLTCommand -> XSLPath -> [ByteString] -> IO [ByteString]
    procLBSIO :: XSLTCmd -> XSLPath -> ByteString -> IO ByteString
    type XSLTCommand = XSLPath -> FilePath -> FilePath -> (FilePath, [String])
    data XSLTCmd
    Documentation
    xsltFile :: XSLPath -> FilePath -> FilePath -> IO ()Source
    Note that the xsl file must have .xsl suffix. +
    xsltString :: XSLPath -> String -> StringSource
    Uses the provided xsl file to transform the given string. + This function creates temporary files during its execution, but + guarantees their cleanup. +
    xsltElem :: XSLPath -> Element -> StringSource
    Uses xsltString to transform the given XML Element into a + a String. +
    xsltFPS :: XSLPath -> [ByteString] -> [ByteString]Source
    Performs an XSL transformation with lists of ByteStrings instead of + a String. +
    xsltFPSIO :: XSLPath -> [ByteString] -> IO [ByteString]Source
    Equivalent to xsltFPS but does not hide the inherent IO of the low-level + ByteString operations. +
    type XSLPath = FilePathSource
    xsltproc :: XSLTCmdSource
    Use xsltproc to transform XML. +
    saxon :: XSLTCmdSource
    Use saxon to transform XML. +
    procFPSIO :: XSLTCommand -> XSLPath -> [ByteString] -> IO [ByteString]Source
    procLBSIO :: XSLTCmd -> XSLPath -> ByteString -> IO ByteStringSource
    type XSLTCommand = XSLPath -> FilePath -> FilePath -> (FilePath, [String])Source
    data XSLTCmd Source
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/Happstack-Server.html hunk ./docs/0.5.0/happstack-server/Happstack-Server.html 1 + + +Happstack.Server
     happstack-server-0.5.0: Web related tools and services.Source codeContentsIndex
    Happstack.Server
    Documentation
    module Happstack.Server.XSLT
    module Happstack.Server.SimpleHTTP
    module Happstack.Server.HTTP.Client
    module Happstack.Server.MessageWrap
    module Happstack.Server.HTTP.FileServe
    module Happstack.Server.StdConfig
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/doc-index-60.html hunk ./docs/0.5.0/happstack-server/doc-index-60.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (<)
    </<
    <>
    addfile ./docs/0.5.0/happstack-server/doc-index-A.html hunk ./docs/0.5.0/happstack-server/doc-index-A.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (A)
    addCookie
    addCookies
    addHeader
    addHeaderBS
    addHeaderM
    addHeaderUnsafe
    anyPath
    anyPath'
    anyRequest
    Append
    applyRequest
    asContentType
    askRq
    attrF
    attrFMb
    attrFS
    a_path
    a_scheme
    addfile ./docs/0.5.0/happstack-server/doc-index-B.html hunk ./docs/0.5.0/happstack-server/doc-index-B.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (B)
    badGateway
    badRequest
    basicAuth
    binarylocation
    bindPort
    blockDotFiles
    Body
    bodyInput
    bodyPartToInput
    addfile ./docs/0.5.0/happstack-server/doc-index-C.html hunk ./docs/0.5.0/happstack-server/doc-index-C.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (C)
    cdataElem
    composeFilter
    compressedResponseFilter
    Conf
    1 (Type/Class)
    2 (Data Constructor)
    CONNECT
    ContentType
    1 (Type/Class)
    2 (Data Constructor)
    continueHTTP
    Cookie
    1 (Type/Class)
    2 (Data Constructor)
    cookieDomain
    cookieName
    cookiePath
    cookiesParser
    cookieValue
    cookieVersion
    CSS
    ctParameters
    ctSubtype
    ctType
    addfile ./docs/0.5.0/happstack-server/doc-index-D.html hunk ./docs/0.5.0/happstack-server/doc-index-D.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (D)
    debugFilter
    decodeBody
    defaultInputType
    defaultIxFiles
    deflateFilter
    DELETE
    dir
    dirs
    doIndex
    doIndex'
    doIndexLazy
    doIndexStrict
    doXslt
    addfile ./docs/0.5.0/happstack-server/doc-index-E.html hunk ./docs/0.5.0/happstack-server/doc-index-E.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (E)
    e
    Element
    elF
    ElString
    1 (Type/Class)
    2 (Data Constructor)
    elString
    emptyElem
    encodings
    errorHandlerSP
    errorwrapper
    errWrap
    escape
    1 (Function)
    2 (Function)
    escape'
    expireCookie
    addfile ./docs/0.5.0/happstack-server/doc-index-F.html hunk ./docs/0.5.0/happstack-server/doc-index-F.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (F)
    filePathLazy
    filePathSendFile
    filePathStrict
    fileServe
    fileServe'
    fileServeLazy
    fileServeStrict
    FilterFun
    FilterMonad
    FilterT
    1 (Type/Class)
    2 (Data Constructor)
    finishWith
    flatten
    forbidden
    formDecode
    found
    FromData
    fromData
    FromPath
    fromPath
    FromReqURI
    fromReqURI
    addfile ./docs/0.5.0/happstack-server/doc-index-G.html hunk ./docs/0.5.0/happstack-server/doc-index-G.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (G)
    GET
    getCookie
    getCookie'
    getCookies
    getCookies'
    getData
    getDataFn
    getFilter
    getHeader
    getHeaderBS
    getHeaderM
    getHeaderUnsafe
    getResponse
    getRoot
    guardRq
    guessContentType
    guessContentTypeM
    gzipFilter
    addfile ./docs/0.5.0/happstack-server/doc-index-H.html hunk ./docs/0.5.0/happstack-server/doc-index-H.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (H)
    hasHeader
    hasHeaderBS
    hasHeaderUnsafe
    hasStyleURL
    HEAD
    HeaderPair
    1 (Type/Class)
    2 (Data Constructor)
    Headers
    hName
    Host
    host
    hValue
    addfile ./docs/0.5.0/happstack-server/doc-index-I.html hunk ./docs/0.5.0/happstack-server/doc-index-I.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (I)
    ifModifiedSince
    ignoreFilters
    Input
    1 (Type/Class)
    2 (Data Constructor)
    inputContentType
    inputFilename
    inputValue
    internalServerError
    isAbs
    isCSS
    isDot
    isXSL
    addfile ./docs/0.5.0/happstack-server/doc-index-L.html hunk ./docs/0.5.0/happstack-server/doc-index-L.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (L)
    l
    lazyByteStringResponse
    lazyProcValidator
    listElem
    listen
    listen'
    listenOn
    listToEl
    localContext
    localRq
    loglocation
    look
    lookBS
    lookCookie
    lookCookieValue
    lookInput
    lookPairs
    lookRead
    addfile ./docs/0.5.0/happstack-server/doc-index-M.html hunk ./docs/0.5.0/happstack-server/doc-index-M.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (M)
    mapServerPartT
    mapServerPartT'
    mapWebT
    Method
    method
    methodM
    methodOnly
    methodSP
    MimeMap
    mimeTypes
    mkCookie
    mkCookieHeader
    mkHeaders
    mkWebT
    modifyResponse
    movedPermanently
    multi
    multipartDecode
    addfile ./docs/0.5.0/happstack-server/doc-index-N.html hunk ./docs/0.5.0/happstack-server/doc-index-N.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (N)
    noContentLength
    noHandle
    nonEmpty
    noopValidator
    NoStyle
    notFound
    nullConf
    nullDir
    nullRsFlags
    addfile ./docs/0.5.0/happstack-server/doc-index-O.html hunk ./docs/0.5.0/happstack-server/doc-index-O.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (O)
    ok
    OPTIONS
    addfile ./docs/0.5.0/happstack-server/doc-index-P.html hunk ./docs/0.5.0/happstack-server/doc-index-P.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (P)
    parse
    parseConfig
    parseCookies
    parseResponse
    path
    1 (Function)
    2 (Function)
    pathEls
    port
    POST
    procFPSIO
    procLBSIO
    proxyServe
    PUT
    putRequest
    addfile ./docs/0.5.0/happstack-server/doc-index-Q.html hunk ./docs/0.5.0/happstack-server/doc-index-Q.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (Q)
    query
    queryInput
    quoteEsc
    addfile ./docs/0.5.0/happstack-server/doc-index-R.html hunk ./docs/0.5.0/happstack-server/doc-index-R.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (R)
    readCookieValue
    ReadString
    readString
    recToEl
    redirect
    render
    Request
    1 (Type/Class)
    2 (Data Constructor)
    request
    require
    requireM
    Response
    1 (Type/Class)
    2 (Data Constructor)
    result
    resultBS
    rproxyServe
    RqBody
    rqBody
    rqCookies
    RqData
    rqHeaders
    rqInputs
    rqMethod
    rqPaths
    rqPeer
    rqQuery
    rqUri
    rqURL
    rqVersion
    rsBody
    rsCode
    rsfContentLength
    RsFlags
    1 (Type/Class)
    2 (Data Constructor)
    rsFlags
    rsHeaders
    rsValidator
    runServerPartT
    runValidator
    runWebT
    addfile ./docs/0.5.0/happstack-server/doc-index-S.html hunk ./docs/0.5.0/happstack-server/doc-index-S.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (S)
    saxon
    scheme
    secure
    seeOther
    SendFile
    sendFileResponse
    serveFile
    serveFileUsing
    ServerMonad
    ServerPart
    ServerPartT
    1 (Type/Class)
    2 (Data Constructor)
    Set
    SetAppend
    setFilter
    setHeader
    setHeaderBS
    setHeaderM
    setHeaderUnsafe
    setResponseCode
    setRsCode
    setValidator
    setValidatorSP
    sfCount
    sfFilePath
    sfOffset
    simpleDoc
    simpleDoc'
    simpleDocOld
    simpleErrorHandler
    simpleHTTP
    simpleHTTP'
    simpleHTTP''
    simpleHTTPWithSocket
    simpleHTTPWithSocket'
    simpleInput
    simpleProlog
    spUnwrapErrorT
    strictByteStringResponse
    StyleSheet
    StyleURL
    styleURL
    SURI
    1 (Type/Class)
    2 (Data Constructor)
    suri
    addfile ./docs/0.5.0/happstack-server/doc-index-T.html hunk ./docs/0.5.0/happstack-server/doc-index-T.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (T)
    t
    tempRedirect
    textElem
    toAttrs
    toContentType
    ToElement
    toElement
    ToMessage
    toMessage
    toResponse
    toResponseBS
    ToSURI
    toSURI
    TRACE
    trailingSlash
    addfile ./docs/0.5.0/happstack-server/doc-index-U.html hunk ./docs/0.5.0/happstack-server/doc-index-U.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (U)
    unauthorized
    unEscape
    unFilterT
    unproxify
    unrproxify
    unServerPartT
    ununWebT
    UnWebT
    unWebT
    uriRest
    u_path
    u_scheme
    addfile ./docs/0.5.0/happstack-server/doc-index-V.html hunk ./docs/0.5.0/happstack-server/doc-index-V.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (V)
    validateConf
    validator
    verbim
    Version
    1 (Type/Class)
    2 (Data Constructor)
    addfile ./docs/0.5.0/happstack-server/doc-index-W.html hunk ./docs/0.5.0/happstack-server/doc-index-W.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (W)
    wdgHTMLValidator
    Web
    WebMonad
    WebT
    1 (Type/Class)
    2 (Data Constructor)
    withData
    withDataFn
    withHost
    withRequest
    wrapElem
    addfile ./docs/0.5.0/happstack-server/doc-index-X.html hunk ./docs/0.5.0/happstack-server/doc-index-X.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    ABCDEFGHILMNOPQRSTUVWX<
    Index (X)
    XML
    1 (Type/Class)
    2 (Data Constructor)
    xmlElem
    xmlEscaper
    xmlStdEscape
    XSL
    XSLPath
    xslt
    XSLTCmd
    XSLTCommand
    xsltElem
    xsltFile
    xsltFPS
    xsltFPSIO
    xsltproc
    xsltString
    addfile ./docs/0.5.0/happstack-server/doc-index.html hunk ./docs/0.5.0/happstack-server/doc-index.html 1 + + +happstack-server-0.5.0: Web related tools and services. (Index)
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    Index
    ABCDEFGHILMNOPQRSTUVWX<
    addfile ./docs/0.5.0/happstack-server/frames.html hunk ./docs/0.5.0/happstack-server/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/happstack-server/haddock-util.js hunk ./docs/0.5.0/happstack-server/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/happstack-server/haddock.css hunk ./docs/0.5.0/happstack-server/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + addfile ./docs/0.5.0/happstack-server/happstack-server.haddock binary ./docs/0.5.0/happstack-server/happstack-server.haddock oldhex * newhex *0d0cface000f0002860d0002621eff0000015d0000000000000000000000010000000100000000 *000000010000000200000000000000010000000300000000000000010000000400000000000000 *010000000500000000000000020000000600000000000000020000000700000000000000020000 *000800000000000000020000000900000000000000020000000a00000000000000020000000b00 *000000000000020000000c00000000000000020000000d00000000000000020000000e00000000 *000000020000000f00000000000000020000001000000000000000020000001100000000000000 *020000001200000000000000020000001300000000000000020000001400000000000000020000 *001500000000000000020000001600000000000000020000001700000000000000020000001800 *000000000000020000001900000000000000020000001a00000000000000020000001b00000000 *000000020000001c00000000000000020000001d00000000000000020000001e00000000000000 *020000001f00000000000000020000002000000000000000020000002100000000000000020000 *002200000000000000020000002300000000000000020000002400000000000000020000002500 *000000000000020000002600000000000000020000002700000000000000020000002800000000 *000000020000002900000000000000020000002a00000000000000020000002b00000000000000 *020000002c00000000000000020000002d00000000000000020000002e00000000000000020000 *002f00000000000000020000003000000000000000020000003100000000000000020000003200 *000000000000030000003300000000000000030000003400000000000000030000003500000000 *000000030000003600000000000000030000003700000000000000030000003800000000000000 *030000003900000000000000030000003a00000000000000030000003b00000000000000030000 *003c00000000000000030000003d00000000000000030000003e00000000000000030000003f00 *000000000000030000004000000000000000030000004100000000000000030000004200000000 *000000030000004300000000000000030000004400000000000000030000004500000000000000 *040000004600000000000000040000004700000000000000040000004800000000000000040000 *004900000000000000040000004a00000000000000040000004b00000000000000040000004c00 *000000000000040000004d00000000000000040000004e00000000000000040000004f00000000 *000000040000005000000000000000040000005100000000000000040000005200000000000000 *040000005300000000000000040000005400000000000000040000005500000000000000010000 *005600000000000000010000005700000000000000010000005800000000000000010000005900 *000000000000010000005a00000000000000010000005b00000000000000010000005c00000000 *000000010000005d00000000000000010000005e00000000000000010000005f00000000000000 *010000006000000000000000010000006100000000000000010000006200000000000000010000 *006300000000000000010000006400000000000000010000006500000000000000010000006600 *000000000000010000006700000000000000010000006800000000000000010000006900000000 *000000010000006a00000000000000010000006b00000000000000010000006c00000000000000 *010000006d00000000000000010000006e00000000000000010000006f00000000000000010000 *007000000000000000010000007100000000000000010000007200000000000000010000007300 *000000000000010000007400000000000000010000007500000000000000010000007600000000 *000000010000007700000000000000010000007800000000000000010000007900000000000000 *010000007a00000000000000010000007b00000000000000010000007c00000000000000010000 *007d00000000000000010000007e00000000000000010000007f00000000000000010000008000 *000000000000010000008100000000000000010000008200000000000000010000008300000000 *000000010000008400000000000000010000008500000000000000010000008600000000000000 *010000008700000000000000010000008800000000000000010000008900000000000000010000 *008a00000000000000010000008b00000000000000010000008c00000000000000010000008d00 *000000000000010000008e00000000000000010000008f00000000000000010000009000000000 *000000010000009100000000000000010000009200000000000000010000009300000000000000 *010000009400000000000000010000009500000000000000010000009600000000000000010000 *009700000000000000010000009800000000000000010000009900000000000000010000009a00 *000000000000010000009b00000000000000010000009c00000000000000010000009d00000000 *000000010000009e00000000000000010000009f0000000000000001000000a000000000000000 *01000000a10000000000000005000000a20000000000000005000000a300000000000000050000 *00a40000000000000005000000a50000000000000005000000a60000000000000005000000a700 *00000000000005000000a80000000000000005000000a90000000000000005000000aa00000000 *00000005000000ab0000000000000005000000ac0000000000000006000000ad00000000000000 *06000000ae0000000000000006000000af0000000000000006000000b000000000000000060000 *00b10000000000000006000000b20000000000000007000000b30000000000000007000000b400 *00000000000007000000b50000000000000008000000b60000000000000008000000b700000000 *00000008000000b80000000000000008000000b90000000000000008000000ba00000000000000 *08000000bb0000000000000008000000bc0000000000000008000000bd00000000000000080000 *00be0000000000000008000000bf0000000000000008000000c00000000000000008000000c100 *00000000000009000000c20000000000000009000000c30000000000000009000000c400000000 *00000009000000c50000000000000009000000c60000000000000009000000c700000000000000 *09000000c80000000000000009000000c90000000000000009000000ca00000000000000090000 *00cb0000000000000009000000cc0000000000000009000000cd0000000000000009000000ce00 *00000000000009000000cf0000000000000009000000d00000000000000009000000d100000000 *00000009000000d20000000000000009000000d30000000000000009000000d400000000000000 *09000000d50000000000000009000000d60000000000000009000000d700000000000000090000 *00d80000000000000009000000d90000000000000009000000da0000000000000009000000db00 *00000000000009000000dc0000000000000009000000dd0000000000000009000000de00000000 *00000009000000df0000000000000009000000e00000000000000009000000e100000000000000 *09000000e20000000000000009000000e30000000000000009000000e400000000000000090000 *00e50000000000000009000000e60000000000000009000000e70000000000000009000000e800 *00000000000009000000e90000000000000009000000ea0000000000000009000000eb00000000 *00000009000000ec0000000000000009000000ed0000000000000009000000ee00000000000000 *09000000ef0000000000000009000000f00000000000000009000000f100000000000000090000 *00f20000000000000009000000f30000000000000009000000f40000000000000009000000f500 *00000000000009000000f60000000000000009000000f70000000000000009000000f800000000 *00000009000000f90000000000000009000000fa0000000000000009000000fb00000000000000 *09000000fc0000000000000009000000fd0000000000000009000000fe00000000000000090000 *00ff00000000000000090000010000000000000000090000010100000000000000090000010200 *000000000000090000010300000000000000090000010400000000000000090000010500000000 *000000090000010600000000000000090000010700000000000000090000010800000000000000 *090000010900000000000000090000010a00000000000000090000010b00000000000000090000 *010c00000000000000090000010d00000000000000090000010e00000000000000090000010f00 *000000000000090000011000000000000000090000011100000000000000090000011200000000 *000000090000011300000000000000090000011400000000000000090000011500000000000000 *090000011600000000000000090000011700000000000000090000011800000000000000090000 *011900000000000000090000011a00000000000000090000011b00000000000000090000011c00 *000000000000090000011d00000000000000090000011e00000000000000090000011f00000000 *000000090000012000000000000000090000012100000000000000090000012200000000000000 *090000012300000000000000090000012400000000000000090000012500000000000000090000 *012600000000000000090000012700000000000000090000012800000000000000090000012900 *000000000000090000012a00000000000000090000012b00000000000000090000012c00000000 *000000090000012d00000000000000090000012e00000000000000090000012f00000000000000 *090000013000000000000000090000013100000000000000090000013200000000000000090000 *013300000000000000090000013400000000000000090000013500000000000000090000013600 *000000000000090000013700000000000000090000013800000000000000090000013900000000 *000000090000013a00000000000000090000013b00000000000000090000013c00000000000000 *090000013d000000000000000a0000013e000000000000000a0000013f000000000000000a0000 *0140000000000000000a00000141000000000000000a00000142000000000000000a0000014300 *0000000000000a00000144000000000000000a00000145000000000000000a0000014600000000 *0000000a00000147000000000000000a00000148000000000000000a0000014900000000000000 *0a0000014a000000000000000a0000014b000000000000000a0000014c000000000000000a0000 *014d000000000000000a0000014e000000000000000a0000014f000000000000000a0000015000 *0000000000000a00000151000000000000000a00000152000000000000000a0000015300000000 *0000000a00000154000000000000000a00000155000000000000000a0000015600000000000000 *0b00000157000000000000000b00000158000000000000000b00000159000000000000000c0000 *015a000000000000000c0000015b000000000000000c0000015c000000000000000c1a00000000 *0000000d00000000010000015d0000010000015d000100010000015d00000000000000000e0000 *0000010000015e01030245000000610000006c0000007400000065000000720000006e00000061 *0000007400000069000000760000006500000020000000690000006d000000700000006c000000 *650000006d000000650000006e000000740000006100000074000000690000006f0000006e0000 *00200000006f000000660000002000000061000000630000006300000065000000700000007400 *000020000000740000006f00000020000000770000006f000000720000006b0000002000000061 *000000720000006f000000750000006e0000006400000020000000450000004100000049000000 *5f000000410000004700000041000000490000004e000000200000006500000072000000720000 *006f00000072000000730000000a00010000015e000100010000015e00000000000000000f0000 *0000080000015f0000000001600000000001610000000001620000000001630000000001640000 *00000165000000000166000007000001670000015f000001610000016200000163000001640000 *0165000100060000015f0000000161000000016200000001630000000164000000016500000000 *0000000010000000000b0000016800000000016900000000016a00000000016b00000000016c00 *000000016d00000000016e00000000016f00000000017000000000017100000000017200000100 *0001680001000100000168000000000000000011000108000000700000006f0000007200000074 *00000061000000620000006c00000065010c000000650000007800000070000000650000007200 *0000690000006d000000650000006e00000074000000610000006c010d0000006c000000650000 *006d0000006d000000690000006800000040000000760000006f0000002e000000630000006f00 *00006d290000017300000000017400000000017500000000017600000000000001030102190000 *0041000000200000004d000000490000004d00000045000000200000006d000000650000006400 *000069000000610000002000000074000000790000007000000065000000200000007600000061 *0000006c00000075000000650000002e0000000a01020700000020000000200000002000000054 *0000006800000065000000200104010000017701022400000020000000690000006e0000007300 *000074000000610000006e00000063000000650000002000000069000000730000002000000064 *000000650000007200000069000000760000006500000064000000200000006100000075000000 *740000006f0000006d00000061000000740000006900000063000000610000006c0000006c0000 *00790000002e0000000a0102070000002000000020000000200000005500000073000000650000 *00200104010000017801021800000020000000740000006f000000200000006f00000062000000 *7400000061000000690000006e0000002000000074000000680000006500000020000000730000 *0074000000610000006e000000640000006100000072000000640000000a01021a000000200000 *002000000020000000730000007400000072000000690000006e00000067000000200000007200 *00006500000070000000720000006500000073000000650000006e000000740000006100000074 *000000690000006f0000006e0000002e0000000a01020700000020000000200000002000000053 *000000650000006500000020010c23000000680000007400000074000000700000003a0000002f *0000002f0000007700000077000000770000002e00000069000000650000007400000066000000 *2e0000006f00000072000000670000002f0000007200000066000000630000002f000000720000 *006600000063000000320000003000000034000000360000002e00000074000000780000007401 *020a00000020000000660000006f00000072000000200000006d0000006f000000720000006500 *00000a0227000000200000002000000020000000690000006e000000660000006f000000720000 *006d0000006100000074000000690000006f0000006e0000002000000061000000620000006f00 *00007500000074000000200000004d000000490000004d00000045000000200000006d00000065 *000000640000006900000061000000200000007400000079000000700000006500000073000000 *2e0000000a0000000001000000000002010301022b000000540000006800000065000000200000 *00740000006f000000700000002d0000006c0000006500000076000000650000006c0000002000 *00006d000000650000006400000069000000610000002000000074000000790000007000000065 *0000002c000000200000007400000068000000650000002000000067000000650000006e000000 *6500000072000000610000006c00000020000000740000007900000070000000650000000a0102 *240000002000000020000000200000006f00000066000000200000007400000068000000650000 *0020000000640000006100000074000000610000002e00000020000000430000006f0000006d00 *00006d0000006f0000006e000000200000006500000078000000610000006d000000700000006c *0000006500000073000000200000006100000072000000650000000a0102030000002000000020 *000000200102010000002201020400000074000000650000007800000074010201000000220102 *020000002c0000002001020100000022010205000000690000006d000000610000006700000065 *010201000000220102020000002c00000020010201000000220102050000006100000075000000 *64000000690000006f010201000000220102020000002c00000020010201000000220102050000 *00760000006900000064000000650000006f010201000000220102020000002c0000000a010203 *000000200000002000000020010201000000220102090000006d000000750000006c0000007400 *00006900000070000000610000007200000074010201000000220102060000002c000000200000 *00610000006e00000064000000200102010000002201020b000000610000007000000070000000 *6c00000069000000630000006100000074000000690000006f0000006e01020100000022020200 *00002e0000000a0000000003010301022d000000540000006800000065000000200000006d0000 *006500000064000000690000006100000020000000730000007500000062000000740000007900 *000070000000650000002c00000020000000740000006800000065000000200000007300000070 *000000650000006300000069000000660000006900000063000000200000006400000061000000 *740000006100000020000000660000006f000000720000006d00000061000000740000002e0000 *000a0102140000002000000020000000200000004500000078000000610000006d000000700000 *006c000000650000007300000020000000690000006e000000630000006c000000750000006400 *0000650000002001020100000022010205000000700000006c00000061000000690000006e0102 *01000000220102020000002c000000200102010000002201020400000068000000740000006d00 *00006c010201000000220102020000002c0000000a010203000000200000002000000020010201 *000000220102040000006a000000700000006500000067010201000000220102020000002c0000 *002001020100000022010209000000660000006f000000720000006d0000002d00000064000000 *6100000074000000610102010000002202070000002c0000002000000065000000740000006300 *00002e0000000a0000000004010301022c0000004d000000650000006400000069000000610000 *002000000074000000790000007000000065000000200000007000000061000000720000006100 *00006d00000065000000740000006500000072000000730000002e000000200000004f0000006e *00000020000000630000006f0000006d0000006d0000006f0000006e0000002000000065000000 *78000000610000006d000000700000006c000000650000002000000069000000730000000a0102 *210000002000000020000000200000007400000068000000650000002000000063000000680000 *006100000072000000730000006500000074000000200000007000000061000000720000006100 *00006d0000006500000074000000650000007200000020000000660000006f0000007200000020 *000000740000006800000065000000200102010000002201020400000074000000650000007800 *00007401020100000022010202000000200000000a010218000000200000002000000020000000 *740000006f000000700000002d0000006c0000006500000076000000650000006c000000200000 *00740000007900000070000000650000002c00000020000000650000002e000000670000002e00 *000020010701020100000028010201000000220102070000006300000068000000610000007200 *0000730000006500000074010201000000220102010000002c0102010000002201020a00000049 *000000530000004f0000002d000000380000003800000035000000390000002d00000031010201 *0000002202010000002902020000002e0000000a000000017900000000017a00000000017b0000 *0000017c00000000017d00000000017e00000000017f000000000178010301023e000000500000 *00720000006f000000640000007500000063000000650000002000000074000000680000006500 *0000200000007300000074000000610000006e0000006400000061000000720000006400000020 *000000730000007400000072000000690000006e00000067000000200000007200000065000000 *70000000720000006500000073000000650000006e000000740000006100000074000000690000 *006f0000006e000000200000006f00000066000000200000006100000020000000630000006f00 *00006e00000074000000650000006e000000740000002d00000074000000790000007000000065 *0000002c0000000a010208000000200000002000000020000000650000002e000000670000002e *0000002001020100000022010204000000740000006500000078000000740102010000002f0102 *1800000068000000740000006d0000006c0000003b000000200000006300000068000000610000 *00720000007300000065000000740000003d00000049000000530000004f0000002d0000003800 *00003800000035000000390000002d000000310102010000002202020000002e0000000a000000 *018000000000018101030102350000005000000061000000720000007300000065000000200000 *00740000006800000065000000200000007300000074000000610000006e000000640000006100 *000072000000640000002000000072000000650000007000000072000000650000007300000065 *0000006e000000740000006100000074000000690000006f0000006e000000200000006f000000 *66000000200000006100000020000000630000006f0000006e00000074000000650000006e0000 *00740000002d000000740000007900000070000000650000002e0000000a010236000000200000 *002000000020000000490000006600000020000000740000006800000065000000200000006900 *00006e0000007000000075000000740000002000000063000000610000006e0000006e0000006f *000000740000002000000062000000650000002000000070000000610000007200000073000000 *65000000640000002c000000200000007400000068000000690000007300000020000000660000 *00750000006e0000006300000074000000690000006f0000006e00000020000000630000006100 *00006c0000006c000000730000000a01020300000020000000200000002001040100000182022f *000000200000007700000069000000740000006800000020000000610000002000000028000000 *680000006f000000700000006500000066000000750000006c0000006c00000079000000290000 *0020000000690000006e000000660000006f000000720000006d00000061000000740000006900 *00007600000065000000200000006500000072000000720000006f00000072000000200000006d *0000006500000073000000730000006100000067000000650000002e0000000a00000001830000 *000001840000000001850000000001860000000001870000000001880000000001890000000001 *8a00000000018b00000000018c0103021200000052000000460000004300000020000000380000 *003200000032000000200000004c0000005700000053000000500000002d000000630000006800 *000061000000720000000a000000018d00000000018e0103022300000052000000460000004300 *0000200000003800000032000000320000002000000043000000520000004c0000004600000020 *00000028000000620000007500000074000000200000006d0000006f0000007200000065000000 *200000007000000065000000720000006d00000069000000730000007300000069000000760000 *0065000000290000000a000000018f010302090000004f0000006e00000065000000200000006c *000000690000006e000000650000000a0000000190000000000191000000000192000000000193 *000000000194000000000195000000000196000000000197000000000198000015000001730000 *017400000175000001760000000000000001000000020000000300000004000001790000017a00 *00017b0000017c000001780000018100000183000001850000018600000188000001890000018a *000100150000017301000001740000017400000001750100000176000001760000000000040000 *000100000002000000030000000400000001000000000200000000030000000004000000017900 *0000017a000000017b000000017c00000001780000000181000000018300000001850000000186 *00000001880000000189000000018a00000000000000001200000000040000019900000000019a *00000000019b00000000019c0000010000019c000100010000019c000000000000000013000119 *0000006e0000006f0000006e0000002d000000700000006f000000720000007400000061000000 *620000006c0000006500000020000000280000006e0000006f0000007400000020000000740000 *00650000007300000074000000650000006400000029010c000000650000007800000070000000 *6500000072000000690000006d000000650000006e00000074000000610000006c011200000062 *0000006a0000006f000000720000006e000000400000006200000072000000690000006e000000 *670000006500000072000000740000002e0000006e0000006500000074110000019d0103010217 *000000410000006c0000006c0000006f0000007700000073000000200000007300000074000000 *7200000065000000610000006d000000200000006c0000006f0000006700000067000000690000 *006e000000670000002e0000000a01020a00000020000000520000006500000066000000650000 *007200000020000000740000006f000000200104010000019e0208000000200000006200000065 *0000006c0000006f000000770000002e0000000a000000019f0000000001a001010301023f0000 *0053000000740000007200000065000000610000006d0000007300000020000000730000006800 *00006f000000750000006c00000064000000200000006d000000610000006b0000006500000020 *0000006c00000061000000790000006500000072000000690000006e0000006700000020000000 *6f0000006600000020000000540000004c000000530000002000000070000000720000006f0000 *00740000006f000000630000006f0000006c000000200000006500000061000000730000006900 *0000650000007200000020000000690000006e0000002000000066000000750000007400000075 *00000072000000650000002c0000000a0102130000002000000074000000680000006500000079 *00000020000000610000006c0000006c0000006f00000077000000200000007200000065000000 *6100000064000000690000006e000000670102010000002f010224000000770000007200000069 *00000074000000690000006e0000006700000020000000740000006f0000002000000066000000 *690000006c00000065000000730000002000000065000000740000006300000020000000660000 *006f00000072000000200000006400000065000000620000007500000067000000670000006900 *00006e000000670000002c0000000a01022b000000200000007400000068000000650000007900 *000020000000610000006c0000006c0000006f0000007700000020000000750000007300000065 *000000200000006f000000660000002000000070000000720000006f000000740000006f000000 *630000006f0000006c00000073000000200000006f000000740000006800000065000000720000 *00200000007400000068000000610000006e000000200000005400000043000000500102010000 *002f01020300000049000000500000000a021f00000020000000610000006e0000006400000020 *0000007400000068000000650000007900000020000000610000006c0000006c0000006f000000 *7700000020000000630000007500000073000000740000006f0000006d00000069000000730000 *006100000074000000690000006f0000006e0000002e0000000a03010228000000490000006e00 *00007300000074000000610000006e000000630000006500000073000000200000006f00000066 *000000200000007400000068000000690000007300000020000000630000006c00000061000000 *73000000730000002000000073000000680000006f000000750000006c00000064000000200000 *006e0000006f00000074000000200000007400000072000000690000006d0000000a01022d0000 *002000000074000000680000006500000020000000690000006e00000070000000750000007400 *000020000000690000006e00000020000000610000006e00000079000000200000007700000061 *000000790000002c00000020000000650000002e000000670000002e000000200000006c000000 *65000000610000007600000065000000200000004c00000046000000200000006f0000006e0000 *00200000006c000000690000006e000000650000000a01023300000020000000650000006e0000 *0064000000690000006e0000006700000073000000200000006500000074000000630000002e00 *000020000000550000006e0000006c000000650000007300000073000000200000007400000068 *000000610000007400000020000000690000007300000020000000650000007800000061000000 *63000000740000006c000000790000002000000074000000680000006500000020000000620000 *0065000000680000006100000076000000690000006f00000075000000720000000a0229000000 *20000000790000006f000000750000002000000077000000610000006e00000074000000200000 *0066000000720000006f0000006d00000020000000790000006f00000075000000720000002000 *00007400000077000000690000007300000074000000650000006400000020000000690000006e *0000007300000074000000610000006e000000630000006500000073000000200000003b000000 *290000000a00000001a10000000001a20000000001a30000000001a40000000001a50103023e00 *000054000000680000006900000073000000200000006900000073000000200000007400000068 *000000650000002000000074000000790000007000000065000000200000007200000065000000 *7400000075000000720000006e0000006500000064000000200000006200000079000000200000 *006d000000610000006e00000079000000200000006500000078000000700000006f0000007200 *0000740000006500000064000000200000006e0000006500000074000000770000006f00000072 *0000006b0000002000000066000000750000006e0000006300000074000000690000006f000000 *6e000000730000002e0000000a00000001a60000000001a70000000001a80000000001a9000000 *0001aa0000000001ab0000000001ac0000000001ad00000000019e010301021d00000057000000 *720000006100000070000000730000002000000061000000200000007300000074000000720000 *0065000000610000006d0000002000000077000000690000007400000068000000200000006c00 *00006f0000006700000067000000690000006e0000006700000020000000490102010000002f01 *020d0000004f0000002c0000002000000074000000680000006500000020000000660000006900 *00007200000073000000740000000a023700000020000000610000007200000067000000750000 *006d000000650000006e0000007400000020000000690000007300000020000000610000002000 *000066000000690000006c000000650000006e000000610000006d000000650000002000000077 *00000068000000690000006300000068000000200000006900000073000000200000006f000000 *70000000650000006e000000650000006400000020000000690000006e00000020000000410000 *007000000070000000650000006e000000640000004d0000006f00000064000000650000002e00 *00000a00100000019d000001a0000001a1000001a2000001a3000001a4000001a5000001a60000 *01a7000001a8000001a9000001aa000001ab000001ac000001ad0000019e000100100000019d00 *000001a004000001a1000001a2000001a3000001a4000001a100000001a200000001a300000001 *a400000001a500000001a604000001aa000001a9000001a8000001a7000001a700000001a80000 *0001a900000001aa00000001ab00000001ac00000001ad000000019e0000000000000000140001 *190000006e0000006f0000006e0000002d000000700000006f0000007200000074000000610000 *00620000006c0000006500000020000000280000006e0000006f00000074000000200000007400 *0000650000007300000074000000650000006400000029010c0000006500000078000000700000 *006500000072000000690000006d000000650000006e00000074000000610000006c0112000000 *620000006a0000006f000000720000006e000000400000006200000072000000690000006e0000 *00670000006500000072000000740000002e0000006e00000065000000740d000001ae01030102 *0400000054000000680000006500000020010401000001ae010234000000200000006f00000062 *0000006a00000065000000630000007400000020000000610000006c0000006c0000006f000000 *770000007300000020000000690000006e00000070000000750000007400000020000000620000 *007500000066000000660000006500000072000000690000006e000000670000002c0000002000 *0000610000006e00000064000000200000006d00000061000000690000006e0000007400000065 *0000006e000000610000006e0000006300000065000000200000006f0000006600000020000000 *0a021700000020000000730000006f0000006d000000650000002000000061000000640000006d *000000690000006e0000002d000000740000007900000070000000650000002000000064000000 *6100000074000000610000002e0000000a00000001af0000000001b00000000001b10000000001 *b20000000001b30000000001b40000000001b50103010204000000540000006800000065000000 *20010401000001b501022d000000200000006e0000006500000077000000740000007900000070 *000000650000002000000069000000730000002000000061000000200000007700000072000000 *610000007000000070000000650000007200000020000000740000006800000061000000740000 *0020000000610000006c0000006c0000006f000000770000007300000020000000750000007300 *000020000000740000006f000000200000006d000000610000006b000000650000000a01022800 *000020000000630000006f0000006e0000006e000000650000006300000074000000690000006f *0000006e0000007300000020000000610000006e00000020000000690000006e00000073000000 *74000000610000006e0000006300000065000000200000006f0000006600000020000000740000 *0068000000650000002000000053000000740000007200000065000000610000006d0000004900 *00006e0102010000002f0102250000004f000000750000007400000020000000630000006c0000 *0061000000730000007300000065000000730000002c0000002000000077000000690000007400 *0000680000006f0000007500000074000000200000006700000068000000630000002000000065 *0000007800000074000000650000006e00000073000000690000006f0000006e00000073000000 *2e0000000a010244000000200000005700000068000000690000006c0000006500000020000000 *74000000680000006900000073000000200000006c0000006f0000006f0000006b000000730000 *0020000000730000006f0000007200000074000000200000006f00000066000000200000006c00 *0000690000006b0000006500000020000000610000002000000067000000650000006e00000065 *000000720000006900000063000000200000007200000065000000660000006500000072000000 *650000006e000000630000006500000020000000740000006f0000002000000074000000680000 *0065000000200000007400000072000000610000006e00000073000000700000006f0000007200 *0000740000000a01023d000000200000006c000000610000007900000065000000720000002000 *000069000000740000002000000069000000730000002000000061000000630000007400000075 *000000610000006c0000006c000000790000002000000054000000430000005000000020000000 *73000000700000006500000063000000690000006600000069000000630000002c000000200000 *0077000000680000006900000063000000680000002000000063000000610000006e0000002000 *00006200000065000000200000007300000065000000650000006e00000020000000690000006e *000000200000007400000068000000650000000a01021700000020000000690000006d00000070 *0000006c000000650000006d000000650000006e00000074000000610000007400000069000000 *6f0000006e000000200000006f0000006600000020000000740000006800000065000000200102 *010000002701021100000053000000740000007200000065000000610000006d00000020000000 *430000006f0000006e0000006e000000650000006300000074000000690000006f0000006e0102 *0100000027020b00000020000000690000006e0000007300000074000000610000006e00000063 *000000650000002e0000000a00000001b60000000001b70000000001b80103022f0000004f0000 *0070000000650000006e000000200000006100000020000000630000006f0000006e0000006e00 *0000650000006300000074000000690000006f0000006e00000020000000740000006f00000020 *000000700000006f0000007200000074000000200000003800000030000000200000006f000000 *6e00000020000000610000002000000072000000650000006d0000006f00000074000000650000 *0020000000680000006f00000073000000740000002e0000000a00000001b90101030102330000 *00540000006800000069000000730000002000000066000000750000006e000000630000007400 *0000690000006f0000006e0000002000000065000000730000007400000061000000620000006c *000000690000007300000068000000650000007300000020000000610000002000000063000000 *6f0000006e0000006e000000650000006300000074000000690000006f0000006e000000200000 *00740000006f00000020000000610000002000000072000000650000006d0000006f0000007400 *0000650000000a01020f00000020000000680000006f00000073000000740000002c0000002000 *0000690000007400000020000000750000007300000065000000730000002001050d0000006700 *00006500000074000000480000006f000000730000007400000042000000790000004e00000061 *0000006d0000006501021800000020000000770000006800000069000000630000006800000020 *000000690000006e000000740000006500000072000000720000006f0000006700000061000000 *740000006500000073000000200000007400000068000000650000000a02350000002000000044 *0000004e000000530000002000000073000000790000007300000074000000650000006d000000 *2c0000002000000068000000650000006e0000006300000065000000200000006d000000610000 *007900000020000000740000007200000069000000670000006700000065000000720000002000 *000061000000200000006e0000006500000074000000770000006f000000720000006b00000020 *000000630000006f0000006e0000006e000000650000006300000074000000690000006f000000 *6e0000002e0000000a030102060000004100000064000000640000002000000061000000200105 *0a00000070000000650000007200000073000000690000007300000074000000610000006e0000 *0074010229000000200000006f0000007000000074000000690000006f0000006e0000003f0000 *00200000002000000043000000750000007200000072000000650000006e000000740000002000 *000070000000650000007200000073000000690000007300000074000000610000006e00000074 *000000200000006900000073000000200000006400000065000000660000006100000075000000 *6c000000740000002e0000000a0102050000002000000055000000730000006500000020010506 *000000520000006500000073000000750000006c00000074022b00000020000000740000007900 *0000700000006500000020000000660000006f000000720000002000000073000000790000006e *0000006300000068000000720000006f0000006e0000006f000000750000007300000020000000 *650000007800000063000000650000007000000074000000690000006f0000006e000000200000 *007200000065000000700000006f0000007200000074000000690000006e000000670000003f00 *00000a00000001ba0103010234000000430000006800000065000000630000006b000000730000 *0020000000620000006f0000007400000068000000200000007400000068000000610000007400 *00002000000074000000680000006500000020000000750000006e000000640000006500000072 *0000006c00000079000000690000006e0000006700000020000000530000006f00000063000000 *6b000000650000007400000020000000690000007300000020000000630000006f0000006e0000 *006e00000065000000630000007400000065000000640000000a01023000000020000000610000 *006e00000064000000200000007400000068000000610000007400000020000000740000006800 *00006500000020000000630000006f0000006e0000006e00000065000000630000007400000069 *0000006f0000006e0000002000000070000000650000006500000072000000200000006d000000 *610000007400000063000000680000006500000073000000200000007400000068000000650000 *0020000000670000006900000076000000650000006e0000000a02280000002000000068000000 *6f0000007300000074000000200000006e000000610000006d0000006500000020000000280000 *007700000068000000690000006300000068000000200000006900000073000000200000007200 *000065000000630000006f00000072000000640000006500000064000000200000006c0000006f *00000063000000610000006c0000006c00000079000000290000002e0000000a000d000001ae00 *0001af000001b0000001b1000001b2000001b3000001b4000001b5000001b6000001b7000001b8 *000001b9000001ba0001000d000001ae06000001b0000001af000001b1000001b2000001b30000 *01b4000001af00000001b000000001b100000001b200000001b300000001b400000001b5020000 *01b6000001b7000001b600000001b700000001b800000001b900000001ba000000000000000015 *0001190000006e0000006f0000006e0000002d000000700000006f000000720000007400000061 *000000620000006c0000006500000020000000280000006e0000006f0000007400000020000000 *74000000650000007300000074000000650000006400000029010c000000650000007800000070 *0000006500000072000000690000006d000000650000006e00000074000000610000006c011200 *0000620000006a0000006f000000720000006e000000400000006200000072000000690000006e *000000670000006500000072000000740000002e0000006e00000065000000747b000001bb0000 *000001bc0000000001bd0000000001be0000000001bf0000000001c00000000001c10103010212 *000000410000006e00000020000000480000005400000054000000500000002000000052000000 *6500000073000000700000006f0000006e00000073000000650000002e0000000a010205000000 *20000000540000006800000065000000200104010000017701023a00000020000000690000006e *0000007300000074000000610000006e0000006300000065000000200000006f00000066000000 *200000007400000068000000690000007300000020000000740000007900000070000000650000 *002000000069000000730000002000000075000000730000006500000064000000200000006600 *00006f00000072000000200000006d000000650000007300000073000000610000006700000065 *0000002000000073000000650000007200000069000000610000006c0000006900000073000000 *6100000074000000690000006f0000006e0000002c0000000a0102420000002000000077000000 *68000000690000006300000068000000200000006d00000065000000610000006e000000730000 *00200000006e0000006f00000020000000620000006f0000006400000079000000200000006400 *0000610000007400000061000000200000006900000073000000200000006f0000007500000074 *0000007000000075000000740000002c0000002000000061000000640000006400000069000000 *74000000690000006f0000006e000000610000006c0000006c0000007900000020000000740000 *006800000065000000200000006f00000075000000740000007000000075000000740000002000 *000077000000690000006c0000006c0000000a0102440000002000000073000000680000006f00 *00007700000020000000610000006e000000200000004800000054000000540000005000000020 *00000076000000650000007200000073000000690000006f0000006e000000200000006f000000 *6600000020000000310000002e0000003100000020000000690000006e00000073000000740000 *00650000006100000064000000200000006f000000660000002000000074000000680000006500 *00002000000061000000630000007400000075000000610000006c000000200000007600000065 *0000007200000073000000690000006f0000006e00000020000000720000006500000074000000 *75000000720000006e00000065000000640000000a020e00000020000000620000007900000020 *00000061000000200000007300000065000000720000007600000065000000720000002e000000 *0a00000001c20000000001c30000000001c40000000001c50000000001c60000000001c7000000 *0001c80000000001c90000000001ca0103010211000000410000006e0000002000000048000000 *540000005400000050000000200000005200000065000000710000007500000065000000730000 *00740000002e0000000a0102050000002000000054000000680000006500000020010401000001 *7701023a00000020000000690000006e0000007300000074000000610000006e00000063000000 *65000000200000006f000000660000002000000074000000680000006900000073000000200000 *007400000079000000700000006500000020000000690000007300000020000000750000007300 *0000650000006400000020000000660000006f00000072000000200000006d0000006500000073 *000000730000006100000067000000650000002000000073000000650000007200000069000000 *610000006c00000069000000730000006100000074000000690000006f0000006e0000002c0000 *000a0225000000200000007700000068000000690000006300000068000000200000006d000000 *65000000610000006e00000073000000200000006e0000006f00000020000000620000006f0000 *006400000079000000200000006400000061000000740000006100000020000000690000007300 *0000200000006f00000075000000740000007000000075000000740000002e0000000a00000001 *cb0000000001cc010301021e0000006d0000006900000067000000680000007400000020000000 *6e000000650000006500000064000000200000006300000068000000610000006e000000670000 *00690000006e0000006700000020000000690000006e0000002000000066000000750000007400 *00007500000072000000650000000a010210000000200000002000000031000000290000002000 *0000740000006f00000020000000730000007500000070000000700000006f0000007200000074 *00000020010401000001cd01021800000020000000750000007200000069000000200000006900 *00006e000000200000004f0000005000000054000000490000004f0000004e0000005300000020 *000000720000006500000071000000750000006500000073000000740000000a01022b00000020 *000000200000003200000029000000200000007400000072000000610000006e00000073000000 *700000006100000072000000650000006e00000074000000200000007300000075000000700000 *00700000006f000000720000007400000020000000660000006f00000072000000200000006200 *00006f00000074000000680000002000000072000000650000006c000000610000007400000069 *00000076000000650000000a010205000000200000002000000020000000200000002001020100 *000026010225000000200000006100000062000000730000006f0000006c000000750000007400 *00006500000020000000750000007200000069000000730000002c00000020000000610000006c *00000074000000680000006f000000750000006700000068000000200000007400000068000000 *69000000730000002000000073000000680000006f000000750000006c000000640000000a0102 *200000002000000020000000200000002000000020000000610000006c00000072000000650000 *0061000000640000007900000020000000770000006f000000720000006b000000200000002800 *00006c000000650000006100000076000000650000002000000073000000630000006800000065 *0000006d000000650000002001020100000026021400000020000000680000006f000000730000 *007400000020000000700000006100000072000000740000007300000020000000650000006d00 *0000700000007400000079000000290000002e0000000a00000001ce0000000001cf0000000001 *d00000000001d1010301022b000000540000006800000065000000200000004800000054000000 *540000005000000020000000720000006500000071000000750000006500000073000000740000 *00200000006d0000006500000074000000680000006f000000640000002c000000200000007400 *00006f000000200000006200000065000000200000007500000073000000650000006400000020 *000000690000006e0000002000000074000000680000006500000020010402000001cb000001ca *010209000000200000006f000000620000006a0000006500000063000000740000002e0000000a *01023d00000020000000570000006500000020000000610000007200000065000000200000006d *000000690000007300000073000000690000006e00000067000000200000006100000020000000 *660000006500000077000000200000006f00000066000000200000007400000068000000650000 *0020000000730000007400000072000000610000006e0000006700000065000000720000002000 *00006d0000006500000074000000680000006f00000064000000730000002c0000002000000062 *000000750000007400000020000000740000006800000065000000730000006500000020000000 *6100000072000000650000000a022d000000200000006e0000006f000000740000002000000072 *00000065000000610000006c0000006c00000079000000200000006e0000006500000063000000 *65000000730000007300000061000000720000007900000020000000750000006e000000740000 *00690000006c000000200000007700000065000000200000006100000064000000640000002000 *000066000000750000006c0000006c00000020000000540000004c000000530000002e0000000a *00000001d20000000001d30000000001d40000000001d50000000001d60000000001d700000000 *01d80000000001d901030102440000005400000068000000690000007300000020000000630000 *006c00000061000000730000007300000020000000610000006c0000006c0000006f0000007700 *00007300000020000000750000007300000020000000740000006f000000200000007700000072 *0000006900000074000000650000002000000067000000650000006e0000006500000072000000 *690000006300000020000000680000006500000061000000640000006500000072000000200000 *006d000000610000006e0000006900000070000000750000006c00000061000000740000006900 *00006f0000006e0000002000000066000000750000006e0000006300000074000000690000006f *0000006e000000730000000a01020a00000020000000660000006f000000720000002000000062 *0000006f000000740000006800000020010402000001cb000001ca010205000000200000006100 *00006e0000006400000020010402000001c2000001c1020d000000200000006400000061000000 *74000000610000002000000074000000790000007000000065000000730000002e0000000a0000 *0001da0000000001db0000000001dc010103010217000000480000005400000054000000500000 *0020000000480000006500000061000000640000006500000072000000200000004e0000006100 *00006d0000006500000020000000740000007900000070000000650000003a0000000a01023000 *0000200000002000000057000000680000007900000020000000690000006e000000630000006c *000000750000006400000065000000200000007400000068000000690000007300000020000000 *610000007400000020000000610000006c0000006c0000003f0000002000000020000000490000 *00200000006800000061000000760000006500000020000000730000006f0000006d0000006500 *000020000000720000006500000061000000730000006f0000006e000000730000000a01022f00 *000020000000200000002000000031000000290000002000000070000000720000006500000076 *000000650000006e00000074000000200000007300000070000000650000006c0000006c000000 *690000006e00000067000000200000006500000072000000720000006f00000072000000730000 *00200000006f000000660000002000000068000000650000006100000064000000650000007200 *0000200000006e000000610000006d00000065000000730000002c0000000a0102350000002000 *0000200000002000000032000000290000002000000072000000650000006d000000690000006e *000000640000002000000065000000760000006500000072000000790000006f0000006e000000 *65000000200000006f000000660000002000000077000000680000006100000074000000200000 *006800000065000000610000006400000065000000720000007300000020000000610000007200 *00006500000020000000610000007600000061000000690000006c00000061000000620000006c *000000650000002c0000000a023400000020000000200000002000000033000000290000002000 *00006d000000690000006700000068000000740000002000000073000000700000006500000065 *000000640000002000000075000000700000002000000073000000650000006100000072000000 *6300000068000000650000007300000020000000660000006f0000007200000020000000730000 *007000000065000000630000006900000066000000690000006300000020000000680000006500 *000061000000640000006500000072000000730000002e0000000a030102130000004100000072 *00000067000000750000006d000000650000006e00000074000000730000002000000061000000 *6700000061000000690000006e00000073000000740000003a0000000a01022f00000020000000 *20000000200000003100000029000000200000006d000000610000006b00000065000000730000 *0020000000630000007500000073000000740000006f0000006d00000069000000730000006900 *00006e000000670000002000000068000000650000006100000064000000650000007200000020 *0000006e000000610000006d0000006500000073000000200000006c0000006100000062000000 *6f00000072000000690000006f00000075000000730000000a021d000000200000002000000020 *000000320000002900000020000000690000006e00000063000000720000006500000061000000 *73000000650000007300000020000000630000006f000000640000006500000020000000760000 *006f0000006c000000750000006d000000650000002e0000000a00000001dd0103023100000041 *0000006c0000006c0000006f000000770000007300000020000000660000006f00000072000000 *20000000750000006e0000007200000065000000630000006f000000670000006e000000690000 *00730000006500000064000000200000006f000000720000002000000065000000780000007000 *00006500000072000000690000006d000000650000006e00000074000000610000006c00000020 *000000680000006500000061000000640000006500000072000000730000002e0000000a000000 *01de0000000001df0000000001e00000000001e10000000001e20000000001e30000000001e400 *00000001e50000000001e60000000001e70000000001e80000000001e90000000001ea00000000 *01eb0000000001ec0000000001ed0000000001ee0000000001ef0000000001f00000000001f100 *00000001f20000000001f30000000001f40000000001f50000000001f60000000001f700000000 *01f80000000001f90000000001fa0000000001fb0000000001fc0000000001fd0000000001fe00 *00000001ff00000000020000000000020100000000020200000000020300000000020400000000 *020500000000020600000000020700000000020800000000020900000000020a00000000020b00 *000000020c00000000020d00000000020e00000000020f01030102280000005400000068000000 *650000002000000048000000650000006100000064000000650000007200000020000000640000 *006100000074000000610000002000000074000000790000007000000065000000200000007000 *000061000000690000007200000073000000200000006800000065000000610000006400000065 *00000072000000200000006e000000610000006d00000065000000730000002001020100000026 *02090000002000000076000000610000006c0000007500000065000000730000002e0000000a00 *000002100000000002110000000002120000000002130000000002140000000002150000000002 *1600000000021700000000021800000000021900000000021a00000000021b0101010103010230 *000000490000006e00000073000000650000007200000074000000730000002000000061000000 *200000006800000065000000610000006400000065000000720000002000000077000000690000 *007400000068000000200000007400000068000000650000002000000067000000690000007600 *0000650000006e000000200000006e000000610000006d0000006500000020000000610000006e *000000640000002000000076000000610000006c00000075000000650000002e0000000a022000 *000020000000410000006c0000006c0000006f0000007700000073000000200000006400000075 *000000700000006c00000069000000630000006100000074000000650000002000000068000000 *6500000061000000640000006500000072000000200000006e000000610000006d000000650000 *00730000002e0000000a0301023600000041000000640000006400000073000000200000007400 *00006800000065000000200000006e000000650000007700000020000000680000006500000061 *000000640000006500000072000000200000006f0000006e0000006c0000007900000020000000 *6900000066000000200000006e0000006f00000020000000700000007200000065000000760000 *00690000006f000000750000007300000020000000680000006500000061000000640000006500 *000072000000200000007300000068000000610000007200000065000000730000000a02100000 *00200000007400000068000000650000002000000073000000610000006d000000650000002000 *00006e000000610000006d000000650000002e0000000a03022900000052000000650000006d00 *00006f000000760000006500000073000000200000006f0000006c000000640000002000000068 *000000650000006100000064000000650000007200000073000000200000007700000069000000 *7400000068000000200000006400000075000000700000006c0000006900000063000000610000 *007400000065000000200000006e000000610000006d000000650000002e0000000a03021a0000 *00490000006e0000007300000065000000720000007400000073000000200000006d0000007500 *00006c0000007400000069000000700000006c0000006500000020000000680000006500000061 *000000640000006500000072000000730000002e0000000a000000021c01030102290000004700 *00006500000074000000730000002000000061000000200000006c000000690000007300000074 *000000200000006f00000066000000200000006800000065000000610000006400000065000000 *720000007300000020000000770000006900000074000000680000002000000061000000200000 *00700000006100000072000000740000006900000063000000750000006c000000610000007200 *000020010401000001dc02020000002e0000000a000000021d010301023c0000004c0000006f00 *00006f0000006b0000007500000070000000200000007000000072000000650000007300000065 *0000006e0000006300000065000000200000006f00000066000000200000007300000070000000 *650000006300000069000000660000006900000063000000200000004800000065000000610000 *006400000065000000720000004e000000610000006d0000006500000020000000690000006e00 *00002000000061000000200000006c000000690000007300000074000000200000006f00000066 *00000020000000480000006500000061000000640000006500000072000000730000000a023300 *00002000000052000000650000007400000075000000720000006e000000730000002000000074 *00000068000000650000002000000076000000610000006c000000750000006500000020000000 *66000000720000006f0000006d0000002000000074000000680000006500000020000000660000 *0069000000720000007300000074000000200000006d0000006100000074000000630000006800 *0000690000006e0000006700000020000000680000006500000061000000640000006500000072 *0000002e0000000a000000021e00000000021f0000000002200000000002210000000002220000 *00000223000000000224000000000225000000000226010301024100000053000000690000006d *000000700000006c00000065000000200000007700000061000000790000002000000074000000 *6f0000002000000067000000650000007400000020000000610000002000000072000000650000 *00730000006f000000750000007200000063000000650000002000000061000000630000007200 *00006f00000073000000730000002000000061000000200000006e0000006f0000006e0000002d *00000070000000650000007200000073000000690000007300000074000000610000006e000000 *7400000020000000630000006f0000006e0000006e000000650000006300000074000000690000 *006f0000006e0000002e0000000a01021e00000020000000480000006500000061000000640000 *006500000072000000730000002000000074000000680000006100000074000000200000006d00 *0000610000007900000020000000620000006500000020000000610000006c0000007400000065 *0000007200000065000000640000003a0000000a01023e0000002000000020000000480000006f *000000730000007400000020000000200000002000000020000000200000002000000020000000 *20000000410000006c0000007400000065000000720000006500000064000000200000006f0000 *006e0000006c00000079000000200000006900000066000000200000006e0000006f0000002000 *0000480000006f0000007300000074000000200000006800000065000000610000006400000065 *000000720000002000000069000000730000002000000073000000750000007000000070000000 *6c0000006900000065000000640000002c00000020000000480000005400000054000000500102 *010000002f010204000000310000002e000000310000000a010226000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *200000002000000072000000650000007100000075000000690000007200000065000000730000 *00200000006100000020000000480000006f000000730000007400000020000000680000006500 *0000610000006400000065000000720000002e0000000a01024400000020000000200000004300 *00006f0000006e0000006e000000650000006300000074000000690000006f0000006e00000020 *000000200000005700000068000000650000007200000065000000200000006e0000006f000000 *20000000610000006c0000006c0000006f00000077000000610000006e00000063000000650000 *00200000006900000073000000200000006d000000610000006400000065000000200000006600 *00006f000000720000002000000070000000650000007200000073000000690000007300000074 *000000610000006e0000007400000020000000630000006f0000006e0000006e00000065000000 *6300000074000000690000006f0000006e000000730000000a0102330000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *00200000002000000074000000680000006500000020000000430000006f0000006e0000006e00 *0000650000006300000074000000690000006f0000006e00000020000000680000006500000061 *0000006400000065000000720000002000000077000000690000006c0000006c00000020000000 *62000000650000002000000073000000650000007400000020000000740000006f000000200105 *05000000630000006c0000006f000000730000006502010000000a000000022701030102050000 *004c000000690000006b000000650000002001040100000226022a0000002c0000002000000062 *000000750000007400000020000000610000006300000074000000690000006e00000067000000 *200000006f0000006e00000020000000610000006e00000020000000610000006c000000720000 *0065000000610000006400000079000000200000006f00000070000000650000006e0000006500 *0000640000002000000073000000740000007200000065000000610000006d0000002e0000000a *000000022801010301023200000074000000680000006900000073000000200000006900000073 *000000200000006e0000006f000000740000002000000074000000680000006500000020000000 *6d0000006f00000073000000740000002000000067000000720000006100000063000000650000 *0066000000750000006c000000200000006f0000006600000020000000690000006d0000007000 *00006c000000650000006d000000650000006e000000740000006100000074000000690000006f *0000006e000000730000002e0000000a01022e0000002000000054000000680000006500000020 *00000070000000720000006f000000620000006c000000650000006d0000002000000069000000 *730000002000000074000000680000006100000074000000200000004e00000065000000740000 *00770000006f000000720000006b0000002e0000005500000052000000490000002e0000006100 *00007500000074000000680000006f000000720000006900000074000000790000002000000069 *000000730000000a02360000002000000064000000650000007000000072000000650000006300 *0000610000007400000065000000640000002e0000002000000020000000410000006e00000064 *0000002000000077000000650000002000000077000000610000006e0000007400000020000000 *740000006f00000020000000750000007300000065000000200000004e00000065000000740000 *00770000006f000000720000006b0000002e0000005500000052000000490000002e0000005500 *00005200000049000000410000007500000074000000680000002e0000000a0301021e00000053 *0000006f0000002000000074000000680000006900000073000000200000006d00000065000000 *74000000680000006f000000640000002000000075000000730000006500000020000000740000 *006f00000020000000700000006100000072000000730000006500000020000000610000002001 *0504000000680000006f0000007300000074010210000000200000006600000069000000650000 *006c00000064000000200000006100000073000000200000006100000020000000550000005200 *0000490000000a01023000000020000000610000007500000074000000680000002c0000002000 *00007700000068000000690000006300000068000000200000006900000073000000200000006e *0000006f000000740000002000000073000000740000006900000063000000740000006c000000 *7900000020000000630000006f00000072000000720000006500000063000000740000002e0000 *0020000000200000005700000065000000200000007300000074000000690000006c0000006c00 *0000200000000a021a0000002000000066000000610000006b0000006500000020000000740000 *006800000061000000740000002000000062000000650000006800000061000000760000006900 *00006f0000007200000020000000680000006500000072000000650000002e0000000a00000002 *2900000000022a00000000022b0103010248000000520000006500000063000000650000006900 *0000760000006500000020000000610000006e0000006400000020000000700000006100000072 *000000730000006500000020000000610000002000000048000000540000005400000050000000 *200000007200000065000000710000007500000065000000730000007400000020000000660000 *00720000006f0000006d0000002000000074000000680000006500000020000000670000006900 *000076000000650000006e0000002000000053000000740000007200000065000000610000006d *0000002e0000002000000053000000680000006f000000750000006c0000006400000020000000 *62000000650000002000000075000000730000006500000064000000200000000a022100000020 *0000002000000020000000660000006f0000007200000020000000730000006500000072000000 *760000006500000072000000200000007300000069000000640000006500000020000000690000 *006e000000740000006500000072000000610000006300000074000000690000006f0000006e00 *0000730000002e0000000a000000022c0103010248000000560000006500000072000000790000 *002000000073000000690000006d000000700000006c0000006500000020000000660000007500 *00006e0000006300000074000000690000006f0000006e0000002c000000200000007300000065 *0000006e0000006400000020000000610000002000000048000000540000005400000050000000 *20000000720000006500000073000000700000006f0000006e0000007300000065000000200000 *006f00000076000000650000007200000020000000740000006800000065000000200000006700 *00006900000076000000650000006e000000200000007300000074000000720000006500000061 *0000006d0000002e0000002000000054000000680000006900000073000000200000000a023900 *0000200000002000000020000000630000006f000000750000006c000000640000002000000062 *0000006500000020000000690000006d00000070000000720000006f0000007600000065000000 *64000000200000006f0000006e00000020000000740000006f0000002000000075000000730000 *006500000020000000640000006900000066000000660000006500000072000000650000006e00 *000074000000200000007400000072000000610000006e00000073000000660000006500000072 *0000002000000074000000790000007000000065000000730000002e0000000a000000022d0103 *023400000055000000730000006500000064000000200000007700000068000000650000006e00 *0000200000007700000065000000200000006b0000006e0000006f000000770000002000000065 *000000780000006100000063000000740000006c0000007900000020000000680000006f000000 *77000000200000006d000000610000006e00000079000000200000006200000079000000740000 *00650000007300000020000000740000006f000000200000006500000078000000700000006500 *000063000000740000002e0000000a000000022e01030102270000005500000073000000650000 *0064000000200000007700000068000000650000006e000000200000006e0000006f0000007400 *000068000000690000006e000000670000002000000061000000620000006f0000007500000074 *000000200000006400000061000000740000006100000020000000690000007300000020000000 *6b0000006e0000006f000000770000006e0000002c0000000a01022e0000002000000020000000 *20000000550000006e000000660000006f0000007200000074000000750000006e000000610000 *0074000000650000006c0000007900000020000000770000006100000069000000740000006900 *00006e0000006700000020000000660000006f0000007200000020000000610000002000000073 *0000006f000000630000006b000000650000007400000020000000630000006c0000006f000000 *730000007500000072000000650000000a01022700000020000000200000002000000063000000 *610000007500000073000000650000007300000020000000620000006100000064000000200000 *006200000065000000680000006100000076000000690000006f00000075000000720000002e00 *000020000000200000004800000065000000720000006500000020000000770000006500000020 *0000006a0000007500000073000000740000000a02280000002000000020000000200000007400 *0000610000006b000000650000002000000064000000610000007400000061000000200000006f *0000006e000000630000006500000020000000610000006e000000640000002000000067000000 *690000007600000065000000200000007500000070000000200000007400000068000000650000 *0020000000720000006500000073000000740000002e0000000a000000022f010301021b000000 *41000000200000006e000000650000006300000065000000730000007300000061000000720000 *007900000020000000660000006500000061000000740000007500000072000000650000002000 *00006f0000006600000020000000480000005400000054000000500102010000002f0102040000 *00310000002e000000310000000a01022c000000200000002000000020000000410000006c0000 *00730000006f00000020000000740000006800000065000000200000006f0000006e0000006c00 *000079000000200000007400000072000000610000006e00000073000000660000006500000072 *000000200000007600000061000000720000006900000065000000740000007900000020000000 *6c000000690000006b000000650000006c0000007900000020000000740000006f0000000a0217 *00000020000000200000002000000072000000650000007400000075000000720000006e000000 *20000000610000006e0000007900000020000000660000006f0000006f00000074000000650000 *0072000000730000002e0000000a000000023000000000023101030102320000004d0000006100 *000079000000620000006500000020000000690000006e00000020000000740000006800000065 *000000200000006600000075000000740000007500000072000000650000002000000077000000 *650000002000000077000000690000006c0000006c000000200000006800000061000000760000 *006500000020000000610000002000000073000000650000006e00000073000000690000006200 *00006c00000065000000200000007400000068000000690000006e000000670000000a01023400 *0000200000002000000020000000740000006f00000020000000640000006f0000002000000068 *0000006500000072000000650000002c0000002000000061000000740000002000000074000000 *6800000061000000740000002000000074000000690000006d0000006500000020000000770000 *0065000000200000006d0000006900000067000000680000007400000020000000770000006100 *00006e0000007400000020000000740000006f000000200000006300000068000000610000006e *00000067000000650000000a020d00000020000000200000002000000074000000680000006500 *0000200000006e000000610000006d000000650000002e0000000a000000023201030244000000 *52000000650000006d0000006f0000007600000065000000200000006c00000065000000610000 *0064000000690000006e000000670000002000000063000000720000006c000000660000007300 *0000200000007400000068000000650000006e0000002000000063000000610000006c0000006c *000000200000007200000065000000610000006400000054000000690000006c0000006c000000 *450000006d0000007000000074000000790000003200000020000000280000006e0000006f0000 *007400000020000000720000006500000071000000750000006900000072000000650000006400 *000020000000620000007900000020000000520000004600000043000000290000000a00000002 *33010301022700000052000000650000006100000064000000200000006c000000690000006e00 *0000650000007300000020000000750000006e00000074000000690000006c0000002000000061 *0000006e00000020000000650000006d000000700000007400000079000000200000006c000000 *690000006e00000065000000200000002800000043000000520000004c00000046000000290000 *002c0000000a01022d000000200000002000000020000000610000006c000000730000006f0000 *002000000061000000630000006300000065000000700000007400000073000000200000006100 *000020000000630000006f0000006e0000006e000000650000006300000074000000690000006f *0000006e00000020000000630000006c0000006f00000073000000650000002000000061000000 *7300000020000000650000006e00000064000000200000006f000000660000000a01021e000000 *200000002000000020000000690000006e0000007000000075000000740000002c000000200000 *007700000068000000690000006300000068000000200000006900000073000000200000006e00 *00006f0000007400000020000000610000006e0000002000000048000000540000005400000050 *0102010000002f01020e000000310000002e0000003100000020000000630000006f0000006d00 *0000700000006c00000069000000610000006e000000740000000a01022a000000200000002000 *0000200000007400000068000000690000006e0000006700000020000000740000006f00000020 *000000640000006f000000200000002d00000020000000730000006f0000002000000070000000 *720000006f0000006200000061000000620000006c0000007900000020000000690000006e0000 *006400000069000000630000006100000074000000650000007300000020000000610000006e00 *00000a02140000002000000020000000200000006500000072000000720000006f000000720000 *0020000000630000006f0000006e000000640000006900000074000000690000006f0000006e00 *00002e0000000a00000002340000000002350000000002360000770000019d000001a0000001a1 *000001a2000001a3000001a4000001a5000001a6000001a7000001a8000001a9000001aa000001 *ab000001ac000001ad0000019e000001ae000001af000001b0000001b1000001b2000001b30000 *01b4000001b5000001b6000001b7000001b8000001b9000001ba000001c1000001c2000001c300 *0001c4000001c5000001c6000001ca000001cb000001cc000001ce000001cf000001d0000001d1 *000001d2000001d3000001d4000001d5000001d6000001d7000001d8000001d9000001dc000001 *dd000001de000001df000001e0000001e1000001e2000001e3000001e4000001e5000001e60000 *01e7000001e8000001e9000001ea000001eb000001ec000001ed000001ee000001ef000001f000 *0001f1000001f2000001f3000001f4000001f5000001f6000001f7000001f8000001f9000001fa *000001fb000001fc000001fd000001fe000001ff00000200000002010000020200000203000002 *0400000205000002060000020700000208000002090000020a0000020b0000020c0000020d0000 *020e0000020f0000021000000218000002190000021a0000021b0000021c0000021d0000021f00 *00022600000227000002290000022a0000022b0000022c0000023400000235000002360001005a *000001c105000001c2000001c3000001c4000001c5000001c6000001c200000001c300000001c4 *00000001c500000001c600000001ca05000001cb000001cc000001ce000001cf000001d0000001 *cb00000001cc00000001ce00000001cf00000001d000000001d107000001d8000001d7000001d6 *000001d5000001d4000001d3000001d2000001d200000001d300000001d400000001d500000001 *d600000001d700000001d800000001d900000001dc320000020e0000020d0000020c0000020b00 *00020a000002090000020800000207000002060000020500000204000002030000020200000201 *00000200000001ff000001fe000001fd000001fc000001fb000001fa000001f9000001f8000001 *f7000001f6000001f5000001f4000001f3000001f2000001f1000001f0000001ef000001ee0000 *01ed000001ec000001eb000001ea000001e9000001e8000001e7000001e6000001e5000001e400 *0001e3000001e2000001e1000001e0000001df000001de000001dd000001dd00000001de000000 *01df00000001e000000001e100000001e200000001e300000001e400000001e500000001e60000 *0001e700000001e800000001e900000001ea00000001eb00000001ec00000001ed00000001ee00 *000001ef00000001f000000001f100000001f200000001f300000001f400000001f500000001f6 *00000001f700000001f800000001f900000001fa00000001fb00000001fc00000001fd00000001 *fe00000001ff000000020000000002010000000202000000020300000002040000000205000000 *0206000000020700000002080000000209000000020a000000020b000000020c000000020d0000 *00020e000000020f01000002100000021000000002180000000219000000021a000000021b0000 *00021c000000021d000000021f000000022600000002270000000229000000022a000000022b00 *0000022c000000023400000002350000000236000000000000000002000000002d000000050000 *0000000600000000000700000000000800000000000900000000000a00000000000b0000000000 *0c00000000000d00000000000e00000000000f0000000000100000000000110000000000120000 *000000130000000000140000000000150000000000160000000000170000000000180000000000 *1900000000001a00000000001b00000000001c00000000001d00000000001e00000000001f0000 *000000200000000000210000000000220000000000230000000000240000000000250000000000 *2600000000002700000000002800000000002900000000002a00000000002b00000000002c0000 *0000002d00000000002e00000000002f00000000003000000000003100002d0000000500000006 *0000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f000000 *100000001100000012000000130000001400000015000000160000001700000018000000190000 *001a0000001b0000001c0000001d0000001e0000001f0000002000000021000000220000002300 *00002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d *0000002e0000002f00000030000000312e000000120000000d000000110000000f0000000e0000 *001000000010000000130000000c00000014000000150000001600000017000000180000001900 *00001a0000001b0000001c0000001d0000001e0000001f00000020000000210000002200000023 *00000024000000250000002600000027000000280000000a0000000b0000000800000009000000 *290000002a0000002b0000002c0000002d0000002e0000002f0000003000000031000000050000 *000600000007002d00000005020000000600000007000000060000000007000000000801000000 *0900000009000000000a010000000b0000000b000000000c000000000d05000000110000000f00 *00000e00000010000000100000000e000000000f00000000100000000011000000001200000000 *13000000001400000000150000000016000000001700000000180000000019000000001a000000 *001b000000001c000000001d000000001e000000001f0000000020000000002100000000220000 *000023000000002400000000250000000026000000002700000000280000000029000000002a00 *0000002b000000002c000000002d000000002e000000002f000000003000000000310000000000 *00000016000000000a0000023700000000023800000000023900000000023a00000000023b0000 *0000023c00000000023d00000000023e00000000023f000000000240000006000002370000023c *0000023d0000023e0000023f000002400001000600000237000000023c000000023d000000023e *000000023f000000024000000000000000001700010e00000078000000620000006e0000006f00 *00006e0000002d000000700000006f000000720000007400000061000000620000006c00000065 *010c0000006500000078000000700000006500000072000000690000006d000000650000006e00 *000074000000610000006c010d0000006c000000650000006d0000006d00000069000000680000 *0040000000760000006f0000002e000000630000006f0000006d15000002410000000002420000 *000002430000000002440000000002450103010221000000520000006500000061000000640000 *002000000061000000200000006d000000750000006c00000074000000690000002d0000007000 *0000610000007200000074000000200000006d0000006500000073000000730000006100000067 *000000650000002000000066000000720000006f0000006d000000200000006100000020010401 *0000024602020000002e0000000a010000000000000000030209000000420000006f0000007500 *00006e000000640000006100000072000000790000000a00000247010301022100000052000000 *6500000061000000640000002000000061000000200000006d000000750000006c000000740000 *00690000002d00000070000000610000007200000074000000200000006d000000650000007300 *0000730000006100000067000000650000002000000066000000720000006f0000006d00000020 *0000006100000020010401000002480102020000002e0000000a021a0000002000000020000000 *200000004600000061000000690000006c00000073000000200000006f0000006e000000200000 *007000000061000000720000007300000065000000200000006500000072000000720000006f00 *000072000000730000002e0000000a010000000000000000030209000000420000006f00000075 *0000006e000000640000006100000072000000790000000a0000024900000000024a0103023400 *000053000000700000006c00000069000000740000002000000061000000200000006d00000075 *0000006c000000740000006900000070000000610000007200000074000000200000006d000000 *65000000730000007300000061000000670000006500000020000000690000006e000000740000 *006f00000020000000740000006800000065000000200000006d000000750000006c0000007400 *000069000000700000006100000072000000740000002000000070000000610000007200000074 *000000730000002e0000000a010000000000000000030229000000540000006800000065000000 *20000000620000006f000000750000006e000000640000006100000072000000790000002c0000 *0020000000770000006900000074000000680000006f0000007500000074000000200000007400 *0000680000006500000020000000690000006e000000690000007400000069000000610000006c *000000200000006400000061000000730000006800000065000000730000000a0000024b010301 *023d00000044000000720000006f00000070000000200000006500000076000000650000007200 *0000790000007400000068000000690000006e0000006700000020000000750000007000000020 *000000740000006f00000020000000610000006e0000006400000020000000690000006e000000 *630000006c0000007500000064000000690000006e000000670000002000000074000000680000 *0065000000200000006600000069000000720000007300000074000000200000006c0000006900 *00006e00000065000000200000007300000074000000610000007200000074000000690000006e *00000067000000200000000a01021e000000200000002000000020000000770000006900000074 *000000680000002000000074000000680000006500000020000000620000006f00000075000000 *6e000000640000006100000072000000790000002e000000200000005200000065000000740000 *0075000000720000006e00000073000000200104010000024c0102110000002000000069000000 *660000002000000074000000680000006500000072000000650000002000000069000000730000 *00200000006e0000006f000000200000000a02220000002000000020000000200000006c000000 *690000006e00000065000000200000007300000074000000610000007200000074000000690000 *006e00000067000000200000007700000069000000740000006800000020000000610000002000 *0000620000006f000000750000006e000000640000006100000072000000790000002e0000000a *01000000000000000003022900000054000000680000006500000020000000620000006f000000 *750000006e000000640000006100000072000000790000002c0000002000000077000000690000 *0074000000680000006f0000007500000074000000200000007400000068000000650000002000 *0000690000006e000000690000007400000069000000610000006c000000200000006400000061 *000000730000006800000065000000730000000a0000024d0103022b0000005300000070000000 *6c0000006900000074000000200000006100000020000000730000007400000072000000690000 *006e00000067000000200000006100000074000000200000007400000068000000650000002000 *0000660000006900000072000000730000007400000020000000620000006f000000750000006e *00000064000000610000007200000079000000200000006c000000690000006e00000065000000 *2e0000000a03000000000000000003022900000054000000680000006500000020000000620000 *006f000000750000006e000000640000006100000072000000790000002c000000200000007700 *00006900000074000000680000006f000000750000007400000020000000740000006800000065 *00000020000000690000006e000000690000007400000069000000610000006c00000020000000 *6400000061000000730000006800000065000000730000000a0000000000000001030211000000 *530000007400000072000000690000006e0000006700000020000000740000006f000000200000 *0073000000700000006c00000069000000740000002e0000000a00000000000000020301023100 *000054000000680000006500000020000000700000006100000072000000740000002000000062 *00000065000000660000006f000000720000006500000020000000740000006800000065000000 *20000000620000006f000000750000006e000000640000006100000072000000790000002c0000 *002000000074000000680000006500000020000000620000006f000000750000006e0000006400 *0000610000007200000079000000200000006c000000690000006e000000650000002c0000000a *010232000000200000002000000020000000610000006e00000064000000200000007400000068 *000000650000002000000070000000610000007200000074000000200000006100000066000000 *7400000065000000720000002000000074000000680000006500000020000000620000006f0000 *00750000006e00000064000000610000007200000079000000200000006c000000690000006e00 *0000650000002e000000200000005400000068000000650000002000000043000000520000004c *000000460000000a0102380000002000000020000000200000006200000065000000660000006f *000000720000006500000020000000610000006e00000064000000200000007400000068000000 *650000002000000043000000520000004c00000046000000200000002800000069000000660000 *0020000000610000006e0000007900000029000000200000006100000066000000740000006500 *0000720000002000000074000000680000006500000020000000620000006f000000750000006e *00000064000000610000007200000079000000200000006c000000690000006e00000065000000 *0a010234000000200000002000000020000000610000007200000065000000200000006e000000 *6f0000007400000020000000690000006e000000630000006c0000007500000064000000650000 *006400000020000000690000006e00000020000000610000006e00000079000000200000006f00 *000066000000200000007400000068000000650000002000000073000000740000007200000069 *0000006e0000006700000073000000200000007200000065000000740000007500000072000000 *6e00000065000000640000002e0000000a01020b00000020000000200000002000000052000000 *650000007400000075000000720000006e00000073000000200104010000024c021a0000002000 *000069000000660000002000000074000000680000006500000072000000650000002000000069 *00000073000000200000006e0000006f00000020000000620000006f000000750000006e000000 *640000006100000072000000790000002e0000000a0000024e010301023a000000430000006800 *000065000000630000006b00000020000000770000006800000065000000740000006800000065 *00000072000000200000006100000020000000730000007400000072000000690000006e000000 *670000002000000073000000740000006100000072000000740000007300000020000000770000 *006900000074000000680000002000000074000000770000006f00000020000000640000006100 *00007300000068000000650000007300000020000000660000006f0000006c0000006c0000006f *0000007700000065000000640000002000000062000000790000000a021e000000200000002000 *00002000000074000000680000006500000020000000670000006900000076000000650000006e *00000020000000620000006f000000750000006e00000064000000610000007200000079000000 *20000000730000007400000072000000690000006e000000670000002e0000000a010000000000 *00000003022900000054000000680000006500000020000000620000006f000000750000006e00 *0000640000006100000072000000790000002c0000002000000077000000690000007400000068 *0000006f0000007500000074000000200000007400000068000000650000002000000069000000 *6e000000690000007400000069000000610000006c000000200000006400000061000000730000 *006800000065000000730000000a0000024f010301022100000043000000680000006500000063 *0000006b0000002000000077000000680000006500000074000000680000006500000072000000 *200000006100000020000000730000007400000072000000690000006e00000067000000200000 *00660000006f000000720000002000000077000000680000006900000063000000680000002001 *04010000024e01020e0000002000000072000000650000007400000075000000720000006e0000 *007300000020000000740000007200000075000000650000000a022c0000002000000020000000 *200000006800000061000000730000002000000074000000770000006f00000020000000640000 *006100000073000000680000006500000073000000200000006100000066000000740000006500 *0000720000002000000074000000680000006500000020000000620000006f0000007500000064 *00000061000000720000007900000020000000730000007400000072000000690000006e000000 *670000002e0000000a010000000000000000030229000000540000006800000065000000200000 *00620000006f000000750000006e000000640000006100000072000000790000002c0000002000 *0000770000006900000074000000680000006f0000007500000074000000200000007400000068 *0000006500000020000000690000006e000000690000007400000069000000610000006c000000 *200000006400000061000000730000006800000065000000730000000a00000250010302300000 *00430000006800000065000000630000006b000000730000002000000077000000680000006500 *000074000000680000006500000072000000200000006100000020000000730000007400000072 *000000690000006e00000067000000200000007300000074000000610000007200000074000000 *7300000020000000770000006900000074000000680000002000000074000000770000006f0000 *00200000006400000061000000730000006800000065000000730000002e0000000a0000000251 *0103023400000044000000720000006f0000007000000020000000650000007600000065000000 *72000000790000007400000068000000690000006e000000670000002000000075000000700000 *0020000000740000006f00000020000000610000006e0000006400000020000000690000006e00 *0000630000006c0000007500000064000000690000006e00000067000000200000007400000068 *000000650000002000000066000000690000007200000073000000740000002000000043000000 *520000004c000000460000002e0000000a0000000252010301024500000053000000700000006c *000000690000007400000020000000610000002000000073000000740000007200000069000000 *6e0000006700000020000000610000007400000020000000740000006800000065000000200000 *00660000006900000072000000730000007400000020000000650000006d000000700000007400 *000079000000200000006c000000690000006e000000650000002e000000200000005400000068 *000000650000002000000043000000520000004c00000046000000200000002800000069000000 *6600000020000000610000006e0000007900000029000000200000006200000065000000660000 *006f0000007200000065000000200000007400000068000000650000000a010242000000200000 *002000000020000000650000006d000000700000007400000079000000200000006c0000006900 *00006e0000006500000020000000690000007300000020000000690000006e000000630000006c *0000007500000064000000650000006400000020000000690000006e0000002000000074000000 *680000006500000020000000660000006900000072000000730000007400000020000000720000 *006500000073000000750000006c000000740000002e0000002000000054000000680000006500 *00002000000043000000520000004c000000460000002000000061000000660000007400000065 *00000072000000200000007400000068000000650000000a01022d000000200000002000000020 *000000650000006d000000700000007400000079000000200000006c000000690000006e000000 *65000000200000006900000073000000200000006e0000006f0000007400000020000000690000 *006e000000630000006c0000007500000064000000650000006400000020000000690000006e00 *00002000000074000000680000006500000020000000720000006500000073000000750000006c *000000740000002e0000000a0102030000002000000020000000200104010000024c0228000000 *2000000069000000730000002000000072000000650000007400000075000000720000006e0000 *006500000064000000200000006900000066000000200000007400000068000000650000007200 *000065000000200000006900000073000000200000006e0000006f00000020000000650000006d *000000700000007400000079000000200000006c000000690000006e000000650000002e000000 *0a0000000253010301023b00000053000000700000006c00000069000000740000002000000061 *00000020000000730000007400000072000000690000006e000000670000002000000061000000 *740000002000000074000000680000006500000020000000660000006900000072000000730000 *00740000002000000043000000520000004c000000460000002e00000020000000540000006800 *0000650000002000000043000000520000004c0000004600000020000000690000007300000020 *0000006e0000006f0000007400000020000000690000006e000000630000006c00000075000000 *6400000065000000640000000a0223000000200000002000000020000000690000006e00000020 *000000610000006e00000079000000200000006f00000066000000200000007400000068000000 *650000002000000072000000650000007400000075000000720000006e00000065000000640000 *0020000000730000007400000072000000690000006e00000067000000730000002e0000000a02 *0000000000000000030211000000530000007400000072000000690000006e0000006700000020 *000000740000006f0000002000000073000000700000006c00000069000000740000002e000000 *0a00000000000000010301020800000052000000650000007400000075000000720000006e0000 *0073000000200104010000024c0216000000200000006900000066000000200000007400000068 *000000650000007200000065000000200000006900000073000000200000006e0000006f000000 *2000000043000000520000004c000000460000002e0000000a0000025401030102050000004c00 *0000690000006b0000006500000020010401000002530102250000002c00000020000000620000 *007500000074000000200000006900000066000000200000006e0000006f000000200000004300 *0000520000004c0000004600000020000000690000007300000020000000660000006f00000075 *0000006e000000640000002c000000200000007400000068000000650000002000000066000000 *690000007200000073000000740000000a02420000002000000020000000200000007200000065 *00000073000000750000006c000000740000002000000069000000730000002000000074000000 *680000006500000020000000610000007200000067000000750000006d000000650000006e0000 *007400000020000000730000007400000072000000690000006e000000670000002c0000002000 *0000610000006e0000006400000020000000740000006800000065000000200000007300000065 *000000630000006f0000006e000000640000002000000072000000650000007300000075000000 *6c0000007400000020000000690000007300000020000000650000006d00000070000000740000 *00790000002e0000000a0000000255010302340000004700000065000000740000002000000074 *000000680000006500000020000000690000006e00000064000000650000007800000020000000 *610000006e00000064000000200000006c000000650000006e0000006700000074000000680000 *00200000006f000000660000002000000074000000680000006500000020000000660000006900 *00007200000073000000740000002000000043000000520000004c000000460000002c00000020 *000000690000006600000020000000610000006e000000790000002e0000000a01000000000000 *0000030211000000530000007400000072000000690000006e0000006700000020000000740000 *006f0000002000000073000000700000006c00000069000000740000002e0000000a0000025600 *0000000257000000000258010301023700000044000000720000006f0000007000000020000000 *610000006e00000020000000690000006e000000690000007400000069000000610000006c0000 *002000000043000000520000004c000000460000002c0000002000000069000000660000002000 *0000610000006e000000790000002e000000200000004900000066000000200000007400000068 *0000006500000020000000730000007400000072000000690000006e0000006700000020000000 *690000007300000020000000650000006d0000007000000074000000790000002c000000200000 *000a01023c0000002000000020000000200000006e0000006f0000007400000068000000690000 *006e0000006700000020000000690000007300000020000000640000006f0000006e0000006500 *00002e000000200000004900000066000000200000007400000068000000650000002000000073 *0000007400000072000000690000006e0000006700000020000000640000006f00000065000000 *73000000200000006e0000006f0000007400000020000000730000007400000061000000720000 *007400000020000000770000006900000074000000680000002000000043000000520000004c00 *0000460000002c0000000a02230000002000000020000000200000007400000068000000650000 *002000000066000000690000007200000073000000740000002000000063000000680000006100 *000072000000610000006300000074000000650000007200000020000000690000007300000020 *00000064000000720000006f000000700000007000000065000000640000002e0000000a001800 *000173000001740000017500000176000000000000000100000002000000030000000400000179 *000001810000018300000185000001860000018800000189000002410000024200000243000002 *440000024500000247000002520000025300010008000002410100000242000002420000000243 *010000024400000244000000024500000002470000000252000000025300000000000000000300 *000000130000003200000000003300000000003401030234000000430000006f0000006e000000 *76000000650000006e00000069000000650000006e000000630000006500000020000000630000 *006c00000061000000730000007300000020000000660000006f00000072000000200000006300 *00006f0000006e00000076000000650000007200000074000000690000006e0000006700000020 *000000640000006100000074000000610000002000000074000000790000007000000065000000 *7300000020000000740000006f00000020000000550000005200000049000000730000000a0000 *0000350000000000360000000000370000000000380000000000390103022a0000005200000065 *000000740000007200000069000000650000007600000065000000730000002000000074000000 *6800000065000000200000007000000061000000740000006800000020000000630000006f0000 *006d000000700000006f0000006e000000650000006e0000007400000020000000660000007200 *00006f0000006d0000002000000074000000680000006500000020000000550000005200000049 *0000000a000000003a0103022b0000005200000065000000740000007200000069000000650000 *007600000065000000730000002000000074000000680000006500000020000000710000007500 *000065000000720000007900000020000000630000006f0000006d000000700000006f0000006e *000000650000006e000000740000002000000066000000720000006f0000006d00000020000000 *740000006800000065000000200000005500000052000000490000000a000000003b0103022c00 *000052000000650000007400000072000000690000006500000076000000650000007300000020 *00000074000000680000006500000020000000730000006300000068000000650000006d000000 *6500000020000000630000006f0000006d000000700000006f0000006e000000650000006e0000 *00740000002000000066000000720000006f0000006d0000002000000074000000680000006500 *0000200000005500000052000000490000000a000000003c010302450000004d0000006f000000 *640000006900000066000000690000006500000073000000200000007400000068000000650000 *0020000000730000006300000068000000650000006d0000006500000020000000630000006f00 *00006d000000700000006f0000006e000000650000006e00000074000000200000006f00000066 *000000200000007400000068000000650000002000000055000000520000004900000020000000 *7500000073000000690000006e0000006700000020000000740000006800000065000000200000 *0070000000720000006f0000007600000069000000640000006500000064000000200000006600 *0000750000006e0000006300000074000000690000006f0000006e0000000a000000003d010302 *430000004d0000006f000000640000006900000066000000690000006500000073000000200000 *007400000068000000650000002000000070000000610000007400000068000000200000006300 *00006f0000006d000000700000006f0000006e000000650000006e00000074000000200000006f *000000660000002000000074000000680000006500000020000000550000005200000049000000 *200000007500000073000000690000006e00000067000000200000007400000068000000650000 *002000000070000000720000006f00000076000000690000006400000065000000640000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000000a00000000 *3e0103022500000053000000650000007400000073000000200000007400000068000000650000 *0020000000730000006300000068000000650000006d0000006500000020000000630000006f00 *00006d000000700000006f0000006e000000650000006e00000074000000200000006f00000066 *00000020000000740000006800000065000000200000005500000052000000490000000a000000 *003f01030223000000530000006500000074000000730000002000000074000000680000006500 *0000200000007000000061000000740000006800000020000000630000006f0000006d00000070 *0000006f0000006e000000650000006e00000074000000200000006f0000006600000020000000 *740000006800000065000000200000005500000052000000490000000a00000000400000000000 *410000000000420103022400000052000000650000007400000075000000720000006e00000073 *000000200000007400000072000000750000006500000020000000690000006600000020000000 *740000006800000065000000200000005500000052000000490000002000000069000000730000 *00200000006100000062000000730000006f0000006c0000007500000074000000650000000a00 *000000430103022f00000052000000650000006e00000064000000650000007200000020000000 *73000000680000006f000000750000006c00000064000000200000006200000065000000200000 *007500000073000000650000006400000020000000660000006f00000072000000200000007000 *000072000000650000007400000074000000790000007000000072000000690000006e00000074 *000000690000006e0000006700000020000000550000005200000049000000730000002e000000 *0a0000000044010302390000005000000061000000720000007300000065000000730000002000 *000061000000200000005500000052000000490000002000000066000000720000006f0000006d *000000200000006100000020000000530000007400000072000000690000006e00000067000000 *2e000000200000002000000052000000650000007400000075000000720000006e000000730000 *00200000004e0000006f0000007400000068000000690000006e00000067000000200000006f00 *00006e000000200000006600000061000000690000006c0000007500000072000000650000002e *0000000a0013000000320000003300000034000000350000003600000037000000380000003900 *00003a0000003b0000003c0000003d0000003e0000003f00000040000000410000004200000043 *0000004413000000390000003a0000003b0000003c0000003d0000003e0000003f000000400000 *004100000042000000360000003700000038000000430000004400000034000000350000003200 *000033001300000032010000003300000033000000003401000000350000003500000000360200 *000037000000380000003700000000380000000039000000003a000000003b000000003c000000 *003d000000003e000000003f000000004000000000410000000042000000004300000000440000 *000000000000040000000012000000450000000000460000000000470000000000480000000000 *4900000000004a00000000004b00000000004c00000000004d0103010239000000430000007200 *00006500000061000000740000006500000073000000200000006100000020000000630000006f *0000006f0000006b00000069000000650000002000000077000000690000007400000068000000 *20000000610000002000000064000000650000006600000061000000750000006c000000740000 *002000000076000000650000007200000073000000690000006f0000006e000000200000006f00 *000066000000200000003100000020000000610000006e00000064000000200000007000000061 *0000007400000068000000200000006f00000066000000200105010000002f02010000000a0000 *00004e010301021c00000053000000650000007400000020000000610000002000000043000000 *6f0000006f0000006b000000690000006500000020000000690000006e00000020000000740000 *00680000006500000020000000520000006500000073000000750000006c000000740000002e00 *00000a01023f000000200000005400000068000000650000002000000076000000610000006c00 *000075000000650000007300000020000000610000007200000065000000200000006500000073 *000000630000006100000070000000650000006400000020000000610000007300000020000000 *700000006500000072000000200000005200000046000000430000002000000032000000310000 *0030000000390000002c0000002000000062000000750000007400000020000000730000006f00 *00006d000000650000002000000062000000720000006f00000077000000730000006500000072 *00000073000000200000006d00000061000000790000000a010230000000200000006800000061 *000000760000006500000020000000620000007500000067000000670000007900000020000000 *730000007500000070000000700000006f000000720000007400000020000000660000006f0000 *007200000020000000630000006f0000006f0000006b0000006900000065000000730000002000 *0000630000006f0000006e0000007400000061000000690000006e000000690000006e00000067 *00000020000000650000002e000000670000002e00000020010701020100000027010201000000 *22020100000027010204000000200000006f000000720000002001070102010000002701020100 *00002002010000002702020000002e0000000a000000025900000000004f01030102390000004e *0000006f0000007400000020000000610000006e00000020000000730000007500000070000000 *700000006f00000072000000740000006500000064000000200000006100000070000000690000 *002e000000200000002000000054000000610000006b0000006500000073000000200000006100 *000020000000630000006f0000006f0000006b0000006900000065000000200000006800000065 *0000006100000064000000650000007200000020000000610000006e0000006400000020000000 *72000000650000007400000075000000720000006e000000730000000a023d0000002000000065 *000000690000007400000068000000650000007200000020000000610000002000000053000000 *7400000072000000690000006e00000067000000200000006500000072000000720000006f0000 *0072000000200000006d0000006500000073000000730000006100000067000000650000002000 *00006f0000007200000020000000610000006e0000002000000061000000720000007200000061 *00000079000000200000006f000000660000002000000070000000610000007200000073000000 *650000006400000020000000630000006f0000006f0000006b0000006900000065000000730000 *000a0000000050010302340000006e0000006f0000007400000020000000610000002000000073 *0000007500000070000000700000006f0000007200000074000000650000006400000020000000 *6100000070000000690000002e0000002000000020000000410000002000000070000000610000 *007200000073000000650000007200000020000000660000006f00000072000000200000005200 *00004600000043000000200000003200000031000000300000003900000020000000630000006f *0000006f0000006b0000006900000065000000730000000a0000000051010301024c0000004700 *0000650000007400000020000000610000006c0000006c00000020000000630000006f0000006f *0000006b0000006900000065000000730000002000000066000000720000006f0000006d000000 *200000007400000068000000650000002000000048000000540000005400000050000000200000 *00720000006500000071000000750000006500000073000000740000002e000000200000005400 *0000680000006500000020000000630000006f0000006f0000006b000000690000006500000073 *00000020000000610000007200000065000000200000006f000000720000006400000065000000 *720000006500000064000000200000007000000065000000720000002000000052000000460000 *00430000002000000066000000720000006f0000006d0000000a01024900000020000000740000 *006800000065000000200000006d0000006f000000730000007400000020000000730000007000 *000065000000630000006900000066000000690000006300000020000000740000006f00000020 *000000740000006800000065000000200000006c00000065000000610000007300000074000000 *2000000073000000700000006500000063000000690000006600000069000000630000002e0000 *00200000004d000000750000006c0000007400000069000000700000006c000000650000002000 *0000630000006f0000006f0000006b000000690000006500000073000000200000007700000069 *000000740000006800000020000000740000006800000065000000200000007300000061000000 *6d000000650000000a021c000000200000006e000000610000006d000000650000002000000061 *000000720000006500000020000000610000006c0000006c0000006f0000007700000065000000 *6400000020000000740000006f0000002000000065000000780000006900000073000000740000 *002e0000000a0000000052010301024c0000004700000065000000740000002000000074000000 *6800000065000000200000006d0000006f00000073000000740000002000000073000000700000 *0065000000630000006900000066000000690000006300000020000000630000006f0000006f00 *00006b000000690000006500000020000000770000006900000074000000680000002000000074 *000000680000006500000020000000670000006900000076000000650000006e00000020000000 *6e000000610000006d000000650000002e000000200000004600000061000000690000006c0000 *007300000020000000690000006600000020000000740000006800000065000000720000006500 *0000200000006900000073000000200000006e0000006f00000020000000730000007500000063 *000000680000000a01024600000020000000630000006f0000006f0000006b0000006900000065 *000000200000006f00000072000000200000006900000066000000200000007400000068000000 *650000002000000062000000720000006f00000077000000730000006500000072000000200000 *00640000006900000064000000200000006e0000006f0000007400000020000000650000007300 *00006300000061000000700000006500000020000000630000006f0000006f0000006b00000069 *000000650000007300000020000000690000006e00000020000000610000002000000070000000 *720000006f00000070000000650000007200000020000000660000006100000073000000680000 *00690000006f0000006e0000002e0000000a02400000002000000042000000720000006f000000 *7700000073000000650000007200000020000000730000007500000070000000700000006f0000 *00720000007400000020000000660000006f000000720000002000000065000000730000006300 *00006100000070000000690000006e0000006700000020000000630000006f0000006f0000006b *0000006900000065000000730000002000000070000000720000006f0000007000000065000000 *720000006c00000079000000200000006900000073000000200000007600000065000000720000 *007900000020000000640000006900000076000000650000007200000073000000650000002e00 *00000a000000005300000000005400000000025a00001000000045000000460000004700000048 *000000490000004a0000004b0000004c0000004d0000004e0000004f0000005000000051000000 *5200000053000000541000000045000000460000004700000048000000490000004a0000004b00 *00004c0000004d0000004e000000510000005200000053000000540000004f0000005000100000 *004507000000460000004700000048000000490000004a0000004b0000004c0000004600000000 *4700000000480000000049000000004a000000004b000000004c000000004d000000004e000000 *004f00000000500000000051000000005200000000530000000054000000000000000001000000 *00580000005500000000005600000000025b00000000025c00000000025d000000000057000000 *00005800000000005900000000005a00000000005b00000000005c00000000005d00000000005e *00000000005f000000000060000000000061000000000062000000000063000000000064000000 *00006500000000006600000000006700000000006800000000006900000000006a00000000006b *00000000006c00000000006d00000000006e00000000006f000000000070000000000071000000 *0000720000000000730000000000740103020d000000520000006500000073000000750000006c *0000007400000020000000660000006c0000006100000067000000730000000a00000000750000 *000000760103023d00000077000000680000006500000074000000680000006500000072000000 *200000006100000020000000630000006f0000006e00000074000000650000006e000000740000 *002d0000006c000000650000006e00000067000000740000006800000020000000680000006500 *0000610000006400000065000000720000002000000077000000690000006c0000006c00000020 *000000620000006500000020000000610000006400000064000000650000006400000020000000 *740000006f00000020000000740000006800000065000000200000007200000065000000730000 *00750000006c000000740000002e0000000a000000007701030212000000430000006f0000006d *00000062000000690000006e000000650000006400000020000000680000006500000061000000 *640000006500000072000000730000002e0000000a000000007800000000007900000000007a00 *000000007b00000000007c01030214000000480000005400000054000000500000002000000072 *000000650000007100000075000000650000007300000074000000200000006d00000065000000 *74000000680000006f000000640000000a000000007d00000000007e00000000007f0000000000 *800000000000810000000000820000000000830000000000840000000000850103021300000048 *00000054000000540000005000000020000000630000006f0000006e0000006600000069000000 *6700000075000000720000006100000074000000690000006f0000006e0000000a000000008600 *000000008701030222000000500000006f000000720000007400000020000000660000006f0000 *007200000020000000740000006800000065000000200000007300000065000000720000007600 *0000650000007200000020000000740000006f000000200000006c000000690000007300000074 *000000650000006e000000200000006f0000006e0000002e0000000a0000000088000000000089 *0103020d0000004800000054000000540000005000000020000000760000006500000072000000 *73000000690000006f0000006e0000000a000000008a00000000025e00000000025f0000000000 *8b010301023f00000053000000680000006f000000750000006c00000064000000200000007400 *0000680000006500000020000000630000006f0000006e0000006e000000650000006300000074 *000000690000006f0000006e000000200000006200000065000000200000007500000073000000 *650000006400000020000000660000006f00000072000000200000006600000075000000720000 *0074000000680000006500000072000000200000006d0000006500000073000000730000006100 *000067000000650000007300000020000000610000006600000074000000650000007200000020 *000000740000006800000069000000730000002e0000000a01020d000000200000007c00000020 *000000690000007300000048000000540000005400000050000000310000005f00000030000000 *20010201000000260102010000002601021b000000200000006800000061000000730000004b00 *0000650000006500000070000000410000006c000000690000007600000065000000200000007c *0000007c0000002000000069000000730000004800000054000000540000005000000031000000 *5f0000003100000020010201000000260102010000002602170000002000000068000000610000 *00730000004e0000006f00000074000000430000006f0000006e0000006e000000650000006300 *000074000000690000006f0000006e000000430000006c0000006f00000073000000650000000a *000000008c0103024800000044000000650000006600000061000000750000006c000000740000 *0020000000630000006f0000006e00000066000000690000006700000075000000720000006100 *000074000000690000006f0000006e00000020000000630000006f0000006e0000007400000061 *000000690000006e00000073000000200000006e0000006f000000200000007600000061000000 *6c000000690000006400000061000000740000006f0000007200000020000000610000006e0000 *00640000002000000074000000680000006500000020000000700000006f000000720000007400 *00002000000069000000730000002000000073000000650000007400000020000000740000006f *00000020000000380000003000000030000000300000000a000000008d0103023c000000440000 *00650000006600000061000000750000006c000000740000002000000052000000730000004600 *00006c000000610000006700000073000000200000007400000068000000610000007400000020 *00000077000000690000006c0000006c00000020000000690000006e000000630000006c000000 *7500000064000000650000002000000074000000680000006500000020000000630000006f0000 *006e00000074000000650000006e000000740000002d0000006c000000650000006e0000006700 *00007400000068000000200000006800000065000000610000006400000065000000720000000a *000000008e0103010203000000440000006f0000006e0102010000002701022900000074000000 *20000000640000006900000073000000700000006c000000610000007900000020000000610000 *0020000000430000006f0000006e00000074000000650000006e000000740000002d0000004c00 *0000650000006e000000670000006800000074000000200000006600000069000000650000006c *0000006400000020000000660000006f0000007200000020000000740000006800000065000000 *20010206000000520000006500000073000000750000006c0000007402020000002e0000000a00 *0000008f01030244000000430000006f0000006e00000076000000650000007200000074000000 *730000002000000061000000200000005200000065000000710000007500000065000000730000 *007400000020000000690000006e000000740000006f0000002000000061000000200000005300 *00007400000072000000690000006e000000670000002000000072000000650000007000000072 *0000006500000073000000650000006e00000074000000690000006e0000006700000020000000 *74000000680000006500000020000000630000006f000000720000007200000065000000730000 *00700000006f0000006e00000064000000690000006e0000006700000020000000550000005200 *00004c0000000a0000000090010301024c00000053000000650000007400000073000000200000 *0074000000680000006500000020000000520000006500000073000000700000006f0000006e00 *000073000000650000002000000073000000740000006100000074000000750000007300000020 *000000630000006f000000640000006500000020000000740000006f0000002000000074000000 *68000000650000002000000070000000720000006f000000760000006900000064000000650000 *006400000020000000490000006e0000007400000020000000610000006e000000640000002000 *00006c000000690000006600000074000000730000002000000074000000680000006500000020 *000000630000006f0000006d000000700000007500000074000000610000007400000069000000 *6f0000006e0000000a020f00000020000000690000006e000000740000006f0000002000000061 *000000200000004d0000006f0000006e00000061000000640000002e0000000a00000000910103 *01024300000054000000610000006b00000065000000730000002000000061000000200000006c *000000690000007300000074000000200000006f0000006600000020000000280000006b000000 *65000000790000002c00000076000000610000006c000000290000002000000070000000610000 *0069000000720000007300000020000000610000006e0000006400000020000000630000006f00 *00006e000000760000006500000072000000740000007300000020000000690000007400000020 *000000690000006e000000740000006f0000002000000048000000650000006100000064000000 *6500000072000000730000002e00000020000000200000005400000068000000650000000a0225 *000000200000006b0000006500000079000000730000002000000077000000690000006c000000 *6c00000020000000620000006500000020000000630000006f0000006e00000076000000650000 *007200000074000000650000006400000020000000740000006f000000200000006c0000006f00 *0000770000006500000072000000630000006100000073000000650000000a0000000092010302 *2e0000004c0000006f0000006f0000006b00000075000000700000002000000068000000650000 *00610000006400000065000000720000002000000076000000610000006c000000750000006500 *00002e000000200000004b00000065000000790000002000000069000000730000002000000063 *0000006100000073000000650000002d000000690000006e00000073000000650000006e000000 *7300000069000000740000006900000076000000650000002e0000000a00000000930103023b00 *00004c0000006f0000006f0000006b000000750000007000000020000000680000006500000061 *0000006400000065000000720000002000000076000000610000006c0000007500000065000000 *2e000000200000004b000000650000007900000020000000690000007300000020000000610000 *0020000000630000006100000073000000650000002d000000690000006e000000730000006500 *00006e000000730000006900000074000000690000007600000065000000200000006200000079 *0000007400000065000000730000007400000072000000690000006e000000670000002e000000 *0a00000000940103024a0000004c0000006f0000006f0000006b00000075000000700000002000 *00006800000065000000610000006400000065000000720000002000000076000000610000006c *000000750000006500000020000000770000006900000074000000680000002000000061000000 *20000000630000006100000073000000650000002d00000073000000650000006e000000730000 *006900000074000000690000007600000065000000200000006b00000065000000790000002e00 *000020000000540000006800000065000000200000006b0000006500000079000000200000006d *000000750000007300000074000000200000006200000065000000200000006c0000006f000000 *770000006500000072000000630000006100000073000000650000002e0000000a000000026001 *0302440000004c0000006f0000006f0000006b0000007500000070000000200000006800000065 *000000610000006400000065000000720000002000000077000000690000007400000068000000 *200000006100000020000000630000006100000073000000650000002d00000073000000650000 *006e000000730000006900000074000000690000007600000065000000200000006b0000006500 *0000790000002e00000020000000540000006800000065000000200000006b0000006500000079 *000000200000006d00000075000000730000007400000020000000620000006500000020000000 *6c0000006f000000770000006500000072000000630000006100000073000000650000002e0000 *000a0000000095010301024800000052000000650000007400000075000000720000006e000000 *730000002000000054000000720000007500000065000000200000006900000066000000200000 *00740000006800000065000000200000006100000073000000730000006f000000630000006900 *000061000000740000006500000064000000200000006b00000065000000790000002000000069 *0000007300000020000000660000006f000000750000006e000000640000002000000069000000 *6e0000002000000074000000680000006500000020000000480000006500000061000000640000 *006500000072000000730000002e00000020000000200000005400000068000000650000002000 *00006c0000006f0000006f0000006b00000075000000700000000a021600000020000000690000 *0073000000200000006300000061000000730000006500000020000000690000006e0000007300 *0000650000006e0000007300000069000000740000006900000076000000650000002e0000000a *000000009601030102080000004100000063000000740000007300000020000000610000007300 *000020010401000000950212000000200000007700000069000000740000006800000020000000 *42000000790000007400000065000000530000007400000072000000690000006e000000670000 *00730000000a000000009701030102080000004100000063000000740000007300000020000000 *6100000073000000200104010000009601022e0000002000000062000000750000007400000020 *000000740000006800000065000000200000006b00000065000000790000002000000069000000 *7300000020000000630000006100000073000000650000002000000073000000650000006e0000 *007300000069000000740000006900000076000000650000002e00000020000000200000004900 *0000740000002000000073000000680000006f000000750000006c000000640000002000000062 *000000650000000a020f00000020000000690000006e000000200000006c0000006f0000007700 *00006500000072000000630000006100000073000000650000002e0000000a0000000261000000 *00026200000000009801030102120000004100000073000000730000006f000000630000006900 *00006100000074000000650000007300000020000000740000006800000065000000200000006b *00000065000000790102010000002f01023100000076000000610000006c000000750000006500 *0000200000007000000061000000690000007200000020000000690000006e0000002000000074 *000000680000006500000020000000680000006500000061000000640000006500000072000000 *730000002e0000002000000020000000460000006f000000720000006300000065000000730000 *0020000000740000006800000065000000200000006b0000006500000079000000200000007400 *00006f0000002000000062000000650000000a020c000000200000006c0000006f000000770000 *006500000072000000630000006100000073000000650000002e0000000a000000009901030102 *080000004100000063000000740000007300000020000000610000007300000020010401000000 *980217000000200000006200000075000000740000002000000077000000690000007400000068 *000000200000004200000079000000740000006500000053000000740000007200000069000000 *6e00000067000000730000002e0000000a000000009a0103010249000000530000006500000074 *0000007300000020000000740000006800000065000000200000006b0000006500000079000000 *20000000740000006f000000200000007400000068000000650000002000000048000000650000 *0061000000640000006500000072000000500000006100000069000000720000002e0000002000 *000020000000540000006800000069000000730000002000000069000000730000002000000074 *0000006800000065000000200000006f0000006e0000006c000000790000002000000077000000 *610000007900000020000000740000006f000000200000006100000073000000730000006f0000 *0063000000690000006100000074000000650000002000000061000000200000006b0000006500 *0000790000000a01024c0000002000000077000000690000007400000068000000200000006d00 *0000750000006c0000007400000069000000700000006c00000065000000200000007600000061 *0000006c0000007500000065000000730000002000000076000000690000006100000020000000 *740000006800000065000000200000007300000065000000740000004800000065000000610000 *006400000065000000720000002a0000002000000066000000750000006e000000630000007400 *0000690000006f0000006e000000730000002e0000002000000020000000440000006f00000065 *00000073000000200000006e0000006f0000007400000020000000660000006f00000072000000 *630000006500000020000000740000006800000065000000200000006b00000065000000790000 *000a025f00000020000000740000006f0000002000000062000000650000002000000069000000 *6e000000200000006c0000006f0000007700000065000000720000006300000061000000730000 *0065000000200000006f0000007200000020000000670000007500000061000000720000006100 *00006e000000740000006500000065000000200000007400000068000000610000007400000020 *00000074000000680000006500000020000000670000006900000076000000650000006e000000 *200000006b000000650000007900000020000000610000006e0000006400000020000000740000 *006800000065000000200000006b000000650000007900000020000000690000006e0000002000 *000074000000680000006500000020000000480000006500000061000000640000006500000072 *000000500000006100000069000000720000002000000077000000690000006c0000006c000000 *200000006d000000610000007400000063000000680000002e000000200000000a000000009b01 *030102090000004100000064000000640000002000000061000000200000006b00000065000000 *790102010000002f01023a00000076000000610000006c00000075000000650000002000000070 *00000061000000690000007200000020000000740000006f000000200000007400000068000000 *65000000200000006800000065000000610000006400000065000000720000002e000000200000 *0020000000490000006600000020000000740000006800000065000000200000006b0000006500 *00007900000020000000610000006c000000720000006500000061000000640000007900000020 *00000068000000610000007300000020000000610000002000000076000000610000006c000000 *75000000650000000a010238000000200000006100000073000000730000006f00000063000000 *690000006100000074000000650000006400000020000000770000006900000074000000680000 *002000000069000000740000002c000000200000007400000068000000650000006e0000002000 *00007400000068000000650000002000000076000000610000006c000000750000006500000020 *00000077000000690000006c0000006c0000002000000062000000650000002000000061000000 *7000000070000000650000006e0000006400000065000000640000002e00000020000000200000 *000a022100000020000000460000006f0000007200000063000000650000007300000020000000 *740000006800000065000000200000006b000000650000007900000020000000740000006f0000 *00200000006200000065000000200000006c0000006f0000007700000065000000720000006300 *00006100000073000000650000002e0000000a000000009c010302290000004100000063000000 *740000007300000020000000610000007300000020000000610000006400000064000000480000 *006500000061000000640000006500000072000000200000006500000078000000630000006500 *0000700000007400000020000000660000006f0000007200000020000000420000007900000074 *00000065000000530000007400000072000000690000006e00000067000000730000000a000000 *009d01030102090000004100000064000000640000002000000061000000200000006b00000065 *000000790102010000002f01023e00000076000000610000006c00000075000000650000002000 *00007000000061000000690000007200000020000000740000006f000000200000007400000068 *000000650000002000000068000000650000006100000064000000650000007200000020000000 *7500000073000000690000006e0000006700000020000000740000006800000065000000200000 *00750000006e0000006400000065000000720000006c00000079000000690000006e0000006700 *000020000000480000006500000061000000640000006500000072000000500000006100000069 *0000007200000020000000640000006100000074000000610000000a027d000000200000007400 *00007900000070000000650000002e0000002000000020000000440000006f0000006500000073 *000000200000006e0000006f0000007400000020000000660000006f0000007200000063000000 *6500000020000000740000006800000065000000200000006b0000006500000079000000200000 *00740000006f00000020000000620000006500000020000000690000006e000000200000006c00 *00006f00000077000000650000007200000063000000610000007300000065000000200000006f *000000720000002000000067000000750000006100000072000000610000006e00000074000000 *650000006500000020000000740000006800000061000000740000002000000074000000680000 *006500000020000000670000006900000076000000650000006e000000200000006b0000006500 *00007900000020000000610000006e000000640000002000000074000000680000006500000020 *0000006b000000650000007900000020000000690000006e000000200000007400000068000000 *650000002000000048000000650000006100000064000000650000007200000050000000610000 *0069000000720000002000000077000000690000006c0000006c000000200000006d0000006100 *00007400000063000000680000002e000000200000000a000000009e010301024a000000430000 *007200000065000000610000007400000065000000730000002000000061000000200000005200 *00006500000073000000700000006f0000006e0000007300000065000000200000007700000069 *000000740000006800000020000000740000006800000065000000200000006700000069000000 *76000000650000006e00000020000000490000006e000000740000002000000061000000730000 *002000000074000000680000006500000020000000730000007400000061000000740000007500 *00007300000020000000630000006f000000640000006500000020000000610000006e00000064 *000000200000007400000068000000650000002000000070000000720000006f00000076000000 *690000006400000065000000640000000a02250000002000000053000000740000007200000069 *0000006e0000006700000020000000610000007300000020000000740000006800000065000000 *20000000620000006f0000006400000079000000200000006f0000006600000020000000740000 *00680000006500000020000000520000006500000073000000700000006f0000006e0000007300 *000065000000200000000a000000009f0103010208000000410000006300000074000000730000 *00200000006100000073000000200104010000009e022600000020000000620000007500000074 *00000020000000770000006f000000720000006b00000073000000200000007700000069000000 *740000006800000020000000420000007900000074000000650000005300000074000000720000 *00690000006e000000670000007300000020000000640000006900000072000000650000006300 *0000740000006c000000790000002e0000000a00000000a0010301021100000053000000650000 *007400000073000000200000007400000068000000650000002000000052000000650000007300 *0000700000006f0000006e000000730000006501020100000027023e0000007300000020000000 *73000000740000006100000074000000750000007300000020000000630000006f000000640000 *006500000020000000740000006f00000020000000740000006800000065000000200000006700 *00006900000076000000650000006e00000020000000490000006e000000740000002000000061 *0000006e0000006400000020000000720000006500000064000000690000007200000065000000 *63000000740000007300000020000000740000006f000000200000007400000068000000650000 *0020000000670000006900000076000000650000006e0000002000000055000000520000004900 *00000a000000026300000000026400000000026500000000026600005100000000000000010000 *0002000000030000000400000055000000560000005700000058000000590000005a0000005b00 *00005c0000005d0000005e0000005f000000600000006100000062000000630000006400000065 *000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e000000 *6f0000007000000071000000720000007300000074000000750000007600000077000000780000 *00790000007a0000007b0000007c0000007d0000007e0000007f00000080000000810000008200 *0000830000008400000085000000860000008700000088000000890000008a0000008b0000008c *0000008d0000008e0000008f000000900000009100000092000000930000009400000095000000 *960000009700000098000000990000009a0000009b0000009c0000009d0000009e0000009f0000 *00a0550000005700000058000000590000005a0000005b0000005c0000005d0000005e0000005f *000000600000006100000062000000630000006800000064000000690000006a0000006b000000 *6c0000006d000000690000006a0000006b0000006d000000650000006600000067000000550000 *00560000006f0000007000000071000000720000007300000078000000790000007a0000007b00 *00008f000000910000009200000093000000940000009500000096000000970000009800000099 *0000009a0000009b0000009c0000009d0000009000000085000000860000008700000088000000 *8c0000009e0000009f000000a00000007400000075000000760000008d0000008e000000890000 *008a0000007c00000084000000830000008200000081000000800000007f0000007e0000007d00 *0000770000008b0000006e0000000000000001000000020000000300000004004c000000550100 *0000560000005600000000570b00000058000000590000005a0000005b0000005c0000005d0000 *005e0000005f000000600000006100000062000000580000000059000000005a000000005b0000 *00005c000000005d000000005e000000005f00000000600000000061000000006200000000630e *0000006800000064000000690000006a0000006b0000006c0000006d000000690000006a000000 *6b0000006d00000065000000660000006700000064000000006500000000660000000067000000 *00680000000069000000006a000000006b000000006c000000006d000000006e000000006f0400 *000070000000710000007200000073000000700000000071000000007200000000730000000074 *0200000075000000760000007500000000760000000077000000007803000000790000007a0000 *007b00000079000000007a000000007b000000007c080000008400000083000000820000008100 *0000800000007f0000007e0000007d0000007d000000007e000000007f00000000800000000081 *000000008200000000830000000084000000008503000000860000008700000088000000860000 *00008700000000880000000089010000008a0000008a000000008b000000008c000000008d0000 *00008e000000008f00000000900000000091000000009200000000930000000094000000009500 *00000096000000009700000000980000000099000000009a000000009b000000009c000000009d *000000009e000000009f00000000a0000000000000000005000000000b000000a1010301020500 *00004c000000690000006b00000065000000200104010000026702260000002000000065000000 *780000006300000065000000700000007400000020000000530000007400000072000000690000 *006e000000670000007300000020000000610000006e0000006400000020000000430000006800 *0000610000007200000073000000200000006e0000006f00000074000000200000007100000075 *0000006f0000007400000065000000640000002e0000000a00000000a20000000000a300000000 *00a40000000000a501030102130000004400000065000000630000006f00000064000000650000 *0073000000200000006100000070000000700000006c0000006900000063000000610000007400 *0000690000006f0000006e0102010000002f0224000000780000002d0000007700000077000000 *770000002d000000660000006f000000720000006d0000002d00000075000000720000006c0000 *00650000006e000000630000006f00000064000000650000006400000020000000690000006e00 *0000700000007500000074000000730000002e0000002000000020000000200000002000000020 *000000200000000a00000000a60000000000a70103010211000000440000006500000063000000 *6f000000640000006500000073000000200000006d000000750000006c00000074000000690000 *00700000006100000072000000740102010000002f0211000000660000006f000000720000006d *0000002d0000006400000061000000740000006100000020000000690000006e00000070000000 *75000000740000002e0000000a030000000000000000030218000000430000006f0000006e0000 *0074000000650000006e000000740000002d000000740000007900000070000000650000002000 *0000700000006100000072000000610000006d0000006500000074000000650000007200000073 *0000000a000000000000000103020d000000520000006500000071000000750000006500000073 *0000007400000020000000620000006f00000064000000790000000a000000000000000203021c *000000490000006e00000070000000750000007400000020000000760000006100000072000000 *6900000061000000620000006c000000650000007300000020000000610000006e000000640000 *002000000076000000610000006c0000007500000065000000730000002e0000000a000000a800 *00000000a901030102250000005000000061000000630000006b00000073000000200000006100 *000020000000730000007400000072000000690000006e0000006700000020000000690000006e *000000740000006f00000020000000610000006e00000020000000490000006e00000070000000 *7500000074000000200000006f0000006600000020000000740000007900000070000000650000 *002001050a000000740000006500000078000000740000002f000000700000006c000000610000 *00690000006e02010000000a00000000aa01030228000000540000006800000065000000200000 *0064000000650000006600000061000000750000006c0000007400000020000000630000006f00 *00006e00000074000000650000006e000000740000002d00000074000000790000007000000065 *00000020000000660000006f000000720000002000000076000000610000007200000069000000 *61000000620000006c00000065000000730000002e0000000a00000000ab010302270000004700 *000065000000740000002000000074000000680000006500000020000000700000006100000074 *0000006800000020000000630000006f0000006d000000700000006f0000006e00000065000000 *6e00000074000000730000002000000066000000720000006f0000006d00000020000000610000 *0020000000530000007400000072000000690000006e000000670000002e0000000a000b000000 *a1000000a2000000a3000000a4000000a5000000a6000000a7000000a8000000a9000000aa0000 *00ab0b000000a3000000a4000000a5000000a6000000a7000000a8000000a9000000aa000000ab *000000a1000000a2000b000000a101000000a2000000a200000000a300000000a400000000a500 *000000a600000000a700000000a800000000a900000000aa00000000ab00000000000000001800 *00000026000002680000000002690000000000ac00000000026a00000000026b00000000026c00 *00000000ad010301023d000000550000006e000000730000006500000072000000690000006100 *00006c000000690000007a00000065000000730000002000000074000000680000006500000020 *00000062000000790000007400000065000000730000007400000072000000690000006e000000 *6700000020000000690000006e000000740000006f000000200000006100000020000000720000 *006500000073000000700000006f0000006e00000073000000650000002e000000200000002000 *000049000000660000002000000074000000680000006500000072000000650000002000000069 *0000007300000020000000610000006e0000000a01021600000020000000650000007200000072 *0000006f000000720000002000000069000000740000002000000077000000690000006c000000 *6c0000002000000072000000650000007400000075000000720000006e00000020010702080000 *004c000000650000006600000074000000200000006d000000730000006702020000002e000000 *0a000000026d00000000026e00000000026f000000000270000000000271000000000272000000 *0002730000000002740000000002750000000002760000000000ae0103022b0000005300000065 *0000007200000069000000610000006c000000690000007a000000650000007300000020000000 *740000006800000065000000200000007200000065000000710000007500000065000000730000 *007400000020000000740000006f00000020000000740000006800000065000000200000006700 *00006900000076000000650000006e0000002000000068000000610000006e000000640000006c *000000650000000a000000027700000000027800000000027900000000027a00000000027b0000 *0000027c00000000027d00000000027e00000000027f0000000002800000000002810000000002 *820000000002830000000002840000000002850000000002860000000002870000000002880000 *0000028900000000028a000003000000ac000000ad000000ae00010003000000ac00000000ad00 *000000ae00000000000000001900000000040000028b0000000000af0000000000b00103021500 *000042000000690000006e0000006400000020000000610000006e00000064000000200000006c *000000690000007300000074000000650000006e00000020000000700000006f00000072000000 *740000000a00000000b10103022600000055000000730000006500000020000000610000002000 *000070000000720000006500000076000000690000006f00000075000000730000006c00000079 *0000002000000062000000690000006e0000006400000020000000700000006f00000072000000 *7400000020000000610000006e00000064000000200000006c0000006900000073000000740000 *00650000006e0000000a0003000000af000000b0000000b100010003000000af00000000b00000 *0000b1000000000000000006000000000057000000000000000100000002000000030000000400 *000055000000560000005700000058000000590000005a0000005b0000005c0000005d0000005e *0000005f0000006000000061000000620000006300000064000000650000006600000067000000 *68000000690000006a0000006b0000006c0000006d0000006e0000006f00000070000000710000 *0072000000730000007400000075000000760000007700000078000000790000007a0000007b00 *00007c0000007d0000007e0000007f000000800000008100000082000000830000008400000085 *000000860000008700000088000000890000008a0000008b0000008c0000008d0000008e000000 *8f0000009000000091000000920000009300000094000000950000009600000097000000980000 *00990000009a0000009b0000009c0000009d0000009e0000009f000000a0000000ac000000ad00 *0000ae000000af000000b0000000b106000000ac000000ad000000ae000000b0000000b1000000 *af000000000000000000070000000003000000b2010301024000000053000000650000006e0000 *006400000073000000200000007400000068000000650000002000000073000000650000007200 *000069000000610000006c000000690000007a0000006500000064000000200000007200000065 *000000710000007500000065000000730000007400000020000000740000006f00000020000000 *74000000680000006500000020000000680000006f000000730000007400000020000000640000 *006500000066000000690000006e000000650000006400000020000000690000006e0000002000 *000074000000680000006500000020000000720000006500000071000000750000006500000073 *000000740000000a022e00000020000000610000006e0000006400000020000000610000007400 *000074000000650000006d00000070000000740000007300000020000000740000006f00000020 *000000700000006100000072000000730000006500000020000000720000006500000073000000 *700000006f0000006e00000073000000650000002000000075000000700000006f0000006e0000 *00200000006100000072000000720000006900000076000000610000006c0000002e0000000a00 *000000b30000000000b4000003000000b2000000b3000000b403000000b2000000b3000000b400 *03000000b200000000b300000000b4000000000000000008000000001a000000b500000000028c *0000000000b60000000000b700000000028d00000000028e00000000028f000000000290000000 *0002910000000002920000000000b8010301020500000055000000730000006500000073000000 *20010401000000bd01021c00000020000000740000006f00000020000000740000007200000061 *0000006e00000073000000660000006f000000720000006d000000200000007400000068000000 *6500000020000000670000006900000076000000650000006e00000020000000580000004d0000 *004c000000200104010000000c01020800000020000000690000006e000000740000006f000000 *20000000610000000a0102030000002000000061000000200104010000029302060000002e0000 *00200000002000000020000000200000000a00000000b90000000000ba0000000000bb01030102 *44000000500000006500000072000000660000006f000000720000006d00000073000000200000 *00610000006e0000002000000058000000530000004c0000002000000074000000720000006100 *00006e00000073000000660000006f000000720000006d0000006100000074000000690000006f *0000006e0000002000000077000000690000007400000068000000200000006c00000069000000 *730000007400000073000000200000006f00000066000000200000004200000079000000740000 *0065000000530000007400000072000000690000006e0000006700000073000000200000006900 *00006e0000007300000074000000650000006100000064000000200000006f000000660000000a *020b000000200000006100000020000000530000007400000072000000690000006e0000006700 *00002e0000000a00000000bc010301020e00000045000000710000007500000069000000760000 *00610000006c000000650000006e0000007400000020000000740000006f000000200104010000 *00bb0102340000002000000062000000750000007400000020000000640000006f000000650000 *0073000000200000006e0000006f00000074000000200000006800000069000000640000006500 *00002000000074000000680000006500000020000000690000006e000000680000006500000072 *000000650000006e0000007400000020000000490000004f000000200000006f00000066000000 *20000000740000006800000065000000200000006c0000006f000000770000002d0000006c0000 *006500000076000000650000006c0000000a021800000020000000420000007900000074000000 *65000000530000007400000072000000690000006e00000067000000200000006f000000700000 *0065000000720000006100000074000000690000006f0000006e000000730000002e0000000a00 *000000bd010301023a000000550000007300000065000000730000002000000074000000680000 *00650000002000000070000000720000006f000000760000006900000064000000650000006400 *00002000000078000000730000006c0000002000000066000000690000006c0000006500000020 *000000740000006f000000200000007400000072000000610000006e0000007300000066000000 *6f000000720000006d000000200000007400000068000000650000002000000067000000690000 *0076000000650000006e00000020000000730000007400000072000000690000006e0000006700 *00002e0000000a0102410000002000000054000000680000006900000073000000200000006600 *0000750000006e0000006300000074000000690000006f0000006e000000200000006300000072 *00000065000000610000007400000065000000730000002000000074000000650000006d000000 *700000006f000000720000006100000072000000790000002000000066000000690000006c0000 *00650000007300000020000000640000007500000072000000690000006e000000670000002000 *000069000000740000007300000020000000650000007800000065000000630000007500000074 *000000690000006f0000006e0000002c000000200000006200000075000000740000000a021b00 *00002000000067000000750000006100000072000000610000006e000000740000006500000065 *000000730000002000000074000000680000006500000069000000720000002000000063000000 *6c00000065000000610000006e00000075000000700000002e0000000a00000000be0103022e00 *00004e0000006f0000007400000065000000200000007400000068000000610000007400000020 *0000007400000068000000650000002000000078000000730000006c0000002000000066000000 *690000006c00000065000000200000006d00000075000000730000007400000020000000680000 *00610000007600000065000000200000002e00000078000000730000006c000000200000007300 *000075000000660000006600000069000000780000002e0000000a00000000bf01030102040000 *00550000007300000065000000200107020800000078000000730000006c000000740000007000 *0000720000006f00000063021300000020000000740000006f0000002000000074000000720000 *00610000006e00000073000000660000006f000000720000006d00000020000000580000004d00 *00004c0000002e0000000a00000002940000000000c00103010204000000550000007300000065 *00000020010702050000007300000061000000780000006f0000006e0213000000200000007400 *00006f000000200000007400000072000000610000006e00000073000000660000006f00000072 *0000006d00000020000000580000004d0000004c0000002e0000000a0000000295000000000296 *00000000029700000000029800000000029900000000029a00000c000000b5000000b6000000b7 *000000b8000000b9000000ba000000bb000000bc000000bd000000be000000bf000000c00c0000 *00be000000bd000000b8000000bb000000bc000000b5000000bf000000c0000000ba000000b900 *0000b6000000b7000c000000b500000000b600000000b700000000b800000000b900000000ba00 *000000bb00000000bc00000000bd00000000be00000000bf00000000c000000000000000000900 *010c00000072000000650000007100000075000000690000007200000065000000730000002000 *00006d000000740000006c010b00000070000000720000006f0000007600000069000000730000 *00690000006f0000006e000000610000006c010d0000006c000000650000006d0000006d000000 *690000006800000040000000760000006f0000002e000000630000006f0000006d870000029b00 *000000029c0000000000c101010301024e00000055000000730000006500000064000000200000 *00740000006f00000020000000630000006f0000006e0000007600000065000000720000007400 *000020000000610000007200000062000000690000007400000072000000610000007200000079 *00000020000000740000007900000070000000650000007300000020000000690000006e000000 *740000006f00000020000000610000006e00000020000000480000005400000054000000500000 *0020000000720000006500000073000000700000006f0000006e00000073000000650000002e00 *00002000000020000000590000006f00000075000000200000006e000000650000006500000064 *00000020000000740000006f00000020000000690000006d000000700000006c00000065000000 *6d000000650000006e000000740000000a01021b00000020000000200000007400000068000000 *690000007300000020000000690000006600000020000000790000006f00000075000000200000 *0077000000610000006e0000007400000020000000740000006f00000020000000700000006100 *00007300000073000000200107020d000000530000006500000072000000760000006500000072 *0000005000000061000000720000007400000054000000200000006d01021b0000002000000063 *0000006f0000006e0000007400000061000000690000006e000000690000006e00000067000000 *20000000790000006f000000750000007200000020000000740000007900000070000000650000 *0020000000690000006e000000740000006f00000020010401000000f002020000002e0000000a *030102140000004d000000690000006e000000690000006d000000610000006c00000020000000 *640000006500000066000000690000006e0000006900000074000000690000006f0000006e0000 *003a00000020010401000000c302020000002e0000000a00000000c20000000000c30000000000 *c40000000000c5010301020b00000055000000730000006500000066000000750000006c000000 *20000000660000006f00000072000000200104010000010d01020500000020000000610000006e *000000640000002001020800000067000000650000007400000044000000610000007400000061 *000000270102280000002000000020000000690000006d000000700000006c000000650000006d *000000650000006e00000074000000200000007400000068000000690000007300000020000000 *6f0000006e00000020000000790000006f00000075000000720000002000000070000000720000 *006500000066000000650000007200000072000000650000006400000020000000740000007900 *000070000000650000000a021900000020000000740000006f0000002000000075000000730000 *00650000002000000074000000680000006f000000730000006500000020000000660000007500 *00006e0000006300000074000000690000006f0000006e000000730000002e0000000a00000000 *c60000000000c70000000000c80101030102160000005400000068000000690000007300000020 *000000630000006c00000061000000730000007300000020000000690000007300000020000000 *750000007300000065000000640000002000000062000000790000002001040100000106010229 *00000020000000740000006f000000200000007000000061000000720000007300000065000000 *2000000061000000200000007000000061000000740000006800000020000000630000006f0000 *006d000000700000006f0000006e000000650000006e0000007400000020000000690000006e00 *0000740000006f00000020000000610000002000000076000000610000006c0000007500000065 *0000002e0000000a01024300000020000000410000007400000020000000700000007200000065 *00000073000000650000006e000000740000002c00000020000000740000006800000065000000 *20000000690000006e0000007300000074000000610000006e0000006300000065000000730000 *0020000000660000006f00000072000000200000006e000000750000006d000000620000006500 *000072000000200000007400000079000000700000006500000073000000200000002800000049 *0000006e000000740000002c00000020000000460000006c0000006f0000006100000074000000 *2c0000002000000065000000740000006300000029000000200000006a00000075000000730000 *00740000000a0102060000002000000063000000610000006c0000006c00000020010401000002 *9d0102130000002e0000002000000054000000680000006500000020000000690000006e000000 *7300000074000000610000006e000000630000006500000020000000660000006f000000720000 *00200104010000029301021a00000020000000680000006f000000770000006500000076000000 *65000000720000002c000000200000006a00000075000000730000007400000020000000700000 *006100000073000000730000006500000073000000200000007400000068000000650000000a01 *0241000000200000007000000061000000740000006800000020000000630000006f0000006d00 *0000700000006f0000006e000000650000006e0000007400000020000000730000007400000072 *000000610000006900000067000000680000007400000020000000740000006800000072000000 *6f0000007500000067000000680000002e00000020000000540000006800000069000000730000 *0020000000690000007300000020000000730000006f0000002000000074000000680000006100 *00007400000020000000790000006f000000750000002000000063000000610000006e00000020 *0000007200000065000000610000006400000020000000610000000a01022b0000002000000070 *00000061000000740000006800000020000000630000006f0000006d000000700000006f000000 *6e000000650000006e000000740000002000000077000000680000006900000063000000680000 *00200000006c0000006f0000006f0000006b00000073000000200000006c000000690000006b00 *000065000000200000007400000068000000690000007300000020000000610000007300000020 *00000061000000200104010000029302020000003a0000000a01030102010000002f01020a0000 *00730000006f0000006d00000065000000730000007400000072000000690000006e0000006701 *02010000002f02010000000a01030236000000690000006e000000730000007400000065000000 *6100000064000000200000006f0000006600000020000000720000006500000071000000750000 *006900000072000000690000006e00000067000000200000007400000068000000650000002000 *00007000000061000000740000006800000020000000630000006f0000006d000000700000006f *0000006e000000650000006e0000007400000020000000740000006f000000200000006c000000 *6f0000006f0000006b000000200000006c000000690000006b000000650000003a0000000a0301 *02010000002f0102010000002201020a000000730000006f0000006d0000006500000073000000 *7400000072000000690000006e00000067010201000000220102010000002f02010000000a0000 *0000c90000000000ca0000000000cb0101030102160000004100000020000000630000006f0000 *006e00000074000000720000006f0000006c000000200000007300000074000000720000007500 *000063000000740000007500000072000000650000002e000000200000000a0102290000002000 *0000490000007400000020000000650000006e0000006400000073000000200000007400000068 *0000006500000020000000630000006f0000006d00000070000000750000007400000061000000 *74000000690000006f0000006e00000020000000610000006e0000006400000020000000720000 *00650000007400000075000000720000006e000000730000002000000074000000680000006500 *000020010402000000680000006301021400000020000000790000006f00000075000000200000 *0070000000610000007300000073000000650000006400000020000000690000006e0000007400 *00006f0000002000000069000000740000000a01024700000020000000690000006d0000006d00 *00006500000064000000690000006100000074000000650000006c000000790000002e00000020 *00000020000000540000006800000069000000730000002000000070000000720000006f000000 *760000006900000064000000650000007300000020000000610000006e00000020000000610000 *006c0000007400000065000000720000006e000000610000007400000065000000200000006500 *0000730000006300000061000000700000006500000020000000720000006f0000007500000074 *000000650000002e0000002000000020000000490000006e000000200000007000000061000000 *72000000740000006900000063000000750000006c00000061000000720000000a01023a000000 *200000006900000074000000200000006800000061000000730000002000000061000000200000 *006d0000006f0000006e0000006100000064000000690000006300000020000000760000006100 *00006c0000007500000065000000200000006f0000006600000020000000610000006e00000079 *00000020000000740000007900000070000000650000002e000000200000002000000041000000 *6e0000006400000020000000750000006e0000006c000000650000007300000073000000200000 *00790000006f000000750000002000000063000000610000006c0000006c000000200107010401 *000000d102030000002000000069000000640102010000000a0237000000200000006600000069 *00000072000000730000007400000020000000790000006f000000750000007200000020000000 *720000006500000073000000700000006f0000006e000000730000006500000020000000660000 *00690000006c000000740000006500000072000000730000002000000077000000690000006c00 *00006c000000200000006200000065000000200000006100000070000000700000006c00000069 *0000006500000064000000200000006e0000006f000000720000006d000000610000006c000000 *6c000000790000002e0000000a0301021900000045000000780000007400000072000000650000 *006d000000650000006c0000007900000020000000750000007300000065000000660000007500 *00006c000000200000007700000068000000650000006e00000020000000790000006f00000075 *0102010000002701022b0000007200000065000000200000006400000065000000650000007000 *000020000000690000006e00000073000000690000006400000065000000200000006100000020 *0000006d0000006f0000006e000000610000006400000020000000610000006e00000064000000 *200000006400000065000000630000006900000064000000650000002000000074000000680000 *00610000007400000020000000790000006f000000750000000a01024300000020000000770000 *00610000006e0000007400000020000000740000006f0000002000000072000000650000007400 *000075000000720000006e000000200000006100000020000000630000006f0000006d00000070 *0000006c0000006500000074000000650000006c00000079000000200000006400000069000000 *66000000660000006500000072000000650000006e0000007400000020000000630000006f0000 *006e00000074000000650000006e00000074000000200000007400000079000000700000006500 *00002c0000002000000073000000690000006e0000006300000065000000200000006900000074 *00000020000000640000006f00000065000000730000006e010201000000270102020000007400 *00000a01022f00000020000000660000006f000000720000006300000065000000200000007900 *00006f0000007500000020000000740000006f00000020000000630000006f0000006e00000076 *00000065000000720000007400000020000000610000006c0000006c0000002000000079000000 *6f00000075000000720000002000000072000000650000007400000075000000720000006e0000 *0020000000740000007900000070000000650000007300000020000000740000006f0000002001 *0402000000680000006301020f000000200000006500000061000000720000006c000000790000 *00200000006a00000075000000730000007400000020000000740000006f0000000a0212000000 *200000006100000063000000630000006f0000006d0000006f0000006400000061000000740000 *006500000020000000740000006800000069000000730000002e0000000a00000000cc01010301 *0231000000490000007400000020000000690000007300000020000000770000006f0000007200 *000074000000680000002000000064000000690000007300000063000000750000007300000073 *000000690000006e00000067000000200000007400000068000000650000002000000075000000 *6e0000007000000061000000630000006b00000065000000640000002000000073000000740000 *0072000000750000006300000074000000750000007200000065000000200000006f0000006600 *000020010402000000ce000000cd01020c00000020000000610000002000000062000000690000 *00740000002000000061000000730000002000000069000000740102010000002701020a000000 *73000000200000006500000078000000700000006f0000007300000065000000640000000a0102 *050000002000000020000000690000006e00000020010401000000e50102050000002000000061 *0000006e0000006400000020010401000000eb02020000002e0000000a01030102110000004100 *00002000000066000000750000006c0000006c0000007900000020000000750000006e00000070 *00000061000000630000006b000000650000006400000020010402000000ce000000cd02220000 *002000000068000000610000007300000020000000610000002000000073000000740000007200 *000075000000630000007400000075000000720000006500000020000000740000006800000061 *00000074000000200000006c0000006f0000006f0000006b00000073000000200000006c000000 *690000006b000000650000003a0000000a0107024a00000020000000750000006e000000750000 *006e00000057000000650000006200000054000000200000002400000020000000570000006500 *00006200000054000000200000006d0000002000000061000000200000003a0000003a00000020 *0000006d00000020000000280000004d0000006100000079000000620000006500000020000000 *280000004500000069000000740000006800000065000000720000002000000052000000650000 *0073000000700000006f0000006e000000730000006500000020000000610000002c0000002000 *000046000000690000006c00000074000000650000007200000046000000750000006e00000020 *000000520000006500000073000000700000006f0000006e000000730000006500000029000000 *290000000a010301020d000000530000006f0000002c0000002000000069000000670000006e00 *00006f00000072000000690000006e0000006700000020010702010000006d01021f0000002c00 *000020000000610000007300000020000000690000007400000020000000690000007300000020 *0000006a0000007500000073000000740000002000000074000000680000006500000020000000 *630000006f0000006e0000007400000061000000690000006e000000690000006e000000670000 *00200104010000029e0102190000002c0000002000000074000000680000006500000020000000 *6f000000750000007400000065000000720000006d0000006f0000007300000074000000200000 *006c000000610000007900000065000000720000002000000069000000730000000a0102040000 *00200000002000000061000000200104010000029f01020b0000002e0000002000000020000000 *54000000680000006900000073000000200000006900000073000000200104010000024c010204 *00000020000000690000006600000020010401000002a001020f00000020000000770000006100 *0000730000002000000063000000610000006c0000006c0000006500000064000000200000006f *00000072000000200107010401000002a10102020000002000000028010401000002a201020100 *00002001040200000068000000630102010000000a010205000000200000002000000061000000 *2c00000020010401000000d80102020000002000000028010402000002a3000002a40102010000 *002001040200000068000000630202000000290000002901020400000020000000690000006600 *000020010401000002a0010205000000200000007700000061000000730000006e010201000000 *27010216000000740000002000000063000000610000006c0000006c0000006500000064000000 *2e0000002000000020000000490000006e00000073000000690000006400000065000000200000 *00740000006800000065000000200104010000029f0102020000002c0000000a01024a00000020 *000000200000007400000068000000650000007200000065000000200000006900000073000000 *200000006100000020000000700000006100000069000000720000002e00000020000000200000 *00540000006800000065000000200000007300000065000000630000006f0000006e0000006400 *000020000000650000006c000000650000006d000000650000006e00000074000000200000006f *000000660000002000000074000000680000006500000020000000700000006100000069000000 *72000000200000006900000073000000200000006f000000750000007200000020000000660000 *00690000006c0000007400000065000000720000002000000066000000750000006e0000006300 *000074000000690000006f0000006e0000000a01020200000020000000200107010401000000d7 *01020100000020040200000068000000630102030000002e000000200000002001070104010000 *00d701020100000020040200000068000000630102150000002000000069000000730000002000 *000061000000200000007400000079000000700000006500000020000000610000006c00000069 *000000610000007300000020000000660000006f00000072000000200107010401000000d80102 *010000000a010203000000200000002000000028010402000002a5000002a60102020000002000 *000028010402000002a3000002a401020100000020010402000000680000006302020000002900 *0000290102200000002e0000002000000020000000540000006800000069000000730000002000 *00006900000073000000200000006a000000750000007300000074000000200000006100000020 *000000770000007200000061000000700000007000000065000000720000002000000066000000 *6f0000007200000020000000610000002001070104020000006800000063010204000000200000 *002d0000003e00000020040200000068000000630102010000000a01021d000000200000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000002000000077 *000000690000007400000068000000200000006100000020000000700000006100000072000000 *740000006900000063000000750000006c000000610000007200000020010401000002a7021600 *0000200000006200000065000000680000006100000076000000690000006f000000720000002e *00000020000000200000005400000068000000650000002000000076000000610000006c000000 *75000000650000000a010702190000002000000020000000410000007000000070000000650000 *006e0000006400000020000000280000004400000075000000610000006c000000200000002800 *0000450000006e000000640000006f000000200000006600000029000000290000000a01030232 *000000430000006100000075000000730000006500000073000000200000006600000020000000 *740000006f00000020000000620000006500000020000000630000006f0000006d000000700000 *006f00000073000000650000006400000020000000770000006900000074000000680000002000 *00007400000068000000650000002000000070000000720000006500000076000000690000006f *00000075000000730000002000000066000000690000006c000000740000006500000072000000 *2e0000000a01070216000000200000002000000053000000650000007400000020000000280000 *004400000075000000610000006c0000002000000028000000450000006e000000640000006f00 *0000200000006600000029000000290000000a0103023600000043000000610000007500000073 *0000006500000073000000200000006600000020000000740000006f000000200000006e000000 *6f0000007400000020000000620000006500000020000000630000006f0000006d000000700000 *006f00000073000000650000006400000020000000770000006900000074000000680000002000 *00007400000068000000650000002000000070000000720000006500000076000000690000006f *00000075000000730000002000000066000000690000006c000000740000006500000072000000 *2e0000000a010301023100000046000000690000006e000000610000006c0000006c0000007900 *00002c000000200000007400000068000000650000002000000066000000690000007200000073 *0000007400000020000000650000006c000000650000006d000000650000006e00000074000000 *200000006f00000066000000200000007400000068000000650000002000000070000000610000 *006900000072000000200000006900000073000000200000006500000069000000740000006800 *00006500000072000000200107020d0000004c0000006500000066000000740000002000000052 *0000006500000073000000700000006f0000006e0000007300000065010204000000200000006f *000000720000002001070207000000520000006900000067000000680000007400000020000000 *6102020000002e0000000a0103010241000000410000006e0000006f0000007400000068000000 *650000007200000020000000770000006100000079000000200000006f00000066000000200000 *006c0000006f0000006f0000006b000000690000006e0000006700000020000000610000007400 *000020000000610000006c0000006c000000200000007400000068000000650000007300000065 *000000200000007000000069000000650000006300000065000000730000002000000069000000 *730000002000000066000000720000006f0000006d000000200000007400000068000000650000 *00200000006200000065000000680000006100000076000000690000006f000000720000007300 *00000a010215000000200000002000000074000000680000006500000079000000200000006300 *00006f0000006e00000074000000720000006f0000006c0000002e000000200000002000000054 *0000006800000065000000200104010000029f01020e00000020000000630000006f0000006e00 *000074000000720000006f0000006c000000730000002000000074000000680000006500000020 *010401000002a001020c0000002000000062000000650000006800000061000000760000006900 *00006f000000720000002e00000020000000200107010204000000530000006500000074000000 *0a020a000000200000002000000028000000450000006e000000640000006f0000002000000066 *0000002901021000000020000000630000006f0000006d00000065000000730000002000000066 *000000720000006f0000006d0000002000000074000000680000006500000020010401000000d1 *010216000000200000006200000065000000680000006100000076000000690000006f00000072 *0000002e00000020000000200000004c000000690000006b000000650000007700000069000000 *73000000650000002c000000200107010207000000410000007000000070000000650000006e00 *0000640000000a020a000000200000002000000028000000450000006e000000640000006f0000 *002000000066000000290102090000002000000069000000730000002000000066000000720000 *006f0000006d00000020010401000000d20102030000002e00000020000000200107020d000000 *4c00000065000000660000007400000020000000520000006500000073000000700000006f0000 *006e000000730000006501020d0000002000000069000000730000002000000077000000680000 *00610000007400000020000000790000006f000000750000000a01021400000020000000200000 *00670000006500000074000000200000007700000068000000650000006e000000200000007900 *00006f000000750000002000000063000000610000006c0000006c00000020010401000000cb01 *020500000020000000610000006e00000064000000200107020700000052000000690000006700 *000068000000740000002000000061021500000020000000690000007300000020000000740000 *006800000065000000200000006e0000006f000000720000006d000000610000006c0000002000 *0000650000007800000069000000740000002e0000000a01030226000000410000006e00000020 *0000006500000078000000610000006d000000700000006c000000650000002000000063000000 *6100000073000000650000002000000073000000740000006100000074000000650000006d0000 *00650000006e00000074000000200000006c0000006f0000006f0000006b000000730000002000 *00006c000000690000006b000000650000003a0000000a07010210000000200000002000000065 *00000078000000310000002000000077000000650000006200000074000000200000003d000000 *20000000640000006f0000000a0102190000002000000020000000200000002000000076000000 *610000006c000000200000003c0000002d00000020000000750000006e000000750000006e0000 *005700000065000000620000005400000020000000770000006500000062000000740000000a01 *021000000020000000200000002000000020000000630000006100000073000000650000002000 *000076000000610000006c000000200000006f000000660000000a01024e000000200000002000 *00002000000020000000200000002000000020000000200000004e0000006f0000007400000068 *000000690000006e00000067000000200000002d0000003e000000200000004e0000006f000000 *7400000068000000690000006e0000006700000020000000200000002d0000002d000000200000 *007400000068000000690000007300000020000000690000007300000020000000740000006800 *00006500000020000000690000006e000000740000006500000072000000690000006f00000072 *0000002000000076000000610000006c0000007500000065000000200000007700000068000000 *650000006e000000200000006d0000007a00000065000000720000006f00000020000000770000 *00610000007300000020000000750000007300000065000000640000000a010261000000200000 *00200000002000000020000000200000002000000020000000200000004a000000750000007300 *00007400000020000000280000004c00000065000000660000007400000020000000720000002c *000000200000006600000029000000200000002d0000003e000000200000004a00000075000000 *730000007400000020000000280000004c00000065000000660000007400000020000000720000 *002c000000200000006600000029000000200000002d0000002d00000020000000720000002000 *00006900000073000000200000007400000068000000650000002000000076000000610000006c *000000750000006500000020000000740000006800000061000000740000002000000077000000 *610000007300000020000000700000006100000073000000730000006500000064000000200000 *00690000006e000000740000006f000000200000002200000066000000690000006e0000006900 *0000730000006800000057000000690000007400000068000000220000000a0102490000002000 *000020000000200000002000000020000000200000002000000020000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *000020000000200000002000000020000000200000002d0000002d000000200000006600000020 *0000006900000073000000200000006f0000007500000072000000200000006600000069000000 *6c0000007400000065000000720000002000000066000000750000006e00000063000000740000 *00690000006f0000006e0000000a01025000000020000000200000002000000020000000200000 *002000000020000000200000004a00000075000000730000007400000020000000280000005200 *00006900000067000000680000007400000020000000610000002c000000200000006600000029 *000000200000002d0000003e000000200000004a00000075000000730000007400000020000000 *28000000520000006900000067000000680000007400000020000000610000002c000000200000 *006600000029000000200000002d0000002d000000200000006100000020000000690000007300 *0000200000006f0000007500000072000000200000006e0000006f000000720000006d00000061 *0000006c000000200000006d0000006f0000006e00000061000000640000006900000063000000 *2000000076000000610000006c00000075000000650000000a0251000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *000020000000200000002000000020000000200000002000000020000000200000002000000020 *00000020000000200000002000000020000000200000002d0000002d0000002000000066000000 *200000006900000073000000200000007300000074000000690000006c0000006c000000200000 *006f00000075000000720000002000000066000000690000006c00000074000000650000007200 *00002000000066000000750000006e0000006300000074000000690000006f0000006e0000000a *00000000cd01030224000000540000006800000065000000200000006200000061000000730000 *00690000006300000020000000720000006500000073000000700000006f0000006e0000007300 *000065000000200000006200000075000000690000006c00000064000000690000006e00000067 *000000200000006f000000620000006a0000006500000063000000740000002e0000000a000000 *00ce0000000000cf0000000000d001030102300000004100000020000000730000006500000074 *000000200000006f000000660000002000000066000000750000006e0000006300000074000000 *690000006f0000006e0000007300000020000000660000006f00000072000000200000006d0000 *00610000006e0000006900000070000000750000006c0000006100000074000000690000006e00 *0000670000002000000066000000690000006c000000740000006500000072000000730000002e *00000020000000200000004100000020010402000000df000000de01020c000000200000006900 *00006d000000700000006c000000650000006d000000650000006e00000074000000730000000a *01020100000020010401000000d001020100000020010402000000680000006301022e00000020 *000000730000006f00000020000000740000006800000065000000730000006500000020000000 *6d0000006500000074000000680000006f00000064000000730000002000000061000000720000 *0065000000200000007400000068000000650000002000000066000000750000006e0000006400 *0000610000006d000000650000006e00000074000000610000006c000000200000007700000061 *0000007900000073000000200000006f000000660000000a010238000000200000006d00000061 *0000006e0000006900000070000000750000006c0000006100000074000000690000006e000000 *670000002000000074000000680000006500000020000000720000006500000073000000700000 *006f0000006e0000007300000065000000200000006f000000620000006a000000650000006300 *0000740000002c0000002000000065000000730000007000000065000000630000006900000061 *0000006c0000006c00000079000000200000006200000065000000660000006f00000072000000 *6500000020000000790000006f0000007501020100000027010212000000760000006500000020 *000000630000006f0000006e000000760000006500000072000000740000006500000064000000 *20000000790000006f00000075000000720000000a010214000000200000006d0000006f000000 *6e000000610000006400000069000000630000002000000076000000610000006c000000750000 *006500000020000000740000006f00000020000000610000002001040200000068000000630202 *0000002e0000000a00000000d1010103023000000049000000670000006e0000006f0000007200 *0000650000007300000020000000610000006c0000006c00000020000000700000007200000065 *00000076000000690000006f000000750000007300000020000000610000006c00000074000000 *65000000720000006100000074000000690000006f0000006e0000007300000020000000740000 *006f00000020000000790000006f00000075000000720000002000000066000000690000006c00 *00007400000065000000720000000a0103020f000000410000007300000020000000610000006e *000000200000006500000078000000610000006d000000700000006c000000650000003a000000 *0a010701020400000020000000640000006f0000000a0102130000002000000020000000200000 *00630000006f0000006d000000700000006f000000730000006500000046000000690000006c00 *000074000000650000007200000020000000660000000a01020f00000020000000200000002000 *000073000000650000007400000046000000690000006c00000074000000650000007200000020 *000000670000000a02180000002000000020000000200000007200000065000000740000007500 *0000720000006e000000200000002200000048000000650000006c0000006c0000006f00000020 *000000570000006f000000720000006c00000064000000220000000a03023e0000007300000065 *0000007400000046000000690000006c0000007400000065000000720000002000000067000000 *2000000077000000690000006c0000006c00000020000000630000006100000075000000730000 *006500000020000000740000006800000065000000200000006600000069000000720000007300 *00007400000020000000630000006f0000006d000000700000006f000000730000006500000046 *000000690000006c00000074000000650000007200000020000000740000006f00000020000000 *62000000650000002000000069000000670000006e0000006f0000007200000065000000640000 *002e0000000a00000000d20103010237000000430000006f0000006d000000700000006f000000 *73000000650000007300000020000000790000006f000000750000007200000020000000660000 *00690000006c0000007400000065000000720000002000000066000000750000006e0000006300 *000074000000690000006f0000006e000000200000007700000069000000740000006800000020 *000000740000006800000065000000200000006500000078000000690000007300000074000000 *690000006e000000670000002000000066000000690000006c0000007400000065000000720000 *000a020b0000002000000066000000750000006e0000006300000074000000690000006f000000 *6e0000002e0000000a00000000d30103022a000000520000006500000074000000720000006900 *000076000000650000007300000020000000740000006800000065000000200000006600000069 *0000006c0000007400000065000000720000002000000066000000720000006f0000006d000000 *2000000074000000680000006500000020000000650000006e0000007600000069000000720000 *006f0000006e0000006d000000650000006e000000740000002e0000000a00000000d400000000 *00d50000000000d60000000000d701030107020900000046000000690000006c00000074000000 *650000007200000046000000750000006e01022000000020000000690000007300000020000000 *61000000200000006c0000006f00000074000000200000006d0000006f00000072000000650000 *002000000066000000750000006e00000020000000740000006f00000020000000740000007900 *00007000000065000000200000007400000068000000610000006e000000200107021900000053 *0000006500000074000000410000007000000070000000650000006e0000006400000020000000 *280000004400000075000000610000006c0000002000000028000000450000006e000000640000 *006f0000002000000061000000290000002902020000002e0000000a00000000d801010301021e *00000041000000200000006d0000006f0000006e0000006f000000690000006400000020000000 *6f0000007000000065000000720000006100000074000000690000006f0000006e000000200000 *00630000006f0000006e0000007400000061000000690000006e00000065000000720000002e00 *00000a010218000000200000004900000066000000200000006100000020000000690000007300 *00002000000061000000200000006d0000006f0000006e0000006f00000069000000640000002c *000000200000007400000068000000650000006e00000020010401000000d8022b000000200000 *0069000000730000002000000061000000200000006d0000006f0000006e0000006f0000006900 *000064000000200000007700000069000000740000006800000020000000740000006800000065 *00000020000000660000006f0000006c0000006c0000006f00000077000000690000006e000000 *67000000200000006200000065000000680000006100000076000000690000006f000000720000 *00730000003a0000000a0107010237000000200000002000000053000000650000007400000020 *0000002000000020000000200000007800000020000000600000006d0000006100000070000000 *70000000650000006e000000640000006000000020000000410000007000000070000000650000 *006e000000640000002000000079000000200000003d0000002000000053000000650000007400 *000020000000200000002000000020000000280000007800000020000000600000006d00000061 *0000007000000070000000650000006e0000006400000060000000200000007900000029000000 *0a0102370000002000000020000000410000007000000070000000650000006e00000064000000 *200000007800000020000000600000006d000000610000007000000070000000650000006e0000 *00640000006000000020000000410000007000000070000000650000006e000000640000002000 *000079000000200000003d00000020000000410000007000000070000000650000006e00000064 *00000020000000280000007800000020000000600000006d000000610000007000000070000000 *650000006e00000064000000600000002000000079000000290000000a02260000002000000020 *0000005f0000002000000020000000200000002000000020000000200000002000000020000000 *600000006d000000610000007000000070000000650000006e0000006400000060000000200000 *005300000065000000740000002000000079000000200000002000000020000000200000003d00 *00002000000053000000650000007400000020000000790000000a0301023a0000004100000020 *00000073000000690000006d000000700000006c00000065000000200000007700000061000000 *79000000200000006f000000660000002000000073000000750000006d0000006d000000610000 *0072000000690000007a000000690000006e000000670000002000000074000000680000006900 *0000730000002000000069000000730000002c0000002000000069000000660000002000000074 *000000680000006500000020000000720000006900000067000000680000007400000020000000 *730000006900000064000000650000002000000069000000730000002001070206000000410000 *007000000070000000650000006e0000006401020b0000002c0000002000000074000000680000 *00650000006e000000200000007400000068000000650000000a01023600000020000000720000 *006900000067000000680000007400000020000000690000007300000020000000610000007000 *000070000000650000006e00000064000000650000006400000020000000740000006f00000020 *000000740000006800000065000000200000006c0000006500000066000000740000002e000000 *200000002000000049000000660000002000000074000000680000006500000020000000720000 *006900000067000000680000007400000020000000730000006900000064000000650000002000 *0000690000007300000020010702030000005300000065000000740102150000002c0000002000 *00007400000068000000650000006e00000020000000740000006800000065000000200000006c *00000065000000660000007400000020000000730000006900000064000000650000000a020d00 *00002000000069000000730000002000000069000000670000006e0000006f0000007200000065 *000000640000002e0000000a00000000d90000000000da0000000000db010301021a0000005900 *000065000000730000002c00000020000000740000006800000069000000730000002000000069 *000000730000002000000065000000780000006100000063000000740000006c00000079000000 *200000006c000000690000006b0000006500000020010402000002a8000002a901021100000020 *00000077000000690000007400000068000000200000006e000000650000007700000020000000 *6e000000610000006d00000065000000730000002e0000000a0102160000002000000057000000 *680000007900000020000000790000006f000000750000002000000061000000730000006b0000 *003f00000020000000420000006500000063000000610000007500000073000000650000002001 *02070000005300000065000000720000007600000065000000720000005401020f000000200000 *0063000000610000006e000000200000006c000000690000006600000074000000200000007500 *000070000000200000006100000020010402000002a8000002a90102020000002e0000000a0102 *2900000020000000490000006600000020000000790000006f0000007500000020000000640000 *00690000006400000020000000740000006800000061000000740000002c000000200000006900 *00007400000020000000770000006f000000750000006c00000064000000200000007300000068 *00000061000000640000006f000000770000002000000053000000650000007200000076000000 *6500000072000000540102010000002701020b0000007300000020000000620000006500000068 *0000006100000076000000690000006f000000720000000a010236000000200000006100000073 *000000200000006100000020000000520000006500000061000000640000006500000072000000 *540000002c0000002000000074000000680000007500000073000000200000006d000000650000 *00610000006e000000690000006e00000067000000200000006900000066000000200000007900 *00006f00000075000000200000006c000000690000006600000074000000650000006400000020 *000000740000006800000065000000200000005200000065000000610000006400000065000000 *72000000540000000a01022000000020000000790000006f000000750000002000000063000000 *6f000000750000006c00000064000000200000006e0000006f000000200000006c0000006f0000 *006e000000670000006500000072000000200000006d0000006f00000064000000690000006600 *0000790000002000000074000000680000006500000020010402000000580000005701020c0000 *002e00000020000000200000005400000068000000690000007300000020000000770000006100 *0000790000000a01020f00000020000000790000006f0000007500000020000000630000006100 *00006e00000020000000610000006400000064000000200000006100000020010402000002a800 *0002a901021d00000020000000740000006f00000020000000790000006f000000750000007200 *0000200000006d0000006f0000006e000000610000006400000020000000730000007400000061 *000000630000006b00000020000000770000006900000074000000680000006f00000075000000 *740000000a020e00000020000000610000006e000000790000002000000074000000720000006f *00000075000000620000006c000000650000002e0000000a00000000dc0000000000dd00000000 *00de0103024a000000530000006500000072000000760000006500000072000000500000006100 *000072000000740000005400000020000000690000007300000020000000610000002000000063 *0000006f0000006e0000007400000061000000690000006e000000650000007200000020000000 *660000006f000000720000002000000070000000720000006f0000006300000065000000730000 *0073000000690000006e0000006700000020000000720000006500000071000000750000006500 *000073000000740000007300000020000000610000006e00000064000000200000007200000065 *0000007400000075000000720000006e000000690000006e000000670000002000000072000000 *6500000073000000750000006c00000074000000730000002e0000000a00000000df0000000000 *e00000000000e101030232000000410000006e00000020000000610000006c0000006900000061 *0000007300000020000000660000006f0000007200000020000000750000007300000069000000 *6e0000006700000020000000530000006500000072000000760000006500000072000000500000 *0061000000720000007400000054000000200000007700000068000000650000006e0000002000 *00007500000073000000690000006e000000670000002000000074000000680000006500000020 *000000490000004f0000002e0000000a00000000e201030221000000410000006e000000200000 *00610000006c00000069000000610000007300000020000000660000006f000000720000002000 *000057000000650000006200000054000000200000007700000068000000650000006e00000020 *0000007500000073000000690000006e0000006700000020000000490000004f0000002e000000 *0a00000000e3010301023a00000070000000610000007200000074000000690000006300000075 *0000006c00000061000000720000006c0000007900000020000000750000007300000065000000 *66000000750000006c000000200000007700000068000000650000006e00000020000000630000 *006f0000006d00000062000000690000006e000000650000006400000020000000770000006900 *000074000000680000002000000072000000750000006e00000057000000650000006200000054 *00000020000000740000006f0000002000000070000000720000006f0000006400000075000000 *63000000650000000a010203000000200000006100000020010702120000006d00000020000000 *280000004d00000061000000790000006200000065000000200000005200000065000000730000 *00700000006f0000006e0000007300000065000000290211000000200000006600000072000000 *6f0000006d00000020000000610000002000000072000000650000007100000075000000650000 *0073000000740000002e0000000a00000000e40000000000e50101030102470000005500000073 *000000650000006400000020000000740000006f000000200000006d000000610000006e000000 *6900000070000000750000006c0000006100000074000000650000002000000074000000680000 *006500000020000000630000006f0000006e0000007400000061000000690000006e0000006900 *00006e00000067000000200000006d0000006f0000006e00000061000000640000002e00000020 *000000200000005600000065000000720000007900000020000000750000007300000065000000 *66000000750000006c000000200000007700000068000000650000006e00000020000000650000 *006d00000062000000650000006400000064000000690000006e00000067000000200000006100 *00000a01020e000000200000006d0000006f0000006e0000006100000064000000200000006900 *00006e000000740000006f000000200000006100000020010402000000df000000de0102080000 *002c0000002000000073000000690000006e000000630000006500000020010401000000f00102 *0c0000002000000072000000650000007100000075000000690000007200000065000000730000 *002000000061000000200107021000000053000000650000007200000076000000650000007200 *0000500000006100000072000000740000005400000020000000490000004f0000002000000061 *0102020000002e0000000a01020a00000020000000520000006500000066000000650000007200 *000020000000740000006f00000020010402000000ce000000cd02330000002000000066000000 *6f0000007200000020000000610000006e000000200000006500000078000000700000006c0000 *00610000006e0000006100000074000000690000006f0000006e000000200000006f0000006600 *000020000000740000006800000065000000200000007300000074000000720000007500000063 *00000074000000750000007200000065000000200000006f000000660000002000000074000000 *6800000065000000200000006d0000006f0000006e00000061000000640000002e0000000a0103 *010232000000480000006500000072000000650000002000000069000000730000002000000061 *0000006e000000200000006500000078000000610000006d000000700000006c00000065000000 *2e0000002000000020000000530000007500000070000000700000006f00000073000000650000 *0020000000790000006f000000750000002000000077000000610000006e000000740000002000 *0000740000006f00000020000000650000006d0000006200000065000000640000002000000061 *0000006e00000020010402000002aa000002ab01020b00000020000000690000006e0000007400 *00006f00000020000000790000006f00000075000000720000000a010201000000200104020000 *00df000000de01020b00000020000000740000006f00000020000000650000006e000000610000 *00620000006c0000006500000020010401000002ac01020500000020000000610000006e000000 *6400000020010401000002ad01020900000020000000690000006e00000020000000790000006f *0000007500000072000000200104010000029e02020000002e0000000a01070237000000200000 *0074000000790000007000000065000000200000004d0000007900000053000000650000007200 *000076000000650000007200000050000000610000007200000074000000540000002000000065 *000000200000006d0000002000000061000000200000003d000000200000005300000065000000 *720000007600000065000000720000005000000061000000720000007400000054000000200000 *00280000004500000072000000720000006f000000720000005400000020000000650000002000 *00006d0000002900000020000000610000000a010301021d0000004e0000006f00000077000000 *20000000730000007500000070000000700000006f000000730000006500000020000000790000 *006f000000750000002000000077000000610000006e0000007400000020000000740000006f00 *00002000000070000000610000007300000073000000200107020d0000004d0000007900000053 *000000650000007200000076000000650000007200000050000000610000007200000074000000 *5401021100000020000000690000006e000000740000006f000000200000006100000020000000 *66000000750000006e0000006300000074000000690000006f0000006e0000000a010210000000 *20000000740000006800000061000000740000002000000064000000650000006d000000610000 *006e00000064000000730000002000000061000000200107021000000053000000650000007200 *000076000000650000007200000050000000610000007200000074000000540000002000000049 *0000004f00000020000000610102070000002000000028000000650000002e000000670000002e *00000020010401000000f0010208000000290000002e0000002000000020000000590000006f00 *0000750000000a021b0000002000000063000000610000006e0000002000000070000000720000 *006f00000076000000690000006400000065000000200000007400000068000000650000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000003a0000000a *010701024b000000200000002000000020000000750000006e0000007000000061000000630000 *006b0000004500000072000000720000006f00000072000000540000003a0000003a0000002000 *0000280000004d0000006f0000006e0000006100000064000000200000006d0000002c00000020 *00000053000000680000006f00000077000000200000006500000029000000200000003d000000 *3e00000020000000550000006e0000005700000065000000620000005400000020000000280000 *004500000072000000720000006f00000072000000540000002000000065000000200000006d00 *0000290000002000000061000000200000002d0000003e00000020000000550000006e00000057 *000000650000006200000054000000200000006d00000020000000610000000a01022000000020 *0000002000000020000000750000006e0000007000000061000000630000006b00000045000000 *72000000720000006f00000072000000540000002000000068000000610000006e000000640000 *006c0000006500000072000000200000006500000074000000200000003d000000200000006400 *00006f0000000a01021e0000002000000020000000200000002000000020000000200000006500 *0000690000007400000068000000650000007200000056000000200000003c0000002d00000020 *00000072000000750000006e0000004500000072000000720000006f0000007200000054000000 *2000000065000000740000000a01021f0000002000000020000000200000002000000020000000 *2000000072000000650000007400000075000000720000006e0000002000000024000000200000 *006300000061000000730000006500000020000000650000006900000074000000680000006500 *00007200000056000000200000006f000000660000000a01024300000020000000200000002000 *0000200000002000000020000000200000002000000020000000200000004c0000006500000066 *0000007400000020000000650000007200000072000000200000002d0000003e00000020000000 *4a00000075000000730000007400000020000000280000004c0000006500000066000000740000 *002000000022000000430000006100000074000000610000007300000074000000720000006f00 *000070000000680000006900000063000000200000006600000061000000690000006c00000075 *00000072000000650000002000000022000000200000002b0000002b0000002000000073000000 *680000006f0000007700000020000000650000000a010241000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *0000200000002000000020000000200000002c0000002000000053000000650000007400000020 *0000002400000020000000450000006e000000640000006f000000200000002400000020000000 *5c00000072000000200000002d0000003e00000020000000720000007b00000072000000730000 *00430000006f0000006400000065000000200000003d0000002000000035000000300000003000 *00007d000000290000000a02170000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000052000000690000006700000068000000740000002000 *000078000000200000002d0000003e00000020000000780000000a010301020500000057000000 *690000007400000068000000200107020c000000750000006e0000007000000061000000630000 *006b0000004500000072000000720000006f000000720000005401021200000020000000790000 *006f000000750000002000000063000000610000006e000000200000006e0000006f0000007700 *00002000000063000000610000006c0000006c00000020010401000000f00102110000002e0000 *00200000004a000000750000007300000074000000200000007700000072000000610000007000 *000020000000790000006f0000007500000072000000200107020b000000530000006500000072 *000000760000006500000072000000500000006100000072000000740000005402070000002000 *00006c0000006900000073000000740000002e0000000a01070254000000200000002000000073 *000000690000006d000000700000006c0000006500000048000000540000005400000050000000 *200000006e000000750000006c0000006c000000430000006f0000006e00000066000000200000 *0024000000200000006d0000006100000070000000530000006500000072000000760000006500 *000072000000500000006100000072000000740000005400000020000000750000006e00000070 *00000061000000630000006b0000004500000072000000720000006f0000007200000054000000 *20000000280000006d000000790000005000000061000000720000007400000020000000600000 *0063000000610000007400000063000000680000004500000072000000720000006f0000007200 *000060000000200000006d0000007900000048000000610000006e000000640000006c00000065 *00000072000000290000000a010302120000004f0000007200000020000000610000006c000000 *7400000065000000720000006e00000061000000740000006900000076000000650000006c0000 *00790000003a0000000a01070244000000200000002000000073000000690000006d0000007000 *00006c00000065000000480000005400000054000000500000002700000020000000750000006e *0000007000000061000000630000006b0000004500000072000000720000006f00000072000000 *54000000200000006e000000750000006c0000006c000000430000006f0000006e000000660000 *0020000000280000006d0000007900000050000000610000007200000074000000200000006000 *000063000000610000007400000063000000680000004500000072000000720000006f00000072 *00000060000000200000006d0000007900000048000000610000006e000000640000006c000000 *6500000072000000290000000a03010209000000410000006c000000730000006f000000200000 *007300000065000000650000002001040100000135023400000020000000660000006f00000072 *0000002000000061000000200000006d0000006f00000072000000650000002000000073000000 *6f0000007000000068000000690000007300000074000000690000006300000061000000740000 *0065000000640000002000000076000000650000007200000073000000690000006f0000006e00 *0000200000006f0000006600000020000000740000006800000069000000730000002000000066 *000000750000006e0000006300000074000000690000006f0000006e0000002e0000000a000000 *00e6010301020d000000410000002000000076000000610000007200000069000000610000006e *00000074000000200000006f0000006600000020010401000000e5010230000000200000007700 *000068000000650000007200000065000000200000007400000068000000650000002000000066 *000000690000007200000073000000740000002000000061000000720000006700000075000000 *6d000000650000006e0000007400000020000000610000006c000000730000006f000000200000 *0074000000610000006b0000006500000073000000200000006100000020000000720000006500 *000071000000750000006500000073000000740000002e0000000a010217000000200000005500 *0000730000006500000066000000750000006c0000002000000069000000660000002000000079 *0000006f000000750000002000000077000000610000006e000000740000002000000074000000 *6f00000020010401000000e3010210000000200000006f0000006e000000200000006100000020 *000000640000006900000066000000660000006500000072000000650000006e00000074000000 *20010402000000df000000de01020d00000020000000690000006e000000730000006900000064 *0000006500000020000000790000006f00000075000000720000000a01020c000000200000006d *0000006f0000006e00000061000000640000002000000028000000730000006500000065000000 *20010401000001350203000000290000002e0000000a00000002ae010301022400000045000000 *780000007400000072000000610000006300000074000000200000007400000068000000650000 *002000000076000000610000006c00000075000000650000002000000066000000720000006f00 *00006d000000200000006100000020000000530000006500000074000000410000007000000070 *000000650000006e000000640000002e0000000a010235000000200000004e0000006f00000074 *000000650000002000000074000000680000006100000074000000200000006100000020000000 *530000006500000074000000410000007000000070000000650000006e00000064000000200000 *0069000000730000002000000061000000630000007400000075000000610000006c0000006c00 *000079000000200000006100000020000000430000006f000000500000006f000000690000006e *0000007400000065000000640000002000000066000000720000006f0000006d0000003a000000 *0a01020100000020010c68000000680000007400000074000000700000003a0000002f0000002f *0000006800000061000000630000006b0000006100000067000000650000002e00000068000000 *61000000730000006b000000650000006c0000006c0000002e0000006f00000072000000670000 *002f0000007000000061000000630000006b000000610000006700000065000000730000002f00 *0000610000007200000063000000680000006900000076000000650000002f0000006300000061 *0000007400000065000000670000006f00000072000000790000002d0000006500000078000000 *740000007200000061000000730000002f0000006c000000610000007400000065000000730000 *00740000002f000000640000006f000000630000002f00000068000000740000006d0000006c00 *00002f000000430000006f0000006e00000074000000720000006f0000006c0000002d00000046 *000000750000006e00000063000000740000006f000000720000002d000000500000006f000000 *690000006e0000007400000065000000640000002e00000068000000740000006d0000006c0102 *010000000a022e00000020000000420000007500000074000000200000006c0000006500000074 *00000073000000200000006e0000006f0000007400000020000000640000007200000061000000 *6700000020000000690000006e0000002000000074000000680000006100000074000000200000 *00640000006500000070000000650000006e00000064000000650000006e000000630000007900 *00002e000000200000007900000065000000740000002e0000002e0000002e0000000a00000002 *af0000000000e70103010210000000440000006500000070000000720000006500000063000000 *610000007400000065000000640000003a00000020000000750000007300000065000000200104 *01000002a002020000002e0000000a00000000e8010301020b00000054000000610000006b0000 *00650000007300000020000000790000006f000000750000007200000020010402000000ce0000 *00cd01020b0000002c000000200000006900000066000000200000006900000074000000200000 *00690000007300000020010401000002b001020c00000020000000690000007400000020000000 *72000000650000007400000075000000720000006e00000073000000200104010000024c010209 *00000020000000650000006c00000073000000650000002000000069000000740000000a010219 *00000020000000630000006f0000006e0000007600000065000000720000007400000073000000 *200000007400000068000000650000002000000076000000610000006c00000075000000650000 *0020000000740000006f0000002000000061000000200104020000006800000063022000000020 *000000610000006e00000064000000200000006100000070000000700000006c00000069000000 *650000007300000020000000790000006f00000075000000720000002000000066000000690000 *006c00000074000000650000007200000020000000740000006f00000020000000690000007400 *00002e0000000a00000000e90103010225000000460000006f0000007200000020000000770000 *0068000000650000006e00000020000000790000006f0000007500000020000000720000006500 *0000610000006c0000006c00000079000000200000006e00000065000000650000006400000020 *000000740000006f00000020000000750000006e0000007000000061000000630000006b000000 *200000006100000020010402000000ce000000cd01021300000020000000650000006e00000074 *0000006900000072000000650000006c000000790000002000000028000000610000006e000000 *64000000200000006e0000006f000000740000000a010222000000200000006a00000075000000 *730000007400000020000000750000006e00000077000000720000006100000070000000200000 *007400000068000000650000002000000066000000690000007200000073000000740000002000 *00006c000000610000007900000065000000720000002000000077000000690000007400000068 *00000020010401000000cf0203000000290000002e0000000a00000000ea010301020f00000046 *0000006f0000007200000020000000770000007200000061000000700000007000000069000000 *6e00000067000000200000006100000020010402000000ce000000cd01020b0000002000000062 *00000061000000630000006b0000002000000075000000700000002e0000002000000020010702 *160000006d0000006b00000057000000650000006200000054000000200000002e000000200000 *00750000006e000000750000006e00000057000000650000006200000054000000200000003d00 *000020000000690000006402010000000a00000000eb0103010204000000530000006500000065 *00000020010401000000e5022400000020000000660000006f0000007200000020000000610000 *002000000064000000690000007300000063000000750000007300000073000000690000006f00 *00006e000000200000006f00000066000000200000007400000068000000690000007300000020 *00000066000000750000006e0000006300000074000000690000006f0000006e0000002e000000 *0a00000000ec010301020d000000410000006e00000020000000610000006c0000006900000061 *0000007300000020000000660000006f00000072000000200107020c0000007300000065000000 *7400000046000000690000006c000000740000006500000072000000200000006900000064021d *000000200000004900000074000000200000007200000065000000730000006500000074000000 *7300000020000000610000006c0000006c00000020000000790000006f00000075000000720000 *002000000066000000690000006c000000740000006500000072000000730000002e0000000a00 *000000ed01030102380000005500000073000000650000006400000020000000740000006f0000 *002000000069000000670000006e0000006f000000720000006500000020000000610000006c00 *00006c00000020000000790000006f00000075000000720000002000000066000000690000006c *0000007400000065000000720000007300000020000000610000006e0000006400000020000000 *690000006d0000006d0000006500000064000000690000006100000074000000650000006c0000 *007900000020000000650000006e00000064000000200000007400000068000000650000000a01 *022000000020000000630000006f0000006d000000700000007500000074000000610000007400 *0000690000006f0000006e0000002e00000020000000200000004100000020000000630000006f *0000006d00000062000000690000006e0000006100000074000000690000006f0000006e000000 *200000006f0000006600000020010401000000ec01020500000020000000610000006e00000064 *00000020010401000000cb02020000002e0000000a00000000ee0103010215000000410000006e *00000020000000610000006c0000007400000065000000720000006e0000006100000074000000 *6500000020000000660000006f000000720000006d000000200000006f00000066000000200104 *01000000ed01022500000020000000740000006800000061000000740000002000000063000000 *610000006e00000020000000620000006500000020000000650000006100000073000000690000 *006c00000079000000200000007500000073000000650000006400000020000000770000006900 *00007400000068000000690000006e000000200000006100000020000000640000006f0000000a *020800000020000000620000006c0000006f000000630000006b0000002e0000000a00000002b1 *010301020c000000410000006e0000002000000061000000720000007200000061000000790000 *00200000006f0000006600000020010401000002b20102180000002c0000002000000075000000 *730000006500000066000000750000006c00000020000000660000006f00000072000000200000 *0070000000720000006f00000063000000650000007300000073000000690000006e0000006700 *00000a01021e00000020000000630000006f0000006d0000006d000000610000006e0000006400 *0000200000006c000000690000006e00000065000000200000006f000000700000007400000069 *0000006f0000006e0000007300000020000000690000006e000000740000006f00000020000000 *610000006e00000020010402000000860000008501020500000020000000660000006f00000072 *00000020010401000000f002020000002e0000000a00000000ef01030102220000005000000061 *00000072000000730000006500000020000000630000006f0000006d0000006d00000061000000 *6e00000064000000200000006c000000690000006e00000065000000200000006f000000700000 *0074000000690000006f0000006e0000007300000020000000690000006e000000740000006f00 *0000200000006100000020010402000000860000008502020000002e0000000a00000000f00103 *01023d000000550000007300000065000000200000007400000068000000650000002000000062 *00000075000000690000006c000000740000002d000000690000006e0000002000000077000000 *65000000620000002d000000730000006500000072000000760000006500000072000000200000 *00740000006f000000200000007300000065000000720000007600000065000000200000007200 *000065000000710000007500000065000000730000007400000073000000200000006100000063 *000000630000006f0000007200000064000000690000006e000000670000002000000074000000 *6f00000020000000610000000a01020100000020010402000000df000000de0102070000002e00 *0000200000002000000055000000730000006500000020010401000002b301022a000000200000 *00740000006f000000200000007000000069000000630000006b00000020000000740000006800 *000065000000200000006600000069000000720000007300000074000000200000006800000061 *0000006e000000640000006c00000065000000720000002000000066000000720000006f000000 *6d0000002000000061000000200000006c000000690000007300000074000000200000006f0000 *00660000000a0102140000002000000068000000610000006e000000640000006c000000650000 *007200000073000000200000007400000068000000610000007400000020000000640000006f00 *000065000000730000006e01020100000027010207000000740000002000000063000000610000 *006c0000006c00000020010401000002a001021f0000002e000000200000005400000068000000 *69000000730000002000000066000000750000006e0000006300000074000000690000006f0000 *006e00000020000000610000006c00000077000000610000007900000073000000200000006200 *0000690000006e0000006400000073000000200000006f0000000a01023f000000200000004900 *000050000000760000003400000020000000700000006f00000072000000740000007300000020 *000000750000006e00000074000000690000006c000000200000004e0000006500000074000000 *770000006f000000720000006b000000200000006d0000006f00000064000000750000006c0000 *006500000020000000690000007300000020000000660000006900000078000000650000006400 *000020000000740000006f00000020000000730000007500000070000000700000006f00000072 *00000074000000200000004900000050000000760000003600000020000000690000006e000000 *20000000610000000a01021300000020000000700000006f000000720000007400000061000000 *620000006c00000065000000200000007700000061000000790000002e00000020000000550000 *00730000006500000020010401000000f301021b00000020000000770000006900000074000000 *6800000020000000630000007500000073000000740000006f0000006d00000020000000730000 *006f000000630000006b0000006500000074000000200000006900000066000000200000007900 *00006f000000750000000a021b0000002000000077000000610000006e00000074000000200000 *00640000006900000066000000660000006500000072000000650000006e000000740000002000 *00006200000065000000680000006100000076000000690000006f00000075000000720000002e *0000000a00000000f101030102110000004100000020000000630000006f0000006d0000006200 *0000690000006e0000006100000074000000690000006f0000006e000000200000006f00000066 *00000020010401000000f201020500000020000000610000006e00000064000000200104010000 *00e50102070000002e00000020000000200000005300000065000000650000000a010201000000 *20010401000000e501023000000020000000660000006f00000072000000200000006100000020 *00000064000000690000007300000063000000750000007300000073000000690000006f000000 *6e000000200000006f000000660000002000000074000000680000006500000020000000660000 *006900000072000000730000007400000020000000610000007200000067000000750000006d00 *0000650000006e00000074000000200000006f0000006600000020000000740000006800000069 *000000730000000a0102420000002000000066000000750000006e000000630000007400000069 *0000006f0000006e0000002e000000200000005400000068000000690000007300000020000000 *66000000750000006e0000006300000074000000690000006f0000006e00000020000000610000 *006c000000770000006100000079000000730000002000000062000000690000006e0000006400 *00007300000020000000740000006f000000200000004900000050000000760000003400000020 *000000700000006f00000072000000740000007300000020000000750000006e00000074000000 *690000006c000000200000004e0000006500000074000000770000006f000000720000006b0000 *000a010238000000200000006d0000006f00000064000000750000006c00000065000000200000 *006900000073000000200000006600000069000000780000006500000064000000200000007400 *00006f00000020000000730000007500000070000000700000006f000000720000007400000020 *0000004900000050000000760000003600000020000000690000006e0000002000000061000000 *20000000700000006f000000720000007400000061000000620000006c00000065000000200000 *007700000061000000790000002e000000200000005500000073000000650000000a0102010000 *0020010401000000f301022a000000200000007700000069000000740000006800000020000000 *630000007500000073000000740000006f0000006d00000020000000730000006f000000630000 *006b000000650000007400000020000000690000006600000020000000790000006f0000007500 *00002000000077000000610000006e000000740000002000000064000000690000006600000066 *0000006500000072000000650000006e000000740000000a020c00000020000000620000006500 *0000680000006100000076000000690000006f00000075000000720000002e0000000a00000000 *f2010301021900000047000000650000006e000000650000007200000061000000740000006500 *0000200000006100000020000000720000006500000073000000750000006c0000007400000020 *00000066000000720000006f0000006d000000200000006100000020010402000000df000000de *01020700000020000000610000006e000000640000002000000061000000200104020000005800 *0000570102160000002e0000002000000054000000680000006900000073000000200000006900 *000073000000200000006d00000061000000690000006e0000006c000000790000002000000075 *0000007300000065000000640000000a0221000000200000006200000079000000200000004300 *000047000000490000002000000028000000610000006e00000064000000200000006600000061 *00000073000000740000002d000000630000006700000069000000290000002000000077000000 *720000006100000070000000700000006500000072000000730000002e0000000a00000000f301 *010301020400000052000000750000006e00000020010401000000f001023b0000002000000077 *000000690000007400000068000000200000006100000020000000700000007200000065000000 *76000000690000006f00000075000000730000006c0000007900000020000000620000006f0000 *00750000006e0000006400000020000000730000006f000000630000006b000000650000007400 *00002e0000002000000055000000730000006500000066000000750000006c0000002000000069 *0000006600000020000000790000006f000000750000002000000077000000610000006e000000 *7400000020000000740000006f0000002000000072000000750000006e0000000a023800000020 *00000068000000610000007000000070000000730000007400000061000000630000006b000000 *2000000061000000730000002000000075000000730000006500000072000000200000006f0000 *006e00000020000000700000006f00000072000000740000002000000038000000300000002e00 *00002000000055000000730000006500000020000000730000006f0000006d0000006500000074 *00000068000000690000006e00000067000000200000006c000000690000006b00000065000000 *20000000740000006800000069000000730000003a0000000a010701024a000000200000006900 *00006d000000700000006f00000072000000740000002000000053000000790000007300000074 *000000650000006d0000002e000000500000006f0000007300000069000000780000002e000000 *550000007300000065000000720000002000000028000000730000006500000074000000550000 *0073000000650000007200000049000000440000002c0000002000000055000000730000006500 *000072000000450000006e000000740000007200000079000000280000002e0000002e00000029 *0000002c0000002000000067000000650000007400000055000000730000006500000072000000 *450000006e000000740000007200000079000000460000006f000000720000004e000000610000 *006d00000065000000290000000a0102010000000a01020b000000200000006d00000061000000 *690000006e000000200000003d00000020000000640000006f0000000a01022700000020000000 *200000002000000020000000200000006c000000650000007400000020000000630000006f0000 *006e00000066000000200000003d000000200000006e000000750000006c0000006c0000004300 *00006f0000006e00000066000000200000007b00000020000000700000006f0000007200000074 *000000200000003d000000200000003800000030000000200000007d0000000a01021d00000020 *00000020000000200000002000000020000000730000006f000000630000006b00000065000000 *74000000200000003c0000002d0000002000000062000000690000006e00000064000000500000 *006f000000720000007400000020000000630000006f0000006e000000660000000a0102240000 *0020000000200000002000000020000000200000002d0000002d00000020000000640000006f00 *0000200000006f0000007400000068000000650000007200000020000000730000007400000075 *000000660000006600000020000000610000007300000020000000720000006f0000006f000000 *7400000020000000680000006500000072000000650000000a0102360000002000000020000000 *200000002000000020000000670000006500000074000000550000007300000065000000720000 *00450000006e000000740000007200000079000000460000006f000000720000004e0000006100 *00006d00000065000000200000002200000077000000770000007700000022000000200000003e *0000003e0000003d00000020000000730000006500000074000000550000007300000065000000 *720000004900000044000000200000002e00000020000000750000007300000065000000720000 *0049000000440000000a01023100000020000000200000002000000020000000200000002d0000 *002d0000002000000066000000690000006e000000610000006c0000006c000000790000002000 *000073000000740000006100000072000000740000002000000068000000610000006e00000064 *0000006c000000690000006e0000006700000020000000690000006e000000630000006f000000 *6d000000690000006e000000670000002000000072000000650000007100000075000000650000 *007300000074000000730000000a023b0000002000000020000000200000002000000020000000 *740000006900000064000000200000003c0000002d00000020000000660000006f000000720000 *006b000000490000004f00000020000000240000002000000073000000690000006d0000007000 *00006c000000650000004800000054000000540000005000000057000000690000007400000068 *000000530000006f000000630000006b000000650000007400000020000000730000006f000000 *630000006b000000650000007400000020000000630000006f0000006e00000066000000200000 *00690000006d000000700000006c0000000a030102080000004e0000006f000000740000006500 *00003a000000200000004900000074010201000000270102410000007300000020000000690000 *006d000000700000006f0000007200000074000000610000006e00000074000000200000007400 *00006f000000200000007500000073000000650000002000000074000000680000006500000020 *00000073000000610000006d0000006500000020000000630000006f0000006e00000066000000 *20000000280000006f00000072000000200000006100000074000000200000006c000000650000 *006100000073000000740000002000000074000000680000006500000020000000730000006100 *00006d0000006500000020000000700000006f0000007200000074000000290000002000000066 *0000006f000000720000000a01020100000020010401000000f501020500000020000000610000 *006e0000006400000020010401000000f302020000002e0000000a00000000f401030102050000 *004c000000690000006b0000006500000020010401000000f10210000000200000007700000069 *0000007400000068000000200000006100000020000000730000006f000000630000006b000000 *65000000740000002e0000000a00000000f5010301022400000042000000690000006e00000064 *00000020000000700000006f000000720000007400000020000000610000006e00000064000000 *2000000072000000650000007400000075000000720000006e0000002000000074000000680000 *006500000020000000730000006f000000630000006b0000006500000074000000200000006600 *00006f0000007200000020010401000000f30102070000002e0000002000000054000000680000 *0069000000730000000a0102460000002000000066000000750000006e00000063000000740000 *00690000006f0000006e00000020000000610000006c0000007700000061000000790000007300 *00002000000062000000690000006e000000640000007300000020000000740000006f00000020 *0000004900000050000000760000003400000020000000700000006f0000007200000074000000 *7300000020000000750000006e00000074000000690000006c000000200000004e000000650000 *0074000000770000006f000000720000006b000000200000006d0000006f000000640000007500 *00006c000000650000002000000069000000730000002000000066000000690000007800000065 *0000006400000020000000740000006f0000000a02210000002000000073000000750000007000 *0000700000006f0000007200000074000000200000004900000050000000760000003600000020 *000000690000006e000000200000006100000020000000700000006f0000007200000074000000 *61000000620000006c00000065000000200000007700000061000000790000002e0000000a0000 *0000f601010301021e0000006c0000006f000000770000002d0000006c00000065000000760000 *00650000006c0000002000000066000000750000006e0000006300000074000000690000006f00 *00006e00000020000000740000006f000000200000006200000075000000690000006c00000064 *000000200000006100000020010402000000680000006301021b00000020000000660000007200 *00006f0000006d000000200000006100000020000000630000006f0000006e0000007400000065 *0000006e000000740000002d000000740000007900000070000000650000002000000061000000 *6e0000006400000020000000610000000a0102010000002001020a000000420000007900000074 *00000065000000530000007400000072000000690000006e0000006702010000000a0301020a00 *000043000000720000006500000061000000740000006500000073000000200000006100000020 *010402000000680000006301021c00000020000000690000006e00000020000000610000002000 *00006d000000610000006e0000006e00000065000000720000002000000073000000690000006d *000000690000006c000000610000007200000020000000740000006f0000002000000074000000 *680000006500000020010401000000c101020800000020000000630000006c0000006100000073 *000000730000002c0000000a023100000020000000620000007500000074000000200000007700 *0000690000007400000068000000200000006f0000007500000074000000200000007200000065 *00000071000000750000006900000072000000690000006e000000670000002000000061000000 *6e00000020000000690000006e0000007300000074000000610000006e00000063000000650000 *00200000006400000065000000630000006c000000610000007200000061000000740000006900 *00006f0000006e0000002e0000000a02000000000000000003020d000000630000006f0000006e *00000074000000650000006e000000740000002d00000074000000790000007000000065000000 *0a000000000000000103020e000000720000006500000073000000700000006f0000006e000000 *730000006500000020000000620000006f00000064000000790000000a000000f7010301040100 *0000f7010216000000200000007400000075000000720000006e00000073000000200000007900 *00006f000000750000007200000020000000610000007200000062000000690000007400000072 *00000061000000720000007900000020010702030000006d000000200000006101021500000020 *000000610000006e0000006400000020000000630000006f0000006e0000007600000065000000 *72000000740000007300000020000000690000007400000020000000740000006f0000006f0000 *000a01020300000020000000610000002001070102020000006d00000020040200000068000000 *63010206000000200000007700000069000000740000006800000020010401000000c402020000 *002e0000000a00000000f801030102270000005400000068000000690000007300000020000000 *6900000073000000200000006b000000690000006e0000006400000061000000200000006c0000 *00690000006b000000650000002000000061000000200000007600000065000000720000007900 *0000200000006f00000064000000640000006c0000007900000020000000730000006800000061 *00000070000000650000006400000020010401000000e5010204000000200000006f0000007200 *000020010401000000eb0102010000000a022e00000020000000590000006f0000007500000020 *00000070000000720000006f0000006200000061000000620000006c0000007900000020000000 *77000000610000006e00000074000000200000006f0000006e00000065000000200000006f0000 *007200000020000000740000006800000065000000200000006f00000074000000680000006500 *000072000000200000006f000000660000002000000074000000680000006f0000007300000065 *0000002e0000000a00000000f90103022100000047000000650000007400000020000000610000 *0020000000680000006500000061000000640000006500000072000000200000006f0000007500 *000074000000200000006f00000066000000200000007400000068000000650000002000000072 *0000006500000071000000750000006500000073000000740000002e0000000a00000000fa0103 *01021f000000410000006400000064000000200000006800000065000000610000006400000065 *000000720000007300000020000000690000006e000000740000006f0000002000000074000000 *680000006500000020000000720000006500000073000000700000006f0000006e000000730000 *00650000002e0000000a0102390000002000000020000000200000005400000068000000690000 *0073000000200000006d0000006500000074000000680000006f00000064000000200000006400 *00006f0000006500000073000000200000006e0000006f00000074000000200000006f00000076 *000000650000007200000077000000720000006900000074000000650000002000000061000000 *6e00000079000000200000006500000078000000690000007300000074000000690000006e0000 *006700000020000000680000006500000061000000640000006500000072000000200000006f00 *0000660000000a0102210000002000000020000000200000007400000068000000650000002000 *000073000000610000006d00000065000000200000006e000000610000006d000000650000002c *0000002000000068000000650000006e0000006300000065000000200000007400000068000000 *65000000200000006e000000610000006d0000006500000020010401000000fa01020a0000002e *0000002000000020000000490000006600000020000000790000006f000000750000000a010220 *00000020000000200000002000000077000000610000006e000000740000002000000074000000 *6f000000200000007200000065000000700000006c000000610000006300000065000000200000 *006100000020000000680000006500000061000000640000006500000072000000200000007500 *0000730000006500000020010401000000fb02020000002e0000000a00000000fb010301023300 *000053000000650000007400000020000000610000002000000068000000650000006100000064 *000000650000007200000020000000690000006e000000740000006f0000002000000074000000 *680000006500000020000000720000006500000073000000700000006f0000006e000000730000 *00650000002e000000200000002000000054000000680000006900000073000000200000007700 *0000690000006c0000006c000000200000007200000065000000700000006c0000006100000063 *000000650000000a01022b00000020000000610000006e00000020000000650000007800000069 *0000007300000074000000690000006e0000006700000020000000680000006500000061000000 *640000006500000072000000200000006f00000066000000200000007400000068000000650000 *002000000073000000610000006d00000065000000200000006e000000610000006d0000006500 *00002e000000200000002000000055000000730000006500000020010401000000fa0102080000 *0020000000690000006600000020000000790000006f000000750000000a023400000020000000 *77000000610000006e0000007400000020000000740000006f0000002000000061000000640000 *0064000000200000006d0000006f00000072000000650000002000000074000000680000006100 *00006e000000200000006f0000006e000000650000002000000068000000650000006100000064 *0000006500000072000000200000006f0000006600000020000000740000006800000065000000 *2000000073000000610000006d00000065000000200000006e000000610000006d000000650000 *002e0000000a00000000fc01030232000000470000007500000061000000720000006400000020 *0000007500000073000000690000006e0000006700000020000000610000006e00000020000000 *610000007200000062000000690000007400000072000000610000007200000079000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000006f00 *00006e000000200000007400000068000000650000002000000072000000650000007100000075 *0000006500000073000000740000002e0000000a00000000fd010301023c000000470000007500 *000061000000720000006400000020000000610000006700000061000000690000006e00000073 *0000007400000020000000740000006800000065000000200000006d0000006500000074000000 *680000006f000000640000002e0000002000000054000000680000006900000073000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000006100 *00006c000000730000006f00000020000000670000007500000061000000720000006400000073 *00000020000000610000006700000061000000690000006e00000073000000740000000a010222 *00000020000000610000006e000000790000002000000072000000650000006d00000061000000 *690000006e000000690000006e0000006700000020000000700000006100000074000000680000 *00200000007300000065000000670000006d000000650000006e00000074000000730000002e00 *00002000000053000000650000006500000020010401000000fe01021100000020000000660000 *006f00000072000000200000007400000068000000650000002000000076000000650000007200 *000073000000690000006f0000006e0000000a021c000000200000007400000068000000610000 *007400000020000000670000007500000061000000720000006400000073000000200000006f00 *00006e0000006c00000079000000200000006200000079000000200000006d0000006500000074 *000000680000006f000000640000000a00000000fe010301022e00000047000000750000006100 *0000720000006400000020000000610000006700000061000000690000006e0000007300000074 *00000020000000740000006800000065000000200000006d000000650000007400000068000000 *6f00000064000000200000006f0000006e0000006c000000790000002e00000020000000280000 *006100000073000000200000006f00000070000000700000006f00000073000000650000006400 *000020000000740000006f00000020010401000000fd0202000000290000000a00000000ff0103 *010246000000470000007500000061000000720000006400000020000000610000006700000061 *000000690000006e00000073000000740000002000000074000000680000006500000020000000 *6d0000006500000074000000680000006f000000640000002e000000200000004e0000006f0000 *0074000000650000002c0000002000000074000000680000006900000073000000200000006600 *0000750000006e0000006300000074000000690000006f0000006e00000020000000610000006c *000000730000006f00000020000000670000007500000061000000720000006400000073000000 *20000000610000006700000061000000690000006e000000730000007400000020000000610000 *006e000000790000000a021c00000020000000200000002000000072000000650000006d000000 *61000000690000006e000000690000006e00000067000000200000007000000061000000740000 *0068000000200000007300000065000000670000006d000000650000006e000000740000007300 *00002e0000000a0000000100010301024600000047000000750000006100000072000000640000 *0020000000610000006700000061000000690000006e0000007300000074000000200000007400 *00006800000065000000200000006d0000006500000074000000680000006f000000640000002e *000000200000004e0000006f00000074000000650000002c000000200000007400000068000000 *69000000730000002000000066000000750000006e0000006300000074000000690000006f0000 *006e00000020000000610000006c000000730000006f0000002000000067000000750000006100 *000072000000640000007300000020000000610000006700000061000000690000006e00000073 *0000007400000020000000610000006e000000790000000a01024a000000200000007200000065 *0000006d00000061000000690000006e000000690000006e000000670000002000000070000000 *610000007400000068000000200000007300000065000000670000006d000000650000006e0000 *0074000000730000002e0000002000000020000000540000006800000069000000730000002000 *000066000000750000006e0000006300000074000000690000006f0000006e0000002000000069 *000000730000002000000064000000650000007000000072000000650000006300000061000000 *7400000065000000640000002e0000002000000020000000590000006f00000075000000200000 *0063000000610000006e0000002000000070000000720000006f00000062000000610000006200 *00006c000000790000000a0225000000200000006a000000750000007300000074000000200000 *00750000007300000065000000200000006d0000006500000074000000680000006f0000006400 *0000530000005000000020000000280000006f00000072000000200000006d0000006500000074 *000000680000006f000000640000004d00000029000000200000006e0000006f00000077000000 *2e0000000a00000001010103023100000047000000750000006100000072000000640000002000 *0000610000006700000061000000690000006e0000007300000074000000200000006e0000006f *0000006e0000002d000000650000006d0000007000000074000000790000002000000072000000 *650000006d00000061000000690000006e000000690000006e0000006700000020000000700000 *00610000007400000068000000200000007300000065000000670000006d000000650000006e00 *000074000000730000002e0000000a000000010201010301021f000000500000006f0000007000 *00002000000061000000200000007000000061000000740000006800000020000000650000006c *000000650000006d000000650000006e0000007400000020000000610000006e00000064000000 *2000000072000000750000006e0000002000000074000000680000006500000020010402000000 *df000000de0221000000200000006900000066000000200000006900000074000000200000006d *000000610000007400000063000000680000006500000073000000200000007400000068000000 *6500000020000000670000006900000076000000650000006e0000002000000073000000740000 *0072000000690000006e000000670000002e0000000a0301022100000054000000680000006500 *0000200000007000000061000000740000006800000020000000650000006c000000650000006d *000000650000006e000000740000002000000063000000610000006e000000200000006e000000 *6f0000007400000020000000630000006f0000006e0000007400000061000000690000006e0000 *0020010201000000270102010000002f0102010000002701020b0000002e000000200000005300 *0000650000006500000020000000610000006c000000730000006f000000200104010000010302 *020000002e0000000a000000010301010301021000000047000000750000006100000072000000 *6400000020000000610000006700000061000000690000006e0000007300000074000000200000 *006100000020010401000002b40102090000002e00000020000000550000006e0000006c000000 *690000006b00000065000000200104010000010201020500000020000000740000006800000065 *00000020010401000002b4010205000000200000006d00000061000000790000000a0102090000 *0020000000630000006f0000006e0000007400000061000000690000006e000000200102010000 *00270102010000002f010201000000270102360000002e00000020000000490000006600000020 *000000740000006800000065000000200000006700000075000000610000007200000064000000 *2000000073000000750000006300000063000000650000006500000064000000730000002c0000 *0020000000740000006800000065000000200000006d0000006100000074000000630000006800 *0000650000006400000020000000650000006c000000650000006d000000650000006e00000074 *000000730000002000000077000000690000006c0000006c000000200000006200000065000000 *0a022200000020000000700000006f000000700000007000000065000000640000002000000066 *000000720000006f0000006d000000200000007400000068000000650000002000000064000000 *69000000720000006500000063000000740000006f000000720000007900000020000000730000 *007400000061000000630000006b0000002e0000000a0107021600000020000000640000006900 *000072000000730000002000000022000000660000006f0000006f0000002f0000006200000061 *00000072000000220000002000000024000000200000002e0000002e0000002e0000000a030102 *0a00000053000000650000006500000020000000610000006c000000730000006f0000003a0000 *00200104010000010202020000002e0000000a0000000104010302180000004700000075000000 *61000000720000006400000020000000610000006700000061000000690000006e000000730000 *00740000002000000074000000680000006500000020000000680000006f000000730000007400 *00002e0000000a0000000105010302330000004c0000006f0000006f0000006b00000075000000 *700000002000000074000000680000006500000020000000680000006f00000073000000740000 *002000000068000000650000006100000064000000650000007200000020000000610000006e00 *000064000000200000007000000061000000730000007300000020000000690000007400000020 *000000740000006f00000020000000740000006800000065000000200000006800000061000000 *6e000000640000006c00000065000000720000002e0000000a0000000106010301022a00000050 *0000006f0000007000000020000000610000002000000070000000610000007400000068000000 *20000000650000006c000000650000006d000000650000006e0000007400000020000000610000 *006e00000064000000200000007000000061000000720000007300000065000000200000006900 *000074000000200000007500000073000000690000006e00000067000000200000007400000068 *0000006500000020010401000000c901020800000020000000690000006e000000200000007400 *0000680000006500000020010401000000c8020800000020000000630000006c00000061000000 *73000000730000002e0000000a0000000107010302470000004700000072000000610000006200 *000020000000740000006800000065000000200000007200000065000000730000007400000020 *0000006f0000006600000020000000740000006800000065000000200000005500000052000000 *4c000000200000002800000064000000690000007200000073000000200000002b000000200000 *0071000000750000006500000072000000790000002900000020000000610000006e0000006400 *000020000000700000006100000073000000730000006500000073000000200000006900000074 *00000020000000740000006f00000020000000790000006f000000750000007200000020000000 *68000000610000006e000000640000006c00000065000000720000002e0000000a000000010801 *0301022f000000500000006f0000007000000020000000610000006e0000007900000020000000 *7000000061000000740000006800000020000000650000006c000000650000006d000000650000 *006e0000007400000020000000610000006e000000640000002000000069000000670000006e00 *00006f0000007200000065000000200000007700000068000000650000006e0000002000000063 *000000680000006f00000073000000690000006e00000067000000200000006100000020010402 *000000df000000de01020400000020000000740000006f0000000a021500000020000000680000 *00610000006e000000640000006c00000065000000200000007400000068000000650000002000 *0000720000006500000071000000750000006500000073000000740000002e0000000a00000001 *090103010210000000440000006500000070000000720000006500000063000000610000007400 *000065000000640000003a00000020000000750000007300000065000000200104010000010802 *020000002e0000000a000000010a01030102300000004700000075000000610000007200000064 *000000200000007700000068000000690000006300000068000000200000006300000068000000 *65000000630000006b000000730000002000000074000000680000006100000074000000200000 *007400000068000000650000002000000052000000650000007100000075000000650000007300 *0000740000002000000055000000520000004900000020000000650000006e0000006400000073 *00000020000000690000006e00000020010201000000270102010000002f010201000000270102 *030000002e000000200000000a0102230000002000000055000000730000006500000066000000 *750000006c00000020000000660000006f00000072000000200000006400000069000000730000 *0074000000690000006e0000006700000075000000690000007300000068000000690000006e00 *000067000000200000006200000065000000740000007700000065000000650000006e00000020 *01070203000000660000006f0000006f01020500000020000000610000006e0000006400000020 *0107010203000000660000006f0000006f02010000002f02010000000a000000010b0101030102 *1a000000500000006100000072000000730000006500000020000000790000006f000000750000 *007200000020000000720000006500000071000000750000006500000073000000740000002000 *000077000000690000007400000068000000200000006100000020010401000000c70102180000 *002000000028000000610000002000000052000000650000006100000064000000650000007200 *0000540000002c000000200000006200000061000000730000006900000063000000610000006c *0000006c00000079000000290000000a01021e00000020000000460000006f0000007200000020 *0000006500000078000000610000006d000000700000006c000000650000002000000068000000 *650000007200000065000000200000006900000073000000200000006100000020000000730000 *00690000006d000000700000006c00000065000000200107020300000047000000450000005401 *0204000000200000006f000000720000002001070204000000500000004f000000530000005401 *021f000000200000007600000061000000720000006900000061000000620000006c0000006500 *000020000000620000006100000073000000650000006400000020000000610000007500000074 *00000068000000650000006e000000740000006900000063000000610000007400000069000000 *6f0000006e0000000a010225000000200000006700000075000000610000007200000064000000 *2e000000200000002000000049000000740000002000000068000000610000006e000000640000 *006c00000065000000730000002000000074000000680000006500000020000000720000006500 *000071000000750000006500000073000000740000002000000077000000690000007400000068 *0000002001020c0000006500000072000000720000006f0000007200000048000000610000006e *000000640000006c0000006500000072021a000000200000006900000066000000200000006100 *0000750000007400000068000000650000006e0000007400000069000000630000006100000074 *000000690000006f0000006e000000200000006600000061000000690000006c00000073000000 *2e0000000a0701020f000000200000006d00000079000000520000007100000044000000610000 *007400000061000000200000003d00000020000000640000006f0000000a010226000000200000 *0020000000200000002000000020000000750000007300000065000000720000006e0000006100 *00006d00000065000000200000003c0000002d000000200000006c0000006f0000006f0000006b *000000490000006e00000070000000750000007400000020000000220000007500000073000000 *65000000720000006e000000610000006d00000065000000220000000a01022600000020000000 *2000000020000000200000002000000070000000610000007300000073000000770000006f0000 *007200000064000000200000003c0000002d000000200000006c0000006f0000006f0000006b00 *0000490000006e0000007000000075000000740000002000000022000000700000006100000073 *00000073000000770000006f0000007200000064000000220000000a0102210000002000000020 *00000020000000200000002000000072000000650000007400000075000000720000006e000000 *2000000028000000750000007300000065000000720000006e000000610000006d000000650000 *002c0000002000000070000000610000007300000073000000770000006f000000720000006400 *0000290000000a01021d00000020000000630000006800000065000000630000006b0000004100 *0000750000007400000068000000200000006500000072000000720000006f0000007200000048 *000000610000006e000000640000006c0000006500000072000000200000003d00000020000000 *640000006f0000000a01021c000000200000002000000020000000200000002000000064000000 *200000003c0000002d000000200000006700000065000000740000004400000061000000740000 *0061000000200000006d0000007900000052000000710000004400000061000000740000006100 *0000410000000a01020f0000002000000020000000200000002000000020000000630000006100 *000073000000650000002000000064000000200000006f000000660000000a0102210000002000 *000020000000200000002000000020000000200000002000000020000000200000004e0000006f *0000007400000068000000690000006e00000067000000200000002d0000003e00000020000000 *6500000072000000720000006f0000007200000048000000610000006e000000640000006c0000 *0065000000720000000a0102250000002000000020000000200000002000000020000000200000 *002000000020000000200000004a00000075000000730000007400000020000000610000002000 *00007c00000020000000690000007300000056000000610000006c000000690000006400000020 *00000061000000200000002d0000003e000000200000006d0000007a0000006500000072000000 *6f0000000a022c0000002000000020000000200000002000000020000000200000002000000020 *000000200000004a0000007500000073000000740000002000000061000000200000007c000000 *200000006f00000074000000680000006500000072000000770000006900000073000000650000 *00200000002d0000003e000000200000006500000072000000720000006f000000720000004800 *0000610000006e000000640000006c00000065000000720000000a000000010c01010301020e00 *0000410000006e0000002000000076000000610000007200000069000000610000006e00000074 *000000200000006f00000066000000200104010000010c01020b00000020000000740000006800 *00006100000074000000200000007500000073000000650000007300000020010401000000c501 *020f00000020000000740000006f0000002000000063000000680000006f000000730000006500 *000020000000790000006f00000075000000720000000a01020100000020010401000000c70102 *1c00000020000000660000006f0000007200000020000000790000006f000000750000002e0000 *002000000020000000540000006800000065000000200000006500000078000000610000006d00 *0000700000006c000000650000002000000066000000720000006f0000006d0000002001040100 *00010c020a000000200000006200000065000000630000006f0000006d00000065000000730000 *003a0000000a0701021000000020000000200000006d0000007900000052000000710000004400 *0000610000007400000061000000200000003d00000020000000640000006f0000000a01022600 *00002000000020000000200000002000000020000000750000007300000065000000720000006e *000000610000006d00000065000000200000003c0000002d000000200000006c0000006f000000 *6f0000006b000000490000006e0000007000000075000000740000002000000022000000750000 *007300000065000000720000006e000000610000006d00000065000000220000000a0102260000 *002000000020000000200000002000000020000000700000006100000073000000730000007700 *00006f0000007200000064000000200000003c0000002d000000200000006c0000006f0000006f *0000006b000000490000006e000000700000007500000074000000200000002200000070000000 *610000007300000073000000770000006f0000007200000064000000220000000a010221000000 *200000002000000020000000200000002000000072000000650000007400000075000000720000 *006e0000002000000028000000750000007300000065000000720000006e000000610000006d00 *0000650000002c0000002000000070000000610000007300000073000000770000006f00000072 *00000064000000290000000a01022a0000002000000020000000690000006e0000007300000074 *000000610000006e00000063000000650000002000000046000000720000006f0000006d000000 *440000006100000074000000610000002000000028000000530000007400000072000000690000 *006e000000670000002c000000530000007400000072000000690000006e000000670000002900 *00002000000077000000680000006500000072000000650000000a010219000000200000002000 *000020000000200000002000000066000000720000006f0000006d000000440000006100000074 *00000061000000200000003d000000200000006d00000079000000520000007100000044000000 *6100000074000000610000000a01021e0000002000000020000000630000006800000065000000 *630000006b00000041000000750000007400000068000000200000006500000072000000720000 *006f0000007200000048000000610000006e000000640000006c00000065000000720000002000 *00003d00000020000000640000006f0000000a0102130000002000000020000000200000002000 *00002000000064000000200000003c0000002d0000002000000067000000650000007400000044 *000000610000007400000061000000270000000a01020f00000020000000200000002000000020 *00000020000000630000006100000073000000650000002000000064000000200000006f000000 *660000000a01022100000020000000200000002000000020000000200000002000000020000000 *20000000200000004e0000006f0000007400000068000000690000006e00000067000000200000 *002d0000003e000000200000006500000072000000720000006f00000072000000480000006100 *00006e000000640000006c00000065000000720000000a01022500000020000000200000002000 *00002000000020000000200000002000000020000000200000004a000000750000007300000074 *0000002000000061000000200000007c0000002000000069000000730000005600000061000000 *6c00000069000000640000002000000061000000200000002d0000003e000000200000006d0000 *007a00000065000000720000006f0000000a022c00000020000000200000002000000020000000 *20000000200000002000000020000000200000004a000000750000007300000074000000200000 *0061000000200000007c000000200000006f000000740000006800000065000000720000007700 *0000690000007300000065000000200000002d0000003e00000020000000650000007200000072 *0000006f0000007200000048000000610000006e000000640000006c0000006500000072000000 *0a000000010d010302330000005200000065000000740000007200000069000000650000007600 *00006500000020000000640000006100000074000000610000002000000066000000720000006f *0000006d0000002000000074000000680000006500000020000000690000006e00000070000000 *7500000074000000200000007100000075000000650000007200000079000000200000006f0000 *00720000002000000074000000680000006500000020000000630000006f0000006f0000006b00 *00006900000065000000730000002e0000000a000000010e01030104010000010e010209000000 *200000006900000073000000200000006c000000690000006b0000006500000020010401000001 *0d0102140000002c0000002000000062000000750000007400000020000000790000006f000000 *75000000200000007000000061000000730000007300000020000000690000006e000000200000 *006100000020010401000000c7010207000000200000006d0000006f0000006e00000061000000 *640000000a020e00000020000000660000006f0000007200000020000000720000006500000061 *00000064000000690000006e000000670000002e0000000a000000010f0101030104010000010f *01021100000020000000690000007300000020000000660000006f000000720000002000000063 *00000072000000650000006100000074000000690000006e0000006700000020010402000000df *000000de01020e0000007300000020000000740000006800000061000000740000002000000070 *000000720000006f00000078000000790000002e0000000a010213000000200000005400000068 *0000006500000020000000730000006f0000006c00000065000000200000006100000072000000 *67000000750000006d000000650000006e000000740000002001070102070000005b0000005300 *00007400000072000000690000006e0000006702010000005d0102220000002000000069000000 *730000002000000061000000200000006c000000690000007300000074000000200000006f0000 *006600000020000000610000006c0000006c0000006f0000007700000065000000640000002000 *0000640000006f0000006d00000061000000690000006e0000007300000020000000660000006f *000000720000000a0102380000002000000070000000720000006f000000780000007900000069 *0000006e000000670000002e000000200000002000000054000000680000006900000073000000 *200000006d00000061000000740000006300000068000000650000007300000020000000740000 *00680000006500000020000000640000006f0000006d00000061000000690000006e0000002000 *000070000000610000007200000074000000200000006f00000066000000200000007400000068 *000000650000002000000072000000650000007100000075000000650000007300000074000000 *0a022600000020000000610000006e000000640000002000000074000000680000006500000020 *00000077000000690000006c000000640000006300000061000000720000006400000020000000 *2a0000002000000063000000610000006e00000020000000620000006500000020000000750000 *007300000065000000640000002e00000020000000450000002e000000670000002e0000000a01 *08030301020100000020010201000000220102010000002a010201000000220214000000200000 *00740000006f000000200000006d00000061000000740000006300000068000000200000006100 *00006e000000790000007400000068000000690000006e000000670000002e0000000a03010201 *000000200102010000002201020d0000002a0000002e0000006500000078000000610000006d00 *0000700000006c000000650000002e000000630000006f0000006d010201000000220225000000 *20000000740000006f000000200000006d00000061000000740000006300000068000000200000 *00610000006e000000790000007400000068000000690000006e00000067000000200000007500 *00006e000000640000006500000072000000200000006500000078000000610000006d00000070 *0000006c000000650000002e000000630000006f0000006d0000000a0301020100000020010201 *0000002201020b0000006500000078000000610000006d000000700000006c000000650000002e *000000630000006f0000006d01020100000022021b00000020000000740000006f000000200000 *006d00000061000000740000006300000068000000200000006a00000075000000730000007400 *0000200000006500000078000000610000006d000000700000006c000000650000002e00000063 *0000006f0000006d0000000a03010241000000540000004f000000440000004f0000003a000000 *20000000610000006e0000006e0000006f00000079000000690000006e000000670000006c0000 *007900000020000000650000006e0000006f0000007500000067000000680000002c0000002000 *000074000000680000006900000073000000200000006d0000006500000074000000680000006f *00000064000000200000006500000076000000650000006e000000740000007500000061000000 *6c0000006c000000790000002000000063000000610000006c0000006c00000073000000200000 *006500000073000000630000006100000070000000650000002c00000020000000730000006f00 *00000a0102190000002000000020000000610000006e0000007900000020000000680000006500 *0000610000006400000065000000720000007300000020000000790000006f0000007500000020 *00000073000000650000007400000020000000770000006f0000006e0102010000002702300000 *007400000020000000620000006500000020000000750000007300000065000000640000002c00 *000020000000610000006e00000064000000200000007400000068000000650000002000000063 *0000006f0000006d0000007000000075000000740000006100000074000000690000006f000000 *6e00000020000000690000006d0000006d00000065000000640000006900000061000000740000 *006c0000007900000020000000650000006e00000064000000730000002e0000000a00000002b5 *01010301020e00000054000000610000006b000000650000007300000020000000610000002000 *000070000000720000006f000000780000007900000020010402000000580000005701020f0000 *0020000000610000006e0000006400000020000000630000007200000065000000610000007400 *0000650000007300000020000000610000002001040200000068000000630102140000002e0000 *002000000020000000590000006f00000075000000720000002000000062000000610000007300 *000069000000630000002000000070000000720000006f00000078000000790000000a01021600 *0000200000006200000075000000690000006c00000064000000690000006e0000006700000020 *000000620000006c0000006f000000630000006b0000002e000000200000002000000053000000 *650000006500000020010401000000b302020000002e0000000a0301022a000000540000004f00 *0000440000004f0000003a00000020000000740000006800000069000000730000002000000077 *0000006f000000750000006c00000064000000200000006200000065000000200000006d000000 *6f00000072000000650000002000000075000000730000006500000066000000750000006c0000 *002000000069000000660000002000000069000000740000002000000064000000690000006400 *00006e01020100000027010207000000740000002000000063000000610000006c0000006c0000 *0020010401000000ed0102120000002000000028000000650000002e000000670000002e000000 *200000006900000074000000200000006c000000650000007400000020000000790000006f0000 *00750000000a023c000000200000006d0000006f00000064000000690000006600000079000000 *2000000074000000680000006500000020000000720000006500000073000000700000006f0000 *006e00000073000000650000002000000061000000660000007400000065000000720000007700 *0000610000007200000064000000730000002c000000200000006f000000720000002000000073 *000000650000007400000020000000610000006400000064000000690000007400000069000000 *6f0000006e000000610000006c0000002000000068000000650000006100000064000000650000 *007200000073000000290000000a00000001100101030102280000005400000068000000690000 *007300000020000000690000007300000020000000610000002000000072000000650000007600 *0000650000007200000073000000650000002000000070000000720000006f0000007800000079 *00000020000000690000006d000000700000006c000000650000006d000000650000006e000000 *740000006100000074000000690000006f0000006e0000002e0000000a01020500000020000000 *53000000650000006500000020010401000000b402020000002e0000000a0301022a0000005400 *00004f000000440000004f0000003a000000200000007400000068000000690000007300000020 *000000770000006f000000750000006c0000006400000020000000620000006500000020000000 *6d0000006f00000072000000650000002000000075000000730000006500000066000000750000 *006c00000020000000690000006600000020000000690000007400000020000000640000006900 *0000640000006e01020100000027010207000000740000002000000063000000610000006c0000 *006c00000020010401000000ed01020c0000002c000000200000006a0000007500000073000000 *74000000200000006c000000690000006b000000650000000a01020b0000002000000070000000 *720000006f00000078000000790000005300000065000000720000007600000065010201000000 *2702020000002e0000000a03000000000000000003020c00000064000000650000006600000061 *000000750000006c00000074000000480000006f00000073000000740000000a00000000000000 *010302390000006d000000610000007000000020000000740000006f000000200000006c000000 *6f0000006f0000006b00000020000000750000007000000020000000680000006f000000730000 *00740000006e000000610000006d00000065000000200000006d00000061000000700000007000 *0000690000006e00000067000000730000002e0000002000000020000000460000006f00000072 *000000200000007400000068000000650000002000000072000000650000007600000065000000 *7200000073000000650000002000000070000000720000006f00000078000000790000000a0000 *00000000000203023d000000740000006800000065000000200000007200000065000000730000 *00750000006c000000740000002000000069000000730000002000000061000000200000005300 *000065000000720000007600000065000000720000005000000061000000720000007400000054 *00000020000000740000006800000061000000740000002000000077000000690000006c000000 *6c0000002000000072000000650000007600000065000000720000007300000065000000200000 *0070000000720000006f000000780000007900000020000000660000006f000000720000002000 *0000790000006f000000750000002e0000000a0000011101030102240000005200000075000000 *6e00000020000000610000006e00000020000000490000004f0000002000000061000000630000 *0074000000690000006f0000006e00000020000000610000006e000000640000002c0000002000 *000069000000660000002000000069000000740000002000000072000000650000007400000075 *000000720000006e0000007300000020010702040000004a000000750000007300000074022200 *00002c000000200000007000000061000000730000007300000020000000690000007400000020 *000000740000006f00000020000000740000006800000065000000200000007300000065000000 *630000006f0000006e0000006400000020000000610000007200000067000000750000006d0000 *00650000006e000000740000002e0000000a00000001120103023d000000410000002000000076 *000000610000007200000069000000610000006e00000074000000200000006f00000066000000 *200000007200000065000000710000007500000069000000720000006500000020000000740000 *006800000061000000740000002000000063000000610000006e00000020000000720000007500 *00006e00000020000000690000006e00000020000000610000006e00000079000000200000006d *0000006f0000006e00000061000000640000002c000000200000006e0000006f00000074000000 *200000006a00000075000000730000007400000020000000490000004f0000002e0000000a0000 *00011301030102040000005500000073000000650000002001070203000000630000006d000000 *6401021a00000020000000740000006f000000200000007400000072000000610000006e000000 *73000000660000006f000000720000006d00000020000000580000004d0000004c000000200000 *00610000006700000061000000690000006e000000730000007400000020010702070000007800 *0000730000006c000000500000006100000074000000680102020000002e0000000a0102320000 *002000000020000000200000005400000068000000690000007300000020000000660000007500 *00006e0000006300000074000000690000006f0000006e000000200000006f0000006e0000006c *000000790000002000000061000000630000007400000073000000200000006900000066000000 *2000000074000000680000006500000020000000630000006f0000006e00000074000000650000 *006e000000740000002d0000007400000079000000700000006500000020000000690000007300 *000020010701020b0000006100000070000000700000006c000000690000006300000061000000 *74000000690000006f0000006e0102010000002f0203000000780000006d0000006c0202000000 *2e0000000a0300000000000000000301021b00000058000000530000004c000000540000002000 *000070000000720000006500000070000000720000006f00000063000000650000007300000073 *0000006f000000720000002e00000020000000550000007300000075000000610000006c000000 *6c000000790000002001020800000078000000730000006c000000740000007000000072000000 *6f00000063010204000000200000006f0000007200000020010205000000730000006100000078 *0000006f0000006e02020000002e0000000a000000000000000103021900000050000000610000 *00740000006800000020000000740000006f0000002000000078000000730000006c0000007400 *0000200000007300000074000000790000006c0000006500000073000000680000006500000065 *000000740000002e0000000a000000000000000203010209000000410000006600000066000000 *6500000063000000740000006500000064000000200107020b0000005300000065000000720000 *00760000006500000072000000500000006100000072000000740000007302020000002e000000 *0a0000011400000000011501030102110000004400000065000000700000007200000065000000 *63000000610000007400000065000000640000003a000000200000002000000075000000730000 *006500000020010401000000d202020000002e0000000a00000001160103022600000053000000 *650000007400000020000000740000006800000065000000200000007200000065000000740000 *0075000000720000006e00000020000000630000006f0000006400000065000000200000006900 *00006e00000020000000790000006f000000750000007200000020000000720000006500000073 *000000700000006f0000006e00000073000000650000002e0000000a00000001170103022f0000 *004100000064000000640000002000000074000000680000006500000020000000630000006f00 *00006f0000006b0000006900000065000000200000007700000069000000740000006800000020 *000000610000002000000074000000690000006d000000650000006f0000007500000074000000 *20000000740000006f000000200000007400000068000000650000002000000072000000650000 *0073000000700000006f0000006e00000073000000650000002e0000000a000000011801030236 *00000041000000640000006400000020000000740000006800000065000000200000006c000000 *690000007300000074000000200000006f0000006600000020000000630000006f0000006f0000 *006b00000069000000650000002000000074000000690000006d000000650000006f0000007500 *00007400000020000000700000006100000069000000720000007300000020000000740000006f *000000200000007400000068000000650000002000000072000000650000007300000070000000 *6f0000006e00000073000000650000002e0000000a00000001190103021f000000450000007800 *000070000000690000007200000065000000200000007400000068000000650000002000000063 *0000006f0000006f0000006b000000690000006500000020000000690000006d0000006d000000 *6500000064000000690000006100000074000000650000006c000000790000002e0000000a0000 *00011a0103010209000000480000006f0000006e0000006f000000720000002000000061000000 *6e000000200107021100000069000000660000002d0000006d0000006f00000064000000690000 *00660000006900000065000000640000002d00000073000000690000006e000000630000006501 *020d00000020000000680000006500000061000000640000006500000072000000200000006900 *00006e00000020000000610000002001040200000058000000570102020000002e0000000a0102 *080000002000000049000000660000002000000074000000680000006500000020010402000000 *580000005701020e00000020000000690000006e000000630000006c0000007500000064000000 *650000007300000020000000740000006800000065000000200107021100000069000000660000 *002d0000006d0000006f0000006400000069000000660000006900000065000000640000002d00 *000073000000690000006e00000063000000650102100000002000000068000000650000006100 *000064000000650000007200000020000000610000006e00000064000000200000007400000068 *000000650000000a01020100000020010402000000680000006301023800000020000000680000 *006100000073000000200000006e0000006f000000740000002000000062000000650000006500 *00006e000000200000006d0000006f000000640000006900000066000000690000006500000064 *0000002c000000200000007400000068000000650000006e000000200000007200000065000000 *7400000075000000720000006e0000002000000033000000300000003400000020000000280000 *004e0000006f00000074000000200000004d0000006f0000006400000069000000660000006900 *00006500000064000000290000002c0000000a010216000000200000006f000000740000006800 *000065000000720000007700000069000000730000006500000020000000720000006500000074 *00000075000000720000006e000000200000007400000068000000650000002001040200000068 *0000006302020000002e0000000a030000000000000000030102380000006d0000006f00000064 *0000002d00000074000000690000006d0000006500000020000000660000006f00000072000000 *2000000074000000680000006500000020000000520000006500000073000000700000006f0000 *006e000000730000006500000020000000280000004d0000005500000053000000540000002000 *00004e0000004f00000054000000200000006200000065000000200000006c0000006100000074 *0000006500000072000000200000007400000068000000610000006e0000002000000073000000 *650000007200000076000000650000007201020100000027021f00000073000000200000007400 *0000690000006d00000065000000200000006f00000066000000200000006d0000006500000073 *00000073000000610000006700000065000000200000006f000000720000006900000067000000 *690000006e0000006100000074000000690000006f0000006e000000290000000a000000000000 *0001030237000000690000006e000000630000006f0000006d000000690000006e000000670000 *002000000072000000650000007100000075000000650000007300000074000000200000002800 *00007500000073000000650000006400000020000000740000006f000000200000006300000068 *00000065000000630000006b00000020000000660000006f000000720000002000000069000000 *660000002d0000006d0000006f0000006400000069000000660000006900000065000000640000 *002d00000073000000690000006e0000006300000065000000290000000a000000000000000203 *022c000000520000006500000073000000700000006f0000006e00000073000000650000002000 *0000740000006f0000002000000073000000650000006e00000064000000200000006900000066 *000000200000007400000068000000650000007200000065000000200000006100000072000000 *65000000200000006d0000006f0000006400000069000000660000006900000063000000610000 *0074000000690000006f0000006e000000730000000a000002b601030102080000005300000061 *0000006d0000006500000020000000610000007300000020010701040100000116021500000020 *000000730000007400000061000000740000007500000073000000200000003e0000003e000000 *2000000072000000650000007400000075000000720000006e0000002000000076000000610000 *006c02020000002e0000000a000000011b010301020d0000005200000065000000730000007000 *00006f0000006e0000006400000020000000770000006900000074000000680000002001070206 *000000320000003000000030000000200000004f0000004b02020000002e0000000a000000011c *010301020d000000520000006500000073000000700000006f0000006e00000064000000200000 *007700000069000000740000006800000020010702180000003500000030000000300000002000 *0000490000006e000000740000006500000072000000610000006c000000200000005300000065 *00000072000000760000006500000072000000200000004500000072000000720000006f000000 *7202020000002e0000000a000000011d010301020e000000520000006500000073000000700000 *006f0000006e000000640000007300000020000000770000006900000074000000680000002001 *07020f000000350000003000000032000000200000004200000061000000640000002000000047 *00000061000000740000006500000077000000610000007902020000002e0000000a000000011e *010301020d000000520000006500000073000000700000006f0000006e00000064000000200000 *0077000000690000007400000068000000200107020f0000003400000030000000300000002000 *000042000000610000006400000020000000520000006500000071000000750000006500000073 *0000007402020000002e0000000a000000011f010301020d000000520000006500000073000000 *700000006f0000006e000000640000002000000077000000690000007400000068000000200107 *021000000034000000300000003100000020000000550000006e00000061000000750000007400 *0000680000006f00000072000000690000007a000000650000006402020000002e0000000a0000 *000120010301020d000000520000006500000073000000700000006f0000006e00000064000000 *2000000077000000690000007400000068000000200107020d0000003400000030000000330000 *0020000000460000006f0000007200000062000000690000006400000064000000650000006e02 *020000002e0000000a0000000121010301020d000000520000006500000073000000700000006f *0000006e000000640000002000000077000000690000007400000068000000200107020d000000 *340000003000000034000000200000004e0000006f0000007400000020000000460000006f0000 *00750000006e0000006402020000002e0000000a0000000122010301020d000000520000006500 *000073000000700000006f0000006e000000640000002000000077000000690000007400000068 *000000200107020d00000033000000300000003300000020000000530000006500000065000000 *200000004f0000007400000068000000650000007202020000002e0000000a0000000123010301 *020d000000520000006500000073000000700000006f0000006e00000064000000200000007700 *000069000000740000006800000020010702090000003300000030000000320000002000000046 *0000006f000000750000006e0000006402020000002e0000000a0000000124010301020d000000 *520000006500000073000000700000006f0000006e000000640000002000000077000000690000 *0074000000680000002001070215000000330000003000000031000000200000004d0000006f00 *0000760000006500000064000000200000005000000065000000720000006d000000610000006e *000000650000006e000000740000006c0000007902020000002e0000000a000000012501030102 *0d000000520000006500000073000000700000006f0000006e0000006400000020000000770000 *006900000074000000680000002001070216000000330000003000000037000000200000005400 *0000650000006d000000700000006f000000720000006100000072000000790000002000000052 *0000006500000064000000690000007200000065000000630000007402020000002e0000000a00 *000001260103010210000000440000006500000070000000720000006500000063000000610000 *007400000065000000640000003a00000020000000750000007300000065000000200104010000 *02b302020000002e0000000a000000012701030102210000005700000068000000610000007400 *000020000000690000007300000020000000740000006800000069000000730000002000000066 *0000006f000000720000002c000000200000006500000078000000610000006300000074000000 *6c000000790000003f00000020000000200000004900000020000000640000006f0000006e0102 *01000000270102110000007400000020000000750000006e000000640000006500000072000000 *7300000074000000610000006e0000006400000020000000770000006800000079000000200107 *020600000053000000680000006f00000077000000200000006101021800000020000000690000 *0073000000200000006500000076000000650000006e00000020000000690000006e0000002000 *000074000000680000006500000020000000630000006f0000006e000000740000006500000078 *000000740000000a02240000002000000054000000680000006900000073000000200000006100 *000070000000700000006500000061000000720000007300000020000000740000006f00000020 *000000640000006f000000200000006e0000006f0000007400000068000000690000006e000000 *6700000020000000610000007400000020000000610000006c0000006c0000002e0000000a0000 *00012801030102140000004100000020000000630000006f0000006e0000007300000074000000 *720000007500000063000000740000006f0000007200000020000000660000006f000000720000 *00200000006100000020010402000000df000000de01020d000000200000007700000068000000 *650000006e00000020000000790000006f0000007500000020000000640000006f0000006e0102 *0100000027021a0000007400000020000000630000006100000072000000650000002000000061 *000000620000006f00000075000000740000002000000074000000680000006500000020000000 *720000006500000071000000750000006500000073000000740000002e0000000a000000012901 *03021b000000410000006700000061000000690000006e0000002c000000200000007700000068 *000000790000002000000069000000730000002000000074000000680000006900000073000000 *2000000075000000730000006500000066000000750000006c0000003f0000000a000000012a01 *03022a000000410000002000000073000000690000006d000000700000006c0000006500000020 *000000480000005400000054000000500000002000000062000000610000007300000069000000 *630000002000000061000000750000007400000068000000650000006e00000074000000690000 *00630000006100000074000000690000006f0000006e0000002000000067000000750000006100 *000072000000640000002e0000000a03000000000000000003020f000000740000006800000065 *000000200000007200000065000000610000006c0000006d000000200000006e00000061000000 *6d000000650000000a000000000000000103021a00000074000000680000006500000020000000 *750000007300000065000000720000006e000000610000006d0000006500000020000000700000 *00610000007300000073000000770000006f0000007200000064000000200000006d0000006100 *0000700000000a0000000000000002030212000000740000006800000065000000200000007000 *000061000000720000007400000020000000740000006f00000020000000670000007500000061 *00000072000000640000000a0000012b0103010212000000550000007300000065000000660000 *00750000006c00000020000000690000006e000000730000006900000064000000650000002000 *000074000000680000006500000020010401000000c7010228000000200000006d0000006f0000 *006e00000061000000640000002e00000020000000200000004700000065000000740000007300 *000020000000740000006800000065000000200000006e000000610000006d0000006500000064 *00000020000000690000006e000000700000007500000074000000200000007000000061000000 *72000000610000006d000000650000007400000065000000720000000a01021000000020000000 *280000006500000069000000740000006800000065000000720000002000000066000000720000 *006f0000006d00000020000000610000002001070204000000500000004f000000530000005401 *0206000000200000006f0000007200000020000000610000002001070203000000470000004500 *000054020b00000020000000720000006500000071000000750000006500000073000000740000 *00290000002e0000000a000000012c010301022300000047000000650000007400000020000000 *740000006800000065000000200000006e000000610000006d0000006500000064000000200000 *00690000006e000000700000007500000074000000200000007000000061000000720000006100 *00006d000000650000007400000065000000720000002000000061000000730000002000000061 *000000200104010000024602020000002e0000000a000000012d01030102190000004700000065 *0000007400000020000000740000006800000065000000200000006e000000610000006d000000 *650000006400000020000000690000006e00000070000000750000007400000020000000610000 *00730000002000000061000000200104010000029302020000002e0000000a000000012e010301 *021600000047000000650000007400000020000000740000006800000065000000200000006e00 *0000610000006d000000650000006400000020000000630000006f0000006f0000006b00000069 *000000650000002e0000000a022600000020000000540000006800000065000000200000006300 *00006f0000006f0000006b0000006900000065000000200000006e000000610000006d00000065 *000000200000006900000073000000200000006300000061000000730000006500000020000000 *690000006e00000073000000650000006e00000073000000690000007400000069000000760000 *00650000002e0000000a000000012f010301021a00000047000000650000007400000020000000 *740000006800000065000000200000006e000000610000006d0000006500000064000000200000 *00630000006f0000006f0000006b00000069000000650000002000000061000000730000002000 *000061000000200104010000029302020000002e0000000a000000013001030102260000004700 *0000650000007400000020000000740000006800000065000000200000006e000000610000006d *000000650000006400000020000000630000006f0000006f0000006b0000006900000065000000 *200000006100000073000000200000007400000068000000650000002000000072000000650000 *007100000075000000650000007300000074000000650000006400000020010401000002670207 *00000020000000740000007900000070000000650000002e0000000a0000000131010301020500 *00004c000000690000006b00000065000000200104010000012d0102060000002c000000200000 *006200000075000000740000002001040100000267020b0000007300000020000000660000006f *0000007200000020000000790000006f000000750000002e0000000a0000000132010301023300 *000047000000650000007400000020000000610000006c0000006c000000200000007400000068 *0000006500000020000000690000006e0000007000000075000000740000002000000070000000 *6100000072000000610000006d0000006500000074000000650000007200000073000000200000 *00610000006e0000006400000020000000630000006f0000006e00000076000000650000007200 *000074000000200000007400000068000000650000006d00000020000000740000006f00000020 *00000061000000200104010000029302020000002e0000000a0000000133010103010205000000 *5400000068000000690000007300000020010401000000e101021d000000200000006d0000006f *00000064000000690000006600000069000000650000007200000020000000650000006e000000 *61000000620000006c000000650000007300000020000000740000006800000065000000200000 *00750000007300000065000000200000006f0000006600000020010401000002ac010205000000 *20000000610000006e0000006400000020010401000002ad01020c00000020000000690000006e *00000073000000690000006400000065000000200000007400000068000000650000000a010203 *000000200000002000000020010402000000ce000000cd01021800000020000000610000006300 *000074000000690000006f0000006e000000730000002c00000020000000620000007900000020 *000000610000006400000064000000690000006e00000067000000200000007400000068000000 *6500000020010402000002aa000002ab0221000000200000006d0000006f0000006e0000006100 *000064000000200000007400000072000000610000006e00000073000000660000006f00000072 *0000006d000000650000007200000020000000740000006f000000200000007400000068000000 *6500000020000000730000007400000061000000630000006b0000002e0000000a0301022d0000 *00590000006f000000750000002000000063000000610000006e00000020000000770000007200 *000061000000700000002000000074000000680000006500000020000000630000006f0000006d *000000700000006c00000065000000740000006500000020000000730000006500000063000000 *6f0000006e0000006400000020000000610000007200000067000000750000006d000000650000 *006e0000007400000020000000740000006f00000020010401000000f002130000002000000069 *0000006e0000002000000074000000680000006900000073000000200000006600000075000000 *6e0000006300000074000000690000006f0000006e0000002e0000000a00000001340101030102 *29000000410000006e000000200000006500000078000000610000006d000000700000006c0000 *0065000000200000006500000072000000720000006f0000007200000020000000480000006100 *00006e000000640000006c000000650000007200000020000000740000006f0000002000000062 *000000650000002000000075000000730000006500000064000000200000007700000069000000 *74000000680000002001020e0000007300000070000000550000006e0000005700000072000000 *61000000700000004500000072000000720000006f00000072000000540102140000002c000000 *200000007700000068000000690000006300000068000000200000007200000065000000740000 *0075000000720000006e00000073000000200000007400000068000000650000000a0239000000 *2000000020000000200000006500000072000000720000006f00000072000000200000006d0000 *006500000073000000730000006100000067000000650000002000000061000000730000002000 *00006100000020000000700000006c00000061000000690000006e000000200000007400000065 *0000007800000074000000200000006d0000006500000073000000730000006100000067000000 *6500000020000000740000006f0000002000000074000000680000006500000020000000620000 *00720000006f000000770000007300000065000000720000002e0000000a0301024b0000004100 *00006e0000006f0000007400000068000000650000007200000020000000700000006f00000073 *000000730000006900000062000000690000006c00000069000000740000007900000020000000 *690000007300000020000000740000006f0000002000000073000000740000006f000000720000 *006500000020000000740000006800000065000000200000006500000072000000720000006f00 *000072000000200000006d0000006500000073000000730000006100000067000000650000002c *00000020000000650000002e000000670000002e00000020000000610000007300000020000000 *6100000020000000460000006c0000006100000073000000680000004d00000073000000670000 *002c00000020000000610000006e000000640000000a0225000000200000002000000020000000 *7400000068000000650000006e0000002000000072000000650000006400000069000000720000 *006500000063000000740000002000000074000000680000006500000020000000750000007300 *0000650000007200000020000000730000006f0000006d00000065000000770000006800000065 *00000072000000650000002e0000000a0000000135010103010217000000540000006800000069 *00000073000000200000006900000073000000200000006100000020000000660000006f000000 *720000002000000075000000730000006500000020000000770000006900000074000000680000 *0020010212000000270000006d0000006100000070000000530000006500000072000000760000 *00650000007200000050000000610000007200000074000000540000005c000000270000002701 *021300000020000000490000007400000020000000690000007400000020000000750000006e00 *00007700000072000000610000007000000073000000200000007400000068000000650000000a *01021d00000020000000690000006e000000740000006500000072000000690000006f00000072 *000000200000006d0000006f0000006e000000610000006400000020000000660000006f000000 *720000002000000075000000730000006500000020000000770000006900000074000000680000 *0020010401000000f00102110000002e0000002000000020000000490000006600000020000000 *790000006f00000075000000200000006800000061000000760000006500000020000000610000 *000a010201000000200107021a0000005300000065000000720000007600000065000000720000 *005000000061000000720000007400000054000000200000002800000045000000720000007200 *00006f00000072000000540000002000000065000000200000006d000000290000002000000061 *0102260000002c0000002000000074000000680000006900000073000000200000007700000069 *0000006c0000006c00000020000000630000006f0000006e000000760000006500000072000000 *740000002000000074000000680000006100000074000000200000006d0000006f0000006e0000 *00610000006400000020000000690000006e000000740000006f00000020000000610000000a01 *0201000000200107020f0000005300000065000000720000007600000065000000720000005000 *000061000000720000007400000054000000200000006d000000200000006101020d0000002e00 *000020000000200000005500000073000000650000006400000020000000770000006900000074 *0000006800000020010212000000270000006d0000006100000070000000530000006500000072 *00000076000000650000007200000050000000610000007200000074000000540000005c000000 *270000002701020a00000020000000740000006f00000020000000610000006c0000006c000000 *6f000000770000000a01020100000020010401000002ac01020500000020000000610000006e00 *00006400000020010401000002ad021900000020000000690000006e0000007300000069000000 *640000006500000020000000790000006f0000007500000072000000200000006d0000006f0000 *006e00000061000000640000002e000000200000002000000045000000670000002e0000000a01 *0702610000002000000073000000690000006d000000700000006c000000650000004800000054 *000000540000005000000020000000630000006f0000006e000000660000002000000024000000 *200000006d00000061000000700000005300000065000000720000007600000065000000720000 *005000000061000000720000007400000054000000270000002000000028000000730000007000 *0000550000006e000000570000007200000061000000700000004500000072000000720000006f *0000007200000054000000200000006600000061000000690000006c0000007500000072000000 *650000005000000061000000720000007400000029000000200000002000000024000000200000 *006d00000079000000500000006100000072000000740000002000000060000000630000006100 *00007400000063000000680000004500000072000000720000006f000000720000006000000020 *0000006500000072000000720000006f0000007200000050000000610000007200000074000000 *0a0301020a0000004e0000006f0000007400000065000000200000007400000068000000610000 *0074000000200107020b0000006600000061000000690000006c00000075000000720000006500 *0000500000006100000072000000740102150000002000000077000000690000006c0000006c00 *0000200000006f0000006e0000006c000000790000002000000062000000650000002000000072 *000000750000006e00000020000000690000006600000020010702090000006500000072000000 *720000006f00000072000000500000006100000072000000740102100000002000000074000000 *6800000072000000650000007700000020000000610000006e0000002000000065000000720000 *00720000006f000000720000000a01020c00000020000000730000006f00000020000000690000 *007400000020000000640000006f00000065000000730000006e01020100000027021b00000074 *000000200000006800000061000000760000006500000020000000740000006f00000020000000 *6200000065000000200000007600000065000000720000007900000020000000630000006f0000 *006d000000700000006c00000065000000780000002e0000000a000000013601010301023b0000 *005300000065000000740000002000000074000000680000006500000020000000760000006100 *00006c000000690000006400000061000000740000006f00000072000000200000007700000068 *0000006900000063000000680000002000000073000000680000006f000000750000006c000000 *640000002000000062000000650000002000000075000000730000006500000064000000200000 *00660000006f000000720000002000000074000000680000006900000073000000200000007000 *00006100000072000000740000006900000063000000750000006c000000610000007200000020 *01040200000068000000630102010000000a021d00000020000000770000006800000065000000 *6e0000002000000076000000610000006c00000069000000640000006100000074000000690000 *006f0000006e00000020000000690000007300000020000000650000006e000000610000006200 *00006c00000065000000640000002e0000000a010301024300000043000000610000006c000000 *6c000000690000006e000000670000002000000074000000680000006900000073000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000006400 *00006f0000006500000073000000200000006e0000006f0000007400000020000000650000006e *00000061000000620000006c000000650000002000000076000000610000006c00000069000000 *640000006100000074000000690000006f0000006e0000002e0000002000000054000000680000 *0061000000740000002000000063000000610000006e000000200000006f0000006e0000006c00 *0000790000002000000062000000650000000a01022800000020000000640000006f0000006e00 *00006500000020000000620000007900000020000000650000006e00000061000000620000006c *000000690000006e00000067000000200000007400000068000000650000002000000076000000 *610000006c00000069000000640000006100000074000000690000006f0000006e000000200000 *00690000006e000000200000007400000068000000650000002001040200000086000000850102 *130000002000000074000000680000006100000074000000200000006900000073000000200000 *0070000000610000007300000073000000650000006400000020000000740000006f0000000a01 *020100000020010401000000f002020000002e0000000a010301023e000000590000006f000000 *7500000020000000640000006f000000200000006e0000006f00000074000000200000006e0000 *0065000000650000006400000020000000740000006f0000002000000063000000610000006c00 *00006c00000020000000740000006800000069000000730000002000000066000000750000006e *0000006300000074000000690000006f0000006e00000020000000690000006600000020000000 *7400000068000000650000002000000076000000610000006c0000006900000064000000610000 *00740000006f000000720000002000000073000000650000007400000020000000690000006e00 *00000a010201000000200104020000008600000085021d00000020000000640000006f00000065 *00000073000000200000007700000068000000610000007400000020000000790000006f000000 *750000002000000077000000610000006e0000007400000020000000610000006c000000720000 *00650000006100000064000000790000002e0000000a010301020e000000450000007800000061 *0000006d000000700000006c000000650000003a00000020000000280000007500000073000000 *65000000200104010000013b01022400000020000000690000006e000000730000007400000065 *0000006100000064000000200000006f0000006600000020000000740000006800000065000000 *2000000064000000650000006600000061000000750000006c0000007400000020000000730000 *007500000070000000700000006c00000069000000650000006400000020000000620000007900 *000020010401000001380202000000290000000a01070255000000200000007300000069000000 *6d000000700000006c000000650000004800000054000000540000005000000020000000760000 *00610000006c0000006900000064000000610000007400000065000000430000006f0000006e00 *000066000000200000002e00000020000000610000006e00000079000000520000006500000071 *000000750000006500000073000000740000002000000024000000200000006f0000006b000000 *200000002e0000002000000073000000650000007400000056000000610000006c000000690000 *006400000061000000740000006f00000072000000200000006e0000006f0000006f0000007000 *000056000000610000006c000000690000006400000061000000740000006f0000007200000020 *0000003d0000003c0000003c0000002000000068000000740000006d0000006c00000050000000 *6100000067000000650000000a0301020a00000053000000650000006500000020000000610000 *006c000000730000006f0000003a00000020010401000001380102020000002c00000020010401 *0000013a0102020000002c000000200104010000013b0102020000002c00000020010401000001 *3c02010000000a0000000137010103010216000000530000006500000072000000760000006500 *000072000000500000006100000072000000740000002000000076000000650000007200000073 *000000690000006f0000006e000000200000006f00000066000000200104010000013602020000 *002e0000000a010301021b0000004500000078000000610000006d000000700000006c00000065 *0000003a0000002000000028000000530000006500000074000000200000007600000061000000 *6c000000690000006400000061000000740000006f0000007200000020000000740000006f0000 *00200104010000013b0202000000290000000a07024b0000002000000020000000730000006900 *00006d000000700000006c00000065000000480000005400000054000000500000002000000076 *000000610000006c0000006900000064000000610000007400000065000000430000006f000000 *6e0000006600000020000000240000002000000073000000650000007400000056000000610000 *006c000000690000006400000061000000740000006f0000007200000053000000500000002000 *00006e0000006f0000006f0000007000000056000000610000006c000000690000006400000061 *000000740000006f00000072000000200000002800000064000000690000007200000020000000 *22000000610000006a000000610000007800000022000000200000002e0000002e0000002e0000 *0020000000290000000a0000000138010103010207000000450000007800000074000000650000 *006e00000064000000200104010000008c01022400000020000000620000007900000020000000 *650000006e00000061000000620000006c000000690000006e0000006700000020000000760000 *00610000006c00000069000000640000006100000074000000690000006f0000006e0000002000 *0000610000006e000000640000002000000073000000650000007400000074000000690000006e *000000670000000a010201000000200104010000013a01021e0000002000000061000000730000 *002000000074000000680000006500000020000000640000006500000066000000610000007500 *00006c000000740000002000000076000000610000006c00000069000000640000006100000074 *0000006f0000007200000020000000660000006f00000072000000200107010204000000740000 *006500000078000000740102010000002f020400000068000000740000006d0000006c02020000 *002e0000000a010302090000004500000078000000610000006d000000700000006c0000006500 *00003a0000000a0702340000002000000073000000690000006d000000700000006c0000006500 *0000480000005400000054000000500000002000000076000000610000006c0000006900000064 *000000610000007400000065000000430000006f0000006e00000066000000200000002e000000 *20000000610000006e000000790000005200000065000000710000007500000065000000730000 *00740000002000000024000000200000006f0000006b0000002000000068000000740000006d00 *00006c000000500000006100000067000000650000000a00000001390101030102250000004100 *0000630000007400000075000000610000006c0000006c00000079000000200000007000000065 *00000072000000660000006f000000720000006d00000020000000740000006800000065000000 *2000000076000000610000006c00000069000000640000006100000074000000690000006f0000 *006e000000200000006f0000006e00000020000000610000002001040200000068000000630202 *0000002e0000000a010301022300000052000000750000006e0000002000000074000000680000 *00650000002000000076000000610000006c000000690000006400000061000000740000006f00 *000072000000200000007300000070000000650000006300000069000000660000006900000065 *0000006400000020000000690000006e0000002000000074000000680000006500000020010402 *00000068000000630102150000002e000000200000004900000066000000200000006e0000006f *0000006e000000650000002000000069000000730000002000000070000000720000006f000000 *760000006900000064000000650000000a02230000002000000075000000730000006500000020 *00000074000000680000006500000020000000730000007500000070000000700000006c000000 *6900000065000000640000002000000064000000650000006600000061000000750000006c0000 *007400000020000000690000006e00000073000000740000006500000061000000640000002e00 *00000a0301023d0000004e0000006f00000074000000650000003a000000200000005400000068 *00000069000000730000002000000066000000750000006e000000630000007400000069000000 *6f0000006e0000002000000077000000690000006c0000006c0000002000000072000000750000 *006e0000002000000076000000610000006c000000690000006400000061000000740000006900 *00006f0000006e00000020000000750000006e000000630000006f0000006e0000006400000069 *00000074000000690000006f0000006e000000610000006c0000006c000000790000002e000000 *20000000590000006f000000750000000a01020f0000002000000070000000720000006f000000 *6200000061000000620000006c000000790000002000000077000000610000006e000000740000 *002001040100000136010204000000200000006f00000072000000200104010000013802020000 *002e0000000a000000013a01010301020900000056000000610000006c00000069000000640000 *006100000074000000650000002001070102040000007400000065000000780000007401020100 *00002f020400000068000000740000006d0000006c01020e00000020000000630000006f000000 *6e00000074000000650000006e0000007400000020000000770000006900000074000000680000 *0020010702120000005700000044000000470000002000000048000000540000004d0000004c00 *00002000000056000000610000006c000000690000006400000061000000740000006f00000072 *02020000002e0000000a0103010231000000540000006800000069000000730000002000000066 *000000750000006e0000006300000074000000690000006f0000006e0000002000000065000000 *780000007000000065000000630000007400000073000000200000007400000068000000650000 *002000000065000000780000006500000063000000750000007400000061000000620000006c00 *00006500000020000000740000006f000000200000006200000065000000200000006e00000061 *0000006d0000006500000064000000200107020800000076000000610000006c00000069000000 *640000006100000074000000650102010000000a01021f00000020000000610000006e00000064 *000000200000006900000074000000200000006d00000075000000730000007400000020000000 *620000006500000020000000690000006e00000020000000740000006800000065000000200000 *0064000000650000006600000061000000750000006c0000007400000020010702040000005000 *000041000000540000004802020000002e0000000a0301020a0000005300000065000000650000 *0020000000610000006c000000730000006f0000003a0000002001040100000136010202000000 *2c00000020010401000001380102020000002c000000200104010000013c02020000002e000000 *0a000000013b0101030223000000410000002000000076000000610000006c0000006900000064 *00000061000000740000006f000000720000002000000077000000680000006900000063000000 *6800000020000000610000006c0000007700000061000000790000007300000020000000730000 *00750000006300000063000000650000006500000064000000730000002e0000000a0301024100 *000055000000730000006500000066000000750000006c00000020000000660000006f00000072 *0000002000000073000000650000006c0000006500000063000000740000006900000076000000 *650000006c000000790000002000000064000000690000007300000061000000620000006c0000 *00690000006e000000670000002000000076000000610000006c00000069000000640000006100 *000074000000690000006f0000006e0000002e00000020000000460000006f0000007200000020 *0000006500000078000000610000006d000000700000006c000000650000002c00000020000000 *690000006600000020000000790000006f000000750000000a0102400000002000000061000000 *72000000650000002000000073000000650000006e00000064000000690000006e000000670000 *0020000000640000006f000000770000006e0000002000000048000000540000004d0000004c00 *000020000000660000007200000061000000670000006d000000650000006e0000007400000073 *00000020000000740000006f00000020000000610000006e00000020000000410000004a000000 *4100000058000000200000006100000070000000700000006c0000006900000063000000610000 *0074000000690000006f0000006e00000020000000610000006e00000064000000200000007400 *000068000000650000000a02380000002000000064000000650000006600000061000000750000 *006c000000740000002000000076000000610000006c0000006900000064000000610000007400 *00006f00000072000000200000006f0000006e0000006c0000007900000020000000750000006e *0000006400000065000000720000007300000074000000610000006e0000006400000073000000 *20000000630000006f0000006d000000700000006c000000650000007400000065000000200000 *00640000006f00000063000000750000006d000000650000006e00000074000000730000002e00 *00000a000000013c01010301020d00000056000000610000006c00000069000000640000006100 *000074000000650000002000000074000000680000006500000020010402000000680000006302 *20000000200000007500000073000000690000006e0000006700000020000000610000006e0000 *002000000065000000780000007400000065000000720000006e000000610000006c0000002000 *00006100000070000000700000006c00000069000000630000006100000074000000690000006f *0000006e0000002e0000000a010301024000000049000000660000002000000074000000680000 *00650000002000000065000000780000007400000065000000720000006e000000610000006c00 *0000200000006100000070000000700000006c0000006900000063000000610000007400000069 *0000006f0000006e0000002000000072000000650000007400000075000000720000006e000000 *7300000020000000300000002c00000020000000740000006800000065000000200000006f0000 *00720000006900000067000000690000006e000000610000006c00000020000000720000006500 *000073000000700000006f0000006e00000073000000650000002000000069000000730000000a *0102460000002000000072000000650000007400000075000000720000006e0000006500000064 *00000020000000750000006e0000006d0000006f00000064000000690000006600000069000000 *65000000640000002e000000200000004900000066000000200000007400000068000000650000 *002000000065000000780000007400000065000000720000006e000000610000006c0000002000 *00006100000070000000700000006c00000069000000630000006100000074000000690000006f *0000006e0000002000000072000000650000007400000075000000720000006e00000073000000 *200000006e0000006f0000006e0000002d0000007a00000065000000720000006f0000002c0000 *0020000000610000002001040200000068000000630102010000000a01023d0000002000000063 *0000006f0000006e0000007400000061000000690000006e000000690000006e00000067000000 *20000000740000006800000065000000200000006500000072000000720000006f000000720000 *00200000006d000000650000007300000073000000610000006700000065000000730000002000 *0000610000006e00000064000000200000006f000000720000006900000067000000690000006e *000000610000006c00000020000000720000006500000073000000700000006f0000006e000000 *730000006500000020000000620000006f00000064000000790000002000000069000000730000 *000a02130000002000000072000000650000007400000075000000720000006e00000065000000 *6400000020000000690000006e00000073000000740000006500000061000000640000002e0000 *000a0103010244000000540000006800000069000000730000002000000066000000750000006e *0000006300000074000000690000006f0000006e00000020000000610000006c00000073000000 *6f0000002000000074000000610000006b00000065000000730000002000000061000000200000 *007000000072000000650000006400000069000000630000006100000074000000650000002000 *000066000000690000006c00000074000000650000007200000020000000770000006800000069 *000000630000006800000020000000690000007300000020000000610000007000000070000000 *6c00000069000000650000006400000020000000740000006f0000002000000074000000680000 *00650000000a01024200000020000000630000006f0000006e00000074000000650000006e0000 *00740000002d00000074000000790000007000000065000000200000006f000000660000002000 *000074000000680000006500000020000000720000006500000073000000700000006f0000006e *00000073000000650000002e000000200000005400000068000000650000002000000066000000 *690000006c0000007400000065000000720000002000000077000000690000006c0000006c0000 *00200000006f0000006e0000006c00000079000000200000006200000065000000200000006100 *000070000000700000006c0000006900000065000000640000002000000069000000660000000a *021d00000020000000740000006800000065000000200000007000000072000000650000006400 *000069000000630000006100000074000000650000002000000072000000650000007400000075 *000000720000006e0000007300000020000000740000007200000075000000650000002e000000 *0a01030102450000004e0000004f00000054000000450000003a00000020000000540000006800 *000069000000730000002000000066000000750000006e0000006300000074000000690000006f *0000006e0000002000000072000000650000007100000075000000690000007200000073000000 *650000002000000074000000680000006500000020000000750000007300000065000000200000 *006f00000066000000200000002d00000074000000680000007200000065000000610000006400 *0000650000006400000020000000740000006f0000002000000061000000760000006f00000069 *0000006400000020000000620000006c0000006f000000630000006b000000690000006e000000 *670000002e0000000a023700000020000000480000006f00000077000000650000007600000065 *000000720000002c00000020000000790000006f00000075000000200000007000000072000000 *6f0000006200000061000000620000006c00000079000000200000006e00000065000000650000 *0064000000200000007400000068000000610000007400000020000000660000006f0000007200 *00002000000048000000610000007000000070000000730000007400000061000000630000006b *00000020000000610000006e000000790000007700000061000000790000002e0000000a030102 *0a00000053000000650000006500000020000000610000006c000000730000006f0000003a0000 *00200104010000013a02020000002e0000000a0600000000000000000302130000006e00000061 *0000006d00000065000000200000006f0000006600000020000000650000007800000065000000 *63000000750000007400000061000000620000006c000000650000000a00000000000000010302 *2500000061000000720000006700000075000000650000006d000000650000006e000000740000 *007300000020000000740000006f00000020000000700000006100000073000000730000002000 *0000740000006f0000002000000074000000680000006500000020000000650000007800000065 *00000063000000750000007400000061000000620000006c000000650000000a00000000000000 *020302230000006f0000007000000074000000690000006f0000006e000000610000006c000000 *200000007000000061000000740000006800000020000000740000006f00000020000000770000 *006f000000720000006b000000690000006e000000670000002000000064000000690000007200 *00006500000063000000740000006f00000072000000790000000a000000000000000303022900 *00006f0000007000000074000000690000006f0000006e000000610000006c0000002000000065 *0000006e0000007600000069000000720000006f0000006e0000006d000000650000006e000000 *7400000020000000280000006f0000007400000068000000650000007200000077000000690000 *00730000006500000020000000690000006e000000680000006500000072000000690000007400 *0000290000000a0000000000000004030214000000630000006f0000006e000000740000006500 *00006e000000740000002d00000074000000790000007000000065000000200000006600000069 *0000006c0000007400000065000000720000000a00000000000000050302150000005200000065 *00000073000000700000006f0000006e000000730000006500000020000000740000006f000000 *2000000076000000610000006c00000069000000640000006100000074000000650000000a0000 *02b70000000002b80000000002b90000000002ba0000db00000000000000010000000200000003 *0000000400000045000000460000004700000048000000490000004a0000004b0000004c000000 *4d0000004e0000004f000000500000005100000052000000530000005400000055000000560000 *005700000058000000590000005a0000005b0000005c0000005d0000005e0000005f0000006000 *00006100000062000000630000006400000065000000660000006700000068000000690000006a *0000006b0000006c0000006d0000006e0000006f00000070000000710000007200000073000000 *7400000075000000760000007700000078000000790000007a0000007b0000007c0000007d0000 *007e0000007f000000800000008100000082000000830000008400000085000000860000008700 *0000880000008b0000008c0000008d0000008e0000008f00000090000000910000009200000093 *0000009400000095000000960000009700000098000000990000009a0000009b0000009c000000 *9d0000009e0000009f000000a0000000c1000000c2000000c3000000c4000000c5000000c60000 *00c7000000c8000000c9000000ca000000cb000000cc000000cd000000ce000000cf000000d000 *0000d1000000d2000000d3000000d4000000d5000000d6000000d7000000d8000000d9000000da *000000db000000dc000000dd000000de000000df000000e0000000e1000000e2000000e3000000 *e4000000e5000000e6000000e7000000e8000000e9000000ea000000eb000000ec000000ed0000 *00ee000000ef000000f0000000f1000000f2000000f3000000f4000000f5000000f6000000f700 *0000f8000000f9000000fa000000fb000000fc000000fd000000fe000000ff0000010000000101 *00000102000001030000010400000105000001060000010700000108000001090000010a000001 *0b0000010c0000010d0000010e0000010f00000110000001110000011200000113000001140000 *0115000001160000011700000118000001190000011a0000011b0000011c0000011d0000011e00 *00011f000001200000012100000122000001230000012400000125000001260000012700000128 *000001290000012a0000012b0000012c0000012d0000012e0000012f0000013000000131000001 *32000001330000013400000135000001360000013700000138000001390000013a0000013b0000 *013c7c000000f0000000f1000000f2000000f3000000f4000000f5000000ef000000de000000df *000000e0000000e1000000e3000000e5000000e6000000e400000128000000cd000000ce000000 *cf000000cc000000d7000000e2000000ea000000e9000000e8000000eb000000c8000000c90000 *00c1000000c2000000c3000000c4000000c5000000c6000000db000000dc000000dd000000c700 *0000e7000000f9000000ed000000ee00000126000000d0000000d1000000d2000000d3000000ec *000000d8000000da000000d9000000d4000000d5000000d6000000ca000000cb0000011b000001 *15000000f6000001160000011d0000011c0000011e0000011f0000012000000121000001220000 *01230000012400000125000001170000011800000119000000fa000000fb0000011a000000fc00 *00010200000103000001040000010500000100000000ff000000fd000000fe0000010100000106 *00000108000001090000010a0000010d0000010e0000010b0000010c0000011100000112000001 *2a00000107000000f7000000f80000010f0000011000000127000001290000012b0000012c0000 *012d0000012e0000012f0000013000000131000001320000011300000114000001330000013400 *000135000001360000013700000138000001390000013a0000013b0000013c007c000000c10300 *0000c2000000c3000000c4000000c200000000c300000000c400000000c501000000c6000000c6 *00000000c700000000c801000000c9000000c900000000ca01000000cb000000cb00000000cc00 *000000cd02000000ce000000cf000000ce00000000cf00000000d003000000d1000000d2000000 *d3000000d100000000d200000000d300000000d402000000d5000000d6000000d500000000d600 *000000d700000000d802000000da000000d9000000d900000000da00000000db02000000dc0000 *00dd000000dc00000000dd00000000de02000000df000000e0000000df00000000e000000000e1 *00000000e200000000e300000000e400000000e500000000e600000000e700000000e800000000 *e900000000ea00000000eb00000000ec00000000ed00000000ee00000000ef00000000f0000000 *00f100000000f200000000f300000000f400000000f500000000f600000000f700000000f80000 *0000f900000000fa00000000fb00000000fc00000000fd00000000fe00000000ff000000010000 *000001010000000102000000010300000001040000000105000000010600000001070000000108 *0000000109000000010a000000010b000000010c000000010d000000010e000000010f00000001 *100000000111000000011200000001130000000114000000011500000001160000000117000000 *01180000000119000000011a000000011b000000011c000000011d000000011e000000011f0000 *000120000000012100000001220000000123000000012400000001250000000126000000012700 *000001280000000129000000012a000000012b000000012c000000012d000000012e000000012f *000000013000000001310000000132000000013300000001340000000135000000013600000001 *3700000001380000000139000000013a000000013b000000013c00000000000000000a00000000 *1c0000013d0000000002bb00000000013e00000000013f01030102270000005200000065000000 *61000000640000007900000020000000630000006f0000006c0000006c00000065000000630000 *0074000000690000006f0000006e000000200000006f0000006600000020000000630000006f00 *00006d0000006d0000006f0000006e000000200000006d000000690000006d0000006500000020 *00000074000000790000007000000065000000730000002e0000000a0102490000002000000045 *000000780000006300000065000000700000007400000020000000660000006f00000072000000 *200000007400000068000000650000002000000066000000690000007200000073000000740000 *002000000074000000770000006f00000020000000650000006e00000074000000720000006900 *000065000000730000002c00000020000000740000006800000065000000200000006d00000061 *0000007000000070000000690000006e000000670000007300000020000000630000006f000000 *6d000000650000002000000066000000720000006f0000006d00000020000000610000006e0000 *00200000005500000062000000750000006e000000740000007500000020000000380000002e00 *00003000000034000000200106020300000065000000740000006302110000006d000000690000 *006d000000650000002e0000007400000079000000700000006500000073000000200000006600 *0000690000006c000000650000002e0000000a0000000140000000000141000000000142000000 *0001430000000002bc0000000002bd010301020b00000053000000690000006d00000069000000 *6c000000610000007200000020000000740000006f00000020010401000002be02330000002000 *000062000000750000007400000020000000640000006f0000006500000073000000200000006e *0000006f0000007400000020000000690000006e000000630000006c0000007500000064000000 *650000002000000074000000680000006500000020000000650000007800000074000000650000 *006e00000073000000690000006f0000006e000000200000007300000065000000700000006100 *00007200000061000000740000006f000000720000002000000063000000680000006100000072 *0000000a0000000144010301021b00000050000000720000006500000076000000650000006e00 *000074000000730000002000000066000000690000006c0000006500000073000000200000006f *000000660000002000000074000000680000006500000020000000660000006f00000072000000 *6d00000020010206000000270000002e000000660000006f0000006f0000002701020400000020 *0000006f000000720000002001020a000000270000006200000061000000720000002f0000002e *000000660000006f0000006f0000002702130000002000000066000000720000006f0000006d00 *0000200000006200000065000000690000006e0000006700000020000000730000006500000072 *0000007600000065000000640000000a0000000145010301024a00000052000000650000007400 *000075000000720000006e00000073000000200000005400000072000000750000006500000020 *000000690000006600000020000000740000006800000065000000200000006700000069000000 *76000000650000006e00000020000000530000007400000072000000690000006e000000670000 *002000000065000000690000007400000068000000650000007200000020000000730000007400 *000061000000720000007400000073000000200000007700000069000000740000006800000020 *00000061000000200000002e000000200000006f00000072000000200000006900000073000000 *200000006f000000660000002000000074000000680000006500000020000000660000006f0000 *00720000006d0000000a01020100000020010508000000660000006f0000006f0000002f000000 *2e00000062000000610000007202350000002c00000020000000650000002e000000670000002e *000000200000007400000068000000650000002000000074000000790000007000000069000000 *63000000610000006c000000200000002a0000006e000000690000007800000020000000630000 *006f0000006e00000076000000650000006e00000074000000690000006f0000006e0000002000 *0000660000006f000000720000002000000068000000690000006400000064000000650000006e *0000002000000066000000690000006c00000065000000730000002e0000000a00000001460103 *022e0000005500000073000000650000002000000073000000650000006e000000640000004600 *0000690000006c0000006500000020000000740000006f0000002000000073000000650000006e *000000640000002000000074000000680000006500000020000000630000006f0000006e000000 *74000000650000006e0000007400000073000000200000006f0000006600000020000000610000 *002000000048000000610000006e000000640000006c000000650000000a050000000000000000 *030214000000630000006f0000006e00000074000000650000006e000000740000002d00000074 *00000079000000700000006500000020000000730000007400000072000000690000006e000000 *670000000a000000000000000103021e00000066000000690000006c0000006500000020000000 *7000000061000000740000006800000020000000660000006f0000007200000020000000630000 *006f0000006e00000074000000650000006e0000007400000020000000740000006f0000002000 *000073000000650000006e000000640000000a0000000000000002030102360000006d0000006f *000000640000002d00000074000000690000006d0000006500000020000000660000006f000000 *72000000200000007400000068000000650000002000000068000000610000006e000000640000 *006c0000006500000020000000280000004d000000550000005300000054000000200000004e00 *00004f00000054000000200000006200000065000000200000006c000000610000007400000065 *00000072000000200000007400000068000000610000006e000000200000007300000065000000 *7200000076000000650000007201020100000027025e0000007300000020000000740000006900 *00006d00000065000000200000006f00000066000000200000006d000000650000007300000073 *000000610000006700000065000000200000006f00000072000000690000006700000069000000 *6e0000006100000074000000690000006f0000006e000000290000002c00000020000000690000 *006e000000630000006f0000006d000000690000006e0000006700000020000000720000006500 *000071000000750000006500000073000000740000002000000028000000750000007300000065 *0000006400000020000000740000006f0000002000000063000000680000006500000063000000 *6b00000020000000660000006f000000720000002000000069000000660000002d0000006d0000 *006f0000006400000069000000660000006900000065000000640000002d000000730000006900 *00006e000000630000006500000020000000680000006500000061000000640000006500000072 *000000290000000a00000000000000030302130000006f00000066000000660000007300000065 *0000007400000020000000690000006e000000740000006f000000200000004800000061000000 *6e000000640000006c000000650000000a00000000000000040302180000006e00000075000000 *6d000000620000006500000072000000200000006f000000660000002000000062000000790000 *0074000000650000007300000020000000740000006f0000002000000073000000650000006e00 *0000640000000a000001470103022700000053000000650000006e000000640000002000000074 *000000680000006500000020000000630000006f0000006e00000074000000650000006e000000 *7400000073000000200000006f000000660000002000000061000000200000004c000000610000 *007a00000079000000200000004200000079000000740000006500000053000000740000007200 *0000690000006e000000670000000a0500000000000000000301021a000000630000006f000000 *6e00000074000000650000006e000000740000002d000000740000007900000070000000650000 *0020000000730000007400000072000000690000006e0000006700000020000000280000006500 *00002e000000670000002e00000020010701020100000022010204000000740000006500000078 *000000740102010000002f010214000000700000006c00000061000000690000006e0000003b00 *000020000000630000006800000061000000720000007300000065000000740000003d00000075 *00000074000000660000002d000000380201000000220202000000290000000a00000000000000 *010302200000006c000000610000007a0000007900000020000000620000007900000074000000 *65000000730000007400000072000000690000006e0000006700000020000000630000006f0000 *006e00000074000000650000006e0000007400000020000000740000006f000000200000007300 *0000650000006e000000640000000a000000000000000203025b0000006d0000006f0000006400 *00002d00000074000000690000006d0000006500000020000000660000006f0000007200000020 *000000740000006800000065000000200000006200000079000000740000006500000073000000 *7400000072000000690000006e000000670000002c00000020000000690000006e000000630000 *006f0000006d000000690000006e00000067000000200000007200000065000000710000007500 *000065000000730000007400000020000000280000007500000073000000650000006400000020 *000000740000006f00000020000000630000006800000065000000630000006b00000020000000 *660000006f000000720000002000000069000000660000002d0000006d0000006f000000640000 *0069000000660000006900000065000000640000002d00000073000000690000006e0000006300 *00006500000020000000680000006500000061000000640000006500000072000000290000000a *000000000000000303021b0000006f000000660000006600000073000000650000007400000020 *000000690000006e000000740000006f0000002000000074000000680000006500000020000000 *62000000790000007400000065000000730000007400000072000000690000006e000000670000 *000a00000000000000040302640000006e000000750000006d0000006200000065000000720000 *00200000006f000000660000002000000062000000790000007400000065000000730000002000 *0000740000006f0000002000000073000000650000006e0000006400000020000000280000006f *0000006600000066000000730000006500000074000000200000002b0000002000000063000000 *6f000000750000006e00000074000000200000006d000000750000007300000074000000200000 *006200000065000000200000006c00000065000000730000007300000020000000740000006800 *0000610000006e000000200000006f000000720000002000000065000000710000007500000061 *0000006c00000020000000740000006f0000002000000074000000680000006500000020000000 *6c000000650000006e000000670000007400000068000000200000006f00000066000000200000 *007400000068000000650000002000000062000000790000007400000065000000730000007400 *000072000000690000006e00000067000000290000000a00000148010302270000005300000065 *0000006e000000640000002000000074000000680000006500000020000000630000006f000000 *6e00000074000000650000006e0000007400000073000000200000006f00000066000000200000 *0061000000200000004c000000610000007a000000790000002000000042000000790000007400 *000065000000530000007400000072000000690000006e000000670000000a0500000000000000 *000301021a000000630000006f0000006e00000074000000650000006e000000740000002d0000 *007400000079000000700000006500000020000000730000007400000072000000690000006e00 *0000670000002000000028000000650000002e000000670000002e000000200107010201000000 *22010204000000740000006500000078000000740102010000002f010214000000700000006c00 *000061000000690000006e0000003b000000200000006300000068000000610000007200000073 *00000065000000740000003d0000007500000074000000660000002d0000003802010000002202 *02000000290000000a00000000000000010302200000006c000000610000007a00000079000000 *2000000062000000790000007400000065000000730000007400000072000000690000006e0000 *006700000020000000630000006f0000006e00000074000000650000006e000000740000002000 *0000740000006f0000002000000073000000650000006e000000640000000a0000000000000002 *03025b0000006d0000006f000000640000002d00000074000000690000006d0000006500000020 *000000660000006f00000072000000200000007400000068000000650000002000000062000000 *790000007400000065000000730000007400000072000000690000006e000000670000002c0000 *0020000000690000006e000000630000006f0000006d000000690000006e000000670000002000 *000072000000650000007100000075000000650000007300000074000000200000002800000075 *00000073000000650000006400000020000000740000006f000000200000006300000068000000 *65000000630000006b00000020000000660000006f000000720000002000000069000000660000 *002d0000006d0000006f0000006400000069000000660000006900000065000000640000002d00 *000073000000690000006e00000063000000650000002000000068000000650000006100000064 *0000006500000072000000290000000a000000000000000303021b0000006f0000006600000066 *00000073000000650000007400000020000000690000006e000000740000006f00000020000000 *740000006800000065000000200000006200000079000000740000006500000073000000740000 *0072000000690000006e000000670000000a00000000000000040302640000006e000000750000 *006d000000620000006500000072000000200000006f0000006600000020000000620000007900 *000074000000650000007300000020000000740000006f0000002000000073000000650000006e *0000006400000020000000280000006f0000006600000066000000730000006500000074000000 *200000002b00000020000000630000006f000000750000006e00000074000000200000006d0000 *00750000007300000074000000200000006200000065000000200000006c000000650000007300 *000073000000200000007400000068000000610000006e000000200000006f0000007200000020 *000000650000007100000075000000610000006c00000020000000740000006f00000020000000 *740000006800000065000000200000006c000000650000006e0000006700000074000000680000 *00200000006f000000660000002000000074000000680000006500000020000000620000007900 *00007400000065000000730000007400000072000000690000006e00000067000000290000000a *00000149010103024600000053000000650000006e000000640000002000000074000000680000 *006500000020000000730000007000000065000000630000006900000066000000690000006500 *0000640000002000000066000000690000006c0000006500000020000000770000006900000074 *000000680000002000000074000000680000006500000020000000730000007000000065000000 *630000006900000066000000690000006500000064000000200000006d000000690000006d0000 *00650000002d000000740000007900000070000000650000002000000075000000730000006900 *00006e000000670000002000000073000000650000006e0000006400000046000000690000006c *0000006500000028000000290000000a010301023d0000004e0000004f00000054000000450000 *003a00000020000000610000007300000073000000750000006d00000065000000730000002000 *000066000000690000006c00000065000000200000006500000078000000690000007300000074 *0000007300000020000000610000006e0000006400000020000000690000007300000020000000 *7200000065000000610000006400000061000000620000006c0000006500000020000000620000 *007900000020000000740000006800000065000000200000007300000065000000720000007600 *000065000000720000002e00000020000000530000006500000065000000200104010000014c02 *020000002e0000000a03022b0000005700000041000000520000004e000000490000004e000000 *470000003a000000200000004e0000006f00000020000000730000006500000063000000750000 *007200000069000000740000007900000020000000630000006800000065000000630000006b00 *000073000000200000006100000072000000650000002000000070000000650000007200000066 *0000006f000000720000006d00000065000000640000002e0000000a0200000000000000000302 *14000000630000006f0000006e00000074000000650000006e000000740000002d000000740000 *0079000000700000006500000020000000730000007400000072000000690000006e0000006700 *00000a000000000000000103021500000070000000610000007400000068000000200000007400 *00006f0000002000000066000000690000006c00000065000000200000006f0000006e00000020 *0000006400000069000000730000006b0000000a0000014a010103024c00000053000000650000 *006e00000064000000200000007400000068000000650000002000000073000000700000006500 *00006300000069000000660000006900000065000000640000002000000066000000690000006c *000000650000002000000077000000690000007400000068000000200000007400000068000000 *650000002000000073000000700000006500000063000000690000006600000069000000650000 *0064000000200000006d000000690000006d000000650000002d00000074000000790000007000 *000065000000200000007500000073000000690000006e00000067000000200000004c00000061 *0000007a0000007900000020000000420000007900000074000000650000005300000074000000 *72000000690000006e00000067000000730000000a010301023d0000004e0000004f0000005400 *0000450000003a00000020000000610000007300000073000000750000006d0000006500000073 *0000002000000066000000690000006c0000006500000020000000650000007800000069000000 *73000000740000007300000020000000610000006e000000640000002000000069000000730000 *00200000007200000065000000610000006400000061000000620000006c000000650000002000 *000062000000790000002000000074000000680000006500000020000000730000006500000072 *0000007600000065000000720000002e0000002000000053000000650000006500000020010401 *0000014c02020000002e0000000a03022b0000005700000041000000520000004e000000490000 *004e000000470000003a000000200000004e0000006f0000002000000073000000650000006300 *000075000000720000006900000074000000790000002000000063000000680000006500000063 *0000006b0000007300000020000000610000007200000065000000200000007000000065000000 *72000000660000006f000000720000006d00000065000000640000002e0000000a020000000000 *000000030214000000630000006f0000006e00000074000000650000006e000000740000002d00 *00007400000079000000700000006500000020000000730000007400000072000000690000006e *000000670000000a00000000000000010302150000007000000061000000740000006800000020 *000000740000006f0000002000000066000000690000006c00000065000000200000006f000000 *6e000000200000006400000069000000730000006b0000000a0000014b010103024c0000005300 *0000650000006e0000006400000020000000740000006800000065000000200000007300000070 *000000650000006300000069000000660000006900000065000000640000002000000066000000 *690000006c00000065000000200000007700000069000000740000006800000020000000740000 *006800000065000000200000007300000070000000650000006300000069000000660000006900 *00006500000064000000200000006d000000690000006d000000650000002d0000007400000079 *0000007000000065000000200000007500000073000000690000006e0000006700000020000000 *4c000000610000007a000000790000002000000042000000790000007400000065000000530000 *007400000072000000690000006e00000067000000730000000a010301023d0000004e0000004f *00000054000000450000003a00000020000000610000007300000073000000750000006d000000 *65000000730000002000000066000000690000006c000000650000002000000065000000780000 *006900000073000000740000007300000020000000610000006e00000064000000200000006900 *000073000000200000007200000065000000610000006400000061000000620000006c00000065 *000000200000006200000079000000200000007400000068000000650000002000000073000000 *65000000720000007600000065000000720000002e000000200000005300000065000000650000 *00200104010000014c02020000002e0000000a03022b0000005700000041000000520000004e00 *0000490000004e000000470000003a000000200000004e0000006f000000200000007300000065 *000000630000007500000072000000690000007400000079000000200000006300000068000000 *65000000630000006b000000730000002000000061000000720000006500000020000000700000 *006500000072000000660000006f000000720000006d00000065000000640000002e0000000a02 *0000000000000000030214000000630000006f0000006e00000074000000650000006e00000074 *0000002d0000007400000079000000700000006500000020000000730000007400000072000000 *690000006e000000670000000a0000000000000001030215000000700000006100000074000000 *6800000020000000740000006f0000002000000066000000690000006c00000065000000200000 *006f0000006e000000200000006400000069000000730000006b0000000a0000014c0101030220 *000000530000006500000072000000760000006500000020000000610000002000000073000000 *690000006e000000670000006c000000650000002c000000200000007300000070000000650000 *006300000069000000660000006900000065000000640000002000000066000000690000006c00 *0000650000002e0000000a0103020b0000006500000078000000610000006d000000700000006c *0000006500000020000000310000003a0000000a01030236000000530000006500000072000000 *7600000065000000200000007500000073000000690000006e0000006700000020000000730000 *00650000006e0000006400000066000000690000006c0000006500000028000000290000002000 *0000610000006e0000006400000020000000740000006800000065000000200000007300000070 *000000650000006300000069000000660000006900000065000000640000002000000063000000 *6f0000006e00000074000000650000006e000000740000002d0000007400000079000000700000 *00650000000a010702540000002000000073000000650000007200000076000000650000004600 *0000690000006c000000650000005500000073000000690000006e000000670000002000000066 *000000690000006c00000065000000500000006100000074000000680000005300000065000000 *6e0000006400000046000000690000006c00000065000000200000002800000061000000730000 *00430000006f0000006e00000074000000650000006e0000007400000054000000790000007000 *0000650000002000000022000000690000006d0000006100000067000000650000002f0000006a *000000700000006500000067000000220000002900000020000000220000002f00000073000000 *72000000760000002f000000640000006100000074000000610000002f000000690000006d0000 *006100000067000000650000002e0000006a0000007000000067000000220000000a0103020b00 *00006500000078000000610000006d000000700000006c0000006500000020000000320000003a *0000000a0103025000000053000000650000007200000076000000650000002000000075000000 *73000000690000006e000000670000002000000061000000200000006c000000610000007a0000 *007900000020000000420000007900000074000000650000005300000074000000720000006900 *00006e0000006700000020000000610000006e0000006400000020000000740000006800000065 *000000200000006700000075000000650000007300000073000000200000007400000068000000 *6500000020000000630000006f0000006e00000074000000650000006e000000740000002d0000 *00740000007900000070000000650000002000000066000000720000006f0000006d0000002000 *000074000000680000006500000020000000650000007800000074000000650000006e00000073 *000000690000006f0000006e0000000a0107025100000020000000730000006500000072000000 *760000006500000046000000690000006c000000650000005500000073000000690000006e0000 *00670000002000000066000000690000006c000000650000005000000061000000740000006800 *00004c000000610000007a00000079000000200000002800000067000000750000006500000073 *00000073000000430000006f0000006e00000074000000650000006e0000007400000054000000 *7900000070000000650000004d000000200000006d000000690000006d00000065000000540000 *00790000007000000065000000730000002900000020000000220000002f000000730000007200 *0000760000002f000000640000006100000074000000610000002f000000690000006d00000061 *00000067000000650000002e0000006a0000007000000067000000220000000a03022b00000057 *00000041000000520000004e000000490000004e000000470000003a000000200000004e000000 *6f0000002000000073000000650000006300000075000000720000006900000074000000790000 *0020000000630000006800000065000000630000006b0000007300000020000000610000007200 *00006500000020000000700000006500000072000000660000006f000000720000006d00000065 *000000640000002e0000000a0300000000000000000301020a0000007400000079000000700000 *006900000063000000610000006c0000006c000000790000002001040100000149010202000000 *2c000000200104010000014a0102050000002c000000200000006f000000720000002001040100 *00014b02010000000a00000000000000010301023900000066000000750000006e000000630000 *0074000000690000006f0000006e00000020000000660000006f00000072000000200000006400 *0000650000007400000065000000720000006d000000690000006e000000690000006e00000067 *00000020000000630000006f0000006e00000074000000650000006e000000740000002d000000 *74000000790000007000000065000000200000006f000000660000002000000066000000690000 *006c000000650000002e0000002000000054000000790000007000000069000000630000006100 *00006c0000006c000000790000002001040100000142010204000000200000006f000000720000 *00200104010000014102010000000a000000000000000203021a00000070000000610000007400 *00006800000020000000740000006f000000200000007400000068000000650000002000000066 *000000690000006c0000006500000020000000740000006f000000200000007300000065000000 *7200000076000000650000000a0000014d010301020a000000410000006c000000690000006100 *00007300000020000000660000006f00000072000000200104010000014c010201000000200104 *010000014902010000000a000000014e010103024e000000530000006500000072000000760000 *00650000002000000066000000690000006c000000650000007300000020000000660000007200 *00006f0000006d0000002000000061000000200000006400000069000000720000006500000063 *000000740000006f000000720000007900000020000000610000006e0000006400000020000000 *690000007400000073000000200000007300000075000000620000006400000069000000720000 *006500000063000000740000006f00000072000000690000006500000073000000200000002800 *0000700000006100000072000000610000006d0000006500000074000000650000007200000069 *0000007a00000061000000620000006c0000006500000020000000760000006500000072000000 *73000000690000006f0000006e000000290000000a010301023500000050000000610000007200 *0000610000006d00000065000000740000006500000072000000690000007a0000006500000020 *000000740000006800000069000000730000002000000066000000750000006e00000063000000 *74000000690000006f0000006e00000020000000740000006f0000002000000063000000720000 *00650000006100000074000000650000002000000066000000750000006e000000630000007400 *0000690000006f0000006e00000073000000200000006c000000690000006b000000650000002c *000000200104010000014f0102020000002c00000020010401000001500102060000002c000000 *20000000610000006e00000064000000200104010000015102010000000a0103020c0000005900 *00006f0000007500000020000000730000007500000070000000700000006c000000790000003a *0000000a0103010237000000310000002e0000002000000061000000200000006c0000006f0000 *00770000002d0000006c0000006500000076000000650000006c00000020000000660000007500 *00006e0000006300000074000000690000006f0000006e00000020000000770000006800000069 *00000063000000680000002000000074000000610000006b000000650000007300000020000000 *6100000020000000630000006f0000006e00000074000000650000006e000000740000002d0000 *007400000079000000700000006500000020000000610000006e00000064000000200104010000 *02b401021a00000020000000610000006e000000640000002000000067000000650000006e0000 *006500000072000000610000007400000065000000730000002000000061000000200000005200 *00006500000073000000700000006f0000006e00000073000000650000000a01023b0000002000 *000020000000320000002e00000020000000610000002000000066000000750000006e00000063 *00000074000000690000006f0000006e0000002000000077000000680000006900000063000000 *680000002000000064000000650000007400000065000000720000006d000000690000006e0000 *0065000000730000002000000074000000680000006500000020000000630000006f0000006e00 *000074000000650000006e000000740000002d0000007400000079000000700000006500000020 *00000066000000720000006f0000006d0000002000000074000000680000006500000020010401 *000002b40102010000000a022b0000002000000020000000330000002e00000020000000610000 *00200000006c000000690000007300000074000000200000006f00000066000000200000006100 *00006c0000006c0000002000000074000000680000006500000020000000640000006500000066 *00000061000000750000006c0000007400000020000000690000006e0000006400000065000000 *780000002000000066000000690000006c00000065000000730000000a030102410000004e0000 *004f00000054000000450000003a00000020000000750000006e0000006c000000690000006b00 *0000650000002000000066000000690000006c0000006500000053000000650000007200000076 *000000650000002c00000020000000740000006800000065000000720000006500000020000000 *610000007200000065000000200000006e0000006f00000020000000690000006e000000640000 *0065000000780000002000000066000000690000006c0000006500000073000000200000006200 *0000790000002000000064000000650000006600000061000000750000006c000000740000002e *00000020000000530000006500000065000000200104010000014302020000002e0000000a0400 *000000000000000301025500000066000000750000006e0000006300000074000000690000006f *0000006e0000002000000077000000680000006900000063000000680000002000000074000000 *610000006b0000006500000073000000200000006100000020000000630000006f0000006e0000 *0074000000650000006e000000740000002d000000740000007900000070000000650000002000 *0000610000006e000000640000002000000066000000690000006c000000650000007000000061 *000000740000006800000020000000610000006e00000064000000200000006700000065000000 *6e0000006500000072000000610000007400000065000000730000002000000061000000200000 *00720000006500000073000000700000006f0000006e0000007300000065000000200000002800 *00007400000079000000700000006900000063000000610000006c0000006c0000007900000020 *010401000001490102020000002c000000200104010000014a0102050000002c00000020000000 *6f00000072000000200104010000014b0202000000290000000a00000000000000010302320000 *0066000000750000006e0000006300000074000000690000006f0000006e000000200000007700 *000068000000690000006300000068000000200000007200000065000000740000007500000072 *0000006e0000007300000020000000740000006800000065000000200000006d00000069000000 *6d000000650000002d0000007400000079000000700000006500000020000000660000006f0000 *00720000002000000046000000690000006c000000650000005000000061000000740000006800 *00000a000000000000000203023c000000690000006e0000006400000065000000780000002000 *000066000000690000006c00000065000000200000006e000000610000006d0000006500000073 *0000002c00000020000000690000006e0000002000000063000000610000007300000065000000 *200000007400000068000000650000002000000072000000650000007100000075000000650000 *007300000074000000650000006400000020000000700000006100000074000000680000002000 *000069000000730000002000000061000000200000006400000069000000720000006500000063 *000000740000006f00000072000000790000000a00000000000000030301020400000066000000 *690000006c000000650102010000002f0213000000640000006900000072000000650000006300 *0000740000006f000000720000007900000020000000740000006f000000200000007300000065 *0000007200000076000000650000000a0000014f0103027a000000530000006500000072000000 *76000000650000002000000066000000690000006c000000650000007300000020000000660000 *00720000006f0000006d0000002000000061000000200000006400000069000000720000006500 *000063000000740000006f000000720000007900000020000000610000006e0000006400000020 *000000690000007400000073000000200000007300000075000000620000006400000069000000 *720000006500000063000000740000006f00000072000000690000006500000073000000200000 *002800000073000000650000006e0000006400000046000000690000006c000000650000002000 *000076000000650000007200000073000000690000006f0000006e000000290000002e00000020 *00000053000000680000006f000000750000006c00000064000000200000007000000065000000 *72000000660000006f000000720000006d000000200000006d0000007500000063000000680000 *002000000062000000650000007400000074000000650000007200000020000000740000006800 *0000610000006e0000002000000069000000740000007300000020000000700000007200000065 *0000006400000065000000630000006500000073000000730000006f0000007200000073000000 *2e0000000a02000000000000000003023c000000690000006e0000006400000065000000780000 *002000000066000000690000006c00000065000000200000006e000000610000006d0000006500 *0000730000002c00000020000000690000006e0000002000000063000000610000007300000065 *000000200000007400000068000000650000002000000072000000650000007100000075000000 *650000007300000074000000650000006400000020000000700000006100000074000000680000 *002000000069000000730000002000000061000000200000006400000069000000720000006500 *000063000000740000006f00000072000000790000000a00000000000000010301020400000066 *000000690000006c000000650102010000002f0213000000640000006900000072000000650000 *0063000000740000006f000000720000007900000020000000740000006f000000200000007300 *0000650000007200000076000000650000000a00000150010103024f0000005300000065000000 *7200000076000000650000002000000066000000690000006c0000006500000073000000200000 *0066000000720000006f0000006d00000020000000610000002000000064000000690000007200 *00006500000063000000740000006f000000720000007900000020000000610000006e00000064 *000000200000006900000074000000730000002000000073000000750000006200000064000000 *69000000720000006500000063000000740000006f000000720000006900000065000000730000 *0020000000280000006c000000610000007a000000790000002000000042000000790000007400 *000065000000530000007400000072000000690000006e00000067000000200000007600000065 *0000007200000073000000690000006f0000006e000000290000002e0000000a0302170000004d *0000006100000079000000200000006c00000065000000610000006b0000002000000066000000 *690000006c000000650000002000000068000000610000006e000000640000006c000000650000 *00730000002e0000000a02000000000000000003023c000000690000006e000000640000006500 *0000780000002000000066000000690000006c00000065000000200000006e000000610000006d *00000065000000730000002c00000020000000690000006e000000200000006300000061000000 *730000006500000020000000740000006800000065000000200000007200000065000000710000 *007500000065000000730000007400000065000000640000002000000070000000610000007400 *000068000000200000006900000073000000200000006100000020000000640000006900000072 *0000006500000063000000740000006f00000072000000790000000a0000000000000001030102 *0400000066000000690000006c000000650102010000002f021300000064000000690000007200 *00006500000063000000740000006f000000720000007900000020000000740000006f00000020 *00000073000000650000007200000076000000650000000a000001510103025200000053000000 *650000007200000076000000650000002000000066000000690000006c00000065000000730000 *002000000066000000720000006f0000006d000000200000006100000020000000640000006900 *0000720000006500000063000000740000006f000000720000007900000020000000610000006e *000000640000002000000069000000740000007300000020000000730000007500000062000000 *6400000069000000720000006500000063000000740000006f0000007200000069000000650000 *007300000020000000280000007300000074000000720000006900000063000000740000002000 *000042000000790000007400000065000000530000007400000072000000690000006e00000067 *0000002000000076000000650000007200000073000000690000006f0000006e00000029000000 *2e000000200000000a02000000000000000003023b000000690000006e00000064000000650000 *00780000002000000066000000690000006c00000065000000200000006e000000610000006d00 *000065000000730000002c00000020000000690000006e00000020000000630000006100000073 *0000006500000020000000740000006800000065000000200000006e0000006500000078000000 *7400000020000000610000007200000067000000750000006d000000650000006e000000740000 *002000000069000000730000002000000061000000200000006400000069000000720000006500 *000063000000740000006f00000072000000790000000a00000000000000010301020400000066 *000000690000006c000000650102010000002f0213000000640000006900000072000000650000 *0063000000740000006f000000720000007900000020000000740000006f000000200000007300 *0000650000007200000076000000650000000a0000015200000000015300000000015400000000 *01550000190000013d0000013e0000013f00000140000001410000014200000143000001440000 *0145000001460000014700000148000001490000014a0000014b0000014c0000014d0000014e00 *00014f000001500000015100000152000001530000015400000155190000013d0000013f000001 *420000014000000141000001460000014700000148000001490000014a0000014b0000014d0000 *014c0000014e0000014f0000015000000151000001440000014300000152000001550000015300 *0001540000013e0000014500190000013d000000013e000000013f000000014000000001410000 *000142000000014300000001440000000145000000014600000001470000000148000000014900 *0000014a000000014b000000014c000000014d000000014e000000014f00000001500000000151 *000000015200000001530000000154000000015500000000000000000b00000000030000015601 *0301020c000000490000007300000020000000650000007100000075000000610000006c000000 *20000000740000006f0000002001050c0000006800000061000000730000006b00000065000000 *6c0000006c0000002f0000004d00000061000000690000006e02010000000a0000000157010301 *020c000000490000007300000020000000650000007100000075000000610000006c0000002000 *0000740000006f0000002001050a0000007000000075000000620000006c000000690000006300 *00002f0000006c0000006f0000006702010000000a0000000158010301021c000000430000006f *0000006e00000076000000650000006e00000069000000650000006e0000006300000065000000 *2000000066000000750000006e0000006300000074000000690000006f0000006e000000200000 *0061000000720000006f000000750000006e00000064000000200104010000013e010201000000 *0a0102290000002000000077000000690000007400000068000000200000007400000068000000 *650000002000000064000000650000006600000061000000750000006c00000074000000200000 *0062000000690000006e000000610000007200000079000000200000006c0000006f0000006300 *00006100000074000000690000006f0000006e0000002000000073000000650000007400000020 *000000740000006f000000200104010000015601020900000020000000610000006e0000006400 *0000200000007400000068000000650000000a010215000000200000006c0000006f0000006700 *0000200000006c0000006f000000630000006100000074000000690000006f0000006e00000020 *00000073000000650000007400000020000000740000006f000000200104010000015702030000 *002e000000200000000a0003000001560000015700000158030000015600000157000001580003 *000001560000000157000000015800000000000000000c00000000080000015901010301020a00 *000072000000650000006100000064000000730000002000000074000000680000006500000020 *0102010000002201020f0000004100000063000000630000006500000070000000740000002d00 *0000450000006e000000630000006f00000064000000690000006e000000670102010000002201 *021c000000200000006800000065000000610000006400000065000000720000002e0000002000 *0000200000005400000068000000650000006e0000002c00000020000000690000006600000020 *000000700000006f000000730000007300000069000000620000006c000000650000000a01022e *0000002000000077000000690000006c0000006c00000020000000630000006f0000006d000000 *700000007200000065000000730000007300000020000000740000006800000065000000200000 *00720000006500000073000000700000006f0000006e0000007300000065000000200000006200 *00006f00000064000000790000002000000077000000690000007400000068000000200000006d *0000006500000074000000680000006f000000640000007300000020010504000000670000007a *0000006900000070010204000000200000006f0000007200000020010507000000640000006500 *0000660000006c00000061000000740000006502010000000a0302260000005200000065000000 *7400000075000000720000006e0000007300000020000000740000006800000065000000200000 *006e000000610000006d00000065000000200000006f0000006600000020000000740000006800 *00006500000020000000630000006f00000064000000690000006e000000670000002000000063 *000000680000006f00000073000000650000006e0000000a000000015a010301022f0000006300 *00006f0000006d0000007000000072000000650000007300000073000000650000007300000020 *00000074000000680000006500000020000000620000006f000000640000007900000020000000 *6f0000006600000020000000740000006800000065000000200000007200000065000000730000 *00700000006f0000006e0000007300000065000000200000007700000069000000740000006800 *000020000000670000007a00000069000000700000002e0000000a021b00000020000000640000 *006f0000006500000073000000200000006e0000006f0000007400000020000000730000006500 *00007400000020000000610000006e000000790000002000000068000000650000006100000064 *0000006500000072000000730000002e0000000a000000015b010301022d000000630000006f00 *00006d000000700000007200000065000000730000007300000065000000730000002000000074 *000000680000006500000020000000620000006f0000006400000079000000200000006f000000 *660000002000000074000000680000006500000020000000720000006500000073000000700000 *006f0000006e000000730000006500000020000000770000006900000074000000680000002000 *00007a0000006c000000690000006201020100000027010202000000730000000a010210000000 *200000006400000065000000660000006c000000610000007400000065000000200000006d0000 *006500000074000000680000006f000000640000000a021b00000020000000640000006f000000 *6500000073000000200000006e0000006f00000074000000200000007300000065000000740000 *0020000000610000006e0000007900000020000000680000006500000061000000640000006500 *000072000000730000002e0000000a00000002bf01030231000000620000006100000073000000 *6500000064000000200000006f0000006e00000020000000740000006800000065000000200000 *0072000000750000006c0000006500000073000000200000006400000065000000730000006300 *00007200000069000000620000006500000020000000690000006e000000200000007200000066 *000000630000003200000036000000310000003600000020000000730000006500000063000000 *2e0000002000000031000000340000002e000000330000000a00000002c00000000002c1000000 *0002c200000000015c01030236000000750000006e000000730000007500000070000000700000 *006f000000720000007400000065000000640000003a0000002000000020000000610000002000 *000070000000610000007200000073000000650000007200000020000000660000006f00000072 *000000200000007400000068000000650000002000000041000000630000006300000065000000 *70000000740000002d000000450000006e000000630000006f00000064000000690000006e0000 *0067000000200000006800000065000000610000006400000065000000720000000a0004000001 *590000015a0000015b0000015c04000001590000015a0000015b0000015c000400000159000000 *015a000000015b000000015c00000000000000001a0000000000ff000001110000000000000001 *00000002000000030000000400000045000000460000004700000048000000490000004a000000 *4b0000004c0000004d0000004e0000004f00000050000000510000005200000053000000540000 *0055000000560000005700000058000000590000005a0000005b0000005c0000005d0000005e00 *00005f000000600000006100000062000000630000006400000065000000660000006700000068 *000000690000006a0000006b0000006c0000006d0000006e0000006f0000007000000071000000 *72000000730000007400000075000000760000007700000078000000790000007a0000007b0000 *007c0000007d0000007e0000007f00000080000000810000008200000083000000840000008500 *00008600000087000000880000008b0000008c0000008d0000008e0000008f0000009000000091 *00000092000000930000009400000095000000960000009700000098000000990000009a000000 *9b0000009c0000009d0000009e0000009f000000a0000000a1000000a2000000a3000000a40000 *00a5000000a6000000a7000000a8000000a9000000aa000000ab000000b2000000b3000000b400 *0000b5000000b6000000b7000000b8000000b9000000ba000000bb000000bc000000bd000000be *000000bf000000c0000000c1000000c2000000c3000000c4000000c5000000c6000000c7000000 *c8000000c9000000ca000000cb000000cc000000cd000000ce000000cf000000d0000000d10000 *00d2000000d3000000d4000000d5000000d6000000d7000000d8000000d9000000da000000db00 *0000dc000000dd000000de000000df000000e0000000e1000000e2000000e3000000e4000000e5 *000000e6000000e7000000e8000000e9000000ea000000eb000000ec000000ed000000ee000000 *ef000000f0000000f1000000f2000000f3000000f4000000f5000000f6000000f7000000f80000 *00f9000000fa000000fb000000fc000000fd000000fe000000ff00000100000001010000010200 *0001030000010400000105000001060000010700000108000001090000010a0000010b0000010c *0000010d0000010e0000010f000001100000011100000112000001130000011400000115000001 *160000011700000118000001190000011a0000011b0000011c0000011d0000011e0000011f0000 *012000000121000001220000012300000124000001250000012600000127000001280000012900 *00012a0000012b0000012c0000012d0000012e0000012f00000130000001310000013200000133 *0000013400000135000001360000013700000138000001390000013a0000013b0000013c000001 *3d0000013e0000013f000001400000014100000142000001430000014400000145000001460000 *014700000148000001490000014a0000014b0000014c0000014d0000014e0000014f0000015000 *000151000001520000015300000154000001550000015600000157000001580000000000000000 *0002c30000000000000011030000001b0000000000000011010000001b00000000000000110000 *00001c0000000000000011000000001d0000000000000011000000001e00000000000000020300 *00001f0000000000000002010000001f0000000000000002000000002000000000000000020300 *000021000000000000000200000000220000000000000002030000002300000000000000020100 *000023000000000000000203000000240000000000000002030000002500000000000000020100 *000026000000000000000201000000270000000000000002000000002800000000000000020100 *0000290000000000000002030000002a0000000000000002000000002b00000000000000020000 *00002c0000000000000002000000002d0000000000000002000000002e00000000000000020000 *00002f000000000000000200000000300000000000000002000000003100000000000000020000 *000032000000000000000200000000330000000000000002000000003400000000000000020000 *000035000000000000000200000000360000000000000002000000003700000000000000020000 *000038000000000000000200000000390000000000000002000000003a00000000000000020000 *00003b0000000000000002000000003c0000000000000002000000003d00000000000000020000 *00003e0000000000000002000000003f0000000000000002000000004000000000000000020000 *000041000000000000000200000000420000000000000002000000004300000000000000020000 *000044000000000000000200000000450000000000000002000000004600000000000000020000 *000047000000000000000200000000480000000000000002000000004900000000000000030300 *00004a0000000000000003000000004b0000000000000003030000004c00000000000000030000 *00004d0000000000000003030000004e0000000000000003010000004e00000000000000030000 *00004f000000000000000300000000500000000000000003000000005100000000000000030000 *000052000000000000000300000000530000000000000003000000005400000000000000030000 *000055000000000000000300000000560000000000000003000000005700000000000000030000 *000058000000000000000300000000590000000000000003000000005a00000000000000030000 *00005b0000000000000004030000005c0000000000000004010000005c00000000000000040000 *00005d0000000000000004000000005e0000000000000004000000005f00000000000000040000 *000060000000000000000400000000610000000000000004000000006200000000000000040000 *000063000000000000000400000000640000000000000004000000006500000000000000040000 *000066000000000000000400000000670000000000000004000000006800000000000000040000 *0000690000000000000004000000006a0000000000000001030000006b00000000000000010100 *00006c0000000000000001030000006d0000000000000001010000006d00000000000000010000 *00006e0000000000000001000000006f0000000000000001000000007000000000000000010000 *000071000000000000000100000000720000000000000001000000007300000000000000010000 *000074000000000000000100000000750000000000000001000000007600000000000000010000 *000077000000000000000103000000780000000000000001010000007900000000000000010000 *00007a0000000000000001000000007b0000000000000001000000007c00000000000000010100 *0000780000000000000001000000007d0000000000000001000000007e00000000000000010000 *00007f000000000000000100000000800000000000000001000000008100000000000000010300 *000082000000000000000103000000830000000000000001010000008300000000000000010000 *000084000000000000000100000000850000000000000001000000008600000000000000010300 *000087000000000000000101000000870000000000000001000000008800000000000000010300 *0000890000000000000001030000008a0000000000000001010000008a00000000000000010000 *00008b0000000000000001000000008c0000000000000001030000008d00000000000000010100 *00008e0000000000000001010000008f0000000000000001010000009000000000000000010100 *000091000000000000000101000000920000000000000001010000009300000000000000010100 *000094000000000000000101000000950000000000000001030000009600000000000000010100 *000096000000000000000100000000970000000000000001000000009800000000000000010300 *000099000000000000000101000000990000000000000001000000009a00000000000000010000 *00009b0000000000000001000000009c0000000000000001000000009d00000000000000010000 *00009e0000000000000001000000009f000000000000000100000000a000000000000000010000 *0000a1000000000000000100000000a2000000000000000100000000a300000000000000010000 *0000a4000000000000000100000000a5000000000000000100000000a600000000000000010000 *0000a7000000000000000100000000a8000000000000000100000000a900000000000000010000 *0000aa000000000000000100000000ab000000000000000100000000ac00000000000000010000 *0000ad000000000000000100000000ae000000000000000100000000af00000000000000050300 *0000b0000000000000000500000000b1000000000000000500000000b200000000000000050000 *0000b3000000000000000500000000b4000000000000000500000000b500000000000000050000 *0000b6000000000000000500000000b7000000000000000500000000b800000000000000050000 *0000b9000000000000000500000000ba000000000000001800000000bb00000000000000180000 *0000bc000000000000001800000000bd000000000000001900000000be00000000000000190000 *0000bf000000000000001900000000c0000000000000000700000000c100000000000000070000 *0000c2000000000000000700000000c3000000000000000803000000c400000000000000080300 *0000c5000000000000000803000000c6000000000000000800000000c700000000000000080000 *0000c8000000000000000800000000c9000000000000000800000000ca00000000000000080000 *0000cb000000000000000800000000cc000000000000000800000000cd00000000000000080000 *0000ce000000000000000800000000cf000000000000000903000000d000000000000000090000 *0000d1000000000000000900000000d2000000000000000900000000d300000000000000090300 *0000d4000000000000000900000000d5000000000000000903000000d600000000000000090300 *0000d7000000000000000900000000d8000000000000000903000000d900000000000000090000 *0000da000000000000000903000000db000000000000000903000000dc00000000000000090100 *0000dc000000000000000900000000dd000000000000000903000000de00000000000000090000 *0000df000000000000000900000000e0000000000000000900000000e100000000000000090300 *0000e2000000000000000901000000e2000000000000000900000000e300000000000000090300 *0000e4000000000000000903000000e5000000000000000901000000e600000000000000090100 *0000e7000000000000000903000000e8000000000000000900000000e900000000000000090000 *0000ea000000000000000903000000eb000000000000000901000000eb00000000000000090000 *0000ec000000000000000903000000ed000000000000000903000000ee00000000000000090000 *0000ef000000000000000900000000f0000000000000000900000000f100000000000000090000 *0000f2000000000000000900000000f3000000000000000900000000f400000000000000090000 *0000f5000000000000000900000000f6000000000000000900000000f700000000000000090000 *0000f800000000000000090000000058000000000000000900000000f900000000000000090000 *0000fa000000000000000900000000fb000000000000000900000000fc00000000000000090000 *0000fd000000000000000900000000fe000000000000000900000000ff00000000000000090000 *000100000000000000000900000001010000000000000009000000010200000000000000090000 *000103000000000000000900000001040000000000000009000000010500000000000000090000 *000106000000000000000900000001070000000000000009000000010800000000000000090000 *0001090000000000000009000000010a0000000000000009000000010b00000000000000090000 *00010c0000000000000009000000010d0000000000000009000000010e00000000000000090000 *00010f000000000000000900000001100000000000000009000000005000000000000000090000 *000111000000000000000900000001120000000000000009000000011300000000000000090000 *000114000000000000000900000001150000000000000009000000011600000000000000090000 *000117000000000000000900000001180000000000000009000000011900000000000000090000 *00011a0000000000000009000000011b0000000000000009000000011c00000000000000090000 *00011d0000000000000009000000011e0000000000000009000000011f00000000000000090000 *000120000000000000000900000001210000000000000009000000012200000000000000090000 *000123000000000000000900000001240000000000000009000000012500000000000000090000 *000126000000000000000900000001270000000000000009000000012800000000000000090000 *0001290000000000000009000000012a0000000000000009000000012b00000000000000090000 *00012c0000000000000009000000012d0000000000000009000000012e00000000000000090000 *00012f000000000000000900000001300000000000000009000000013100000000000000090000 *000132000000000000000900000001330000000000000009000000013400000000000000090000 *000135000000000000000900000001360000000000000009000000013700000000000000090000 *000138000000000000000900000001390000000000000009000000013a00000000000000090000 *00013b0000000000000009000000013c0000000000000009000000013d00000000000000090000 *00013e0000000000000009000000013f0000000000000009000000014000000000000000090000 *000141000000000000000900000001420000000000000009000000014300000000000000090000 *0001440000000000000009000000014500000000000000090000000146000000000000000a0300 *000147000000000000000a0000000148000000000000000a0000000149000000000000000a0000 *00014a000000000000000a000000014b000000000000000a000000014c000000000000000a0000 *00014d000000000000000a000000014e000000000000000a000000014f000000000000000a0000 *000150000000000000000a0000000151000000000000000a0000000152000000000000000a0000 *000153000000000000000a0000000154000000000000000a0000000155000000000000000a0000 *000156000000000000000a0000000157000000000000000a0000000158000000000000000a0000 *000159000000000000000a000000015a000000000000000a000000015b000000000000000a0000 *00015c000000000000000a000000015d000000000000000a000000015e000000000000000a0000 *00015f000000000000000b0000000160000000000000000b0000000161000000000000000b0000 *000162000000000000000c0000000163000000000000000c0000000164000000000000000c0000 *000165000000000000000c0000000166000000000000000d0000000167000000000000000e0000 *000168000000000000000f0300000169000000000000000f0100000169000000000000000f0000 *00016a000000000000000f000000016b000000000000000f000000016c000000000000000f0000 *00016d000000000000000f000000016e000000000000000f000000016f00000170000001710000 *000172000000000000001000000001730000000000000010000000017400000000000000100000 *000175000000000000001000000001760000000000000010000000017700000000000000100000 *000178000000000000001000000001790000000000000010000000017a00000000000000100000 *00017b0000000000000010000000017c0000000000000010000000017d00000000000000110300 *00017e0000000000000011010000017e0000000000000011030000017f00000000000000110100 *00017f000001800000018103000001820000000000000011000000018300000000000000110300 *000184000000000000001100000001850000000000000011000000018600000000000000110000 *000187000000000000001100000001880000000000000011000000018900000000000000110000 *00018a0000000000000011000000018b0000000000000011000000018c000001800000018d0000 *00018e0000000000000011000000018f0000000000000011000000019000000000000000110000 *000191000000000000001100000001920000000000000011000000019300000000000000110000 *000194000000000000001100000001950000000000000011000000019600000000000000110000 *000197000000000000001100000001980000000000000011000000019900000000000000110000 *00019a0000000000000011000000019b0000000000000011000000019c00000000000000110000 *00019d0000000000000011000000019e0000000000000011000000019f00000000000000110000 *0001a0000000000000001100000001a1000000000000001100000001a200000000000000110000 *0001a3000000000000001100000001a4000000000000001200000001a500000000000000120000 *0001a6000000000000001200000001a7000000000000001200000001a800000000000000130300 *0001a9000000000000001300000001aa000000000000001301000001ab00000000000000130300 *0001ac000000000000001300000001ad000000000000001300000001ae00000000000000130000 *0001af000000000000001300000001b0000000000000001303000001b100000000000000130300 *0001b2000000000000001301000001b3000000000000001301000001b400000000000000130100 *0001b5000000000000001301000001b6000000000000001300000001b700000000000000130000 *0001b8000000000000001300000001b9000000000000001403000001ba00000000000000140100 *0001bb000000000000001401000001bc000000000000001400000001bd00000000000000140000 *0001be000000000000001400000001bf000000000000001400000001c000000000000000140300 *0001c1000000000000001401000001c2000000000000001400000001c300000000000000140000 *0001c4000000000000001400000001c5000000000000001400000001c600000000000000150300 *0001c7000000000000001501000001c8000000000000001501000001c900000000000000150100 *0001ca000000000000001501000001cb000000000000001501000001cc00000000000000150300 *00007800000000000000150100000078000000000000001500000001cd00000000000000150000 *0001ce000000000000001500000001cf000000000000001500000001d000000000000000150300 *0001d1000000000000001503000001d2000000000000001503000001d300000000000000150300 *00006d0000000000000015010000006d000000000000001500000001d400000180000001d50000 *0001d60000000000000015000000006e0000000000000015000000007500000000000000150000 *000076000000000000001503000001d70000000000000015010000009100000000000000150100 *0000900000000000000015010000008f0000000000000015010000009300000000000000150100 *000095000000000000001501000000920000000000000015010000009400000000000000150300 *0001d8000000000000001500000001d9000000000000001500000001da00000000000000150300 *0001db000000000000001501000001dc000000000000001501000001dd00000000000000150100 *0001de000000000000001501000001df000000000000001501000001e000000000000000150100 *0001e1000000000000001501000001e2000000000000001501000001e300000000000000150100 *0001e4000000000000001501000001e5000000000000001501000001e600000000000000150100 *0001e7000000000000001501000001e8000000000000001501000001e900000000000000150100 *0001ea000000000000001501000001eb000000000000001501000001ec00000000000000150100 *0001ed000000000000001501000001ee000000000000001501000001ef00000000000000150100 *0001f0000000000000001501000001f1000000000000001501000001f200000000000000150100 *0001f3000000000000001501000001f4000000000000001501000001f500000000000000150100 *0001f6000000000000001501000001f7000000000000001501000001f800000000000000150100 *0001f9000000000000001501000001fa000000000000001501000001fb00000000000000150100 *0001fc000000000000001501000001fd000000000000001501000001fe00000000000000150100 *0001ff000000000000001501000002000000000000000015010000020100000000000000150100 *000202000000000000001501000002030000000000000015010000020400000000000000150100 *000205000000000000001501000002060000000000000015010000020700000000000000150100 *000208000000000000001501000002090000000000000015010000020a00000000000000150100 *00020b0000000000000015010000020c0000000000000015010000020d00000000000000150300 *000184000000000000001501000001840000000000000015000000020e00000000000000150000 *00020f000000000000001500000002100000000000000015000000021100000000000000150000 *000212000000000000001500000002130000000000000015000000021400000000000000150000 *000215000000000000001500000002160000000000000015000000021700000000000000150000 *000218000000000000001500000002190000000000000015000000021a00000000000000150000 *00021b0000000000000015000000021c0000000000000015000000021d00000000000000150000 *00021e000000000000001500000001860000000000000015000000021f00000000000000150000 *00022000000000000000150000000221000000000000001500000000fb00000000000000150000 *000222000000000000001500000002230000000000000015000000022400000000000000150000 *000225000000000000001500000002260000000000000015000000022700000000000000150000 *000228000000000000001500000002290000000000000015000000022a00000000000000150000 *00022b0000000000000015000000022c0000000000000015000000022d00000000000000150000 *00022e0000000000000015000000022f0000000000000015000000023000000000000000150000 *000231000000000000001600000002320000000000000016000000023300000000000000160000 *000234000000000000001600000002350000000000000016000000023600000000000000160000 *000237000000000000001600000002380000000000000016000000023900000000000000160000 *00023a0000000000000016000000023b0000000000000017030000023c00000000000000170100 *00023c0000000000000017030000023d0000000000000017010000023d00000000000000170000 *00023e000001700000023f03000002400000000000000017000000024100000180000002420300 *000243000000000000001700000002440000000000000017000000024500000000000000170000 *000246000001800000024701000002480000000000000017000000024900000000000000170000 *00024a0000000000000017000000024b0000000000000017000000024c00000000000000170000 *00024d0000000000000017000000024e0000000000000017000000024f00000000000000170000 *000250000000000000001700000002510000000000000017000000025200000000000000170000 *000253000000000000001700000002540000000000000004000000025500000000000000040000 *000256000000000000000103000001d80000000000000001000000025700000000000000010000 *000258000000000000000100000002590000000000000001000000025a00000000000000010000 *00025b0000000000000001000000025c0000000000000001000000025d00000000000000010000 *00025e0000000000000001000000025f0000000000000001000000026000000000000000010000 *000261000001800000026203000002630000000000000018000000026400000000000000180000 *000265000000000000001800000002660000000000000018000000026700000000000000180000 *000268000000000000001800000002690000000000000018000000026a00000000000000180000 *00026b0000000000000018000000026c0000000000000018000000026d00000000000000180000 *00026e0000000000000018000000010b0000000000000018000000026f00000000000000180000 *000270000000000000001800000002710000000000000018000000027200000000000000180000 *000232000000000000001800000002730000000000000018000000027400000000000000180000 *000275000000000000001800000002600000000000000018000000027600000000000000180000 *00025f000000000000001800000002770000000000000018000000027800000000000000180000 *0002790000000000000018000000027a0000000000000018000000027b00000000000000180000 *00027c0000000000000018000000027d0000000000000018000000027e00000000000000180000 *00027f000000000000001800000002800000000000000018000000028100000000000000180000 *000282000000000000001900000002830000000000000008000000028400000000000000080100 *000285000000000000000801000002860000000000000008000000028700000000000000080000 *000288000000000000000800000002890000000000000008000000028a000001800000018d0300 *00028b0000000000000008000000028c0000000000000008000000028d00000000000000080000 *00028e0000000000000008000000028f0000000000000008000000029000000000000000080000 *000291000000000000000800000002920000000000000009030000029300000000000000090000 *00029400000295000002960000000297000001800000018d030000029800000180000002470300 *000299000001800000029a000000029b0000018000000247010000029c000001800000029d0300 *00029e000001800000029f01000002a0000001800000029f03000002a0000001800000029f0100 *0002a1000001800000029f03000002a1000001800000029f03000002a2000002a3000002a40100 *0002a5000002a3000002a403000002a5000002a3000002a601000002a7000002a3000002a60300 *0002a7000002a3000002a800000002a9000002a3000002a800000002aa00000000000000090000 *0002ab000000000000000900000002ac000001800000029f00000002ad00000000000000090000 *0002ae00000180000002af03000002b0000001800000029a00000002b100000180000002b20300 *0002b3000000000000000900000002b4000000000000000900000002b500000000000000090000 *0002b6000000000000000900000002b7000000000000000900000002b800000000000000090000 *0002b9000000000000000a00000002ba000000000000000a00000002bb000000000000000a0000 *0002bc000002bd000002be00000002bf000000000000000c00000002c0000000000000000c0000 *0002c1000000000000000c00000002c2000000000000000c00000002c300000000000002c40000 *00000000001668617070737461636b2d7365727665722d302e352e30000000000000001b486170 *70737461636b2e5365727665722e485454502e5479706573000000000000001948617070737461 *636b2e5365727665722e4d696e4861584d4c000000000000001548617070737461636b2e536572 *7665722e53555249000000000000001748617070737461636b2e5365727665722e436f6f6b6965 *000000000000001c48617070737461636b2e5365727665722e4d65737361676557726170000000 *000000001e48617070737461636b2e5365727665722e485454502e4c6f774c6576656c00000000 *0000001c48617070737461636b2e5365727665722e485454502e436c69656e7400000000000000 *1548617070737461636b2e5365727665722e58534c54000000000000001b48617070737461636b *2e5365727665722e53696d706c6548545450000000000000001f48617070737461636b2e536572 *7665722e485454502e46696c655365727665000000000000001a48617070737461636b2e536572 *7665722e537464436f6e666967000000000000001648617070737461636b2e5365727665722e50 *61727473000000000000001e48617070737461636b2e5365727665722e485454502e536f636b65 *745448000000000000001c48617070737461636b2e5365727665722e485454502e536f636b6574 *000000000000001f48617070737461636b2e5365727665722e485454502e4c617a794c696e6572 *000000000000001e48617070737461636b2e5365727665722e535552492e506172736555524900 *0000000000002348617070737461636b2e5365727665722e485454502e52464338323248656164 *657273000000000000001b48617070737461636b2e5365727665722e485454502e436c6f636b00 *0000000000002248617070737461636b2e5365727665722e48545450436c69656e742e53747265 *616d000000000000001f48617070737461636b2e5365727665722e48545450436c69656e742e54 *4350000000000000002048617070737461636b2e5365727665722e48545450436c69656e742e48 *545450000000000000001650617468735f68617070737461636b5f736572766572000000000000 *001f48617070737461636b2e5365727665722e485454502e4d756c746970617274000000000000 *001d48617070737461636b2e5365727665722e485454502e48616e646c6572000000000000001c *48617070737461636b2e5365727665722e485454502e4c697374656e0000000000000010486170 *70737461636b2e536572766572000000000000000b436f6e74656e745479706500000000000000 *066374547970650000000000000009637453756274797065000000000000000c6374506172616d *65746572730000000000000008456c537472696e670000000000000008656c537472696e670000 *000000000009546f456c656d656e740000000000000009746f456c656d656e7400000000000000 *03584d4c0000000000000007456c656d656e74000000000000000a5374796c6553686565740000 *00000000000358534c000000000000000343535300000000000000087374796c6555524c000000 *00000000074e6f5374796c6500000000000000085374796c6555524c000000000000000b686173 *5374796c6555524c000000000000000569734353530000000000000005697358534c0000000000 *0000017400000000000000016c00000000000000016500000000000000033c2f3c000000000000 *00023c3e0000000000000007786d6c456c656d000000000000000874657874456c656d00000000 *00000009656d707479456c656d00000000000000086c697374456c656d00000000000000096364 *617461456c656d000000000000000c73696d706c65446f634f6c64000000000000000973696d70 *6c65446f63000000000000000a73696d706c65446f6327000000000000000a786d6c4573636170 *6572000000000000000c786d6c537464457363617065000000000000000676657262696d000000 *000000000c73696d706c6550726f6c6f6700000000000000086e6f6e456d707479000000000000 *0007676574526f6f74000000000000000877726170456c656d0000000000000003656c46000000 *000000000561747472460000000000000006617474724653000000000000000761747472464d62 *000000000000000871756f74654573630000000000000007726563546f456c0000000000000008 *6c697374546f456c0000000000000007746f4174747273000000000000000846726f6d50617468 *000000000000000866726f6d506174680000000000000006546f53555249000000000000000674 *6f5355524900000000000000045355524900000000000000047375726900000000000000047061 *7468000000000000000571756572790000000000000006736368656d650000000000000008755f *736368656d650000000000000006755f706174680000000000000008615f736368656d65000000 *0000000006615f706174680000000000000008756e457363617065000000000000000665736361 *706500000000000000056973416273000000000000000672656e64657200000000000000057061 *7273650000000000000006436f6f6b6965000000000000000d636f6f6b696556657273696f6e00 *0000000000000a636f6f6b696550617468000000000000000c636f6f6b6965446f6d61696e0000 *00000000000a636f6f6b69654e616d65000000000000000b636f6f6b696556616c756500000000 *0000000673656375726500000000000000086d6b436f6f6b6965000000000000000e6d6b436f6f *6b6965486561646572000000000000000c7061727365436f6f6b696573000000000000000d636f *6f6b696573506172736572000000000000000a676574436f6f6b69657300000000000000096765 *74436f6f6b6965000000000000000b676574436f6f6b69657327000000000000000a676574436f *6f6b69652700000000000000065271426f64790000000000000004426f64790000000000000007 *52657175657374000000000000000872714d6574686f6400000000000000077271506174687300 *00000000000005727155726900000000000000077271517565727900000000000000087271496e *7075747300000000000000097271436f6f6b6965730000000000000009727156657273696f6e00 *0000000000000972714865616465727300000000000000067271426f6479000000000000000672 *71506565720000000000000008526573706f6e7365000000000000000853656e6446696c650000 *00000000000a736646696c6550617468000000000000000873664f666673657400000000000000 *077366436f756e7400000000000000067273436f64650000000000000009727348656164657273 *00000000000000077273466c61677300000000000000067273426f6479000000000000000b7273 *56616c696461746f720000000000000004486f73740000000000000005496e7075740000000000 *00000a696e70757456616c7565000000000000000d696e70757446696c656e616d650000000000 *000010696e707574436f6e74656e745479706500000000000000075273466c6167730000000000 *000010727366436f6e74656e744c656e6774680000000000000007486561646572730000000000 *00000a486561646572506169720000000000000005684e616d6500000000000000066856616c75 *6500000000000000064d6574686f640000000000000007434f4e4e45435400000000000000074f *5054494f4e5300000000000000055452414345000000000000000644454c455445000000000000 *00035055540000000000000004504f535400000000000000044845414400000000000000034745 *540000000000000004436f6e660000000000000004706f7274000000000000000976616c696461 *746f72000000000000000756657273696f6e000000000000000c636f6e74696e75654854545000 *000000000000086e756c6c436f6e66000000000000000b6e756c6c5273466c6167730000000000 *00000f6e6f436f6e74656e744c656e6774680000000000000005727155524c0000000000000009 *7365745273436f646500000000000000096d6b4865616465727300000000000000096765744865 *61646572000000000000000b6765744865616465724253000000000000000f6765744865616465 *72556e736166650000000000000009686173486561646572000000000000000b68617348656164 *65724253000000000000000f686173486561646572556e73616665000000000000000973657448 *6561646572000000000000000b7365744865616465724253000000000000000f73657448656164 *6572556e736166650000000000000009616464486561646572000000000000000b616464486561 *6465724253000000000000000f616464486561646572556e736166650000000000000006726573 *756c740000000000000008726573756c7442530000000000000008726564697265637400000000 *0000000a52656164537472696e67000000000000000a72656164537472696e6700000000000000 *0a7175657279496e7075740000000000000009626f6479496e707574000000000000000a666f72 *6d4465636f6465000000000000000a6465636f6465426f6479000000000000000f6d756c746970 *6172744465636f6465000000000000000f626f647950617274546f496e70757400000000000000 *0b73696d706c65496e707574000000000000001064656661756c74496e70757454797065000000 *000000000770617468456c73000000000000000772657175657374000000000000000d70617273 *65526573706f6e7365000000000000000a7075745265717565737400000000000000086c697374 *656e4f6e00000000000000066c697374656e00000000000000076c697374656e27000000000000 *000b676574526573706f6e73650000000000000009756e70726f78696679000000000000000a75 *6e7270726f78696679000000000000000758534c50617468000000000000000b58534c54436f6d *6d616e64000000000000000758534c54436d64000000000000000878736c74456c656d00000000 *0000000970726f634c4253494f000000000000000970726f63465053494f000000000000000778 *736c74465053000000000000000978736c74465053494f000000000000000a78736c7453747269 *6e67000000000000000878736c7446696c65000000000000000878736c7470726f630000000000 *0000057361786f6e0000000000000009546f4d657373616765000000000000000d746f436f6e74 *656e74547970650000000000000009746f4d657373616765000000000000000a746f526573706f *6e7365000000000000000846726f6d44617461000000000000000866726f6d4461746100000000 *00000006527144617461000000000000000a46726f6d526571555249000000000000000a66726f *6d52657155524900000000000000085765624d6f6e6164000000000000000a66696e6973685769 *74680000000000000006556e576562540000000000000004576562540000000000000006756e57 *656254000000000000000b46696c7465724d6f6e6164000000000000000973657446696c746572 *000000000000000d636f6d706f736546696c746572000000000000000967657446696c74657200 *0000000000000746696c746572540000000000000009756e46696c746572540000000000000009 *46696c74657246756e0000000000000009536574417070656e640000000000000006417070656e *640000000000000003536574000000000000000b5365727665724d6f6e61640000000000000005 *61736b527100000000000000076c6f63616c5271000000000000000b5365727665725061727454 *000000000000000d756e5365727665725061727454000000000000000a53657276657250617274 *0000000000000003576562000000000000000e72756e5365727665725061727454000000000000 *000b7769746852657175657374000000000000000e6d6170536572766572506172745400000000 *0000000f6d617053657276657250617274542700000000000000086e6f48616e646c6500000000 *0000000772756e576562540000000000000008756e756e5765625400000000000000066d6b5765 *625400000000000000076d617057656254000000000000000d69676e6f726546696c7465727300 *0000000000000765736361706527000000000000000b7061727365436f6e666967000000000000 *000a73696d706c6548545450000000000000000b73696d706c654854545027000000000000000c *73696d706c65485454502727000000000000001473696d706c654854545057697468536f636b65 *74000000000000001573696d706c654854545057697468536f636b657427000000000000000862 *696e64506f7274000000000000000c746f526573706f6e736542530000000000000007666c6174 *74656e000000000000000c6c6f63616c436f6e74657874000000000000000a6765744865616465 *724d000000000000000a6164644865616465724d000000000000000a7365744865616465724d00 *000000000000076775617264527100000000000000076d6574686f644d000000000000000a6d65 *74686f644f6e6c7900000000000000086d6574686f64535000000000000000066d6574686f6400 *000000000000076e756c6c44697200000000000000036469720000000000000004646972730000 *000000000004686f7374000000000000000877697468486f737400000000000000077572695265 *73740000000000000007616e79506174680000000000000008616e795061746827000000000000 *000d747261696c696e67536c617368000000000000000967657444617461466e00000000000000 *076765744461746100000000000000087769746844617461000000000000000a77697468446174 *61466e000000000000000a70726f78795365727665000000000000000b7270726f787953657276 *650000000000000007726571756972650000000000000008726571756972654d00000000000000 *0478736c740000000000000006646f58736c74000000000000000e6d6f64696679526573706f6e *7365000000000000000f736574526573706f6e7365436f64650000000000000009616464436f6f *6b6965000000000000000a616464436f6f6b696573000000000000000c657870697265436f6f6b *6965000000000000000f69664d6f64696669656453696e636500000000000000026f6b00000000 *00000013696e7465726e616c5365727665724572726f72000000000000000a6261644761746577 *6179000000000000000a62616452657175657374000000000000000c756e617574686f72697a65 *640000000000000009666f7262696464656e00000000000000086e6f74466f756e640000000000 *0000087365654f746865720000000000000005666f756e6400000000000000106d6f7665645065 *726d616e656e746c79000000000000000c74656d70526564697265637400000000000000056d75 *6c7469000000000000000b646562756746696c746572000000000000000a616e79526571756573 *74000000000000000c6170706c7952657175657374000000000000000962617369634175746800 *000000000000096c6f6f6b496e70757400000000000000066c6f6f6b425300000000000000046c *6f6f6b000000000000000a6c6f6f6b436f6f6b6965000000000000000f6c6f6f6b436f6f6b6965 *56616c7565000000000000000f72656164436f6f6b696556616c756500000000000000086c6f6f *6b5265616400000000000000096c6f6f6b5061697273000000000000000e6572726f7248616e64 *6c65725350000000000000001273696d706c654572726f7248616e646c6572000000000000000e *7370556e777261704572726f7254000000000000000c73657456616c696461746f720000000000 *00000e73657456616c696461746f725350000000000000000c76616c6964617465436f6e660000 *00000000000c72756e56616c696461746f72000000000000001077646748544d4c56616c696461 *746f72000000000000000d6e6f6f7056616c696461746f7200000000000000116c617a7950726f *6356616c696461746f7200000000000000074d696d654d6170000000000000000c6572726f7277 *72617070657200000000000000096d696d65547970657300000000000000106775657373436f6e *74656e745479706500000000000000116775657373436f6e74656e74547970654d000000000000 *000d6173436f6e74656e7454797065000000000000000e64656661756c74497846696c65730000 *00000000000d626c6f636b446f7446696c657300000000000000056973446f7400000000000000 *1073656e6446696c65526573706f6e736500000000000000166c617a7942797465537472696e67 *526573706f6e7365000000000000001873747269637442797465537472696e67526573706f6e73 *65000000000000001066696c655061746853656e6446696c65000000000000000c66696c655061 *74684c617a79000000000000000e66696c6550617468537472696374000000000000000e736572 *766546696c655573696e670000000000000009736572766546696c65000000000000000a66696c *65536572766527000000000000000966696c655365727665000000000000000d66696c65536572 *76654c617a79000000000000000f66696c6553657276655374726963740000000000000007646f *496e646578000000000000000b646f496e6465784c617a79000000000000000d646f496e646578 *5374726963740000000000000008646f496e64657827000000000000000e62696e6172796c6f63 *6174696f6e000000000000000b6c6f676c6f636174696f6e000000000000000765727257726170 *0000000000000018636f6d70726573736564526573706f6e736546696c74657200000000000000 *0a677a697046696c746572000000000000000d6465666c61746546696c74657200000000000000 *09656e636f64696e6773000000000000000c737570706f72747349507636000000000000000a61 *63636570744c69746500000000000000044c617a79000000000000000e6e65774c696e65724861 *6e646c65000000000000000b6865616465724c696e6573000000000000000e6765744279746573 *537472696374000000000000000867657442797465730000000000000007676574526573740000 *000000000008746f537472696374000000000000001262797465737472696e672d302e392e312e *350000000000000014446174612e42797465537472696e672e4c617a790000000000000008746f *4368756e6b73000000000000000b70617273655552495265660000000000000007706162737572 *69000000000000000a70617574686f72697479000000000000000a7061757468696e6e65720000 *0000000000097061757468706f7274000000000000000770757269726566000000000000000670 *7175657279000000000000000970667261676d656e74000000000000000a756e73616665546169 *6c000000000000000a756e7361666548656164000000000000000b756e73616665496e64657800 *00000000000012436f6e74656e74446973706f736974696f6e0000000000000017436f6e74656e *745472616e73666572456e636f64696e6700000000000000046261736500000000000000084748 *432e53686f77000000000000000453686f77000000000000000f73686f77436f6e74656e745479 *706500000000000000064865616465720000000000000008704865616465727300000000000000 *0c706172736548656164657273000000000000000770486561646572000000000000000e657874 *72614669656c644c696e65000000000000000e73686f77506172616d6574657273000000000000 *000b705f706172616d65746572000000000000000c70436f6e74656e7454797065000000000000 *00107061727365436f6e74656e745479706500000000000000084748432e426173650000000000 *0000046661696c000000000000000e676574436f6e74656e745479706500000000000000187043 *6f6e74656e745472616e73666572456e636f64696e67000000000000001c7061727365436f6e74 *656e745472616e73666572456e636f64696e67000000000000001a676574436f6e74656e745472 *616e73666572456e636f64696e67000000000000001370436f6e74656e74446973706f73697469 *6f6e00000000000000177061727365436f6e74656e74446973706f736974696f6e000000000000 *0015676574436f6e74656e74446973706f736974696f6e000000000000000670617273654d0000 *0000000000076c6f6f6b75704d000000000000000377733100000000000000066c6578656d6500 *0000000000000463724c66000000000000000a6c696e65537472696e67000000000000000d6c69 *746572616c537472696e67000000000000001262756767794c69746572616c537472696e670000 *00000000000e6865616465724e616d65436861720000000000000009657370656369616c730000 *000000000009746f6b656e636861720000000000000007705f746f6b656e000000000000000a74 *6578745f63686172730000000000000006705f74657874000000000000000b71756f7465645f70 *61697200000000000000066d6b54696d650000000000000005636c6f636b000000000000000775 *7064617465720000000000000012676574417070726f78696d61746554696d6500000000000000 *054465627567000000000000000b646562756753747265616d0000000000000003446267000000 *000000000653747265616d0000000000000008726561644c696e65000000000000000972656164 *426c6f636b000000000000000a7772697465426c6f636b0000000000000005636c6f7365000000 *0000000006526573756c740000000000000009436f6e6e4572726f720000000000000009457272 *6f724d697363000000000000000a4572726f725061727365000000000000000b4572726f72436c *6f736564000000000000000a4572726f725265736574000000000000000562696e644500000000 *0000001168616e646c65536f636b65744572726f7200000000000000066d797265637600000000 *00000004436f6e6e000000000000000a436f6e6e436c6f73656400000000000000064d6b436f6e *6e0000000000000008636f6e6e536f636b0000000000000008636f6e6e41646472000000000000 *0008636f6e6e426666720000000000000008636f6e6e486f7374000000000000000a436f6e6e65 *6374696f6e0000000000000007436f6e6e52656600000000000000066765745265660000000000 *0000076f70656e544350000000000000000b6f70656e544350506f7274000000000000000d6973 *436f6e6e6563746564546f00000000000000094265686176696f7572000000000000000b446965 *486f727269626c79000000000000000c457870656374456e746974790000000000000004446f6e *65000000000000000552657472790000000000000008436f6e74696e7565000000000000000772 *7370436f64650000000000000009727370526561736f6e000000000000000a7273704865616465 *72730000000000000007727370426f6479000000000000000b5265717565737444617461000000 *000000000c526573706f6e736544617461000000000000000c526573706f6e7365436f64650000 *000000000005727155524900000000000000074748432e4e756d00000000000000012a00000000 *0000000d526571756573744d6574686f64000000000000000a4861734865616465727300000000 *0000000a67657448656164657273000000000000000a7365744865616465727300000000000000 *0a4865616465724e616d650000000000000009486472437573746f6d000000000000001a486472 *436f6e74656e745472616e73666572456e636f64696e67000000000000000f4864724c6173744d *6f646966696564000000000000000a486472457870697265730000000000000007486472455461 *67000000000000000e486472436f6e74656e7454797065000000000000000f486472436f6e7465 *6e7452616e6765000000000000000d486472436f6e74656e744d44350000000000000012486472 *436f6e74656e744c6f636174696f6e0000000000000010486472436f6e74656e744c656e677468 *0000000000000012486472436f6e74656e744c616e67756167650000000000000012486472436f *6e74656e74456e636f64696e67000000000000000e486472436f6e74656e744261736500000000 *00000008486472416c6c6f77000000000000001248647257575741757468656e74696361746500 *0000000000000a4864725761726e696e6700000000000000074864725661727900000000000000 *0c486472536574436f6f6b69650000000000000009486472536572766572000000000000000d48 *64725265747279416674657200000000000000094864725075626c696300000000000000144864 *7250726f787941757468656e746963617465000000000000000b4864724c6f636174696f6e0000 *000000000006486472416765000000000000000c486472557365724167656e7400000000000000 *0a48647252656665726572000000000000000848647252616e6765000000000000001548647250 *726f7879417574686f72697a6174696f6e000000000000000e4864724d6178466f727761726473 *00000000000000144864724966556e6d6f64696669656453696e6365000000000000000a486472 *496652616e6765000000000000000e48647249664e6f6e654d61746368000000000000000a4864 *7249664d61746368000000000000001248647249664d6f64696669656453696e63650000000000 *000007486472486f7374000000000000000748647246726f6d0000000000000009486472457870 *6563740000000000000009486472436f6f6b69650000000000000010486472417574686f72697a *6174696f6e00000000000000114864724163636570744c616e6775616765000000000000001148 *6472416363657074456e636f64696e670000000000000010486472416363657074436861727365 *740000000000000009486472416363657074000000000000000648647256696100000000000000 *0a4864725570677261646500000000000000134864725472616e73666572456e636f64696e6700 *00000000000009486472507261676d61000000000000000748647244617465000000000000000d *486472436f6e6e656374696f6e000000000000000f4864724361636865436f6e74726f6c000000 *00000000056465627567000000000000000b687474704c6f6746696c6500000000000000047472 *696d000000000000000573706c6974000000000000000463726c66000000000000000273700000 *0000000000096865616465724d6170000000000000000c696e7365727448656164657200000000 *00000015696e7365727448656164657249664d697373696e67000000000000000d7265706c6163 *65486561646572000000000000000d696e7365727448656164657273000000000000000f726574 *726965766548656164657273000000000000000a66696e64486561646572000000000000000c6c *6f6f6b7570486561646572000000000000000b6874747056657273696f6e000000000000000b72 *714d6574686f644d6170000000000000000b706172736548656164657200000000000000107061 *727365526571756573744865616400000000000000117061727365526573706f6e736548656164 *000000000000000d6d61746368526573706f6e7365000000000000000b73696d706c6548545450 *5f000000000000000767657441757468000000000000000873656e644854545000000000000000 *1173656e6448545450506970656c696e6564000000000000000b72656365697665485454500000 *00000000000b726573706f6e6448545450000000000000000e6c696e6561725472616e73666572 *000000000000000f686f706566756c5472616e73666572000000000000000f6368756e6b656454 *72616e7366657200000000000000106368756e6b65645472616e73666572430000000000000011 *75676c7944656174685472616e73666572000000000000000e7265616454696c6c456d70747931 *000000000000000e7265616454696c6c456d70747932000000000000000975726c4465636f6465 *000000000000000975726c456e636f6465000000000000000d75726c456e636f64655661727300 *0000000000000776657273696f6e000000000000000662696e64697200000000000000066c6962 *646972000000000000000764617461646972000000000000000a6c696265786563646972000000 *000000000967657442696e44697200000000000000096765744c6962446972000000000000000a *67657444617461446972000000000000000d6765744c696265786563446972000000000000000f *6765744461746146696c654e616d650000000000000008426f6479506172740000000000000009 *4d756c746950617274000000000000001270617273654d756c746970617274426f647900000000 *0000001d446174612e42797465537472696e672e4c617a792e496e7465726e616c000000000000 *000a42797465537472696e670000000000000011684765744d756c746970617274426f64790000 *0000000000134748432e494f2e48616e646c652e5479706573000000000000000648616e646c65 *000000000000000d7061727365426f647950617274000000000000000a73706c69745061727473 *000000000000000c64726f70507265616d626c65000000000000000a446174612e4d6179626500 *000000000000074e6f7468696e67000000000000000f73706c69744174426f756e646172790000 *00000000000a6973426f756e6461727900000000000000076973436c6f73650000000000000010 *73746172747357697468446173686573000000000000000864726f704c696e6500000000000000 *1073706c69744174456d7074794c696e65000000000000000b73706c6974417443524c46000000 *000000000c73706c6974417443524c465f000000000000000866696e6443524c46000000000000 *000a66696e6443526f724c46000000000000000e7374617274735769746843524c460000000000 *00000864726f7043524c4600000000000000046663746c00000000000000036c6f770000000000 *00000d757064617465486561646572730000000000000007686561646572730000000000000009 *697348545450315f310000000000000009697348545450315f3000000000000000106765744865 *61646572556e7361666527000000000000000d636865636b486561646572425300000000000000 *11636865636b486561646572556e7361666500000000000000096c6f636174696f6e4300000000 *00000006636c6f736543000000000000000b636f6e6e656374696f6e43000000000000000a6b65 *6570616c6976654300000000000000084748432e52656164000000000000000452656164000000 *000000000d68476574436f6e74656e74734e000000000000000d68476574436f6e74656e747327 *0000000000000008726571756972656400000000000000117472616e73666572456e636f64696e *67430000000000000005726c6f6f70000000000000000d636f6e73756d654368756e6b73000000 *0000000011636f6e73756d654368756e6b73496d706c000000000000000663726c664c43000000 *00000000096c617a796c696e6573000000000000000b726571756573744c696e65000000000000 *000c726573706f6e73654c696e65000000000000000d7374617469634865616465727300000000 *000000127075744175676d656e746564526573756c74000000000000000e6175676d656e744865 *616465727300000000000000087076657273696f6e000000000000000668747470303900000000 *0000000668747470313000000000000000066874747031310000000000000010636f6e6e656374 *696f6e434c6f776572000000000000000a6b656570416c69766543000000000000000563726c66 *4300000000000000056673657043000000000000000c636f6e74656e7454797065430000000000 *00000e636f6e74656e744c656e67746843000000000000000e636f6e74656e746c656e67746843 *00000000000000056461746543000000000000000a64617465434c6f7765720000000000000007 *73657276657243000000000000000668617070734300000000000000097465787448746d6c4300 *0000000000000f726573706f6e73654d65737361676500000000000000046c6f67270000000000 *0000056c6f674d5800000000000000055361786f6e000000000000000858534c5450726f630000 *00000000000c636f6e7374725b615662495d000000000000000c636f6e7374725b6156624a5d00 *0000000000000e64617461547970655b615662485d000000000000000778736c74436d64000000 *0000000006537472696e67000000000000000978736c7470726f63270000000000000006736178 *6f6e27000000000000000a78736c7446696c654578000000000000000c7769746854656d704669 *6c65000000000000000e7265616446696c65537472696374000000000000000774656d70446972 *0000000000000006747279416e79000000000000000b4d617463684d6574686f64000000000000 *000b6d617463684d6574686f64000000000000001468617070737461636b2d7574696c2d302e35 *2e30000000000000001548617070737461636b2e5574696c2e436f6d6d6f6e0000000000000005 *726561644d00000000000000054d6f6e616400000000000000054d61796265000000000000000d *436f6e74726f6c2e4d6f6e616400000000000000056d7a65726f00000000000000044a75737400 *0000000000000b446174612e456974686572000000000000000645697468657200000000000000 *0b446174612e4d6f6e6f69640000000000000004456e646f00000000000000044475616c000000 *00000000064d6f6e6f6964000000000000000b6d746c2d312e312e302e32000000000000001443 *6f6e74726f6c2e4d6f6e61642e5265616465720000000000000007526561646572540000000000 *000013436f6e74726f6c2e4d6f6e61642e4572726f7200000000000000064572726f7254000000 *0000000019436f6e74726f6c2e4d6f6e61642e4572726f722e436c617373000000000000000a74 *68726f774572726f72000000000000000a63617463684572726f72000000000000000765787472 *616374000000000000000b756e46696c74657246756e00000000000000066d656d707479000000 *0000000002686f000000000000001553797374656d2e436f6e736f6c652e4765744f7074000000 *00000000084f7074446573637200000000000000046d73756d00000000000000064748432e494f *000000000000000846696c6550617468000000000000000b70726f787953657276652700000000 *0000000472657370000000000000000d6d6b4661696c4d65737361676500000000000000086661 *696c48746d6c000000000000000c657363617065537472696e67000000000000000c6e6f74466f *756e6448746d6c0000000000000008696f4572726f7273000000000000000c66696c654e6f7446 *6f756e640000000000000006676574457874000000000000001066696c65706174682d312e312e *302e33000000000000001553797374656d2e46696c65506174682e506f73697800000000000000 *0d74616b65457874656e73696f6e000000000000000c62657374456e636f64696e670000000000 *000013616c6c456e636f64696e6748616e646c657273000000000000000c616c6c456e636f6469 *6e6773000000000000000868616e646c657273 addfile ./docs/0.5.0/happstack-server/haskell_icon.gif binary ./docs/0.5.0/happstack-server/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/happstack-server/index-frames.html hunk ./docs/0.5.0/happstack-server/index-frames.html 1 + + +happstack-server-0.5.0: Web related tools and services.

    Happstack.Server
    Happstack.Server.Cookie
    Happstack.Server.HTTP.Client
    Happstack.Server.HTTP.FileServe
    Happstack.Server.HTTP.LowLevel
    Happstack.Server.HTTP.Types
    Happstack.Server.MessageWrap
    Happstack.Server.MinHaXML
    Happstack.Server.Parts
    Happstack.Server.SURI
    Happstack.Server.SimpleHTTP
    Happstack.Server.StdConfig
    Happstack.Server.XSLT

    addfile ./docs/0.5.0/happstack-server/index.html hunk ./docs/0.5.0/happstack-server/index.html 1 + + +happstack-server-0.5.0: Web related tools and services.
     happstack-server-0.5.0: Web related tools and services.ContentsIndex
    happstack-server-0.5.0: Web related tools and services.
    Web framework +
    Modules
    show/hideHappstack
    show/hideHappstack.Server
    Happstack.Server.Cookie
    show/hideHTTP
    Happstack.Server.HTTP.Client
    Happstack.Server.HTTP.FileServe
    Happstack.Server.HTTP.LowLevel
    Happstack.Server.HTTP.Types
    Happstack.Server.MessageWrap
    Happstack.Server.MinHaXML
    Happstack.Server.Parts
    Happstack.Server.SURI
    Happstack.Server.SimpleHTTP
    Happstack.Server.StdConfig
    Happstack.Server.XSLT
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-Cookie.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-Cookie.html 1 + + +Happstack.Server.Cookie addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-Client.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-Client.html 1 + + +Happstack.Server.HTTP.Client
    Happstack.Server.HTTP.Client
    addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-FileServe.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-FileServe.html 1 + + +Happstack.Server.HTTP.FileServe addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-LowLevel.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-LowLevel.html 1 + + +Happstack.Server.HTTP.LowLevel
    Happstack.Server.HTTP.LowLevel

    HTTP Implementation +

    Problems +

    API +

    addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-Types.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-HTTP-Types.html 1 + + +Happstack.Server.HTTP.Types addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-MessageWrap.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-MessageWrap.html 1 + + +Happstack.Server.MessageWrap addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-MinHaXML.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-MinHaXML.html 1 + + +Happstack.Server.MinHaXML addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-Parts.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-Parts.html 1 + + +Happstack.Server.Parts addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-SURI.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-SURI.html 1 + + +Happstack.Server.SURI addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-SimpleHTTP.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-SimpleHTTP.html 1 + + +Happstack.Server.SimpleHTTP
    Happstack.Server.SimpleHTTP
    addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-StdConfig.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-StdConfig.html 1 + + +Happstack.Server.StdConfig
    Happstack.Server.StdConfig
    addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server-XSLT.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server-XSLT.html 1 + + +Happstack.Server.XSLT addfile ./docs/0.5.0/happstack-server/mini_Happstack-Server.html hunk ./docs/0.5.0/happstack-server/mini_Happstack-Server.html 1 + + +Happstack.Server
    Happstack.Server
    addfile ./docs/0.5.0/happstack-server/minus.gif binary ./docs/0.5.0/happstack-server/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/happstack-server/plus.gif binary ./docs/0.5.0/happstack-server/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b adddir ./docs/0.5.0/happstack-server/src addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-Cookie.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-Cookie.html 1 + + + + +src/Happstack/Server/Cookie.hs + + + +
    {-# LANGUAGE DeriveDataTypeable #-}
    +
    +-- http://tools.ietf.org/html/rfc2109
    +module Happstack.Server.Cookie
    +    ( Cookie(..)
    +    , mkCookie
    +    , mkCookieHeader
    +    , getCookies
    +    , getCookie
    +    , getCookies'
    +    , getCookie'
    +    , parseCookies
    +    , cookiesParser
    +    )
    +    where
    +
    +import qualified Data.ByteString.Char8 as C
    +import Data.Char
    +import Data.List
    +import Data.Generics
    +import Happstack.Util.Common (Seconds)
    +import Text.ParserCombinators.Parsec hiding (token)
    +
    +data Cookie = Cookie
    +    { cookieVersion :: String
    +    , cookiePath    :: String
    +    , cookieDomain  :: String
    +    , cookieName    :: String
    +    , cookieValue   :: String
    +    , secure        :: Bool
    +    } deriving(Show,Eq,Read,Typeable,Data)
    +
    +-- | Creates a cookie with a default version of 1 and path of "/"
    +mkCookie :: String -> String -> Cookie
    +mkCookie key val = Cookie "1" "/" "" key val False
    +
    +-- | Set a Cookie in the Result.
    +-- The values are escaped as per RFC 2109, but some browsers may
    +-- have buggy support for cookies containing e.g. @\'\"\'@ or @\' \'@.
    +mkCookieHeader :: Seconds -> Cookie -> String
    +mkCookieHeader sec cookie =
    +    let l = [("Domain=",s cookieDomain)
    +            ,("Max-Age=",if sec < 0 then "" else show sec)
    +            ,("Path=", cookiePath cookie)
    +            ,("Version=", s cookieVersion)]
    +        s f | f cookie == "" = ""
    +        s f   = '\"' : concatMap e (f cookie) ++ "\""
    +        e c | fctl c || c == '"' = ['\\',c]
    +            | otherwise          = [c]
    +    in concat $ intersperse ";" ((cookieName cookie++"="++s cookieValue):[ (k++v) | (k,v) <- l, "" /= v ] ++ if secure cookie then ["Secure"] else [])
    +
    +fctl :: Char -> Bool
    +fctl ch = ch == chr 127 || ch <= chr 31
    +
    +-- | Not an supported api.  Takes a cookie header and returns
    +-- either a String error message or an array of parsed cookies
    +parseCookies :: String -> Either String [Cookie]
    +parseCookies str = either (Left . show) Right $ parse cookiesParser str str
    +
    +-- | not a supported api.  A parser for RFC 2109 cookies
    +cookiesParser :: GenParser Char st [Cookie]
    +cookiesParser = cookies
    +    where -- Parsers based on RFC 2109
    +          cookies = do
    +            ws
    +            ver<-option "" $ try (cookie_version >>= (\x -> cookieSep >> return x))
    +            cookieList<-(cookie_value ver) `sepBy1` try cookieSep
    +            ws
    +            eof
    +            return cookieList
    +          cookie_value ver = do
    +            name<-name_parser
    +            cookieEq
    +            val<-value
    +            path<-option "" $ try (cookieSep >> cookie_path)
    +            domain<-option "" $ try (cookieSep >> cookie_domain)
    +            return $ Cookie ver path domain (low name) val False
    +          cookie_version = cookie_special "$Version"
    +          cookie_path = cookie_special "$Path"
    +          cookie_domain = cookie_special "$Domain"
    +          cookie_special s = do
    +            string s
    +            cookieEq
    +            value
    +          cookieSep = ws >> oneOf ",;" >> ws
    +          cookieEq = ws >> char '=' >> ws
    +          ws = spaces
    +          value         = word
    +          word          = try (quoted_string) <|> incomp_token
    +
    +          -- Parsers based on RFC 2068
    +          quoted_string = do
    +            char '"'
    +            r <-many (oneOf qdtext)
    +            char '"'
    +            return r
    +
    +          -- Custom parsers, incompatible with RFC 2068, but more forgiving ;)
    +          incomp_token  = many1 $ oneOf ((chars \\ ctl) \\ " \t\";")
    +          name_parser   = many1 $ oneOf ((chars \\ ctl) \\ "= ;,")
    +
    +          -- Primitives from RFC 2068
    +          ctl           = map chr (127:[0..31])
    +          chars         = map chr [0..127]
    +          octet         = map chr [0..255]
    +          text          = octet \\ ctl
    +          qdtext        = text \\ "\""
    +
    +-- | Get all cookies from the HTTP request. The cookies are ordered per RFC from
    +-- the most specific to the least specific. Multiple cookies with the same
    +-- name are allowed to exist.
    +getCookies :: Monad m => C.ByteString -> m [Cookie]
    +getCookies h = getCookies' h >>=  either (fail. ("Cookie parsing failed!"++)) return
    +
    +-- | Get the most specific cookie with the given name. Fails if there is no such
    +-- cookie or if the browser did not escape cookies in a proper fashion.
    +-- Browser support for escaping cookies properly is very diverse.
    +getCookie :: Monad m => String -> C.ByteString -> m Cookie
    +getCookie s h = getCookie' s h >>= either (const $ fail ("getCookie: " ++ show s)) return
    +
    +getCookies' :: Monad m => C.ByteString -> m (Either String [Cookie])
    +getCookies' header | C.null header = return $ Right []
    +                   | otherwise     = return $ parseCookies (C.unpack header)
    +
    +getCookie' :: Monad m => String -> C.ByteString -> m (Either String Cookie)
    +getCookie' s h = do
    +    cs <- getCookies' h
    +    return $ do -- Either
    +       cooks <- cs
    +       case filter (\x->(==)  (low s)  (cookieName x) ) cooks of
    +            [] -> fail "No cookie found"
    +            f -> return $ head f
    +
    +low :: String -> String
    +low = map toLower
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Client.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Client.html 1 + + + + +src/Happstack/Server/HTTP/Client.hs + + + +
    module Happstack.Server.HTTP.Client where
    +
    +
    +import Happstack.Server.HTTP.Handler
    +import Happstack.Server.HTTP.Types
    +import Data.Maybe
    +import Control.Monad
    +import qualified Data.ByteString.Lazy.Char8 as L 
    +
    +import System.IO
    +import qualified Data.ByteString.Char8 as B 
    +import Network
    +
    +-- | Sends the serialized request to the host defined in the request
    +-- and attempts to parse response upon arrival.
    +getResponse :: Request -> IO (Either String Response)
    +getResponse rq = withSocketsDo $ do
    +  let (hostName,p) = span (/=':') $ fromJust $ fmap B.unpack $ getHeader "host" rq 
    +      portInt = if null p then 80 else read $ tail p
    +      portId = PortNumber $ toEnum $ portInt
    +  h <- connectTo hostName portId 
    +  hSetBuffering h NoBuffering
    +
    +  putRequest h rq
    +  hFlush h
    +
    +  inputStr <- L.hGetContents h
    +  return $ parseResponse inputStr
    +
    +unproxify :: Request -> Request
    +unproxify rq = rq {rqPaths = tail $ rqPaths rq,
    +                   rqHeaders = 
    +                       forwardedFor $ forwardedHost $ 
    +                       setHeader "host" (head $ rqPaths rq) $
    +                   rqHeaders rq}
    +  where
    +  appendInfo hdr val = setHeader hdr (csv val $
    +                                        maybe "" B.unpack $
    +                                        getHeader hdr rq)
    +  forwardedFor = appendInfo "X-Forwarded-For" (fst $ rqPeer rq)
    +  forwardedHost = appendInfo "X-Forwarded-Host" 
    +                  (B.unpack $ fromJust $ getHeader "host" rq)
    +  csv v "" = v
    +  csv v x = x++", " ++ v
    +
    +unrproxify :: String -> [(String, String)] -> Request -> Request
    +unrproxify defaultHost list rq = 
    +  let host::String
    +      host = fromMaybe defaultHost $ flip lookup list =<< B.unpack `liftM` getHeader "host" rq 
    +      newrq = rq {rqPaths = host: rqPaths rq}
    +  in  unproxify newrq
    +
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Clock.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Clock.html 1 + + + + +src/Happstack/Server/HTTP/Clock.hs + + + +
    {-# OPTIONS -fno-cse #-}
    +module Happstack.Server.HTTP.Clock(getApproximateTime) where
    +
    +import Control.Concurrent
    +import Data.IORef
    +import System.IO.Unsafe
    +import System.Time
    +import System.Locale
    +
    +import qualified Data.ByteString.Char8 as B
    +
    +mkTime :: IO B.ByteString
    +mkTime = do now <- getClockTime
    +            return $ B.pack (formatCalendarTime defaultTimeLocale "%a, %d %b %Y %X GMT" (toUTCTime now))
    +
    +
    +{-# NOINLINE clock #-}
    +clock :: IORef B.ByteString
    +clock = unsafePerformIO $ do
    +  ref <- newIORef =<< mkTime
    +  forkIO $ updater ref
    +  return ref
    +
    +updater :: IORef B.ByteString -> IO ()
    +updater ref = do threadDelay (10^(6 :: Int)) -- Every second
    +                 writeIORef ref =<< mkTime
    +                 updater ref
    +
    +getApproximateTime :: IO B.ByteString
    +getApproximateTime = readIORef clock
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-FileServe.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-FileServe.html 1 + + + + +src/Happstack/Server/HTTP/FileServe.hs + + + +
    {-# LANGUAGE FlexibleContexts, Rank2Types #-}
    +-- |File Serving functions
    +module Happstack.Server.HTTP.FileServe
    +    (
    +     -- * Content-Type \/ Mime-Type
    +     MimeMap,
    +     mimeTypes,
    +     asContentType,
    +     guessContentType,
    +     guessContentTypeM,
    +     -- * Low-Level
    +     sendFileResponse,     
    +     lazyByteStringResponse,
    +     strictByteStringResponse,
    +     filePathSendFile,
    +     filePathLazy,
    +     filePathStrict,
    +     -- * High-Level
    +     -- ** Serving a single file
    +     serveFile,
    +     serveFileUsing,
    +     -- ** Serving files from a directory
    +     fileServe',
    +     fileServe,
    +     fileServeLazy,
    +     fileServeStrict,
    +     -- * Other
    +     blockDotFiles,
    +     defaultIxFiles,
    +     doIndex,
    +     doIndex',
    +     doIndexLazy,
    +     doIndexStrict,
    +     errorwrapper,
    +     isDot
    +    ) where
    +
    +import Control.Exception.Extensible (IOException, SomeException, Exception(fromException), bracket, handleJust)
    +import Control.Monad (MonadPlus(mzero))
    +import Control.Monad.Trans (MonadIO(liftIO))
    +import qualified Data.ByteString.Lazy.Char8 as L
    +import qualified Data.ByteString.Char8 as S
    +import Data.Maybe (fromMaybe)
    +import           Data.Map (Map)
    +import qualified Data.Map as Map
    +import Happstack.Server.SimpleHTTP (FilterMonad, ServerMonad(askRq), Request(..), Response(..), WebMonad, toResponse, resultBS, setHeader, forbidden, nullRsFlags, result, require, rsfContentLength, seeOther, ifModifiedSince )
    +import System.Directory (doesDirectoryExist, doesFileExist, getModificationTime)
    +import System.IO (IOMode(ReadMode), hFileSize, hClose, openBinaryFile)
    +import System.FilePath ((</>), addTrailingPathSeparator, joinPath, takeExtension)
    +import System.Log.Logger (Priority(DEBUG), logM)
    +import System.Time (CalendarTime, toUTCTime)
    +
    +ioErrors :: SomeException -> Maybe IOException
    +ioErrors = fromException
    +
    +errorwrapper :: (MonadIO m, MonadPlus m, FilterMonad Response m) => String -> String -> m Response
    +errorwrapper binarylocation loglocation
    +    = require getErrorLog $ \errorLog ->
    +      return $ toResponse errorLog
    +    where getErrorLog
    +                = handleJust ioErrors (const (return Nothing)) $
    +                do bintime <- getModificationTime binarylocation
    +                   logtime <- getModificationTime loglocation
    +                   if (logtime > bintime)
    +                     then fmap Just $ readFile loglocation
    +                     else return Nothing
    +
    +-- * Mime-Type / Content-Type
    +
    +type MimeMap = Map String String
    +
    +-- | Ready collection of common mime types.
    +-- Except for the first two entries, the mappings come from an Ubuntu 8.04 /etc/mime.types file.
    +mimeTypes :: MimeMap
    +mimeTypes = Map.fromList [("gz","application/x-gzip"),("cabal","application/x-cabal"),("%","application/x-trash"),("323","text/h323"),("3gp","video/3gpp"),("7z","application/x-7z-compressed"),("abw","application/x-abiword"),("ai","application/postscript"),("aif","audio/x-aiff"),("aifc","audio/x-aiff"),("aiff","audio/x-aiff"),("alc","chemical/x-alchemy"),("art","image/x-jg"),("asc","text/plain"),("asf","video/x-ms-asf"),("asn","chemical/x-ncbi-asn1"),("aso","chemical/x-ncbi-asn1-binary"),("asx","video/x-ms-asf"),("atom","application/atom"),("atomcat","application/atomcat+xml"),("atomsrv","application/atomserv+xml"),("au","audio/basic"),("avi","video/x-msvideo"),("b","chemical/x-molconn-Z"),("bak","application/x-trash"),("bat","application/x-msdos-program"),("bcpio","application/x-bcpio"),("bib","text/x-bibtex"),("bin","application/octet-stream"),("bmp","image/x-ms-bmp"),("boo","text/x-boo"),("book","application/x-maker"),("bsd","chemical/x-crossfire"),("c","text/x-csrc"),("c++","text/x-c++src"),("c3d","chemical/x-chem3d"),("cab","application/x-cab"),("cac","chemical/x-cache"),("cache","chemical/x-cache"),("cap","application/cap"),("cascii","chemical/x-cactvs-binary"),("cat","application/vnd.ms-pki.seccat"),("cbin","chemical/x-cactvs-binary"),("cbr","application/x-cbr"),("cbz","application/x-cbz"),("cc","text/x-c++src"),("cdf","application/x-cdf"),("cdr","image/x-coreldraw"),("cdt","image/x-coreldrawtemplate"),("cdx","chemical/x-cdx"),("cdy","application/vnd.cinderella"),("cef","chemical/x-cxf"),("cer","chemical/x-cerius"),("chm","chemical/x-chemdraw"),("chrt","application/x-kchart"),("cif","chemical/x-cif"),("class","application/java-vm"),("cls","text/x-tex"),("cmdf","chemical/x-cmdf"),("cml","chemical/x-cml"),("cod","application/vnd.rim.cod"),("com","application/x-msdos-program"),("cpa","chemical/x-compass"),("cpio","application/x-cpio"),("cpp","text/x-c++src"),("cpt","application/mac-compactpro"),("crl","application/x-pkcs7-crl"),("crt","application/x-x509-ca-cert"),("csf","chemical/x-cache-csf"),("csh","application/x-csh"),("csm","chemical/x-csml"),("csml","chemical/x-csml"),("css","text/css"),("csv","text/csv"),("ctab","chemical/x-cactvs-binary"),("ctx","chemical/x-ctx"),("cu","application/cu-seeme"),("cub","chemical/x-gaussian-cube"),("cxf","chemical/x-cxf"),("cxx","text/x-c++src"),("d","text/x-dsrc"),("dat","chemical/x-mopac-input"),("dcr","application/x-director"),("deb","application/x-debian-package"),("dif","video/dv"),("diff","text/x-diff"),("dir","application/x-director"),("djv","image/vnd.djvu"),("djvu","image/vnd.djvu"),("dl","video/dl"),("dll","application/x-msdos-program"),("dmg","application/x-apple-diskimage"),("dms","application/x-dms"),("doc","application/msword"),("dot","application/msword"),("dv","video/dv"),("dvi","application/x-dvi"),("dx","chemical/x-jcamp-dx"),("dxr","application/x-director"),("emb","chemical/x-embl-dl-nucleotide"),("embl","chemical/x-embl-dl-nucleotide"),("eml","message/rfc822"),("ent","chemical/x-ncbi-asn1-ascii"),("eps","application/postscript"),("etx","text/x-setext"),("exe","application/x-msdos-program"),("ez","application/andrew-inset"),("fb","application/x-maker"),("fbdoc","application/x-maker"),("fch","chemical/x-gaussian-checkpoint"),("fchk","chemical/x-gaussian-checkpoint"),("fig","application/x-xfig"),("flac","application/x-flac"),("fli","video/fli"),("fm","application/x-maker"),("frame","application/x-maker"),("frm","application/x-maker"),("gal","chemical/x-gaussian-log"),("gam","chemical/x-gamess-input"),("gamin","chemical/x-gamess-input"),("gau","chemical/x-gaussian-input"),("gcd","text/x-pcs-gcd"),("gcf","application/x-graphing-calculator"),("gcg","chemical/x-gcg8-sequence"),("gen","chemical/x-genbank"),("gf","application/x-tex-gf"),("gif","image/gif"),("gjc","chemical/x-gaussian-input"),("gjf","chemical/x-gaussian-input"),("gl","video/gl"),("gnumeric","application/x-gnumeric"),("gpt","chemical/x-mopac-graph"),("gsf","application/x-font"),("gsm","audio/x-gsm"),("gtar","application/x-gtar"),("h","text/x-chdr"),("h++","text/x-c++hdr"),("hdf","application/x-hdf"),("hh","text/x-c++hdr"),("hin","chemical/x-hin"),("hpp","text/x-c++hdr"),("hqx","application/mac-binhex40"),("hs","text/x-haskell"),("hta","application/hta"),("htc","text/x-component"),("htm","text/html"),("html","text/html"),("hxx","text/x-c++hdr"),("ica","application/x-ica"),("ice","x-conference/x-cooltalk"),("ico","image/x-icon"),("ics","text/calendar"),("icz","text/calendar"),("ief","image/ief"),("iges","model/iges"),("igs","model/iges"),("iii","application/x-iphone"),("inp","chemical/x-gamess-input"),("ins","application/x-internet-signup"),("iso","application/x-iso9660-image"),("isp","application/x-internet-signup"),("ist","chemical/x-isostar"),("istr","chemical/x-isostar"),("jad","text/vnd.sun.j2me.app-descriptor"),("jar","application/java-archive"),("java","text/x-java"),("jdx","chemical/x-jcamp-dx"),("jmz","application/x-jmol"),("jng","image/x-jng"),("jnlp","application/x-java-jnlp-file"),("jpe","image/jpeg"),("jpeg","image/jpeg"),("jpg","image/jpeg"),("js","application/x-javascript"),("kar","audio/midi"),("key","application/pgp-keys"),("kil","application/x-killustrator"),("kin","chemical/x-kinemage"),("kml","application/vnd.google-earth.kml+xml"),("kmz","application/vnd.google-earth.kmz"),("kpr","application/x-kpresenter"),("kpt","application/x-kpresenter"),("ksp","application/x-kspread"),("kwd","application/x-kword"),("kwt","application/x-kword"),("latex","application/x-latex"),("lha","application/x-lha"),("lhs","text/x-literate-haskell"),("lsf","video/x-la-asf"),("lsx","video/x-la-asf"),("ltx","text/x-tex"),("lyx","application/x-lyx"),("lzh","application/x-lzh"),("lzx","application/x-lzx"),("m3u","audio/mpegurl"),("m4a","audio/mpeg"),("maker","application/x-maker"),("man","application/x-troff-man"),("mcif","chemical/x-mmcif"),("mcm","chemical/x-macmolecule"),("mdb","application/msaccess"),("me","application/x-troff-me"),("mesh","model/mesh"),("mid","audio/midi"),("midi","audio/midi"),("mif","application/x-mif"),("mm","application/x-freemind"),("mmd","chemical/x-macromodel-input"),("mmf","application/vnd.smaf"),("mml","text/mathml"),("mmod","chemical/x-macromodel-input"),("mng","video/x-mng"),("moc","text/x-moc"),("mol","chemical/x-mdl-molfile"),("mol2","chemical/x-mol2"),("moo","chemical/x-mopac-out"),("mop","chemical/x-mopac-input"),("mopcrt","chemical/x-mopac-input"),("mov","video/quicktime"),("movie","video/x-sgi-movie"),("mp2","audio/mpeg"),("mp3","audio/mpeg"),("mp4","video/mp4"),("mpc","chemical/x-mopac-input"),("mpe","video/mpeg"),("mpeg","video/mpeg"),("mpega","audio/mpeg"),("mpg","video/mpeg"),("mpga","audio/mpeg"),("ms","application/x-troff-ms"),("msh","model/mesh"),("msi","application/x-msi"),("mvb","chemical/x-mopac-vib"),("mxu","video/vnd.mpegurl"),("nb","application/mathematica"),("nc","application/x-netcdf"),("nwc","application/x-nwc"),("o","application/x-object"),("oda","application/oda"),("odb","application/vnd.oasis.opendocument.database"),("odc","application/vnd.oasis.opendocument.chart"),("odf","application/vnd.oasis.opendocument.formula"),("odg","application/vnd.oasis.opendocument.graphics"),("odi","application/vnd.oasis.opendocument.image"),("odm","application/vnd.oasis.opendocument.text-master"),("odp","application/vnd.oasis.opendocument.presentation"),("ods","application/vnd.oasis.opendocument.spreadsheet"),("odt","application/vnd.oasis.opendocument.text"),("oga","audio/ogg"),("ogg","application/ogg"),("ogv","video/ogg"),("ogx","application/ogg"),("old","application/x-trash"),("otg","application/vnd.oasis.opendocument.graphics-template"),("oth","application/vnd.oasis.opendocument.text-web"),("otp","application/vnd.oasis.opendocument.presentation-template"),("ots","application/vnd.oasis.opendocument.spreadsheet-template"),("ott","application/vnd.oasis.opendocument.text-template"),("oza","application/x-oz-application"),("p","text/x-pascal"),("p7r","application/x-pkcs7-certreqresp"),("pac","application/x-ns-proxy-autoconfig"),("pas","text/x-pascal"),("pat","image/x-coreldrawpattern"),("patch","text/x-diff"),("pbm","image/x-portable-bitmap"),("pcap","application/cap"),("pcf","application/x-font"),("pcf.Z","application/x-font"),("pcx","image/pcx"),("pdb","chemical/x-pdb"),("pdf","application/pdf"),("pfa","application/x-font"),("pfb","application/x-font"),("pgm","image/x-portable-graymap"),("pgn","application/x-chess-pgn"),("pgp","application/pgp-signature"),("php","application/x-httpd-php"),("php3","application/x-httpd-php3"),("php3p","application/x-httpd-php3-preprocessed"),("php4","application/x-httpd-php4"),("phps","application/x-httpd-php-source"),("pht","application/x-httpd-php"),("phtml","application/x-httpd-php"),("pk","application/x-tex-pk"),("pl","text/x-perl"),("pls","audio/x-scpls"),("pm","text/x-perl"),("png","image/png"),("pnm","image/x-portable-anymap"),("pot","text/plain"),("ppm","image/x-portable-pixmap"),("pps","application/vnd.ms-powerpoint"),("ppt","application/vnd.ms-powerpoint"),("prf","application/pics-rules"),("prt","chemical/x-ncbi-asn1-ascii"),("ps","application/postscript"),("psd","image/x-photoshop"),("py","text/x-python"),("pyc","application/x-python-code"),("pyo","application/x-python-code"),("qt","video/quicktime"),("qtl","application/x-quicktimeplayer"),("ra","audio/x-pn-realaudio"),("ram","audio/x-pn-realaudio"),("rar","application/rar"),("ras","image/x-cmu-raster"),("rd","chemical/x-mdl-rdfile"),("rdf","application/rdf+xml"),("rgb","image/x-rgb"),("rhtml","application/x-httpd-eruby"),("rm","audio/x-pn-realaudio"),("roff","application/x-troff"),("ros","chemical/x-rosdal"),("rpm","application/x-redhat-package-manager"),("rss","application/rss+xml"),("rtf","application/rtf"),("rtx","text/richtext"),("rxn","chemical/x-mdl-rxnfile"),("sct","text/scriptlet"),("sd","chemical/x-mdl-sdfile"),("sd2","audio/x-sd2"),("sda","application/vnd.stardivision.draw"),("sdc","application/vnd.stardivision.calc"),("sdd","application/vnd.stardivision.impress"),("sdf","application/vnd.stardivision.math"),("sds","application/vnd.stardivision.chart"),("sdw","application/vnd.stardivision.writer"),("ser","application/java-serialized-object"),("sgf","application/x-go-sgf"),("sgl","application/vnd.stardivision.writer-global"),("sh","application/x-sh"),("shar","application/x-shar"),("shtml","text/html"),("sid","audio/prs.sid"),("sik","application/x-trash"),("silo","model/mesh"),("sis","application/vnd.symbian.install"),("sisx","x-epoc/x-sisx-app"),("sit","application/x-stuffit"),("sitx","application/x-stuffit"),("skd","application/x-koan"),("skm","application/x-koan"),("skp","application/x-koan"),("skt","application/x-koan"),("smi","application/smil"),("smil","application/smil"),("snd","audio/basic"),("spc","chemical/x-galactic-spc"),("spl","application/futuresplash"),("spx","audio/ogg"),("src","application/x-wais-source"),("stc","application/vnd.sun.xml.calc.template"),("std","application/vnd.sun.xml.draw.template"),("sti","application/vnd.sun.xml.impress.template"),("stl","application/vnd.ms-pki.stl"),("stw","application/vnd.sun.xml.writer.template"),("sty","text/x-tex"),("sv4cpio","application/x-sv4cpio"),("sv4crc","application/x-sv4crc"),("svg","image/svg+xml"),("svgz","image/svg+xml"),("sw","chemical/x-swissprot"),("swf","application/x-shockwave-flash"),("swfl","application/x-shockwave-flash"),("sxc","application/vnd.sun.xml.calc"),("sxd","application/vnd.sun.xml.draw"),("sxg","application/vnd.sun.xml.writer.global"),("sxi","application/vnd.sun.xml.impress"),("sxm","application/vnd.sun.xml.math"),("sxw","application/vnd.sun.xml.writer"),("t","application/x-troff"),("tar","application/x-tar"),("taz","application/x-gtar"),("tcl","application/x-tcl"),("tex","text/x-tex"),("texi","application/x-texinfo"),("texinfo","application/x-texinfo"),("text","text/plain"),("tgf","chemical/x-mdl-tgf"),("tgz","application/x-gtar"),("tif","image/tiff"),("tiff","image/tiff"),("tk","text/x-tcl"),("tm","text/texmacs"),("torrent","application/x-bittorrent"),("tr","application/x-troff"),("ts","text/texmacs"),("tsp","application/dsptype"),("tsv","text/tab-separated-values"),("txt","text/plain"),("udeb","application/x-debian-package"),("uls","text/iuls"),("ustar","application/x-ustar"),("val","chemical/x-ncbi-asn1-binary"),("vcd","application/x-cdlink"),("vcf","text/x-vcard"),("vcs","text/x-vcalendar"),("vmd","chemical/x-vmd"),("vms","chemical/x-vamas-iso14976"),("vrm","x-world/x-vrml"),("vrml","model/vrml"),("vsd","application/vnd.visio"),("wad","application/x-doom"),("wav","audio/x-wav"),("wax","audio/x-ms-wax"),("wbmp","image/vnd.wap.wbmp"),("wbxml","application/vnd.wap.wbxml"),("wk","application/x-123"),("wm","video/x-ms-wm"),("wma","audio/x-ms-wma"),("wmd","application/x-ms-wmd"),("wml","text/vnd.wap.wml"),("wmlc","application/vnd.wap.wmlc"),("wmls","text/vnd.wap.wmlscript"),("wmlsc","application/vnd.wap.wmlscriptc"),("wmv","video/x-ms-wmv"),("wmx","video/x-ms-wmx"),("wmz","application/x-ms-wmz"),("wp5","application/wordperfect5.1"),("wpd","application/wordperfect"),("wrl","model/vrml"),("wsc","text/scriptlet"),("wvx","video/x-ms-wvx"),("wz","application/x-wingz"),("xbm","image/x-xbitmap"),("xcf","application/x-xcf"),("xht","application/xhtml+xml"),("xhtml","application/xhtml+xml"),("xlb","application/vnd.ms-excel"),("xls","application/vnd.ms-excel"),("xlt","application/vnd.ms-excel"),("xml","application/xml"),("xpi","application/x-xpinstall"),("xpm","image/x-xpixmap"),("xsl","application/xml"),("xtel","chemical/x-xtel"),("xul","application/vnd.mozilla.xul+xml"),("xwd","image/x-xwindowdump"),("xyz","chemical/x-xyz"),("zip","application/zip"),("zmt","chemical/x-mopac-input"),("~","application/x-trash")]
    +
    +
    +guessContentType :: MimeMap -> FilePath -> Maybe String
    +guessContentType mimeMap filepath =
    +    case getExt filepath of
    +      "" -> Nothing
    +      ext -> Map.lookup ext mimeMap
    +
    +guessContentTypeM :: (Monad m) => MimeMap -> (FilePath -> m String)
    +guessContentTypeM mimeMap filePath = return $ fromMaybe "text/plain" $ guessContentType mimeMap filePath
    +
    +asContentType :: (Monad m) => String -> (FilePath -> m String)
    +asContentType = const . return
    +
    +defaultIxFiles :: [String]
    +defaultIxFiles= ["index.html","index.xml","index.gif"]
    +
    +fileNotFound :: (Monad m, FilterMonad Response m) => FilePath -> m Response
    +fileNotFound fp = return $ result 404 $ "File not found " ++ fp
    +
    +-- | Similar to 'takeExtension' but does not include the extension separator char
    +getExt :: FilePath -> String
    +getExt fp = drop 1 $ takeExtension fp
    +
    +-- | Prevents files of the form '.foo' or 'bar/.foo' from being served
    +blockDotFiles :: (Request -> IO Response) -> Request -> IO Response
    +blockDotFiles fn rq
    +    | isDot (joinPath (rqPaths rq)) = return $ result 403 "Dot files not allowed."
    +    | otherwise = fn rq
    +
    +-- | Returns True if the given String either starts with a . or is of the form
    +-- "foo/.bar", e.g. the typical *nix convention for hidden files.
    +isDot :: String -> Bool
    +isDot = isD . reverse
    +    where
    +    isD ('.':'/':_) = True
    +    isD ['.']       = True
    +    --isD ('/':_)     = False
    +    isD (_:cs)      = isD cs
    +    isD []          = False
    +
    +-- * Low-level functions for generating a Response
    +
    +-- | Use sendFile to send the contents of a Handle
    +sendFileResponse :: String  -- ^ content-type string
    +                 -> FilePath  -- ^ file path for content to send
    +                 -> Maybe (CalendarTime, Request) -- ^ mod-time for the handle (MUST NOT be later than server's time of message origination), incoming request (used to check for if-modified-since header)
    +                 -> Integer -- ^ offset into Handle
    +                 -> Integer -- ^ number of bytes to send
    +                 -> Response
    +sendFileResponse ct filePath mModTime _offset count =
    +    let res = ((setHeader "Content-Length" (show count)) .
    +               (setHeader "Content-Type" ct) $ 
    +               (SendFile 200 Map.empty nullRsFlags{rsfContentLength=False} Nothing filePath 0 count)
    +              )
    +    in case mModTime of
    +         Nothing -> res
    +         (Just (modTime, request)) -> ifModifiedSince modTime request res
    +
    +-- | Send the contents of a Lazy ByteString
    +lazyByteStringResponse :: String   -- ^ content-type string (e.g. @\"text/plain; charset=utf-8\"@)
    +                       -> L.ByteString   -- ^ lazy bytestring content to send
    +                       -> Maybe (CalendarTime, Request) -- ^ mod-time for the bytestring, incoming request (used to check for if-modified-since header)
    +                       -> Integer -- ^ offset into the bytestring
    +                       -> Integer -- ^ number of bytes to send (offset + count must be less than or equal to the length of the bytestring)
    +                       -> Response
    +lazyByteStringResponse ct body mModTime offset count =
    +    let res = ((setHeader "Content-Type" ct) $
    +               resultBS 200 (L.take (fromInteger count) $ (L.drop (fromInteger offset))  body)
    +              )
    +    in case mModTime of
    +         Nothing -> res
    +         (Just (modTime, request)) -> ifModifiedSince modTime request res
    +
    +-- | Send the contents of a Lazy ByteString
    +strictByteStringResponse :: String   -- ^ content-type string (e.g. @\"text/plain; charset=utf-8\"@)
    +                         -> S.ByteString   -- ^ lazy bytestring content to send
    +                         -> Maybe (CalendarTime, Request) -- ^ mod-time for the bytestring, incoming request (used to check for if-modified-since header)
    +                         -> Integer -- ^ offset into the bytestring
    +                         -> Integer -- ^ number of bytes to send (offset + count must be less than or equal to the length of the bytestring)
    +                         -> Response
    +strictByteStringResponse ct body mModTime offset count =
    +    let res = ((setHeader "Content-Type" ct) $
    +               resultBS 200 (L.fromChunks [S.take (fromInteger count) $ S.drop (fromInteger offset) body])
    +              )
    +    in case mModTime of
    +         Nothing -> res
    +         (Just (modTime, request)) -> ifModifiedSince modTime request res
    +
    +-- | Send the specified file with the specified mime-type using sendFile()
    +--
    +-- NOTE: assumes file exists and is readable by the server. See 'serveFileUsing'.
    +--
    +-- WARNING: No security checks are performed.
    +filePathSendFile :: (ServerMonad m, MonadIO m)
    +                 => String   -- ^ content-type string
    +                 -> FilePath -- ^ path to file on disk
    +                 -> m Response
    +filePathSendFile contentType fp =
    +    do handle  <- liftIO $ openBinaryFile fp ReadMode -- garbage collection should close this
    +       modtime <- liftIO $ getModificationTime fp
    +       count   <- liftIO $ hFileSize handle
    +       rq      <- askRq
    +       return $ sendFileResponse contentType fp (Just (toUTCTime modtime, rq)) 0 count
    +
    +-- | Send the specified file with the specified mime-type using Lazy ByteStrings
    +--
    +-- NOTE: assumes file exists and is readable by the server. See 'serveFileUsing'.
    +--
    +-- WARNING: No security checks are performed.
    +filePathLazy :: (ServerMonad m, MonadIO m)
    +                 => String   -- ^ content-type string
    +                 -> FilePath -- ^ path to file on disk
    +                 -> m Response
    +filePathLazy contentType fp =
    +    do handle  <- liftIO $ openBinaryFile fp ReadMode -- garbage collection should close this
    +       contents <- liftIO $ L.hGetContents handle
    +       modtime  <- liftIO $ getModificationTime fp
    +       count    <- liftIO $ hFileSize handle
    +       rq       <- askRq
    +       return $ lazyByteStringResponse contentType contents (Just (toUTCTime modtime, rq)) 0 count
    +
    +-- | Send the specified file with the specified mime-type using Lazy ByteStrings
    +--
    +-- NOTE: assumes file exists and is readable by the server. See 'serveFileUsing'.
    +--
    +-- WARNING: No security checks are performed.
    +filePathStrict :: (ServerMonad m, MonadIO m)
    +                 => String   -- ^ content-type string
    +                 -> FilePath -- ^ path to file on disk
    +                 -> m Response
    +filePathStrict contentType fp =
    +    do contents <- liftIO $ S.readFile fp
    +       modtime  <- liftIO $ getModificationTime fp
    +       count    <- liftIO $ bracket (openBinaryFile fp ReadMode) hClose hFileSize
    +       rq       <- askRq
    +       return $ strictByteStringResponse contentType contents (Just (toUTCTime modtime, rq)) 0 count
    +
    +-- * High-level functions for serving files
    +
    +
    +-- ** Serve a single file
    +
    +-- | Serve a single, specified file.
    +-- 
    +-- example 1:
    +-- 
    +--  Serve using sendfile() and the specified content-type
    +--
    +-- > serveFileUsing filePathSendFile (asContentType "image/jpeg") "/srv/data/image.jpg"
    +--
    +--
    +-- example 2:
    +-- 
    +--  Serve using a lazy ByteString and the guess the content-type from the extension
    +-- 
    +-- > serveFileUsing filePathLazy (guessContentTypeM mimeTypes) "/srv/data/image.jpg"
    +-- 
    +-- WARNING: No security checks are performed.
    +serveFileUsing :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) 
    +               => (String -> FilePath -> m Response) -- ^ typically 'filePathSendFile', 'filePathLazy', or 'filePathStrict'
    +               -> (FilePath -> m String)  -- ^ function for determining content-type of file. Typically 'asContentType' or 'guessContentTypeM'
    +               -> FilePath -- ^ path to the file to serve
    +               -> m Response
    +serveFileUsing serveFn mimeFn fp = 
    +    do fe <- liftIO $ doesFileExist fp
    +       if fe
    +          then do mt <- mimeFn fp
    +                  serveFn mt fp
    +          else mzero
    +
    +-- | Alias for 'serveFileUsing' 'filePathSendFile'
    +serveFile :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) => (FilePath -> m String) -> FilePath -> m Response
    +serveFile = serveFileUsing filePathSendFile
    +
    +-- ** Serve files from a directory
    +
    +-- | Serve files from a directory and its subdirectories (parameterizable version)
    +-- 
    +-- Parameterize this function to create functions like, 'fileServe', 'fileServeLazy', and 'fileServeStrict'
    +--
    +-- You supply:
    +--
    +--  1. a low-level function which takes a content-type and 'FilePath' and generates a Response
    +--  2. a function which determines the content-type from the 'FilePath'
    +--  3. a list of all the default index files
    +--
    +-- NOTE: unlike fileServe, there are no index files by default. See 'defaultIxFiles'.
    +fileServe' :: ( WebMonad Response m
    +              , ServerMonad m
    +              , FilterMonad Response m
    +              , MonadIO m
    +              , MonadPlus m
    +              ) 
    +           => (String -> FilePath -> m Response) -- ^ function which takes a content-type and filepath and generates a response (typically 'filePathSendFile', 'filePathLazy', or 'filePathStrict')
    +           -> (FilePath -> m String) -- ^ function which returns the mime-type for FilePath
    +           -> [FilePath]         -- ^ index file names, in case the requested path is a directory
    +           -> FilePath           -- ^ file/directory to serve
    +           -> m Response
    +fileServe' serveFn mimeFn ixFiles localpath = do
    +    rq <- askRq
    +    let safepath = filter (\x->not (null x) && x /= ".." && x /= ".") (rqPaths rq)
    +        fp = joinPath  (localpath:safepath)
    +    fe <- liftIO $ doesFileExist fp
    +    de <- liftIO $ doesDirectoryExist fp
    +    let status | de   = "DIR"
    +               | fe   = "file"
    +               | True = "NOT FOUND"
    +    liftIO $ logM "Happstack.Server.HTTP.FileServe" DEBUG ("fileServe: "++show fp++" \t"++status)
    +    if de
    +        then if last (rqUri rq) == '/'
    +             then doIndex' serveFn mimeFn (ixFiles++defaultIxFiles) fp
    +             else do let path' = addTrailingPathSeparator (rqUri rq)
    +                     seeOther path' (toResponse path')
    +        else if fe 
    +                then serveFileUsing serveFn mimeFn fp
    +                else mzero
    +
    +-- | Serve files from a directory and its subdirectories (sendFile version). Should perform much better than its predecessors.
    +fileServe :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) =>
    +             [FilePath]         -- ^ index file names, in case the requested path is a directory
    +          -> FilePath           -- ^ file/directory to serve
    +          -> m Response
    +fileServe ixFiles localPath = fileServe' filePathSendFile (guessContentTypeM mimeTypes) (ixFiles ++ defaultIxFiles) localPath
    +
    +-- | Serve files from a directory and its subdirectories (lazy ByteString version).
    +-- 
    +-- May leak file handles.
    +fileServeLazy :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) =>
    +             [FilePath]         -- ^ index file names, in case the requested path is a directory
    +          -> FilePath           -- ^ file/directory to serve
    +          -> m Response
    +fileServeLazy ixFiles localPath = fileServe' filePathLazy (guessContentTypeM mimeTypes) (ixFiles ++ defaultIxFiles) localPath
    +
    +-- | Serve files from a directory and its subdirectories (strict ByteString version). 
    +fileServeStrict :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m) =>
    +             [FilePath]         -- ^ index file names, in case the next argument is a directory
    +          -> FilePath           -- ^ file/directory to serve
    +          -> m Response
    +fileServeStrict ixFiles localPath = fileServe' filePathStrict (guessContentTypeM mimeTypes) (ixFiles ++ defaultIxFiles) localPath
    +
    +-- * Index
    +
    +doIndex :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    +        => [String]
    +        -> MimeMap
    +        -> String
    +        -> m Response
    +doIndex ixFiles mimeMap localPath = doIndex' filePathSendFile (guessContentTypeM mimeMap) ixFiles localPath
    +
    +doIndexLazy :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    +        => [String]
    +        -> MimeMap
    +        -> String
    +        -> m Response
    +doIndexLazy ixFiles mimeMap localPath = doIndex' filePathLazy (guessContentTypeM mimeMap) ixFiles localPath
    +
    +doIndexStrict :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    +        => [String]
    +        -> MimeMap
    +        -> String
    +        -> m Response
    +doIndexStrict ixFiles mimeMap localPath = doIndex' filePathStrict (guessContentTypeM mimeMap) ixFiles localPath
    +
    +doIndex' :: (ServerMonad m, FilterMonad Response m, MonadIO m, MonadPlus m)
    +        => (String -> FilePath -> m Response)
    +        -> (FilePath -> m String)
    +        -> [String]
    +        -> String
    +        -> m Response
    +doIndex' _serveFn _mime  []          _fp = forbidden $ toResponse "Directory index forbidden"
    +doIndex'  serveFn mimeFn (index:rest) fp =
    +    do let path = fp </> index
    +       fe <- liftIO $ doesFileExist path
    +       if fe 
    +          then serveFileUsing serveFn mimeFn path 
    +          else doIndex' serveFn mimeFn rest fp
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Handler.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Handler.html 1 + + + + +src/Happstack/Server/HTTP/Handler.hs + + + +
    {-# LANGUAGE ScopedTypeVariables, PatternSignatures #-}
    +
    +module Happstack.Server.HTTP.Handler(request-- version,required
    +  ,parseResponse,putRequest
    +-- ,unchunkBody,val,testChunk,pack
    +) where
    +--    ,fsepC,crlfC,pversion
    +import qualified Paths_happstack_server as Paths
    +import qualified Data.Version as DV
    +import Control.Exception.Extensible as E
    +import Control.Monad
    +import Data.List(elemIndex)
    +import Data.Char(toLower)
    +import Data.Maybe ( fromMaybe, fromJust, isJust, isNothing )
    +import Prelude hiding (last)
    +import qualified Data.List as List
    +import qualified Data.ByteString.Char8 as P
    +import qualified Data.ByteString.Char8 as B
    +import qualified Data.ByteString.Lazy.Char8 as L
    +import qualified Data.ByteString.Lazy.Internal as L
    +import qualified Data.ByteString.Internal as S
    +import qualified Data.ByteString.Unsafe as S
    +import qualified Data.ByteString as S
    +import System.IO.Unsafe
    +import qualified Data.Map as M
    +import System.IO
    +import Numeric
    +import Data.Int (Int64)
    +import Happstack.Server.Cookie
    +import Happstack.Server.HTTP.Clock
    +import Happstack.Server.HTTP.Types
    +import Happstack.Server.HTTP.Multipart
    +import Happstack.Server.HTTP.RFC822Headers
    +import Happstack.Server.MessageWrap
    +import Happstack.Server.SURI(SURI(..),path,query)
    +import Happstack.Server.SURI.ParseURI
    +import Happstack.Util.TimeOut
    +import Happstack.Util.LogFormat (formatRequestCombined)
    +import Data.Time.Clock (getCurrentTime)
    +import Network.Socket.SendFile (unsafeSendFile')
    +import System.Log.Logger (Priority(..), logM)
    +
    +
    +hGetContentsN :: Int -> Handle -> IO L.ByteString
    +hGetContentsN k h = lazyRead -- TODO close on exceptions
    +  where
    +    lazyRead = unsafeInterleaveIO loop
    +
    +    loop = do
    +        c <- S.hGetNonBlocking h k
    +        if S.null c
    +          then do eof <- hIsEOF h
    +                  if eof then hClose h >> return L.Empty
    +                         else hWaitForInput h (-1)
    +                            >> loop
    +
    +          --then hClose h >> return Empty
    +          else do cs <- lazyRead
    +                  return (L.Chunk c cs)
    +
    +hGetContents' :: Handle -> IO L.ByteString
    +hGetContents' = hGetContentsN L.defaultChunkSize
    +
    +request :: Conf -> Handle -> Host -> (Request -> IO Response) -> IO ()
    +request conf h host handler = rloop conf h host handler =<< hGetContents' h
    +
    +required :: String -> Maybe a -> Either String a
    +required err Nothing  = Left err
    +required _   (Just a) = Right a
    +
    +transferEncodingC :: [Char]
    +transferEncodingC = "transfer-encoding"
    +rloop :: t
    +         -> Handle
    +         -> Host
    +         -> (Request -> IO Response)
    +         -> L.ByteString
    +         -> IO ()
    +rloop conf h host handler inputStr
    +    | L.null inputStr = return ()
    +    | otherwise
    +    = join $ withTimeOut (30 * second) $
    +      do let parseRequest
    +                 = do
    +                      (topStr, restStr) <- required "failed to separate request" $ splitAtEmptyLine inputStr
    +                      (rql, headerStr) <- required "failed to separate headers/body" $ splitAtCRLF topStr
    +                      let (m,u,v) = requestLine rql
    +                      headers' <- parseHeaders "host" (L.unpack headerStr)
    +                      let headers = mkHeaders headers'
    +                      let contentLength = fromMaybe 0 $ fmap fst (P.readInt =<< getHeaderUnsafe contentlengthC headers)
    +                      (body, nextRequest) <- case () of
    +                          () | contentLength < 0               -> fail "negative content-length"
    +                             | isJust $ getHeader transferEncodingC headers ->
    +                                 return $ consumeChunks restStr
    +                             | otherwise                       -> return (L.splitAt (fromIntegral contentLength) restStr)
    +                      let cookies = [ (cookieName c, c) | cl <- fromMaybe [] (fmap getCookies (getHeader "Cookie" headers)), c <- cl ] -- Ugle
    +                          rqTmp = Request m (pathEls (path u)) (path u) (query u)
    +                                  [] cookies v headers (Body body) host
    +                          rq = rqTmp{rqInputs = queryInput u ++ bodyInput rqTmp}
    +                      return (rq, nextRequest)
    +         case parseRequest of
    +           Left err -> error $ "failed to parse HTTP request: " ++ err
    +           Right (req, rest)
    +               -> return $
    +                  do let ioseq act = act >>= \x -> x `seq` return x
    +                     res <- ioseq (handler req) `E.catch` \(e::E.SomeException) -> return $ result 500 $ "Server error: " ++ show e
    +
    +                     -- combined log format
    +                     time <- getCurrentTime
    +                     let host' = fst host
    +                         user = "-"
    +                         requestLn = unwords [show $ rqMethod req, rqUri req, show $ rqVersion req]
    +                         responseCode = rsCode res
    +                         size = maybe (-1) (read . B.unpack) (getHeader "Content-Length" res) -- -1 indicates unknown size
    +                         referer = B.unpack $ fromMaybe (B.pack "") $ getHeader "Referer" req
    +                         userAgent = B.unpack $ fromMaybe (B.pack "") $ getHeader "User-Agent" req
    +                     logM "Happstack.Server.AccessLog.Combined" INFO $ formatRequestCombined host' user time requestLn responseCode size referer userAgent
    +
    +                     putAugmentedResult h req res
    +                     when (continueHTTP req res) $ rloop conf h host handler rest
    +
    +-- | Unserializes the bytestring into a response.  If there is an
    +-- error it will return @Left msg@.
    +parseResponse :: L.ByteString -> Either String Response
    +parseResponse inputStr =
    +    do (topStr,restStr) <- required "failed to separate response" $
    +                           splitAtEmptyLine inputStr
    +       (rsl,headerStr) <- required "failed to separate headers/body" $
    +                          splitAtCRLF topStr
    +       let (_,code) = responseLine rsl
    +       headers' <- parseHeaders "host" (L.unpack headerStr)
    +       let headers = mkHeaders headers'
    +       let mbCL = fmap fst (B.readInt =<< getHeader "content-length" headers)
    +       (body,_) <-
    +           maybe (if (isNothing $ getHeader "transfer-encoding" headers)
    +                       then  return (restStr,L.pack "")
    +                       else  return $ consumeChunks restStr)
    +                 (\cl->return (L.splitAt (fromIntegral cl) restStr))
    +                 mbCL
    +       return $ Response {rsCode=code,rsHeaders=headers,rsBody=body,rsFlags=RsFlags True,rsValidator=Nothing}
    +
    +-- http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html
    +-- note this does NOT handle extenions
    +consumeChunks::L.ByteString->(L.ByteString,L.ByteString)
    +consumeChunks str = let (parts,tr,rest) = consumeChunksImpl str in (L.concat . (++ [tr]) .map snd $ parts,rest)
    +
    +consumeChunksImpl :: L.ByteString -> ([(Int64, L.ByteString)], L.ByteString, L.ByteString)
    +consumeChunksImpl str
    +    | L.null str = ([],L.empty,str)
    +    | chunkLen == 0 = let (last,rest') = L.splitAt lenLine1 str
    +                          (tr',rest'') = getTrailer rest'
    +                      in ([(0,last)],tr',rest'')
    +    | otherwise = ((chunkLen,part):crest,tr,rest2)
    +    where
    +      line1 = head $ lazylines str
    +      lenLine1 = (L.length line1) + 1 -- endchar
    +      chunkLen = (fst $ head $ readHex $ L.unpack line1)
    +      len = chunkLen + lenLine1 + 2
    +      (part,rest) = L.splitAt len str
    +      (crest,tr,rest2) = consumeChunksImpl rest
    +      getTrailer s = L.splitAt index s
    +          where index | crlfLC `L.isPrefixOf` s = 2
    +                      | otherwise = let iscrlf = L.zipWith (\a b -> a == '\r' && b == '\n') s . L.tail $ s
    +                                        Just i = elemIndex True $ zipWith (&&) iscrlf (tail (tail iscrlf))
    +                                    in fromIntegral $ i+4
    +
    +crlfLC :: L.ByteString
    +crlfLC = L.pack "\r\n"
    +
    +-- Properly lazy version of 'lines' for lazy bytestrings
    +lazylines           :: L.ByteString -> [L.ByteString]
    +lazylines s
    +    | L.null s  = []
    +    | otherwise =
    +        let (l,s') = L.break ((==) '\n') s
    +        in l : if L.null s' then []
    +                            else lazylines (L.tail s')
    +
    +requestLine :: L.ByteString -> (Method, SURI, Version)
    +requestLine l = case P.words ((P.concat . L.toChunks) l) of
    +                  [rq,uri,ver] -> (method rq, SURI $ parseURIRef uri, version ver)
    +                  [rq,uri] -> (method rq, SURI $ parseURIRef uri,Version 0 9)
    +                  x -> error $ "requestLine cannot handle input:  " ++ (show x)
    +
    +responseLine :: L.ByteString -> (B.ByteString, Int)
    +responseLine l = case B.words ((B.concat . L.toChunks) l) of
    +                   (v:c:_) -> version v `seq` (v,fst (fromJust (B.readInt c)))
    +                   x -> error $ "responseLine cannot handle input: " ++ (show x)
    +
    +
    +method :: B.ByteString -> Method
    +method r = fj $ lookup r mtable
    +    where fj (Just x) = x
    +          fj Nothing  = error "invalid request method"
    +          mtable = [(P.pack "GET",     GET),
    +                    (P.pack "HEAD",    HEAD),
    +                    (P.pack "POST",    POST),
    +                    (P.pack "PUT",     PUT),
    +                    (P.pack "DELETE",  DELETE),
    +                    (P.pack "TRACE",   TRACE),
    +                    (P.pack "OPTIONS", OPTIONS),
    +                    (P.pack "CONNECT", CONNECT)]
    +
    +-- Result side
    +
    +staticHeaders :: Headers
    +staticHeaders =
    +    foldr (uncurry setHeaderBS) (mkHeaders [])
    +    [ (serverC, happsC), (contentTypeC, textHtmlC) ]
    +
    +-- FIXME: we should not be controlling the response headers in mysterious ways in this low level code
    +-- headers should be set by application code and the core http engine should be very lean.
    +putAugmentedResult :: Handle -> Request -> Response -> IO ()
    +putAugmentedResult outp req res = do
    +    case res of
    +        -- standard bytestring response
    +        Response {} -> do
    +            sendTop (fromIntegral (L.length (rsBody res)))
    +            when (rqMethod req /= HEAD) (L.hPut outp $ rsBody res)
    +        -- zero-copy sendfile response
    +        -- the handle *should* be closed by the garbage collector
    +        SendFile {} -> do
    +            let infp = sfFilePath res
    +                off = sfOffset res
    +                count = sfCount res
    +            sendTop count
    +            unsafeSendFile' outp infp off count
    +    hFlush outp
    +    where ph (HeaderPair k vs) = map (\v -> P.concat [k, fsepC, v, crlfC]) vs
    +          sendTop cl = do
    +              allHeaders <- augmentHeaders req res cl
    +              mapM_ (P.hPut outp) $ concat
    +                [ (pversion $ rqVersion req)          -- Print HTTP version
    +                , [responseMessage $ rsCode res]      -- Print responseCode
    +                , concatMap ph (M.elems allHeaders)   -- Print all headers
    +                , [crlfC]
    +                ]
    +
    +augmentHeaders :: Request -> Response -> Integer -> IO Headers
    +augmentHeaders req res cl = do
    +    -- TODO: Hoist static headers to the toplevel.
    +    raw <- getApproximateTime
    +    let stdHeaders = staticHeaders `M.union`
    +          M.fromList ( [ (dateCLower,       HeaderPair dateC [raw])
    +                       , (connectionCLower, HeaderPair connectionC [if continueHTTP req res then keepAliveC else closeC])
    +                       ] ++ if rsfContentLength (rsFlags res)
    +                              then [(contentlengthC, HeaderPair contentLengthC [P.pack (show cl)])]
    +                              else [] )
    +    return (rsHeaders res `M.union` stdHeaders) -- 'union' prefers 'headers res' when duplicate keys are encountered.
    +
    +-- | Serializes the request to the given handle
    +putRequest :: Handle -> Request -> IO ()
    +putRequest h rq = do
    +    let put = B.hPut h
    +        ph (HeaderPair k vs) = map (\v -> B.concat [k, fsepC, v, crlfC]) vs
    +        sp = [B.pack " "]
    +    mapM_ put $ concat
    +      [[B.pack $ show $ rqMethod rq],sp
    +      ,[B.pack $ rqURL rq],sp
    +      ,(pversion $ rqVersion rq), [crlfC]
    +      ,concatMap ph (M.elems $ rqHeaders rq)
    +      ,[crlfC]
    +      ]
    +    let Body body = rqBody rq
    +    L.hPut h  body
    +    hFlush h
    +
    +
    +
    +-- Version
    +
    +pversion :: Version -> [B.ByteString]
    +pversion (Version 1 1) = [http11]
    +pversion (Version 1 0) = [http10]
    +pversion (Version x y) = [P.pack "HTTP/", P.pack (show x), P.pack ".", P.pack (show y)]
    +
    +version :: B.ByteString -> Version
    +version x | x == http09 = Version 0 9
    +          | x == http10 = Version 1 0
    +          | x == http11 = Version 1 1
    +          | otherwise   = error "Invalid HTTP version"
    +
    +http09 :: B.ByteString
    +http09 = P.pack "HTTP/0.9"
    +http10 :: B.ByteString
    +http10 = P.pack "HTTP/1.0"
    +http11 :: B.ByteString
    +http11 = P.pack "HTTP/1.1"
    +
    +-- Constants
    +
    +connectionC :: B.ByteString
    +connectionC      = P.pack "Connection"
    +connectionCLower :: B.ByteString
    +connectionCLower = P.map toLower connectionC
    +closeC :: B.ByteString
    +closeC           = P.pack "close"
    +keepAliveC :: B.ByteString
    +keepAliveC       = P.pack "Keep-Alive"
    +crlfC :: B.ByteString
    +crlfC            = P.pack "\r\n"
    +fsepC :: B.ByteString
    +fsepC            = P.pack ": "
    +contentTypeC :: B.ByteString
    +contentTypeC     = P.pack "Content-Type"
    +contentLengthC :: B.ByteString
    +contentLengthC   = P.pack "Content-Length"
    +contentlengthC :: B.ByteString
    +contentlengthC   = P.pack "content-length"
    +dateC :: B.ByteString
    +dateC            = P.pack "Date"
    +dateCLower :: B.ByteString
    +dateCLower       = P.map toLower dateC
    +serverC :: B.ByteString
    +serverC          = P.pack "Server"
    +happsC :: B.ByteString
    +happsC           = P.pack $ "Happstack/" ++ DV.showVersion Paths.version
    +textHtmlC :: B.ByteString
    +textHtmlC        = P.pack "text/html; charset=utf-8"
    +
    +-- Response code names
    +
    +responseMessage :: (Num t) => t -> B.ByteString
    +responseMessage 100 = P.pack " 100 Continue\r\n"
    +responseMessage 101 = P.pack " 101 Switching Protocols\r\n"
    +responseMessage 200 = P.pack " 200 OK\r\n"
    +responseMessage 201 = P.pack " 201 Created\r\n"
    +responseMessage 202 = P.pack " 202 Accepted\r\n"
    +responseMessage 203 = P.pack " 203 Non-Authoritative Information\r\n"
    +responseMessage 204 = P.pack " 204 No Content\r\n"
    +responseMessage 205 = P.pack " 205 Reset Content\r\n"
    +responseMessage 206 = P.pack " 206 Partial Content\r\n"
    +responseMessage 300 = P.pack " 300 Multiple Choices\r\n"
    +responseMessage 301 = P.pack " 301 Moved Permanently\r\n"
    +responseMessage 302 = P.pack " 302 Found\r\n"
    +responseMessage 303 = P.pack " 303 See Other\r\n"
    +responseMessage 304 = P.pack " 304 Not Modified\r\n"
    +responseMessage 305 = P.pack " 305 Use Proxy\r\n"
    +responseMessage 307 = P.pack " 307 Temporary Redirect\r\n"
    +responseMessage 400 = P.pack " 400 Bad Request\r\n"
    +responseMessage 401 = P.pack " 401 Unauthorized\r\n"
    +responseMessage 402 = P.pack " 402 Payment Required\r\n"
    +responseMessage 403 = P.pack " 403 Forbidden\r\n"
    +responseMessage 404 = P.pack " 404 Not Found\r\n"
    +responseMessage 405 = P.pack " 405 Method Not Allowed\r\n"
    +responseMessage 406 = P.pack " 406 Not Acceptable\r\n"
    +responseMessage 407 = P.pack " 407 Proxy Authentication Required\r\n"
    +responseMessage 408 = P.pack " 408 Request Time-out\r\n"
    +responseMessage 409 = P.pack " 409 Conflict\r\n"
    +responseMessage 410 = P.pack " 410 Gone\r\n"
    +responseMessage 411 = P.pack " 411 Length Required\r\n"
    +responseMessage 412 = P.pack " 412 Precondition Failed\r\n"
    +responseMessage 413 = P.pack " 413 Request Entity Too Large\r\n"
    +responseMessage 414 = P.pack " 414 Request-URI Too Large\r\n"
    +responseMessage 415 = P.pack " 415 Unsupported Media Type\r\n"
    +responseMessage 416 = P.pack " 416 Requested range not satisfiable\r\n"
    +responseMessage 417 = P.pack " 417 Expectation Failed\r\n"
    +responseMessage 500 = P.pack " 500 Internal Server Error\r\n"
    +responseMessage 501 = P.pack " 501 Not Implemented\r\n"
    +responseMessage 502 = P.pack " 502 Bad Gateway\r\n"
    +responseMessage 503 = P.pack " 503 Service Unavailable\r\n"
    +responseMessage 504 = P.pack " 504 Gateway Time-out\r\n"
    +responseMessage 505 = P.pack " 505 HTTP Version not supported\r\n"
    +responseMessage x   = P.pack (show x ++ "\r\n")
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-LazyLiner.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-LazyLiner.html 1 + + + + +src/Happstack/Server/HTTP/LazyLiner.hs + + + +
    {-# LANGUAGE ForeignFunctionInterface #-}
    +module Happstack.Server.HTTP.LazyLiner
    +    (Lazy, newLinerHandle, headerLines, getBytes, getBytesStrict, getRest, L.toChunks
    +    ) where
    +
    +import Control.Concurrent.MVar
    +import System.IO
    +import qualified Data.ByteString.Char8 as P
    +import qualified Data.ByteString.Lazy.Char8 as L
    +
    +newtype Lazy = Lazy (MVar L.ByteString)
    +
    +newLinerHandle :: Handle -> IO Lazy
    +newLinerHandle h = fmap Lazy (newMVar =<< L.hGetContents h)
    +
    +headerLines :: Lazy -> IO [P.ByteString]
    +headerLines (Lazy mv) = modifyMVar mv $ \l -> do
    +  let loop acc r0 = let (h,r) = L.break ((==) ch) r0
    +                        ph    = toStrict h
    +                        phl   = P.length ph
    +                        ph2   = if phl == 0 || P.last ph /= '\x0D' then ph else P.init ph
    +                        ch    = '\x0A'
    +                        r'    = if L.null r then r else L.tail r
    +                    in if P.length ph2 == 0 then (r', reverse acc) else loop (ph2:acc) r'
    +  return $ loop [] l
    +
    +getBytesStrict :: Lazy -> Int -> IO P.ByteString
    +getBytesStrict (Lazy mv) len = modifyMVar mv $ \l -> do
    +  let (h,p) = L.splitAt (fromIntegral len) l
    +  return (p, toStrict h)
    +
    +getBytes :: Lazy -> Int -> IO L.ByteString
    +getBytes (Lazy mv) len = modifyMVar mv $ \l -> do
    +  let (h,p) = L.splitAt (fromIntegral len) l
    +  return (p, h)
    +
    +getRest :: Lazy -> IO L.ByteString
    +getRest (Lazy mv) = modifyMVar mv $ \l -> return (L.empty, l)
    +
    +toStrict :: L.ByteString -> P.ByteString
    +toStrict = P.concat . L.toChunks
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Listen.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Listen.html 1 + + + + +src/Happstack/Server/HTTP/Listen.hs + + + +
    {-# LANGUAGE CPP, ScopedTypeVariables, PatternSignatures #-}
    +module Happstack.Server.HTTP.Listen(listen, listen',listenOn) where
    +
    +import Happstack.Server.HTTP.Types
    +import Happstack.Server.HTTP.Handler
    +import Happstack.Server.HTTP.Socket (acceptLite)
    +import Control.Exception.Extensible as E
    +import Control.Concurrent
    +import Network.BSD (getProtocolNumber)
    +import Network(sClose, Socket)
    +import Network.Socket as Socket (SocketOption(KeepAlive), setSocketOption, 
    +                                 socket, Family(..), SockAddr, 
    +                                 SocketOption(..), SockAddr(..), 
    +                                 iNADDR_ANY, maxListenQueue, SocketType(..), 
    +                                 bindSocket)
    +import qualified Network.Socket as Socket (listen)
    +import System.IO
    +{-
    +#ifndef mingw32_HOST_OS
    +-}
    +import System.Posix.Signals
    +{-
    +#endif
    +-}
    +import System.Log.Logger (Priority(..), logM)
    +log':: Priority -> String -> IO ()
    +log' = logM "Happstack.Server.HTTP.Listen"
    +
    +
    +{-
    +   Network.listenOn binds randomly to IPv4 or IPv6 or both,
    +   depending on system and local settings.
    +   Lets make it use IPv4 only for now.
    +-}
    +
    +listenOn :: Int -> IO Socket
    +listenOn portm = do
    +    proto <- getProtocolNumber "tcp"
    +    E.bracketOnError
    +        (socket AF_INET Stream proto)
    +        (sClose)
    +        (\sock -> do
    +            setSocketOption sock ReuseAddr 1
    +            bindSocket sock (SockAddrInet (fromIntegral portm) iNADDR_ANY)
    +            Socket.listen sock maxListenQueue
    +            return sock
    +        )
    +
    +
    +-- | Bind and listen port
    +listen :: Conf -> (Request -> IO Response) -> IO ()
    +listen conf hand = do
    +    let port' = port conf
    +    socketm <- listenOn port'
    +    setSocketOption socketm KeepAlive 1
    +    listen' socketm conf hand
    +
    +-- | Use a previously bind port and listen
    +listen' :: Socket -> Conf -> (Request -> IO Response) -> IO ()
    +listen' s conf hand = do
    +{-
    +#ifndef mingw32_HOST_OS
    +-}
    +  installHandler openEndedPipe Ignore Nothing
    +{-
    +#endif
    +-}
    +  let port' = port conf
    +  log' NOTICE ("Listening on port " ++ show port')
    +  let work (h,hn,p) = do -- hSetBuffering h NoBuffering
    +                         let eh (x::SomeException) = log' ERROR ("HTTP request failed with: "++show x)
    +                         request conf h (hn,fromIntegral p) hand `E.catch` eh
    +                         hClose h
    +  let loop = do acceptLite s >>= forkIO . work
    +                loop
    +  let pe e = log' ERROR ("ERROR in accept thread: "++
    +                                                    show e)
    +  let infi = loop `catchSome` pe >> infi -- loop `E.catch` pe >> infi
    +  infi `finally` sClose s
    +{--
    +#ifndef mingw32_HOST_OS
    +-}
    +  installHandler openEndedPipe Ignore Nothing
    +  return ()
    +{-
    +#endif
    +-}
    +  where  -- why are these handlers needed?
    +
    +    catchSome op h = op `E.catches` [
    +            Handler $ \(e :: ArithException) -> h (toException e),
    +            Handler $ \(e :: ArrayException) -> h (toException e)
    +          ]
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-LowLevel.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-LowLevel.html 1 + + + + +src/Happstack/Server/HTTP/LowLevel.hs + + + +
    module Happstack.Server.HTTP.LowLevel
    +    (-- * HTTP Implementation
    +     -- $impl
    +
    +     -- * Problems
    +     -- $problems
    +
    +     -- * API
    +     module Happstack.Server.HTTP.Handler,
    +     module Happstack.Server.HTTP.Listen,
    +     module Happstack.Server.HTTP.Types
    +    ) where
    +
    +import Happstack.Server.HTTP.Handler
    +import Happstack.Server.HTTP.Listen
    +import Happstack.Server.HTTP.Types
    +
    +-- $impl
    +-- The Happstack HTTP implementation supports HTTP 1.0 and 1.1.
    +-- Multiple request on a connection including pipelining is supported.
    +
    +-- $problems
    +-- Currently if a client sends an invalid HTTP request the whole
    +-- connection is aborted and no further processing is done.
    +--
    +-- When the connection times out Happstack closes it. In future it could
    +-- send a 408 response but this may be problematic if the sending
    +-- of a response caused the problem.
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Multipart.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Multipart.html 1 + + + + +src/Happstack/Server/HTTP/Multipart.hs + + + +
    -- #hide
    +
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Server.HTTP.Multipart
    +-- Copyright   :  (c) Peter Thiemann 2001,2002
    +--                (c) Bjorn Bringert 2005-2006
    +--                (c) Lemmih 2007
    +-- License     :  BSD-style
    +--
    +-- Maintainer  :  lemmih@vo.com
    +-- Stability   :  experimental
    +-- Portability :  xbnon-portable
    +--
    +-- Parsing of the multipart format from RFC2046.
    +-- Partly based on code from WASHMail.
    +--
    +-----------------------------------------------------------------------------
    +module Happstack.Server.HTTP.Multipart
    +    (
    +     -- * Multi-part messages
    +     MultiPart(..), BodyPart(..), Header
    +    , parseMultipartBody, hGetMultipartBody
    +     -- * Headers
    +    , ContentType(..), ContentTransferEncoding(..)
    +    , ContentDisposition(..)
    +    , parseContentType
    +    , parseContentTransferEncoding
    +    , parseContentDisposition
    +    , getContentType
    +    , getContentTransferEncoding
    +    , getContentDisposition
    +
    +    , splitAtEmptyLine
    +    , splitAtCRLF
    +    ) where
    +
    +import Control.Monad
    +import Data.Int (Int64)
    +import Data.Maybe
    +import System.IO (Handle)
    +
    +import Happstack.Server.HTTP.RFC822Headers
    +
    +import qualified Data.ByteString.Lazy.Char8 as BS
    +import Data.ByteString.Lazy.Char8 (ByteString)
    +
    +--
    +-- * Multi-part stuff.
    +--
    +
    +data MultiPart = MultiPart [BodyPart]
    +               deriving (Show, Read, Eq, Ord)
    +
    +data BodyPart = BodyPart [Header] ByteString
    +                deriving (Show, Read, Eq, Ord)
    +
    +-- | Read a multi-part message from a 'ByteString'.
    +parseMultipartBody :: String -- ^ Boundary
    +                   -> ByteString -> Maybe MultiPart
    +parseMultipartBody b s = 
    +    do
    +    ps <- splitParts (BS.pack b) s
    +    liftM MultiPart $ mapM parseBodyPart ps
    +
    +-- | Read a multi-part message from a 'Handle'.
    +--   Fails on parse errors.
    +hGetMultipartBody :: String -- ^ Boundary
    +                  -> Handle
    +                  -> IO MultiPart
    +hGetMultipartBody b h = 
    +    do
    +    s <- BS.hGetContents h
    +    case parseMultipartBody b s of
    +        Nothing -> fail "Error parsing multi-part message"
    +        Just m  -> return m
    +
    +
    +
    +parseBodyPart :: ByteString -> Maybe BodyPart
    +parseBodyPart s =
    +    do
    +    (hdr,bdy) <- splitAtEmptyLine s
    +    hs <- parseM pHeaders "<input>" (BS.unpack hdr)
    +    return $ BodyPart hs bdy
    +
    +--
    +-- * Splitting into multipart parts.
    +--
    +
    +-- | Split a multipart message into the multipart parts.
    +splitParts :: ByteString -- ^ The boundary, without the initial dashes
    +           -> ByteString 
    +           -> Maybe [ByteString]
    +splitParts b s = dropPreamble b s >>= spl
    +  where
    +  spl x = case splitAtBoundary b x of
    +            Nothing -> Nothing
    +            Just (s1,d,s2) | isClose b d -> Just [s1]
    +                           | otherwise -> spl s2 >>= Just . (s1:)
    +
    +-- | Drop everything up to and including the first line starting 
    +--   with the boundary. Returns 'Nothing' if there is no 
    +--   line starting with a boundary.
    +dropPreamble :: ByteString -- ^ The boundary, without the initial dashes
    +             -> ByteString 
    +             -> Maybe ByteString
    +dropPreamble b s | isBoundary b s = fmap snd (splitAtCRLF s)
    +                 | otherwise = dropLine s >>= dropPreamble b
    +
    +-- | Split a string at the first boundary line.
    +splitAtBoundary :: ByteString -- ^ The boundary, without the initial dashes
    +                -> ByteString -- ^ String to split.
    +                -> Maybe (ByteString,ByteString,ByteString)
    +                   -- ^ The part before the boundary, the boundary line,
    +                   --   and the part after the boundary line. The CRLF
    +                   --   before and the CRLF (if any) after the boundary line
    +                   --   are not included in any of the strings returned.
    +                   --   Returns 'Nothing' if there is no boundary.
    +splitAtBoundary b s = spl 0
    +  where
    +  spl i = case findCRLF (BS.drop i s) of
    +              Nothing -> Nothing
    +              Just (j,l) | isBoundary b s2 -> Just (s1,d,s3)
    +                         | otherwise -> spl (i+j+l)
    +                  where 
    +                  s1 = BS.take (i+j) s
    +                  s2 = BS.drop (i+j+l) s
    +                  (d,s3) = splitAtCRLF_ s2
    +
    +-- | Check whether a string starts with two dashes followed by
    +--   the given boundary string.
    +isBoundary :: ByteString -- ^ The boundary, without the initial dashes
    +           -> ByteString
    +           -> Bool
    +isBoundary b s = startsWithDashes s && b `BS.isPrefixOf` BS.drop 2 s
    +
    +-- | Check whether a string for which 'isBoundary' returns true
    +--   has two dashes after the boudary string.
    +isClose :: ByteString -- ^ The boundary, without the initial dashes
    +        -> ByteString 
    +        -> Bool
    +isClose b = startsWithDashes . BS.drop (2+BS.length b)
    +
    +-- | Checks whether a string starts with two dashes.
    +startsWithDashes :: ByteString -> Bool
    +startsWithDashes s = BS.pack "--" `BS.isPrefixOf` s
    +
    +
    +--
    +-- * RFC 2046 CRLF
    +--
    +
    +-- | Drop everything up to and including the first CRLF.
    +dropLine :: ByteString -> Maybe ByteString
    +dropLine = fmap snd . splitAtCRLF
    +
    +-- | Split a string at the first empty line. The CRLF (if any) before the
    +--   empty line is included in the first result. The CRLF after the
    +--   empty line is not included in the result.
    +--   'Nothing' is returned if there is no empty line.
    +splitAtEmptyLine :: ByteString -> Maybe (ByteString, ByteString)
    +splitAtEmptyLine s | startsWithCRLF s = Just (BS.empty, dropCRLF s)
    +                   | otherwise = spl 0
    +  where
    +  spl i = case findCRLF (BS.drop i s) of
    +              Nothing -> Nothing
    +              Just (j,l) | startsWithCRLF s2 -> Just (s1, dropCRLF s2)
    +                         | otherwise -> spl (i+j+l)
    +                where (s1,s2) = BS.splitAt (i+j+l) s
    +
    +-- | Split a string at the first CRLF. The CRLF is not included
    +--   in any of the returned strings.
    +splitAtCRLF :: ByteString -- ^ String to split.
    +            -> Maybe (ByteString,ByteString)
    +            -- ^  Returns 'Nothing' if there is no CRLF.
    +splitAtCRLF s = case findCRLF s of
    +                  Nothing -> Nothing
    +                  Just (i,l) -> Just (s1, BS.drop l s2)
    +                      where (s1,s2) = BS.splitAt i s
    +
    +-- | Like 'splitAtCRLF', but if no CRLF is found, the first
    +--   result is the argument string, and the second result is empty.
    +splitAtCRLF_ :: ByteString -> (ByteString,ByteString)
    +splitAtCRLF_ s = fromMaybe (s,BS.empty) (splitAtCRLF s)
    +
    +-- | Get the index and length of the first CRLF, if any.
    +findCRLF :: ByteString -- ^ String to split.
    +         -> Maybe (Int64,Int64)
    +findCRLF s = 
    +    case findCRorLF s of
    +              Nothing -> Nothing
    +              Just j | BS.null (BS.drop (j+1) s) -> Just (j,1)
    +              Just j -> case (BS.index s j, BS.index s (j+1)) of
    +                           ('\n','\r') -> Just (j,2)
    +                           ('\r','\n') -> Just (j,2)
    +                           _           -> Just (j,1)
    +
    +findCRorLF :: ByteString -> Maybe Int64
    +findCRorLF = BS.findIndex (\c -> c == '\n' || c == '\r')
    +
    +startsWithCRLF :: ByteString -> Bool
    +startsWithCRLF s = not (BS.null s) && (c == '\n' || c == '\r')
    +  where c = BS.index s 0
    +
    +-- | Drop an initial CRLF, if any. If the string is empty, 
    +--   nothing is done. If the string does not start with CRLF,
    +--   the first character is dropped.
    +dropCRLF :: ByteString -> ByteString
    +dropCRLF s | BS.null s = BS.empty
    +           | BS.null (BS.drop 1 s) = BS.empty
    +           | c0 == '\n' && c1 == '\r' = BS.drop 2 s
    +           | c0 == '\r' && c1 == '\n' = BS.drop 2 s
    +           | otherwise = BS.drop 1 s
    +  where c0 = BS.index s 0
    +        c1 = BS.index s 1
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-RFC822Headers.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-RFC822Headers.html 1 + + + + +src/Happstack/Server/HTTP/RFC822Headers.hs + + + +
    -- #hide
    +
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Network.CGI.RFC822Headers
    +-- Copyright   :  (c) Peter Thiemann 2001,2002
    +--                (c) Bjorn Bringert 2005-2006
    +--                (c) Lemmih 2007
    +-- License     :  BSD-style
    +--
    +-- Maintainer  :  lemmih@vo.com
    +-- Stability   :  experimental
    +-- Portability :  portable
    +--
    +-- Parsing of RFC822-style headers (name, value pairs)
    +-- Partly based on code from WASHMail.
    +--
    +-----------------------------------------------------------------------------
    +module Happstack.Server.HTTP.RFC822Headers
    +    ( -- * Headers
    +      Header, 
    +      pHeader,
    +      pHeaders,
    +      parseHeaders,
    +
    +      -- * Content-type
    +      ContentType(..), 
    +      getContentType,
    +      parseContentType,
    +      showContentType,
    +
    +      -- * Content-transfer-encoding
    +      ContentTransferEncoding(..),
    +      getContentTransferEncoding,
    +      parseContentTransferEncoding,
    +
    +      -- * Content-disposition
    +      ContentDisposition(..),
    +      getContentDisposition,                           
    +      parseContentDisposition,
    +                              
    +      -- * Utilities
    +      parseM
    +      ) where
    +
    +import Data.Char
    +import Data.List
    +import Text.ParserCombinators.Parsec
    +
    +type Header = (String, String)
    +
    +pHeaders :: Parser [Header]
    +pHeaders = many pHeader
    +
    +parseHeaders :: Monad m => SourceName -> String -> m [Header]
    +parseHeaders = parseM pHeaders
    +
    +pHeader :: Parser Header
    +pHeader = 
    +    do name <- many1 headerNameChar
    +       char ':'
    +       many ws1
    +       line <- lineString
    +       crLf
    +       extraLines <- many extraFieldLine
    +       return (map toLower name, concat (line:extraLines))
    +
    +extraFieldLine :: Parser String
    +extraFieldLine = 
    +    do sp <- ws1
    +       line <- lineString
    +       crLf
    +       return (sp:line)
    +
    +--
    +-- * Parameters (for Content-type etc.)
    +--
    +
    +showParameters :: [(String,String)] -> String
    +showParameters = concatMap f
    +    where f (n,v) = "; " ++ n ++ "=\"" ++ concatMap esc v ++ "\""
    +          esc '\\' = "\\\\"
    +          esc '"'  = "\\\""
    +          esc c | c `elem` ['\\','"'] = '\\':[c]
    +                | otherwise = [c]
    +
    +p_parameter :: Parser (String,String)
    +p_parameter =
    +  do lexeme $ char ';'
    +     p_name <- lexeme $ p_token
    +     lexeme $ char '='
    +     -- Workaround for seemingly standardized web browser bug
    +     -- where nothing is escaped in the filename parameter
    +     -- of the content-disposition header in multipart/form-data
    +     let litStr = if p_name == "filename" 
    +                   then buggyLiteralString
    +                   else literalString
    +     p_value <- litStr <|> p_token
    +     return (map toLower p_name, p_value)
    +
    +
    +-- 
    +-- * Content type
    +--
    +
    +-- | A MIME media type value.
    +--   The 'Show' instance is derived automatically.
    +--   Use 'showContentType' to obtain the standard
    +--   string representation.
    +--   See <http://www.ietf.org/rfc/rfc2046.txt> for more
    +--   information about MIME media types.
    +data ContentType = 
    +	ContentType {
    +                     -- | The top-level media type, the general type
    +                     --   of the data. Common examples are
    +                     --   \"text\", \"image\", \"audio\", \"video\",
    +                     --   \"multipart\", and \"application\".
    +                     ctType :: String,
    +                     -- | The media subtype, the specific data format.
    +                     --   Examples include \"plain\", \"html\",
    +                     --   \"jpeg\", \"form-data\", etc.
    +                     ctSubtype :: String,
    +                     -- | Media type parameters. On common example is
    +                     --   the charset parameter for the \"text\" 
    +                     --   top-level type, e.g. @(\"charset\",\"ISO-8859-1\")@.
    +                     ctParameters :: [(String, String)]
    +                    }
    +    deriving (Show, Read, Eq, Ord)
    +
    +-- | Produce the standard string representation of a content-type,
    +--   e.g. \"text\/html; charset=ISO-8859-1\".
    +showContentType :: ContentType -> String
    +showContentType (ContentType x y ps) = x ++ "/" ++ y ++ showParameters ps
    +
    +pContentType :: Parser ContentType
    +pContentType = 
    +  do many ws1
    +     c_type <- p_token
    +     lexeme $ char '/'
    +     c_subtype <- lexeme $ p_token
    +     c_parameters <- many p_parameter
    +     return $ ContentType (map toLower c_type) (map toLower c_subtype) c_parameters
    +
    +-- | Parse the standard representation of a content-type.
    +--   If the input cannot be parsed, this function calls
    +--   'fail' with a (hopefully) informative error message.
    +parseContentType :: Monad m => String -> m ContentType
    +parseContentType = parseM pContentType "Content-type"
    +
    +getContentType :: Monad m => [Header] -> m ContentType
    +getContentType hs = lookupM "content-type" hs >>= parseContentType
    +
    +--
    +-- * Content transfer encoding
    +--
    +
    +data ContentTransferEncoding =
    +	ContentTransferEncoding String
    +    deriving (Show, Read, Eq, Ord)
    +
    +pContentTransferEncoding :: Parser ContentTransferEncoding
    +pContentTransferEncoding =
    +  do many ws1
    +     c_cte <- p_token
    +     return $ ContentTransferEncoding (map toLower c_cte)
    +
    +parseContentTransferEncoding :: Monad m => String -> m ContentTransferEncoding
    +parseContentTransferEncoding = 
    +    parseM pContentTransferEncoding "Content-transfer-encoding"
    +
    +getContentTransferEncoding :: Monad m => [Header] -> m ContentTransferEncoding
    +getContentTransferEncoding hs = 
    +    lookupM "content-transfer-encoding" hs >>= parseContentTransferEncoding
    +
    +--
    +-- * Content disposition
    +--
    +
    +data ContentDisposition =
    +	ContentDisposition String [(String, String)]
    +    deriving (Show, Read, Eq, Ord)
    +
    +pContentDisposition :: Parser ContentDisposition
    +pContentDisposition =
    +  do many ws1
    +     c_cd <- p_token
    +     c_parameters <- many p_parameter
    +     return $ ContentDisposition (map toLower c_cd) c_parameters
    +
    +parseContentDisposition :: Monad m => String -> m ContentDisposition
    +parseContentDisposition = parseM pContentDisposition "Content-disposition"
    +
    +getContentDisposition :: Monad m => [Header] -> m ContentDisposition
    +getContentDisposition hs = 
    +    lookupM "content-disposition" hs  >>= parseContentDisposition
    +
    +--
    +-- * Utilities
    +--
    +
    +parseM :: Monad m => Parser a -> SourceName -> String -> m a
    +parseM p n inp =
    +  case parse p n inp of
    +    Left e -> fail (show e)
    +    Right x -> return x
    +
    +lookupM :: (Monad m, Eq a, Show a) => a -> [(a,b)] -> m b
    +lookupM n = maybe (fail ("No such field: " ++ show n)) return . lookup n
    +
    +-- 
    +-- * Parsing utilities
    +--
    +
    +-- | RFC 822 LWSP-char
    +ws1 :: Parser Char
    +ws1 = oneOf " \t"
    +
    +lexeme :: Parser a -> Parser a
    +lexeme p = do x <- p; many ws1; return x
    +
    +-- | RFC 822 CRLF (but more permissive)
    +crLf :: Parser String
    +crLf = try (string "\n\r" <|> string "\r\n") <|> string "\n" <|> string "\r"
    +
    +-- | One line
    +lineString :: Parser String
    +lineString = many (noneOf "\n\r")
    +
    +literalString :: Parser String
    +literalString = do char '\"'
    +		   str <- many (noneOf "\"\\" <|> quoted_pair)
    +		   char '\"'
    +		   return str
    +
    +-- No web browsers seem to implement RFC 2046 correctly,
    +-- since they do not escape double quotes and backslashes
    +-- in the filename parameter in multipart/form-data.
    +--
    +-- Note that this eats everything until the last double quote on the line.
    +buggyLiteralString :: Parser String
    +buggyLiteralString = 
    +    do char '\"'
    +       str <- manyTill anyChar (try lastQuote)
    +       return str
    +  where lastQuote = do char '\"' 
    +                       notFollowedBy (try (many (noneOf "\"") >> char '\"'))
    +
    +headerNameChar :: Parser Char
    +headerNameChar = noneOf "\n\r:"
    +
    +especials, tokenchar :: [Char]
    +especials = "()<>@,;:\\\"/[]?.="
    +tokenchar = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" \\ especials
    +
    +p_token :: Parser String
    +p_token = many1 (oneOf tokenchar)
    +
    +text_chars :: [Char]
    +text_chars = map chr ([1..9] ++ [11,12] ++ [14..127])
    +
    +p_text :: Parser Char
    +p_text = oneOf text_chars
    +
    +quoted_pair :: Parser Char
    +quoted_pair = do char '\\'
    +		 p_text
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Socket.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Socket.html 1 + + + + +src/Happstack/Server/HTTP/Socket.hs + + + +
    {-# LANGUAGE TemplateHaskell #-}
    +module Happstack.Server.HTTP.Socket(acceptLite) where
    +
    +import Happstack.Server.HTTP.SocketTH(supportsIPv6)
    +import Language.Haskell.TH.Syntax
    +import Happstack.Util.HostAddress
    +import qualified Network as N
    +  ( PortID(PortNumber)
    +  , socketPort
    +  )
    +import qualified Network.Socket as S
    +  ( Socket(..)
    +  , PortNumber()
    +  , SockAddr(..)
    +  , HostName
    +  , accept
    +  , socketToHandle
    +  )
    +import System.IO
    +
    +-- | alternative implementation of accept to work around EAI_AGAIN errors
    +acceptLite :: S.Socket -> IO (Handle, S.HostName, S.PortNumber)
    +acceptLite sock = do
    +  (sock', addr) <- S.accept sock
    +  h <- S.socketToHandle sock' ReadWriteMode
    +  (N.PortNumber p) <- N.socketPort sock'
    +  
    +  let peer = $(if supportsIPv6
    +                 then
    +                 return $ CaseE (VarE (mkName "addr")) 
    +                            [Match 
    +                             (ConP (mkName "S.SockAddrInet") 
    +                              [WildP,VarP (mkName "ha")]) 
    +                             (NormalB (AppE (VarE (mkName "showHostAddress")) 
    +                                       (VarE (mkName "ha")))) []
    +                            ,Match (ConP (mkName "S.SockAddrInet6") [WildP,WildP,VarP (mkName "ha"),WildP])
    +                             (NormalB (AppE (VarE (mkName "showHostAddress6")) (VarE (mkName "ha")))) []
    +                            ,Match WildP (NormalB (AppE (VarE (mkName "error")) (LitE (StringL "Unsupported socket")))) []]
    +                 -- the above mess is the equivalent of this: 
    +                 {-[| case addr of
    +                       (S.SockAddrInet _ ha)      -> showHostAddress ha
    +                       (S.SockAddrInet6 _ _ ha _) -> showHostAddress6 ha
    +                       _                          -> error "Unsupported socket"
    +                   |]-}
    +                 else
    +                 [| case addr of
    +                      (S.SockAddrInet _ ha)      -> showHostAddress ha
    +                      _                          -> error "Unsupported socket"
    +                 |])
    +                     
    +  return (h, peer, p)
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-SocketTH.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-SocketTH.html 1 + + + + +src/Happstack/Server/HTTP/SocketTH.hs + + + +
    {-# LANGUAGE TemplateHaskell #-}
    +module Happstack.Server.HTTP.SocketTH(supportsIPv6) where
    +import Language.Haskell.TH
    +
    +import Data.List
    +import Data.Maybe
    +import Network.Socket(SockAddr(..))
    +
    +-- find out at compile time if the SockAddr6 / HostAddress6 constructors are available
    +supportsIPv6 :: Bool
    +supportsIPv6 = $(let c = ["Network.Socket.SockAddrInet6", "Network.Socket.Internal.SockAddrInet6"] ; d = ''SockAddr in
    +                 do TyConI (DataD _ _ _ cs _) <- reify d
    +                    if isJust (find (\(NormalC n _) -> show n `elem` c) cs)
    +                       then [| True |]
    +                       else [| False |] )
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Types.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTP-Types.html 1 + + + + +src/Happstack/Server/HTTP/Types.hs + + + +
    {-# LANGUAGE TypeSynonymInstances, DeriveDataTypeable #-}
    +
    +module Happstack.Server.HTTP.Types
    +    (Request(..), Response(..), RqBody(..), Input(..), HeaderPair(..),
    +     rqURL, mkHeaders,
    +     getHeader, getHeaderBS, getHeaderUnsafe,
    +     hasHeader, hasHeaderBS, hasHeaderUnsafe,
    +     setHeader, setHeaderBS, setHeaderUnsafe,
    +     addHeader, addHeaderBS, addHeaderUnsafe,
    +     setRsCode, -- setCookie, setCookies,
    +     Conf(..), nullConf, result, resultBS,
    +     redirect, -- redirect_, redirect', redirect'_,
    +     RsFlags(..), nullRsFlags, noContentLength,
    +     Version(..), Method(..), Headers, continueHTTP,
    +     Host, ContentType(..)
    +    ) where
    +
    +
    +import qualified Data.Map as M
    +import Data.Typeable(Typeable)
    +import Data.Maybe
    +import qualified Data.ByteString.Char8 as P
    +import Data.ByteString.Char8 (ByteString,pack)
    +import qualified Data.ByteString.Lazy.Char8 as L
    +import Happstack.Server.SURI
    +import Data.Char (toLower)
    +
    +import Happstack.Server.HTTP.Multipart ( ContentType(..) )
    +import Happstack.Server.Cookie
    +import Data.List
    +import Text.Show.Functions ()
    +
    +-- | HTTP version
    +data Version = Version Int Int
    +             deriving(Read,Eq)
    +
    +instance Show Version where
    +  show (Version x y) = (show x) ++ "." ++ (show y)
    +
    +isHTTP1_1 :: Request -> Bool
    +isHTTP1_1 rq = case rqVersion rq of Version 1 1 -> True; _ -> False
    +isHTTP1_0 :: Request -> Bool
    +isHTTP1_0 rq = case rqVersion rq of Version 1 0 -> True; _ -> False
    +
    +-- | Should the connection be used for further messages after this.
    +-- | isHTTP1_0 && hasKeepAlive || isHTTP1_1 && hasNotConnectionClose
    +continueHTTP :: Request -> Response -> Bool
    +--continueHTTP rq res = isHTTP1_1 rq && getHeader' connectionC rq /= Just closeC && rsfContentLength (rsFlags res)
    +continueHTTP rq res = (isHTTP1_0 rq && checkHeaderBS connectionC keepaliveC rq) ||
    +                      (isHTTP1_1 rq && not (checkHeaderBS connectionC closeC rq)) && rsfContentLength (rsFlags res)
    +
    +-- | HTTP configuration
    +data Conf = Conf { port      :: Int -- ^ Port for the server to listen on.
    +                 , validator  :: Maybe (Response -> IO Response)
    +                 } 
    +
    +-- | Default configuration contains no validator and the port is set to 8000
    +nullConf :: Conf
    +nullConf = Conf { port      = 8000
    +                , validator  = Nothing
    +                }
    +
    +-- | HTTP request method
    +data Method  = GET | HEAD | POST | PUT | DELETE | TRACE | OPTIONS | CONNECT
    +               deriving(Show,Read,Eq)
    +
    +data HeaderPair = HeaderPair { hName :: ByteString, hValue :: [ByteString] } deriving (Read,Show)
    +-- | Combined headers.
    +type Headers = M.Map ByteString HeaderPair -- lowercased name -> (realname, value)
    +
    +
    +
    +-- | Result flags
    +data RsFlags = RsFlags 
    +    { rsfContentLength :: Bool -- ^ whether a content-length header will be added to the result.
    +    } deriving(Show,Read,Typeable)
    +
    +-- | Default RsFlags that will include the content-length header
    +nullRsFlags :: RsFlags
    +nullRsFlags = RsFlags { rsfContentLength = True }
    +-- | Don't display a Content-Lenght field for the 'Result'.
    +noContentLength :: Response -> Response
    +noContentLength res = res { rsFlags = upd } where upd = (rsFlags res) { rsfContentLength = False }
    +
    +data Input = Input
    +    { inputValue :: L.ByteString
    +    , inputFilename :: Maybe String
    +    , inputContentType :: ContentType
    +    } deriving (Show,Read,Typeable)
    +
    +type Host = (String,Int)
    +
    +data Response  = Response  { rsCode      :: Int,
    +                             rsHeaders   :: Headers,
    +                             rsFlags     :: RsFlags,
    +                             rsBody      :: L.ByteString,
    +                             rsValidator :: Maybe (Response -> IO Response)
    +                           }
    +               | SendFile  { rsCode      :: Int,
    +                             rsHeaders   :: Headers,
    +                             rsFlags     :: RsFlags,
    +                             rsValidator :: Maybe (Response -> IO Response),
    +                             sfFilePath  :: FilePath,  -- file handle to send from
    +                             sfOffset    :: Integer, -- offset to start at
    +                             sfCount     :: Integer  -- number of bytes to send
    +                           }
    +               deriving (Show,Typeable) 
    +
    +data Request = Request { rqMethod  :: Method,
    +                         rqPaths   :: [String],
    +			 rqUri	   :: String,
    +                         rqQuery   :: String,
    +                         rqInputs  :: [(String,Input)],
    +                         rqCookies :: [(String,Cookie)],
    +                         rqVersion :: Version,
    +                         rqHeaders :: Headers,
    +                         rqBody    :: RqBody,
    +                         rqPeer    :: Host
    +                       } deriving(Show,Read,Typeable)
    +
    +-- | Converts a Request into a String representing the corresponding URL
    +rqURL :: Request -> String
    +rqURL rq = '/':intercalate "/" (rqPaths rq) ++ (rqQuery rq)
    +
    +class HasHeaders a where 
    +    updateHeaders::(Headers->Headers)->a->a
    +    headers::a->Headers
    +
    +instance HasHeaders Response where updateHeaders f rs = rs{rsHeaders=f $ rsHeaders rs}
    +                                   headers = rsHeaders
    +instance HasHeaders Request where updateHeaders f rq = rq{rqHeaders = f $ rqHeaders rq} 
    +                                  headers = rqHeaders
    +
    +instance HasHeaders Headers where updateHeaders f = f
    +                                  headers = id
    +
    +newtype RqBody = Body L.ByteString deriving (Read,Show,Typeable)
    +
    +-- | Sets the Response status code to the provided Int and lifts the computation
    +-- into a Monad.
    +setRsCode :: (Monad m) => Int -> Response -> m Response
    +setRsCode code rs = return rs {rsCode = code}
    +
    +-- | Takes a list of (key,val) pairs and converts it into Headers.  The
    +-- keys will be converted to lowercase
    +mkHeaders :: [(String,String)] -> Headers
    +mkHeaders hdrs
    +    = M.fromListWith join [ (P.pack (map toLower key), HeaderPair (P.pack key) [P.pack value]) | (key,value) <- hdrs ]
    +    where join (HeaderPair key vs1) (HeaderPair _ vs2) = HeaderPair key (vs1++vs2)
    +
    +--------------------------------------------------------------
    +-- Retrieving header information
    +--------------------------------------------------------------
    +
    +-- | Lookup header value. Key is case-insensitive.
    +getHeader :: HasHeaders r => String -> r -> Maybe ByteString
    +getHeader = getHeaderBS . pack
    +
    +-- | Lookup header value. Key is a case-insensitive bytestring.
    +getHeaderBS :: HasHeaders r => ByteString -> r -> Maybe ByteString
    +getHeaderBS = getHeaderUnsafe . P.map toLower
    +
    +-- | Lookup header value with a case-sensitive key. The key must be lowercase.
    +getHeaderUnsafe :: HasHeaders r => ByteString -> r -> Maybe ByteString
    +getHeaderUnsafe key var = listToMaybe =<< fmap hValue (getHeaderUnsafe' key var)
    +
    +-- | Lookup header with a case-sensitive key. The key must be lowercase.
    +getHeaderUnsafe' :: HasHeaders r => ByteString -> r -> Maybe HeaderPair
    +getHeaderUnsafe' key = M.lookup key . headers
    +
    +--------------------------------------------------------------
    +-- Querying header status
    +--------------------------------------------------------------
    +
    +-- | Returns True if the associated key is found in the Headers.  The lookup
    +-- is case insensitive.
    +hasHeader :: HasHeaders r => String -> r -> Bool
    +hasHeader key r = isJust (getHeader key r)
    +
    +-- | Acts as 'hasHeader' with ByteStrings
    +hasHeaderBS :: HasHeaders r => ByteString -> r -> Bool
    +hasHeaderBS key r = isJust (getHeaderBS key r)
    +
    +-- | Acts as 'hasHeaderBS' but the key is case sensitive.  It should be
    +-- in lowercase.
    +hasHeaderUnsafe :: HasHeaders r => ByteString -> r -> Bool
    +hasHeaderUnsafe key r = isJust (getHeaderUnsafe' key r)
    +
    +checkHeaderBS :: HasHeaders r => ByteString -> ByteString -> r -> Bool
    +checkHeaderBS key val = checkHeaderUnsafe (P.map toLower key) (P.map toLower val)
    +
    +checkHeaderUnsafe :: HasHeaders r => ByteString -> ByteString -> r -> Bool
    +checkHeaderUnsafe key val r
    +    = case getHeaderUnsafe key r of
    +        Just val' | P.map toLower val' == val -> True
    +        _ -> False
    +
    +
    +--------------------------------------------------------------
    +-- Setting header status
    +--------------------------------------------------------------
    +
    +-- | Associates the key/value pair in the headers.  Forces the key to be
    +-- lowercase.
    +setHeader :: HasHeaders r => String -> String -> r -> r
    +setHeader key val = setHeaderBS (pack key) (pack val)
    +
    +-- | Acts as 'setHeader' but with ByteStrings.
    +setHeaderBS :: HasHeaders r => ByteString -> ByteString -> r -> r
    +setHeaderBS key val = setHeaderUnsafe (P.map toLower key) (HeaderPair key [val])
    +
    +-- | Sets the key to the HeaderPair.  This is the only way to associate a key
    +-- with multiple values via the setHeader* functions.  Does not force the key
    +-- to be in lowercase or guarantee that the given key and the key in the HeaderPair will match. 
    +setHeaderUnsafe :: HasHeaders r => ByteString -> HeaderPair -> r -> r
    +setHeaderUnsafe key val = updateHeaders (M.insert key val)
    +
    +--------------------------------------------------------------
    +-- Adding headers
    +--------------------------------------------------------------
    +
    +-- | Add a key/value pair to the header.  If the key already has a value
    +-- associated with it, then the value will be appended.  
    +-- Forces the key to be lowercase.
    +addHeader :: HasHeaders r => String -> String -> r -> r
    +addHeader key val = addHeaderBS (pack key) (pack val)
    +
    +-- | Acts as addHeader except for ByteStrings
    +addHeaderBS :: HasHeaders r => ByteString -> ByteString -> r -> r
    +addHeaderBS key val = addHeaderUnsafe (P.map toLower key) (HeaderPair key [val])
    +
    +-- | Add a key/value pair to the header using the underlying HeaderPair data
    +-- type.  Does not force the key to be in lowercase or guarantee that the given key and the key in the HeaderPair will match. 
    +addHeaderUnsafe :: HasHeaders r => ByteString -> HeaderPair -> r -> r
    +addHeaderUnsafe key val = updateHeaders (M.insertWith join key val)
    +    where join (HeaderPair k vs1) (HeaderPair _ vs2) = HeaderPair k (vs1++vs2)
    +
    +-- | Creates a Response with the given Int as the status code and the provided
    +-- String as the body of the Response 
    +result :: Int -> String -> Response
    +result code = resultBS code . L.pack
    +
    +-- | Acts as 'result' but works with ByteStrings directly.
    +resultBS :: Int -> L.ByteString -> Response
    +resultBS code s = Response code M.empty nullRsFlags s Nothing
    +
    +-- | Sets the Response's status code to the given Int and redirects to the given URI
    +redirect :: (ToSURI s) => Int -> s -> Response -> Response
    +redirect c s resp = setHeaderBS locationC (pack (render (toSURI s))) resp{rsCode = c}
    +
    +-- constants here
    +locationC :: ByteString
    +locationC   = P.pack "Location"
    +closeC :: ByteString
    +closeC      = P.pack "close"
    +connectionC :: ByteString
    +connectionC = P.pack "Connection"
    +keepaliveC :: ByteString
    +keepaliveC  = P.pack "Keep-Alive"
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-HTTP.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-HTTP.html 1 + + + + +src/Happstack/Server/HTTPClient/HTTP.hs + + + +
    {-# LANGUAGE ScopedTypeVariables, PatternSignatures #-}
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Server.HTTPClient.HTTP
    +-- Copyright   :  (c) Warrick Gray 2002, Bjorn Bringert 2003-2005
    +-- License     :  BSD
    +-- 
    +-- Maintainer  :  bjorn@bringert.net
    +-- Stability   :  experimental
    +-- Portability :  non-portable (not tested)
    +--
    +-- An easy HTTP interface enjoy.
    +--
    +-- * Changes by Simon Foster:
    +--      - Split module up into to sepearate Network.[Stream,TCP,HTTP] modules
    +--      - Created functions receiveHTTP and responseHTTP to allow server side interactions
    +--        (although 100-continue is unsupported and I haven't checked for standard compliancy).
    +--      - Pulled the transfer functions from sendHTTP to global scope to allow access by
    +--        above functions.
    +--
    +-- * Changes by Graham Klyne:
    +--      - export httpVersion
    +--      - use new URI module (similar to old, but uses revised URI datatype)
    +--
    +-- * Changes by Bjorn Bringert:
    +--
    +--      - handle URIs with a port number
    +--      - added debugging toggle
    +--      - disabled 100-continue transfers to get HTTP\/1.0 compatibility
    +--      - change 'ioError' to 'throw'
    +--      - Added simpleHTTP_, which takes a stream argument.
    +--
    +-- * Changes from 0.1
    +--      - change 'openHTTP' to 'openTCP', removed 'closeTCP' - use 'close' from 'Stream' class.
    +--      - added use of inet_addr to openHTTP, allowing use of IP "dot" notation addresses.
    +--      - reworking of the use of Stream, including alterations to make 'sendHTTP' generic
    +--        and the addition of a debugging stream.
    +--      - simplified error handling.
    +-- 
    +-- * TODO
    +--     - request pipelining
    +--     - https upgrade (includes full TLS, i.e. SSL, implementation)
    +--         - use of Stream classes will pay off
    +--         - consider C implementation of encryption\/decryption
    +--     - comm timeouts
    +--     - MIME & entity stuff (happening in separate module)
    +--     - support \"*\" uri-request-string for OPTIONS request method
    +-- 
    +-- 
    +-- * Header notes:
    +--
    +--     [@Host@]
    +--                  Required by HTTP\/1.1, if not supplied as part
    +--                  of a request a default Host value is extracted
    +--                  from the request-uri.
    +-- 
    +--     [@Connection@] 
    +--                  If this header is present in any request or
    +--                  response, and it's value is "close", then
    +--                  the current request\/response is the last 
    +--                  to be allowed on that connection.
    +-- 
    +--     [@Expect@]
    +--                  Should a request contain a body, an Expect
    +--                  header will be added to the request.  The added
    +--                  header has the value \"100-continue\".  After
    +--                  a 417 \"Expectation Failed\" response the request
    +--                  is attempted again without this added Expect
    +--                  header.
    +--                  
    +--     [@TransferEncoding,ContentLength,...@]
    +--                  if request is inconsistent with any of these
    +--                  header values then you may not receive any response
    +--                  or will generate an error response (probably 4xx).
    +--
    +--
    +-- * Response code notes
    +-- Some response codes induce special behaviour:
    +--
    +--   [@1xx@]   \"100 Continue\" will cause any unsent request body to be sent.
    +--             \"101 Upgrade\" will be returned.
    +--             Other 1xx responses are ignored.
    +-- 
    +--   [@417@]   The reason for this code is \"Expectation failed\", indicating
    +--             that the server did not like the Expect \"100-continue\" header
    +--             added to a request.  Receipt of 417 will induce another
    +--             request attempt (without Expect header), unless no Expect header
    +--             had been added (in which case 417 response is returned).
    +--
    +-----------------------------------------------------------------------------
    +module Happstack.Server.HTTPClient.HTTP (
    +    module Happstack.Server.HTTPClient.Stream,
    +    module Happstack.Server.HTTPClient.TCP,
    +
    +    -- ** Constants
    +    httpVersion,
    +    
    +    -- ** HTTP 
    +    Request(..),
    +    Response(..),
    +    RequestMethod(..),
    +    simpleHTTP, simpleHTTP_,
    +    sendHTTP,
    +    sendHTTPPipelined,
    +    receiveHTTP,
    +    respondHTTP,
    +
    +    -- ** Header Functions
    +    HasHeaders,
    +    Header(..),
    +    HeaderName(..),
    +    insertHeader,
    +    insertHeaderIfMissing,
    +    insertHeaders,
    +    retrieveHeaders,
    +    replaceHeader,
    +    findHeader,
    +
    +    -- ** URL Encoding
    +    urlEncode,
    +    urlDecode,
    +    urlEncodeVars,
    +
    +) where
    +
    +
    +
    +-----------------------------------------------------------------
    +------------------ Imports --------------------------------------
    +-----------------------------------------------------------------
    +
    +import Control.Exception.Extensible as Exception
    +
    +-- Networking
    +import Network.URI
    +import Happstack.Server.HTTPClient.Stream
    +import Happstack.Server.HTTPClient.TCP
    +
    +
    +-- Util
    +import Data.Bits ((.&.))
    +import Data.Char
    +import Data.List (partition,elemIndex,intersperse)
    +import Control.Monad (when,forM)
    +import Numeric (readHex)
    +import Text.ParserCombinators.ReadP
    +
    +
    +
    +-- Turn on to enable HTTP traffic logging
    +debug :: Bool
    +debug = True -- False
    +
    +-- File that HTTP traffic logs go to
    +httpLogFile :: String
    +httpLogFile = "http-debug.log"
    +
    +-----------------------------------------------------------------
    +------------------ Misc -----------------------------------------
    +-----------------------------------------------------------------
    +
    +-- remove leading and trailing whitespace.
    +trim :: String -> String
    +trim = let dropspace = dropWhile isSpace in
    +       reverse . dropspace . reverse . dropspace
    +
    +
    +-- Split a list into two parts, the delimiter occurs
    +-- at the head of the second list.  Nothing is returned
    +-- when no occurance of the delimiter is found.
    +split :: Eq a => a -> [a] -> Maybe ([a],[a])
    +split delim list = case delim `elemIndex` list of
    +    Nothing -> Nothing
    +    Just x  -> Just $ splitAt x list
    +    
    +
    +
    +crlf :: String
    +crlf = "\r\n"
    +sp :: String
    +sp   = " "
    +
    +-----------------------------------------------------------------
    +------------------ Header Data ----------------------------------
    +-----------------------------------------------------------------
    +
    +
    +-- | The Header data type pairs header names & values.
    +data Header = Header HeaderName String
    +
    +
    +instance Show Header where
    +    show (Header key value) = show key ++ ": " ++ value ++ crlf
    +
    +
    +-- | HTTP Header Name type:
    +--  Why include this at all?  I have some reasons
    +--   1) prevent spelling errors of header names,
    +--   2) remind everyone of what headers are available,
    +--   3) might speed up searches for specific headers.
    +--
    +--  Arguments against:
    +--   1) makes customising header names laborious
    +--   2) increases code volume.
    +--
    +data HeaderName = 
    +                 -- Generic Headers --
    +                  HdrCacheControl
    +                | HdrConnection
    +                | HdrDate
    +                | HdrPragma
    +                | HdrTransferEncoding        
    +                | HdrUpgrade                
    +                | HdrVia
    +
    +                -- Request Headers --
    +                | HdrAccept
    +                | HdrAcceptCharset
    +                | HdrAcceptEncoding
    +                | HdrAcceptLanguage
    +                | HdrAuthorization
    +                | HdrCookie
    +                | HdrExpect
    +                | HdrFrom
    +                | HdrHost
    +                | HdrIfModifiedSince
    +                | HdrIfMatch
    +                | HdrIfNoneMatch
    +                | HdrIfRange
    +                | HdrIfUnmodifiedSince
    +                | HdrMaxForwards
    +                | HdrProxyAuthorization
    +                | HdrRange
    +                | HdrReferer
    +                | HdrUserAgent
    +
    +                -- Response Headers
    +                | HdrAge
    +                | HdrLocation
    +                | HdrProxyAuthenticate
    +                | HdrPublic
    +                | HdrRetryAfter
    +                | HdrServer
    +                | HdrSetCookie
    +                | HdrVary
    +                | HdrWarning
    +                | HdrWWWAuthenticate
    +
    +                -- Entity Headers
    +                | HdrAllow
    +                | HdrContentBase
    +                | HdrContentEncoding
    +                | HdrContentLanguage
    +                | HdrContentLength
    +                | HdrContentLocation
    +                | HdrContentMD5
    +                | HdrContentRange
    +                | HdrContentType
    +                | HdrETag
    +                | HdrExpires
    +                | HdrLastModified
    +
    +                -- Mime entity headers (for sub-parts)
    +                | HdrContentTransferEncoding
    +
    +                -- | Allows for unrecognised or experimental headers.
    +                | HdrCustom String -- not in header map below.
    +    deriving(Eq)
    +
    +
    +-- Translation between header names and values,
    +-- good candidate for improvement.
    +headerMap :: [ (String,HeaderName) ]
    +headerMap 
    + = [  ("Cache-Control"        ,HdrCacheControl      )
    +	, ("Connection"           ,HdrConnection        )
    +	, ("Date"                 ,HdrDate              )    
    +	, ("Pragma"               ,HdrPragma            )
    +	, ("Transfer-Encoding"    ,HdrTransferEncoding  )        
    +	, ("Upgrade"              ,HdrUpgrade           )                
    +	, ("Via"                  ,HdrVia               )
    +	, ("Accept"               ,HdrAccept            )
    +	, ("Accept-Charset"       ,HdrAcceptCharset     )
    +	, ("Accept-Encoding"      ,HdrAcceptEncoding    )
    +	, ("Accept-Language"      ,HdrAcceptLanguage    )
    +	, ("Authorization"        ,HdrAuthorization     )
    +	, ("From"                 ,HdrFrom              )
    +	, ("Host"                 ,HdrHost              )
    +	, ("If-Modified-Since"    ,HdrIfModifiedSince   )
    +	, ("If-Match"             ,HdrIfMatch           )
    +	, ("If-None-Match"        ,HdrIfNoneMatch       )
    +	, ("If-Range"             ,HdrIfRange           ) 
    +	, ("If-Unmodified-Since"  ,HdrIfUnmodifiedSince )
    +	, ("Max-Forwards"         ,HdrMaxForwards       )
    +	, ("Proxy-Authorization"  ,HdrProxyAuthorization)
    +	, ("Range"                ,HdrRange             )   
    +	, ("Referer"              ,HdrReferer           )
    +	, ("User-Agent"           ,HdrUserAgent         )
    +	, ("Age"                  ,HdrAge               )
    +	, ("Location"             ,HdrLocation          )
    +	, ("Proxy-Authenticate"   ,HdrProxyAuthenticate )
    +	, ("Public"               ,HdrPublic            )
    +	, ("Retry-After"          ,HdrRetryAfter        )
    +	, ("Server"               ,HdrServer            )
    +	, ("Vary"                 ,HdrVary              )
    +	, ("Warning"              ,HdrWarning           )
    +	, ("WWW-Authenticate"     ,HdrWWWAuthenticate   )
    +	, ("Allow"                ,HdrAllow             )
    +	, ("Content-Base"         ,HdrContentBase       )
    +	, ("Content-Encoding"     ,HdrContentEncoding   )
    +	, ("Content-Language"     ,HdrContentLanguage   )
    +	, ("Content-Length"       ,HdrContentLength     )
    +	, ("Content-Location"     ,HdrContentLocation   )
    +	, ("Content-MD5"          ,HdrContentMD5        )
    +	, ("Content-Range"        ,HdrContentRange      )
    +	, ("Content-Type"         ,HdrContentType       )
    +	, ("ETag"                 ,HdrETag              )
    +	, ("Expires"              ,HdrExpires           )
    +	, ("Last-Modified"        ,HdrLastModified      )
    +   	, ("Set-Cookie"           ,HdrSetCookie         )
    +	, ("Cookie"               ,HdrCookie            )
    +    , ("Expect"               ,HdrExpect            ) ]
    +
    +
    +instance Show HeaderName where
    +    show (HdrCustom s) = s
    +    show x = case filter ((==x).snd) headerMap of
    +                [] -> error "headerMap incomplete"
    +                (h:_) -> fst h
    +
    +
    +
    +
    +
    +-- | This class allows us to write generic header manipulation functions
    +-- for both 'Request' and 'Response' data types.
    +class HasHeaders x where
    +    getHeaders :: x -> [Header]
    +    setHeaders :: x -> [Header] -> x
    +
    +
    +
    +-- Header manipulation functions
    +insertHeader, replaceHeader, insertHeaderIfMissing
    +    :: HasHeaders a => HeaderName -> String -> a -> a
    +
    +
    +-- | Inserts a header with the given name and value.
    +-- Allows duplicate header names.
    +insertHeader name value x = setHeaders x newHeaders
    +    where
    +        newHeaders = (Header name value) : getHeaders x
    +
    +
    +-- | Adds the new header only if no previous header shares
    +-- the same name.
    +insertHeaderIfMissing name value x = setHeaders x (newHeaders $ getHeaders x)
    +    where
    +        newHeaders list@(h@(Header n _): rest)
    +            | n == name  = list
    +            | otherwise  = h : newHeaders rest
    +        newHeaders [] = [Header name value]
    +
    +            
    +
    +-- | Removes old headers with duplicate name.
    +replaceHeader name value x = setHeaders x newHeaders
    +    where
    +        newHeaders = Header name value : [ h | h@(Header n _) <- getHeaders x, name /= n ]
    +          
    +
    +-- | Inserts multiple headers.
    +insertHeaders :: HasHeaders a => [Header] -> a -> a
    +insertHeaders hdrs x = setHeaders x (getHeaders x ++ hdrs)
    +
    +
    +-- | Gets a list of headers with a particular 'HeaderName'.
    +retrieveHeaders :: HasHeaders a => HeaderName -> a -> [Header]
    +retrieveHeaders name x = filter matchname (getHeaders x)
    +    where
    +        matchname (Header n _)  |  n == name  =  True
    +        matchname _ = False
    +
    +
    +-- | Lookup presence of specific HeaderName in a list of Headers
    +-- Returns the value from the first matching header.
    +findHeader :: HasHeaders a => HeaderName -> a -> Maybe String
    +findHeader n = lookupHeader n . getHeaders
    +
    +-- An anomally really:
    +lookupHeader :: HeaderName -> [Header] -> Maybe String
    +lookupHeader v (Header n s:t)  |  v == n   =  Just s
    +                               | otherwise =  lookupHeader v t
    +lookupHeader _ _  =  Nothing
    +
    +
    +
    +-----------------------------------------------------------------
    +------------------ HTTP Messages --------------------------------
    +-----------------------------------------------------------------
    +
    +
    +-- Protocol version
    +httpVersion :: String
    +httpVersion = "HTTP/1.1"
    +
    +
    +-- | The HTTP request method, to be used in the 'Request' object.
    +-- We are missing a few of the stranger methods, but these are
    +-- not really necessary until we add full TLS.
    +data RequestMethod = HEAD | PUT | GET | POST | OPTIONS | TRACE | DELETE
    +    deriving(Show,Eq)
    +
    +rqMethodMap :: [(String, RequestMethod)]
    +rqMethodMap = [("HEAD",    HEAD),
    +	       ("PUT",     PUT),
    +	       ("GET",     GET),
    +	       ("POST",    POST),
    +	       ("OPTIONS", OPTIONS),
    +	       ("TRACE",   TRACE),
    +               ("DELETE",  DELETE)]
    +
    +-- | An HTTP Request.
    +-- The 'Show' instance of this type is used for message serialisation,
    +-- which means no body data is output.
    +data Request =
    +     Request { rqURI       :: URI   -- ^ might need changing in future
    +                                    --  1) to support '*' uri in OPTIONS request
    +                                    --  2) transparent support for both relative
    +                                    --     & absolute uris, although this should
    +                                    --     already work (leave scheme & host parts empty).
    +             , rqMethod    :: RequestMethod             
    +             , rqHeaders   :: [Header]
    +             , rqBody      :: String
    +             }
    +
    +
    +
    +
    +-- Notice that request body is not included,
    +-- this show function is used to serialise
    +-- a request for the transport link, we send
    +-- the body separately where possible.
    +instance Show Request where
    +    show (Request u m h _) =
    +        show m ++ sp ++ alt_uri ++ sp ++ httpVersion ++ crlf
    +        ++ concatMap show h ++ crlf
    +        where
    +            alt_uri = show $ if null (uriPath u) || head (uriPath u) /= '/' 
    +                        then u { uriPath = '/' : uriPath u } 
    +                        else u
    +
    +
    +instance HasHeaders Request where
    +    getHeaders = rqHeaders
    +    setHeaders rq hdrs = rq { rqHeaders=hdrs }
    +
    +
    +
    +
    +
    +
    +type ResponseCode  = (Int,Int,Int)
    +type ResponseData  = (ResponseCode,String,[Header])
    +type RequestData   = (RequestMethod,URI,[Header])
    +
    +-- | An HTTP Response.
    +-- The 'Show' instance of this type is used for message serialisation,
    +-- which means no body data is output, additionally the output will
    +-- show an HTTP version of 1.1 instead of the actual version returned
    +-- by a server.
    +data Response =
    +    Response { rspCode     :: ResponseCode
    +             , rspReason   :: String
    +             , rspHeaders  :: [Header]
    +             , rspBody     :: String
    +             }
    +                   
    +
    +
    +-- This is an invalid representation of a received response, 
    +-- since we have made the assumption that all responses are HTTP/1.1
    +instance Show Response where
    +    show (Response (a,b,c) reason headers _) =
    +        httpVersion ++ ' ' : map intToDigit [a,b,c] ++ ' ' : reason ++ crlf
    +        ++ concatMap show headers ++ crlf
    +
    +
    +
    +instance HasHeaders Response where
    +    getHeaders = rspHeaders
    +    setHeaders rsp hdrs = rsp { rspHeaders=hdrs }
    +
    +-----------------------------------------------------------------
    +------------------ Parsing --------------------------------------
    +-----------------------------------------------------------------
    +
    +parseHeader :: String -> Result Header
    +parseHeader str =
    +    case split ':' str of
    +        Nothing -> Left (ErrorParse $ "Unable to parse header: " ++ str)
    +        Just (k,v) -> Right $ Header (fn k) (trim $ drop 1 v)
    +    where
    +        fn k = case map snd $ filter (match k . fst) headerMap of
    +                 [] -> (HdrCustom k)
    +                 (h:_) -> h
    +
    +        match :: String -> String -> Bool
    +        match s1 s2 = map toLower s1 == map toLower s2
    +    
    +
    +parseHeaders :: [String] -> Result [Header]
    +parseHeaders = catRslts [] . map (parseHeader . clean) . joinExtended ""
    +    where
    +        -- Joins consecutive lines where the second line
    +        -- begins with ' ' or '\t'.
    +        joinExtended old (h : t)
    +            | not (null h) && (head h == ' ' || head h == '\t')
    +                = joinExtended (old ++ ' ' : tail h) t
    +            | otherwise = old : joinExtended h t
    +        joinExtended old [] = [old]
    +
    +        clean [] = []
    +        clean (h:t) | h `elem` "\t\r\n" = ' ' : clean t
    +                    | otherwise = h : clean t
    +
    +        -- tollerant of errors?  should parse
    +        -- errors here be reported or ignored?
    +        -- currently ignored.
    +        catRslts :: [a] -> [Result a] -> Result [a]
    +        catRslts list (h:t) = 
    +            case h of
    +                Left _ -> catRslts list t
    +                Right v -> catRslts (v:list) t
    +        catRslts list [] = Right $ reverse list            
    +        
    +
    +-- Parsing a request
    +parseRequestHead :: [String] -> Result RequestData
    +parseRequestHead [] = Left ErrorClosed
    +parseRequestHead (com:hdrs) =
    +    requestCommand com `bindE` \(_version,rqm,uri) ->
    +    parseHeaders hdrs `bindE` \hdrs' ->
    +    Right (rqm,uri,hdrs')
    +    where
    +        requestCommand line
    +	    =  case words line of
    +                _yes@(rqm:uri:version) -> case (parseURIReference uri, lookup rqm rqMethodMap) of
    +					  (Just u, Just r) -> Right (version,r,u)
    +					  _                -> Left (ErrorParse $ "Request command line parse failure: " ++ line)
    +		_no -> if null line
    +			       then Left ErrorClosed
    +			       else Left (ErrorParse $ "Request command line parse failure: " ++ line)  
    +
    +-- Parsing a response
    +parseResponseHead :: [String] -> Result ResponseData
    +parseResponseHead [] = Left ErrorClosed
    +parseResponseHead (sts:hdrs) = 
    +    responseStatus sts `bindE` \(_version,code,reason) ->
    +    parseHeaders hdrs `bindE` \hdrs' ->
    +    Right (code,reason,hdrs')
    +    where
    +
    +        responseStatus line
    +            =  case words line of
    +                _yes@(version:code:reason) -> Right (version,match code,concatMap (++" ") reason)
    +                _no -> if null line 
    +                    then Left ErrorClosed  -- an assumption
    +                    else Left (ErrorParse $ "Response status line parse failure: " ++ line)
    +
    +
    +        match [a,b,c] = (digitToInt a,
    +                         digitToInt b,
    +                         digitToInt c)
    +        match _ = (-1,-1,-1)  -- will create appropriate behaviour
    +
    +
    +        
    +
    +-----------------------------------------------------------------
    +------------------ HTTP Send / Recv ----------------------------------
    +-----------------------------------------------------------------
    +
    +data Behaviour = Continue
    +               | Retry
    +               | Done
    +               | ExpectEntity
    +               | DieHorribly String
    +
    +
    +
    +
    +
    +matchResponse :: RequestMethod -> ResponseCode -> Behaviour
    +matchResponse rqst rsp =
    +    case rsp of
    +        (1,0,0) -> Continue
    +        (1,0,1) -> Done        -- upgrade to TLS
    +        (1,_,_) -> Continue    -- default
    +        (2,0,4) -> Done
    +        (2,0,5) -> Done
    +        (2,_,_) -> ans
    +        (3,0,4) -> Done
    +        (3,0,5) -> Done
    +        (3,_,_) -> ans
    +        (4,1,7) -> Retry       -- Expectation failed
    +        (4,_,_) -> ans
    +        (5,_,_) -> ans
    +        (a,b,c) -> DieHorribly ("Response code " ++ map intToDigit [a,b,c] ++ " not recognised")
    +    where
    +        ans | rqst == HEAD = Done
    +            | otherwise    = ExpectEntity
    +        
    +
    +-- | Simple way to get a resource across a non-persistant connection.
    +-- Headers that may be altered:
    +--  Host        Altered only if no Host header is supplied, HTTP\/1.1
    +--              requires a Host header.
    +--  Connection  Where no allowance is made for persistant connections
    +--              the Connection header will be set to "close"
    +simpleHTTP :: Request -> IO (Result Response)
    +simpleHTTP r = 
    +    do 
    +       auth <- getAuth r
    +       c <- openTCPPort (uriRegName auth) (port auth)
    +       simpleHTTP_ c r
    +    where
    +        port auth = if null (uriPort auth)
    +            then 80
    +            else read $ uriPort auth
    +            
    +
    +-- | Like 'simpleHTTP', but acting on an already opened stream.
    +simpleHTTP_ :: Stream s => s -> Request -> IO (Result Response)
    +simpleHTTP_ s r =
    +    do 
    +       auth <- getAuth r
    +       let r' = fixReq auth r 
    +       rsp <- if debug then do
    +	        s' <- debugStream httpLogFile s
    +	        sendHTTP s' r'
    +	       else
    +	        sendHTTP s r'
    +       -- already done by sendHTTP because of "Connection: close" header
    +       --; close s 
    +       return rsp
    +       where
    +  {- RFC 2616, section 5.1.2:
    +     "The most common form of Request-URI is that used to identify a
    +      resource on an origin server or gateway. In this case the absolute
    +      path of the URI MUST be transmitted (see section 3.2.1, abs_path) as
    +      the Request-URI, and the network location of the URI (authority) MUST
    +      be transmitted in a Host header field." -}
    +  -- we assume that this is the case, so we take the host name from
    +  -- the Host header if there is one, otherwise from the request-URI.
    +  -- Then we make the request-URI an abs_path and make sure that there
    +  -- is a Host header.
    +             fixReq :: URIAuth -> Request -> Request
    +	     fixReq URIAuth{uriRegName=h} req = 
    +		 insertHeaderIfMissing HdrConnection "close" $
    +		 insertHeaderIfMissing HdrHost h $
    +		 req { rqURI = (rqURI req){ uriScheme = "", 
    +					uriAuthority = Nothing } }	       
    +
    +-- | this is not the most graceful of implementations.
    +-- The problem is that Network.URI.authority is
    +-- deprecated.  And we want to use Network.URI.URIAuth.
    +--
    +-- So this method use to parse a "host" field as a URI
    +-- auth, which is not stictly correct.  We still 
    +-- fake that behavior here.
    +getAuth :: Monad m => Request -> m URIAuth
    +getAuth r = case auth of
    +			 Just x -> return x 
    +			 Nothing -> fail $ "Error parsing URI authority '"
    +				           ++ show (rqURI r) ++ "'"
    +		 where
    +            auth = case findHeader HdrHost r of
    +			      Just h -> Just $ fakeAuth h 
    +			      Nothing -> uriAuthority (rqURI r)
    +            fakeAuth h = fst . head $ (flip readP_to_S) h $ do
    +                    host<-many1 $ satisfy (\c -> c /= ':')
    +                    port<-option "" $ char ':' >> many1 get
    +                    return URIAuth{uriRegName=host, uriPort=port, uriUserInfo=""}
    +
    +
    +sendHTTP :: Stream s => s -> Request -> IO (Result Response)
    +sendHTTP conn rq
    +    = do rst <- sendHTTPPipelined conn [rq]
    +         case rst of
    +           ([response],_) -> return (Right response)
    +           (_,Just err)   -> return (Left err)
    +           (_,_) -> error "Case not supported in sendHTTP"
    +
    +sendHTTPPipelined :: Stream s => s -> [Request] -> IO ([Response],Maybe ConnError)
    +sendHTTPPipelined conn rqs = 
    +    do { (ok,rsp) <- Exception.catch (main (map fixHostHeader rqs))
    +                      (\(e::SomeException) -> do { close conn; throw e })
    +       ; let fn list = when (any findConnClose list)
    +                            (close conn)
    +       ; fn (map rqHeaders rqs ++ map rspHeaders ok)
    +       ; return (ok,rsp)
    +       }
    +    where       
    +-- From RFC 2616, section 8.2.3:
    +-- 'Because of the presence of older implementations, the protocol allows
    +-- ambiguous situations in which a client may send "Expect: 100-
    +-- continue" without receiving either a 417 (Expectation Failed) status
    +-- or a 100 (Continue) status. Therefore, when a client sends this
    +-- header field to an origin server (possibly via a proxy) from which it
    +-- has never seen a 100 (Continue) status, the client SHOULD NOT wait
    +-- for an indefinite period before sending the request body.'
    +--
    +-- Since we would wait forever, I have disabled use of 100-continue for now.
    +        main :: [Request] -> IO ([Response], Maybe ConnError)
    +        main rqsts =
    +            do 
    +	       --let str = if null (rqBody rqst)
    +               --              then show rqst
    +               --              else show (insertHeader HdrExpect "100-continue" rqst)
    +	       -- write body immediately, don't wait for 100 CONTINUE
    +               writeBlock conn $ concat $ intersperse "\r\n" [ show rqst ++ rqBody rqst | rqst <- rqsts ]
    +               rets <- forM rqsts $ \rqst ->
    +                       do rsp <- getResponseHead
    +                          switchResponse True True rsp rqst
    +               return (sequenceResponses rets)
    +
    +        sequenceResponses :: [Result Response] -> ([Response], Maybe ConnError)
    +        sequenceResponses = worker []
    +            where worker acc [] = (reverse acc, Nothing)
    +                  worker acc (Right x:xs) = worker (x:acc) xs
    +                  worker acc (Left x:_) = (reverse acc,Just x)
    +
    +        -- reads and parses headers
    +        getResponseHead :: IO (Result ResponseData)
    +        getResponseHead =
    +            do { lor <- readTillEmpty1 conn
    +               ; return $ lor `bindE` parseResponseHead
    +               }
    +
    +        -- Hmmm, this could go bad if we keep getting "100 Continue"
    +        -- responses...  Except this should never happen according
    +        -- to the RFC.
    +        switchResponse :: Bool {- allow retry? -}
    +                       -> Bool {- is body sent? -}
    +                       -> Result ResponseData
    +                       -> Request
    +                       -> IO (Result Response)
    +            
    +        switchResponse _ _ (Left e) _ = return (Left e)
    +                -- retry on connreset?
    +                -- if we attempt to use the same socket then there is an excellent
    +                -- chance that the socket is not in a completely closed state.
    +
    +        switchResponse allow_retry bdy_sent (Right (cd,rn,hdrs)) rqst =
    +            case matchResponse (rqMethod rqst) cd of
    +                Continue
    +                    | not bdy_sent -> {- Time to send the body -}
    +                        do { val <- writeBlock conn (rqBody rqst)
    +                           ; case val of
    +                                Left e -> return (Left e)
    +                                Right _ ->
    +                                    do { rsp <- getResponseHead
    +                                       ; switchResponse allow_retry True rsp rqst
    +                                       }
    +                           }
    +                    | otherwise -> {- keep waiting -}
    +                        do { rsp <- getResponseHead
    +                           ; switchResponse allow_retry bdy_sent rsp rqst                           
    +                           }
    +
    +                Retry -> {- Request with "Expect" header failed.
    +                                Trouble is the request contains Expects
    +                                other than "100-Continue" -}
    +                    do { writeBlock conn (show rqst ++ rqBody rqst)
    +                       ; rsp <- getResponseHead
    +                       ; switchResponse False bdy_sent rsp rqst
    +                       }   
    +                     
    +                Done ->
    +                    return (Right $ Response cd rn hdrs "")
    +
    +                DieHorribly str ->
    +                    return $ Left $ ErrorParse ("Invalid response: " ++ str)
    +
    +                ExpectEntity ->
    +                    let tc = lookupHeader HdrTransferEncoding hdrs
    +                        cl = lookupHeader HdrContentLength hdrs
    +                    in
    +                    do { rslt <- case tc of
    +                          Nothing -> 
    +                              case cl of
    +                                  Just x  -> linearTransfer conn (read x :: Int)
    +                                  Nothing -> hopefulTransfer conn ""
    +                          Just x  -> 
    +                              case map toLower (trim x) of
    +                                  "chunked" -> chunkedTransfer conn
    +                                  _         -> uglyDeathTransfer conn
    +                       ; return $ rslt `bindE` \(ftrs,bdy) -> Right (Response cd rn (hdrs++ftrs) bdy) 
    +                       }
    +
    +        
    +        -- Adds a Host header if one is NOT ALREADY PRESENT
    +        fixHostHeader :: Request -> Request
    +        fixHostHeader rq =
    +            let uri = rqURI rq
    +                h = fmap uriRegName $ uriAuthority uri
    +            in case h of
    +                Just x -> insertHeaderIfMissing HdrHost x rq
    +                _ -> rq
    +                                     
    +        -- Looks for a "Connection" header with the value "close".
    +        -- Returns True when this is found.
    +        findConnClose :: [Header] -> Bool
    +        findConnClose hdrs =
    +            case lookupHeader HdrConnection hdrs of
    +                Nothing -> False
    +                Just x  -> map toLower (trim x) == "close"
    +
    +-- | Receive and parse a HTTP request from the given Stream. Should be used 
    +--   for server side interactions.
    +receiveHTTP :: Stream s => s -> IO (Result Request)
    +receiveHTTP conn = do rq <- getRequestHead
    +		      processRequest rq	    
    +    where
    +        -- reads and parses headers
    +        getRequestHead :: IO (Result RequestData)
    +        getRequestHead =
    +            do { lor <- readTillEmpty1 conn
    +               ; return $ lor `bindE` parseRequestHead
    +               }
    +	
    +        processRequest (Left e) = return $ Left e
    +	processRequest (Right (rm,uri,hdrs)) = 
    +	    do -- FIXME : Also handle 100-continue.
    +               let tc = lookupHeader HdrTransferEncoding hdrs
    +                   cl = lookupHeader HdrContentLength hdrs
    +	       rslt <- case tc of
    +                          Nothing ->
    +                              case cl of
    +                                  Just x  -> linearTransfer conn (read x :: Int)
    +                                  Nothing -> return (Right ([], "")) -- hopefulTransfer ""
    +                          Just x  ->
    +                              case map toLower (trim x) of
    +                                  "chunked" -> chunkedTransfer conn
    +                                  _         -> uglyDeathTransfer conn
    +               
    +               return $ rslt `bindE` \(ftrs,bdy) -> Right (Request uri rm (hdrs++ftrs) bdy)
    +
    +
    +-- | Very simple function, send a HTTP response over the given stream. This 
    +--   could be improved on to use different transfer types.
    +respondHTTP :: Stream s => s -> Response -> IO ()
    +respondHTTP conn rsp = do writeBlock conn (show rsp)
    +                          -- write body immediately, don't wait for 100 CONTINUE
    +                          writeBlock conn (rspBody rsp)
    +			  return ()
    +
    +-- The following functions were in the where clause of sendHTTP, they have
    +-- been moved to global scope so other functions can access them.		       
    +
    +-- | Used when we know exactly how many bytes to expect.
    +linearTransfer :: Stream s => s -> Int -> IO (Result ([Header],String))
    +linearTransfer conn n
    +    = do info <- readBlock conn n
    +         return $ info `bindE` \str -> Right ([],str)
    +
    +-- | Used when nothing about data is known,
    +--   Unfortunately waiting for a socket closure
    +--   causes bad behaviour.  Here we just
    +--   take data once and give up the rest.
    +hopefulTransfer :: Stream s => s -> String -> IO (Result ([Header],String))
    +hopefulTransfer conn str
    +    = readLine conn >>= 
    +      either (\v -> return $ Left v)
    +             (\more -> if null more 
    +                         then return (Right ([],str)) 
    +                         else hopefulTransfer conn (str++more))
    +-- | A necessary feature of HTTP\/1.1
    +--   Also the only transfer variety likely to
    +--   return any footers.
    +chunkedTransfer :: Stream s => s -> IO (Result ([Header],String))
    +chunkedTransfer conn
    +    =  chunkedTransferC conn 0 >>= \v ->
    +       return $ v `bindE` \(ftrs,c,info) ->
    +                let myftrs = Header HdrContentLength (show c) : ftrs              
    +                in Right (myftrs,info)
    +
    +chunkedTransferC :: Stream s => s -> Int -> IO (Result ([Header],Int,String))
    +chunkedTransferC conn n
    +    =  readLine conn >>= \v -> case v of
    +                  Left e -> return (Left e)
    +                  Right line ->
    +                      let size = ( if null line || (head line) == '0'
    +                                     then 0
    +                                     else case readHex line of
    +                                        (n',_):_ -> n'
    +                                        _       -> 0
    +                                     )
    +                      in if size == 0
    +                           then do { rs <- readTillEmpty2 conn []
    +                                   ; return $
    +                                        rs `bindE` \strs ->
    +                                        parseHeaders strs `bindE` \ftrs ->
    +                                        Right (ftrs,n,"")
    +                                   }
    +                           else do { some <- readBlock conn size
    +                                   ; readLine conn
    +                                   ; more <- chunkedTransferC conn (n+size)
    +                                   ; return $ 
    +                                        some `bindE` \cdata ->
    +                                        more `bindE` \(ftrs,m,mdata) -> 
    +                                        Right (ftrs,m,cdata++mdata) 
    +                                   }                   
    +
    +-- | Maybe in the future we will have a sensible thing
    +--   to do here, at that time we might want to change
    +--   the name.
    +uglyDeathTransfer :: Stream s => s -> IO (Result ([Header],String))
    +uglyDeathTransfer _
    +    = return $ Left $ ErrorParse "Unknown Transfer-Encoding"
    +
    +-- | Remove leading crlfs then call readTillEmpty2 (not required by RFC)
    +readTillEmpty1 :: Stream s => s -> IO (Result [String])
    +readTillEmpty1 conn =
    +    do { line <- readLine conn
    +       ; case line of
    +           Left e -> return $ Left e
    +           Right s ->
    +               if s == crlf
    +                 then readTillEmpty1 conn
    +                 else readTillEmpty2 conn [s]
    +       }
    +
    +-- | Read lines until an empty line (CRLF),
    +--   also accepts a connection close as end of
    +--   input, which is not an HTTP\/1.1 compliant
    +--   thing to do - so probably indicates an
    +--   error condition.
    +readTillEmpty2 :: Stream s => s -> [String] -> IO (Result [String])
    +readTillEmpty2 conn list =
    +    do { line <- readLine conn
    +       ; case line of
    +           Left e -> return $ Left e
    +           Right s ->
    +               if s == crlf || null s
    +                 then return (Right $ reverse (s:list))
    +                 else readTillEmpty2 conn (s:list)
    +       }
    +
    +        
    +-----------------------------------------------------------------
    +------------------ A little friendly funtionality ---------------
    +-----------------------------------------------------------------
    +
    +
    +{-
    +    I had a quick look around but couldn't find any RFC about
    +    the encoding of data on the query string.  I did find an
    +    IETF memo, however, so this is how I justify the urlEncode
    +    and urlDecode methods.
    +
    +    Doc name: draft-tiwari-appl-wxxx-forms-01.txt  (look on www.ietf.org)
    +
    +    Reserved chars:  ";", "/", "?", ":", "@", "&", "=", "+", ",", and "$" are reserved.
    +    Unwise: "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
    +    URI delims: "<" | ">" | "#" | "%" | <">
    +    Unallowed ASCII: <US-ASCII coded characters 00-1F and 7F hexadecimal>
    +                     <US-ASCII coded character 20 hexadecimal>
    +    Also unallowed:  any non-us-ascii character
    +
    +    Escape method: char -> '%' a b  where a, b :: Hex digits
    +-}
    +
    +urlEncode, urlDecode :: String -> String
    +
    +urlDecode ('%':a:b:rest) = chr (16 * digitToInt a + digitToInt b)
    +                         : urlDecode rest
    +urlDecode (h:t) = h : urlDecode t
    +urlDecode [] = []
    +
    +urlEncode (h:t) =
    +    let str = if reserved_ (ord h) then escape h else [h]
    +    in str ++ urlEncode t
    +    where
    +        reserved_ x
    +            | x >= ord 'a' && x <= ord 'z' = False
    +            | x >= ord 'A' && x <= ord 'Z' = False
    +            | x >= ord '0' && x <= ord '9' = False
    +            | x <= 0x20 || x >= 0x7F = True
    +            | otherwise = x `elem` map ord [';','/','?',':','@','&'
    +                                           ,'=','+',',','$','{','}'
    +                                           ,'|','\\','^','[',']','`'
    +                                           ,'<','>','#','%','"']
    +        -- wouldn't it be nice if the compiler
    +        -- optimised the above for us?
    +
    +        escape x = 
    +            let y = ord x 
    +            in [ '%', intToDigit ((y `div` 16) .&. 0xf), intToDigit (y .&. 0xf) ]
    +
    +urlEncode [] = []
    +            
    +
    +
    +-- Encode form variables, useable in either the
    +-- query part of a URI, or the body of a POST request.
    +-- I have no source for this information except experience,
    +-- this sort of encoding worked fine in CGI programming.
    +urlEncodeVars :: [(String,String)] -> String
    +urlEncodeVars ((n,v):t) =
    +    let (same,diff) = partition ((==n) . fst) t
    +    in urlEncode n ++ '=' : foldl (\x y -> x ++ ',' : urlEncode y) (urlEncode $ v) (map snd same)
    +       ++ urlEncodeRest diff
    +       where urlEncodeRest [] = []
    +             urlEncodeRest diff = '&' : urlEncodeVars diff
    +urlEncodeVars [] = []
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-Stream.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-Stream.html 1 + + + + +src/Happstack/Server/HTTPClient/Stream.hs + + + +
    -----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Server.HTTPClient.Stream
    +-- Copyright   :  (c) Warrick Gray 2002, Bjorn Bringert 2003-2004, Simon Foster 2004
    +-- License     :  BSD
    +--
    +-- Maintainer  :  bjorn@bringert.net
    +-- Stability   :  experimental
    +-- Portability :  non-portable (not tested)
    +--
    +-- An library for creating abstract streams. Originally part of Gray's\/Bringert's
    +-- HTTP module.
    +--
    +-- * Changes by Simon Foster:
    +--      - Split module up into to sepearate Network.[Stream,TCP,HTTP] modules
    +--      
    +-----------------------------------------------------------------------------
    +module Happstack.Server.HTTPClient.Stream (
    +    -- ** Streams
    +    Debug,
    +    Stream(..),
    +    debugStream,
    +    
    +    -- ** Errors
    +    ConnError(..),
    +    Result,
    +    handleSocketError,
    +    bindE,
    +    myrecv
    +
    +) where
    +
    +import Control.Exception.Extensible as Exception
    +import System.IO.Error
    +
    +-- Networking
    +import Network.Socket
    +
    +import Control.Monad (liftM)
    +import System.IO
    +
    +data ConnError = ErrorReset 
    +               | ErrorClosed
    +               | ErrorParse String
    +               | ErrorMisc String
    +    deriving(Show,Eq)
    +
    +-- error propagating:
    +-- we could've used a monad, but that would lead us
    +-- into using the "-fglasgow-exts" compile flag.
    +bindE :: Either ConnError a -> (a -> Either ConnError b) -> Either ConnError b
    +bindE (Left e)  _ = Left e
    +bindE (Right v) f = f v
    +
    +-- | This is the type returned by many exported network functions.
    +type Result a = Either ConnError   {- error  -}
    +                       a           {- result -}
    +
    +-----------------------------------------------------------------
    +------------------ Gentle Art of Socket Sucking -----------------
    +-----------------------------------------------------------------
    +
    +-- | Streams should make layering of TLS protocol easier in future,
    +-- they allow reading/writing to files etc for debugging,
    +-- they allow use of protocols other than TCP/IP
    +-- and they allow customisation.
    +--
    +-- Instances of this class should not trim
    +-- the input in any way, e.g. leave LF on line
    +-- endings etc. Unless that is exactly the behaviour
    +-- you want from your twisted instances ;)
    +class Stream x where 
    +    readLine   :: x -> IO (Result String)
    +    readBlock  :: x -> Int -> IO (Result String)
    +    writeBlock :: x -> String -> IO (Result ())
    +    close      :: x -> IO ()
    +
    +
    +
    +
    +
    +-- Exception handler for socket operations
    +handleSocketError :: Socket -> Exception.SomeException -> IO (Result a)
    +handleSocketError sk e =
    +    do { se <- getSocketOption sk SoError
    +       ; if se == 0
    +            then throw e
    +            else return $ if se == 10054       -- reset
    +                then Left ErrorReset
    +                else Left $ ErrorMisc $ show se
    +       }
    +
    +
    +
    +
    +instance Stream Socket where
    +    readBlock sk n = (liftM Right $ fn n) `Exception.catch` (handleSocketError sk)
    +        where
    +            fn x = do { str <- myrecv sk x
    +                      ; let len = length str
    +                      ; if len < x && len /= 0
    +                          then ( fn (x-len) >>= \more -> return (str++more) )                        
    +                          else return str
    +                      }
    +
    +    -- Use of the following function is discouraged.
    +    -- The function reads in one character at a time, 
    +    -- which causes many calls to the kernel recv()
    +    -- hence causes many context switches.
    +    readLine sk = (liftM Right $ fn "") `Exception.catch` (handleSocketError sk)
    +            where
    +                fn str =
    +                    do { c <- myrecv sk 1 -- like eating through a straw.
    +                       ; if null c || c == "\n"
    +                           then return (reverse str++c)
    +                           else fn (head c:str)
    +                       }
    +    
    +    writeBlock sk str = (liftM Right $ fn str) `Exception.catch` (handleSocketError sk)
    +        where
    +            fn [] = return ()
    +            fn x  = send sk x >>= \i -> fn (drop i x)
    +
    +    -- This slams closed the connection (which is considered rude for TCP\/IP)
    +    close sk = shutdown sk ShutdownBoth >> sClose sk
    +
    +myrecv :: Socket -> Int -> IO String
    +myrecv sock len =
    +    let handler e = if isEOFError e then return [] else ioError e
    +        in System.IO.Error.catch (recv sock len) handler
    +
    +-- | Allows stream logging.
    +-- Refer to 'debugStream' below.
    +data Debug x = Dbg Handle x
    +
    +
    +instance (Stream x) => Stream (Debug x) where
    +    readBlock (Dbg h c) n =
    +        do { val <- readBlock c n
    +           ; hPutStrLn h ("readBlock " ++ show n ++ ' ' : show val)
    +           ; hFlush h
    +           ; return val
    +           }
    +
    +    readLine (Dbg h c) =
    +        do { val <- readLine c
    +           ; hPutStrLn h ("readLine " ++ show val)
    +           ; return val
    +           }
    +
    +    writeBlock (Dbg h c) str =
    +        do { val <- writeBlock c str
    +           ; hPutStrLn h ("writeBlock " ++ show val ++ ' ' : show str)
    +           ; return val
    +           }
    +
    +    close (Dbg h c) =
    +        do { hPutStrLn h "closing..."
    +           ; hFlush h
    +           ; close c
    +           ; hPutStrLn h "...closed"
    +           ; hClose h
    +           }
    +
    +
    +-- | Wraps a stream with logging I\/O, the first
    +-- argument is a filename which is opened in AppendMode.
    +debugStream :: (Stream a) => String -> a -> IO (Debug a)
    +debugStream file stm = 
    +    do { h <- openFile file AppendMode
    +       ; hPutStrLn h "File opened for appending."
    +       ; return (Dbg h stm)
    +       }
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-TCP.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-HTTPClient-TCP.html 1 + + + + +src/Happstack/Server/HTTPClient/TCP.hs + + + +
    {-# LANGUAGE ScopedTypeVariables, PatternSignatures #-}
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Server.HTTPClient.TCP
    +-- Copyright   :  (c) Warrick Gray 2002, Bjorn Bringert 2003-2004, Simon Foster 2004
    +-- License     :  BSD
    +--
    +-- Maintainer  :  bjorn@bringert.net
    +-- Stability   :  experimental
    +-- Portability :  non-portable (not tested)
    +--
    +-- An easy access TCP library. Makes the use of TCP in Haskell much easier.
    +-- This was originally part of Gray's\/Bringert's HTTP module.
    +--
    +-- * Changes by Simon Foster:
    +--      - Split module up into to sepearate Network.[Stream,TCP,HTTP] modules
    +--      
    +-----------------------------------------------------------------------------
    +module Happstack.Server.HTTPClient.TCP (
    +    -- ** Connections
    +    Conn(..),
    +    Connection(..),
    +    openTCP,
    +    openTCPPort,
    +    isConnectedTo
    +) where
    +
    +import Control.Exception.Extensible as Exception
    +
    +-- Networking
    +import Network.BSD
    +import Network.Socket
    +import Happstack.Server.HTTPClient.Stream
    +
    +import Data.List (elemIndex)
    +import Data.Char
    +import Data.IORef
    +
    +-----------------------------------------------------------------
    +------------------ TCP Connections ------------------------------
    +-----------------------------------------------------------------
    +
    +-- | The 'Connection' newtype is a wrapper that allows us to make
    +-- connections an instance of the StreamIn\/Out classes, without ghc extensions.
    +-- While this looks sort of like a generic reference to the transport
    +-- layer it is actually TCP specific, which can be seen in the
    +-- implementation of the 'Stream Connection' instance.
    +newtype Connection = ConnRef {getRef :: IORef Conn}
    +
    +
    +-- | The 'Conn' object allows input buffering, and maintenance of 
    +-- some admin-type data.
    +data Conn = MkConn { connSock :: ! Socket
    +                   , connAddr :: ! SockAddr 
    +                   , connBffr :: ! String 
    +                   , connHost :: String
    +                   }
    +          | ConnClosed
    +    deriving(Eq)
    +
    +
    +-- | Open a connection to port 80 on a remote host.
    +openTCP :: String -> IO Connection
    +openTCP host = openTCPPort host 80
    +
    +
    +-- | This function establishes a connection to a remote
    +-- host, it uses "getHostByName" which interrogates the
    +-- DNS system, hence may trigger a network connection.
    +--
    +-- Add a "persistant" option?  Current persistant is default.
    +-- Use "Result" type for synchronous exception reporting?
    +openTCPPort :: String -> Int -> IO Connection
    +openTCPPort uri port = 
    +    do { s <- socket AF_INET Stream 6
    +       ; setSocketOption s KeepAlive 1
    +       ; host <- Exception.catch (inet_addr uri)    -- handles ascii IP numbers
    +                       (\(_::SomeException) -> getHostByName uri >>= \host -> -- _shrug_ this will catch _any_ exception FIXME
    +                            case hostAddresses host of
    +                                [] -> return (error "no addresses in host entry")
    +                                (h:_) -> return h)
    +       ; let a = SockAddrInet (toEnum port) host
    +       ; Exception.catch (connect s a) (\(e::SomeException) -> sClose s >> throw e)
    +       ; v <- newIORef (MkConn s a [] uri)
    +       ; return (ConnRef v)
    +       }
    +
    +instance Stream Connection where
    +    readBlock ref n = 
    +        readIORef (getRef ref) >>= \conn -> case conn of
    +            ConnClosed -> return (Left ErrorClosed)
    +            (MkConn sk _addr bfr _hst)
    +                | length bfr >= n ->
    +                    do { modifyIORef (getRef ref) (\c -> c { connBffr=(drop n bfr) })
    +                       ; return (Right $ take n bfr)
    +                       }
    +                | otherwise ->
    +                    do { modifyIORef (getRef ref) (\c -> c { connBffr=[] })
    +                       ; more <- readBlock sk (n - length bfr)
    +                       ; return $ case more of
    +                            Left _ -> more
    +                            Right s -> (Right $ bfr ++ s)
    +                       }
    +
    +    -- This function uses a buffer, at this time the buffer is just 1000 characters.
    +    -- (however many bytes this is is left to the user to decypher)
    +    readLine ref =
    +        readIORef (getRef ref) >>= \conn -> case conn of
    +             ConnClosed -> return (Left ErrorClosed)
    +             (MkConn sk _addr bfr _)
    +                 | null bfr ->  {- read in buffer -}
    +                      do { str <- myrecv sk 1000  -- DON'T use "readBlock sk 1000" !!
    +                                                -- ... since that call will loop.
    +                         ; let len = length str
    +                         ; if len == 0   {- indicates a closed connection -}
    +                              then return (Right "")
    +                              else modifyIORef (getRef ref) (\c -> c { connBffr=str })
    +                                   >> readLine ref  -- recursion
    +                         }
    +                 | otherwise ->
    +                      case elemIndex '\n' bfr of
    +                          Nothing -> {- need recursion to finish line -}
    +                              do { modifyIORef (getRef ref) (\c -> c { connBffr=[] })
    +                                 ; more <- readLine ref -- contains extra recursion                      
    +                                 ; return $ more `bindE` \str -> Right (bfr++str)
    +                                 }
    +                          Just i ->    {- end of line found -}
    +                              let (bgn,end) = splitAt i bfr in
    +                              do { modifyIORef (getRef ref) (\c -> c { connBffr=(drop 1 end) })
    +                                 ; return (Right (bgn++['\n']))
    +                                 }
    +
    +
    +
    +    -- The 'Connection' object allows no outward buffering, 
    +    -- since in general messages are serialised in their entirety.
    +    writeBlock ref str =
    +        readIORef (getRef ref) >>= \conn -> case conn of
    +            ConnClosed -> return (Left ErrorClosed)
    +            (MkConn sk addr _ _) -> fn sk addr str `Exception.catch` (handleSocketError sk)
    +        where
    +            fn sk addr s
    +                | null s    = return (Right ())  -- done
    +                | otherwise =
    +                    getSocketOption sk SoError >>= \se ->
    +                    if se == 0
    +                        then sendTo sk s addr >>= \i -> fn sk addr (drop i s)
    +                        else writeIORef (getRef ref) ConnClosed >>
    +                             if se == 10054
    +                                 then return (Left ErrorReset)
    +                                 else return (Left $ ErrorMisc $ show se)
    +
    +
    +    -- Closes a Connection.  Connection will no longer
    +    -- allow any of the other Stream functions.  Notice that a Connection may close
    +    -- at any time before a call to this function.  This function is idempotent.
    +    -- (I think the behaviour here is TCP specific)
    +    close ref = 
    +        do { c <- readIORef (getRef ref)
    +           ; closeConn c `Exception.catch` (\(_::SomeException) -> return ()) -- FIXME see above
    +           ; writeIORef (getRef ref) ConnClosed
    +           }
    +        where
    +            -- Be kind to peer & close gracefully.
    +            closeConn (ConnClosed) = return ()
    +            closeConn (MkConn sk _addr [] _) =
    +                do { shutdown sk ShutdownSend
    +                   ; suck ref
    +                   ; shutdown sk ShutdownReceive
    +                   ; sClose sk
    +                   }
    +            closeConn (MkConn _ _ _ _) = error "Case in closeConn not supported"
    +
    +            suck :: Connection -> IO ()
    +            suck cn = readLine cn >>= 
    +                      either (\_ -> return ()) -- catch errors & ignore
    +                             (\x -> if null x then return () else suck cn)
    +
    +-- | Checks both that the underlying Socket is connected
    +-- and that the connection peer matches the given
    +-- host name (which is recorded locally).
    +isConnectedTo :: Connection -> String -> IO Bool
    +isConnectedTo conn name =
    +    do { v <- readIORef (getRef conn)
    +       ; case v of
    +            ConnClosed -> return False
    +            (MkConn sk _ _ h) ->
    +                if (map toLower h == map toLower name)
    +                then sIsConnected sk
    +                else return False
    +       }
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-MessageWrap.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-MessageWrap.html 1 + + + + +src/Happstack/Server/MessageWrap.hs + + + +
    {-# LANGUAGE FlexibleInstances #-}
    +
    +module Happstack.Server.MessageWrap where
    +
    +import qualified Data.ByteString.Char8 as P
    +import qualified Data.ByteString.Lazy.Char8 as L
    +import Data.Maybe
    +import Happstack.Server.HTTP.Types as H
    +import Happstack.Server.HTTP.Multipart
    +import Happstack.Server.SURI as SURI
    +import Happstack.Util.Common
    +
    +queryInput :: SURI -> [(String, Input)]
    +queryInput uri = formDecode (case SURI.query uri of
    +                               '?':r -> r
    +                               xs    -> xs)
    +
    +bodyInput :: Request -> [(String, Input)]
    +bodyInput req | (rqMethod req /= POST) && (rqMethod req /= PUT) = []
    +bodyInput req =
    +    let ctype = getHeader "content-type" req >>= parseContentType . P.unpack
    +        getBS (Body bs) = bs
    +    in decodeBody ctype (getBS $ rqBody req)
    +
    +
    +-- | Decodes application\/x-www-form-urlencoded inputs.      
    +formDecode :: String -> [(String, Input)]
    +formDecode [] = []
    +formDecode qString = 
    +    if null pairString then rest else 
    +           (SURI.unEscape name,simpleInput $ SURI.unEscape val):rest
    +    where (pairString,qString')= split (=='&') qString
    +          (name,val)=split (=='=') pairString
    +          rest=if null qString' then [] else formDecode qString'
    +
    +decodeBody :: Maybe ContentType
    +           -> L.ByteString
    +           -> [(String,Input)]
    +decodeBody ctype inp
    +    = case ctype of
    +        Just (ContentType "application" "x-www-form-urlencoded" _)
    +            -> formDecode (L.unpack inp)
    +        Just (ContentType "multipart" "form-data" ps)
    +            -> multipartDecode ps inp
    +        Just _ -> [] -- unknown content-type, the user will have to
    +                     -- deal with it by looking at the raw content
    +        -- No content-type given, assume x-www-form-urlencoded
    +        Nothing -> formDecode (L.unpack inp)
    +
    +-- | Decodes multipart\/form-data input.
    +multipartDecode :: [(String,String)] -- ^ Content-type parameters
    +                -> L.ByteString        -- ^ Request body
    +                -> [(String,Input)]  -- ^ Input variables and values.
    +multipartDecode ps inp =
    +    case lookup "boundary" ps of
    +         Just b -> case parseMultipartBody b inp of
    +                        Just (MultiPart bs) -> map bodyPartToInput bs
    +                        Nothing -> [] -- FIXME: report parse error
    +         Nothing -> [] -- FIXME: report that there was no boundary
    +
    +bodyPartToInput :: BodyPart -> (String,Input)
    +bodyPartToInput (BodyPart hs b) =
    +    case getContentDisposition hs of
    +              Just (ContentDisposition "form-data" ps) ->
    +                  (fromMaybe "" $ lookup "name" ps,
    +                   Input { inputValue = b,
    +                           inputFilename = lookup "filename" ps,
    +                           inputContentType = ctype })
    +              _ -> ("ERROR",simpleInput "ERROR") -- FIXME: report error
    +    where ctype = fromMaybe defaultInputType (getContentType hs)
    +
    +-- | Packs a string into an Input of type "text/plain"
    +simpleInput :: String -> Input
    +simpleInput v
    +    = Input { inputValue = L.pack v
    +            , inputFilename = Nothing
    +            , inputContentType = defaultInputType
    +            }
    +
    +-- | The default content-type for variables.
    +defaultInputType :: ContentType
    +defaultInputType = ContentType "text" "plain" [] -- FIXME: use some default encoding?
    +
    +-- | Get the path components from a String.
    +pathEls :: String -> [String]
    +pathEls = (drop 1) . map SURI.unEscape . splitList '/' 
    +
    +-- | Like 'Read' except Strings and Chars not quoted.
    +class (Read a)=>ReadString a where readString::String->a; readString =read 
    +
    +instance ReadString Int 
    +instance ReadString Double 
    +instance ReadString Float 
    +instance ReadString SURI.SURI where readString = read . show
    +instance ReadString [Char] where readString=id
    +instance ReadString Char where 
    +    readString s= if length t==1 then head t else read t where t=trim s 
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-MinHaXML.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-MinHaXML.html 1 + + + + +src/Happstack/Server/MinHaXML.hs + + + +
    {-# LANGUAGE TemplateHaskell, FlexibleInstances,
    +             OverlappingInstances, UndecidableInstances, TypeSynonymInstances #-}
    +
    +
    +  
    +module Happstack.Server.MinHaXML where
    +-- Copyright (c) Happstack.com 2009; (c) HAppS.org 2005. All Rights Reserved.
    +
    +import Prelude hiding (elem, pi)
    +
    +import Text.XML.HaXml.Types as Types
    +import Text.XML.HaXml.Escape
    +import Text.XML.HaXml.Pretty as Pretty
    +import Text.XML.HaXml.Verbatim as Verbatim
    +import Happstack.Util.Common
    +import System.Time
    +
    +import Happstack.Data.Xml as Xml
    +import Happstack.Data.Xml.HaXml
    +
    +type StyleURL=String
    +data StyleSheet = NoStyle
    +                | CSS {styleURL::StyleURL} 
    +                | XSL {styleURL::StyleURL} deriving (Read,Show)
    +hasStyleURL :: StyleSheet -> Bool
    +hasStyleURL NoStyle = False
    +hasStyleURL _ = True 
    +type Element = Types.Element
    +
    +	
    +
    +isCSS :: StyleSheet -> Bool
    +isCSS (CSS _)=True
    +isCSS _ = False
    +isXSL :: StyleSheet -> Bool
    +isXSL = not.isCSS
    +
    +t :: Name -> [(Name, String)] -> CharData -> Types.Element
    +t=textElem
    +l :: Name -> [(Name, String)] -> [Types.Element] -> Types.Element
    +l=listElem
    +e :: Name -> [(Name, String)] -> Types.Element
    +e=emptyElem
    +(</<) :: Name
    +         -> [(Name, String)]
    +         -> [Types.Element]
    +         -> Types.Element
    +(</<)=l
    +(<>) :: Name -> [(Name, String)] -> CharData -> Types.Element
    +(<>)=t
    +
    +
    +
    +xmlElem :: (t -> [Content])
    +           -> Name
    +           -> [(Name, String)]
    +           -> t
    +           -> Types.Element
    +xmlElem f = \name attrs val -> xmlelem name attrs (f val)
    +	where 
    +	xmlelem name = Types.Elem name . map (uncurry attr)
    +	attr name val= (name,AttValue [Left val])
    +
    +textElem :: Name -> [(Name, String)] -> CharData -> Types.Element
    +textElem = xmlElem (return.CString True)
    +emptyElem :: Name -> [(Name, String)] -> Types.Element
    +emptyElem = \n a->xmlElem id n a []
    +listElem :: Name
    +            -> [(Name, String)]
    +            -> [Types.Element]
    +            -> Types.Element
    +listElem = xmlElem $ map CElem
    +
    +cdataElem :: CharData -> Content
    +cdataElem = CString  False
    +
    +--	     Document (simpleProlog xsl) [] $ xmlEscape stdXmlEscaper root
    +simpleDocOld :: StyleSheet -> Types.Element -> String
    +simpleDocOld xsl = show . document . 
    +                flip (Document (simpleProlog xsl) []) [] . xmlStdEscape
    +
    +simpleDoc :: StyleSheet -> Types.Element -> String
    +simpleDoc style elem = ("<?xml version='1.0' encoding='UTF-8' ?>\n"++
    +                      if hasStyleURL style then pi else "") ++
    +                     (verbatim $ xmlStdEscape elem)
    +    where typeText=if isCSS style then "text/css" else "text/xsl"
    +          pi= "<?xml-stylesheet type=\""++ typeText  ++ 
    +              "\" href=\""++styleURL style++"\" ?>\n"
    +
    +
    +simpleDoc' :: StyleSheet -> Types.Element -> String
    +simpleDoc' style elem = (if hasStyleURL style then pi else "") ++
    +                        (verbatim $ xmlStdEscape elem)
    +    where typeText=if isCSS style then "text/css" else "text/xsl"
    +          pi= "<?xml-stylesheet type=\""++ typeText  ++ 
    +              "\" href=\""++styleURL style++"\" ?>\n"
    +
    +
    +
    +xmlEscaper :: XmlEscaper
    +xmlEscaper=stdXmlEscaper
    +xmlStdEscape :: Types.Element -> Types.Element
    +xmlStdEscape = xmlEscape stdXmlEscaper
    +verbim :: (Verbatim a) => a -> String
    +verbim = verbatim
    +
    +simpleProlog :: StyleSheet -> Prolog
    +simpleProlog style = 
    +    Prolog 
    +    (Just (XMLDecl "1.0" 
    +	   (Just $ EncodingDecl "UTF-8") 
    +	   Nothing -- standalone declaration
    +	  ))
    +    [] Nothing
    +           (if url=="" then [] else [pi])
    +	where
    +	pi = PI ("xml-stylesheet", "type=\""++typeText++"\" href=\""++url++"\"")
    +	typeText = if isCSS style then "text/css" else "text/xsl"
    +	url=if hasStyleURL style then styleURL style else ""
    +
    +nonEmpty :: Name -> String -> Maybe Types.Element
    +nonEmpty name val = if val=="" then Nothing
    +					else Just $ textElem name [] val
    +
    +getRoot :: Document -> Types.Element
    +getRoot (Document _ _ root _) = root
    +
    +--toXML .< "App" attrs ./>
    +--toXML .< "App" attrs .> []
    +data XML a = XML StyleSheet a
    +
    +class ToElement x where toElement::x->Types.Element
    +		
    +instance (ToElement x) => ToElement (Maybe x) where 
    +    toElement = maybe (emptyElem "Nothing" []) toElement
    +
    +instance ToElement String where toElement = textElem "String" []
    +instance ToElement Types.Element where toElement = id
    +instance ToElement CalendarTime where 
    +    toElement = recToEl "CalendarTime" 
    +                [attrFS "year" ctYear
    +                ,attrFS "month" (fromEnum.ctMonth)
    +                ,attrFS "day" ctDay
    +                ,attrFS "hour" ctHour
    +                ,attrFS "min" ctMin
    +                ,attrFS "sec" ctSec
    +                ,attrFS "time" time 
    +                ] []
    +        where time = epochPico
    +
    +instance ToElement Int where toElement = toElement . show
    +instance ToElement Integer where toElement = toElement . show
    +instance ToElement Float where toElement = toElement . show
    +instance ToElement Double where toElement = toElement . show
    +
    +
    +instance (Xml a) => ToElement a where
    +    toElement = un . head . map toHaXml . toXml
    +        where
    +        un (CElem el) = el
    +        un _ = error "Case not handled in Xml toElement instance"
    +
    +wrapElem :: (ToElement x) => Name -> x -> Types.Element
    +wrapElem tag x= listElem tag [] [toElement x]
    +elF :: (ToElement b) => Name -> (a -> b) -> a -> Types.Element
    +elF tag f = wrapElem tag.f 
    +-- label !<=! field = wrapField label field
    +attrF :: t1 -> (t -> String) -> t -> (t1, String)
    +attrF name f rec = (name,quoteEsc $ f rec)
    +attrFS :: (Show a) => t1 -> (t -> a) -> t -> (t1, String)
    +attrFS name f rec = (name,quoteEsc $ show $ f rec)
    +attrFMb :: (a -> String)
    +           -> String
    +           -> (a1 -> Maybe a)
    +           -> a1
    +           -> (String, String)
    +attrFMb r name f = maybe ("","") (\x->(name,quoteEsc $ r x)) . f 
    +
    +--(\x->(name,quoteEsc $ r x)) . f 
    +--(name,quoteEsc $ show $ f rec)
    +
    +quoteEsc :: String -> String
    +quoteEsc [] = []
    +quoteEsc ('"':list) = "&quot;" ++ quoteEsc list
    +quoteEsc (x:xs) = x:quoteEsc xs
    +
    +--quotescape \\ and " \"
    +
    +recToEl :: Name
    +           -> [a -> (String, String)]
    +           -> [a -> Types.Element]
    +           -> a
    +           -> Types.Element
    +recToEl name attrs els rec = listElem name attrs' (revmap rec els)
    +    where
    +    attrs' = filter (\ (x,_)->not $ null x) (revmap rec attrs)
    +listToEl :: (ToElement a) =>
    +            Name -> [(Name, String)] -> [a] -> Types.Element
    +listToEl name attrs = listElem name attrs . map toElement 
    +
    +toAttrs :: t -> [(t1, t -> t2)] -> [(t1, t2)]
    +toAttrs x = map (\ (s,f)->(s, f x)) 
    +
    +{--
    +toElement rules:
    +1. if the attr is an instance of toElement then it is a child.
    +2. if it named and is type string then it is shown that way.
    +3. if it named and has non-string type then use show on the value.
    +4. if the attributes are not named then use the type as the label and
    +   make the text child be a show of the object.
    +--}
    +
    +
    +newtype ElString = ElString {elString::String} deriving (Eq,Ord,Read,Show)
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-Parts.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-Parts.html 1 + + + + +src/Happstack/Server/Parts.hs + + + +
    {-# LANGUAGE NoMonomorphismRestriction, FlexibleContexts #-}
    +module Happstack.Server.Parts(
    +    compressedResponseFilter
    +   ,gzipFilter
    +   ,deflateFilter
    +   ,encodings
    +) where
    +import Happstack.Server.SimpleHTTP
    +import Text.ParserCombinators.Parsec
    +import Control.Monad
    +import Data.Maybe
    +import Data.List
    +import qualified Data.ByteString.Char8 as BS
    +import qualified Codec.Compression.GZip as GZ
    +import qualified Codec.Compression.Zlib as Z
    +
    +-- | reads the \"Accept-Encoding\" header.  Then, if possible
    +-- will compress the response body with methods "gzip" or "deflate"
    +--
    +-- Returns the name of the coding chosen
    +compressedResponseFilter::
    +    (FilterMonad Response m, MonadPlus m, WebMonad Response m, ServerMonad m)
    +    => m String
    +compressedResponseFilter = do
    +    getHeaderM "Accept-Encoding" >>=
    +        (maybe (return "identity") installHandler)
    +
    +  where
    +    badEncoding = "Encoding returned not in the list of known encodings"
    +
    +    installHandler accept = do
    +      let eEncoding = bestEncoding $ BS.unpack accept
    +      (coding,action) <- case eEncoding of
    +          Left _ -> do
    +            setResponseCode 406
    +            finishWith $ toResponse ""
    +
    +          Right a -> return (a, fromMaybe (fail badEncoding)
    +                                          (lookup a allEncodingHandlers))
    +
    +      setHeaderM "Content-Encoding" coding
    +      action
    +      return coding
    +
    +
    +-- | compresses the body of the response with gzip.
    +-- does not set any headers.
    +gzipFilter::(FilterMonad Response m) => m()
    +gzipFilter = do
    +    composeFilter (\r -> r{rsBody = GZ.compress $ rsBody r})
    +
    +-- | compresses the body of the response with zlib's
    +-- deflate method
    +-- does not set any headers.
    +deflateFilter::(FilterMonad Response m) => m()
    +deflateFilter = do
    +    composeFilter (\r -> r{rsBody = Z.compress $ rsBody r})
    +
    +-- | based on the rules describe in rfc2616 sec. 14.3
    +bestEncoding :: String -> Either String String
    +bestEncoding encs = do
    +        encList<-either (Left . show) (Right) $ parse encodings "" encs
    +        case acceptable encList of
    +            [] -> Left "no encoding found"
    +            a -> Right $ head a
    +    where
    +        -- first intersect with the list of encodings we know how to deal with at all
    +        knownEncodings:: [(String,Maybe Double)] -> [(String, Maybe Double)]
    +        knownEncodings m = intersectBy (\x y->fst x == fst y) m (map (\x -> (x,Nothing)) allEncodings)
    +        -- this expands the wildcard, by figuring out if we need to include "identity" in the list
    +        -- Then it deletes the wildcard entry, drops all the "q=0" entries (which aren't allowed).
    +        --
    +        -- note this implementation is a little conservative.  if someone were to specify "*"
    +        -- without a "q" value, it would be this server is willing to accept any format at all.
    +        -- We pretty much assume we can't send them /any/ format and that they really
    +        -- meant just "identity" this seems safe to me.
    +        knownEncodings':: [(String,Maybe Double)] -> [(String, Maybe Double)]
    +        knownEncodings' m = filter dropZero $ deleteBy (\(a,_) (b,_)->a==b) ("*",Nothing) $
    +            case lookup "*" (knownEncodings m) of
    +                Nothing -> addIdent $ knownEncodings m
    +                Just (Just a) | a>0 -> addIdent $ knownEncodings m
    +                              | otherwise -> knownEncodings m
    +                Just (Nothing) -> addIdent $ knownEncodings m
    +        dropZero (_, Just a) | a==0 = False
    +                          | otherwise = True
    +        dropZero (_, Nothing) = True
    +        addIdent:: [(String,Maybe Double)] -> [(String, Maybe Double)]
    +        addIdent m = if isNothing $ lookup "identity" m
    +            then m ++ [("identity",Nothing)]
    +            else m
    +        -- finally we sort the list of available encodings.
    +        acceptable:: [(String,Maybe Double)] -> [String]
    +        acceptable l = map fst $ sortBy (flip cmp) $  knownEncodings'  l
    +        -- let the client choose but break ties with gzip
    +        encOrder = reverse $ zip (reverse allEncodings) [1..]
    +        m0 = maybe (0.0::Double) id
    +        cmp (s,mI) (t,mJ) | m0 mI == m0 mJ
    +            = compare (m0 $ lookup s encOrder) (m0 $ lookup t encOrder)
    +                          | otherwise = compare (m0 mI) (m0 mJ)
    +
    +
    +allEncodingHandlers:: (FilterMonad Response m) => [(String, m ())]
    +allEncodingHandlers = zip allEncodings handlers
    +
    +allEncodings :: [String]
    +allEncodings =
    +    ["gzip"
    +    ,"x-gzip"
    +--    ,"compress" -- as far as I can tell there is no haskell library that supports this
    +--    ,"x-compress" -- as far as I can tell, there is no haskell library that supports this
    +    ,"deflate"
    +    ,"identity"
    +    ,"*"
    +    ]
    +
    +handlers::(FilterMonad Response m) => [m ()]
    +handlers =
    +    [gzipFilter
    +    ,gzipFilter
    +--    ,compressFilter
    +--    ,compressFilter
    +    ,deflateFilter
    +    ,return ()
    +    ,fail "chose * as content encoding"
    +    ]
    +
    +-- | unsupported:  a parser for the Accept-Encoding header
    +encodings :: GenParser Char st [([Char], Maybe Double)]
    +encodings = ws >> (encoding1 `sepBy` try sep) >>= (\x -> ws >> eof >> return x)
    +    where
    +        ws = many space
    +        sep = do
    +            ws
    +            char ','
    +            ws
    +        
    +        encoding1 :: GenParser Char st ([Char], Maybe Double)
    +        encoding1 = do
    +            encoding <- many1 (alphaNum <|> char '-') <|> string "*"
    +            ws
    +            quality<-optionMaybe qual
    +            return (encoding, fmap read quality)
    +        qual = do
    +            char ';' >> ws >> char 'q' >> ws >> char '=' >> ws
    +            q<-float
    +            return q
    +        int = many1 digit
    +        float = do
    +                wholePart<-many1 digit
    +                fractionalPart<-option "" fraction
    +                return $ wholePart ++ fractionalPart
    +            <|>
    +                do
    +                fractionalPart<-fraction
    +                return fractionalPart
    +        fraction :: GenParser Char st String
    +        fraction = do
    +            char '.'
    +            fractionalPart<-option "" int
    +            return $ '.':fractionalPart
    +
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-SURI-ParseURI.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-SURI-ParseURI.html 1 + + + + +src/Happstack/Server/SURI/ParseURI.hs + + + +
    module Happstack.Server.SURI.ParseURI(parseURIRef) where
    +
    +import qualified Data.ByteString.Internal as BB
    +import qualified Data.ByteString.Unsafe   as BB
    +import Data.ByteString.Char8 as BC
    +import Prelude hiding(break,length,null,drop,splitAt)
    +import Network.URI
    +
    +import Happstack.Util.ByteStringCompat
    +
    +parseURIRef :: ByteString -> URI
    +parseURIRef fs =
    +  case break (\c -> ':' == c || '/' == c || '?' == c || '#' == c) fs of
    +  (initial,rest) ->
    +      let ui = unpack initial
    +      in case uncons rest of
    +         Nothing ->
    +             if null initial then nullURI -- empty uri
    +                             else -- uri not containing either ':' or '/'
    +                                  nullURI { uriPath = ui }
    +         Just (c, rrest) ->
    +             case c of
    +             ':' -> pabsuri   rrest $ URI (unpack initial)
    +             '/' -> puriref   fs    $ URI "" Nothing
    +             '?' -> pquery    rrest $ URI "" Nothing ui
    +             '#' -> pfragment rrest $ URI "" Nothing ui ""
    +             _   -> error "parseURIRef: Can't happen"
    +
    +pabsuri :: ByteString
    +           -> (Maybe URIAuth -> String -> String -> String -> b)
    +           -> b
    +pabsuri fs cont =
    +  if length fs >= 2 && unsafeHead fs == '/' && unsafeIndex fs 1 == '/'
    +     then pauthority (drop 2 fs) cont
    +     else puriref fs $ cont Nothing
    +pauthority :: ByteString
    +              -> (Maybe URIAuth -> String -> String -> String -> b)
    +              -> b
    +pauthority fs cont =
    +  let (auth,rest) = breakChar '/' fs
    +  in puriref rest $! cont (Just $! pauthinner auth)
    +pauthinner :: ByteString -> URIAuth
    +pauthinner fs =
    +  case breakChar '@' fs of
    +    (a,b) -> pauthport b  $ URIAuth (unpack a)
    +pauthport :: ByteString -> (String -> String -> t) -> t
    +pauthport fs cont =
    +  let spl idx = splitAt (idx+1) fs
    +  in case unsafeHead fs of
    +      _ | null fs -> cont "" ""
    +      '['         -> case fmap spl (elemIndexEnd ']' fs) of
    +                       Just (a,b) | null b              -> cont (unpack a) ""
    +                                  | unsafeHead b == ':' -> cont (unpack a) (unpack $ unsafeTail b)
    +                       x                                -> error ("Parsing uri failed (pauthport):"++show x)
    +      _           -> case breakCharEnd ':' fs of
    +                       (a,b) -> cont (unpack a) (unpack b)
    +puriref :: ByteString -> (String -> String -> String -> b) -> b
    +puriref fs cont =
    +  let (u,r) = break (\c -> '#' == c || '?' == c) fs
    +  in case unsafeHead r of
    +      _ | null r -> cont (unpack u) "" ""
    +      '?'        -> pquery    (unsafeTail r) $ cont (unpack u)
    +      '#'        -> pfragment (unsafeTail r) $ cont (unpack u) ""
    +      _          -> error "unexpected match"
    +pquery :: ByteString -> (String -> String -> t) -> t
    +pquery fs cont =
    +  case breakChar '#' fs of
    +    (a,b) -> cont ('?':unpack a) (unpack b)
    +pfragment :: ByteString -> (String -> b) -> b
    +pfragment fs cont =
    +  cont $ unpack fs
    +
    +
    +
    +unsafeTail :: ByteString -> ByteString
    +unsafeTail = BB.unsafeTail
    +unsafeHead :: ByteString -> Char
    +unsafeHead = BB.w2c . BB.unsafeHead
    +unsafeIndex :: ByteString -> Int -> Char
    +unsafeIndex s = BB.w2c . BB.unsafeIndex s
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-SURI.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-SURI.html 1 + + + + +src/Happstack/Server/SURI.hs + + + +
    {-# LANGUAGE TypeSynonymInstances, DeriveDataTypeable #-}
    +
    +module Happstack.Server.SURI where
    +import Data.Maybe
    +import Data.Generics
    +import Happstack.Util.Common(mapFst)
    +import qualified Network.URI as URI
    +
    +-- | Retrieves the path component from the URI
    +path :: SURI -> String
    +path  = URI.uriPath . suri
    +
    +-- | Retrieves the query component from the URI
    +query :: SURI -> String
    +query  = URI.uriQuery . suri
    +
    +-- | Retrieves the scheme component from the URI
    +scheme :: SURI -> String
    +scheme  = URI.uriScheme . suri
    +
    +-- | Modifies the scheme component of the URI using the provided function
    +u_scheme :: (String -> String) -> SURI -> SURI
    +u_scheme f (SURI u) = SURI (u {URI.uriScheme=f $ URI.uriScheme u})
    +
    +-- | Modifies the path component of the URI using the provided function
    +u_path :: (String -> String) -> SURI -> SURI
    +u_path f (SURI u) = SURI $ u {URI.uriPath=f $ URI.uriPath u}
    +
    +-- | Sets the scheme component of the URI
    +a_scheme :: String -> SURI -> SURI
    +a_scheme a (SURI u) = SURI $ u {URI.uriScheme=a}
    +
    +-- | Sets the path component of the URI
    +a_path :: String -> SURI -> SURI
    +a_path a (SURI u) = SURI $ u {URI.uriPath=a}
    +
    +escape, unEscape :: String -> String
    +unEscape = URI.unEscapeString . map (\x->if x=='+' then ' ' else x)
    +escape = URI.escapeURIString URI.isAllowedInURI
    +
    +-- | Returns true if the URI is absolute
    +isAbs :: SURI -> Bool
    +isAbs = not . null . URI.uriScheme . suri
    +
    +newtype SURI = SURI {suri::URI.URI} deriving (Eq,Data,Typeable)
    +instance Show SURI where
    +    showsPrec d (SURI uri) = showsPrec d $ show uri
    +instance Read SURI where
    +    readsPrec d = mapFst fromJust .  filter (isJust . fst) . mapFst parse . readsPrec d 
    +
    +instance Ord SURI where
    +    compare a b = show a `compare` show b
    +
    +-- | Render should be used for prettyprinting URIs.
    +render :: (ToSURI a) => a -> String
    +render = show . suri . toSURI
    +
    +-- | Parses a URI from a String.  Returns Nothing on failure.
    +parse :: String -> Maybe SURI
    +parse =  fmap SURI . URI.parseURIReference 
    +
    +-- | Convenience class for converting data types to URIs
    +class ToSURI x where toSURI::x->SURI
    +
    +instance ToSURI SURI where toSURI=id
    +instance ToSURI URI.URI where toSURI=SURI
    +instance ToSURI String where 
    +    toSURI = maybe (SURI $ URI.URI "" Nothing "" "" "") id . parse
    +
    +
    +--handling obtaining things from URI paths
    +class FromPath x where fromPath::String->x
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-SimpleHTTP.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-SimpleHTTP.html 1 + + + + +src/Happstack/Server/SimpleHTTP.hs + + + +
    
    +{-# LANGUAGE UndecidableInstances #-}
    +{-# LANGUAGE OverlappingInstances #-}
    +{-# LANGUAGE ScopedTypeVariables #-}
    +{-# LANGUAGE FlexibleInstances #-}
    +{-# LANGUAGE TypeSynonymInstances #-}
    +{-# LANGUAGE MultiParamTypeClasses #-}
    +{-# LANGUAGE PatternGuards #-}
    +{-# LANGUAGE FlexibleContexts #-}
    +{-# LANGUAGE FunctionalDependencies #-}
    +{-# LANGUAGE GeneralizedNewtypeDeriving #-}
    +{-# LANGUAGE PatternSignatures #-}
    +
    +{-# OPTIONS -fno-warn-orphans #-}
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Server.SimpleHTTP
    +-- Copyright   :  (c) Happstack.com 2009; (c) HAppS Inc 2007
    +-- License     :  BSD-like
    +--
    +-- Maintainer  :  lemmih@vo.com
    +-- Stability   :  provisional
    +-- Portability :  requires mtl
    +--
    +-- SimpleHTTP provides a back-end independent API for handling HTTP requests.
    +--
    +-- By default, the built-in HTTP server will be used. However, other back-ends
    +-- like CGI\/FastCGI can be used if so desired.
    +--
    +-- So the general nature of 'simpleHTTP' is just what you'd expect
    +-- from a web application container.  First you figure out which function is
    +-- going to process your request, process the request to generate a response,
    +-- then return that response to the client. The web application container is
    +-- started with 'simpleHTTP', which takes a configuration and a
    +-- response-building structure ('ServerPartT' which I'll return to in a
    +-- moment), picks the first handler that is willing to accept the request, and
    +-- passes the request in to the handler.  A simple "hello world" style Happstack
    +-- simpleHTTP server looks like:
    +--
    +-- >  main = simpleHTTP nullConf $ return "Hello World!"
    +--
    +-- @simpleHTTP nullConf@ creates a HTTP server on port 8000.
    +-- return \"Hello World!\" creates a 'ServerPartT' that just returns that text.
    +--
    +-- 'ServerPartT' is the basic response builder.  As you might expect, it's a
    +-- container for a function that takes a Request and converts it to a response
    +-- suitable for sending back to the server.  Most of the time though you don't
    +-- even need to worry about that as 'ServerPartT' hides almost all the machinery
    +-- for building your response by exposing a few type classes.
    +--
    +-- 'ServerPartT' is a pretty rich monad.  You can interact with your request,
    +-- your response, do IO, etc.  Here is a do block that validates basic
    +-- authentication.  It takes a realm name as a string, a Map of username to
    +-- password and a server part to run if authentication fails.
    +--
    +-- 'basicAuth' acts like a guard, and only produces a response when
    +-- authentication fails.  So put it before any 'ServerPartT' for which you want to demand
    +-- authentication, in any collection of 'ServerPartT's.
    +--
    +-- > main = simpleHTTP nullConf $ myAuth, return "Hello World!"
    +-- >     where
    +-- >         myAuth = basicAuth' "Test"
    +-- >             (M.fromList [("hello", "world")]) (return "Login Failed")
    +--
    +-- > basicAuth' realmName authMap unauthorizedPart =
    +-- >    do
    +-- >        let validLogin name pass = M.lookup name authMap == Just pass
    +-- >        let parseHeader = break (':'==) . Base64.decode . B.unpack . B.drop 6
    +-- >        authHeader <- getHeaderM "authorization"
    +-- >        case authHeader of
    +-- >            Nothing -> err
    +-- >            Just x  -> case parseHeader x of
    +-- >                (name, ':':pass) | validLogin name pass -> mzero
    +-- >                                   | otherwise -> err
    +-- >                _                                       -> err
    +-- >    where
    +-- >        err = do
    +-- >            unauthorized ()
    +-- >            setHeaderM headerName headerValue
    +-- >            unauthorizedPart
    +-- >        headerValue = "Basic realm=\"" ++ realmName ++ "\""
    +-- >        headerName  = "WWW-Authenticate"
    +--
    +-- Here is another example that uses 'liftIO' to embed IO in a request process:
    +--
    +-- >  main = simpleHTTP nullConf $ myPart
    +-- >  myPart = do
    +-- >    line <- liftIO $ do -- IO
    +-- >        putStr "return? "
    +-- >        getLine
    +-- >    when (take 2 line /= "ok") $ (notfound () >> return "refused")
    +-- >    return "Hello World!"
    +--
    +-- This example will ask in the console \"return? \" if you type \"ok\" it will
    +-- show \"Hello World!\" and if you type anything else it will return a 404.
    +--
    +-----------------------------------------------------------------------------
    +module Happstack.Server.SimpleHTTP
    +    ( module Happstack.Server.HTTP.Types
    +    , module Happstack.Server.Cookie
    +    -- * SimpleHTTP
    +    , simpleHTTP
    +    , simpleHTTP'
    +    , simpleHTTP''
    +    , simpleHTTPWithSocket
    +    , simpleHTTPWithSocket'
    +    , bindPort
    +    , parseConfig
    +    -- * ServerPartT
    +    , ServerPartT(..)
    +    , ServerPart
    +    , runServerPartT
    +    , mapServerPartT
    +    , mapServerPartT'
    +    , withRequest
    +    , anyRequest
    +    -- * WebT
    +    , WebT(..)
    +    , UnWebT
    +    , FilterFun
    +    , Web
    +    , mkWebT
    +    , ununWebT
    +    , runWebT
    +    , mapWebT
    +    -- * Type Classes
    +    , FromReqURI(..)
    +    , ToMessage(..)
    +
    +      -- * Manipulating requests
    +    , FromData(..)
    +    , ServerMonad(..)
    +    , RqData
    +    , noHandle
    +    , getHeaderM
    +    , escape
    +    , escape'
    +    , multi
    +      -- * Manipulating responses
    +    , FilterMonad(..)
    +    , ignoreFilters
    +    , SetAppend(..)
    +    , FilterT(..)
    +    , WebMonad(..)
    +    , ok
    +    , modifyResponse
    +    , toResponseBS
    +    , setResponseCode
    +    , badGateway
    +    , internalServerError
    +    , badRequest
    +    , unauthorized
    +    , forbidden
    +    , notFound
    +    , seeOther
    +    , found
    +    , movedPermanently
    +    , tempRedirect
    +    , addCookie
    +    , addCookies
    +    , expireCookie
    +    , addHeaderM
    +    , setHeaderM
    +    , ifModifiedSince
    +
    +     -- * guards and building blocks
    +    , guardRq
    +    , dir
    +    , dirs
    +    , host
    +    , withHost
    +    , method
    +    , methodSP
    +    , methodM
    +    , methodOnly
    +    , nullDir
    +    , path
    +    , anyPath
    +    , anyPath'
    +    , trailingSlash
    +    , withData
    +    , withDataFn
    +    , getDataFn
    +    , getData
    +    , require
    +    , requireM
    +    , basicAuth
    +    , uriRest
    +    , flatten
    +    , localContext
    +      -- * proxying
    +    , proxyServe
    +    , rproxyServe
    +      -- * unknown
    +    , debugFilter
    +    , applyRequest
    +      -- * Parsing input and cookies
    +    , lookInput   -- :: String -> Data Input
    +    , lookBS      -- :: String -> Data B.ByteString
    +    , look        -- :: String -> Data String
    +    , lookCookie  -- :: String -> Data Cookie
    +    , lookCookieValue -- :: String -> Data String
    +    , readCookieValue -- :: Read a => String -> Data a
    +    , lookRead    -- :: Read a => String -> Data a
    +    , lookPairs
    +      -- * XSLT
    +    , xslt ,doXslt
    +      -- * Error Handlng
    +    , errorHandlerSP
    +    , simpleErrorHandler
    +    , spUnwrapErrorT
    +      -- * Output Validation
    +    , setValidator
    +    , setValidatorSP
    +    , validateConf
    +    , runValidator
    +    , wdgHTMLValidator
    +    , noopValidator
    +    , lazyProcValidator
    +    ) where
    +
    +import Happstack.Server.HTTP.Types hiding (Version(..))
    +import Happstack.Server.Cookie
    +
    +import qualified Paths_happstack_server          as Cabal
    +
    +import qualified Data.Version                    as DV
    +import Happstack.Server.HTTP.Client              (getResponse, unproxify, unrproxify)
    +import Happstack.Data.Xml.HaXml                  (toHaXmlEl)
    +import qualified Happstack.Server.MinHaXML       as H
    +import qualified Happstack.Server.HTTP.Listen    as Listen (listen, listen',listenOn) -- So that we can disambiguate 'Writer.listen'
    +import Happstack.Server.XSLT                     (XSLTCmd, XSLPath, procLBSIO)
    +import Happstack.Server.SURI                     (ToSURI)
    +import Happstack.Util.Common                     (Seconds, readM)
    +import Happstack.Data                            (Xml, normalize, fromPairs, Element, toXml, toPublicXml) -- used by default implementation of fromData
    +import Network                                   (PortID(..), Socket)
    +import Control.Applicative                       (Applicative, pure, (<*>))
    +import Control.Concurrent                        (forkIO)
    +import Control.Exception                         (evaluate)
    +import Control.Monad                             ( MonadPlus, mzero, mplus
    +                                                 , msum, ap, unless
    +                                                 , liftM, liftM2, liftM3, liftM4
    +                                                 )
    +import Control.Monad.Trans                       ( MonadTrans, lift
    +                                                 , MonadIO, liftIO
    +                                                 )
    +import Control.Monad.Reader                      ( ReaderT(ReaderT), runReaderT
    +                                                 , MonadReader, ask, local
    +                                                 , asks
    +                                                 )
    +import Control.Monad.Writer                      ( WriterT(WriterT), runWriterT
    +                                                 , MonadWriter, tell, pass
    +                                                 , listens
    +                                                 )
    +import qualified Control.Monad.Writer            as Writer (listen) -- So that we can disambiguate 'Listen.listen'
    +import Control.Monad.State                       (MonadState, get, put)
    +import Control.Monad.Error                       ( ErrorT(ErrorT), runErrorT
    +                                                 , Error, strMsg
    +                                                 , MonadError, throwError, catchError
    +                                                 , mapErrorT
    +                                                 )
    +import Control.Monad.Maybe                       (MaybeT(MaybeT), runMaybeT)
    +import Data.Char                                 (ord)
    +import Data.Maybe                                (fromMaybe)
    +import Data.Monoid                               ( Monoid, mempty, mappend
    +                                                 , Dual(Dual), getDual
    +                                                 , Endo(Endo), appEndo
    +                                                 )
    +
    +import qualified Data.ByteString.Char8           as B
    +import qualified Data.ByteString.Lazy.Char8      as L
    +import qualified Data.ByteString.Lazy.UTF8       as LU (toString, fromString)
    +
    +import qualified Data.Generics                   as G
    +import qualified Data.Map                        as M
    +
    +import Text.Html                                 (Html, renderHtml)
    +import qualified Text.XHtml                      as XHtml (Html, renderHtml)
    +
    +import qualified Happstack.Crypto.Base64         as Base64
    +import Data.Char                                 (toLower)
    +import Data.List                                 (isPrefixOf,stripPrefix,tails,inits)
    +import System.IO                                 (hGetContents, hClose)
    +import System.Console.GetOpt                     ( OptDescr(Option)
    +                                                 , ArgDescr(ReqArg)
    +                                                 , ArgOrder(Permute)
    +                                                 , getOpt
    +                                                 )
    +import System.Locale                             (defaultTimeLocale)
    +import System.Process                            (runInteractiveProcess, waitForProcess)
    +import System.Time                               (CalendarTime, formatCalendarTime)
    +import System.Exit                               (ExitCode(ExitSuccess, ExitFailure))
    +import System.FilePath                           (makeRelative, splitDirectories)
    +import Debug.Trace                               (trace)
    +
    +-- | An alias for WebT when using IO.
    +type Web a = WebT IO a
    +-- | An alias for using ServerPartT when using the IO.
    +type ServerPart a = ServerPartT IO a
    +
    +--------------------------------------
    +-- HERE BEGINS ServerPartT definitions
    +
    +-- | ServerPartT is a container for processing requests and returning results.
    +newtype ServerPartT m a = ServerPartT { unServerPartT :: ReaderT Request (WebT m) a }
    +    deriving (Monad, MonadIO, MonadPlus, Functor)
    +
    +-- | particularly useful when combined with runWebT to produce
    +-- a @m (Maybe Response)@ from a request.
    +runServerPartT :: ServerPartT m a -> Request -> WebT m a
    +runServerPartT = runReaderT . unServerPartT
    +
    +withRequest :: (Request -> WebT m a) -> ServerPartT m a
    +withRequest = ServerPartT . ReaderT
    +
    +-- | Used to manipulate the containing monad.  Very useful when embedding a
    +-- monad into a 'ServerPartT', since 'simpleHTTP' requires a @ServerPartT IO a@.
    +-- Refer to 'WebT' for an explanation of the structure of the monad.
    +--
    +-- Here is an example.  Suppose you want to embed an 'ErrorT' into your
    +-- 'ServerPartT' to enable 'throwError' and 'catchError' in your 'Monad'.
    +--
    +-- > type MyServerPartT e m a = ServerPartT (ErrorT e m) a
    +--
    +-- Now suppose you want to pass @MyServerPartT@ into a function
    +-- that demands a @ServerPartT IO a@ (e.g. 'simpleHTTP').  You
    +-- can provide the function:
    +--
    +-- >   unpackErrorT:: (Monad m, Show e) => UnWebT (ErrorT e m) a -> UnWebT m a
    +-- >   unpackErrorT handler et = do
    +-- >      eitherV <- runErrorT et
    +-- >      return $ case eitherV of
    +-- >          Left err -> Just (Left "Catastrophic failure " ++ show e
    +-- >                           , Set $ Endo $ \r -> r{rsCode = 500})
    +-- >          Right x -> x
    +--
    +-- With @unpackErrorT@ you can now call 'simpleHTTP'. Just wrap your @ServerPartT@ list.
    +--
    +-- >  simpleHTTP nullConf $ mapServerPartT unpackErrorT (myPart `catchError` myHandler)
    +--
    +-- Or alternatively:
    +--
    +-- >  simpleHTTP' unpackErrorT nullConf (myPart `catchError` myHandler)
    +--
    +-- Also see 'spUnwrapErrorT' for a more sophisticated version of this function.
    +--
    +mapServerPartT :: (     UnWebT m a ->      UnWebT n b)
    +               -> (ServerPartT m a -> ServerPartT n b)
    +mapServerPartT f ma = withRequest $ \rq -> mapWebT f (runServerPartT ma rq)
    +
    +-- | A variant of 'mapServerPartT' where the first argument also takes a request.
    +-- Useful if you want to 'runServerPartT' on a different 'ServerPartT' inside your
    +-- monad (see 'spUnwrapErrorT').
    +mapServerPartT' :: (Request -> UnWebT m a ->      UnWebT n b)
    +                -> (      ServerPartT m a -> ServerPartT n b)
    +mapServerPartT' f ma = withRequest $ \rq -> mapWebT (f rq) (runServerPartT ma rq)
    +
    +instance MonadTrans (ServerPartT) where
    +    lift m = withRequest (\_ -> lift m)
    +
    +instance (Monad m) => Monoid (ServerPartT m a) where
    +    mempty  = mzero
    +    mappend = mplus
    +
    +instance (Monad m, Functor m) => Applicative (ServerPartT m) where
    +    pure = return
    +    (<*>) = ap
    +
    +instance (Monad m, MonadWriter w m) => MonadWriter w (ServerPartT m) where
    +    tell = lift . tell
    +    listen m = withRequest $ \rq ->  Writer.listen (runServerPartT m rq) >>= return
    +    pass m = withRequest $ \rq -> pass (runServerPartT m rq) >>= return
    +
    +instance (Monad m, MonadError e m) => MonadError e (ServerPartT m) where
    +    throwError e = lift $ throwError e
    +    catchError action handler = withRequest $ \rq -> (runServerPartT action rq) `catchError` ((flip runServerPartT $ rq) . handler)
    +
    +instance (Monad m, MonadReader r m) => MonadReader r (ServerPartT m) where
    +    ask = lift ask
    +    local fn m = withRequest $ \rq-> local fn (runServerPartT m rq)
    +
    +instance Monad m => FilterMonad Response (ServerPartT m) where
    +    setFilter = anyRequest . setFilter
    +    composeFilter = anyRequest . composeFilter
    +    getFilter m = withRequest $ \rq -> getFilter (runServerPartT m rq)
    +
    +instance Monad m => WebMonad Response (ServerPartT m) where
    +    finishWith r = anyRequest $ finishWith r
    +
    +-- | Yes, this is exactly like 'ReaderT' with new names.
    +-- Why you ask? Because 'ServerT' can lift up a 'ReaderT'.
    +-- If you did that, it would shadow ServerT's behavior
    +-- as a ReaderT, thus meaning if you lifted the ReaderT
    +-- you could no longer modify the 'Request'.  This way
    +-- you can add a 'ReaderT' to your monad stack without
    +-- any trouble.
    +class Monad m => ServerMonad m where
    +    askRq   :: m Request
    +    localRq :: (Request -> Request) -> m a -> m a
    +
    +instance (Monad m) => ServerMonad (ServerPartT m) where
    +    askRq = ServerPartT $ ask
    +    localRq f m = ServerPartT $ local f (unServerPartT m)
    +
    +instance (Error e, ServerMonad m) => ServerMonad (ErrorT e m) where
    +    askRq     = lift askRq
    +    localRq f = mapErrorT $ localRq f
    +
    +-------------------------------
    +-- HERE BEGINS WebT definitions
    +
    +-- | A monoid operation container.
    +-- If a is a monoid, then 'SetAppend' is a monoid with the following behaviors:
    +--
    +-- >  Set    x `mappend` Append y = Set    (x `mappend` y)
    +-- >  Append x `mappend` Append y = Append (x `mappend` y)
    +-- >  _        `mappend` Set y    = Set y
    +--
    +-- A simple way of summarizing this is, if the right side is @Append@, then the
    +-- right is appended to the left.  If the right side is @Set@, then the left side
    +-- is ignored.
    +
    +data SetAppend a = Set a | Append a
    +    deriving (Eq, Show)
    +
    +instance Monoid a => Monoid (SetAppend a) where
    +   mempty = Append mempty
    +
    +   Set    x `mappend` Append y = Set    (x `mappend` y)
    +   Append x `mappend` Append y = Append (x `mappend` y)
    +   _        `mappend` Set y    = Set y
    +
    +-- | Extract the value from a SetAppend.
    +-- Note that a SetAppend is actually a CoPointed from:
    +-- <http://hackage.haskell.org/packages/archive/category-extras/latest/doc/html/Control-Functor-Pointed.html>
    +-- But lets not drag in that dependency. yet...
    +extract :: SetAppend t -> t
    +extract (Set    x) = x
    +extract (Append x) = x
    +
    +instance Functor (SetAppend) where
    +    fmap f (Set    x) = Set    $ f x
    +    fmap f (Append x) = Append $ f x
    +
    +-- | @FilterFun@ is a lot more fun to type than @SetAppend (Dual (Endo a))@.
    +type FilterFun a = SetAppend (Dual (Endo a))
    +
    +unFilterFun :: FilterFun a -> (a -> a)
    +unFilterFun = appEndo . getDual . extract
    +
    +newtype FilterT a m b = FilterT { unFilterT :: WriterT (FilterFun a) m b }
    +   deriving (Monad, MonadTrans, Functor, MonadIO)
    +
    +-- | A set of functions for manipulating filters.  A 'ServerPartT' implements
    +-- 'FilterMonad' 'Response' so these methods are the fundamental ways of
    +-- manipulating the response object, especially before you've converted your
    +-- monadic value to a 'Response'.
    +class Monad m => FilterMonad a m | m->a where
    +    -- | Ignores all previous alterations to your filter
    +    --
    +    -- As an example:
    +    --
    +    -- > do
    +    -- >   composeFilter f
    +    -- >   setFilter g
    +    -- >   return "Hello World"
    +    --
    +    -- setFilter g will cause the first composeFilter to be ignored.
    +    setFilter :: (a->a) -> m ()
    +    -- | Composes your filter function with the existing filter
    +    -- function.
    +    composeFilter :: (a->a) -> m ()
    +    -- | Retrives the filter from the environment.
    +    getFilter :: m b -> m (b, a->a)
    +
    +instance (Monad m) => FilterMonad a (FilterT a m) where
    +    setFilter     = FilterT . tell                . Set    . Dual . Endo
    +    composeFilter = FilterT . tell                . Append . Dual . Endo
    +    getFilter     = FilterT . listens unFilterFun . unFilterT
    +
    +-- | The basic response building object.
    +newtype WebT m a = WebT { unWebT :: ErrorT Response (FilterT (Response) (MaybeT m)) a }
    +    deriving (MonadIO, Functor)
    +
    +-- |
    +--  It is worth discussing the unpacked structure of 'WebT' a bit as it's exposed
    +--  in 'mapServerPartT' and 'mapWebT'.
    +--
    +--  A fully unpacked 'WebT' has a structure that looks like:
    +--
    +--  > ununWebT $ WebT m a :: m (Maybe (Either Response a, FilterFun Response))
    +--
    +--  So, ignoring @m@, as it is just the containing 'Monad', the outermost layer is
    +--  a 'Maybe'.  This is 'Nothing' if 'mzero' was called or @'Just' ('Either' 'Response'
    +--  a, 'SetAppend' ('Endo' 'Response'))@ if 'mzero' wasn't called.  Inside the 'Maybe',
    +--  there is a pair.  The second element of the pair is our filter function
    +--  @'FilterFun' 'Response'@.  @'FilterFun' 'Response'@ is a type alias for @'SetAppend'
    +--  ('Dual' ('Endo' 'Response'))@.  This is just a wrapper for a @'Response' -> 'Response'@
    +--  function with a particular 'Monoid' behavior.  The value
    +--
    +--  >  Append (Dual (Endo f))
    +--
    +--  Causes f to be composed with the previous filter.
    +--
    +--  >  Set (Dual (Endo f))
    +--
    +--  Causes f to not be composed with the previous filter.
    +--
    +--  Finally, the first element of the pair is either @Left Response@ or @Right a@.
    +--
    +--  Another way of looking at all these pieces is from the behaviors
    +--  they control.  The 'Maybe' controls the 'mzero' behavior.  @Set
    +--  (Endo f)@ comes from the 'setFilter' behavior.  Likewise, @Append
    +--  (Endo f)@ is from 'composeFilter'.  @Left Response@ is what you
    +--  get when you call 'finishWith' and @Right a@ is the normal exit.
    +--
    +--  An example case statement looks like:
    +--
    +--  >  ex1 webt = do
    +--  >    val <- ununWebT webt
    +--  >    case val of
    +--  >        Nothing -> Nothing  -- this is the interior value when mzero was used
    +--  >        Just (Left r, f) -> Just (Left r, f) -- r is the value that was passed into "finishWith"
    +--  >                                             -- f is our filter function
    +--  >        Just (Right a, f) -> Just (Right a, f) -- a is our normal monadic value
    +--  >                                               -- f is still our filter function
    +--
    +type UnWebT m a = m (Maybe (Either Response a, FilterFun Response))
    +
    +instance Monad m => Monad (WebT m) where
    +    m >>= f = WebT $ unWebT m >>= unWebT . f
    +    return a = WebT $ return a
    +    fail s = outputTraceMessage s (mkFailMessage s)
    +
    +instance Error Response where
    +    strMsg = toResponse
    +
    +class Monad m => WebMonad a m | m->a where
    +    -- | A control structure. 
    +    -- It ends the computation and returns the 'Response' you passed into it
    +    -- immediately.  This provides an alternate escape route.  In particular
    +    -- it has a monadic value of any type.  And unless you call @'setFilter' id@
    +    -- first your response filters will be applied normally.
    +    --
    +    -- Extremely useful when you're deep inside a monad and decide that you
    +    -- want to return a completely different content type, since it doesn't
    +    -- force you to convert all your return types to 'Response' early just to
    +    -- accomodate this.
    +    finishWith :: a -> m b
    +
    +instance (Monad m) => WebMonad Response (WebT m) where
    +    finishWith r = WebT $ throwError r
    +
    +instance MonadTrans WebT where
    +    lift = WebT . lift . lift . lift
    +
    +instance (Monad m) => MonadPlus (WebT m) where
    +    -- | Aborts a computation.
    +    --
    +    -- This is primarily useful because 'msum' will take an array
    +    -- of 'MonadPlus' and return the first one that isn't mzero,
    +    -- which is exactly the semantics expected from objects
    +    -- that take lists of 'ServerPartT'.
    +    mzero = WebT $ lift $ lift $ mzero
    +    mplus x y =  WebT $ ErrorT $ FilterT $ (lower x) `mplus` (lower y)
    +        where lower = (unFilterT . runErrorT . unWebT)
    +
    +-- | Deprecated: use 'mzero'.
    +noHandle :: (MonadPlus m) => m a
    +noHandle = mzero
    +{-# DEPRECATED noHandle "Use mzero" #-}
    +
    +instance (Monad m) => FilterMonad Response (WebT m) where
    +    setFilter f = WebT $ lift $ setFilter $ f
    +    composeFilter f = WebT . lift . composeFilter $ f
    +    getFilter     m = WebT $ ErrorT $ fmap lft $ getFilter (runErrorT $ unWebT m)
    +        where
    +          lft (Left  r, _) = Left r
    +          lft (Right a, f) = Right (a, f)
    +
    +instance (Monad m) => Monoid (WebT m a) where
    +    mempty = mzero
    +    mappend = mplus
    +
    +-- | Takes your 'WebT', if it is 'mempty' it returns 'Nothing' else it
    +-- converts the value to a 'Response' and applies your filter to it.
    +runWebT :: forall m b. (Functor m, ToMessage b) => WebT m b -> m (Maybe Response)
    +runWebT = (fmap . fmap) appFilterToResp . ununWebT
    +    where
    +      appFilterToResp :: (Either Response b, FilterFun Response) -> Response
    +      appFilterToResp (e, ff) = unFilterFun ff $ either id toResponse e
    +
    +-- | For when you really need to unpack a 'WebT' entirely (and not
    +-- just unwrap the first layer with 'unWebT').
    +ununWebT :: WebT m a -> UnWebT m a
    +ununWebT = runMaybeT . runWriterT . unFilterT . runErrorT . unWebT
    +
    +-- | For wrapping a 'WebT' back up.  @mkWebT . ununWebT = id@
    +mkWebT :: UnWebT m a -> WebT m a
    +mkWebT = WebT . ErrorT . FilterT . WriterT . MaybeT
    +
    +-- | See 'mapServerPartT' for a discussion of this function.
    +mapWebT :: (UnWebT m a -> UnWebT n b)
    +        -> (  WebT m a ->   WebT n b)
    +mapWebT f ma = mkWebT $ f (ununWebT ma)
    +
    +instance (Monad m, Functor m) => Applicative (WebT m) where
    +    pure = return
    +    (<*>) = ap
    +
    +instance MonadReader r m => MonadReader r (WebT m) where
    +    ask = lift ask
    +    local fn m = mkWebT $ local fn (ununWebT m)
    +
    +instance MonadState st m => MonadState st (WebT m) where
    +    get = lift get
    +    put = lift . put
    +
    +instance MonadError e m => MonadError e (WebT m) where
    +	throwError err = lift $ throwError err
    + 	catchError action handler = mkWebT $ catchError (ununWebT action) (ununWebT . handler)
    +
    +instance MonadWriter w m => MonadWriter w (WebT m) where
    +    tell = lift . tell
    +    listen m = mkWebT $ Writer.listen (ununWebT m) >>= (return . liftWebT)
    +        where liftWebT (Nothing, _) = Nothing
    +              liftWebT (Just (Left x,f), _) = Just (Left x,f)
    +              liftWebT (Just (Right x,f),w) = Just (Right (x,w),f)
    +    pass m = mkWebT $ ununWebT m >>= liftWebT
    +        where liftWebT Nothing = return Nothing
    +              liftWebT (Just (Left x,f)) = return $ Just (Left x, f)
    +              liftWebT (Just (Right x,f)) = pass (return x)>>= (\a -> return $ Just (Right a,f))
    +
    +-- | An alias for @setFilter id@ It resets all your filters.
    +ignoreFilters :: (FilterMonad a m) => m ()
    +ignoreFilters = setFilter id
    +
    +-- | Used to ignore all your filters and immediately end the
    +-- computation.  A combination of 'ignoreFilters' and 'finishWith'.
    +escape :: (WebMonad a m, FilterMonad a m) => m a -> m b
    +escape gen = ignoreFilters >> gen >>= finishWith
    +
    +-- | An alternate form of 'escape' that can be easily used within a do
    +-- block.
    +escape' :: (WebMonad a m, FilterMonad a m) => a -> m b
    +escape' a = ignoreFilters >> finishWith a
    +
    +----------------------------------------------
    +-- additional types
    +
    +
    +-- | An array of 'OptDescr', useful for processing
    +-- command line options into an 'Conf' for 'simpleHTTP'.
    +ho :: [OptDescr (Conf -> Conf)]
    +ho = [Option [] ["http-port"] (ReqArg (\h c -> c { port = read h }) "port") "port to bind http server"]
    +
    +-- | Parse command line options into a 'Conf'.
    +parseConfig :: [String] -> Either [String] Conf
    +parseConfig args
    +    = case getOpt Permute ho args of
    +        (flags,_,[]) -> Right $ foldr ($) nullConf flags
    +        (_,_,errs)   -> Left errs
    +
    +-- | Use the built-in web-server to serve requests according to a
    +-- 'ServerPartT'.  Use 'msum' to pick the first handler from a list of
    +-- handlers that doesn't call 'mzero'. This function always binds o
    +-- IPv4 ports until Network module is fixed to support IPv6 in a
    +-- portable way. Use 'simpleHTTPWithSocket' with custom socket if you
    +-- want different behaviour.
    +simpleHTTP :: (ToMessage a) => Conf -> ServerPartT IO a -> IO ()
    +simpleHTTP = simpleHTTP' id
    +
    +-- | A combination of 'simpleHTTP''' and 'mapServerPartT'.  See
    +-- 'mapServerPartT' for a discussion of the first argument of this
    +-- function. This function always binds to IPv4 ports until Network
    +-- module is fixed to support IPv6 in a portable way. Use
    +-- 'simpleHTTPWithSocket' with custom socket if you want different
    +-- behaviour.
    +simpleHTTP' :: (ToMessage b, Monad m, Functor m) => (UnWebT m a -> UnWebT IO b)
    +            -> Conf -> ServerPartT m a -> IO ()
    +simpleHTTP' toIO conf hs =
    +    Listen.listen conf (\req -> runValidator (fromMaybe return (validator conf)) =<< (simpleHTTP'' (mapServerPartT toIO hs) req))
    +
    +
    +-- | Generate a result from a 'ServerPartT' and a 'Request'. This is mainly used
    +-- by CGI (and fast-cgi) wrappers.
    +simpleHTTP'' :: (ToMessage b, Monad m, Functor m) => ServerPartT m b -> Request -> m Response
    +simpleHTTP'' hs req =  (runWebT $ runServerPartT hs req) >>= (return . (maybe standardNotFound id))
    +    where
    +        standardNotFound = setHeader "Content-Type" "text/html" $ (toResponse notFoundHtml){rsCode=404}
    +
    +-- | Run 'simpleHTTP' with a previously bound socket. Useful if you want to run
    +-- happstack as user on port 80. Use something like this:
    +--
    +-- > import System.Posix.User (setUserID, UserEntry(..), getUserEntryForName)
    +-- >
    +-- > main = do
    +-- >     let conf = nullConf { port = 80 }
    +-- >     socket <- bindPort conf
    +-- >     -- do other stuff as root here
    +-- >     getUserEntryForName "www" >>= setUserID . userID
    +-- >     -- finally start handling incoming requests
    +-- >     tid <- forkIO $ simpleHTTPWithSocket socket conf impl
    +--
    +-- Note: It's important to use the same conf (or at least the same port) for
    +-- 'bindPort' and 'simpleHTTPWithSocket'.
    +simpleHTTPWithSocket :: (ToMessage a) => Socket -> Conf -> ServerPartT IO a -> IO ()
    +simpleHTTPWithSocket = simpleHTTPWithSocket' id
    +
    +-- | Like 'simpleHTTP'' with a socket.
    +simpleHTTPWithSocket' :: (ToMessage b, Monad m, Functor m) => (UnWebT m a -> UnWebT IO b)
    +                      -> Socket -> Conf -> ServerPartT m a -> IO ()
    +simpleHTTPWithSocket' toIO socket conf hs =
    +    Listen.listen' socket conf (\req -> runValidator (fromMaybe return (validator conf)) =<< (simpleHTTP'' (mapServerPartT toIO hs) req))
    +
    +-- | Bind port and return the socket for 'simpleHTTPWithSocket'. This
    +-- function always binds to IPv4 ports until Network module is fixed to
    +-- support IPv6 in a portable way.
    +bindPort :: Conf -> IO Socket
    +bindPort conf = Listen.listenOn (port conf)
    +
    +-- | This class is used by 'path' to parse a path component into a value.
    +-- At present, the instances for number types (Int, Float, etc) just
    +-- call 'readM'. The instance for 'String' however, just passes the
    +-- path component straight through. This is so that you can read a
    +-- path component which looks like this as a 'String':
    +--
    +--  \/somestring\/
    +--
    +-- instead of requiring the path component to look like:
    +--
    +-- \/\"somestring\"\/
    +class FromReqURI a where
    +    fromReqURI :: String -> Maybe a
    +
    +instance FromReqURI String  where fromReqURI = Just
    +instance FromReqURI Int     where fromReqURI = readM
    +instance FromReqURI Integer where fromReqURI = readM
    +instance FromReqURI Float   where fromReqURI = readM
    +instance FromReqURI Double  where fromReqURI = readM
    +
    +type RqData a = ReaderT ([(String,Input)], [(String,Cookie)]) Maybe a
    +
    +-- | Useful for 'withData' and 'getData''  implement this on your preferred type
    +-- to use those functions.
    +class FromData a where
    +    fromData :: RqData a
    +
    +instance (Eq a,Show a,Xml a,G.Data a) => FromData a where
    +    fromData = do mbA <- lookPairs >>= return . normalize . fromPairs
    +                  case mbA of
    +                    Just a -> return a
    +                    Nothing -> fail "FromData G.Data failure"
    +--    fromData = lookPairs >>= return . normalize . fromPairs
    +
    +instance (FromData a, FromData b) => FromData (a,b) where
    +    fromData = liftM2 (,) fromData fromData
    +instance (FromData a, FromData b, FromData c) => FromData (a,b,c) where
    +    fromData = liftM3 (,,) fromData fromData fromData
    +instance (FromData a, FromData b, FromData c, FromData d) => FromData (a,b,c,d) where
    +    fromData = liftM4 (,,,) fromData fromData fromData fromData
    +instance FromData a => FromData (Maybe a) where
    +    fromData = fmap Just fromData `mplus` return Nothing
    +
    +-- |low-level function to build a 'Response' from a content-type and a
    +-- 'ByteString'
    +--
    +-- Creates a 'Response' in a manner similar to the 'ToMessage' class,
    +-- but with out requiring an instance declaration.
    +toResponseBS :: B.ByteString -- ^ content-type
    +             -> L.ByteString -- ^ response body
    +             -> Response
    +toResponseBS contentType message =
    +    let res = Response 200 M.empty nullRsFlags message Nothing
    +    in setHeaderBS (B.pack "Content-Type") contentType res
    +
    +
    +-- |
    +--  Used to convert arbitrary types into an HTTP response.  You need to implement
    +--  this if you want to pass @ServerPartT m@ containing your type into 'simpleHTTP'.
    +--
    +--  Minimal definition: 'toMessage'.
    +class ToMessage a where
    +    toContentType :: a -> B.ByteString
    +    toContentType _ = B.pack "text/plain"
    +    toMessage :: a -> L.ByteString
    +    toMessage = error "Happstack.Server.SimpleHTTP.ToMessage.toMessage: Not defined"
    +    toResponse:: a -> Response
    +    toResponse val =
    +        let bs = toMessage val
    +            res = Response 200 M.empty nullRsFlags bs Nothing
    +        in setHeaderBS (B.pack "Content-Type") (toContentType val)
    +           res
    +
    +instance ToMessage [Element] where
    +    toContentType _ = B.pack "application/xml; charset=UTF-8"
    +    toMessage [el] = LU.fromString $ H.simpleDoc H.NoStyle $ toHaXmlEl el -- !! OPTIMIZE
    +    toMessage x    = error ("Happstack.Server.SimpleHTTP 'instance ToMessage [Element]' Can't handle " ++ show x)
    +
    +
    +
    +
    +instance ToMessage () where
    +    toContentType _ = B.pack "text/plain"
    +    toMessage () = L.empty
    +instance ToMessage String where
    +    toContentType _ = B.pack "text/plain; charset=UTF-8"
    +    toMessage = LU.fromString
    +instance ToMessage Integer where
    +    toMessage = toMessage . show
    +instance ToMessage a => ToMessage (Maybe a) where
    +    toContentType _ = toContentType (undefined :: a)
    +    toMessage Nothing = toMessage "nothing"
    +    toMessage (Just x) = toMessage x
    +
    +
    +instance ToMessage Html where
    +    toContentType _ = B.pack "text/html; charset=UTF-8"
    +    toMessage = LU.fromString . renderHtml
    +
    +instance ToMessage XHtml.Html where
    +    toContentType _ = B.pack "text/html; charset=UTF-8"
    +    toMessage = LU.fromString . XHtml.renderHtml
    +
    +instance ToMessage Response where
    +    toResponse = id
    +
    +instance (Xml a)=>ToMessage a where
    +    toContentType = toContentType . toXml
    +    toMessage = toMessage . toPublicXml
    +
    +--    toMessageM = toMessageM . toPublicXml
    +
    +
    +class MatchMethod m where matchMethod :: m -> Method -> Bool
    +instance MatchMethod Method where matchMethod m = (== m)
    +instance MatchMethod [Method] where matchMethod methods = (`elem` methods)
    +instance MatchMethod (Method -> Bool) where matchMethod f = f
    +instance MatchMethod () where matchMethod () _ = True
    +
    +-- | 'flatten' turns your arbitrary @m a@ and converts it too
    +-- a @m 'Response'@ with 'toResponse'.
    +flatten :: (ToMessage a, Functor f) => f a -> f Response
    +flatten = fmap toResponse
    +
    +-- | This is kinda like a very oddly shaped 'mapServerPartT' or 'mapWebT'
    +-- You probably want one or the other of those.
    +localContext :: Monad m => (WebT m a -> WebT m' a) -> ServerPartT m a -> ServerPartT m' a
    +localContext fn hs
    +    = withRequest $ \rq -> fn (runServerPartT hs rq)
    +
    +
    +-- | Get a header out of the request.
    +getHeaderM :: (ServerMonad m) => String -> m (Maybe B.ByteString)
    +getHeaderM a = askRq >>= return . (getHeader a)
    +
    +-- | Add headers into the response.
    +--   This method does not overwrite any existing header of
    +--   the same name, hence the name 'addHeaderM'.  If you
    +--   want to replace a header use 'setHeaderM'.
    +addHeaderM :: (FilterMonad Response m) => String -> String -> m ()
    +addHeaderM a v = composeFilter $ \res-> addHeader a v res
    +
    +-- | Set a header into the response.  This will replace
    +-- an existing header of the same name.  Use 'addHeaderM' if you
    +-- want to add more than one header of the same name.
    +setHeaderM :: (FilterMonad Response m) => String -> String -> m ()
    +setHeaderM a v = composeFilter $ \res -> setHeader a v res
    +-------------------------------------
    +-- guards
    +
    +-- | Guard using an arbitrary function on the request.
    +guardRq :: (ServerMonad m, MonadPlus m) => (Request -> Bool) -> m ()
    +guardRq f = do
    +    rq <- askRq
    +    unless (f rq) mzero
    +
    +-- | Guard against the method. This function also guards against
    +-- any remaining path segments. See 'methodOnly' for the version
    +-- that guards only by method
    +methodM :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m ()
    +methodM meth = methodOnly meth >> nullDir
    +
    +-- | Guard against the method only. (as opposed to 'methodM')
    +methodOnly :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m ()
    +methodOnly meth = guardRq $ \rq -> matchMethod meth (rqMethod rq)
    +
    +-- | Guard against the method. Note, this function also guards against any
    +--   remaining path segments.
    +methodSP :: (ServerMonad m, MonadPlus m, MatchMethod method) => method -> m b-> m b
    +methodSP m handle = methodM m >> handle
    +
    +-- | Guard against the method. Note, this function also guards against any
    +-- remaining path segments.  This function is deprecated.  You can probably
    +-- just use methodSP (or methodM) now.
    +method :: (MatchMethod method, Monad m) => method -> WebT m a -> ServerPartT m a
    +method m handle = methodSP m (anyRequest handle)
    +{-# DEPRECATED method "you should be able to use methodSP" #-}
    +
    +-- | Guard against non-empty remaining path segments.
    +nullDir :: (ServerMonad m, MonadPlus m) => m ()
    +nullDir = guardRq $ \rq -> null (rqPaths rq)
    +
    +-- | Pop a path element and run the 'ServerPartT' if it matches the given string.
    +-- 
    +-- The path element can not contain \'/\'. See also 'dirs'.
    +dir :: (ServerMonad m, MonadPlus m) => String -> m a -> m a
    +dir staticPath handle =
    +    do
    +        rq <- askRq
    +        case rqPaths rq of
    +            (p:xs) | p == staticPath -> localRq (\newRq -> newRq{rqPaths = xs}) handle
    +            _ -> mzero
    +            
    +-- | Guard against a 'FilePath'. Unlike 'dir' the 'FilePath' may
    +-- contain \'/\'. If the guard succeeds, the matched elements will be
    +-- popped from the directory stack.
    +--
    +-- > dirs "foo/bar" $ ...
    +--          
    +-- See also: 'dir'.
    +dirs :: (ServerMonad m, MonadPlus m) => FilePath -> m a -> m a 
    +dirs fp m = 
    +     do let parts = splitDirectories (makeRelative "/" fp) 
    +        foldr dir m parts
    +
    +-- | Guard against the host.
    +host :: (ServerMonad m, MonadPlus m) => String -> m a -> m a
    +host desiredHost handle =
    +    do rq <- askRq
    +       case getHeader "host" rq of
    +         (Just hostBS) | desiredHost == B.unpack hostBS -> handle
    +         _ -> mzero
    +
    +-- | Lookup the host header and pass it to the handler.
    +withHost :: (ServerMonad m, MonadPlus m) => (String -> m a) -> m a
    +withHost handle =
    +    do rq <- askRq
    +       case getHeader "host" rq of
    +         (Just hostBS) -> handle (B.unpack hostBS)
    +         _ -> mzero
    +
    +
    +-- | Pop a path element and parse it using the 'fromReqURI' in the 'FromReqURI' class.
    +path :: (FromReqURI a, MonadPlus m, ServerMonad m) => (a -> m b) -> m b
    +path handle = do
    +    rq <- askRq
    +    case rqPaths rq of
    +        (p:xs) | Just a <- fromReqURI p
    +                            -> localRq (\newRq -> newRq{rqPaths = xs}) (handle a)
    +        _ -> mzero
    +
    +-- | Grab the rest of the URL (dirs + query) and passes it to your handler.
    +uriRest :: (ServerMonad m) => (String -> m a) -> m a
    +uriRest handle = askRq >>= handle . rqURL
    +
    +-- | Pop any path element and ignore when chosing a 'ServerPartT' to
    +-- handle the request.
    +anyPath :: (ServerMonad m, MonadPlus m) => m r -> m r
    +anyPath x = path $ (\(_::String) -> x)
    +
    +-- | Deprecated: use 'anyPath'.
    +anyPath' :: (ServerMonad m, MonadPlus m) => m r -> m r
    +anyPath' = anyPath
    +{-# DEPRECATED anyPath' "Use anyPath" #-}
    +
    +-- | Guard which checks that the Request URI ends in \'\/\'. 
    +-- Useful for distinguishing between @foo@ and @foo/@
    +trailingSlash :: (ServerMonad m, MonadPlus m) => m ()
    +trailingSlash = guardRq $ \rq -> (last (rqUri rq)) == '/'
    +
    +-- | Parse your request with a 'RqData' (a ReaderT, basically)
    +-- For example here is a simple @GET@ or @POST@ variable based authentication
    +-- guard.  It handles the request with 'errorHandler' if authentication fails.
    +--
    +-- > myRqData = do
    +-- >     username <- lookInput "username"
    +-- >     password <- lookInput "password"
    +-- >     return (username, password)
    +-- > checkAuth errorHandler = do
    +-- >     d <- getData myRqDataA
    +-- >     case d of
    +-- >         Nothing -> errorHandler
    +-- >         Just a | isValid a -> mzero
    +-- >         Just a | otherwise -> errorHandler
    +getDataFn :: (ServerMonad m) => RqData a -> m (Maybe a)
    +getDataFn rqData = do
    +    rq <- askRq
    +    return $ runReaderT rqData (rqInputs rq, rqCookies rq)
    +
    +-- | An variant of 'getData' that uses 'FromData' to chose your
    +-- 'RqData' for you.  The example from 'getData' becomes:
    +--
    +-- >  myRqData = do
    +-- >     username <- lookInput "username"
    +-- >     password <- lookInput "password"
    +-- >     return (username, password)
    +-- >  instance FromData (String,String) where
    +-- >     fromData = myRqData
    +-- >  checkAuth errorHandler = do
    +-- >     d <- getData'
    +-- >     case d of
    +-- >         Nothing -> errorHandler
    +-- >         Just a | isValid a -> mzero
    +-- >         Just a | otherwise -> errorHandler
    +--
    +getData :: (ServerMonad m, FromData a) => m (Maybe a)
    +getData = getDataFn fromData
    +
    +-- | Retrieve data from the input query or the cookies.
    +withData :: (FromData a, MonadPlus m, ServerMonad m) => (a -> m r) -> m r
    +withData = withDataFn fromData
    +
    +-- | 'withDataFn' is like 'withData', but you pass in a 'RqData' monad
    +-- for reading.
    +withDataFn :: (MonadPlus m, ServerMonad m) => RqData a -> (a -> m r) -> m r
    +withDataFn fn handle = getDataFn fn >>= maybe mzero handle
    +
    +-- | 'proxyServe' is for creating 'ServerPartT's that proxy.
    +-- The sole argument @[String]@ is a list of allowed domains for
    +-- proxying.  This matches the domain part of the request
    +-- and the wildcard * can be used. E.g.
    +--
    +--  * \"*\" to match anything.
    +--
    +--  * \"*.example.com\" to match anything under example.com
    +--
    +--  * \"example.com\" to match just example.com
    +--
    +--
    +--  TODO: annoyingly enough, this method eventually calls escape, so
    +--  any headers you set won't be used, and the computation immediatly ends.
    +proxyServe :: (MonadIO m, WebMonad Response m, ServerMonad m, MonadPlus m, FilterMonad Response m) => [String] -> m Response
    +proxyServe allowed = do
    +   rq <- askRq
    +   if cond rq then proxyServe' rq else mzero
    +   where
    +   cond rq
    +     | "*" `elem` allowed = True
    +     | domain `elem` allowed = True
    +     | superdomain `elem` wildcards =True
    +     | otherwise = False
    +     where
    +     domain = head (rqPaths rq)
    +     superdomain = tail $ snd $ break (=='.') domain
    +     wildcards = (map (drop 2) $ filter ("*." `isPrefixOf`) allowed)
    +
    +-- | Takes a proxy 'Request' and creates a 'Response'.  Your basic proxy
    +-- building block.  See 'unproxify'.
    +--
    +-- TODO: this would be more useful if it didn\'t call 'escape' (e.g. it let you
    +-- modify the response afterwards, or set additional headers)
    +proxyServe' :: (MonadIO m, FilterMonad Response m, WebMonad Response m) => Request-> m Response
    +proxyServe' rq = liftIO (getResponse (unproxify rq)) >>=
    +                either (badGateway . toResponse . show) escape'
    +
    +-- | This is a reverse proxy implementation.
    +-- See 'unrproxify'.
    +--
    +-- TODO: this would be more useful if it didn\'t call 'escape', just like
    +-- proxyServe'.
    +rproxyServe :: (MonadIO m) =>
    +    String -- ^ defaultHost
    +    -> [(String, String)] -- ^ map to look up hostname mappings.  For the reverse proxy
    +    -> ServerPartT m Response -- ^ the result is a ServerPartT that will reverse proxy for you.
    +rproxyServe defaultHost list  = withRequest $ \rq ->
    +                liftIO (getResponse (unrproxify defaultHost list rq)) >>=
    +                either (badGateway . toResponse . show) (escape')
    +
    +-- | Run an IO action and, if it returns @Just@, pass it to the second argument.
    +require :: (MonadIO m, MonadPlus m) => IO (Maybe a) -> (a -> m r) -> m r
    +require fn handle = do
    +    mbVal <- liftIO fn
    +    case mbVal of
    +        Nothing -> mzero
    +        Just a -> handle a
    +
    +-- | A variant of require that can run in any monad, not just IO.
    +requireM :: (MonadTrans t, Monad m, MonadPlus (t m)) => m (Maybe a) -> (a -> t m r) -> t m r
    +requireM fn handle = do
    +    mbVal <- lift fn
    +    case mbVal of
    +        Nothing -> mzero
    +        Just a -> handle a
    +
    +-- | Use @cmd@ to transform XML against @xslPath@.
    +--   This function only acts if the content-type is @application\/xml@.
    +xslt :: (MonadIO m, MonadPlus m, ToMessage r) =>
    +        XSLTCmd  -- ^ XSLT preprocessor. Usually 'xsltproc' or 'saxon'.
    +     -> XSLPath      -- ^ Path to xslt stylesheet.
    +     -> m r -- ^ Affected @ServerParts@.
    +     -> m Response
    +xslt cmd xslPath parts = do
    +    res <- parts
    +    if toContentType res == B.pack "application/xml"
    +        then liftM toResponse (doXslt cmd xslPath (toResponse res))
    +        else return (toResponse res)
    +
    +doXslt :: (MonadIO m) =>
    +          XSLTCmd -> XSLPath -> Response -> m Response
    +doXslt cmd xslPath res =
    +    do new <- liftIO $ procLBSIO cmd xslPath $ rsBody res
    +       return $ setHeader "Content-Type" "text/html" $
    +              setHeader "Content-Length" (show $ L.length new) $
    +              res { rsBody = new }
    +
    +-- | Deprecated:  use 'composeFilter'.
    +modifyResponse :: (FilterMonad a m) => (a -> a) -> m()
    +modifyResponse = composeFilter
    +{-# DEPRECATED modifyResponse "Use composeFilter" #-}
    +
    +-- | Set the return code in your response.
    +setResponseCode :: FilterMonad Response m => Int -> m ()
    +setResponseCode code
    +    = composeFilter $ \r -> r{rsCode = code}
    +
    +-- | Add the cookie with a timeout to the response.
    +addCookie :: (FilterMonad Response m) => Seconds -> Cookie -> m ()
    +addCookie sec = (addHeaderM "Set-Cookie") . mkCookieHeader sec
    +
    +-- | Add the list of cookie timeout pairs to the response.
    +addCookies :: (FilterMonad Response m) => [(Seconds, Cookie)] -> m ()
    +addCookies = mapM_ (uncurry addCookie)
    +
    +-- | Expire the cookie immediately.
    +expireCookie :: (FilterMonad Response m) => String -> m () 
    +expireCookie cookieName = addCookie 0 (mkCookie cookieName "")
    +
    +-- |Honor an @if-modified-since@ header in a 'Request'.
    +-- If the 'Request' includes the @if-modified-since@ header and the
    +-- 'Response' has not been modified, then return 304 (Not Modified),
    +-- otherwise return the 'Response'.
    +ifModifiedSince :: CalendarTime -- ^ mod-time for the Response (MUST NOT be later than server's time of message origination)
    +                -> Request -- ^ incoming request (used to check for if-modified-since)
    +                -> Response -- ^ Response to send if there are modifications
    +                -> Response
    +ifModifiedSince modTime request response =
    +    let repr = formatCalendarTime defaultTimeLocale "%a, %d %b %Y %X GMT" modTime
    +        notmodified = getHeader "if-modified-since" request == Just (B.pack $ repr)
    +    in if notmodified
    +          then result 304 "" -- Not Modified
    +          else setHeader "Last-modified" repr response
    +
    +-- | Same as @'setResponseCode' status >> return val@.
    +resp :: (FilterMonad Response m) => Int -> b -> m b
    +resp status val = setResponseCode status >> return val
    +
    +-- | Respond with @200 OK@.
    +ok :: (FilterMonad Response m) => a -> m a
    +ok = resp 200
    +
    +-- | Respond with @500 Interal Server Error@.
    +internalServerError :: (FilterMonad Response m) => a -> m a
    +internalServerError = resp 500
    +
    +-- | Responds with @502 Bad Gateway@.
    +badGateway :: (FilterMonad Response m) => a -> m a
    +badGateway = resp 502
    +
    +-- | Respond with @400 Bad Request@.
    +badRequest :: (FilterMonad Response m) => a -> m a
    +badRequest = resp 400
    +
    +-- | Respond with @401 Unauthorized@.
    +unauthorized :: (FilterMonad Response m) => a -> m a
    +unauthorized = resp 401
    +
    +-- | Respond with @403 Forbidden@.
    +forbidden :: (FilterMonad Response m) => a -> m a
    +forbidden = resp 403
    +
    +-- | Respond with @404 Not Found@.
    +notFound :: (FilterMonad Response m) => a -> m a
    +notFound = resp 404
    +
    +-- | Respond with @303 See Other@.
    +seeOther :: (FilterMonad Response m, ToSURI uri) => uri -> res -> m res
    +seeOther uri res = do modifyResponse $ redirect 303 uri
    +                      return res
    +
    +-- | Respond with @302 Found@.
    +found :: (FilterMonad Response m, ToSURI uri) => uri -> res -> m res
    +found uri res = do modifyResponse $ redirect 302 uri
    +                   return res
    +
    +-- | Respond with @301 Moved Permanently@.
    +movedPermanently :: (FilterMonad Response m, ToSURI a) => a -> res -> m res
    +movedPermanently uri res = do modifyResponse $ redirect 301 uri
    +                              return res
    +
    +-- | Respond with @307 Temporary Redirect@.
    +tempRedirect :: (FilterMonad Response m, ToSURI a) => a -> res -> m res
    +tempRedirect val res = do modifyResponse $ redirect 307 val
    +                          return res
    +
    +-- | Deprecated: use 'msum'.
    +multi :: Monad m => [ServerPartT m a] -> ServerPartT m a
    +multi = msum
    +{-# DEPRECATED multi "Use msum instead" #-}
    +
    +-- | What is this for, exactly?  I don't understand why @Show a@ is even in the context
    +-- This appears to do nothing at all.
    +debugFilter :: (MonadIO m, Show a) => ServerPartT m a -> ServerPartT m a
    +debugFilter handle =
    +    withRequest $ \rq -> do
    +                    r <- runServerPartT handle rq
    +                    return r
    +
    +-- | A constructor for a 'ServerPartT' when you don't care about the request.
    +anyRequest :: Monad m => WebT m a -> ServerPartT m a
    +anyRequest x = withRequest $ \_ -> x
    +
    +-- | Again, why is this useful?
    +applyRequest :: (ToMessage a, Monad m, Functor m) =>
    +                ServerPartT m a -> Request -> Either (m Response) b
    +applyRequest hs = simpleHTTP'' hs >>= return . Left
    +
    +-- | A simple HTTP basic authentication guard.
    +basicAuth :: (WebMonad Response m, ServerMonad m, FilterMonad Response m, MonadPlus m) =>
    +   String -- ^ the realm name
    +   -> M.Map String String -- ^ the username password map
    +   -> m a -- ^ the part to guard
    +   -> m a
    +basicAuth realmName authMap xs = basicAuthImpl `mplus` xs
    +  where
    +    basicAuthImpl = do
    +        aHeader <- getHeaderM "authorization"
    +        case aHeader of
    +            Nothing -> err
    +            Just x -> case parseHeader x of
    +                (name, ':':password) | validLogin name password -> mzero
    +                                     | otherwise -> err
    +                _  -> err
    +    validLogin name password = M.lookup name authMap == Just password
    +    parseHeader = break (':'==) . Base64.decode . B.unpack . B.drop 6
    +    headerName  = "WWW-Authenticate"
    +    headerValue = "Basic realm=\"" ++ realmName ++ "\""
    +    err = escape $ do
    +            setHeaderM headerName headerValue
    +            unauthorized $ toResponse "Not authorized"
    +
    +--------------------------------------------------------------
    +-- Query/Post data validating
    +--------------------------------------------------------------
    +
    +-- | Useful inside the 'RqData' monad.  Gets the named input parameter
    +-- (either from a @POST@ or a @GET@ request).
    +lookInput :: String -> RqData Input
    +lookInput name
    +    = do inputs <- asks fst
    +         case lookup name inputs of
    +           Nothing -> fail "input not found"
    +           Just i  -> return i
    +
    +-- | Get the named input parameter as a 'L.ByteString'.
    +lookBS :: String -> RqData L.ByteString
    +lookBS = fmap inputValue . lookInput
    +
    +-- | Get the named input as a 'String'.
    +look :: String -> RqData String
    +look = fmap LU.toString . lookBS
    +
    +-- | Get the named cookie.
    +-- The cookie name is case insensitive.
    +lookCookie :: String -> RqData Cookie
    +lookCookie name
    +    = do cookies <- asks snd
    +         case lookup (map toLower name) cookies of -- keys are lowercased
    +           Nothing -> fail "cookie not found"
    +           Just c  -> return c
    +
    +-- | Get the named cookie as a 'String'.
    +lookCookieValue :: String -> RqData String
    +lookCookieValue = fmap cookieValue . lookCookie
    +
    +-- | Get the named cookie as the requested 'Read' type.
    +readCookieValue :: Read a => String -> RqData a
    +readCookieValue name = readM =<< fmap cookieValue (lookCookie name)
    +
    +-- | Like 'look', but 'Read's for you.
    +lookRead :: Read a => String -> RqData a
    +lookRead name = readM =<< look name
    +
    +-- | Get all the input parameters and convert them to a 'String'.
    +lookPairs :: RqData [(String,String)]
    +lookPairs = asks fst >>= return . map (\(n,vbs)->(n,LU.toString $ inputValue vbs))
    +
    +
    +--------------------------------------------------------------
    +-- Error Handling
    +--------------------------------------------------------------
    +
    +-- | This 'ServerPart' modifier enables the use of 'throwError' and 'catchError' inside the
    +--   'WebT' actions, by adding the 'ErrorT' monad transformer to the stack.
    +--
    +--   You can wrap the complete second argument to 'simpleHTTP' in this function.
    +--
    +errorHandlerSP :: (Monad m, Error e) => (Request -> e -> WebT m a) -> ServerPartT (ErrorT e m) a -> ServerPartT m a
    +errorHandlerSP handler sps = withRequest $ \req -> mkWebT $ do
    +			eer <- runErrorT $ ununWebT $ runServerPartT sps req
    +			case eer of
    +				Left err -> ununWebT (handler req err)
    +				Right res -> return res
    +{-# DEPRECATED errorHandlerSP "Use spUnwrapErrorT" #-}
    +
    +-- | An example error Handler to be used with 'spUnWrapErrorT', which returns the
    +--   error message as a plain text message to the browser.
    +--
    +--   Another possibility is to store the error message, e.g. as a FlashMsg, and
    +--   then redirect the user somewhere.
    +simpleErrorHandler :: (Monad m) => String -> ServerPartT m Response
    +simpleErrorHandler err = ok $ toResponse $ ("An error occured: " ++ err)
    +
    +-- | This is a for use with 'mapServerPartT\'' It it unwraps the
    +-- interior monad for use with 'simpleHTTP'.  If you have a
    +-- @ServerPartT (ErrorT e m) a@, this will convert that monad into a
    +-- @ServerPartT m a@.  Used with 'mapServerPartT\'' to allow
    +-- 'throwError' and 'catchError' inside your monad.  Eg.
    +--
    +-- > simpleHTTP conf $ mapServerPartT' (spUnWrapErrorT failurePart)  $ myPart `catchError` errorPart
    +--
    +-- Note that @failurePart@ will only be run if @errorPart@ threw an error
    +-- so it doesn\'t have to be very complex.
    +spUnwrapErrorT:: Monad m => (e -> ServerPartT m a)
    +              -> Request
    +              -> UnWebT (ErrorT e m) a
    +              -> UnWebT m a
    +spUnwrapErrorT handler rq = \x -> do
    +    err <- runErrorT x
    +    case err of
    +        Left e -> ununWebT $ runServerPartT (handler e) rq
    +        Right a -> return a
    +
    +--------------------------------------------------------------
    +-- * Output validation
    +--------------------------------------------------------------
    +
    +-- |Set the validator which should be used for this particular 'Response'
    +-- when validation is enabled.
    +--
    +-- Calling this function does not enable validation. That can only be
    +-- done by enabling the validation in the 'Conf' that is passed to
    +-- 'simpleHTTP'.
    +--
    +-- You do not need to call this function if the validator set in
    +-- 'Conf' does what you want already.
    +--
    +-- Example: (use 'noopValidator' instead of the default supplied by 'validateConf')
    +--
    +-- > simpleHTTP validateConf . anyRequest $ ok . setValidator noopValidator =<< htmlPage
    +--
    +-- See also: 'validateConf', 'wdgHTMLValidator', 'noopValidator', 'lazyProcValidator'
    +setValidator :: (Response -> IO Response) -> Response -> Response
    +setValidator v r = r { rsValidator = Just v }
    +
    +-- |ServerPart version of 'setValidator'.
    +--
    +-- Example: (Set validator to 'noopValidator')
    +--
    +-- >  simpleHTTP validateConf $ setValidatorSP noopValidator (dir "ajax" ... )
    +--
    +setValidatorSP :: (Monad m, ToMessage r) => (Response -> IO Response) -> m r -> m Response
    +setValidatorSP v sp = return . setValidator v . toResponse =<< sp
    +
    +-- |Extend 'nullConf' by enabling validation and setting
    +-- 'wdgHTMLValidator' as the default validator for @text\/html@.
    +--
    +-- Example:
    +--
    +-- > simpleHTTP validateConf . anyRequest $ ok htmlPage
    +--
    +validateConf :: Conf
    +validateConf = nullConf { validator = Just wdgHTMLValidator }
    +
    +-- |Actually perform the validation on a 'Response'.
    +--
    +-- Run the validator specified in the 'Response'. If none is provide
    +-- use the supplied default instead.
    +--
    +-- Note: This function will run validation unconditionally. You
    +-- probably want 'setValidator' or 'validateConf'.
    +runValidator :: (Response -> IO Response) -> Response -> IO Response
    +runValidator defaultValidator r =
    +    case rsValidator r of
    +      Nothing -> defaultValidator r
    +      (Just altValidator) -> altValidator r
    +
    +-- |Validate @text\/html@ content with @WDG HTML Validator@.
    +--
    +-- This function expects the executable to be named @validate@
    +-- and it must be in the default @PATH@.
    +--
    +-- See also: 'setValidator', 'validateConf', 'lazyProcValidator'.
    +wdgHTMLValidator :: (MonadIO m, ToMessage r) => r -> m Response
    +wdgHTMLValidator = liftIO . lazyProcValidator "validate" ["-w","--verbose","--charset=utf-8"] Nothing Nothing handledContentTypes . toResponse
    +    where
    +      handledContentTypes (Just ct) = elem (takeWhile (\c -> c /= ';' && c /= ' ') (B.unpack ct)) [ "text/html", "application/xhtml+xml" ]
    +      handledContentTypes Nothing = False
    +
    +-- |A validator which always succeeds.
    +--
    +-- Useful for selectively disabling validation. For example, if you
    +-- are sending down HTML fragments to an AJAX application and the
    +-- default validator only understands complete documents.
    +noopValidator :: Response -> IO Response
    +noopValidator = return
    +
    +-- |Validate the 'Response' using an external application.
    +--
    +-- If the external application returns 0, the original response is
    +-- returned unmodified. If the external application returns non-zero, a 'Response'
    +-- containing the error messages and original response body is
    +-- returned instead.
    +--
    +-- This function also takes a predicate filter which is applied to the
    +-- content-type of the response. The filter will only be applied if
    +-- the predicate returns true.
    +--
    +-- NOTE: This function requirse the use of -threaded to avoid blocking.
    +-- However, you probably need that for Happstack anyway.
    +--
    +-- See also: 'wdgHTMLValidator'.
    +lazyProcValidator :: FilePath -- ^ name of executable
    +               -> [String] -- ^ arguements to pass to the executable
    +               -> Maybe FilePath -- ^ optional path to working directory
    +               -> Maybe [(String, String)] -- ^ optional environment (otherwise inherit)
    +               -> (Maybe B.ByteString -> Bool) -- ^ content-type filter
    +               -> Response -- ^ Response to validate
    +               -> IO Response
    +lazyProcValidator exec args wd env mimeTypePred response
    +    | mimeTypePred (getHeader "content-type" response) =
    +        do (inh, outh, errh, ph) <- runInteractiveProcess exec args wd env
    +           out <- hGetContents outh
    +           err <- hGetContents errh
    +           forkIO $ do L.hPut inh (rsBody response)
    +                       hClose inh
    +           forkIO $ evaluate (length out) >> return ()
    +           forkIO $ evaluate (length err) >> return ()
    +           ec <- waitForProcess ph
    +           case ec of
    +             ExitSuccess     -> return response
    +             (ExitFailure _) ->
    +                 return $ toResponse (unlines ([ "ExitCode: " ++ show ec
    +                                               , "stdout:"
    +                                               , out
    +                                               , "stderr:"
    +                                               , err
    +                                               , "input:"
    +                                               ] ++
    +                                               showLines (rsBody response)))
    +    | otherwise = return response
    +    where
    +      column = "  " ++ (take 120 $ concatMap  (\n -> "         " ++ show n) (drop 1 $ cycle [0..9::Int]))
    +      showLines :: L.ByteString -> [String]
    +      showLines string = column : zipWith (\n -> \l  -> show n ++ " " ++ (L.unpack l)) [1::Integer ..] (L.lines string)
    +
    +-- "Pattern match failure in do expression at src\AppControl.hs:43:24"
    +-- is converted to:
    +-- "src\AppControl.hs:43:24: Pattern match failure in do expression"
    +-- Then we output this to stderr. Help debugging under Emacs console when using GHCi.
    +-- This is GHC specific, but you may add your favourite compiler here also.
    +outputTraceMessage s c | "Pattern match failure " `isPrefixOf` s = 
    +    let w = [(k,p) | (i,p) <- zip (tails s) (inits s), Just k <- [stripPrefix " at " i]]
    +        v = concatMap (\(k,p) -> k ++ ": " ++ p) w
    +    in trace v c
    +outputTraceMessage _ c = trace "some error" c
    +
    +
    +mkFailMessage :: (FilterMonad Response m, WebMonad Response m) => String -> m b
    +mkFailMessage s = do
    +    ignoreFilters
    +    internalServerError ()
    +    setHeaderM "Content-Type" "text/html"
    +    res <- return $ toResponse $ failHtml s
    +    finishWith $ res
    +
    +failHtml:: String->String
    +failHtml errString = 
    +   "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">"
    +    ++ "<html><head><title>Happstack "
    +    ++ ver ++ " Internal Server Error</title></head>"
    +    ++ "<body><h1>Happstack " ++ ver ++ "</h1>"
    +    ++ "<p>Something went wrong here<br>"
    +    ++ "Internal server error<br>"
    +    ++ "Everything has stopped</p>"
    +    ++ "<p>The error was \"" ++ (escapeString errString) ++ "\"</p></body></html>"
    +    where ver = DV.showVersion Cabal.version
    +
    +escapeString :: String -> String
    +escapeString str = concatMap encodeEntity str
    +    where
    +      encodeEntity :: Char -> String
    +      encodeEntity '<' = "&lt;"
    +      encodeEntity '>' = "&gt;"
    +      encodeEntity '&' = "&amp;"
    +      encodeEntity '"' = "&quot;"
    +      encodeEntity c
    +          | ord c > 127 = "&#" ++ show (ord c) ++ ";"
    +          | otherwise = [c]
    +
    +notFoundHtml :: String
    +notFoundHtml = 
    +    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">"
    +    ++ "<html><head><title>Happstack "
    +    ++ ver ++ " File not found</title></head>"
    +    ++ "<body><h1>Happstack " ++ ver ++ "</h1>"
    +    ++ "<p>Your file is not found<br>"
    +    ++ "To try again is useless<br>"
    +    ++ "It is just not here</p>"
    +    ++ "</body></html>"
    +    where ver = DV.showVersion Cabal.version
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-StdConfig.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-StdConfig.html 1 + + + + +src/Happstack/Server/StdConfig.hs + + + +
    {-# LANGUAGE ScopedTypeVariables #-}
    +module Happstack.Server.StdConfig where
    +
    +import Control.Monad.Trans
    +import Control.Monad
    +import Happstack.Server.SimpleHTTP
    +import Happstack.Server.HTTP.FileServe
    +
    +-- | Is equal to "haskell/Main"
    +binarylocation :: String
    +binarylocation = "haskell/Main"
    +
    +-- | Is equal to "public/log"
    +loglocation :: String
    +loglocation = "public/log"
    +
    +-- | Convenience function around 'errorwrapper'
    +-- with the default binary location set to 'binarylocation' and the
    +-- log location set to 'loglocation'. 
    +errWrap :: (MonadPlus m, FilterMonad Response m, MonadIO m) => m Response
    +errWrap =  errorwrapper binarylocation loglocation
    +--stateFuns -- main actually has state so you can just import them
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server-XSLT.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server-XSLT.html 1 + + + + +src/Happstack/Server/XSLT.hs + + + +
    {-# LANGUAGE TemplateHaskell, FlexibleInstances , UndecidableInstances,
    +             DeriveDataTypeable, MultiParamTypeClasses, CPP, ScopedTypeVariables,
    +    PatternSignatures #-}
    +module Happstack.Server.XSLT
    +    (xsltFile, xsltString, xsltElem, xsltFPS, xsltFPSIO, XSLPath,
    +     xsltproc,saxon,procFPSIO,procLBSIO,XSLTCommand,XSLTCmd
    +    ) where
    +
    +
    +import System.Log.Logger
    +
    +import Happstack.Server.MinHaXML
    +import Happstack.Util.Common(runCommand)
    +import Control.Exception.Extensible(bracket,try,SomeException)
    +import qualified Data.ByteString.Char8 as P
    +import qualified Data.ByteString.Lazy.Char8 as L
    +import System.Directory(removeFile)
    +import System.Environment(getEnv)
    +import System.IO
    +import System.IO.Unsafe(unsafePerformIO)
    +import Text.XML.HaXml.Verbatim(verbatim)
    +import Happstack.Data hiding (Element)
    +
    +logMX :: Priority -> String -> IO ()
    +logMX = logM "Happstack.Server.XSLT"
    +
    +type XSLPath = FilePath
    +
    +$(deriveAll [''Show,''Read,''Default, ''Eq, ''Ord]
    +   [d|
    +       data XSLTCmd = XSLTProc | Saxon 
    +    |]
    +   )
    +
    +xsltCmd :: XSLTCmd
    +           -> XSLPath
    +           -> FilePath
    +           -> FilePath
    +           -> (FilePath, [String])
    +xsltCmd XSLTProc = xsltproc'
    +xsltCmd Saxon = saxon'
    +
    +-- | Uses 'xsltString' to transform the given XML 'Element' into a
    +-- a 'String'.    
    +xsltElem :: XSLPath -> Element -> String
    +xsltElem xsl = xsltString xsl . verbatim
    +
    +
    +procLBSIO :: XSLTCmd -> XSLPath -> L.ByteString -> IO L.ByteString
    +procLBSIO xsltp' xsl inp = 
    +    withTempFile "happs-src.xml" $ \sfp sh -> do
    +    withTempFile "happs-dst.xml" $ \dfp dh -> do
    +    let xsltp = xsltCmd xsltp'
    +    L.hPut sh inp
    +    hClose sh
    +    hClose dh
    +    xsltFileEx xsltp xsl sfp dfp
    +    s <- L.readFile dfp
    +    logMX DEBUG (">>> XSLT: result: "++ show s)
    +    return s
    +
    +
    +procFPSIO :: XSLTCommand
    +             -> XSLPath
    +             -> [P.ByteString]
    +             -> IO [P.ByteString]
    +procFPSIO xsltp xsl inp = 
    +    withTempFile "happs-src.xml" $ \sfp sh -> do
    +    withTempFile "happs-dst.xml" $ \dfp dh -> do
    +    mapM_ (P.hPut sh) inp
    +    hClose sh
    +    hClose dh
    +    xsltFileEx xsltp xsl sfp dfp
    +    s <- P.readFile dfp
    +    logMX DEBUG (">>> XSLT: result: "++ show s)
    +    return [s]
    +
    +-- | Performs an XSL transformation with lists of ByteStrings instead of
    +-- a String.
    +xsltFPS :: XSLPath -> [P.ByteString] -> [P.ByteString]
    +xsltFPS xsl = unsafePerformIO . xsltFPSIO xsl
    +
    +-- | Equivalent to 'xsltFPS' but does not hide the inherent IO of the low-level
    +-- ByteString operations.
    +xsltFPSIO :: XSLPath -> [P.ByteString] -> IO [P.ByteString]
    +xsltFPSIO xsl inp = 
    +    withTempFile "happs-src.xml" $ \sfp sh -> do
    +    withTempFile "happs-dst.xml" $ \dfp dh -> do
    +    mapM_ (P.hPut sh) inp
    +    hClose sh
    +    hClose dh
    +    xsltFile xsl sfp dfp
    +    s <- P.readFile dfp
    +    logMX DEBUG (">>> XSLT: result: "++ show s)
    +    return [s]
    +
    +-- | Uses the provided xsl file to transform the given string.
    +-- This function creates temporary files during its execution, but
    +-- guarantees their cleanup.
    +xsltString :: XSLPath -> String -> String
    +xsltString xsl inp = unsafePerformIO $
    +    withTempFile "happs-src.xml" $ \sfp sh -> do
    +    withTempFile "happs-dst.xml" $ \dfp dh -> do
    +    hPutStr sh inp
    +    hClose sh
    +    hClose dh
    +    xsltFile xsl sfp dfp
    +    s <- readFileStrict dfp
    +    logMX DEBUG (">>> XSLT: result: "++ show s)
    +    return s
    +
    +-- | Note that the xsl file must have .xsl suffix.
    +xsltFile :: XSLPath -> FilePath -> FilePath -> IO ()
    +xsltFile = xsltFileEx xsltproc'
    +
    +-- | Use @xsltproc@ to transform XML.
    +xsltproc :: XSLTCmd
    +xsltproc = XSLTProc
    +xsltproc' :: XSLTCommand
    +xsltproc' dst xsl src = ("xsltproc",["-o",dst,xsl,src])
    +
    +
    +-- | Use @saxon@ to transform XML.
    +saxon :: XSLTCmd
    +saxon = Saxon
    +saxon' :: XSLTCommand
    +saxon' dst xsl src = ("java -classpath /usr/share/java/saxon.jar",
    +                     ["com.icl.saxon.StyleSheet"
    +                     ,"-o",dst,src,xsl])
    +                        
    +type XSLTCommand = XSLPath -> FilePath -> FilePath -> (FilePath,[String])
    +xsltFileEx   :: XSLTCommand -> XSLPath -> FilePath -> FilePath -> IO ()
    +xsltFileEx xsltp xsl src dst = do
    +    let msg = (">>> XSLT: Starting xsltproc " ++ unwords ["-o",dst,xsl,src])
    +    logMX DEBUG msg
    +    uncurry runCommand $ xsltp dst xsl src
    +    logMX DEBUG (">>> XSLT: xsltproc done")
    +
    +-- Utilities
    +
    +withTempFile :: String -> (FilePath -> Handle -> IO a) -> IO a
    +withTempFile str hand = bracket (openTempFile tempDir str) (removeFile . fst) (uncurry hand)
    +
    +readFileStrict :: FilePath -> IO String
    +readFileStrict fp = do
    +    let fseqM [] = return [] 
    +        fseqM xs = last xs `seq` return xs
    +    fseqM =<< readFile fp
    +
    +{-# NOINLINE tempDir #-}
    +tempDir :: FilePath
    +tempDir = unsafePerformIO $ tryAny [getEnv "TEMP",getEnv "TMP"] err
    +    where err = return "/tmp"
    +
    +tryAny :: [IO a] -> IO a -> IO a
    +tryAny [] c     = c
    +tryAny (x:xs) c = either (\(_::SomeException) -> tryAny xs c) return =<< try x
    +
    + addfile ./docs/0.5.0/happstack-server/src/Happstack-Server.html hunk ./docs/0.5.0/happstack-server/src/Happstack-Server.html 1 + + + + +src/Happstack/Server.hs + + + +
    module Happstack.Server 
    +(module Happstack.Server.XSLT
    +,module Happstack.Server.SimpleHTTP
    +,module Happstack.Server.HTTP.Client
    +,module Happstack.Server.MessageWrap
    +,module Happstack.Server.HTTP.FileServe
    +,module Happstack.Server.StdConfig)
    +where
    +import Happstack.Server.HTTP.Client
    +import Happstack.Server.StdConfig
    +import Happstack.Server.XSLT
    +import Happstack.Server.SimpleHTTP
    +import Happstack.Server.MessageWrap
    +import Happstack.Server.HTTP.FileServe
    +
    +
    + addfile ./docs/0.5.0/happstack-server/src/Paths_happstack_server.html hunk ./docs/0.5.0/happstack-server/src/Paths_happstack_server.html 1 + + + + +dist/build/autogen/Paths_happstack_server.hs + + + +
    module Paths_happstack_server (
    +    version,
    +    getBinDir, getLibDir, getDataDir, getLibexecDir,
    +    getDataFileName
    +  ) where
    +
    +import Data.Version (Version(..))
    +import System.Environment (getEnv)
    +
    +version :: Version
    +version = Version {versionBranch = [0,5,0], versionTags = []}
    +
    +bindir, libdir, datadir, libexecdir :: FilePath
    +
    +bindir     = "/home/stepcut/.cabal/bin"
    +libdir     = "/home/stepcut/.cabal/lib/happstack-server-0.5.0/ghc-6.13"
    +datadir    = "/home/stepcut/.cabal/share/happstack-server-0.5.0"
    +libexecdir = "/home/stepcut/.cabal/libexec"
    +
    +getBinDir, getLibDir, getDataDir, getLibexecDir :: IO FilePath
    +getBinDir = catch (getEnv "happstack_server_bindir") (\_ -> return bindir)
    +getLibDir = catch (getEnv "happstack_server_libdir") (\_ -> return libdir)
    +getDataDir = catch (getEnv "happstack_server_datadir") (\_ -> return datadir)
    +getLibexecDir = catch (getEnv "happstack_server_libexecdir") (\_ -> return libexecdir)
    +
    +getDataFileName :: FilePath -> IO FilePath
    +getDataFileName name = do
    +  dir <- getDataDir
    +  return (dir ++ "/" ++ name)
    +
    + addfile ./docs/0.5.0/happstack-server/src/hscolour.css hunk ./docs/0.5.0/happstack-server/src/hscolour.css 1 +.hs-keyglyph, .hs-layout {color: red;} +.hs-keyword {color: blue;} +.hs-comment, .hs-comment a {color: green;} +.hs-str, .hs-chr {color: teal;} +.hs-keyword, .hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {} adddir ./docs/0.5.0/happstack-state addfile ./docs/0.5.0/happstack-state.haddock binary ./docs/0.5.0/happstack-state.haddock oldhex * newhex *0d0cface000f0000765e000064c4b3000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000001000000 *050000000000000001000000060000000000000001000000070000000000000001000000080000 *0000000000010000000900000000000000010000000a00000000000000010000000b0000000000 *0000010000000c00000000000000020000000d00000000000000020000000e0000000000000002 *0000000f0000000000000002000000100000000000000002000000110000000000000002000000 *120000000000000002000000130000000000000001000000140000000000000001000000150000 *000000000001000000160000000000000001000000170000000000000001000000180000000000 *0000010000001900000000000000010000001a00000000000000010000001b0000000000000001 *0000001c00000000000000030000001d00000000000000030000001e0000000000000003000000 *1f0000000000000003000000200000000000000003000000210000000000000003000000220000 *000000000003000000230000000000000003000000240000000000000003000000250000000000 *000003000000260000000000000003000000270000000000000003000000280000000000000003 *0000002900000000000000030000002a00000000000000030000002b0000000000000003000000 *2c00000000000000030000002d00000000000000030000002e00000000000000030000002f0000 *000000000003000000300000000000000003000000310000000000000003000000320000000000 *000003000000330000000000000003000000340000000000000003000000350000000000000003 *000000360000000000000003000000370000000000000003000000380000000000000003000000 *3900000000000000040000003a00000000000000020000003b00000000000000020000003c0000 *0000000000020000003d00000000000000020000003e00000000000000020000003f0000000000 *000002000000400000000000000002000000410000000000000002000000420000000000000002 *000000430000000000000002000000440000000000000002000000450000000000000002000000 *460000000000000002000000470000000000000002000000480000000000000002000000490000 *0000000000020000004a00000000000000020000004b00000000000000020000004c0000000000 *0000020000004d00000000000000050000004e00000000000000050000004f0000000000000005 *000000500000000000000005000000510000000000000005000000520000000000000005000000 *530000000000000005000000540000000000000005000000550000000000000005000000560000 *000000000005000000570000000000000005000000580000000000000005000000590000000000 *0000050000005a00000000000000050000005b00000000000000050000005c0000000000000005 *0000005d00000000000000050000005e00000000000000050000005f0000000000000005000000 *600000000000000005000000610000000000000005000000620000000000000005000000630000 *000000000005000000640000000000000005000000650000000000000005000000660000000000 *000005000000670000000000000005000000680000000000000005000000690000000000000005 *0000006a00000000000000050000006b00000000000000050000006c0000000000000005000000 *6d00000000000000050000006e00000000000000050000006f0000000000000005000000700000 *000000000005000000710000000000000005000000720000000000000005000000730000000000 *000005000000740000000000000005000000750000000000000005000000760000000000000005 *000000770000000000000005000000780000000000000005000000790000000000000005000000 *7a00000000000000050000007b00000000000000050000007c00000000000000050000007d0000 *0000000000050000007e00000000000000050000007f0000000000000005000000800000000000 *000005000000810000000000000005000000820000000000000005000000830000000000000005 *000000840000000000000005000000850000000000000005000000860000000000000005000000 *8700000000000000050000008800000000000000050000008900000000000000050000008a0000 *0000000000050000008b00000000000000050000008c00000000000000050000008d0000000000 *0000050000008e00000000000000050000008f0000000000000005000000900000000000000005 *000000910000000000000005000000920000000000000005000000930000000000000005000000 *940000000000000005000000950000000000000005000000960000000000000005000000970000 *0000000000050000009800000000000000050000009900000000000000050000009a0000000000 *0000050000009b00000000000000050000009c00000000000000050000009d0000000000000005 *0000009e00000000000000050000009f0000000000000005000000a00000000000000005000000 *a10000000000000005000000a20000000000000005000000a30000000000000005000000a40000 *000000000005000000a50000000000000005000000a60000000000000005000000a70000000000 *000005000000a80000000000000005000000a90000000000000005000000aa0000000000000005 *000000ab0000000000000002000000ac0000000000000002000000ad0000000000000002000000 *ae0000000000000006000000af0000000000000006000000b00000000000000006000000b10000 *000000000006000000b200000000000000060f0000000000000007000000000b00000000000000 *000001000000000002000000000003000000000004000000000005000000000006000000000007 *00000000000800000000000900000000000a00000b000000000000000100000002000000030000 *000400000005000000060000000700000008000000090000000a0001000b000000000500000001 *000000020000000300000004000000050000000100000000020000000003000000000400000000 *050000000006040000000700000008000000090000000a00000007000000000800000000090000 *00000a000000000000000008000000000d0000000b0000000000b30000000000b40000000000b5 *0000000000b60000000000b70000000000b80000000000b90000000000ba0000000000bb000000 *0000bc0103021c0000004a00000075000000730000007400000020000000740000006f00000020 *00000061000000760000006f000000690000006400000020000000610000002000000064000000 *6500000070000000650000006e00000064000000650000006e00000063000000790000002e0000 *000a00000000bd0000000000be0000050000000b000000b8000000ba000000bd000000be000100 *050000000b00000000b800000000ba00000000bd00000000be0000000000000000090000000007 *000000bf0000000000c00000000000c10000000000c20000000000c30000000000c40000000000 *c5000007000000bf000000c0000000c1000000c2000000c3000000c4000000c500010007000000 *bf00000000c000000000c100000000c200000000c300000000c400000000c50000000000000000 *0a000000000c000000c60000000000c70000000000c80000000000c90000000000ca0000000000 *cb0000000000cc0000000000cd0000000000ce0103021d00000041000000200000007300000061 *000000760000006500000072000000200000007400000068000000610000007400000020000000 *62000000750000006e000000630000006800000065000000730000002000000077000000720000 *00690000007400000065000000730000002e0000000a00000000cf0000000000d00000000000d1 *000002000000cd000000ce00010002000000cd00000000ce00000000000000000b000000001c00 *0000d20000000000d30000000000d40000000000d50000000000d60000000000d700000000000c *00000000000d00000000000e0103021f0000004d0000006f0000006e0000006100000064000000 *20000000660000006f000000720000002000000041000000430000004900000044000000200000 *006500000076000000650000006e000000740000002000000068000000610000006e0000006400 *00006c0000006500000072000000730000002e0000000a00000000d80000000000d90000000000 *0f0103023c0000004100000043000000490000004400000020000000630000006f0000006d0000 *007000000075000000740000006100000074000000690000006f0000006e000000730000002000 *00007400000068000000610000007400000020000000770000006f000000720000006b00000020 *0000007700000069000000740000006800000020000000610000006e0000007900000020000000 *730000007400000061000000740000006500000020000000610000006e00000064000000200000 *006500000076000000650000006e00000074000000200000007400000079000000700000006500 *0000730000002e0000000a00000000da0000000000db0000000000dc0000000000dd0000000000 *de0000000000df0000000000100000000000110000000000e00000000000e10000000000e20000 *000000e30000000000e40000000000120000000000e50000000000e600001c000000d2000000d3 *000000d4000000d5000000d6000000d70000000c0000000d0000000e000000d8000000d9000000 *0f000000da000000db000000dc000000dd000000de000000df0000001000000011000000e00000 *00e1000000e2000000e3000000e400000012000000e5000000e60001001c000000d202000000d3 *000000d4000000d300000000d400000000d502000000d6000000d7000000d600000000d7000000 *000c000000000d000000000e02000000d8000000d9000000d800000000d9000000000f00000000 *da05000000db000000dc000000dd000000de000000df000000db00000000dc00000000dd000000 *00de00000000df0000000010000000001100000000e003000000e1000000e2000000e3000000e1 *00000000e200000000e300000000e4000000001200000000e500000000e6000000000000000001 *00000000090000001300000000001400000000001501030211000000450000006e000000610000 *00620000006c000000650000002000000071000000750000006500000075000000650000006900 *00006e000000670000002e0000000a00000000160103024b000000410000002000000073000000 *610000007600000065000000720000002000000074000000680000006100000074000000200000 *006f00000070000000650000007200000061000000740000006500000073000000200000006f00 *00006e0000002000000066000000690000006c00000065000000730000002e0000002000000054 *000000680000006500000020000000700000006100000072000000610000006d00000065000000 *740000006500000072000000200000006900000073000000200000007400000068000000650000 *002000000070000000720000006500000066000000690000007800000020000000660000006f00 *000072000000200000007400000068000000650000002000000066000000690000006c00000065 *000000730000002e0000000a000000001701030221000000410000002000000073000000610000 *007600000065000000720000002000000074000000680000006100000074000000200000006400 *00006900000073000000630000006100000072000000640000007300000020000000610000006c *0000006c000000200000006f00000075000000740000007000000075000000740000000a000000 *001801030102340000004400000069000000730000007000000061000000740000006300000068 *0000006500000073000000200000006f0000007600000065000000720000002000000074000000 *680000006500000020000000530000006100000076000000650000007200000020000000740000 *007900000070000000650000002000000070000000720000006f00000076000000690000006400 *0000650000006400000020000000740000006f0000002000000072000000650000007400000075 *000000720000006e00000020000000610000002001040200000007000000060102120000002000 *0000660000006f000000720000002000000074000000680000006500000020000000690000006e *0000006600000065000000720000007200000065000000640000000a0208000000200000007400 *00007900000070000000650000002e000000200000000a00000000190103010249000000440000 *006900000073000000700000006100000074000000630000006800000065000000730000002000 *00006f000000760000006500000072000000200000007400000068000000650000002000000053 *000000610000007600000065000000720000002000000074000000790000007000000065000000 *2000000070000000720000006f0000007600000069000000640000006500000064000000200000 *00740000006f0000002000000072000000650000007400000075000000720000006e0000002000 *000061000000200000005700000072000000690000007400000065000000720000005300000074 *0000007200000065000000610000006d00000020000000660000006f0000007200000020000000 *7400000068000000650000000a021100000020000000690000006e000000660000006500000072 *00000072000000650000006400000020000000740000007900000070000000650000002e000000 *200000000a000000001a00000000001b0000150000000000000001000000020000000300000004 *00000005000000060000000700000008000000090000000a0000000b0000001300000014000000 *15000000160000001700000018000000190000001a0000001b1500000006000000070000000800 *0000090000000a0000000000000001000000020000000300000004000000050000000b00000013 *0000001700000016000000150000001400000018000000190000001a0000001b00090000001304 *000000170000001600000015000000140000001400000000150000000016000000001700000000 *180000000019000000001a000000001b000000000000000003000000001d0000001c0000000000 *1d00000000001e00000000001f0103010247000000530000007500000062000000480000006100 *00006e000000640000006c00000065000000720000007300000020000000690000007300000020 *0000007500000073000000650000006400000020000000740000006f0000002000000062000000 *75000000690000006c000000640000002000000075000000700000002000000074000000680000 *006500000020000000730000006500000074000000200000006f00000066000000200000006300 *00006f0000006d000000700000006f0000006e000000650000006e000000740000007300000020 *000000630000006f00000072000000720000006500000073000000700000006f0000006e000000 *64000000690000006e0000006700000020000000740000006f0000000a02140000002000000074 *000000680000006500000020000000690000006e0000007300000074000000610000006e000000 *630000006500000020000000740000007900000070000000650000002e0000000a000000002000 *0000000021010301022a000000490000006e000000200000006f00000072000000640000006500 *00007200000020000000740000006f000000200000006200000065000000200000007500000073 *000000650000006400000020000000610000007300000020000000610000002000000070000000 *610000007200000074000000200000006f00000066000000200000004800000061000000700000 *0070000000730000007400000061000000630000006b0102010000002701021b00000073000000 *200000004d00000041000000430000004900000044000000200000007300000074000000610000 *0074000000650000002c0000002000000061000000200000006400000061000000740000006100 *000020000000740000007900000070000000650000000a010243000000200000006e0000006500 *000065000000640000007300000020000000740000006f00000020000000620000006500000020 *000000610000006e00000020000000690000006e0000007300000074000000610000006e000000 *6300000065000000200000006f0000006600000020000000430000006f0000006d000000700000 *006f0000006e000000650000006e000000740000002e0000002000000020000000540000006800 *000065000000200000006d000000690000006e000000690000006d000000610000006c00000020 *000000640000006500000066000000690000006e0000006900000074000000690000006f000000 *6e000000200000006900000073000000200000000a01024800000020000000610000006e000000 *20000000690000006e000000690000007400000069000000610000006c00000056000000610000 *006c000000750000006500000020000000610000006e0000006400000020000000740000006800 *000065000000200000007400000079000000700000006500000020000000630000006f00000072 *000000720000006500000073000000700000006f0000006e00000064000000690000006e000000 *6700000020000000740000006f0000002000000074000000680000006500000020000000730000 *006500000074000000200000006f00000066000000200000004400000065000000700000006500 *00006e00000064000000650000006e000000630000006900000065000000730000002e0000000a *010246000000200000004e0000006f000000740000006500000020000000740000006800000061 *000000740000002000000074000000680000006500000020000000530000007500000062000000 *48000000610000006e000000640000006c00000065000000720000007300000020000000630000 *006f0000006e000000640000006900000074000000690000006f0000006e000000200000007700 *0000690000006c0000006c00000020000000620000006500000020000000610000007500000074 *0000006f0000006d00000061000000740000006900000063000000610000006c0000006c000000 *79000000200000006d000000650000007400000020000000690000006600000020000000740000 *0068000000650000000a01021c00000020000000440000006500000070000000650000006e0000 *0064000000650000006e0000006300000069000000650000007300000020000000690000007300 *0000200000006200000075000000690000006c000000740000002000000066000000720000006f *0000006d00000020010402000000330000003201020500000020000000610000006e0000006400 *000020010201000000270102030000003a0000002b0000003a0102010000002701021a00000020 *00000077000000690000007400000068000000200000006f000000740000006800000065000000 *7200000020000000690000006e0000007300000074000000610000006e00000063000000650000 *0073000000200000006f00000066000000200000000a021700000020000000430000006f000000 *6d000000700000006f0000006e000000650000006e0000007400000020000000610000006e0000 *0064000000200000004d0000006500000074000000680000006f00000064000000730000000a00 *000000220000000000230000000000240000000000250103021b00000053000000740000006100 *000074000000650000002000000074000000790000007000000065000000200000002d0000003e *00000020000000610000006c0000006c0000002000000076000000650000007200000073000000 *690000006f0000006e000000730000000a00000000260103021900000053000000740000006100 *000074000000650000002000000074000000790000007000000065000000200000002d0000003e *000000200000006d0000006500000074000000680000006f00000064000000200000006d000000 *61000000700000000a0000000027000000000028000000000029010301024b000000430000006c *00000061000000730000007300000020000000660000006f000000720000002000000065000000 *6e000000750000006d00000065000000720000006100000074000000690000006e000000670000 *002000000074000000680000006500000020000000730000006500000074000000200000006f00 *00006600000020000000640000006500000066000000690000006e000000650000006400000020 *0000006d0000006500000074000000680000006f00000064000000730000002000000062000000 *790000002000000074000000680000006500000020000000740000007900000070000000650000 *00200000006f000000660000002000000074000000680000006500000020000000730000007400 *00006100000074000000650000002e0000000a01023500000020000000490000006e0000007300 *000074000000610000006e0000006300000065000000730000002000000073000000680000006f *000000750000006c00000064000000200000006e0000006f000000740000002000000062000000 *6500000020000000640000006500000066000000690000006e0000006500000064000000200000 *006400000069000000720000006500000063000000740000006c000000790000002c0000002000 *0000620000007500000074000000200000007500000073000000690000006e0000006700000020 *0102090000006d0000006b0000004d0000006500000074000000680000006f0000006400000073 *02010000000a000000002a00000000002b01030102410000004d00000065000000740000006800 *00006f000000640000002000000069000000730000002000000074000000680000006500000020 *00000061000000630000007400000075000000610000006c000000200000007400000079000000 *7000000065000000200000007400000068000000610000007400000020000000610000006c0000 *006c00000020000000550000007000000064000000610000007400000065000000730000002000 *0000610000006e0000006400000020000000510000007500000065000000720000007900000073 *000000200000006500000076000000650000006e0000007400000075000000610000006c000000 *6c000000790000000a01021500000020000000670000006500000074000000200000006c000000 *690000006600000074000000650000006400000020000000690000006e000000740000006f0000 *0020000000760000006900000061000000200102090000006d0000006b0000004d000000650000 *0074000000680000006f000000640000007302020000002e0000000a000000002c00000000002d *00000000002e00000000002f000000000030010302410000005400000079000000700000006500 *0000200000006c0000006500000076000000650000006c00000020000000430000006f0000006e *0000007300000020000000660000006f0000007200000020000000650000006e00000075000000 *6d00000065000000720000006100000074000000690000006e0000006700000020000000740000 *0079000000700000006500000020000000640000006500000070000000650000006e0000006400 *0000650000006e00000063000000690000006500000073000000200000006f0000006600000020 *0000006100000020000000430000006f0000006d000000700000006f0000006e00000065000000 *6e000000740000000a0000000031000000000032010301020f0000004500000071000000750000 *006900000076000000610000006c000000650000006e00000074000000200000006f0000006600 *0000200000005b0102010000005d01023900000020000000660000006f00000072000000200000 *0074000000790000007000000065000000200000006c0000006500000076000000650000006c00 *0000200000006c000000690000007300000074000000730000002e000000200000002000000055 *00000073000000650000006400000020000000660000006f000000720000002000000043000000 *6f0000006d000000700000006f0000006e000000650000006e0000007400000073000000200000 *007400000068000000610000007400000020000000680000006100000076000000650000002000 *00006e0000006f0000000a020e00000020000000640000006500000070000000650000006e0000 *0064000000650000006e000000630000006900000065000000730000000a000000003300000000 *00340103021e000000440000006900000073000000700000006c00000061000000790000007300 *000020000000740000006800000065000000200000007400000079000000700000006500000020 *0000006f000000660000002000000061000000200000004d000000650000007400000068000000 *6f000000640000000a00000000350000000000360000000000370000000000380103022b000000 *410000006e000000200000006500000072000000720000006f0000007200000020000000690000 *0073000000200000007400000068000000720000006f000000770000006e000000200000007700 *000068000000650000006e00000020000000740000006800000069000000730000002000000069 *00000073000000200000006500000076000000610000006c000000750000006100000074000000 *65000000640000002e0000000a001d0000001c0000001d0000001e0000001f0000002000000021 *00000022000000230000002400000025000000260000002700000028000000290000002a000000 *2b0000002c0000002d0000002e0000002f00000030000000310000003200000033000000340000 *00350000003600000037000000381d000000320000003300000030000000310000002f0000002e *0000002b0000002d0000002c00000034000000290000002a000000270000002800000026000000 *25000000210000002200000023000000240000001f000000200000001d0000001e000000350000 *001c000000360000003700000038001d0000001c000000001d010000001e0000001e000000001f *010000002000000020000000002103000000220000002300000024000000220000000023000000 *00240000000025000000002600000000270100000028000000280000000029010000002a000000 *2a000000002b020000002d0000002c0000002c000000002d000000002e000000002f0000000030 *010000003100000031000000003201000000330000003300000000340000000035000000003600 *0000003700000000380000000000000000040000000028000000e70000000000e80000000000e9 *0000000000ea0000000000eb0000000000ec0000000000ed0000000000ee0000000000ef000000 *0000f00000000000f10000000000f2000000000039010301024700000054000000680000006900 *0000730000002000000066000000750000006e0000006300000074000000690000006f0000006e *0000002000000077000000690000006c0000006c00000020000000640000006500000072000000 *6900000076000000650000002c00000020000000660000006f0000007200000020000000740000 *0068000000650000002000000070000000720000006f0000007600000069000000640000006500 *0000640000002000000074000000790000007000000065000000200000006e000000610000006d *0000006500000020000000610000006e0000006400000020000000740000006800000065000000 *2000000070000000720000006f00000076000000690000006400000065000000640000000a0102 *4c0000002000000020000000200000006c000000690000007300000074000000200000006f0000 *0066000000200000006d0000006500000074000000680000006f00000064000000730000002c00 *000020000000610000006e00000020000000690000006e0000007300000074000000610000006e *0000006300000065000000200000006f00000066000000200000004d0000006500000074000000 *680000006f000000640000007300000020000000660000006f0000007200000020000000740000 *00680000006500000020000000670000006900000076000000650000006e000000200000007400 *000079000000700000006500000020000000610000006e00000064000000200000006e00000065 *000000630000006500000073000000730000006100000072000000790000000a01025100000020 *0000002000000020000000690000006e0000007300000074000000610000006e00000063000000 *65000000200000006f000000660000002000000055000000700000006400000061000000740000 *00650000004500000076000000650000006e0000007400000020000000610000006e0000006400 *00002000000051000000750000006500000072000000790000004500000076000000650000006e *0000007400000020000000740000006f000000200000006d000000610000006b00000065000000 *200000007400000068000000650000002000000070000000720000006f00000076000000690000 *00640000006500000064000000200000006c000000690000007300000074000000200000006f00 *0000660000002000000066000000750000006e0000006300000074000000690000006f0000006e *000000730000000a010211000000200000002000000020000000690000006e000000740000006f *000000200000004d0000006500000074000000680000006f00000064000000730000002e000000 *0a01024d0000002000000020000000200000005400000068000000690000007300000020000000 *54000000480000002000000073000000700000006c000000690000006300000065000000200000 *006e0000006500000065000000640000007300000020000000740000006f000000200000006200 *000065000000200000006500000078000000650000006300000075000000740000006500000064 *00000020000000660000006f0000007200000020000000610000006e0000007900000020000000 *4d0000004100000043000000490000004400000020000000730000007400000061000000740000 *0065000000200000007400000079000000700000006500000020000000690000006e0000002000 *00006f0000007200000064000000650000007200000020000000740000006f000000200000000a *010239000000200000002000000020000000680000006100000076000000650000002000000074 *0000006800000065000000200000006e0000006500000063000000650000007300000073000000 *61000000720000007900000020000000630000006f000000640000006500000020000000660000 *006f00000072000000200000006500000076000000650000006e00000074000000200000006800 *0000610000006e000000640000006c000000690000006e00000067000000200000006700000065 *0000006e0000006500000072000000610000007400000065000000640000002e0000000a010208 *00000020000000200000002000000045000000780000003a0000002000000020010701020c0000 *0024000000280000006d0000006b0000004d0000006500000074000000680000006f0000006400 *000073000000200102010000002701020100000027010205000000460000006f0000006f000000 *200000005b0102010000002701020a000000660000006f0000006f000000550000007000000064 *0000006100000074000000650000002c010208000000660000006f0000006f0000005100000075 *0000006500000072000000790102010000005d02010000002902010000000a00000000f3000000 *0000f40000000000f50000000000f60000000000f70000000000f80000000000f90000000000fa *0000000000fb0000000000fc0000000000fd0000000000fe0000000000ff000000000100000000 *000101000000000102000000000103000000000104000000000105000000000106010301024000 *000049000000670000006e0000006f00000072000000690000006e000000670000002000000045 *0000007100000075000000610000006c0000005000000020000000700000007200000065000000 *640000006900000063000000610000007400000065000000730000002c00000020000000720000 *00650000007400000075000000720000006e0000007300000020000000610000006c0000006c00 *0000200000006e000000610000006d000000650000007300000020000000610000007300000073 *0000006f0000006300000069000000610000007400000065000000640000002000000077000000 *69000000740000006800000020000000610000000a021300000020000000630000006f0000006e *000000740000006500000078000000740000002000000070000000720000006500000064000000 *69000000630000006100000074000000650000000a000000010700000000010800000000010900 *000000010a00000000010b00000000010c00000000010d00000100000039010000003900010000 *003900000000000000000c00000000100000003a00000000003b00000000003c01030233000000 *55000000730000006500000020000000610000002000000070000000720000006f000000780000 *007900000020000000740000006f00000020000000660000006f00000072000000630000006500 *000020000000740000006800000065000000200000007400000079000000700000006500000020 *0000006f0000006600000020000000610000006e00000020000000750000007000000064000000 *61000000740000006500000020000000610000006300000074000000690000006f0000006e0000 *002e0000000a000000003d01030231000000460000006f00000072000000630000006500000073 *000000200000007400000068000000650000002000000074000000790000007000000065000000 *200000006f00000066000000200000007400000068000000650000002000000070000000720000 *006f000000780000007900000020000000610000006e0000006400000020000000750000007000 *00006400000061000000740000006500000020000000740000006f000000200000006d00000061 *0000007400000063000000680000000a000000003e010302310000005500000073000000650000 *0020000000610000002000000070000000720000006f0000007800000079000000200000007400 *00006f00000020000000660000006f000000720000006300000065000000200000007400000068 *000000650000002000000074000000790000007000000065000000200000006f00000066000000 *200000006100000020000000710000007500000065000000720000007900000020000000610000 *006300000074000000690000006f0000006e0000002e0000000a000000003f0103022c00000046 *0000006f0000007200000063000000650000007300000020000000740000006800000065000000 *2000000074000000790000007000000065000000200000006f0000006600000020000000700000 *00720000006f000000780000007900000020000000610000006e00000064000000200000007100 *00007500000065000000720000007900000020000000740000006f000000200000006d00000061 *0000007400000063000000680000000a0000000040010301021400000043000000750000007200 *00007200000079000000690000006e000000670000002000000076000000650000007200000073 *000000690000006f0000006e000000200000006f00000066000000200104010000003c02020000 *002e0000000a000000004101030102140000004300000075000000720000007200000079000000 *690000006e000000670000002000000076000000650000007200000073000000690000006f0000 *006e000000200000006f00000066000000200104010000003e02020000002e0000000a00000000 *4201030102170000005300000070000000650000006300000069000000610000006c0000006900 *00007a00000065000000640000002000000076000000650000007200000073000000690000006f *0000006e000000200000006f00000066000000200104010000010e02010000000a000000004301 *030102170000005300000070000000650000006300000069000000610000006c00000069000000 *7a00000065000000640000002000000076000000650000007200000073000000690000006f0000 *006e000000200000006f00000066000000200104010000010f02010000000a0000000044010301 *02170000005300000070000000650000006300000069000000610000006c000000690000007a00 *000065000000640000002000000076000000650000007200000073000000690000006f0000006e *000000200000006f00000066000000200104010000011002020000002e0000000a000000004501 *03021c0000004c00000069000000660000007400000020000000610000006e0000002000000053 *000000540000004d00000020000000610000006300000074000000690000006f0000006e000000 *20000000690000006e000000740000006f0000002000000045000000760000002e0000000a0000 *0000460103022200000053000000650000006c0000006500000063000000740000002000000061 *0000002000000070000000610000007200000074000000200000006f0000006600000020000000 *74000000680000006500000020000000650000006e0000007600000069000000720000006f0000 *006e0000006d000000650000006e000000740000002e0000000a00000000470103025100000052 *000000750000006e000000200000006100000020000000630000006f0000006d00000070000000 *75000000740000006100000074000000690000006f0000006e0000002000000077000000690000 *007400000068000000200000006c0000006f00000063000000610000006c000000200000007300 *0000740000006100000074000000650000002e000000200000004300000068000000610000006e *00000067000000650000007300000020000000740000006f000000200000007300000074000000 *6100000074000000650000002000000077000000690000006c0000006c00000020000000620000 *00650000002000000076000000690000007300000069000000620000006c000000650000002000 *0000740000006f000000200000006f000000750000007400000073000000690000006400000065 *0000002e0000000a00000000480103022400000052000000750000006e00000020000000610000 *0020000000630000006f0000006d00000070000000750000007400000061000000740000006900 *00006f0000006e0000002000000077000000690000007400000068000000200000006c0000006f *00000063000000610000006c000000200000007300000074000000610000007400000065000000 *2e0000000a00000000490103022c00000045000000780000006500000063000000750000007400 *000065000000200000006100000020000000510000007500000065000000720000007900000020 *000000610000006300000074000000690000006f0000006e00000020000000690000006e000000 *200000007400000068000000650000002000000055000000700000006400000061000000740000 *0065000000200000006d0000006f0000006e00000061000000640000002e0000000a0010000000 *3a0000003b0000003c0000003d0000003e0000003f000000400000004100000042000000430000 *00440000004500000046000000470000004800000049000100100000003a010000003b0000003b *000000003c000000003d000000003e000000003f00000000400000000041000000004200000000 *430000000044000000004500000000460000000047000000004800000000490000000000000000 *0d00000000090000004a0103021500000047000000650000007400000020000000610000002000 *000072000000610000006e000000640000006f0000006d000000200000006e000000750000006d *0000006200000065000000720000002e0000000a000000004b0103022600000047000000650000 *007400000020000000610000002000000072000000610000006e000000640000006f0000006d00 *0000200000006e000000750000006d00000062000000650000007200000020000000690000006e *000000730000006900000064000000650000002000000074000000680000006500000020000000 *72000000610000006e00000067000000650000002e0000000a000000004c010301024100000049 *0000006e0000006600000065000000720000002000000075000000700000006400000061000000 *74000000690000006e000000670000002000000066000000750000006e00000063000000740000 *00690000006f0000006e0000007300000020000000660000006f00000072000000200000006100 *0000200000007200000065000000630000006f00000072000000640000002e0000002000000020 *000000470000006900000076000000650000006e00000020000000610000002000000064000000 *610000007400000061000000200000006400000065000000630000006c00000061000000720000 *006100000074000000690000006f0000006e0000000a010204000000200000006f000000660000 *00200107022a0000006400000061000000740000006100000020000000460000006f0000006f00 *0000200000003d00000020000000460000006f0000006f000000200000007b0000006200000061 *00000072000000200000003a0000003a0000002000000053000000740000007200000069000000 *6e000000670000002c0000002000000062000000610000007a000000200000003a0000003a0000 *0020000000490000006e000000740000007d010206000000200000007400000068000000650000 *006e0000002001070102160000002400000028000000690000006e000000660000006500000072 *0000005200000065000000630000006f0000007200000064000000550000007000000064000000 *610000007400000065000000720000007300000020010201000000270102010000002702040000 *00460000006f0000006f000000290102010000000a010217000000200000007700000069000000 *6c0000006c00000020000000640000006500000066000000690000006e00000065000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000730000002001 *07021d000000610000005f000000620000006100000072000000200000003a0000003a00000020 *000000530000007400000072000000690000006e00000067000000200000002d0000003e000000 *20000000460000006f0000006f000000200000002d0000003e00000020000000460000006f0000 *006f0102020000002c000000200107022a00000077000000690000007400000068000000420000 *006100000072000000200000003a0000003a000000200000005500000070000000640000006100 *0000740000006500000020000000530000007400000072000000690000006e0000006700000020 *00000061000000200000002d0000003e0000002000000055000000700000006400000061000000 *740000006500000020000000460000006f0000006f00000020000000610102020000002c000000 *0a0232000000200000006500000074000000630000002e00000020000000740000006800000061 *000000740000002000000063000000610000006e00000020000000620000006500000020000000 *7500000073000000650000006400000020000000610000007300000020000000630000006f0000 *006e00000076000000650000006e00000069000000650000006e00000063000000650000002000 *000075000000700000006400000061000000740000006500000072000000730000002e00000020 *000000200000000a00000001110000000001120000000001130103023300000043000000720000 *00650000006100000074000000650000002000000061000000200000006c000000690000007300 *000074000000200000006f000000660000002000000073000000650000006c0000006500000063 *00000074000000690000006f0000006e0000002000000066000000750000006e00000063000000 *74000000690000006f0000006e0000007300000020000000660000006f00000072000000200000 *0061000000200000007200000065000000630000006f00000072000000640000002e0000000a00 *000001140103023000000043000000720000006500000061000000740000006500000020000000 *61000000200000006c000000690000007300000074000000200000006f00000066000000200000 *007500000070000000640000006100000074000000650000002000000066000000750000006e00 *00006300000074000000690000006f0000006e0000007300000020000000660000006f00000072 *0000002000000061000000200000007200000065000000630000006f0000007200000064000000 *2e0000000a00000001150103021300000052000000650000007400000075000000720000006e00 *0000200000006600000069000000650000006c00000064000000200000006e000000610000006d *00000065000000730000000a00000001160103021200000053000000690000006d000000700000 *006c0000006500000020000000640000006500000066000000690000006e000000690000007400 *0000690000006f0000006e0000000a00030000004a0000004b0000004c000100030000004a0000 *00004b000000004c000000000000000005000000005e0000004d00000000004e00000000004f00 *000000005000000000005100000000005200000000005300000000005400000000005500000000 *005600000000005700000000005800000000005900000000005a01030219000000530000006100 *000076000000650000007200000020000000670000006900000076000000650000006e00000020 *000000620000007900000020000000740000006800000065000000200000007500000073000000 *65000000720000002e0000000a000000005b00000000005c0103021e0000005400000079000000 *700000006500000073000000200000006f00000066000000200000006500000061000000630000 *006800000020000000630000006f0000006d000000700000006f0000006e000000650000006e00 *00007400000020000000750000007300000065000000640000002e0000000a000000005d010302 *280000004d0000006100000070000000200000006c000000690000007300000074000000690000 *006e0000006700000020000000610000006c0000006c0000002000000076000000650000007200 *000073000000690000006f0000006e00000073000000200000006f000000660000002000000061 *00000020000000630000006f0000006d000000700000006f0000006e000000650000006e000000 *740000000a000000005e00000000005f0103023900000053000000740000006f00000072000000 *6500000073000000200000006500000078000000630000006c0000007500000073000000690000 *007600000065000000200000007000000072000000650000006600000069000000780000002000 *00006c0000006f000000630000006b0000002000000028000000690000006d000000700000006c *000000650000006d000000650000006e0000007400000065000000640000002000000069000000 *6e0000002000000066000000690000006c00000065000000730000007900000073000000740000 *00650000006d000000290000000a00000000600000000000610000000000620000000000630000 *000000640000000000650000000000660000000000670000000000680000000000690000000000 *6a00000000006b00000000006c00000000006d00000000006e00000000006f0000000000700000 *000000710000000000720000000000730000000000740000000000750000000000760000000000 *7700000000007800000000007900000000007a00000000007b00000000007c00000000007d0000 *0000007e00000000007f0000000000800000000000810000000000820000000000830000000000 *8400000000008500000000008600000000008700000000008800000000008900000000008a0000 *0000008b00000000008c00000000008d00000000008e00000000008f0000000000900000000000 *910000000000920000000000930000000000940000000000950000000000960000000000970000 *00000098010301024f0000005300000063000000680000006500000064000000750000006c0000 *006500000020000000610000006e00000020000000750000007000000064000000610000007400 *00006500000020000000610000006e000000640000002000000077000000610000006900000074 *00000020000000660000006f000000720000002000000069000000740000002000000074000000 *6f00000020000000630000006f0000006d000000700000006c0000006500000074000000650000 *002e000000200000005700000068000000650000006e0000002000000074000000680000006900 *0000730000002000000066000000750000006e0000006300000074000000690000006f0000006e *0000002000000072000000650000007400000075000000720000006e000000730000002c000000 *20000000790000006f000000750102010000002701020300000072000000650000000a022b0000 *002000000067000000750000006100000072000000610000006e00000074000000650000006500 *000064000000200000007400000068000000650000002000000075000000700000006400000061 *00000074000000650000002000000077000000690000006c0000006c0000002000000062000000 *650000002000000070000000650000007200000073000000690000007300000074000000650000 *006e000000740000002e0000000a00000000990103022c000000450000006d0000006900000074 *000000200000006100000020000000730000007400000061000000740000006500000020000000 *710000007500000065000000720000007900000020000000610000006e00000064000000200000 *007700000061000000690000007400000020000000660000006f00000072000000200000007400 *0000680000006500000020000000720000006500000073000000750000006c000000740000002e *0000000a000000009a00000000009b00000000009c00000000009d00000000009e00000000009f *0000000000a00000000000a10000000000a20000000000a30000000000a40000000000a5000000 *0000a60000000000a70000000000a80000000000a90000000000aa00005e0000004d0000004e00 *00004f000000500000005100000052000000530000005400000055000000560000005700000058 *000000590000005a0000005b0000005c0000005d0000005e0000005f0000006000000061000000 *62000000630000006400000065000000660000006700000068000000690000006a0000006b0000 *006c0000006d0000006e0000006f00000070000000710000007200000073000000740000007500 *0000760000007700000078000000790000007a0000007b0000007c0000007d0000007e0000007f *000000800000008100000082000000830000008400000085000000860000008700000088000000 *890000008a0000008b0000008c0000008d0000008e0000008f0000009000000091000000920000 *00930000009400000095000000960000009700000098000000990000009a0000009b0000009c00 *00009d0000009e0000009f000000a0000000a1000000a2000000a3000000a4000000a5000000a6 *000000a7000000a8000000a9000000aa5e0000004d0000004e0000004f00000050000000510000 *0052000000530000005400000055000000830000008000000082000000810000007f0000007d00 *00007e0000008400000085000000860000008700000088000000790000007a0000007b0000007c *000000890000008a0000008b0000008c0000008d0000008e0000008f0000009000000091000000 *920000009300000094000000950000009600000097000000770000007800000075000000760000 *0098000000990000009a000000740000007300000071000000720000006f000000700000006d00 *00006e0000006c000000690000006b0000006a0000006800000067000000630000006400000065 *0000006600000062000000610000009b0000009c0000009d0000009e0000009f000000a0000000 *a1000000a2000000a3000000a4000000a5000000a6000000a7000000a8000000a9000000580000 *00590000005a0000005b0000005c0000005d0000005e0000005f00000060000000560000005700 *0000aa005e0000004d000000004e000000004f0000000050000000005100000000520100000053 *000000530000000054010000005500000055000000005601000000570000005700000000580800 *0000590000005a0000005b0000005c0000005d0000005e0000005f000000600000005900000000 *5a000000005b000000005c000000005d000000005e000000005f00000000600000000061000000 *006200000000630300000064000000650000006600000064000000006500000000660000000067 *00000000680000000069020000006b0000006a0000006a000000006b000000006c000000006d01 *0000006e0000006e000000006f0100000070000000700000000071010000007200000072000000 *007300000000740000000075010000007600000076000000007701000000780000007800000000 *79030000007a0000007b0000007c0000007a000000007b000000007c000000007d010000007e00 *00007e000000007f00000000800200000082000000810000008100000000820000000083000000 *008400000000850000000086000000008700000000880000000089000000008a000000008b0000 *00008c000000008d000000008e000000008f000000009000000000910000000092000000009300 *0000009400000000950000000096000000009700000000980000000099000000009a000000009b *000000009c000000009d000000009e000000009f00000000a000000000a100000000a200000000 *a300000000a400000000a500000000a600000000a700000000a800000000a900000000aa000000 *00000000000e000000000f0000011700000000011800000000011900000000011a00000000011b *00000000011c01030102350000004c0000006f0000006100000064000000200000007300000074 *0000006100000074000000650000002000000066000000720000006f0000006d00000020000000 *6400000069000000730000006b00000020000000610000006e0000006400000020000000720000 *00650000002d00000072000000750000006e00000020000000610000006e000000790000002000 *00006e000000650000006500000064000000650000006400000020000000650000007600000065 *0000006e000000740000007300000020000000740000006f0000000a01023a0000002000000020 *0000002000000066000000750000006c0000006c00000079000000200000007200000065000000 *73000000740000006f000000720000006500000020000000740000006800000065000000200000 *0073000000740000006100000074000000650000002e0000002000000054000000680000006500 *00002000000072000000650000007400000075000000720000006e000000650000006400000020 *00000066000000750000006e0000006300000074000000690000006f0000006e00000020000000 *650000006e00000061000000620000006c00000065000000730000000a02120000002000000020 *000000200000006500000076000000650000006e00000074000000200000006c0000006f000000 *6700000067000000690000006e000000670000002e0000000a000000011d00000000011e000000 *00011f000000000120000000000121000000000122000000000123010302360000004c0000006f *00000061000000640000002000000061000000200000006d000000610000007000000020000000 *66000000720000006f0000006d00000020000000630000006f0000006d000000700000006f0000 *006e000000650000006e0000007400000020000000740000007900000070000000650000007300 *000020000000740000006f0000002000000073000000650000007200000069000000610000006c *000000690000007a00000065000000640000002000000073000000740000006100000074000000 *65000000730000002e0000000a0000000124000000000125010301023300000043000000720000 *006500000061000000740000006500000073000000200000006100000020000000630000006800 *000065000000630000006b000000700000006f000000690000006e000000740000002000000075 *00000073000000690000006e000000670000002000000074000000680000006500000020000000 *70000000720000006f000000760000006900000064000000650000006400000020000000540000 *0078000000430000006f0000006e00000074000000720000006f0000006c0000002e0000000a01 *024d00000020000000540000006800000069000000730000002000000063000000680000006500 *0000630000006b000000700000006f000000690000006e00000074000000200000006d00000061 *000000790000002000000062000000650000002000000075000000730000006500000064000000 *200000006100000073000000200000006100000020000000730000006100000066000000650000 *002000000073000000740000006100000074000000650000002000000077000000690000007400 *00006800000020000000770000006800000069000000630000006800000020000000740000006f *000000200000007300000074000000610000007200000074000000200000007400000068000000 *650000002000000073000000790000007300000074000000650000006d0000002c0000000a0102 *4e00000020000000650000002e000000670000002e000000200000006f0000006e000000650000 *00200000006d00000061000000790000002000000064000000650000006c000000650000007400 *00006500000020000000610000006c0000006c0000002000000074000000680000006500000020 *00000073000000650000007200000069000000610000006c000000690000007a00000065000000 *64000000200000006500000076000000650000006e000000740000007300000020000000740000 *0068000000610000007400000020000000740000006f0000006f0000006b000000200000007000 *00006c000000610000006300000065000000200000006100000066000000740000006500000072 *00000020000000740000006800000065000000200000006c000000610000007300000074000000 *0a01024100000020000000630000006800000065000000630000006b000000700000006f000000 *690000006e0000007400000020000000610000006e000000640000002000000073000000740000 *006100000072000000740000002000000074000000680000006500000020000000610000007000 *0000700000006c00000069000000630000006100000074000000690000006f0000006e00000020 *00000066000000720000006500000073000000680000002000000066000000720000006f000000 *6d0000002000000074000000680000006500000020000000630000006800000065000000630000 *006b000000700000006f000000690000006e000000740000002e0000000a024800000020000000 *43000000610000006c0000006c000000690000006e000000670000002000000074000000680000 *0069000000730000002000000066000000750000006e0000006300000074000000690000006f00 *00006e000000200000006d000000610000006e00000075000000610000006c0000006c00000079 *00000020000000690000007300000020000000740000006800000065000000200000006f000000 *6e0000006c000000790000002000000077000000610000007900000020000000740000006f0000 *002000000063000000720000006500000061000000740000006500000020000000630000006800 *000065000000630000006b000000700000006f000000690000006e00000074000000730000002e *000000200000000a00020000011c00000125000100020000011c00000001250000000000000000 *0f0000000008000001260000000001270000000001280103010231000000470000006900000076 *000000650000006e00000020000000610000002000000053000000610000007600000065000000 *7200000020000000610000006e0000006400000020000000610000002000000050000000720000 *006f00000078000000790000002c00000020000000630000007200000065000000610000007400 *0000650000005400000078000000430000006f0000006e00000074000000720000006f0000006c *0000002000000077000000690000006c0000006c000000200000000a01023b0000002000000069 *0000006e000000690000007400000069000000610000006c000000690000007a00000065000000 *2000000061000000200000005400000078000000430000006f0000006e00000074000000720000 *006f0000006c0000002e0000002000000020000000540000006800000069000000730000002000 *0000640000006f0000006500000073000000200000006e0000006f000000740000002000000061 *000000630000007400000075000000610000006c0000006c000000790000002000000073000000 *74000000610000007200000074000000200000007400000068000000650000000a020f00000020 *000000730000007400000061000000740000006500000020000000730000007900000073000000 *74000000650000006d0000002e0000000a00000001290103022d00000053000000610000007600 *000065000000730000002000000074000000680000006500000020000000730000007400000061 *000000740000006500000020000000610000006e0000006400000020000000630000006c000000 *6f0000007300000065000000730000002000000074000000680000006500000020000000730000 *00650000007200000069000000610000006c000000690000007a00000061000000740000006900 *00006f0000006e0000000a00000000ab0103024b00000052000000750000006e00000020000000 *740000006800000065000000200000004d00000041000000430000004900000044000000200000 *0073000000790000007300000074000000650000006d0000002000000077000000690000007400 *0000680000006f0000007500000074000000200000006d000000750000006c0000007400000069 *0000006d0000006100000073000000740000006500000072000000200000007300000075000000 *70000000700000006f000000720000007400000020000000610000006e00000064000000200000 *007700000069000000740000006800000020000000740000006800000065000000200000006700 *00006900000076000000650000006e000000200000005300000061000000760000006500000072 *0000002e0000000a000000012a0000000000ac0000000000ad0103022000000053000000680000 *0075000000740000007300000020000000640000006f000000770000006e000000200000006100 *0000200000007400000072000000610000006e0000007300000061000000630000007400000069 *0000006f0000006e0000002000000073000000790000007300000074000000650000006d000000 *0a0004000000ab0000012a000000ac000000ad00010004000000ab000000012a00000000ac0000 *0000ad00000000000000000600000000120000012b00000000012c00000000012d00000000012e *00000000012f0000000001300000000001310000000001320000000001330000000000ae010301 *025000000053000000740000006100000072000000740000007300000020000000740000006800 *000065000000200000004d00000041000000430000004900000044000000200000007300000079 *0000007300000074000000650000006d0000002000000077000000690000007400000068000000 *6f0000007500000074000000200000007200000065000000700000006c00000069000000630000 *006100000074000000690000006f0000006e000000200000007300000075000000700000007000 *00006f00000072000000740000002e000000200000002000000055000000730000006500000073 *000000200000007400000068000000650000002000000064000000650000006600000061000000 *750000006c00000074000000200000006200000065000000680000006100000076000000690000 *006f000000720000000a0230000000200000006f00000066000000200000007300000061000000 *76000000690000006e000000670000002000000074000000680000006500000020000000730000 *007400000061000000740000006500000020000000690000006e000000740000006f0000002000 *0000740000006800000065000000200000005f0000006c0000006f00000063000000610000006c *000000200000006400000069000000720000006500000063000000740000006f00000072000000 *790000002e0000000a00000000af0000000000b001030102440000005200000065000000740000 *0075000000720000006e0000007300000020000000740000006800000065000000200000006400 *0000650000006600000061000000750000006c0000007400000020000000530000006100000076 *00000065000000720000002e000000200000002000000049000000740000002000000077000000 *690000006c0000006c000000200000007300000061000000760000006500000020000000740000 *006800000065000000200000006100000070000000700000006c00000069000000630000006100 *000074000000690000006f0000006e000000200000007300000074000000610000007400000065 *00000020000000690000006e000000740000006f0000000a021700000020000000740000006800 *000065000000200000005f0000006c0000006f00000063000000610000006c0000002000000064 *00000069000000720000006500000063000000740000006f00000072000000790000002e000000 *0a00000000b101030102130000005700000061000000690000007400000020000000660000006f *000000720000002000000061000000200000007300000069000000670000006e00000061000000 *6c0000002e0000000a0102420000002000000020000000200000004f0000006e00000020000000 *750000006e00000069000000780000002c00000020000000610000002000000073000000690000 *00670000006e000000610000006c00000020000000690000007300000020000000730000006900 *000067000000490000004e00000054000000200000006f00000072000000200000007300000069 *000000670000005400000045000000520000004d0000002e000000200000004f0000006e000000 *2000000077000000690000006e000000640000006f00000077000000730000002c000000200000 *00740000006800000065000000200000007300000069000000670000006e000000610000006c00 *00000a01020f000000200000002000000020000000690000007300000020000000650000006e00 *0000740000006500000072000000690000006e0000006700000020010201000000650202000000 *2e0000000a00000001340000000001350000000001360000000001370000000000b20000050000 *00ae000000af000000b0000000b1000000b205000000ae000000af000000b2000000b0000000b1 *0005000000ae00000000af00000000b000000000b100000000b200000000000000000200000000 *007200000138000001390000013a0000013b0000013c0000013d0000013e0000013f0000014000 *00014100000142000001430000014400000145000001460000014700000148000001490000014a *0000014b0000014c0000014d0000014e0000014f00000150000001510000015200000153000001 *540000015500000156000001570000000c0000000d0000000e0000000f00000010000000110000 *001200000013000000140000001500000016000000170000001c0000001d0000001e0000001f00 *000020000000210000002200000023000000240000002500000026000000270000002800000029 *0000002a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000 *330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000 *003d0000003e0000003f0000004000000041000000420000004300000044000000450000004600 *00004700000048000000490000004a0000004b0000004c00000158000001590000004f00000050 *0000005100000058000000790000007a0000007b0000007c0000008c0000009800000099000000 *ab000000ac000000ad000000ae000000af000000b0000000b1000000b22d0000000e0000000f00 *00005800000099000000980000000c0000000d0000001100000010000000130000001700000016 *00000015000000140000003c0000003d0000003e0000003f000000400000004100000042000000 *4300000044000000450000003a0000003b00000046000000470000004800000049000000510000 *004f000000500000008c000000790000007a0000007b0000007c0000004a0000004b0000004c00 *0000ab000000ac000000ad000000120000000000000000015a0000000000000007030000001000 *000000000000070100000010000000000000000700000000110000000000000007000000001200 *000000000000070000000013000000000000000700000000140000000000000007030000001500 *000000000000070100000015000000000000000700000000160000000000000007000000001700 *00000000000007000000001800000000000000080300000019000000000000000b030000001a00 *0000000000000b030000001b000000000000000b030000001c000000000000000b030000001d00 *0000000000000b030000001e000000000000000b030000001f000000000000000b000000002000 *000000000000010300000021000000000000000101000000220000000000000001010000002300 *000000000000010100000024000000000000000101000000250000000000000001000000002600 *000000000000010000000027000000000000000100000000280000000000000001000000002900 *00000000000003030000002a0000000000000003030000002b0000000000000003010000002b00 *00000000000003030000002c0000000000000003000000002d0000000000000003030000002e00 *00000000000003030000002f000000000000000300000000300000000000000003000000003100 *000000000000030300000032000000000000000303000000330000000000000003030000003400 *000000000000030100000034000000000000000303000000350000000000000003000000003600 *0000000000000303000000370000000000000003010000001b0000000000000003010000001a00 *000000000000030300000038000000000000000303000000390000000000000003030000003a00 *00000000000003010000003a0000000000000003030000003b0000000000000003010000003b00 *00000000000003000000003c0000000000000003000000003d0000000000000003000000003e00 *00000000000003000000003f000000000000000300000000400000000000000004000000004100 *0000000000000c0300000042000000000000000c0000000043000000000000000c000000004400 *0000000000000c0000000045000000000000000c0000000046000000000000000c000000004700 *0000000000000c0000000048000000000000000c0000000049000000000000000c000000004a00 *0000000000000c000000004b000000000000000c000000004c000000000000000c000000004d00 *0000000000000c000000004e000000000000000c000000004f000000000000000c000000005000 *0000000000000c0000000051000000000000000d0000000052000000000000000d000000005300 *0000000000000d0000000054000000000000000503000000550000000000000005000000005600 *000000000000050000000057000000000000000500000000580000000000000005000000005900 *00000000000005030000005a0000000000000005010000005a0000000000000005030000005b00 *00000000000005010000005b0000000000000005030000005c0000000000000005010000005c00 *00000000000005030000005d0000000000000005010000005d0000000000000005000000005e00 *00000000000005000000005f000000000000000500000000600000000000000005000000006100 *000000000000050000000062000000000000000500000000630000000000000005000000006400 *000000000000050300000065000000000000000503000000660000000000000005030000006700 *000000000000050100000067000000000000000500000000680000000000000005000000006900 *00000000000005030000006a0000000000000005030000006b0000000000000005030000006c00 *00000000000005010000006d0000000000000005010000006e0000000000000005030000006f00 *000000000000050300000070000000000000000501000000700000000000000005030000007100 *000000000000050100000071000000000000000503000000720000000000000005010000007200 *000000000000050300000073000000000000000503000000740000000000000005030000007500 *000000000000050100000075000000000000000503000000760000000000000005010000007600 *000000000000050300000077000000000000000501000000770000000000000005000000007800 *0000000000000500000000790000000000000005030000007a0000000000000005010000007a00 *00000000000005030000007b0000000000000005030000007c0000000000000005010000007d00 *00000000000005010000007e0000000000000005030000007f0000000000000005000000008000 *000000000000050000000081000000000000000500000000820000000000000005000000008300 *000000000000050000000084000000000000000500000000850000000000000005000000008600 *000000000000050000000087000000000000000500000000880000000000000005000000008900 *00000000000005000000008a0000000000000005000000008b0000000000000005000000008c00 *00000000000005000000008d0000000000000005000000008e0000000000000005000000008f00 *000000000000050000000090000000000000000500000000910000000000000005000000009200 *00000000000005000000004b000000000000000500000000930000000000000005000000009400 *000000000000050000000095000000000000000500000000960000000000000005000000009700 *000000000000050000000098000000000000000500000000990000000000000005000000009a00 *00000000000005000000009b0000000000000005000000009c0000000000000005000000009d00 *00000000000005000000009e0000000000000005000000009f000000000000000500000000a000 *0000000000000500000000a1000000000000000500000000a2000000000000000500000000a300 *0000000000000500000000a4000000000000000500000000a5000000000000000f00000000a600 *0000000000000f00000000a7000000000000000f00000000a8000000000000000600000000a900 *0000000000000600000000aa000000000000000600000000ab000000000000000600000000ac00 *0000000000000600000000ad000000000000000800000000ae000000000000000800000000af00 *0000000000000800000000b0000000000000000800000000b1000000000000000800000000b200 *0000000000000800000000b3000000000000000800000000b4000000000000000800000000b500 *0000000000000800000000b6000000000000000800000000b7000000000000000800000000b800 *0000000000000800000000b9000000000000000903000000ba000000000000000900000000bb00 *0000000000000900000000bc000000000000000900000000bd000000000000000900000000b400 *0000000000000900000000be000000000000000900000000bf000000000000000a03000000c000 *0000000000000a01000000c0000000000000000a03000000c1000000000000000a01000000c100 *0000000000000a03000000c2000000000000000a01000000c3000000000000000a01000000c400 *0000000000000a00000000c5000000000000000a00000000c6000000000000000a00000000c700 *0000000000000a00000000c8000000000000000a00000000c9000000000000000b03000000ca00 *0000000000000b01000000ca000000000000000b00000000cb000000000000000b03000000cc00 *0000000000000b01000000cc000000000000000b00000000cd000000000000000b010000001c00 *0000000000000b00000000ce000000000000000b03000000cf000000000000000b01000000cf00 *0000000000000b00000000d0000000000000000b00000000d1000000000000000b00000000d200 *0000000000000b00000000d3000000000000000b03000000d4000000000000000b01000000d400 *0000000000000b00000000d5000000000000000b00000000d6000000000000000b00000000d700 *0000000000000b00000000d8000000000000000b00000000d9000000000000000403000000da00 *000000000000040100000037000000000000000400000000db000000000000000400000000dc00 *0000000000000400000000dd000000000000000400000000de000000000000000400000000df00 *0000000000000400000000e0000000000000000400000000e1000000000000000403000000e200 *0000000000000403000000e3000000000000000400000000e4000000000000000400000000e500 *0000000000000400000000e6000000000000000400000000e7000000000000000400000000e800 *0000000000000400000000e9000000000000000400000000ea000000000000000400000000eb00 *0000000000000400000000ec000000000000000400000000ed000000000000000400000000ee00 *0000000000000400000000ef000000000000000400000000f0000000000000000400000000f100 *0000000000000400000000f2000000000000000400000000f3000000000000000400000000f400 *0000000000000400000000f5000000000000000400000000f6000000000000000400000000f700 *0000000000000400000000f8000000000000000400000000f9000000000000000400000000fa00 *0000000000000400000000fb000000000000000400000000fc000000000000000400000000fd00 *0000000000000400000000fe000000000000000400000000ff0000010000000101000000010200 *00010000000103000000010400000100000001030000000105000000000000000d000000010600 *0000000000000d0000000107000000000000000d0000000108000000000000000d000000010900 *0000000000000d000000010a000000000000000d000000010b000000000000000e030000010c00 *0000000000000e010000010c000000000000000e000000010d000000000000000e000000010e00 *0000000000000e000000010f000000000000000e0000000110000000000000000e000000011100 *0000000000000e0000000112000000000000000e0000000113000000000000000e000000011400 *0000000000000e0000000115000000000000000e0000000116000000000000000e000000011700 *0000000000000e0000000118000000000000000e00000000a7000000000000000f030000011900 *0000000000000f000000011a000000000000000f000000011b000000000000000f000000011c00 *0000000000000f000000011d0000000000000006030000011e0000000000000006010000011f00 *000000000000060100000120000000000000000603000001210000000000000006010000012200 *000000000000060100000123000000000000000601000001240000000000000006030000012500 *000000000000060300000119000000000000000600000001260000000000000006000000012700 *000000000000060000000128000000000000000600000001290000012a0000012b030000012c00 *00012a0000012d030000012e0000012a0000012f03000001300000012a0000012b030000013100 *00012a0000012b03000001320000012a0000012b03000001330000012a0000012b030000013400 *00012a0000012b01000001350000012a0000012b01000001360000012a0000012b000000013700 *00012a0000012b00000001380000012a0000012b00000001390000012a0000012b000000013a00 *00012a0000012b000000013b0000012a0000012b000000013c0000012a0000012b000000013d00 *00012a0000012b000000013e0000012a0000012b000000013f0000012a0000012b000000014000 *00012a0000012b00000001410000012a0000012b00000001420000012a0000012b000000014300 *00012a0000012b00000001440000012a0000012b00000001450000012a0000012b000000014600 *00012a0000012d00000001470000012a0000012f01000001300000012a0000012f000000014800 *00012a0000012f00000001490000012a0000012f000000014a0000012a0000012f000000014b00 *00012a0000012f000000014c0000012a0000014d000000014e0000012a0000014d000000014f00 *00000000000150000000000000001568617070737461636b2d73746174652d302e352e30000000 *000000001548617070737461636b2e53746174652e5361766572000000000000000f4861707073 *7461636b2e5374617465000000000000001f48617070737461636b2e53746174652e436f6d706f *6e656e7453797374656d000000000000001b48617070737461636b2e53746174652e436f6d706f *6e656e745448000000000000001b48617070737461636b2e53746174652e5472616e7361637469 *6f6e000000000000001748617070737461636b2e53746174652e436f6e74726f6c000000000000 *001b48617070737461636b2e53746174652e53617665722e5479706573000000000000001f4861 *7070737461636b2e53746174652e53617665722e496d706c2e46696c6500000000000000214861 *7070737461636b2e53746174652e53617665722e496d706c2e4d656d6f72790000000000000020 *48617070737461636b2e53746174652e53617665722e496d706c2e517565756500000000000000 *1548617070737461636b2e53746174652e5479706573000000000000001548617070737461636b *2e53746174652e4d6f6e6164000000000000001448617070737461636b2e53746174652e557469 *6c000000000000001a48617070737461636b2e53746174652e436865636b706f696e7400000000 *0000001948617070737461636b2e53746174652e5478436f6e74726f6c000000000000000c5772 *6974657253747265616d000000000000000b777269746572436c6f736500000000000000097772 *69746572416464000000000000001377726974657241746f6d69635265706c6163650000000000 *000009777269746572437574000000000000000c52656164657253747265616d00000000000000 *0b726561646572436c6f73650000000000000009726561646572476574000000000000000e7265 *61646572476574556e637574000000000000000a5072656669784c6f636b000000000000000655 *706461746500000000000000055175657279000000000000000245760000000000000005416e79 *4576000000000000000a45706f63684d696c6c6900000000000000045478496400000000000000 *0c756e73616665494f546f45760000000000000005536176657200000000000000064d656d6f72 *7900000000000000055175657565000000000000000946696c6553617665720000000000000009 *4e756c6c5361766572000000000000000c637265617465526561646572000000000000000c6372 *65617465577269746572000000000000000a6f627461696e4c6f636b000000000000000b72656c *656173654c6f636b0000000000000007436f6c6c656374000000000000000a436f6c6c65637469 *6f6e000000000000000b53756248616e646c657273000000000000000b73756248616e646c6572 *730000000000000009436f6d706f6e656e74000000000000000c446570656e64656e6369657300 *0000000000000c696e697469616c56616c756500000000000000066f6e4c6f6164000000000000 *0011436f6d706f6e656e7456657273696f6e73000000000000000d436f6d706f6e656e74547265 *6500000000000000094d6574686f644d617000000000000000074d6574686f6473000000000000 *00076d6574686f647300000000000000064d6574686f64000000000000000a5175657279457665 *6e74000000000000000b5570646174654576656e7400000000000000033a2b3a00000000000000 *03456e64000000000000000a6d6574686f645479706500000000000000076164644974656d0000 *00000000000f636f6c6c65637448616e646c6572730000000000000010636f6c6c65637448616e *646c65727327000000000000000364757000000000000000096d6b4d6574686f64730000000000 *00000743617463684576000000000000000763617463684576000000000000000d736574557064 *61746554797065000000000000000b70726f7879557064617465000000000000000c7365745175 *65727954797065000000000000000a70726f787951756572790000000000000008617355706461 *7465000000000000000761735175657279000000000000000861736b5374617465000000000000 *000867657453746174650000000000000008707574537461746500000000000000076c69667453 *544d000000000000000373656c000000000000000a6c6f63616c53746174650000000000000010 *6c6f63616c5374617465526561646572000000000000000872756e517565727900000000000000 *0967657452616e646f6d000000000000000a67657452616e646f6d520000000000000013696e66 *65725265636f72645570646174657273000000000000000a457863657074696f6e540000000000 *0000056c6f674d54000000000000000767657454696d6500000000000000116765744576656e74 *436c6f636b54696d65000000000000000a6765744576656e744964000000000000001247657443 *6865636b706f696e7453746174650000000000000012536574436865636b706f696e7453746174 *65000000000000000d4576656e744c6f67456e74727900000000000000095478436f6e74726f6c *000000000000000863746c5361766572000000000000000d63746c4576656e7453617665720000 *00000000001063746c416c6c436f6d706f6e656e7473000000000000001463746c436f6d706f6e *656e7456657273696f6e73000000000000000b63746c4368696c6472656e000000000000000d63 *746c5072656669784c6f636b000000000000001363746c437265617465436865636b706f696e74 *000000000000000945764c6f6164657273000000000000000a45764c6f61646572732700000000 *00000005547852756e000000000000000e747850726f636573735175657565000000000000000f *74784c6173745478436f6e74657874000000000000000c50726f63657373517565756500000000 *0000000a4576656e745175657565000000000000000352657300000000000000054572726f7200 *000000000000024f6b000000000000000a52756e48616e646c6572000000000000000248520000 *00000000000349485200000000000000054576656e740000000000000002454800000000000000 *0652756e6e657200000000000000084765745374617465000000000000000b5365744e65775374 *61746500000000000000094576656e744974656d000000000000000c6576656e74436f6e746578 *7400000000000000096576656e7444617461000000000000000c456d6974496e7465726e616c00 *000000000000084576656e744d6170000000000000000c4576656e7448616e646c657200000000 *0000000c517565727948616e646c6572000000000000000d55706461746548616e646c65720000 *00000000000a54797065537472696e670000000000000007656d69745265660000000000000008 *656d697446756e63000000000000000a656d69744576656e74270000000000000009656d697445 *76656e74000000000000000e7365744e65774576656e744d6170000000000000000e6576656e74 *53747265616d526566000000000000000f696e69744576656e7453747265616d00000000000000 *0d707573684576656e744974656d000000000000000e6765744576656e7453747265616d000000 *000000000e6372656174654576656e744d6170000000000000000b65787472614576656e747300 *0000000000000d616c6c537461746554797065730000000000000011636f6d706f6e656e745665 *7273696f6e73000000000000000b636f6d706f6e656e74494f000000000000000e637265617465 *4e6577547852756e000000000000000f7365744e6577537461746554797065000000000000000c *676574537461746554797065000000000000000b7365744e65775374617465000000000000000c *7365744e6577537461746527000000000000000675706461746500000000000000057175657279 *000000000000000b717569636b517565727927000000000000001173657445764c6f6164657273 *5175657565000000000000000e72756e4f626a6563744576656e74000000000000001272756e4f *626a6563744576656e7446756e63000000000000000c72756e436f6c644576656e740000000000 *00001072756e436f6c644576656e7446756e6300000000000000126c6f6f6b75704576656e7448 *616e646c6572000000000000000c6576656e7454537472696e67000000000000000b68616e646c *654576656e74000000000000000b68616e646c655175657279000000000000000c68616e646c65 *5570646174650000000000000009636865636b44696666000000000000000d67657445706f6368 *4d696c6c69000000000000000c6e65775478436f6e746578740000000000000007616464547849 *64000000000000000f676c6f62616c52616e646f6d47656e000000000000000972756e54784c6f *6f70000000000000000b72756e547853797374656d000000000000001063726561746543686563 *6b706f696e74000000000000000e73687574646f776e53797374656d0000000000000010737461 *727453797374656d53746174650000000000000016737461727453797374656d5374617465416d *617a6f6e00000000000000087374645361766572000000000000001277616974466f725465726d *696e6174696f6e000000000000001370726f636573734c6f6767696e67466c6167730000000000 *00000474727945000000000000000663617463684500000000000000076361746368494f000000 *00000000056c6f674d46000000000000000e666f726d617446696c655061746800000000000000 *0a66696c6552656164657200000000000000087061727365416c6c000000000000000a66696c65 *577269746572000000000000000b676574416c6c46696c6573000000000000000f61746f6d6963 *577269746546696c6500000000000000106f627461696e5072656669784c6f636b000000000000 *001172656c656173655072656669784c6f636b000000000000000553746f726500000000000000 *0e6e65774d656d6f727953746f7265000000000000000c6d656d6f727952656164657200000000 *0000000c6d656d6f7279577269746572000000000000000a616464546f53746f72650000000000 *00000873657453746f7265000000000000000243680000000000000007456e636f646564000000 *00000000044974656d00000000000000034164640000000000000005436c6f7365000000000000 *000b7175657565526561646572000000000000000b717565756557726974657200000000000000 *056e65774368000000000000000777726974654368000000000000000667657443687300000000 *000000085573696e67586d6c0000000000000005756e586d6c0000000000000006536861646f77 *0000000000000008756e536861646f770000000000000004756e45760000000000000009547843 *6f6e746578740000000000000004747849640000000000000006747852616e6400000000000000 *06747854696d650000000000000008747853746447656e0000000000000003456e760000000000 *000009657652616e646f6d7300000000000000096576436f6e74657874000000000000000f696e *74656772616c52616e646f6d52000000000000000d756e7361666553544d546f45760000000000 *00000d756e73616665494f546f53544d000000000000000a4d6574686f64496e666f0000000000 *00000a6d6574686f644e616d65000000000000000a6d6574686f644b657973000000000000000d *6d6574686f64436f6e74657874000000000000000a6d6574686f6441726773000000000000000b *6d6574686f64436c61737300000000000000086d6574686f644576000000000000000c6d657468 *6f64526573756c740000000000000007437478456c656d0000000000000008437478456c656d51 *00000000000000066e756243787400000000000000106d6b4b6579436f6e73747261696e747300 *000000000000136d6b4d6574686f64436f6e73747261696e747300000000000000127375627374 *4d6574686f64436f6e7465787400000000000000066d6b54797065000000000000001567656e53 *657269616c697a65496e7374616e636573000000000000001467656e436f6d706f6e656e744861 *6e646c657273000000000000001167656e4576656e74496e7374616e6365730000000000000010 *67656e4576656e74496e7374616e636500000000000000066d6b43747874000000000000001067 *656e4d6574686f6453747275637473000000000000000f67656e4d6574686f6453747275637400 *0000000000000975707065724e616d65000000000000000a757070657246697273740000000000 *00000e6765744d6574686f64496e666f73000000000000000d6765744d6574686f64496e666f00 *0000000000000873686f77496e666f000000000000000867657454797065730000000000000009 *676574547970657327000000000000000c67657453746174654b657973000000000000000b6765 *74507265644b657973000000000000000c69734d6f6e61645374617465000000000000000d6973 *4d6f6e6164526561646572000000000000000869734d6f6e616458000000000000000a69735265 *6c6576616e740000000000000013697341636365707461626c65436f6e74657874000000000000 *00107265717569726553696d706c65436f6e0000000000000004636f6e76000000000000000b6d *746c2d312e312e302e32000000000000001a436f6e74726f6c2e4d6f6e61642e5265616465722e *436c617373000000000000000361736b0000000000000019436f6e74726f6c2e4d6f6e61642e53 *746174652e436c6173730000000000000003676574000000000000000370757400000000000000 *11646563546f53696d706c655265636f726400000000000000096e616d65546f44656300000000 *0000000773656c46756e73000000000000000775706446756e73000000000000000a6669656c64 *4e616d657300000000000000047364656600000000000000055374617465000000000000000c73 *7461746556657273696f6e000000000000000b73746174654375746f666600000000000000056c *6f674d43000000000000000c726573746f7265537461746500000000000000096c6f6164537461 *7465000000000000000a6c6f61644576656e7473000000000000000a7769746852656164657200 *0000000000000a7769746857726974657200000000000000097265616453746174650000000000 *00000a77726974655374617465000000000000000f6c6f6164436865636b706f696e7473000000 *000000000f73617665436865636b706f696e7473000000000000000f4170706c69636174696f6e *4e616d6500000000000000056c6f674d4d000000000000000f6372656174655478436f6e74726f *6c000000000000000e636c6f73655478436f6e74726f6c000000000000001172756e5478537973 *74656d416d617a6f6e0000000000000004466c616700000000000000094c6f6754617267657400 *000000000000084c6f674c6576656c000000000000000654617267657400000000000000065379 *734c6f6700000000000000065374644f7574000000000000000446696c65000000000000000a4e *756c6c4c6f6767657200000000000000127365744c6f6767696e6753657474696e677300000000 *000000076f7074696f6e73000000000000000a72656164546172676574000000000000000b6361 *73744f7074696f6e73000000000000001468617070737461636b2d646174612d302e352e300000 *00000000001848617070737461636b2e446174612e53657269616c697a65000000000000000943 *6f6e7461696e6564000000000000001648617070737461636b2e446174612e4d69677261746500 *000000000000074d696772617465000000000000001448617070737461636b2e446174612e5072 *6f7879000000000000000550726f787900000000000000064f626a656374000000000000000953 *657269616c697a6500000000000000044d6f6465000000000000000756657273696f6e00000000 *000000095072696d6974697665000000000000000956657273696f6e6564000000000000000767 *6574436f70790000000000000007707574436f707900000000000000046d6f6465000000000000 *000f636f6c6c65637456657273696f6e730000000000000007636f6e7461696e00000000000000 *0b646573657269616c697a650000000000000011646573657269616c697a654f626a6563740000 *000000000009657874656e73696f6e000000000000000a67657453616665476574000000000000 *000a6765745361666550757400000000000000086d6b4f626a656374000000000000000a6f626a *65637454797065000000000000000b70617273654f626a65637400000000000000077361666547 *6574000000000000000773616665507574000000000000000973657269616c697a650000000000 *0000076d696772617465000000000000000b617350726f787954797065000000000000000c636f *6e7374725b616e46575d000000000000000e64617461547970655b616e46565d00000000000000 *0570726f78790000000000000007756e50726f7879000000000000001a48617070737461636b2e *446174612e53657269616c697a655448000000000000000f64657269766553657269616c697a65 *000000000000001264657269766553657269616c697a65466f72 addfile ./docs/0.5.0/happstack-state/Happstack-State-ComponentSystem.html hunk ./docs/0.5.0/happstack-state/Happstack-State-ComponentSystem.html 1 + + +Happstack.State.ComponentSystem
     happstack-state-0.5.0: Event-based distributed state.Source codeContentsIndex
    Happstack.State.ComponentSystem
    Synopsis
    data End = End
    data h :+: t = h :+: t
    class (Serialize ev, Serialize res) => UpdateEvent ev res | ev -> res
    class (Serialize ev, Serialize res) => QueryEvent ev res | ev -> res
    data Method st where
    Update :: UpdateEvent ev res => (ev -> Update st res) -> Method st
    Query :: QueryEvent ev res => (ev -> Query st res) -> Method st
    methodType :: Method t -> String
    class Methods a where
    methods :: Proxy a -> [Method a]
    data MethodMap where
    MethodMap :: Component st => Map String (Method st) -> MethodMap
    type ComponentTree = Map String MethodMap
    type ComponentVersions = Map String [ByteString]
    class (SubHandlers (Dependencies a), Serialize a) => Component a where
    type Dependencies a
    initialValue :: a
    onLoad :: Proxy a -> IO ()
    class SubHandlers a where
    subHandlers :: a -> Collect ()
    data Collection = Collection ComponentTree ComponentVersions [IO ()]
    addItem :: MonadState Collection m => String -> MethodMap -> [ByteString] -> IO () -> m ()
    type Collect = State Collection
    collectHandlers :: (Methods a, Component a) => Proxy a -> (ComponentTree, ComponentVersions, [IO ()])
    collectHandlers' :: (Methods a, Component a) => Proxy a -> Collect ()
    dup :: String -> b
    Documentation
    data End Source
    Equivalent of [] for type level lists. Used for Components that have no + dependencies +
    Constructors
    End
    data h :+: t Source
    Type level Cons for enumerating type dependencies of a Component +
    Constructors
    h :+: t
    class (Serialize ev, Serialize res) => UpdateEvent ev res | ev -> resSource
    class (Serialize ev, Serialize res) => QueryEvent ev res | ev -> resSource
    data Method st whereSource
    Method is the actual type that all Updates and Querys eventually + get lifted into via mkMethods. +
    Constructors
    Update :: UpdateEvent ev res => (ev -> Update st res) -> Method st
    Query :: QueryEvent ev res => (ev -> Query st res) -> Method st
    methodType :: Method t -> StringSource
    Displays the type of a Method +
    class Methods a whereSource
    Class for enumerating the set of defined methods by the type of the state. + Instances should not be defined directly, but using mkMethods +
    Methods
    methods :: Proxy a -> [Method a]Source
    data MethodMap whereSource
    Constructors
    MethodMap :: Component st => Map String (Method st) -> MethodMap
    type ComponentTree = Map String MethodMapSource
    State type -> method map +
    type ComponentVersions = Map String [ByteString]Source
    State type -> all versions +
    class (SubHandlers (Dependencies a), Serialize a) => Component a whereSource
    In order to be used as a part of Happstack's MACID state, a data type + needs to be an instance of Component. The minimal definition is + an initialValue and the type corresponding to the set of Dependencies. + Note that the SubHandlers condition will be automatically met if the + Dependencies is built from End and ':+:' with other instances of + Component and Methods +
    Associated Types
    type Dependencies a Source
    Methods
    initialValue :: aSource
    onLoad :: Proxy a -> IO ()Source
    class SubHandlers a whereSource
    SubHandlers is used to build up the set of components corresponding to + the instance type. +
    Methods
    subHandlers :: a -> Collect ()Source
    data Collection Source
    Constructors
    Collection ComponentTree ComponentVersions [IO ()]
    addItem :: MonadState Collection m => String -> MethodMap -> [ByteString] -> IO () -> m ()Source
    type Collect = State CollectionSource
    collectHandlers :: (Methods a, Component a) => Proxy a -> (ComponentTree, ComponentVersions, [IO ()])Source
    collectHandlers' :: (Methods a, Component a) => Proxy a -> Collect ()Source
    dup :: String -> bSource
    An error is thrown when this is evaluated. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-state/Happstack-State-ComponentTH.html hunk ./docs/0.5.0/happstack-state/Happstack-State-ComponentTH.html 1 + + +Happstack.State.ComponentTH
     happstack-state-0.5.0: Event-based distributed state.Source codeContentsIndex
    Happstack.State.ComponentTH
    Synopsis
    mkMethods :: Name -> [Name] -> Q [Dec]
    Documentation
    mkMethods :: Name -> [Name] -> Q [Dec]Source
    This function will derive, for the provided type name and the provided + list of methods, an instance of Methods for the given type and necessary + instance of UpdateEvent and QueryEvent to make the provided list of functions + into Methods. + This TH splice needs to be executed for any MACID state type in order to + have the necessary code for event handling generated. + Ex: $(mkMethods ''Foo ['fooUpdate,fooQuery]) +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-state/Happstack-State-Control.html hunk ./docs/0.5.0/happstack-state/Happstack-State-Control.html 1 + + +Happstack.State.Control
     happstack-state-0.5.0: Event-based distributed state.Source codeContentsIndex
    Happstack.State.Control
    Synopsis
    startSystemState :: (Methods a, Component a) => Proxy a -> IO (MVar TxControl)
    startSystemStateAmazon :: (Methods a, Component a) => ApplicationName -> Proxy a -> IO (MVar TxControl)
    processLoggingFlags :: IO a -> IO a
    stdSaver :: IO Saver
    waitForTermination :: IO ()
    Documentation
    startSystemState :: (Methods a, Component a) => Proxy a -> IO (MVar TxControl)Source
    Starts the MACID system without replication support. Uses the default behavior + of saving the state into the _local directory. +
    startSystemStateAmazon :: (Methods a, Component a) => ApplicationName -> Proxy a -> IO (MVar TxControl)Source
    processLoggingFlags :: IO a -> IO aSource
    stdSaver :: IO SaverSource
    Returns the default Saver. It will save the application state into + the _local directory. +
    waitForTermination :: IO ()Source
    Wait for a signal. + On unix, a signal is sigINT or sigTERM. On windows, the signal + is entering e. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-state/Happstack-State-Saver.html hunk ./docs/0.5.0/happstack-state/Happstack-State-Saver.html 1 + + +Happstack.State.Saver
     happstack-state-0.5.0: Event-based distributed state.Source codeContentsIndex
    Happstack.State.Saver
    Synopsis
    data ReaderStream a = ReaderStream {
    readerClose :: IO ()
    readerGet :: IO ([a], Int)
    readerGetUncut :: IO [a]
    }
    data WriterStream a = WriterStream {
    writerClose :: IO ()
    writerAdd :: a -> IO () -> IO ()
    writerAtomicReplace :: a -> IO ()
    writerCut :: IO Int
    }
    type PrefixLock = (FilePath, Handle)
    data Saver
    = NullSaver
    | FileSaver String
    | Queue Saver
    | Memory (MVar Store)
    createReader :: Serialize a => Saver -> String -> Int -> IO (ReaderStream a)
    createWriter :: Serialize a => Saver -> String -> Int -> IO (WriterStream a)
    obtainLock :: Saver -> IO (Maybe PrefixLock)
    releaseLock :: Maybe PrefixLock -> IO ()
    Documentation
    data ReaderStream a Source
    Constructors
    ReaderStream
    readerClose :: IO ()
    readerGet :: IO ([a], Int)
    readerGetUncut :: IO [a]
    data WriterStream a Source
    Constructors
    WriterStream
    writerClose :: IO ()
    writerAdd :: a -> IO () -> IO ()
    writerAtomicReplace :: a -> IO ()
    writerCut :: IO Int
    type PrefixLock = (FilePath, Handle)Source
    data Saver Source
    Constructors
    NullSaverA saver that discards all output +
    FileSaver StringA saver that operates on files. The parameter is the prefix for the files. +
    Queue SaverEnable queueing. +
    Memory (MVar Store)
    createReader :: Serialize a => Saver -> String -> Int -> IO (ReaderStream a)Source
    Dispatches over the Saver type provided to return a ReaderStream for the inferred + type. +
    createWriter :: Serialize a => Saver -> String -> Int -> IO (WriterStream a)Source
    Dispatches over the Saver type provided to return a WriterStream for the + inferred type. +
    obtainLock :: Saver -> IO (Maybe PrefixLock)Source
    releaseLock :: Maybe PrefixLock -> IO ()Source
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-state/Happstack-State-Transaction.html hunk ./docs/0.5.0/happstack-state/Happstack-State-Transaction.html 1 + + +Happstack.State.Transaction
     happstack-state-0.5.0: Event-based distributed state.Source codeContentsIndex
    Happstack.State.Transaction
    Synopsis
    type ExceptionT = SomeException
    logMT :: Priority -> String -> IO ()
    getTime :: Integral epochTime => AnyEv epochTime
    getEventClockTime :: AnyEv ClockTime
    getEventId :: Integral txId => AnyEv txId
    data GetCheckpointState = GetCheckpointState
    newtype SetCheckpointState = SetCheckpointState ByteString
    type TypeString = String
    data EventHandler where
    UpdateHandler :: UpdateEvent ev res => (TxContext -> ev -> IO res) -> (ev -> IO res) -> (Object -> ev) -> EventHandler
    QueryHandler :: QueryEvent ev res => (ev -> IO res) -> (Object -> ev) -> EventHandler
    type EventMap = Map TypeString EventHandler
    data EmitInternal = EmitInternal EventMap
    emitRef :: IORef EmitInternal
    emitFunc :: (Serialize ev, Typeable res) => EventMap -> TypeString -> ev -> IO res
    emitEvent' :: (Serialize ev, Typeable res) => TypeString -> ev -> IO res
    emitEvent :: (Serialize ev, Typeable res) => ev -> IO res
    setNewEventMap :: EventMap -> IO ()
    data EventItem = EventItem {
    eventContext :: TxContext
    eventData :: Dynamic
    }
    eventStreamRef :: MVar (Chan EventItem)
    initEventStream :: IO ()
    pushEventItem :: Serialize ev => TxContext -> ev -> IO ()
    getEventStream :: IO (IO EventItem)
    createEventMap :: (Methods st, Component st) => MVar TxControl -> Proxy st -> IO EventMap
    extraEvents :: Serialize st => TxRun st -> EventMap
    allStateTypes :: (Methods a, Component a) => Proxy a -> [TypeString]
    componentVersions :: (Methods a, Component a) => Proxy a -> Map String [ByteString]
    componentIO :: (Methods a, Component a) => Proxy a -> [IO ()]
    createNewTxRun :: IO (TxRun st)
    setNewStateType :: String -> String
    getStateType :: String -> String
    setNewState :: TypeString -> ByteString -> IO ()
    setNewState' :: EventMap -> TypeString -> ByteString -> IO ()
    getState :: TypeString -> IO ByteString
    data SetNewState st = SetNewState ByteString
    data GetState st = GetState
    update :: (MonadIO m, UpdateEvent ev res) => ev -> m res
    query :: (MonadIO m, QueryEvent ev res) => ev -> m res
    quickQuery' :: Serialize st => TxRun st -> HR st -> IO ()
    type Runner ev res = IO (IO ev, res -> IO ())
    type EH i o = i -> IO o
    data Event = forall ev . Serialize ev => Event ev
    data IHR st = forall ev . Serialize ev => IHR TxContext ev (RunHandler st ev)
    data HR st = forall ev . Serialize ev => HR ev (RunHandler st ev)
    type RunHandler st ev = TxContext -> st -> IO (Maybe st, IO ())
    data Res a
    = Ok a
    | Error ExceptionT
    type EventQueue st = TChan (HR st)
    type ProcessQueue st = TChan (IHR st)
    data TxRun st = TxRun {
    txProcessQueue :: !(ProcessQueue st)
    txLastTxContext :: !(TVar TxContext)
    }
    type EvLoaders' st = Map String (ProcessQueue st -> ByteString -> IO (TxId, ByteString))
    type EvLoaders = Map String (ByteString -> IO (TxId, ByteString))
    setEvLoadersQueue :: ProcessQueue st -> EvLoaders' st -> EvLoaders
    runObjectEvent :: Object -> IO Object
    runObjectEventFunc :: Object -> EventMap -> IO Object
    runColdEvent :: TxContext -> Object -> IO Object
    runColdEventFunc :: TxContext -> Object -> EventMap -> IO Object
    lookupEventHandler :: TypeString -> EventMap -> IO EventHandler
    eventTString :: Serialize ev => ev -> TypeString
    handleEvent :: (st -> Env -> Ev m res -> STM intermediate) -> (st -> intermediate -> IO (Maybe st, res)) -> (Either ExceptionT res -> IO ()) -> Ev m res -> RunHandler st ev
    handleQuery :: (Either ExceptionT res -> IO ()) -> Query st res -> RunHandler st ev
    handleUpdate :: (Either ExceptionT res -> IO ()) -> Update st res -> RunHandler st ev
    checkDiff :: a -> a -> IO (Maybe a)
    getEpochMilli :: IO EpochMilli
    newTxContext :: IO TxContext
    addTxId :: TxRun st -> TxContext -> STM TxContext
    globalRandomGen :: MVar StdGen
    data TxControl = TxControl {
    ctlSaver :: Saver
    ctlEventSaver :: MVar (WriterStream EventLogEntry)
    ctlAllComponents :: [String]
    ctlComponentVersions :: Map String [ByteString]
    ctlChildren :: [(ThreadId, MVar ())]
    ctlPrefixLock :: Maybe PrefixLock
    ctlCreateCheckpoint :: IO ()
    }
    data EventLogEntry = EventLogEntry TxContext Object
    runTxLoop :: MVar (WriterStream EventLogEntry) -> ProcessQueue st -> st -> IO ()
    Documentation
    type ExceptionT = SomeExceptionSource
    logMT :: Priority -> String -> IO ()Source
    getTime :: Integral epochTime => AnyEv epochTimeSource
    getEventClockTime :: AnyEv ClockTimeSource
    getEventId :: Integral txId => AnyEv txIdSource
    data GetCheckpointState Source
    Constructors
    GetCheckpointState
    newtype SetCheckpointState Source
    Constructors
    SetCheckpointState ByteString
    type TypeString = StringSource
    data EventHandler whereSource
    Constructors
    UpdateHandler :: UpdateEvent ev res => (TxContext -> ev -> IO res) -> (ev -> IO res) -> (Object -> ev) -> EventHandler
    QueryHandler :: QueryEvent ev res => (ev -> IO res) -> (Object -> ev) -> EventHandler
    type EventMap = Map TypeString EventHandlerSource
    data EmitInternal Source
    Constructors
    EmitInternal EventMap
    emitRef :: IORef EmitInternalSource
    emitFunc :: (Serialize ev, Typeable res) => EventMap -> TypeString -> ev -> IO resSource
    emitEvent' :: (Serialize ev, Typeable res) => TypeString -> ev -> IO resSource
    emitEvent :: (Serialize ev, Typeable res) => ev -> IO resSource
    setNewEventMap :: EventMap -> IO ()Source
    data EventItem Source
    Constructors
    EventItem
    eventContext :: TxContext
    eventData :: Dynamic
    eventStreamRef :: MVar (Chan EventItem)Source
    initEventStream :: IO ()Source
    pushEventItem :: Serialize ev => TxContext -> ev -> IO ()Source
    getEventStream :: IO (IO EventItem)Source
    createEventMap :: (Methods st, Component st) => MVar TxControl -> Proxy st -> IO EventMapSource
    extraEvents :: Serialize st => TxRun st -> EventMapSource
    allStateTypes :: (Methods a, Component a) => Proxy a -> [TypeString]Source
    componentVersions :: (Methods a, Component a) => Proxy a -> Map String [ByteString]Source
    componentIO :: (Methods a, Component a) => Proxy a -> [IO ()]Source
    createNewTxRun :: IO (TxRun st)Source
    setNewStateType :: String -> StringSource
    getStateType :: String -> StringSource
    setNewState :: TypeString -> ByteString -> IO ()Source
    setNewState' :: EventMap -> TypeString -> ByteString -> IO ()Source
    getState :: TypeString -> IO ByteStringSource
    data SetNewState st Source
    Constructors
    SetNewState ByteString
    data GetState st Source
    Constructors
    GetState
    update :: (MonadIO m, UpdateEvent ev res) => ev -> m resSource
    Schedule an update and wait for it to complete. When this function returns, you're + guaranteed the update will be persistent. +
    query :: (MonadIO m, QueryEvent ev res) => ev -> m resSource
    Emit a state query and wait for the result. +
    quickQuery' :: Serialize st => TxRun st -> HR st -> IO ()Source
    type Runner ev res = IO (IO ev, res -> IO ())Source
    type EH i o = i -> IO oSource
    data Event Source
    Constructors
    forall ev . Serialize ev => Event ev
    data IHR st Source
    Constructors
    forall ev . Serialize ev => IHR TxContext ev (RunHandler st ev)
    data HR st Source
    Constructors
    forall ev . Serialize ev => HR ev (RunHandler st ev)
    type RunHandler st ev = TxContext -> st -> IO (Maybe st, IO ())Source
    data Res a Source
    Constructors
    Ok a
    Error ExceptionT
    type EventQueue st = TChan (HR st)Source
    type ProcessQueue st = TChan (IHR st)Source
    data TxRun st Source
    Constructors
    TxRun
    txProcessQueue :: !(ProcessQueue st)
    txLastTxContext :: !(TVar TxContext)
    type EvLoaders' st = Map String (ProcessQueue st -> ByteString -> IO (TxId, ByteString))Source
    type EvLoaders = Map String (ByteString -> IO (TxId, ByteString))Source
    setEvLoadersQueue :: ProcessQueue st -> EvLoaders' st -> EvLoadersSource
    runObjectEvent :: Object -> IO ObjectSource
    runObjectEventFunc :: Object -> EventMap -> IO ObjectSource
    runColdEvent :: TxContext -> Object -> IO ObjectSource
    runColdEventFunc :: TxContext -> Object -> EventMap -> IO ObjectSource
    lookupEventHandler :: TypeString -> EventMap -> IO EventHandlerSource
    eventTString :: Serialize ev => ev -> TypeStringSource
    handleEvent :: (st -> Env -> Ev m res -> STM intermediate) -> (st -> intermediate -> IO (Maybe st, res)) -> (Either ExceptionT res -> IO ()) -> Ev m res -> RunHandler st evSource
    handleQuery :: (Either ExceptionT res -> IO ()) -> Query st res -> RunHandler st evSource
    handleUpdate :: (Either ExceptionT res -> IO ()) -> Update st res -> RunHandler st evSource
    checkDiff :: a -> a -> IO (Maybe a)Source
    getEpochMilli :: IO EpochMilliSource
    newTxContext :: IO TxContextSource
    addTxId :: TxRun st -> TxContext -> STM TxContextSource
    globalRandomGen :: MVar StdGenSource
    data TxControl Source
    Constructors
    TxControl
    ctlSaver :: SaverSaver given by the user. +
    ctlEventSaver :: MVar (WriterStream EventLogEntry)
    ctlAllComponents :: [String]Types of each component used. +
    ctlComponentVersions :: Map String [ByteString]Map listing all versions of a component +
    ctlChildren :: [(ThreadId, MVar ())]
    ctlPrefixLock :: Maybe PrefixLockStores exclusive prefix lock (implemented in filesystem) +
    ctlCreateCheckpoint :: IO ()
    data EventLogEntry Source
    Constructors
    EventLogEntry TxContext Object
    runTxLoop :: MVar (WriterStream EventLogEntry) -> ProcessQueue st -> st -> IO ()Source
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-state/Happstack-State.html hunk ./docs/0.5.0/happstack-state/Happstack-State.html 1 + + +Happstack.State
     happstack-state-0.5.0: Event-based distributed state.Source codeContentsIndex
    Happstack.State
    Contents
    ACID monad +
    Types +
    Misc utilities +
    Random numbers +
    TH helpers +
    Serialization +
    Unsafe things +
    Synopsis
    data Ev m t
    type AnyEv a = forall t. (Monad (t STM), MonadTrans t) => Ev (t STM) a
    data TxControl
    query :: (MonadIO m, QueryEvent ev res) => ev -> m res
    update :: (MonadIO m, UpdateEvent ev res) => ev -> m res
    type Update state = Ev (StateT state STM)
    type Query state = Ev (ReaderT state STM)
    type TxId = Int64
    type EpochMilli = Int64
    data Saver
    = NullSaver
    | FileSaver String
    | Queue Saver
    | Memory (MVar Store)
    setUpdateType :: Proxy t -> Update t ()
    proxyUpdate :: Update t b -> Proxy t -> Update t b
    setQueryType :: Proxy t -> Query t ()
    proxyQuery :: Query t b -> Proxy t -> Query t b
    asUpdate :: Update t a -> Proxy t -> Update t a
    asQuery :: Query t a -> Proxy t -> Query t a
    askState :: Query st st
    getState :: Update st st
    putState :: st -> Update st ()
    liftSTM :: STM a -> AnyEv a
    class CatchEv m where
    catchEv :: Ev m a -> (SomeException -> a) -> Ev m a
    sel :: (Env -> b) -> AnyEv b
    localState :: (outer -> inner) -> (inner -> outer -> outer) -> Ev (StateT inner STM) a -> Ev (StateT outer STM) a
    localStateReader :: (outer -> inner) -> Ev (ReaderT inner STM) a -> Ev (ReaderT outer STM) a
    runQuery :: Query st a -> Update st a
    getEventId :: Integral txId => AnyEv txId
    getTime :: Integral epochTime => AnyEv epochTime
    getEventClockTime :: AnyEv ClockTime
    getEventStream :: IO (IO EventItem)
    data EventItem = EventItem {
    eventContext :: TxContext
    eventData :: Dynamic
    }
    getRandom :: Random a => AnyEv a
    getRandomR :: Random a => (a, a) -> AnyEv a
    inferRecordUpdaters :: Name -> Q [Dec]
    module Happstack.State.Control
    module Happstack.State.ComponentTH
    module Happstack.State.ComponentSystem
    runTxSystem :: (Methods st, Component st) => Saver -> Proxy st -> IO (MVar TxControl)
    createCheckpoint :: MVar TxControl -> IO ()
    shutdownSystem :: MVar TxControl -> IO ()
    unsafeIOToEv :: IO a -> AnyEv a
    ACID monad +
    data Ev m t Source
    Monad for ACID event handlers. +
    type AnyEv a = forall t. (Monad (t STM), MonadTrans t) => Ev (t STM) aSource
    ACID computations that work with any state and event types. +
    data TxControl Source
    query :: (MonadIO m, QueryEvent ev res) => ev -> m resSource
    Emit a state query and wait for the result. +
    update :: (MonadIO m, UpdateEvent ev res) => ev -> m resSource
    Schedule an update and wait for it to complete. When this function returns, you're + guaranteed the update will be persistent. +
    type Update state = Ev (StateT state STM)Source
    type Query state = Ev (ReaderT state STM)Source
    Types +
    type TxId = Int64Source
    type EpochMilli = Int64Source
    data Saver Source
    Constructors
    NullSaverA saver that discards all output +
    FileSaver StringA saver that operates on files. The parameter is the prefix for the files. +
    Queue SaverEnable queueing. +
    Memory (MVar Store)
    Misc utilities +
    setUpdateType :: Proxy t -> Update t ()Source
    Use a proxy to force the type of an update action. +
    proxyUpdate :: Update t b -> Proxy t -> Update t bSource
    Forces the type of the proxy and update to match +
    setQueryType :: Proxy t -> Query t ()Source
    Use a proxy to force the type of a query action. +
    proxyQuery :: Query t b -> Proxy t -> Query t bSource
    Forces the type of proxy and query to match +
    asUpdate :: Update t a -> Proxy t -> Update t aSource
    Currying version of setUpdateType. +
    asQuery :: Query t a -> Proxy t -> Query t aSource
    Currying version of setQueryType. +
    askState :: Query st stSource
    Specialized version of ask +
    getState :: Update st stSource
    Specialized version of get +
    putState :: st -> Update st ()Source
    Specialized version of put. +
    liftSTM :: STM a -> AnyEv aSource
    Lift an STM action into Ev. +
    class CatchEv m whereSource
    Methods
    catchEv :: Ev m a -> (SomeException -> a) -> Ev m aSource
    sel :: (Env -> b) -> AnyEv bSource
    Select a part of the environment. +
    localState :: (outer -> inner) -> (inner -> outer -> outer) -> Ev (StateT inner STM) a -> Ev (StateT outer STM) aSource
    Run a computation with local state. Changes to state will be visible to outside. +
    localStateReader :: (outer -> inner) -> Ev (ReaderT inner STM) a -> Ev (ReaderT outer STM) aSource
    Run a computation with local state. +
    runQuery :: Query st a -> Update st aSource
    Execute a Query action in the Update monad. +
    getEventId :: Integral txId => AnyEv txIdSource
    getTime :: Integral epochTime => AnyEv epochTimeSource
    getEventClockTime :: AnyEv ClockTimeSource
    getEventStream :: IO (IO EventItem)Source
    data EventItem Source
    Constructors
    EventItem
    eventContext :: TxContext
    eventData :: Dynamic
    Random numbers +
    getRandom :: Random a => AnyEv aSource
    Get a random number. +
    getRandomR :: Random a => (a, a) -> AnyEv aSource
    Get a random number inside the range. +
    TH helpers +
    inferRecordUpdaters :: Name -> Q [Dec]Source
    Infer updating functions for a record. Given a data declaration + of data Foo = Foo {bar :: String, baz :: Int} then $(inferRecordUpdaters ''Foo) + will define functions a_bar :: String -> Foo -> Foo, withBar :: Update String a -> Update Foo a, + etc. that can be used as convenience updaters. +
    Serialization +
    module Happstack.State.Control
    module Happstack.State.ComponentTH
    module Happstack.State.ComponentSystem
    runTxSystem :: (Methods st, Component st) => Saver -> Proxy st -> IO (MVar TxControl)Source
    Run the MACID system without multimaster support and with the given Saver. +
    createCheckpoint :: MVar TxControl -> IO ()Source
    shutdownSystem :: MVar TxControl -> IO ()Source
    Shuts down a transaction system +
    Unsafe things +
    unsafeIOToEv :: IO a -> AnyEv aSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-state/doc-index-58.html hunk ./docs/0.5.0/happstack-state/doc-index-58.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (:)
    :+:
    1 (Type/Class)
    2 (Data Constructor)
    addfile ./docs/0.5.0/happstack-state/doc-index-A.html hunk ./docs/0.5.0/happstack-state/doc-index-A.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (A)
    addItem
    addTxId
    allStateTypes
    AnyEv
    askState
    asProxyType
    asQuery
    asUpdate
    addfile ./docs/0.5.0/happstack-state/doc-index-C.html hunk ./docs/0.5.0/happstack-state/doc-index-C.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (C)
    CatchEv
    catchEv
    checkDiff
    Collect
    collectHandlers
    collectHandlers'
    Collection
    1 (Type/Class)
    2 (Data Constructor)
    collectVersions
    Component
    componentIO
    ComponentTree
    ComponentVersions
    componentVersions
    constr[anFW]
    contain
    Contained
    createCheckpoint
    createEventMap
    createNewTxRun
    createReader
    createWriter
    ctlAllComponents
    ctlChildren
    ctlComponentVersions
    ctlCreateCheckpoint
    ctlEventSaver
    ctlPrefixLock
    ctlSaver
    addfile ./docs/0.5.0/happstack-state/doc-index-D.html hunk ./docs/0.5.0/happstack-state/doc-index-D.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (D)
    dataType[anFV]
    Dependencies
    deriveSerialize
    deriveSerializeFor
    deserialize
    deserializeObject
    dup
    addfile ./docs/0.5.0/happstack-state/doc-index-E.html hunk ./docs/0.5.0/happstack-state/doc-index-E.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (E)
    EH
    emitEvent
    emitEvent'
    emitFunc
    EmitInternal
    1 (Type/Class)
    2 (Data Constructor)
    emitRef
    End
    1 (Type/Class)
    2 (Data Constructor)
    EpochMilli
    Error
    Ev
    Event
    1 (Type/Class)
    2 (Data Constructor)
    eventContext
    eventData
    EventHandler
    EventItem
    1 (Type/Class)
    2 (Data Constructor)
    EventLogEntry
    1 (Type/Class)
    2 (Data Constructor)
    EventMap
    EventQueue
    eventStreamRef
    eventTString
    EvLoaders
    EvLoaders'
    ExceptionT
    extension
    extraEvents
    addfile ./docs/0.5.0/happstack-state/doc-index-F.html hunk ./docs/0.5.0/happstack-state/doc-index-F.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (F)
    FileSaver
    addfile ./docs/0.5.0/happstack-state/doc-index-G.html hunk ./docs/0.5.0/happstack-state/doc-index-G.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (G)
    GetCheckpointState
    1 (Type/Class)
    2 (Data Constructor)
    getCopy
    getEpochMilli
    getEventClockTime
    getEventId
    getEventStream
    getRandom
    getRandomR
    getSafeGet
    getSafePut
    GetState
    1 (Type/Class)
    2 (Data Constructor)
    getState
    1 (Function)
    2 (Function)
    getStateType
    getTime
    globalRandomGen
    addfile ./docs/0.5.0/happstack-state/doc-index-H.html hunk ./docs/0.5.0/happstack-state/doc-index-H.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (H)
    handleEvent
    handleQuery
    handleUpdate
    HR
    1 (Type/Class)
    2 (Data Constructor)
    addfile ./docs/0.5.0/happstack-state/doc-index-I.html hunk ./docs/0.5.0/happstack-state/doc-index-I.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (I)
    IHR
    1 (Type/Class)
    2 (Data Constructor)
    inferRecordUpdaters
    initEventStream
    initialValue
    addfile ./docs/0.5.0/happstack-state/doc-index-L.html hunk ./docs/0.5.0/happstack-state/doc-index-L.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (L)
    liftSTM
    localState
    localStateReader
    logMT
    lookupEventHandler
    addfile ./docs/0.5.0/happstack-state/doc-index-M.html hunk ./docs/0.5.0/happstack-state/doc-index-M.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (M)
    Memory
    Method
    MethodMap
    1 (Type/Class)
    2 (Data Constructor)
    Methods
    methods
    methodType
    Migrate
    migrate
    mkMethods
    mkObject
    Mode
    mode
    addfile ./docs/0.5.0/happstack-state/doc-index-N.html hunk ./docs/0.5.0/happstack-state/doc-index-N.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (N)
    newTxContext
    NullSaver
    addfile ./docs/0.5.0/happstack-state/doc-index-O.html hunk ./docs/0.5.0/happstack-state/doc-index-O.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (O)
    Object
    objectType
    obtainLock
    Ok
    onLoad
    addfile ./docs/0.5.0/happstack-state/doc-index-P.html hunk ./docs/0.5.0/happstack-state/doc-index-P.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (P)
    parseObject
    PrefixLock
    Primitive
    processLoggingFlags
    ProcessQueue
    Proxy
    1 (Type/Class)
    2 (Data Constructor)
    proxy
    proxyQuery
    proxyUpdate
    pushEventItem
    putCopy
    putState
    addfile ./docs/0.5.0/happstack-state/doc-index-Q.html hunk ./docs/0.5.0/happstack-state/doc-index-Q.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (Q)
    Query
    1 (Type/Class)
    2 (Data Constructor)
    query
    QueryEvent
    QueryHandler
    Queue
    quickQuery'
    addfile ./docs/0.5.0/happstack-state/doc-index-R.html hunk ./docs/0.5.0/happstack-state/doc-index-R.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (R)
    readerClose
    readerGet
    readerGetUncut
    ReaderStream
    1 (Type/Class)
    2 (Data Constructor)
    releaseLock
    Res
    runColdEvent
    runColdEventFunc
    RunHandler
    Runner
    runObjectEvent
    runObjectEventFunc
    runQuery
    runTxLoop
    runTxSystem
    addfile ./docs/0.5.0/happstack-state/doc-index-S.html hunk ./docs/0.5.0/happstack-state/doc-index-S.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (S)
    safeGet
    safePut
    Saver
    sel
    Serialize
    serialize
    SetCheckpointState
    1 (Type/Class)
    2 (Data Constructor)
    setEvLoadersQueue
    setNewEventMap
    SetNewState
    1 (Type/Class)
    2 (Data Constructor)
    setNewState
    setNewState'
    setNewStateType
    setQueryType
    setUpdateType
    shutdownSystem
    startSystemState
    startSystemStateAmazon
    stdSaver
    SubHandlers
    subHandlers
    addfile ./docs/0.5.0/happstack-state/doc-index-T.html hunk ./docs/0.5.0/happstack-state/doc-index-T.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (T)
    TxControl
    1 (Type/Class)
    2 (Data Constructor)
    TxId
    txLastTxContext
    txProcessQueue
    TxRun
    1 (Type/Class)
    2 (Data Constructor)
    TypeString
    addfile ./docs/0.5.0/happstack-state/doc-index-U.html hunk ./docs/0.5.0/happstack-state/doc-index-U.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (U)
    unProxy
    unsafeIOToEv
    Update
    1 (Type/Class)
    2 (Data Constructor)
    update
    UpdateEvent
    UpdateHandler
    addfile ./docs/0.5.0/happstack-state/doc-index-V.html hunk ./docs/0.5.0/happstack-state/doc-index-V.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (V)
    Version
    Versioned
    addfile ./docs/0.5.0/happstack-state/doc-index-W.html hunk ./docs/0.5.0/happstack-state/doc-index-W.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    ACDEFGHILMNOPQRSTUVW:
    Index (W)
    waitForTermination
    writerAdd
    writerAtomicReplace
    writerClose
    writerCut
    WriterStream
    1 (Type/Class)
    2 (Data Constructor)
    addfile ./docs/0.5.0/happstack-state/doc-index.html hunk ./docs/0.5.0/happstack-state/doc-index.html 1 + + +happstack-state-0.5.0: Event-based distributed state. (Index)
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    Index
    ACDEFGHILMNOPQRSTUVW:
    addfile ./docs/0.5.0/happstack-state/frames.html hunk ./docs/0.5.0/happstack-state/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/happstack-state/haddock-util.js hunk ./docs/0.5.0/happstack-state/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/happstack-state/haddock.css hunk ./docs/0.5.0/happstack-state/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + addfile ./docs/0.5.0/happstack-state/happstack-state.haddock binary ./docs/0.5.0/happstack-state/happstack-state.haddock oldhex * newhex *0d0cface000f0000765e000064c4b3000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000001000000 *050000000000000001000000060000000000000001000000070000000000000001000000080000 *0000000000010000000900000000000000010000000a00000000000000010000000b0000000000 *0000010000000c00000000000000020000000d00000000000000020000000e0000000000000002 *0000000f0000000000000002000000100000000000000002000000110000000000000002000000 *120000000000000002000000130000000000000001000000140000000000000001000000150000 *000000000001000000160000000000000001000000170000000000000001000000180000000000 *0000010000001900000000000000010000001a00000000000000010000001b0000000000000001 *0000001c00000000000000030000001d00000000000000030000001e0000000000000003000000 *1f0000000000000003000000200000000000000003000000210000000000000003000000220000 *000000000003000000230000000000000003000000240000000000000003000000250000000000 *000003000000260000000000000003000000270000000000000003000000280000000000000003 *0000002900000000000000030000002a00000000000000030000002b0000000000000003000000 *2c00000000000000030000002d00000000000000030000002e00000000000000030000002f0000 *000000000003000000300000000000000003000000310000000000000003000000320000000000 *000003000000330000000000000003000000340000000000000003000000350000000000000003 *000000360000000000000003000000370000000000000003000000380000000000000003000000 *3900000000000000040000003a00000000000000020000003b00000000000000020000003c0000 *0000000000020000003d00000000000000020000003e00000000000000020000003f0000000000 *000002000000400000000000000002000000410000000000000002000000420000000000000002 *000000430000000000000002000000440000000000000002000000450000000000000002000000 *460000000000000002000000470000000000000002000000480000000000000002000000490000 *0000000000020000004a00000000000000020000004b00000000000000020000004c0000000000 *0000020000004d00000000000000050000004e00000000000000050000004f0000000000000005 *000000500000000000000005000000510000000000000005000000520000000000000005000000 *530000000000000005000000540000000000000005000000550000000000000005000000560000 *000000000005000000570000000000000005000000580000000000000005000000590000000000 *0000050000005a00000000000000050000005b00000000000000050000005c0000000000000005 *0000005d00000000000000050000005e00000000000000050000005f0000000000000005000000 *600000000000000005000000610000000000000005000000620000000000000005000000630000 *000000000005000000640000000000000005000000650000000000000005000000660000000000 *000005000000670000000000000005000000680000000000000005000000690000000000000005 *0000006a00000000000000050000006b00000000000000050000006c0000000000000005000000 *6d00000000000000050000006e00000000000000050000006f0000000000000005000000700000 *000000000005000000710000000000000005000000720000000000000005000000730000000000 *000005000000740000000000000005000000750000000000000005000000760000000000000005 *000000770000000000000005000000780000000000000005000000790000000000000005000000 *7a00000000000000050000007b00000000000000050000007c00000000000000050000007d0000 *0000000000050000007e00000000000000050000007f0000000000000005000000800000000000 *000005000000810000000000000005000000820000000000000005000000830000000000000005 *000000840000000000000005000000850000000000000005000000860000000000000005000000 *8700000000000000050000008800000000000000050000008900000000000000050000008a0000 *0000000000050000008b00000000000000050000008c00000000000000050000008d0000000000 *0000050000008e00000000000000050000008f0000000000000005000000900000000000000005 *000000910000000000000005000000920000000000000005000000930000000000000005000000 *940000000000000005000000950000000000000005000000960000000000000005000000970000 *0000000000050000009800000000000000050000009900000000000000050000009a0000000000 *0000050000009b00000000000000050000009c00000000000000050000009d0000000000000005 *0000009e00000000000000050000009f0000000000000005000000a00000000000000005000000 *a10000000000000005000000a20000000000000005000000a30000000000000005000000a40000 *000000000005000000a50000000000000005000000a60000000000000005000000a70000000000 *000005000000a80000000000000005000000a90000000000000005000000aa0000000000000005 *000000ab0000000000000002000000ac0000000000000002000000ad0000000000000002000000 *ae0000000000000006000000af0000000000000006000000b00000000000000006000000b10000 *000000000006000000b200000000000000060f0000000000000007000000000b00000000000000 *000001000000000002000000000003000000000004000000000005000000000006000000000007 *00000000000800000000000900000000000a00000b000000000000000100000002000000030000 *000400000005000000060000000700000008000000090000000a0001000b000000000500000001 *000000020000000300000004000000050000000100000000020000000003000000000400000000 *050000000006040000000700000008000000090000000a00000007000000000800000000090000 *00000a000000000000000008000000000d0000000b0000000000b30000000000b40000000000b5 *0000000000b60000000000b70000000000b80000000000b90000000000ba0000000000bb000000 *0000bc0103021c0000004a00000075000000730000007400000020000000740000006f00000020 *00000061000000760000006f000000690000006400000020000000610000002000000064000000 *6500000070000000650000006e00000064000000650000006e00000063000000790000002e0000 *000a00000000bd0000000000be0000050000000b000000b8000000ba000000bd000000be000100 *050000000b00000000b800000000ba00000000bd00000000be0000000000000000090000000007 *000000bf0000000000c00000000000c10000000000c20000000000c30000000000c40000000000 *c5000007000000bf000000c0000000c1000000c2000000c3000000c4000000c500010007000000 *bf00000000c000000000c100000000c200000000c300000000c400000000c50000000000000000 *0a000000000c000000c60000000000c70000000000c80000000000c90000000000ca0000000000 *cb0000000000cc0000000000cd0000000000ce0103021d00000041000000200000007300000061 *000000760000006500000072000000200000007400000068000000610000007400000020000000 *62000000750000006e000000630000006800000065000000730000002000000077000000720000 *00690000007400000065000000730000002e0000000a00000000cf0000000000d00000000000d1 *000002000000cd000000ce00010002000000cd00000000ce00000000000000000b000000001c00 *0000d20000000000d30000000000d40000000000d50000000000d60000000000d700000000000c *00000000000d00000000000e0103021f0000004d0000006f0000006e0000006100000064000000 *20000000660000006f000000720000002000000041000000430000004900000044000000200000 *006500000076000000650000006e000000740000002000000068000000610000006e0000006400 *00006c0000006500000072000000730000002e0000000a00000000d80000000000d90000000000 *0f0103023c0000004100000043000000490000004400000020000000630000006f0000006d0000 *007000000075000000740000006100000074000000690000006f0000006e000000730000002000 *00007400000068000000610000007400000020000000770000006f000000720000006b00000020 *0000007700000069000000740000006800000020000000610000006e0000007900000020000000 *730000007400000061000000740000006500000020000000610000006e00000064000000200000 *006500000076000000650000006e00000074000000200000007400000079000000700000006500 *0000730000002e0000000a00000000da0000000000db0000000000dc0000000000dd0000000000 *de0000000000df0000000000100000000000110000000000e00000000000e10000000000e20000 *000000e30000000000e40000000000120000000000e50000000000e600001c000000d2000000d3 *000000d4000000d5000000d6000000d70000000c0000000d0000000e000000d8000000d9000000 *0f000000da000000db000000dc000000dd000000de000000df0000001000000011000000e00000 *00e1000000e2000000e3000000e400000012000000e5000000e60001001c000000d202000000d3 *000000d4000000d300000000d400000000d502000000d6000000d7000000d600000000d7000000 *000c000000000d000000000e02000000d8000000d9000000d800000000d9000000000f00000000 *da05000000db000000dc000000dd000000de000000df000000db00000000dc00000000dd000000 *00de00000000df0000000010000000001100000000e003000000e1000000e2000000e3000000e1 *00000000e200000000e300000000e4000000001200000000e500000000e6000000000000000001 *00000000090000001300000000001400000000001501030211000000450000006e000000610000 *00620000006c000000650000002000000071000000750000006500000075000000650000006900 *00006e000000670000002e0000000a00000000160103024b000000410000002000000073000000 *610000007600000065000000720000002000000074000000680000006100000074000000200000 *006f00000070000000650000007200000061000000740000006500000073000000200000006f00 *00006e0000002000000066000000690000006c00000065000000730000002e0000002000000054 *000000680000006500000020000000700000006100000072000000610000006d00000065000000 *740000006500000072000000200000006900000073000000200000007400000068000000650000 *002000000070000000720000006500000066000000690000007800000020000000660000006f00 *000072000000200000007400000068000000650000002000000066000000690000006c00000065 *000000730000002e0000000a000000001701030221000000410000002000000073000000610000 *007600000065000000720000002000000074000000680000006100000074000000200000006400 *00006900000073000000630000006100000072000000640000007300000020000000610000006c *0000006c000000200000006f00000075000000740000007000000075000000740000000a000000 *001801030102340000004400000069000000730000007000000061000000740000006300000068 *0000006500000073000000200000006f0000007600000065000000720000002000000074000000 *680000006500000020000000530000006100000076000000650000007200000020000000740000 *007900000070000000650000002000000070000000720000006f00000076000000690000006400 *0000650000006400000020000000740000006f0000002000000072000000650000007400000075 *000000720000006e00000020000000610000002001040200000007000000060102120000002000 *0000660000006f000000720000002000000074000000680000006500000020000000690000006e *0000006600000065000000720000007200000065000000640000000a0208000000200000007400 *00007900000070000000650000002e000000200000000a00000000190103010249000000440000 *006900000073000000700000006100000074000000630000006800000065000000730000002000 *00006f000000760000006500000072000000200000007400000068000000650000002000000053 *000000610000007600000065000000720000002000000074000000790000007000000065000000 *2000000070000000720000006f0000007600000069000000640000006500000064000000200000 *00740000006f0000002000000072000000650000007400000075000000720000006e0000002000 *000061000000200000005700000072000000690000007400000065000000720000005300000074 *0000007200000065000000610000006d00000020000000660000006f0000007200000020000000 *7400000068000000650000000a021100000020000000690000006e000000660000006500000072 *00000072000000650000006400000020000000740000007900000070000000650000002e000000 *200000000a000000001a00000000001b0000150000000000000001000000020000000300000004 *00000005000000060000000700000008000000090000000a0000000b0000001300000014000000 *15000000160000001700000018000000190000001a0000001b1500000006000000070000000800 *0000090000000a0000000000000001000000020000000300000004000000050000000b00000013 *0000001700000016000000150000001400000018000000190000001a0000001b00090000001304 *000000170000001600000015000000140000001400000000150000000016000000001700000000 *180000000019000000001a000000001b000000000000000003000000001d0000001c0000000000 *1d00000000001e00000000001f0103010247000000530000007500000062000000480000006100 *00006e000000640000006c00000065000000720000007300000020000000690000007300000020 *0000007500000073000000650000006400000020000000740000006f0000002000000062000000 *75000000690000006c000000640000002000000075000000700000002000000074000000680000 *006500000020000000730000006500000074000000200000006f00000066000000200000006300 *00006f0000006d000000700000006f0000006e000000650000006e000000740000007300000020 *000000630000006f00000072000000720000006500000073000000700000006f0000006e000000 *64000000690000006e0000006700000020000000740000006f0000000a02140000002000000074 *000000680000006500000020000000690000006e0000007300000074000000610000006e000000 *630000006500000020000000740000007900000070000000650000002e0000000a000000002000 *0000000021010301022a000000490000006e000000200000006f00000072000000640000006500 *00007200000020000000740000006f000000200000006200000065000000200000007500000073 *000000650000006400000020000000610000007300000020000000610000002000000070000000 *610000007200000074000000200000006f00000066000000200000004800000061000000700000 *0070000000730000007400000061000000630000006b0102010000002701021b00000073000000 *200000004d00000041000000430000004900000044000000200000007300000074000000610000 *0074000000650000002c0000002000000061000000200000006400000061000000740000006100 *000020000000740000007900000070000000650000000a010243000000200000006e0000006500 *000065000000640000007300000020000000740000006f00000020000000620000006500000020 *000000610000006e00000020000000690000006e0000007300000074000000610000006e000000 *6300000065000000200000006f0000006600000020000000430000006f0000006d000000700000 *006f0000006e000000650000006e000000740000002e0000002000000020000000540000006800 *000065000000200000006d000000690000006e000000690000006d000000610000006c00000020 *000000640000006500000066000000690000006e0000006900000074000000690000006f000000 *6e000000200000006900000073000000200000000a01024800000020000000610000006e000000 *20000000690000006e000000690000007400000069000000610000006c00000056000000610000 *006c000000750000006500000020000000610000006e0000006400000020000000740000006800 *000065000000200000007400000079000000700000006500000020000000630000006f00000072 *000000720000006500000073000000700000006f0000006e00000064000000690000006e000000 *6700000020000000740000006f0000002000000074000000680000006500000020000000730000 *006500000074000000200000006f00000066000000200000004400000065000000700000006500 *00006e00000064000000650000006e000000630000006900000065000000730000002e0000000a *010246000000200000004e0000006f000000740000006500000020000000740000006800000061 *000000740000002000000074000000680000006500000020000000530000007500000062000000 *48000000610000006e000000640000006c00000065000000720000007300000020000000630000 *006f0000006e000000640000006900000074000000690000006f0000006e000000200000007700 *0000690000006c0000006c00000020000000620000006500000020000000610000007500000074 *0000006f0000006d00000061000000740000006900000063000000610000006c0000006c000000 *79000000200000006d000000650000007400000020000000690000006600000020000000740000 *0068000000650000000a01021c00000020000000440000006500000070000000650000006e0000 *0064000000650000006e0000006300000069000000650000007300000020000000690000007300 *0000200000006200000075000000690000006c000000740000002000000066000000720000006f *0000006d00000020010402000000330000003201020500000020000000610000006e0000006400 *000020010201000000270102030000003a0000002b0000003a0102010000002701021a00000020 *00000077000000690000007400000068000000200000006f000000740000006800000065000000 *7200000020000000690000006e0000007300000074000000610000006e00000063000000650000 *0073000000200000006f00000066000000200000000a021700000020000000430000006f000000 *6d000000700000006f0000006e000000650000006e0000007400000020000000610000006e0000 *0064000000200000004d0000006500000074000000680000006f00000064000000730000000a00 *000000220000000000230000000000240000000000250103021b00000053000000740000006100 *000074000000650000002000000074000000790000007000000065000000200000002d0000003e *00000020000000610000006c0000006c0000002000000076000000650000007200000073000000 *690000006f0000006e000000730000000a00000000260103021900000053000000740000006100 *000074000000650000002000000074000000790000007000000065000000200000002d0000003e *000000200000006d0000006500000074000000680000006f00000064000000200000006d000000 *61000000700000000a0000000027000000000028000000000029010301024b000000430000006c *00000061000000730000007300000020000000660000006f000000720000002000000065000000 *6e000000750000006d00000065000000720000006100000074000000690000006e000000670000 *002000000074000000680000006500000020000000730000006500000074000000200000006f00 *00006600000020000000640000006500000066000000690000006e000000650000006400000020 *0000006d0000006500000074000000680000006f00000064000000730000002000000062000000 *790000002000000074000000680000006500000020000000740000007900000070000000650000 *00200000006f000000660000002000000074000000680000006500000020000000730000007400 *00006100000074000000650000002e0000000a01023500000020000000490000006e0000007300 *000074000000610000006e0000006300000065000000730000002000000073000000680000006f *000000750000006c00000064000000200000006e0000006f000000740000002000000062000000 *6500000020000000640000006500000066000000690000006e0000006500000064000000200000 *006400000069000000720000006500000063000000740000006c000000790000002c0000002000 *0000620000007500000074000000200000007500000073000000690000006e0000006700000020 *0102090000006d0000006b0000004d0000006500000074000000680000006f0000006400000073 *02010000000a000000002a00000000002b01030102410000004d00000065000000740000006800 *00006f000000640000002000000069000000730000002000000074000000680000006500000020 *00000061000000630000007400000075000000610000006c000000200000007400000079000000 *7000000065000000200000007400000068000000610000007400000020000000610000006c0000 *006c00000020000000550000007000000064000000610000007400000065000000730000002000 *0000610000006e0000006400000020000000510000007500000065000000720000007900000073 *000000200000006500000076000000650000006e0000007400000075000000610000006c000000 *6c000000790000000a01021500000020000000670000006500000074000000200000006c000000 *690000006600000074000000650000006400000020000000690000006e000000740000006f0000 *0020000000760000006900000061000000200102090000006d0000006b0000004d000000650000 *0074000000680000006f000000640000007302020000002e0000000a000000002c00000000002d *00000000002e00000000002f000000000030010302410000005400000079000000700000006500 *0000200000006c0000006500000076000000650000006c00000020000000430000006f0000006e *0000007300000020000000660000006f0000007200000020000000650000006e00000075000000 *6d00000065000000720000006100000074000000690000006e0000006700000020000000740000 *0079000000700000006500000020000000640000006500000070000000650000006e0000006400 *0000650000006e00000063000000690000006500000073000000200000006f0000006600000020 *0000006100000020000000430000006f0000006d000000700000006f0000006e00000065000000 *6e000000740000000a0000000031000000000032010301020f0000004500000071000000750000 *006900000076000000610000006c000000650000006e00000074000000200000006f0000006600 *0000200000005b0102010000005d01023900000020000000660000006f00000072000000200000 *0074000000790000007000000065000000200000006c0000006500000076000000650000006c00 *0000200000006c000000690000007300000074000000730000002e000000200000002000000055 *00000073000000650000006400000020000000660000006f000000720000002000000043000000 *6f0000006d000000700000006f0000006e000000650000006e0000007400000073000000200000 *007400000068000000610000007400000020000000680000006100000076000000650000002000 *00006e0000006f0000000a020e00000020000000640000006500000070000000650000006e0000 *0064000000650000006e000000630000006900000065000000730000000a000000003300000000 *00340103021e000000440000006900000073000000700000006c00000061000000790000007300 *000020000000740000006800000065000000200000007400000079000000700000006500000020 *0000006f000000660000002000000061000000200000004d000000650000007400000068000000 *6f000000640000000a00000000350000000000360000000000370000000000380103022b000000 *410000006e000000200000006500000072000000720000006f0000007200000020000000690000 *0073000000200000007400000068000000720000006f000000770000006e000000200000007700 *000068000000650000006e00000020000000740000006800000069000000730000002000000069 *00000073000000200000006500000076000000610000006c000000750000006100000074000000 *65000000640000002e0000000a001d0000001c0000001d0000001e0000001f0000002000000021 *00000022000000230000002400000025000000260000002700000028000000290000002a000000 *2b0000002c0000002d0000002e0000002f00000030000000310000003200000033000000340000 *00350000003600000037000000381d000000320000003300000030000000310000002f0000002e *0000002b0000002d0000002c00000034000000290000002a000000270000002800000026000000 *25000000210000002200000023000000240000001f000000200000001d0000001e000000350000 *001c000000360000003700000038001d0000001c000000001d010000001e0000001e000000001f *010000002000000020000000002103000000220000002300000024000000220000000023000000 *00240000000025000000002600000000270100000028000000280000000029010000002a000000 *2a000000002b020000002d0000002c0000002c000000002d000000002e000000002f0000000030 *010000003100000031000000003201000000330000003300000000340000000035000000003600 *0000003700000000380000000000000000040000000028000000e70000000000e80000000000e9 *0000000000ea0000000000eb0000000000ec0000000000ed0000000000ee0000000000ef000000 *0000f00000000000f10000000000f2000000000039010301024700000054000000680000006900 *0000730000002000000066000000750000006e0000006300000074000000690000006f0000006e *0000002000000077000000690000006c0000006c00000020000000640000006500000072000000 *6900000076000000650000002c00000020000000660000006f0000007200000020000000740000 *0068000000650000002000000070000000720000006f0000007600000069000000640000006500 *0000640000002000000074000000790000007000000065000000200000006e000000610000006d *0000006500000020000000610000006e0000006400000020000000740000006800000065000000 *2000000070000000720000006f00000076000000690000006400000065000000640000000a0102 *4c0000002000000020000000200000006c000000690000007300000074000000200000006f0000 *0066000000200000006d0000006500000074000000680000006f00000064000000730000002c00 *000020000000610000006e00000020000000690000006e0000007300000074000000610000006e *0000006300000065000000200000006f00000066000000200000004d0000006500000074000000 *680000006f000000640000007300000020000000660000006f0000007200000020000000740000 *00680000006500000020000000670000006900000076000000650000006e000000200000007400 *000079000000700000006500000020000000610000006e00000064000000200000006e00000065 *000000630000006500000073000000730000006100000072000000790000000a01025100000020 *0000002000000020000000690000006e0000007300000074000000610000006e00000063000000 *65000000200000006f000000660000002000000055000000700000006400000061000000740000 *00650000004500000076000000650000006e0000007400000020000000610000006e0000006400 *00002000000051000000750000006500000072000000790000004500000076000000650000006e *0000007400000020000000740000006f000000200000006d000000610000006b00000065000000 *200000007400000068000000650000002000000070000000720000006f00000076000000690000 *00640000006500000064000000200000006c000000690000007300000074000000200000006f00 *0000660000002000000066000000750000006e0000006300000074000000690000006f0000006e *000000730000000a010211000000200000002000000020000000690000006e000000740000006f *000000200000004d0000006500000074000000680000006f00000064000000730000002e000000 *0a01024d0000002000000020000000200000005400000068000000690000007300000020000000 *54000000480000002000000073000000700000006c000000690000006300000065000000200000 *006e0000006500000065000000640000007300000020000000740000006f000000200000006200 *000065000000200000006500000078000000650000006300000075000000740000006500000064 *00000020000000660000006f0000007200000020000000610000006e0000007900000020000000 *4d0000004100000043000000490000004400000020000000730000007400000061000000740000 *0065000000200000007400000079000000700000006500000020000000690000006e0000002000 *00006f0000007200000064000000650000007200000020000000740000006f000000200000000a *010239000000200000002000000020000000680000006100000076000000650000002000000074 *0000006800000065000000200000006e0000006500000063000000650000007300000073000000 *61000000720000007900000020000000630000006f000000640000006500000020000000660000 *006f00000072000000200000006500000076000000650000006e00000074000000200000006800 *0000610000006e000000640000006c000000690000006e00000067000000200000006700000065 *0000006e0000006500000072000000610000007400000065000000640000002e0000000a010208 *00000020000000200000002000000045000000780000003a0000002000000020010701020c0000 *0024000000280000006d0000006b0000004d0000006500000074000000680000006f0000006400 *000073000000200102010000002701020100000027010205000000460000006f0000006f000000 *200000005b0102010000002701020a000000660000006f0000006f000000550000007000000064 *0000006100000074000000650000002c010208000000660000006f0000006f0000005100000075 *0000006500000072000000790102010000005d02010000002902010000000a00000000f3000000 *0000f40000000000f50000000000f60000000000f70000000000f80000000000f90000000000fa *0000000000fb0000000000fc0000000000fd0000000000fe0000000000ff000000000100000000 *000101000000000102000000000103000000000104000000000105000000000106010301024000 *000049000000670000006e0000006f00000072000000690000006e000000670000002000000045 *0000007100000075000000610000006c0000005000000020000000700000007200000065000000 *640000006900000063000000610000007400000065000000730000002c00000020000000720000 *00650000007400000075000000720000006e0000007300000020000000610000006c0000006c00 *0000200000006e000000610000006d000000650000007300000020000000610000007300000073 *0000006f0000006300000069000000610000007400000065000000640000002000000077000000 *69000000740000006800000020000000610000000a021300000020000000630000006f0000006e *000000740000006500000078000000740000002000000070000000720000006500000064000000 *69000000630000006100000074000000650000000a000000010700000000010800000000010900 *000000010a00000000010b00000000010c00000000010d00000100000039010000003900010000 *003900000000000000000c00000000100000003a00000000003b00000000003c01030233000000 *55000000730000006500000020000000610000002000000070000000720000006f000000780000 *007900000020000000740000006f00000020000000660000006f00000072000000630000006500 *000020000000740000006800000065000000200000007400000079000000700000006500000020 *0000006f0000006600000020000000610000006e00000020000000750000007000000064000000 *61000000740000006500000020000000610000006300000074000000690000006f0000006e0000 *002e0000000a000000003d01030231000000460000006f00000072000000630000006500000073 *000000200000007400000068000000650000002000000074000000790000007000000065000000 *200000006f00000066000000200000007400000068000000650000002000000070000000720000 *006f000000780000007900000020000000610000006e0000006400000020000000750000007000 *00006400000061000000740000006500000020000000740000006f000000200000006d00000061 *0000007400000063000000680000000a000000003e010302310000005500000073000000650000 *0020000000610000002000000070000000720000006f0000007800000079000000200000007400 *00006f00000020000000660000006f000000720000006300000065000000200000007400000068 *000000650000002000000074000000790000007000000065000000200000006f00000066000000 *200000006100000020000000710000007500000065000000720000007900000020000000610000 *006300000074000000690000006f0000006e0000002e0000000a000000003f0103022c00000046 *0000006f0000007200000063000000650000007300000020000000740000006800000065000000 *2000000074000000790000007000000065000000200000006f0000006600000020000000700000 *00720000006f000000780000007900000020000000610000006e00000064000000200000007100 *00007500000065000000720000007900000020000000740000006f000000200000006d00000061 *0000007400000063000000680000000a0000000040010301021400000043000000750000007200 *00007200000079000000690000006e000000670000002000000076000000650000007200000073 *000000690000006f0000006e000000200000006f00000066000000200104010000003c02020000 *002e0000000a000000004101030102140000004300000075000000720000007200000079000000 *690000006e000000670000002000000076000000650000007200000073000000690000006f0000 *006e000000200000006f00000066000000200104010000003e02020000002e0000000a00000000 *4201030102170000005300000070000000650000006300000069000000610000006c0000006900 *00007a00000065000000640000002000000076000000650000007200000073000000690000006f *0000006e000000200000006f00000066000000200104010000010e02010000000a000000004301 *030102170000005300000070000000650000006300000069000000610000006c00000069000000 *7a00000065000000640000002000000076000000650000007200000073000000690000006f0000 *006e000000200000006f00000066000000200104010000010f02010000000a0000000044010301 *02170000005300000070000000650000006300000069000000610000006c000000690000007a00 *000065000000640000002000000076000000650000007200000073000000690000006f0000006e *000000200000006f00000066000000200104010000011002020000002e0000000a000000004501 *03021c0000004c00000069000000660000007400000020000000610000006e0000002000000053 *000000540000004d00000020000000610000006300000074000000690000006f0000006e000000 *20000000690000006e000000740000006f0000002000000045000000760000002e0000000a0000 *0000460103022200000053000000650000006c0000006500000063000000740000002000000061 *0000002000000070000000610000007200000074000000200000006f0000006600000020000000 *74000000680000006500000020000000650000006e0000007600000069000000720000006f0000 *006e0000006d000000650000006e000000740000002e0000000a00000000470103025100000052 *000000750000006e000000200000006100000020000000630000006f0000006d00000070000000 *75000000740000006100000074000000690000006f0000006e0000002000000077000000690000 *007400000068000000200000006c0000006f00000063000000610000006c000000200000007300 *0000740000006100000074000000650000002e000000200000004300000068000000610000006e *00000067000000650000007300000020000000740000006f000000200000007300000074000000 *6100000074000000650000002000000077000000690000006c0000006c00000020000000620000 *00650000002000000076000000690000007300000069000000620000006c000000650000002000 *0000740000006f000000200000006f000000750000007400000073000000690000006400000065 *0000002e0000000a00000000480103022400000052000000750000006e00000020000000610000 *0020000000630000006f0000006d00000070000000750000007400000061000000740000006900 *00006f0000006e0000002000000077000000690000007400000068000000200000006c0000006f *00000063000000610000006c000000200000007300000074000000610000007400000065000000 *2e0000000a00000000490103022c00000045000000780000006500000063000000750000007400 *000065000000200000006100000020000000510000007500000065000000720000007900000020 *000000610000006300000074000000690000006f0000006e00000020000000690000006e000000 *200000007400000068000000650000002000000055000000700000006400000061000000740000 *0065000000200000006d0000006f0000006e00000061000000640000002e0000000a0010000000 *3a0000003b0000003c0000003d0000003e0000003f000000400000004100000042000000430000 *00440000004500000046000000470000004800000049000100100000003a010000003b0000003b *000000003c000000003d000000003e000000003f00000000400000000041000000004200000000 *430000000044000000004500000000460000000047000000004800000000490000000000000000 *0d00000000090000004a0103021500000047000000650000007400000020000000610000002000 *000072000000610000006e000000640000006f0000006d000000200000006e000000750000006d *0000006200000065000000720000002e0000000a000000004b0103022600000047000000650000 *007400000020000000610000002000000072000000610000006e000000640000006f0000006d00 *0000200000006e000000750000006d00000062000000650000007200000020000000690000006e *000000730000006900000064000000650000002000000074000000680000006500000020000000 *72000000610000006e00000067000000650000002e0000000a000000004c010301024100000049 *0000006e0000006600000065000000720000002000000075000000700000006400000061000000 *74000000690000006e000000670000002000000066000000750000006e00000063000000740000 *00690000006f0000006e0000007300000020000000660000006f00000072000000200000006100 *0000200000007200000065000000630000006f00000072000000640000002e0000002000000020 *000000470000006900000076000000650000006e00000020000000610000002000000064000000 *610000007400000061000000200000006400000065000000630000006c00000061000000720000 *006100000074000000690000006f0000006e0000000a010204000000200000006f000000660000 *00200107022a0000006400000061000000740000006100000020000000460000006f0000006f00 *0000200000003d00000020000000460000006f0000006f000000200000007b0000006200000061 *00000072000000200000003a0000003a0000002000000053000000740000007200000069000000 *6e000000670000002c0000002000000062000000610000007a000000200000003a0000003a0000 *0020000000490000006e000000740000007d010206000000200000007400000068000000650000 *006e0000002001070102160000002400000028000000690000006e000000660000006500000072 *0000005200000065000000630000006f0000007200000064000000550000007000000064000000 *610000007400000065000000720000007300000020010201000000270102010000002702040000 *00460000006f0000006f000000290102010000000a010217000000200000007700000069000000 *6c0000006c00000020000000640000006500000066000000690000006e00000065000000200000 *0066000000750000006e0000006300000074000000690000006f0000006e000000730000002001 *07021d000000610000005f000000620000006100000072000000200000003a0000003a00000020 *000000530000007400000072000000690000006e00000067000000200000002d0000003e000000 *20000000460000006f0000006f000000200000002d0000003e00000020000000460000006f0000 *006f0102020000002c000000200107022a00000077000000690000007400000068000000420000 *006100000072000000200000003a0000003a000000200000005500000070000000640000006100 *0000740000006500000020000000530000007400000072000000690000006e0000006700000020 *00000061000000200000002d0000003e0000002000000055000000700000006400000061000000 *740000006500000020000000460000006f0000006f00000020000000610102020000002c000000 *0a0232000000200000006500000074000000630000002e00000020000000740000006800000061 *000000740000002000000063000000610000006e00000020000000620000006500000020000000 *7500000073000000650000006400000020000000610000007300000020000000630000006f0000 *006e00000076000000650000006e00000069000000650000006e00000063000000650000002000 *000075000000700000006400000061000000740000006500000072000000730000002e00000020 *000000200000000a00000001110000000001120000000001130103023300000043000000720000 *00650000006100000074000000650000002000000061000000200000006c000000690000007300 *000074000000200000006f000000660000002000000073000000650000006c0000006500000063 *00000074000000690000006f0000006e0000002000000066000000750000006e00000063000000 *74000000690000006f0000006e0000007300000020000000660000006f00000072000000200000 *0061000000200000007200000065000000630000006f00000072000000640000002e0000000a00 *000001140103023000000043000000720000006500000061000000740000006500000020000000 *61000000200000006c000000690000007300000074000000200000006f00000066000000200000 *007500000070000000640000006100000074000000650000002000000066000000750000006e00 *00006300000074000000690000006f0000006e0000007300000020000000660000006f00000072 *0000002000000061000000200000007200000065000000630000006f0000007200000064000000 *2e0000000a00000001150103021300000052000000650000007400000075000000720000006e00 *0000200000006600000069000000650000006c00000064000000200000006e000000610000006d *00000065000000730000000a00000001160103021200000053000000690000006d000000700000 *006c0000006500000020000000640000006500000066000000690000006e000000690000007400 *0000690000006f0000006e0000000a00030000004a0000004b0000004c000100030000004a0000 *00004b000000004c000000000000000005000000005e0000004d00000000004e00000000004f00 *000000005000000000005100000000005200000000005300000000005400000000005500000000 *005600000000005700000000005800000000005900000000005a01030219000000530000006100 *000076000000650000007200000020000000670000006900000076000000650000006e00000020 *000000620000007900000020000000740000006800000065000000200000007500000073000000 *65000000720000002e0000000a000000005b00000000005c0103021e0000005400000079000000 *700000006500000073000000200000006f00000066000000200000006500000061000000630000 *006800000020000000630000006f0000006d000000700000006f0000006e000000650000006e00 *00007400000020000000750000007300000065000000640000002e0000000a000000005d010302 *280000004d0000006100000070000000200000006c000000690000007300000074000000690000 *006e0000006700000020000000610000006c0000006c0000002000000076000000650000007200 *000073000000690000006f0000006e00000073000000200000006f000000660000002000000061 *00000020000000630000006f0000006d000000700000006f0000006e000000650000006e000000 *740000000a000000005e00000000005f0103023900000053000000740000006f00000072000000 *6500000073000000200000006500000078000000630000006c0000007500000073000000690000 *007600000065000000200000007000000072000000650000006600000069000000780000002000 *00006c0000006f000000630000006b0000002000000028000000690000006d000000700000006c *000000650000006d000000650000006e0000007400000065000000640000002000000069000000 *6e0000002000000066000000690000006c00000065000000730000007900000073000000740000 *00650000006d000000290000000a00000000600000000000610000000000620000000000630000 *000000640000000000650000000000660000000000670000000000680000000000690000000000 *6a00000000006b00000000006c00000000006d00000000006e00000000006f0000000000700000 *000000710000000000720000000000730000000000740000000000750000000000760000000000 *7700000000007800000000007900000000007a00000000007b00000000007c00000000007d0000 *0000007e00000000007f0000000000800000000000810000000000820000000000830000000000 *8400000000008500000000008600000000008700000000008800000000008900000000008a0000 *0000008b00000000008c00000000008d00000000008e00000000008f0000000000900000000000 *910000000000920000000000930000000000940000000000950000000000960000000000970000 *00000098010301024f0000005300000063000000680000006500000064000000750000006c0000 *006500000020000000610000006e00000020000000750000007000000064000000610000007400 *00006500000020000000610000006e000000640000002000000077000000610000006900000074 *00000020000000660000006f000000720000002000000069000000740000002000000074000000 *6f00000020000000630000006f0000006d000000700000006c0000006500000074000000650000 *002e000000200000005700000068000000650000006e0000002000000074000000680000006900 *0000730000002000000066000000750000006e0000006300000074000000690000006f0000006e *0000002000000072000000650000007400000075000000720000006e000000730000002c000000 *20000000790000006f000000750102010000002701020300000072000000650000000a022b0000 *002000000067000000750000006100000072000000610000006e00000074000000650000006500 *000064000000200000007400000068000000650000002000000075000000700000006400000061 *00000074000000650000002000000077000000690000006c0000006c0000002000000062000000 *650000002000000070000000650000007200000073000000690000007300000074000000650000 *006e000000740000002e0000000a00000000990103022c000000450000006d0000006900000074 *000000200000006100000020000000730000007400000061000000740000006500000020000000 *710000007500000065000000720000007900000020000000610000006e00000064000000200000 *007700000061000000690000007400000020000000660000006f00000072000000200000007400 *0000680000006500000020000000720000006500000073000000750000006c000000740000002e *0000000a000000009a00000000009b00000000009c00000000009d00000000009e00000000009f *0000000000a00000000000a10000000000a20000000000a30000000000a40000000000a5000000 *0000a60000000000a70000000000a80000000000a90000000000aa00005e0000004d0000004e00 *00004f000000500000005100000052000000530000005400000055000000560000005700000058 *000000590000005a0000005b0000005c0000005d0000005e0000005f0000006000000061000000 *62000000630000006400000065000000660000006700000068000000690000006a0000006b0000 *006c0000006d0000006e0000006f00000070000000710000007200000073000000740000007500 *0000760000007700000078000000790000007a0000007b0000007c0000007d0000007e0000007f *000000800000008100000082000000830000008400000085000000860000008700000088000000 *890000008a0000008b0000008c0000008d0000008e0000008f0000009000000091000000920000 *00930000009400000095000000960000009700000098000000990000009a0000009b0000009c00 *00009d0000009e0000009f000000a0000000a1000000a2000000a3000000a4000000a5000000a6 *000000a7000000a8000000a9000000aa5e0000004d0000004e0000004f00000050000000510000 *0052000000530000005400000055000000830000008000000082000000810000007f0000007d00 *00007e0000008400000085000000860000008700000088000000790000007a0000007b0000007c *000000890000008a0000008b0000008c0000008d0000008e0000008f0000009000000091000000 *920000009300000094000000950000009600000097000000770000007800000075000000760000 *0098000000990000009a000000740000007300000071000000720000006f000000700000006d00 *00006e0000006c000000690000006b0000006a0000006800000067000000630000006400000065 *0000006600000062000000610000009b0000009c0000009d0000009e0000009f000000a0000000 *a1000000a2000000a3000000a4000000a5000000a6000000a7000000a8000000a9000000580000 *00590000005a0000005b0000005c0000005d0000005e0000005f00000060000000560000005700 *0000aa005e0000004d000000004e000000004f0000000050000000005100000000520100000053 *000000530000000054010000005500000055000000005601000000570000005700000000580800 *0000590000005a0000005b0000005c0000005d0000005e0000005f000000600000005900000000 *5a000000005b000000005c000000005d000000005e000000005f00000000600000000061000000 *006200000000630300000064000000650000006600000064000000006500000000660000000067 *00000000680000000069020000006b0000006a0000006a000000006b000000006c000000006d01 *0000006e0000006e000000006f0100000070000000700000000071010000007200000072000000 *007300000000740000000075010000007600000076000000007701000000780000007800000000 *79030000007a0000007b0000007c0000007a000000007b000000007c000000007d010000007e00 *00007e000000007f00000000800200000082000000810000008100000000820000000083000000 *008400000000850000000086000000008700000000880000000089000000008a000000008b0000 *00008c000000008d000000008e000000008f000000009000000000910000000092000000009300 *0000009400000000950000000096000000009700000000980000000099000000009a000000009b *000000009c000000009d000000009e000000009f00000000a000000000a100000000a200000000 *a300000000a400000000a500000000a600000000a700000000a800000000a900000000aa000000 *00000000000e000000000f0000011700000000011800000000011900000000011a00000000011b *00000000011c01030102350000004c0000006f0000006100000064000000200000007300000074 *0000006100000074000000650000002000000066000000720000006f0000006d00000020000000 *6400000069000000730000006b00000020000000610000006e0000006400000020000000720000 *00650000002d00000072000000750000006e00000020000000610000006e000000790000002000 *00006e000000650000006500000064000000650000006400000020000000650000007600000065 *0000006e000000740000007300000020000000740000006f0000000a01023a0000002000000020 *0000002000000066000000750000006c0000006c00000079000000200000007200000065000000 *73000000740000006f000000720000006500000020000000740000006800000065000000200000 *0073000000740000006100000074000000650000002e0000002000000054000000680000006500 *00002000000072000000650000007400000075000000720000006e000000650000006400000020 *00000066000000750000006e0000006300000074000000690000006f0000006e00000020000000 *650000006e00000061000000620000006c00000065000000730000000a02120000002000000020 *000000200000006500000076000000650000006e00000074000000200000006c0000006f000000 *6700000067000000690000006e000000670000002e0000000a000000011d00000000011e000000 *00011f000000000120000000000121000000000122000000000123010302360000004c0000006f *00000061000000640000002000000061000000200000006d000000610000007000000020000000 *66000000720000006f0000006d00000020000000630000006f0000006d000000700000006f0000 *006e000000650000006e0000007400000020000000740000007900000070000000650000007300 *000020000000740000006f0000002000000073000000650000007200000069000000610000006c *000000690000007a00000065000000640000002000000073000000740000006100000074000000 *65000000730000002e0000000a0000000124000000000125010301023300000043000000720000 *006500000061000000740000006500000073000000200000006100000020000000630000006800 *000065000000630000006b000000700000006f000000690000006e000000740000002000000075 *00000073000000690000006e000000670000002000000074000000680000006500000020000000 *70000000720000006f000000760000006900000064000000650000006400000020000000540000 *0078000000430000006f0000006e00000074000000720000006f0000006c0000002e0000000a01 *024d00000020000000540000006800000069000000730000002000000063000000680000006500 *0000630000006b000000700000006f000000690000006e00000074000000200000006d00000061 *000000790000002000000062000000650000002000000075000000730000006500000064000000 *200000006100000073000000200000006100000020000000730000006100000066000000650000 *002000000073000000740000006100000074000000650000002000000077000000690000007400 *00006800000020000000770000006800000069000000630000006800000020000000740000006f *000000200000007300000074000000610000007200000074000000200000007400000068000000 *650000002000000073000000790000007300000074000000650000006d0000002c0000000a0102 *4e00000020000000650000002e000000670000002e000000200000006f0000006e000000650000 *00200000006d00000061000000790000002000000064000000650000006c000000650000007400 *00006500000020000000610000006c0000006c0000002000000074000000680000006500000020 *00000073000000650000007200000069000000610000006c000000690000007a00000065000000 *64000000200000006500000076000000650000006e000000740000007300000020000000740000 *0068000000610000007400000020000000740000006f0000006f0000006b000000200000007000 *00006c000000610000006300000065000000200000006100000066000000740000006500000072 *00000020000000740000006800000065000000200000006c000000610000007300000074000000 *0a01024100000020000000630000006800000065000000630000006b000000700000006f000000 *690000006e0000007400000020000000610000006e000000640000002000000073000000740000 *006100000072000000740000002000000074000000680000006500000020000000610000007000 *0000700000006c00000069000000630000006100000074000000690000006f0000006e00000020 *00000066000000720000006500000073000000680000002000000066000000720000006f000000 *6d0000002000000074000000680000006500000020000000630000006800000065000000630000 *006b000000700000006f000000690000006e000000740000002e0000000a024800000020000000 *43000000610000006c0000006c000000690000006e000000670000002000000074000000680000 *0069000000730000002000000066000000750000006e0000006300000074000000690000006f00 *00006e000000200000006d000000610000006e00000075000000610000006c0000006c00000079 *00000020000000690000007300000020000000740000006800000065000000200000006f000000 *6e0000006c000000790000002000000077000000610000007900000020000000740000006f0000 *002000000063000000720000006500000061000000740000006500000020000000630000006800 *000065000000630000006b000000700000006f000000690000006e00000074000000730000002e *000000200000000a00020000011c00000125000100020000011c00000001250000000000000000 *0f0000000008000001260000000001270000000001280103010231000000470000006900000076 *000000650000006e00000020000000610000002000000053000000610000007600000065000000 *7200000020000000610000006e0000006400000020000000610000002000000050000000720000 *006f00000078000000790000002c00000020000000630000007200000065000000610000007400 *0000650000005400000078000000430000006f0000006e00000074000000720000006f0000006c *0000002000000077000000690000006c0000006c000000200000000a01023b0000002000000069 *0000006e000000690000007400000069000000610000006c000000690000007a00000065000000 *2000000061000000200000005400000078000000430000006f0000006e00000074000000720000 *006f0000006c0000002e0000002000000020000000540000006800000069000000730000002000 *0000640000006f0000006500000073000000200000006e0000006f000000740000002000000061 *000000630000007400000075000000610000006c0000006c000000790000002000000073000000 *74000000610000007200000074000000200000007400000068000000650000000a020f00000020 *000000730000007400000061000000740000006500000020000000730000007900000073000000 *74000000650000006d0000002e0000000a00000001290103022d00000053000000610000007600 *000065000000730000002000000074000000680000006500000020000000730000007400000061 *000000740000006500000020000000610000006e0000006400000020000000630000006c000000 *6f0000007300000065000000730000002000000074000000680000006500000020000000730000 *00650000007200000069000000610000006c000000690000007a00000061000000740000006900 *00006f0000006e0000000a00000000ab0103024b00000052000000750000006e00000020000000 *740000006800000065000000200000004d00000041000000430000004900000044000000200000 *0073000000790000007300000074000000650000006d0000002000000077000000690000007400 *0000680000006f0000007500000074000000200000006d000000750000006c0000007400000069 *0000006d0000006100000073000000740000006500000072000000200000007300000075000000 *70000000700000006f000000720000007400000020000000610000006e00000064000000200000 *007700000069000000740000006800000020000000740000006800000065000000200000006700 *00006900000076000000650000006e000000200000005300000061000000760000006500000072 *0000002e0000000a000000012a0000000000ac0000000000ad0103022000000053000000680000 *0075000000740000007300000020000000640000006f000000770000006e000000200000006100 *0000200000007400000072000000610000006e0000007300000061000000630000007400000069 *0000006f0000006e0000002000000073000000790000007300000074000000650000006d000000 *0a0004000000ab0000012a000000ac000000ad00010004000000ab000000012a00000000ac0000 *0000ad00000000000000000600000000120000012b00000000012c00000000012d00000000012e *00000000012f0000000001300000000001310000000001320000000001330000000000ae010301 *025000000053000000740000006100000072000000740000007300000020000000740000006800 *000065000000200000004d00000041000000430000004900000044000000200000007300000079 *0000007300000074000000650000006d0000002000000077000000690000007400000068000000 *6f0000007500000074000000200000007200000065000000700000006c00000069000000630000 *006100000074000000690000006f0000006e000000200000007300000075000000700000007000 *00006f00000072000000740000002e000000200000002000000055000000730000006500000073 *000000200000007400000068000000650000002000000064000000650000006600000061000000 *750000006c00000074000000200000006200000065000000680000006100000076000000690000 *006f000000720000000a0230000000200000006f00000066000000200000007300000061000000 *76000000690000006e000000670000002000000074000000680000006500000020000000730000 *007400000061000000740000006500000020000000690000006e000000740000006f0000002000 *0000740000006800000065000000200000005f0000006c0000006f00000063000000610000006c *000000200000006400000069000000720000006500000063000000740000006f00000072000000 *790000002e0000000a00000000af0000000000b001030102440000005200000065000000740000 *0075000000720000006e0000007300000020000000740000006800000065000000200000006400 *0000650000006600000061000000750000006c0000007400000020000000530000006100000076 *00000065000000720000002e000000200000002000000049000000740000002000000077000000 *690000006c0000006c000000200000007300000061000000760000006500000020000000740000 *006800000065000000200000006100000070000000700000006c00000069000000630000006100 *000074000000690000006f0000006e000000200000007300000074000000610000007400000065 *00000020000000690000006e000000740000006f0000000a021700000020000000740000006800 *000065000000200000005f0000006c0000006f00000063000000610000006c0000002000000064 *00000069000000720000006500000063000000740000006f00000072000000790000002e000000 *0a00000000b101030102130000005700000061000000690000007400000020000000660000006f *000000720000002000000061000000200000007300000069000000670000006e00000061000000 *6c0000002e0000000a0102420000002000000020000000200000004f0000006e00000020000000 *750000006e00000069000000780000002c00000020000000610000002000000073000000690000 *00670000006e000000610000006c00000020000000690000007300000020000000730000006900 *000067000000490000004e00000054000000200000006f00000072000000200000007300000069 *000000670000005400000045000000520000004d0000002e000000200000004f0000006e000000 *2000000077000000690000006e000000640000006f00000077000000730000002c000000200000 *00740000006800000065000000200000007300000069000000670000006e000000610000006c00 *00000a01020f000000200000002000000020000000690000007300000020000000650000006e00 *0000740000006500000072000000690000006e0000006700000020010201000000650202000000 *2e0000000a00000001340000000001350000000001360000000001370000000000b20000050000 *00ae000000af000000b0000000b1000000b205000000ae000000af000000b2000000b0000000b1 *0005000000ae00000000af00000000b000000000b100000000b200000000000000000200000000 *007200000138000001390000013a0000013b0000013c0000013d0000013e0000013f0000014000 *00014100000142000001430000014400000145000001460000014700000148000001490000014a *0000014b0000014c0000014d0000014e0000014f00000150000001510000015200000153000001 *540000015500000156000001570000000c0000000d0000000e0000000f00000010000000110000 *001200000013000000140000001500000016000000170000001c0000001d0000001e0000001f00 *000020000000210000002200000023000000240000002500000026000000270000002800000029 *0000002a0000002b0000002c0000002d0000002e0000002f000000300000003100000032000000 *330000003400000035000000360000003700000038000000390000003a0000003b0000003c0000 *003d0000003e0000003f0000004000000041000000420000004300000044000000450000004600 *00004700000048000000490000004a0000004b0000004c00000158000001590000004f00000050 *0000005100000058000000790000007a0000007b0000007c0000008c0000009800000099000000 *ab000000ac000000ad000000ae000000af000000b0000000b1000000b22d0000000e0000000f00 *00005800000099000000980000000c0000000d0000001100000010000000130000001700000016 *00000015000000140000003c0000003d0000003e0000003f000000400000004100000042000000 *4300000044000000450000003a0000003b00000046000000470000004800000049000000510000 *004f000000500000008c000000790000007a0000007b0000007c0000004a0000004b0000004c00 *0000ab000000ac000000ad000000120000000000000000015a0000000000000007030000001000 *000000000000070100000010000000000000000700000000110000000000000007000000001200 *000000000000070000000013000000000000000700000000140000000000000007030000001500 *000000000000070100000015000000000000000700000000160000000000000007000000001700 *00000000000007000000001800000000000000080300000019000000000000000b030000001a00 *0000000000000b030000001b000000000000000b030000001c000000000000000b030000001d00 *0000000000000b030000001e000000000000000b030000001f000000000000000b000000002000 *000000000000010300000021000000000000000101000000220000000000000001010000002300 *000000000000010100000024000000000000000101000000250000000000000001000000002600 *000000000000010000000027000000000000000100000000280000000000000001000000002900 *00000000000003030000002a0000000000000003030000002b0000000000000003010000002b00 *00000000000003030000002c0000000000000003000000002d0000000000000003030000002e00 *00000000000003030000002f000000000000000300000000300000000000000003000000003100 *000000000000030300000032000000000000000303000000330000000000000003030000003400 *000000000000030100000034000000000000000303000000350000000000000003000000003600 *0000000000000303000000370000000000000003010000001b0000000000000003010000001a00 *000000000000030300000038000000000000000303000000390000000000000003030000003a00 *00000000000003010000003a0000000000000003030000003b0000000000000003010000003b00 *00000000000003000000003c0000000000000003000000003d0000000000000003000000003e00 *00000000000003000000003f000000000000000300000000400000000000000004000000004100 *0000000000000c0300000042000000000000000c0000000043000000000000000c000000004400 *0000000000000c0000000045000000000000000c0000000046000000000000000c000000004700 *0000000000000c0000000048000000000000000c0000000049000000000000000c000000004a00 *0000000000000c000000004b000000000000000c000000004c000000000000000c000000004d00 *0000000000000c000000004e000000000000000c000000004f000000000000000c000000005000 *0000000000000c0000000051000000000000000d0000000052000000000000000d000000005300 *0000000000000d0000000054000000000000000503000000550000000000000005000000005600 *000000000000050000000057000000000000000500000000580000000000000005000000005900 *00000000000005030000005a0000000000000005010000005a0000000000000005030000005b00 *00000000000005010000005b0000000000000005030000005c0000000000000005010000005c00 *00000000000005030000005d0000000000000005010000005d0000000000000005000000005e00 *00000000000005000000005f000000000000000500000000600000000000000005000000006100 *000000000000050000000062000000000000000500000000630000000000000005000000006400 *000000000000050300000065000000000000000503000000660000000000000005030000006700 *000000000000050100000067000000000000000500000000680000000000000005000000006900 *00000000000005030000006a0000000000000005030000006b0000000000000005030000006c00 *00000000000005010000006d0000000000000005010000006e0000000000000005030000006f00 *000000000000050300000070000000000000000501000000700000000000000005030000007100 *000000000000050100000071000000000000000503000000720000000000000005010000007200 *000000000000050300000073000000000000000503000000740000000000000005030000007500 *000000000000050100000075000000000000000503000000760000000000000005010000007600 *000000000000050300000077000000000000000501000000770000000000000005000000007800 *0000000000000500000000790000000000000005030000007a0000000000000005010000007a00 *00000000000005030000007b0000000000000005030000007c0000000000000005010000007d00 *00000000000005010000007e0000000000000005030000007f0000000000000005000000008000 *000000000000050000000081000000000000000500000000820000000000000005000000008300 *000000000000050000000084000000000000000500000000850000000000000005000000008600 *000000000000050000000087000000000000000500000000880000000000000005000000008900 *00000000000005000000008a0000000000000005000000008b0000000000000005000000008c00 *00000000000005000000008d0000000000000005000000008e0000000000000005000000008f00 *000000000000050000000090000000000000000500000000910000000000000005000000009200 *00000000000005000000004b000000000000000500000000930000000000000005000000009400 *000000000000050000000095000000000000000500000000960000000000000005000000009700 *000000000000050000000098000000000000000500000000990000000000000005000000009a00 *00000000000005000000009b0000000000000005000000009c0000000000000005000000009d00 *00000000000005000000009e0000000000000005000000009f000000000000000500000000a000 *0000000000000500000000a1000000000000000500000000a2000000000000000500000000a300 *0000000000000500000000a4000000000000000500000000a5000000000000000f00000000a600 *0000000000000f00000000a7000000000000000f00000000a8000000000000000600000000a900 *0000000000000600000000aa000000000000000600000000ab000000000000000600000000ac00 *0000000000000600000000ad000000000000000800000000ae000000000000000800000000af00 *0000000000000800000000b0000000000000000800000000b1000000000000000800000000b200 *0000000000000800000000b3000000000000000800000000b4000000000000000800000000b500 *0000000000000800000000b6000000000000000800000000b7000000000000000800000000b800 *0000000000000800000000b9000000000000000903000000ba000000000000000900000000bb00 *0000000000000900000000bc000000000000000900000000bd000000000000000900000000b400 *0000000000000900000000be000000000000000900000000bf000000000000000a03000000c000 *0000000000000a01000000c0000000000000000a03000000c1000000000000000a01000000c100 *0000000000000a03000000c2000000000000000a01000000c3000000000000000a01000000c400 *0000000000000a00000000c5000000000000000a00000000c6000000000000000a00000000c700 *0000000000000a00000000c8000000000000000a00000000c9000000000000000b03000000ca00 *0000000000000b01000000ca000000000000000b00000000cb000000000000000b03000000cc00 *0000000000000b01000000cc000000000000000b00000000cd000000000000000b010000001c00 *0000000000000b00000000ce000000000000000b03000000cf000000000000000b01000000cf00 *0000000000000b00000000d0000000000000000b00000000d1000000000000000b00000000d200 *0000000000000b00000000d3000000000000000b03000000d4000000000000000b01000000d400 *0000000000000b00000000d5000000000000000b00000000d6000000000000000b00000000d700 *0000000000000b00000000d8000000000000000b00000000d9000000000000000403000000da00 *000000000000040100000037000000000000000400000000db000000000000000400000000dc00 *0000000000000400000000dd000000000000000400000000de000000000000000400000000df00 *0000000000000400000000e0000000000000000400000000e1000000000000000403000000e200 *0000000000000403000000e3000000000000000400000000e4000000000000000400000000e500 *0000000000000400000000e6000000000000000400000000e7000000000000000400000000e800 *0000000000000400000000e9000000000000000400000000ea000000000000000400000000eb00 *0000000000000400000000ec000000000000000400000000ed000000000000000400000000ee00 *0000000000000400000000ef000000000000000400000000f0000000000000000400000000f100 *0000000000000400000000f2000000000000000400000000f3000000000000000400000000f400 *0000000000000400000000f5000000000000000400000000f6000000000000000400000000f700 *0000000000000400000000f8000000000000000400000000f9000000000000000400000000fa00 *0000000000000400000000fb000000000000000400000000fc000000000000000400000000fd00 *0000000000000400000000fe000000000000000400000000ff0000010000000101000000010200 *00010000000103000000010400000100000001030000000105000000000000000d000000010600 *0000000000000d0000000107000000000000000d0000000108000000000000000d000000010900 *0000000000000d000000010a000000000000000d000000010b000000000000000e030000010c00 *0000000000000e010000010c000000000000000e000000010d000000000000000e000000010e00 *0000000000000e000000010f000000000000000e0000000110000000000000000e000000011100 *0000000000000e0000000112000000000000000e0000000113000000000000000e000000011400 *0000000000000e0000000115000000000000000e0000000116000000000000000e000000011700 *0000000000000e0000000118000000000000000e00000000a7000000000000000f030000011900 *0000000000000f000000011a000000000000000f000000011b000000000000000f000000011c00 *0000000000000f000000011d0000000000000006030000011e0000000000000006010000011f00 *000000000000060100000120000000000000000603000001210000000000000006010000012200 *000000000000060100000123000000000000000601000001240000000000000006030000012500 *000000000000060300000119000000000000000600000001260000000000000006000000012700 *000000000000060000000128000000000000000600000001290000012a0000012b030000012c00 *00012a0000012d030000012e0000012a0000012f03000001300000012a0000012b030000013100 *00012a0000012b03000001320000012a0000012b03000001330000012a0000012b030000013400 *00012a0000012b01000001350000012a0000012b01000001360000012a0000012b000000013700 *00012a0000012b00000001380000012a0000012b00000001390000012a0000012b000000013a00 *00012a0000012b000000013b0000012a0000012b000000013c0000012a0000012b000000013d00 *00012a0000012b000000013e0000012a0000012b000000013f0000012a0000012b000000014000 *00012a0000012b00000001410000012a0000012b00000001420000012a0000012b000000014300 *00012a0000012b00000001440000012a0000012b00000001450000012a0000012b000000014600 *00012a0000012d00000001470000012a0000012f01000001300000012a0000012f000000014800 *00012a0000012f00000001490000012a0000012f000000014a0000012a0000012f000000014b00 *00012a0000012f000000014c0000012a0000014d000000014e0000012a0000014d000000014f00 *00000000000150000000000000001568617070737461636b2d73746174652d302e352e30000000 *000000001548617070737461636b2e53746174652e5361766572000000000000000f4861707073 *7461636b2e5374617465000000000000001f48617070737461636b2e53746174652e436f6d706f *6e656e7453797374656d000000000000001b48617070737461636b2e53746174652e436f6d706f *6e656e745448000000000000001b48617070737461636b2e53746174652e5472616e7361637469 *6f6e000000000000001748617070737461636b2e53746174652e436f6e74726f6c000000000000 *001b48617070737461636b2e53746174652e53617665722e5479706573000000000000001f4861 *7070737461636b2e53746174652e53617665722e496d706c2e46696c6500000000000000214861 *7070737461636b2e53746174652e53617665722e496d706c2e4d656d6f72790000000000000020 *48617070737461636b2e53746174652e53617665722e496d706c2e517565756500000000000000 *1548617070737461636b2e53746174652e5479706573000000000000001548617070737461636b *2e53746174652e4d6f6e6164000000000000001448617070737461636b2e53746174652e557469 *6c000000000000001a48617070737461636b2e53746174652e436865636b706f696e7400000000 *0000001948617070737461636b2e53746174652e5478436f6e74726f6c000000000000000c5772 *6974657253747265616d000000000000000b777269746572436c6f736500000000000000097772 *69746572416464000000000000001377726974657241746f6d69635265706c6163650000000000 *000009777269746572437574000000000000000c52656164657253747265616d00000000000000 *0b726561646572436c6f73650000000000000009726561646572476574000000000000000e7265 *61646572476574556e637574000000000000000a5072656669784c6f636b000000000000000655 *706461746500000000000000055175657279000000000000000245760000000000000005416e79 *4576000000000000000a45706f63684d696c6c6900000000000000045478496400000000000000 *0c756e73616665494f546f45760000000000000005536176657200000000000000064d656d6f72 *7900000000000000055175657565000000000000000946696c6553617665720000000000000009 *4e756c6c5361766572000000000000000c637265617465526561646572000000000000000c6372 *65617465577269746572000000000000000a6f627461696e4c6f636b000000000000000b72656c *656173654c6f636b0000000000000007436f6c6c656374000000000000000a436f6c6c65637469 *6f6e000000000000000b53756248616e646c657273000000000000000b73756248616e646c6572 *730000000000000009436f6d706f6e656e74000000000000000c446570656e64656e6369657300 *0000000000000c696e697469616c56616c756500000000000000066f6e4c6f6164000000000000 *0011436f6d706f6e656e7456657273696f6e73000000000000000d436f6d706f6e656e74547265 *6500000000000000094d6574686f644d617000000000000000074d6574686f6473000000000000 *00076d6574686f647300000000000000064d6574686f64000000000000000a5175657279457665 *6e74000000000000000b5570646174654576656e7400000000000000033a2b3a00000000000000 *03456e64000000000000000a6d6574686f645479706500000000000000076164644974656d0000 *00000000000f636f6c6c65637448616e646c6572730000000000000010636f6c6c65637448616e *646c65727327000000000000000364757000000000000000096d6b4d6574686f64730000000000 *00000743617463684576000000000000000763617463684576000000000000000d736574557064 *61746554797065000000000000000b70726f7879557064617465000000000000000c7365745175 *65727954797065000000000000000a70726f787951756572790000000000000008617355706461 *7465000000000000000761735175657279000000000000000861736b5374617465000000000000 *000867657453746174650000000000000008707574537461746500000000000000076c69667453 *544d000000000000000373656c000000000000000a6c6f63616c53746174650000000000000010 *6c6f63616c5374617465526561646572000000000000000872756e517565727900000000000000 *0967657452616e646f6d000000000000000a67657452616e646f6d520000000000000013696e66 *65725265636f72645570646174657273000000000000000a457863657074696f6e540000000000 *0000056c6f674d54000000000000000767657454696d6500000000000000116765744576656e74 *436c6f636b54696d65000000000000000a6765744576656e744964000000000000001247657443 *6865636b706f696e7453746174650000000000000012536574436865636b706f696e7453746174 *65000000000000000d4576656e744c6f67456e74727900000000000000095478436f6e74726f6c *000000000000000863746c5361766572000000000000000d63746c4576656e7453617665720000 *00000000001063746c416c6c436f6d706f6e656e7473000000000000001463746c436f6d706f6e *656e7456657273696f6e73000000000000000b63746c4368696c6472656e000000000000000d63 *746c5072656669784c6f636b000000000000001363746c437265617465436865636b706f696e74 *000000000000000945764c6f6164657273000000000000000a45764c6f61646572732700000000 *00000005547852756e000000000000000e747850726f636573735175657565000000000000000f *74784c6173745478436f6e74657874000000000000000c50726f63657373517565756500000000 *0000000a4576656e745175657565000000000000000352657300000000000000054572726f7200 *000000000000024f6b000000000000000a52756e48616e646c6572000000000000000248520000 *00000000000349485200000000000000054576656e740000000000000002454800000000000000 *0652756e6e657200000000000000084765745374617465000000000000000b5365744e65775374 *61746500000000000000094576656e744974656d000000000000000c6576656e74436f6e746578 *7400000000000000096576656e7444617461000000000000000c456d6974496e7465726e616c00 *000000000000084576656e744d6170000000000000000c4576656e7448616e646c657200000000 *0000000c517565727948616e646c6572000000000000000d55706461746548616e646c65720000 *00000000000a54797065537472696e670000000000000007656d69745265660000000000000008 *656d697446756e63000000000000000a656d69744576656e74270000000000000009656d697445 *76656e74000000000000000e7365744e65774576656e744d6170000000000000000e6576656e74 *53747265616d526566000000000000000f696e69744576656e7453747265616d00000000000000 *0d707573684576656e744974656d000000000000000e6765744576656e7453747265616d000000 *000000000e6372656174654576656e744d6170000000000000000b65787472614576656e747300 *0000000000000d616c6c537461746554797065730000000000000011636f6d706f6e656e745665 *7273696f6e73000000000000000b636f6d706f6e656e74494f000000000000000e637265617465 *4e6577547852756e000000000000000f7365744e6577537461746554797065000000000000000c *676574537461746554797065000000000000000b7365744e65775374617465000000000000000c *7365744e6577537461746527000000000000000675706461746500000000000000057175657279 *000000000000000b717569636b517565727927000000000000001173657445764c6f6164657273 *5175657565000000000000000e72756e4f626a6563744576656e74000000000000001272756e4f *626a6563744576656e7446756e63000000000000000c72756e436f6c644576656e740000000000 *00001072756e436f6c644576656e7446756e6300000000000000126c6f6f6b75704576656e7448 *616e646c6572000000000000000c6576656e7454537472696e67000000000000000b68616e646c *654576656e74000000000000000b68616e646c655175657279000000000000000c68616e646c65 *5570646174650000000000000009636865636b44696666000000000000000d67657445706f6368 *4d696c6c69000000000000000c6e65775478436f6e746578740000000000000007616464547849 *64000000000000000f676c6f62616c52616e646f6d47656e000000000000000972756e54784c6f *6f70000000000000000b72756e547853797374656d000000000000001063726561746543686563 *6b706f696e74000000000000000e73687574646f776e53797374656d0000000000000010737461 *727453797374656d53746174650000000000000016737461727453797374656d5374617465416d *617a6f6e00000000000000087374645361766572000000000000001277616974466f725465726d *696e6174696f6e000000000000001370726f636573734c6f6767696e67466c6167730000000000 *00000474727945000000000000000663617463684500000000000000076361746368494f000000 *00000000056c6f674d46000000000000000e666f726d617446696c655061746800000000000000 *0a66696c6552656164657200000000000000087061727365416c6c000000000000000a66696c65 *577269746572000000000000000b676574416c6c46696c6573000000000000000f61746f6d6963 *577269746546696c6500000000000000106f627461696e5072656669784c6f636b000000000000 *001172656c656173655072656669784c6f636b000000000000000553746f726500000000000000 *0e6e65774d656d6f727953746f7265000000000000000c6d656d6f727952656164657200000000 *0000000c6d656d6f7279577269746572000000000000000a616464546f53746f72650000000000 *00000873657453746f7265000000000000000243680000000000000007456e636f646564000000 *00000000044974656d00000000000000034164640000000000000005436c6f7365000000000000 *000b7175657565526561646572000000000000000b717565756557726974657200000000000000 *056e65774368000000000000000777726974654368000000000000000667657443687300000000 *000000085573696e67586d6c0000000000000005756e586d6c0000000000000006536861646f77 *0000000000000008756e536861646f770000000000000004756e45760000000000000009547843 *6f6e746578740000000000000004747849640000000000000006747852616e6400000000000000 *06747854696d650000000000000008747853746447656e0000000000000003456e760000000000 *000009657652616e646f6d7300000000000000096576436f6e74657874000000000000000f696e *74656772616c52616e646f6d52000000000000000d756e7361666553544d546f45760000000000 *00000d756e73616665494f546f53544d000000000000000a4d6574686f64496e666f0000000000 *00000a6d6574686f644e616d65000000000000000a6d6574686f644b657973000000000000000d *6d6574686f64436f6e74657874000000000000000a6d6574686f6441726773000000000000000b *6d6574686f64436c61737300000000000000086d6574686f644576000000000000000c6d657468 *6f64526573756c740000000000000007437478456c656d0000000000000008437478456c656d51 *00000000000000066e756243787400000000000000106d6b4b6579436f6e73747261696e747300 *000000000000136d6b4d6574686f64436f6e73747261696e747300000000000000127375627374 *4d6574686f64436f6e7465787400000000000000066d6b54797065000000000000001567656e53 *657269616c697a65496e7374616e636573000000000000001467656e436f6d706f6e656e744861 *6e646c657273000000000000001167656e4576656e74496e7374616e6365730000000000000010 *67656e4576656e74496e7374616e636500000000000000066d6b43747874000000000000001067 *656e4d6574686f6453747275637473000000000000000f67656e4d6574686f6453747275637400 *0000000000000975707065724e616d65000000000000000a757070657246697273740000000000 *00000e6765744d6574686f64496e666f73000000000000000d6765744d6574686f64496e666f00 *0000000000000873686f77496e666f000000000000000867657454797065730000000000000009 *676574547970657327000000000000000c67657453746174654b657973000000000000000b6765 *74507265644b657973000000000000000c69734d6f6e61645374617465000000000000000d6973 *4d6f6e6164526561646572000000000000000869734d6f6e616458000000000000000a69735265 *6c6576616e740000000000000013697341636365707461626c65436f6e74657874000000000000 *00107265717569726553696d706c65436f6e0000000000000004636f6e76000000000000000b6d *746c2d312e312e302e32000000000000001a436f6e74726f6c2e4d6f6e61642e5265616465722e *436c617373000000000000000361736b0000000000000019436f6e74726f6c2e4d6f6e61642e53 *746174652e436c6173730000000000000003676574000000000000000370757400000000000000 *11646563546f53696d706c655265636f726400000000000000096e616d65546f44656300000000 *0000000773656c46756e73000000000000000775706446756e73000000000000000a6669656c64 *4e616d657300000000000000047364656600000000000000055374617465000000000000000c73 *7461746556657273696f6e000000000000000b73746174654375746f666600000000000000056c *6f674d43000000000000000c726573746f7265537461746500000000000000096c6f6164537461 *7465000000000000000a6c6f61644576656e7473000000000000000a7769746852656164657200 *0000000000000a7769746857726974657200000000000000097265616453746174650000000000 *00000a77726974655374617465000000000000000f6c6f6164436865636b706f696e7473000000 *000000000f73617665436865636b706f696e7473000000000000000f4170706c69636174696f6e *4e616d6500000000000000056c6f674d4d000000000000000f6372656174655478436f6e74726f *6c000000000000000e636c6f73655478436f6e74726f6c000000000000001172756e5478537973 *74656d416d617a6f6e0000000000000004466c616700000000000000094c6f6754617267657400 *000000000000084c6f674c6576656c000000000000000654617267657400000000000000065379 *734c6f6700000000000000065374644f7574000000000000000446696c65000000000000000a4e *756c6c4c6f6767657200000000000000127365744c6f6767696e6753657474696e677300000000 *000000076f7074696f6e73000000000000000a72656164546172676574000000000000000b6361 *73744f7074696f6e73000000000000001468617070737461636b2d646174612d302e352e300000 *00000000001848617070737461636b2e446174612e53657269616c697a65000000000000000943 *6f6e7461696e6564000000000000001648617070737461636b2e446174612e4d69677261746500 *000000000000074d696772617465000000000000001448617070737461636b2e446174612e5072 *6f7879000000000000000550726f787900000000000000064f626a656374000000000000000953 *657269616c697a6500000000000000044d6f6465000000000000000756657273696f6e00000000 *000000095072696d6974697665000000000000000956657273696f6e6564000000000000000767 *6574436f70790000000000000007707574436f707900000000000000046d6f6465000000000000 *000f636f6c6c65637456657273696f6e730000000000000007636f6e7461696e00000000000000 *0b646573657269616c697a650000000000000011646573657269616c697a654f626a6563740000 *000000000009657874656e73696f6e000000000000000a67657453616665476574000000000000 *000a6765745361666550757400000000000000086d6b4f626a656374000000000000000a6f626a *65637454797065000000000000000b70617273654f626a65637400000000000000077361666547 *6574000000000000000773616665507574000000000000000973657269616c697a650000000000 *0000076d696772617465000000000000000b617350726f787954797065000000000000000c636f *6e7374725b616e46575d000000000000000e64617461547970655b616e46565d00000000000000 *0570726f78790000000000000007756e50726f7879000000000000001a48617070737461636b2e *446174612e53657269616c697a655448000000000000000f64657269766553657269616c697a65 *000000000000001264657269766553657269616c697a65466f72 addfile ./docs/0.5.0/happstack-state/haskell_icon.gif binary ./docs/0.5.0/happstack-state/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/happstack-state/index-frames.html hunk ./docs/0.5.0/happstack-state/index-frames.html 1 + + +happstack-state-0.5.0: Event-based distributed state.

    Happstack.State
    Happstack.State.ComponentSystem
    Happstack.State.ComponentTH
    Happstack.State.Control
    Happstack.State.Saver
    Happstack.State.Transaction

    addfile ./docs/0.5.0/happstack-state/index.html hunk ./docs/0.5.0/happstack-state/index.html 1 + + +happstack-state-0.5.0: Event-based distributed state.
     happstack-state-0.5.0: Event-based distributed state.ContentsIndex
    happstack-state-0.5.0: Event-based distributed state.
    Unplug your machine and restart and have your app recover to exactly where it left off. Happstack-State spares you the need to deal with all the marshalling, consistency, and configuration headache that you would have if you used an external DBMS for this purpose. Its component model makes it easy to compose big applications from smaller reliable parts. Use event subscription to trigger IO actions and support comet-style or irc-bot applications. +
    Modules
    show/hideHappstack
    show/hideHappstack.State
    Happstack.State.ComponentSystem
    Happstack.State.ComponentTH
    Happstack.State.Control
    Happstack.State.Saver
    Happstack.State.Transaction
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-state/mini_Happstack-State-ComponentSystem.html hunk ./docs/0.5.0/happstack-state/mini_Happstack-State-ComponentSystem.html 1 + + +Happstack.State.ComponentSystem
    Happstack.State.ComponentSystem
    data End
    data h :+: t
    class UpdateEvent ev res
    class QueryEvent ev res
    data Method st
    class Methods a
    data MethodMap
    class Component a
    class SubHandlers a
    data Collection
    type Collect
    addfile ./docs/0.5.0/happstack-state/mini_Happstack-State-ComponentTH.html hunk ./docs/0.5.0/happstack-state/mini_Happstack-State-ComponentTH.html 1 + + +Happstack.State.ComponentTH
    Happstack.State.ComponentTH
    addfile ./docs/0.5.0/happstack-state/mini_Happstack-State-Control.html hunk ./docs/0.5.0/happstack-state/mini_Happstack-State-Control.html 1 + + +Happstack.State.Control addfile ./docs/0.5.0/happstack-state/mini_Happstack-State-Saver.html hunk ./docs/0.5.0/happstack-state/mini_Happstack-State-Saver.html 1 + + +Happstack.State.Saver
    Happstack.State.Saver
    addfile ./docs/0.5.0/happstack-state/mini_Happstack-State-Transaction.html hunk ./docs/0.5.0/happstack-state/mini_Happstack-State-Transaction.html 1 + + +Happstack.State.Transaction addfile ./docs/0.5.0/happstack-state/mini_Happstack-State.html hunk ./docs/0.5.0/happstack-state/mini_Happstack-State.html 1 + + +Happstack.State
    Happstack.State
    addfile ./docs/0.5.0/happstack-state/minus.gif binary ./docs/0.5.0/happstack-state/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/happstack-state/plus.gif binary ./docs/0.5.0/happstack-state/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b adddir ./docs/0.5.0/happstack-state/src addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Checkpoint.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Checkpoint.html 1 + + + + +src/Happstack/State/Checkpoint.hs + + + +
    {-# LANGUAGE CPP, TemplateHaskell, DeriveDataTypeable #-}
    +module Happstack.State.Checkpoint
    +    ( restoreState
    +    , createCheckpoint
    +    ) where
    +
    +
    +import Happstack.State.Saver
    +import Happstack.Data.Serialize
    +import Happstack.Data.SerializeTH
    +import Happstack.State.Transaction
    +
    +import Data.Typeable
    +import Data.Maybe
    +import Control.Concurrent
    +import Control.Monad
    +import Control.Exception as E
    +import qualified Data.ByteString.Lazy.Char8 as L
    +import qualified Data.Map as M
    +
    +import System.Log.Logger
    +
    +logMC :: Priority -> String -> IO ()
    +logMC = logM "Happstack.State.Checkpoint"
    +
    +{- State on disk:
    +
    +* ${TXD}/events       event files in ascending order
    +* ${TXD}/checkpoints  checkpoint files in ascending order
    +* ${TXD}/current      pointer to last checkpoint
    +
    +-}
    +
    +data State = State
    +    { stateVersion :: Int
    +    , stateCutoff  :: Int
    +    } deriving (Typeable,Show)
    +
    +instance Version State
    +$(deriveSerialize ''State)
    +
    +                       
    +
    +
    +-- FIXME: It may be nice to print out what components were saved on disk
    +--        compared to the components actually used in the application.
    +-- | Load state from disk and re-run any needed events to
    +--   fully restore the state. The returned function enables
    +--   event logging.
    +restoreState :: MVar TxControl -> IO (IO ())
    +restoreState ctlVar
    +    = withMVar ctlVar $ \ctl ->
    +      do -- Find the last saved cutoff point.
    +         mbState <- readState ctl
    +         case mbState of
    +           Nothing ->
    +               do writeState ctl (State 0 0)
    +                  -- No events to replay. Switch to real saver.
    +                  return $ do swapMVar (ctlEventSaver ctl) =<< createWriter (ctlSaver ctl) "events" 0
    +                              return ()
    +           Just state ->
    +               do let cutoff = stateCutoff state
    +                  -- Load state and replay events.
    +                  loadState ctl cutoff
    +                  offset <- loadEvents ctl cutoff
    +                  -- We use a NullSaver when replaying events. Switch to real saver.
    +                  return $ do swapMVar (ctlEventSaver ctl) =<< createWriter (ctlSaver ctl) "events" (cutoff+offset)
    +                              return ()
    +
    +-- Load state from disk.
    +loadState :: TxControl -> Int -> IO ()
    +loadState ctl cutoff
    +    = do logMC NOTICE $ "Loading components from storage."
    +         checkpoints     <- withReader ctl "checkpoints" cutoff $ loadCheckpoints
    +         forM_ (ctlAllComponents ctl) $ \stateType
    +             -> case M.lookup stateType (ctlComponentVersions ctl) of
    +                  Just versions -> forM_ versions $ \stateTypeVersion 
    +                      -> case M.lookup (L.unpack stateTypeVersion) checkpoints of
    +                           Just state -> setNewState stateType state
    +                           Nothing    -> return ()
    +                  Nothing       -> return ()
    +         -- FIXME: Prints stats about which components weren't found on disk
    +         --        and which components weren't found in the dependency tree.
    +         logMC NOTICE "All components successfully loaded"
    +
    +-- Read and execute events since last checkpoint.
    +loadEvents :: TxControl -> Int -> IO Int
    +loadEvents ctl cutoff
    +    = do logMC NOTICE "Loading events from storage"
    +         (events, offset) <- withReader ctl "events" cutoff $ readerGet
    +         -- Execute events. Events that predate the last checkpoint aren't executed.
    +         forM_ events $ \(EventLogEntry context object) -> runColdEvent context object
    +         logMC NOTICE "All events successfully replayed."
    +         return offset
    +
    +withReader :: (Serialize a) => TxControl -> String -> Int
    +                            -> (ReaderStream a -> IO c) -> IO c
    +withReader ctl key cutoff
    +    = bracket (createReader (ctlSaver ctl) key cutoff)
    +              (readerClose)
    +
    +withWriter :: (Serialize a) => TxControl -> String -> Int
    +                            -> (WriterStream a -> IO c) -> IO c
    +withWriter ctl key cutoff
    +    = bracket (createWriter (ctlSaver ctl) key cutoff)
    +              (writerClose)
    +
    +readState :: (Serialize a) => TxControl -> IO (Maybe a)
    +readState ctl
    +    = withReader ctl "current" 0 $ \s ->
    +      liftM listToMaybe $ readerGetUncut s
    +
    +writeState :: TxControl -> State -> IO ()
    +writeState ctl state
    +    = bracket (createWriter (ctlSaver ctl) "current" 0)
    +              (writerClose)
    +              (\saver -> writerAtomicReplace saver state)
    +
    +-- FIXME: Show process while loading state?
    +-- Might not be useful here since we just load the raw data.
    +-- The time consuming parsing takes place later on.
    +-- | Load a map from component types to serialized states.
    +loadCheckpoints :: ReaderStream (M.Map String L.ByteString) -> IO (M.Map String L.ByteString)
    +loadCheckpoints saver
    +    = do checkpointss <- readerGetUncut saver
    +         case checkpointss of
    +           [checkpoints] -> return checkpoints
    +           []            -> return M.empty
    +           _             -> error "Failed to read checkpoints."
    +
    +saveCheckpoints :: WriterStream (M.Map String L.ByteString) -> M.Map String L.ByteString -> IO ()
    +saveCheckpoints saver checkpoints
    +    = do mv <- newEmptyMVar
    +         writerAdd saver checkpoints (putMVar mv ())
    +         takeMVar mv
    +
    +-- Each checkpoint has a separate event queue. We don't want
    +-- to clear the queues since that would block event execution.
    +-- Hence, events may be written to the log after we make the cut
    +-- and before the state is saved. This means that some events
    +-- may need to be discarded next time the state is restored.
    +-- | Creates a checkpoint using the provided TxControl.
    +-- This checkpoint may be used as a safe state with which to start the system,
    +-- e.g. one may delete all the serialized events that took place after the last
    +-- checkpoint and start the application fresh from the checkpoint.
    +-- Calling this function manually is the only way to create checkpoints. 
    +createCheckpoint :: MVar TxControl -> IO ()
    +createCheckpoint ctlVar
    +    = withMVar ctlVar $ \ctl ->
    +      do logMC NOTICE "Initiating checkpoint."
    +         newCut <- writerCut =<< readMVar (ctlEventSaver ctl)
    +         withWriter ctl "checkpoints" newCut $ \saver ->
    +             do allStates <- mapM getState (ctlAllComponents ctl)
    +                saveCheckpoints saver (M.fromList $ zip (ctlAllComponents ctl) allStates)
    +         writeState ctl $ State {stateVersion = 0
    +                                ,stateCutoff  = newCut}
    +         logMC NOTICE "Checkpoint successfully serialized."
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-ComponentSystem.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-ComponentSystem.html 1 + + + + +src/Happstack/State/ComponentSystem.hs + + + +
    {-# LANGUAGE TypeFamilies, FlexibleContexts, FunctionalDependencies, CPP,
    +             MultiParamTypeClasses, TypeOperators, DeriveDataTypeable, GADTs #-}
    +module Happstack.State.ComponentSystem where
    +
    +import Happstack.Data.Serialize
    +import Happstack.State.Types
    +
    +import Data.Typeable
    +import qualified Data.Map as Map
    +import Data.Map (Map)
    +import Control.Monad.State.Strict
    +import qualified Data.ByteString.Lazy.Char8 as L
    +
    +--------------------------------------------------------------
    +-- Type level list
    +-------------------------------------------------------------
    +
    +-- | Equivalent of [] for type level lists.  Used for Components that have no
    +-- dependencies
    +data End = End
    +
    +-- | Type level Cons for enumerating type dependencies of a Component
    +data h :+: t = h :+: t
    +infixr 6 :+:
    +
    +
    +--------------------------------------------------------------
    +-- Event classes
    +--------------------------------------------------------------
    +
    +-- TH doesn't support type families yet.
    +class (Serialize ev, Serialize res) => UpdateEvent ev res | ev -> res
    +class (Serialize ev, Serialize res) => QueryEvent ev res | ev -> res
    +
    +--------------------------------------------------------------
    +-- Methods contain the query and update handlers for a component
    +--------------------------------------------------------------
    +
    +-- | Method is the actual type that all Updates and Querys eventually
    +-- get lifted into via 'mkMethods'.
    +data Method st where
    +    Update :: (UpdateEvent ev res) => (ev -> Update st res) -> Method st
    +    Query  :: (QueryEvent ev res) => (ev -> Query st res) -> Method st
    +
    +instance Show (Method st) where
    +    show method = "Method: " ++ methodType method
    +
    +-- | Displays the type of a Method
    +methodType :: Method t -> String
    +methodType m = case m of
    +                Update fn -> let ev :: (ev -> Update st res) -> ev
    +                                 ev _ = undefined
    +                             in show (typeOf (ev fn))
    +                Query fn  -> let ev :: (ev -> Query st res) -> ev
    +                                 ev _ = undefined
    +                             in show (typeOf (ev fn))
    +
    +-- | Class for enumerating the set of defined methods by the type of the state.
    +-- Instances should not be defined directly, but using 'mkMethods'
    +class Methods a where
    +    methods :: Proxy a -> [Method a]
    +
    +data MethodMap where
    +    MethodMap :: (Component st) => Map String (Method st) -> MethodMap
    +
    +instance Show MethodMap where
    +    show (MethodMap m) = show m
    +
    +-- | State type -> method map
    +type ComponentTree = Map String MethodMap
    +
    +-- | State type -> all versions
    +type ComponentVersions = Map String [L.ByteString]
    +
    +--------------------------------------------------------------
    +-- A component consists of a list of subcomponents, some
    +-- initiation code and some methods.
    +-- The methods are in a different class so they can be generated
    +-- separately.
    +--------------------------------------------------------------
    +-- | In order to be used as a part of Happstack's MACID state, a data type
    +-- needs to be an instance of Component.  The minimal definition is 
    +-- an initialValue and the type corresponding to the set of Dependencies.
    +-- Note that the SubHandlers condition will be automatically met if the
    +-- Dependencies is built from 'End' and ':+:' with other instances of 
    +-- Component and Methods
    +class (SubHandlers (Dependencies a),Serialize a) => Component a where
    +    type Dependencies a
    +    initialValue :: a
    +    onLoad :: Proxy a -> IO ()
    +    onLoad _ = return ()
    +
    +--------------------------------------------------------------
    +-- Class for walking the component tree.
    +--------------------------------------------------------------
    +-- | SubHandlers is used to build up the set of components corresponding to
    +-- the instance type.
    +class SubHandlers a where
    +    subHandlers :: a -> Collect ()
    +
    +-- | In correspondence with its role as [] in the type level list,
    +-- the instance for End does not add any components to the set.
    +instance SubHandlers End where
    +    subHandlers ~End = return ()
    +
    +-- | This is the instance that completes the definition of :+: and End as being
    +-- the constructors of a type level list in SubHandlers.  Note that since b
    +-- needs to be an instance of SubHandlers, the list needs to be terminated with End.
    +instance (Methods a, Component a, SubHandlers b) => SubHandlers (a :+: b) where
    +    subHandlers ~(a :+: b) = do collectHandlers' (proxy a)
    +                                subHandlers b
    +
    +
    +data Collection = Collection ComponentTree ComponentVersions [IO ()]
    +
    +addItem :: (MonadState Collection m) => 
    +           String -> MethodMap -> [L.ByteString] -> IO () -> m ()
    +addItem key item versions ioAction
    +    = do Collection tree allVersions ioActions <- get
    +         case Map.member key tree of
    +           False -> put $ Collection (Map.insert key item tree) (Map.insert key versions allVersions) (ioAction:ioActions)
    +           True  -> dup key
    +
    +type Collect = State Collection
    +
    +collectHandlers :: (Methods a, Component a) => Proxy a -> (ComponentTree, ComponentVersions, [IO ()])
    +collectHandlers prox
    +    = case execState (collectHandlers' prox) (Collection Map.empty Map.empty []) of
    +        Collection tree versions ioActions -> (tree, versions, ioActions)
    +
    +collectHandlers' :: (Methods a, Component a) => Proxy a -> Collect ()
    +collectHandlers' prox
    +    = let key = show (typeOf (unProxy prox))
    +          item = MethodMap $ Map.fromList [ (methodType m, m) | m <- methods prox ]
    +          versions = collectVersions prox
    +      in do addItem key item versions (onLoad prox)
    +            subHandlers (sub prox)
    +    where sub :: Component a => Proxy a -> Dependencies a
    +          sub _ = undefined
    +
    +-- | An error is thrown when this is evaluated.
    +dup :: String -> b
    +dup key = error $ "Duplicate component: " ++ key
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-ComponentTH.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-ComponentTH.html 1 + + + + +src/Happstack/State/ComponentTH.hs + + + +
    {-# LANGUAGE FlexibleInstances, TemplateHaskell, CPP, PatternGuards #-}
    +module Happstack.State.ComponentTH
    +    ( mkMethods
    +    ) where
    +
    +import Data.Char
    +import Language.Haskell.TH
    +
    +import Happstack.State.Types
    +import Happstack.Data.Serialize
    +import Happstack.State.ComponentSystem
    +
    +import Control.Monad.State
    +import Control.Monad.Reader
    +import Control.Monad.Writer
    +import Data.Maybe
    +
    +import Data.List
    +
    +import Data.Generics.Basics
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +type CtxElemQ = PredQ
    +type CtxElem  = Pred
    +#else
    +type CtxElemQ = TypeQ
    +type CtxElem  = Type
    +#endif
    +
    +nubCxt :: [CtxElemQ] -> Q [CtxElem]
    +nubCxt tsQ
    +    = do ts <- cxt tsQ
    +         return $ nub ts
    +
    +{-
    +  Error cases:
    +    not all state keys are tyvars.
    +    method not using the keys in either the args or the result.
    +    Checked: component not being a data declaration with a single constructor.
    +    Checked: method using a tyvar that isn't a key.
    +    Checked: method is not a function.
    +-}
    +
    +{- | This function will derive, for the provided type name and the provided
    +   list of methods, an instance of Methods for the given type and necessary
    +   instance of UpdateEvent and QueryEvent to make the provided list of functions
    +   into Methods.
    +   This TH splice needs to be executed for any MACID state type in order to 
    +   have the necessary code for event handling generated.
    +   Ex:  @$(mkMethods ''Foo ['fooUpdate,'fooQuery'])@
    +-}
    +mkMethods :: Name -> [Name] -> Q [Dec]
    +mkMethods componentName componentMethods
    +    = do keys <- liftM (requireSimpleCon componentName) $ reify componentName
    +         methodInfos <- getMethodInfos keys componentMethods
    +         ds1 <- genEventInstances methodInfos
    +         let handlers = genComponentHandlers methodInfos
    +             stType = mkType componentName keys
    +             context' = mkKeyConstraints keys ++
    +                        concatMap (mkMethodConstraints keys) methodInfos
    +         ds2 <- instanceD (nubCxt context') (appT (conT ''Methods) stType) [ funD 'methods [clause [wildP] (normalB handlers) []] ]
    +         ds4 <- genMethodStructs [''Typeable] methodInfos
    +         ds5 <- genSerializeInstances methodInfos
    +         return (ds1 ++ [ds2] ++ ds4 ++  ds5 )
    +
    +mkKeyConstraints :: [Name] -> [CtxElemQ]
    +mkKeyConstraints keys
    +    = [ mkCtxt ''Typeable (varT key) | key <- keys ] ++
    +      [ mkCtxt ''Serialize (varT key) | key <- keys ]
    +
    +mkMethodConstraints :: [Name] -> MethodInfo -> [CtxElemQ]
    +mkMethodConstraints keys method
    +    = map return (substMethodContext method keys)
    +
    +substMethodContext :: MethodInfo -> [Name] -> [CtxElem]
    +substMethodContext method keys
    +    = let relation = zip (methodKeys method) keys
    +
    +          workerT (VarT old) | Just new <- lookup old relation
    +                   = VarT new
    +          workerT (AppT l r) = AppT (workerT l) (workerT r)
    +          workerT (ForallT c names t) = ForallT c names (workerT t)
    +          workerT t = t
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +          workerP (ClassP old typs)
    +              = let new = case lookup old relation of
    +                            Nothing -> old
    +                            Just nm -> nm
    +                in ClassP new $ map workerT typs
    +          workerP p = p
    +
    +          worker = workerP
    +#else
    +          worker = workerT
    +#endif
    +
    +      in map worker (methodContext method)
    +
    +mkType :: Name -> [Name] -> TypeQ
    +mkType name args = foldl appT (conT name) (map varT args)
    +
    +genSerializeInstances :: [MethodInfo] -> Q [Dec]
    +genSerializeInstances meths
    +    = liftM concat $ forM meths $ \method ->
    +      let constraints = nubCxt $ mkKeyConstraints (methodKeys method) ++ map return (methodContext method)
    +          upperMethod = upperName (methodName method)
    +          encode = do args <- replicateM (length (methodArgs method)) (newName "arg")
    +                      lamE [conP upperMethod $ map varP args ] $
    +                           doE $ [ noBindS $ appE (varE 'safePut) (varE arg) | arg <- args] ++
    +                                 [ noBindS [| return () |] ]
    +          decode = do args <- replicateM (length (methodArgs method)) (newName "arg")
    +                      doE $ [ bindS (varP arg) (varE 'safeGet) | arg <- args] ++
    +                            [ noBindS $ appE (varE 'return) $ foldl appE (conE upperMethod) $ map varE args ]
    +      in do s <- instanceD constraints
    +                   (appT (conT ''Serialize) (mkType (upperName (methodName method)) (methodKeys method)))
    +                   [funD 'putCopy [clause [] (normalB [| contain . $(encode) |]) []]
    +                   ,funD 'getCopy [clause [] (normalB [| contain $(decode) |]) []]]
    +            v <- instanceD constraints (appT (conT ''Version) (mkType (upperName (methodName method)) (methodKeys method))) []
    +            return [s,v]
    +
    +
    +{-
    +  [ Update $ \(SetComponent c) -> setComponent c
    +  , Query $ \GetComponent -> getComponent ]
    +-}
    +genComponentHandlers :: [MethodInfo] -> ExpQ
    +genComponentHandlers meths
    +    = do let localHandlers = flip map meths $ \method ->
    +                        let upName = upperName (methodName method)
    +                        in do args <- replicateM (length (methodArgs method)) (newName "arg")
    +                              appE (conE (methodEv method)) $
    +                                lamE [conP upName (map varP args)] $ foldl appE (varE (methodName method)) $ map varE args
    +             handlers = listE localHandlers
    +         handlers
    +
    +
    +genEventInstances :: [MethodInfo] -> Q [Dec]
    +genEventInstances methodsInfo
    +    = mapM genEventInstance methodsInfo
    +
    +genEventInstance :: MethodInfo -> Q Dec
    +genEventInstance method
    +    = do let keys = methodKeys method
    +             eventType = foldl appT (conT (upperName (methodName method))) (map varT keys)
    +         instanceD (nubCxt $ [mkCtxt ''Serialize eventType
    +                             ,mkCtxt ''Serialize (return (methodResult method))
    +                             ]
    +                          ++ mkKeyConstraints keys
    +                          ++ mkMethodConstraints keys method
    +                   )
    +                   (appT (appT (conT (methodClass method)) eventType) (return (methodResult method)))
    +                   []
    +
    +mkCtxt :: Name -> TypeQ -> CtxElemQ
    +#if MIN_VERSION_template_haskell(2,4,0)
    +mkCtxt name typ = classP name [typ]
    +#else
    +mkCtxt name typ = appT (conT name) typ
    +#endif
    +
    +genMethodStructs :: [Name] -> [MethodInfo] -> Q [Dec]
    +genMethodStructs derv meths
    +    = liftM concat (mapM (genMethodStruct derv) meths)
    +
    +-- FIXME: allow class constraints on keys.
    +genMethodStruct :: [Name] -> MethodInfo -> Q [Dec]
    +genMethodStruct derv method
    +    = do let c = NormalC (upperName (methodName method)) (zip (repeat NotStrict ) (methodArgs method))
    +         return [ DataD [] (upperName (methodName method)) (map mkTyVarBndr $ methodKeys method) [c] (derv) ]
    +
    + where
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +   mkTyVarBndr = PlainTV
    +#else
    +   mkTyVarBndr = id
    +#endif
    +
    +upperName :: Name -> Name
    +upperName = mkName . upperFirst . nameBase
    +
    +upperFirst :: String -> String
    +upperFirst (x:xs) = toUpper x : xs
    +upperFirst "" = error "ComponentTH.UpperFirst []"
    +
    +data MethodInfo = Method { methodName   :: Name
    +                         , methodKeys   :: [Name]
    +                         , methodContext:: [CtxElem]
    +                         , methodArgs   :: [Type]
    +                         , methodClass  :: Name
    +                         , methodEv     :: Name
    +                         , methodResult :: Type
    +                         }
    +
    +-- get and validate method information.
    +getMethodInfos :: [Name] -> [Name] -> Q [MethodInfo]
    +getMethodInfos sessionKeys names
    +    = do ms <- mapM getMethodInfo names
    +         mapM worker ms
    +    where worker m | length (methodKeys m) /= length sessionKeys
    +                       = error $ "Inconsistent keys: " ++ pprint (methodName m) ++ ": " ++ show (sessionKeys, methodKeys m)
    +                   | otherwise = case compare (sort (methodTyVars m)) (sort (methodKeys m)) of
    +                                   EQ -> return m
    +                                   GT -> error $ "Method too general: " ++ pprint (methodName m)
    +                                   LT -> error $ "Method not general enough: " ++ pprint (methodName m)
    +          getArgKeys (AppT t1 t2) = getArgKeys t1 ++ getArgKeys t2
    +          getArgKeys (VarT key) = [key]
    +          getArgKeys _ = []
    +          methodTyVars m = nub $ concatMap getArgKeys (methodResult m:methodArgs m)
    +
    +getMethodInfo :: Name -> Q MethodInfo
    +getMethodInfo method
    +    = do methodInfo <- reify method
    +         case methodInfo of
    +           VarI _name funcType _decl _fixity -> return (getTypes funcType){methodName = method}
    +           _ -> error $ "Method is not a function: " ++ nameBase method ++ " is a " ++ showInfo methodInfo
    +
    +showInfo :: Info -> String
    +showInfo (ClassI _) = "class"
    +showInfo (TyConI _) = "type constructor"
    +showInfo (PrimTyConI _ _ _) = "primitive type constructor"
    +showInfo (DataConI _ _ _ _) = "data constructor"
    +showInfo (VarI _ _ _ _) = "variable"
    +showInfo (TyVarI _ _) = "type variable"
    +showInfo x = pprint x
    +
    +
    +-- Cases:
    +--  forall m. MonadState state m => X -> m Y
    +--  forall key. key -> Update ()
    +--  forall key m. MonadState state m => key -> m ()
    +--  X -> Ev (ReaderT state STM) Y
    +--  X -> Ev (StateT state STM) Y
    +getTypes :: Type -> MethodInfo
    +getTypes (ForallT _ contxt t) = getTypes' contxt t
    +getTypes t = getTypes' [] t
    +
    +-- FIXME: only allow type variables used by the component.
    +getTypes' :: Cxt -> Type -> MethodInfo
    +getTypes' contxt t
    +    = case runWriter (worker t) of
    +        ((keys,className, typeName, res), args) -> Method { methodName = error "Method name not set", methodKeys = keys
    +                                                          , methodContext = filter (isRelevant keys) contxt
    +                                                          , methodArgs = args [], methodClass = className
    +                                                          , methodEv = typeName, methodResult = res}
    +    where -- recursive case: A -> B
    +          worker (AppT (AppT ArrowT t1) t2)
    +              = do tell (t1:)
    +                   worker t2
    +          -- end case: Update state res  ||  Query state res
    +          worker (AppT (AppT (ConT c) state) r)
    +              | c == ''Update = return (getStateKeys state,''UpdateEvent, 'Update, r)
    +              | c == ''Query  = return (getStateKeys state,''QueryEvent, 'Query, r)
    +          -- end case: Ev (ReaderT state STM) res  ||  Ev (StateT state STM) res
    +          worker (AppT (AppT (ConT _ev) (AppT (AppT (ConT m) state) (ConT _stm))) r)
    +              | m == ''StateT  = return (getStateKeys state,''UpdateEvent, 'Update, r)
    +              | m == ''ReaderT = return (getStateKeys state,''QueryEvent, 'Query, r)
    +          -- end case: m res    (check if m is an instance of MonadState)
    +          worker (AppT name r)
    +              | Just state <- isMonadState contxt name  = return (getStateKeys state, ''UpdateEvent, 'Update, r)
    +              | Just state <- isMonadReader contxt name = return (getStateKeys state, ''QueryEvent, 'Query, r)
    +          -- error case
    +          worker c = error ("Unexpected method type: " ++ pprint c)
    +
    +getStateKeys :: Type -> [Name]
    +getStateKeys (AppT r r') = getStateKeys r ++ getStateKeys r'
    +getStateKeys (VarT key) = [key]
    +getStateKeys (ConT _st) = []
    +getStateKeys v = error $ "Bad state type: " ++ pprint v ++ " (expected a constant, an application or a type variable)"
    +
    +-- |Ignoring EqualP predicates, returns all names associated with a
    +-- context predicate
    +getPredKeys :: CtxElem -> [Name]
    +#if MIN_VERSION_template_haskell(2,4,0)
    +getPredKeys (ClassP nm typs) = nm : concatMap getStateKeys typs
    +getPredKeys _ = []
    +#else
    +getPredKeys = getStateKeys
    +#endif
    +
    +
    +isMonadState :: [CtxElem] -> Type -> Maybe Type
    +isMonadState = isMonadX ''MonadState
    +
    +isMonadReader :: [CtxElem] -> Type -> Maybe Type
    +isMonadReader = isMonadX ''MonadReader
    +
    +isMonadX :: Name -> [CtxElem] -> Type -> Maybe Type
    +#if MIN_VERSION_template_haskell(2,4,0)
    +isMonadX monadType contxt name = listToMaybe [ state | ClassP m [state,mName] <- contxt, 
    +                                         mName == name, m == monadType ]
    +#else
    +isMonadX monadType contxt name = listToMaybe [ state | AppT (AppT (ConT m) state) mName <- contxt,
    +                                         mName == name, m == monadType ]
    +#endif
    +
    +
    +
    +isRelevant :: [Name] -> CtxElem -> Bool
    +isRelevant keys p = isAcceptableContext p && any (`elem` keys) (getPredKeys p)
    +
    +isAcceptableContext :: CtxElem -> Bool
    +#if MIN_VERSION_template_haskell(2,4,0)
    +isAcceptableContext (ClassP con _) = con `notElem` [''MonadState, ''MonadReader] 
    +#else
    +isAcceptableContext (AppT r r') = isAcceptableContext r && isAcceptableContext r'
    +isAcceptableContext (ConT con) = con `notElem` [''MonadState, ''MonadReader]
    +#endif
    +isAcceptableContext _ = True
    +
    +requireSimpleCon :: Name -> Info -> [Name]
    +requireSimpleCon _ (TyConI (DataD _ _ names _ _derv)) = map conv names
    +requireSimpleCon _ (TyConI (NewtypeD _ _ names _ _derv)) = map conv names
    +requireSimpleCon _ (TyConI (TySynD _ names _)) = map conv names
    +requireSimpleCon name _ = error $ "Cannot create component from '"++pprint name++"'. Expected a data structure."
    +
    +#if MIN_VERSION_template_haskell(2,4,0)
    +conv :: TyVarBndr -> Name
    +conv (PlainTV nm) = nm
    +conv (KindedTV nm _) = nm
    +#else
    +conv = id
    +#endif
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Control.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Control.html 1 + + + + +src/Happstack/State/Control.hs + + + +
    {-# LANGUAGE CPP, EmptyDataDecls #-}
    +
    +module Happstack.State.Control
    +    ( startSystemState
    +    , startSystemStateAmazon
    +    , processLoggingFlags
    +    , stdSaver
    +    , waitForTermination
    +    ) where
    +
    +import System.Log.Logger
    +import qualified System.Log.Handler as SLH
    +import System.Log.Handler.Simple
    +import System.Log.Handler.Syslog
    +
    +import Data.Char
    +import System.Environment
    +import System.IO
    +import System.Exit
    +import System.Console.GetOpt
    +import Control.Monad.Trans
    +import Control.Concurrent
    +
    +#ifdef UNIX
    +import System.Posix.Signals hiding (Handler)
    +import System.Posix.IO ( stdInput )
    +import System.Posix.Terminal ( queryTerminal )
    +#endif
    +
    +import Happstack.State.Transaction
    +import Happstack.State.Saver
    +#ifdef REPLICATION
    +import Happstack.State.CentralLogServer (ApplicationName)
    +#endif
    +import Happstack.State.TxControl
    +import Happstack.State.ComponentSystem
    +import Happstack.Data.Proxy hiding (proxy)
    +
    +-- | Starts the MACID system without replication support.  Uses the default behavior
    +-- of saving the state into the _local directory.
    +startSystemState :: (Methods a, Component a) =>
    +                    Proxy a -> IO (MVar TxControl)
    +startSystemState proxy
    +    = do saver <- stdSaver
    +         runTxSystem saver proxy
    +
    +#ifdef REPLICATION
    +startSystemStateAmazon :: (Methods a, Component a) => ApplicationName -> Proxy a -> IO (MVar TxControl)
    +startSystemStateAmazon appName proxy
    +    = runTxSystemAmazon appName proxy
    +#else
    +type ApplicationName = String
    +startSystemStateAmazon :: (Methods a, Component a) => ApplicationName -> Proxy a -> IO (MVar TxControl)
    +startSystemStateAmazon appName proxy
    +    = runTxSystemAmazon appName proxy
    +#endif
    +
    +-- | Returns the default Saver.  It will save the application state into
    +-- the _local directory.
    +stdSaver :: IO Saver
    +stdSaver = do pn <- getProgName
    +              return $ Queue (FileSaver ("_local/" ++pn++"_state"))
    +
    +-- | Wait for a signal.
    +--   On unix, a signal is sigINT or sigTERM. On windows, the signal
    +--   is entering 'e'.
    +waitForTermination :: IO ()
    +waitForTermination
    +    = do
    +#ifdef UNIX
    +         istty <- queryTerminal stdInput
    +         mv <- newEmptyMVar
    +         installHandler softwareTermination (CatchOnce (putMVar mv ())) Nothing
    +         case istty of
    +           True  -> do installHandler keyboardSignal (CatchOnce (putMVar mv ())) Nothing
    +                       return ()
    +           False -> return ()
    +         takeMVar mv
    +#else
    +         let loop 'e' = return () 
    +             loop _   = getChar >>= loop
    +         loop 'c'
    +#endif
    +
    +data NullLogger
    +instance SLH.LogHandler NullLogger where
    +    setLevel = error "Don't do this! This logger should not be used!"
    +    getLevel = error "Don't do this! This logger should not be used!"
    +    emit = error "Don't do this! This logger should not be used!"
    +    close = error "This logger should not be used!"
    +
    +setLoggingSettings :: [Flag] -> IO ()
    +setLoggingSettings flags = do updateGlobalLogger "" (setHandlers ([] :: [NullLogger]))
    +                              s <- streamHandler stdout DEBUG
    +                              updateGlobalLogger "Happstack" (setHandlers [s] . setLevel WARNING)
    +                              mapM_ worker flags
    +    where worker (LogTarget SysLog)  = do s <- openlog "Happstack" [PID] DAEMON DEBUG -- This priority seems to be ignored?
    +                                          updateGlobalLogger "Happstack" (setHandlers [s])
    +          worker (LogTarget StdOut)  = do s <- streamHandler stdout DEBUG
    +                                          updateGlobalLogger "Happstack" (setHandlers [s])
    +          worker (LogTarget (File path)) = do s <- fileHandler path DEBUG  -- This priority seems to be ignored?
    +                                              updateGlobalLogger "Happstack" (setHandlers [s])
    +          worker (LogLevel pri) = do updateGlobalLogger "Happstack" (setLevel pri)
    +                                     rlogger <- getLogger "Happstack"
    +                                     logM "" WARNING ("Set logging priority to " ++ show (getLevel rlogger))
    +
    +-- order should not matter, though it does now.
    +-- we should ALSO allow multiple loggers at the same time! --log-target=stdout --log-target=syslog
    +options :: [OptDescr Flag]
    +options = [Option "" ["log-level"] (ReqArg (LogLevel . read . map toUpper) "level")
    +                      "Log level: DEBUG, INFO, NOTICE, WARNING, ERROR, CRITICAL, ALERT, EMERGENCY. Default: WARNING"
    +          ,Option "" ["log-target"] (ReqArg (LogTarget . readTarget) "target")
    +                      "Log target: stdout, syslog, or a FilePath such as /home/foo/bar.log . Default: stdout"
    +          ]
    +
    +data Target = File FilePath | StdOut | SysLog deriving (Read,Show,Eq,Ord)
    +
    +data Flag = LogLevel Priority | LogTarget Target deriving Show
    +
    +readTarget :: String -> Target
    +readTarget arg = case map toLower arg of
    +                   "stdout" -> StdOut
    +                   "syslog" -> SysLog
    +                   _        -> File arg
    +
    +castOptions :: [OptDescr ()]
    +castOptions = flip map options $ \(Option c f desc help) -> Option c f (worker desc) help
    +              where worker (NoArg _) = (NoArg ())
    +                    worker (ReqArg _ f) = ReqArg (const ()) f
    +                    worker (OptArg _ f) = OptArg (const ()) f
    +
    +processLoggingFlags :: IO a -> IO a
    +processLoggingFlags action = do
    +    args <- liftIO getArgs
    +    pn   <- liftIO getProgName
    +    let err n ls = -- XXX these next lines should be written to stderr!
    +                   do putStrLn ("Syntax error in command line - "++n)
    +                      putStrLn $ unlines $ map ("    "++) ls
    +                      putStrLn ("Usage "++usageInfo pn castOptions)
    +                      exitWith (ExitFailure 1)
    +    case getOpt' Permute options args of
    +      (flags,fs,args',[]) -> do setLoggingSettings flags
    +                                withArgs (fs ++ args') action
    +      (_,_,_,es)          -> err "errors" es
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Monad.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Monad.html 1 + + + + +src/Happstack/State/Monad.hs + + + +
    {-# LANGUAGE CPP, FlexibleInstances, TypeSynonymInstances,
    +    MultiParamTypeClasses #-}
    +module Happstack.State.Monad where
    +
    +import Control.Exception
    +import Control.Concurrent.STM
    +import Happstack.State.Types
    +import Happstack.Data.Proxy
    +
    +import Control.Monad.State
    +import Control.Monad.Reader
    +
    +instance (Monad m) => Monad (Ev m) where
    +    return x = Ev $ \_ -> return x
    +    fail x   = Ev $ \_ -> fail x
    +    ev >>= f = Ev $ \env -> unEv ev env >>= \x -> unEv (f x) env
    +
    +instance MonadState st (Update st) where
    +    get   = Ev $ \_ -> get
    +    put x = Ev $ \_ -> put x
    +
    +instance MonadReader st (Query st) where
    +    ask = Ev $ \_ -> ask
    +    local l (Ev cmd) = Ev $ \env -> local l (cmd env)
    +
    +instance MonadReader st (Update st) where
    +    ask = Ev $ \_ -> get
    +    local l (Ev cmd) = Ev $ \env -> StateT $ \s ->
    +                       do (r,_s') <- runStateT (cmd env) (l s)
    +                          return (r,s)
    +
    +instance (Monad m) => Functor (Ev m) where fmap = liftM
    +
    +-- | Use a proxy to force the type of an update action.
    +setUpdateType :: Proxy t -> Update t ()
    +setUpdateType _ = return ()
    +
    +-- | Forces the type of the proxy and update to match
    +proxyUpdate :: Update t b -> Proxy t -> Update t b
    +proxyUpdate f prox = setUpdateType prox >> f
    +
    +-- | Use a proxy to force the type of a query action.
    +setQueryType :: Proxy t -> Query t ()
    +setQueryType _ = return ()
    +
    +-- | Forces the type of proxy and query to match
    +proxyQuery :: Query t b -> Proxy t -> Query t b
    +proxyQuery f prox = setQueryType prox >> f
    +
    +-- | Currying version of 'setUpdateType'.
    +asUpdate :: Update t a -> Proxy t -> Update t a
    +asUpdate upd _ = upd
    +
    +-- | Currying version of 'setQueryType'.
    +asQuery :: Query t a -> Proxy t -> Query t a
    +asQuery query _ = query
    +
    +-- | Specialized version of 'ask'
    +askState :: Query st st
    +askState = ask
    +
    +-- | Specialized version of 'get'
    +getState :: Update st st
    +getState = get
    +
    +-- | Specialized version of 'put'.
    +putState :: st -> Update st ()
    +putState = put
    +
    +
    +-- | Lift an STM action into Ev.
    +liftSTM :: STM a -> AnyEv a
    +liftSTM = unsafeSTMToEv
    +
    +class CatchEv m where
    +#if __GLASGOW_HASKELL__ < 610
    +    catchEv :: Ev m a -> (Exception -> a) -> Ev m a
    +#else
    +    catchEv :: Ev m a -> (SomeException -> a) -> Ev m a
    +#endif
    +instance CatchEv (ReaderT st STM) where
    +    catchEv (Ev cmd) fun = Ev $ \s -> ReaderT $ \r -> runReaderT (cmd s) r `catchSTM` (\a -> return (fun a))
    +
    +instance CatchEv (StateT st STM) where
    +    catchEv (Ev cmd) fun = Ev $ \s -> StateT $ \r -> runStateT (cmd s) r `catchSTM` (\a -> return (fun a,r))
    +
    +instance MonadPlus m => MonadPlus (Ev m) where
    +    mzero = Ev $ \_ -> mzero
    +    mplus (Ev fn1) (Ev fn2) = Ev $ \env -> fn1 env `mplus` fn2 env
    +
    +-- | Select a part of the environment.
    +sel :: (Env -> b) -> AnyEv b
    +sel f = Ev $ \env -> return (f env)
    +
    +-- FIXME: should the users see this function?
    +-- | Run a computation with local state. Changes to state will be visible to outside.
    +localState :: (outer -> inner) -> (inner -> outer -> outer) -> Ev (StateT inner STM) a -> Ev (StateT outer STM) a
    +localState ifun ufun (Ev cmd)
    +    = Ev $ \env -> StateT $ \s ->
    +      do (r,s') <- runStateT (cmd env) (ifun s)
    +         return (r, ufun s' s)
    +
    +-- | Run a computation with local state.
    +localStateReader :: (outer -> inner) -> Ev (ReaderT inner STM) a -> Ev (ReaderT outer STM) a
    +localStateReader ifun (Ev cmd)
    +    = Ev $ \env -> ReaderT $ \s ->
    +      runReaderT (cmd env) (ifun s)
    +
    +-- | Execute a Query action in the Update monad.
    +runQuery :: Query st a -> Update st a
    +runQuery fn = Ev $ \env -> StateT $ \st ->
    +              do a <- runReaderT (unEv fn env) st
    +                 return (a,st)
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-File.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-File.html 1 + + + + +src/Happstack/State/Saver/Impl/File.hs + + + +
    {-# LANGUAGE CPP #-}
    +module Happstack.State.Saver.Impl.File
    +    ( PrefixLock
    +    , fileReader
    +    , fileWriter
    +    , obtainPrefixLock
    +    , releasePrefixLock
    +    ) where
    +
    +import Happstack.State.Saver.Types
    +import Happstack.Data.Serialize
    +
    +import Control.Concurrent
    +import Control.Exception.Extensible as E
    +import qualified Data.ByteString.Lazy as L
    +import qualified Data.ByteString as B
    +import System.Directory         ( createDirectoryIfMissing, removeFile, renameFile, doesFileExist )
    +import System.IO
    +import System.Random            ( randomIO )
    +import System.Log.Logger
    +import Text.Printf
    +import Control.Monad
    +import System.FilePath
    +import Happstack.Util.OpenExclusively (openExclusively)
    +
    +type PrefixLock = (FilePath, Handle)
    +
    +tryE :: IO a -> IO (Either SomeException a)
    +tryE = E.try
    +
    +catchE :: IO a -> (SomeException -> IO a) -> IO a
    +catchE = E.catch
    +
    +catchIO :: IO a -> (IOException -> IO a) -> IO a
    +catchIO = E.catch
    +
    +logMF :: Priority -> String -> IO ()
    +logMF = logM "Happstack.State.Saver.Impl.File"
    +
    +formatFilePath :: Int -> String -> FilePath
    +formatFilePath n str = printf "%s-%010d" str n
    +
    +fileReader :: Serialize a => FilePath -> String -> Int -> IO (ReaderStream a)
    +fileReader prefix key cutoff
    +    = do let file = prefix </> formatFilePath cutoff key
    +         tryE $ createDirectoryIfMissing True prefix
    +         return $ ReaderStream
    +                    { readerClose = return ()
    +                    , readerGet   = do logMF NOTICE "fileReader: readerGet"
    +                                       allFiles <- getAllFiles prefix key cutoff
    +                                       allData <- mapM B.readFile allFiles
    +                                       return $ (parseAll (L.fromChunks allData), length allFiles)
    +                    , readerGetUncut = do logMF NOTICE "fileReader: readerGetUncut"
    +                                          allData <- B.readFile file `catchE` \_ -> return B.empty
    +                                          return $ parseAll (L.fromChunks [allData])
    +                    }
    +
    +
    +parseAll :: Serialize a => L.ByteString -> [a]
    +parseAll = loop
    +    where loop l | L.null l = []
    +          loop l = let (a,rest) = deserialize l
    +                   in a:loop rest
    +
    +fileWriter :: Serialize a => FilePath -> String -> Int -> IO (WriterStream a)
    +fileWriter prefix key cutoffInit = do
    +  cutoffVar <- newMVar cutoffInit
    +  let getFileName = do cutoff <- readMVar cutoffVar
    +                       return $ prefix </> formatFilePath cutoff key
    +  file <- getFileName
    +  logMF NOTICE ("fileWriter: "++key++" @ "++prefix)
    +  hmv <- newMVar =<< openBinaryFile file WriteMode
    +  return $ WriterStream
    +             { writerClose = withMVar hmv hClose
    +             , writerAdd   = \m f -> do logMF NOTICE "fileWriter: saverAdd"
    +                                        withMVar hmv (\h -> L.hPut h (serialize m) >> hFlush h)
    +                                        forkIO f
    +                                        return ()
    +             , writerAtomicReplace = \ss -> do h <- takeMVar hmv
    +                                               hClose h
    +                                               file' <- getFileName
    +                                               atomicWriteFile file' (serialize ss)
    +                                               putMVar hmv =<< openBinaryFile file' AppendMode
    +             , writerCut = do h <- takeMVar hmv
    +                              hClose h
    +                              cutoff <- takeMVar cutoffVar
    +                              let file' = prefix </> formatFilePath (cutoff+1) key
    +                              putMVar cutoffVar (cutoff+1)
    +                              putMVar hmv =<< openBinaryFile file' WriteMode
    +                              return (cutoff+1)
    +                 }
    +
    +getAllFiles :: FilePath -> String -> Int -> IO [FilePath]
    +getAllFiles prefix key cutoff
    +    = loop cutoff
    +    where loop n = do let file = prefix </> formatFilePath n key
    +                      exist <- doesFileExist file
    +                      if exist then liftM (file:) (loop (n+1))
    +                               else return []
    +
    +-- | Just to avoid a dependency.
    +atomicWriteFile :: String -> L.ByteString -> IO ()
    +atomicWriteFile path string = do
    +  r <- randomIO :: IO Int
    +  let p' = path ++ ".atomic-tmp-" ++ show (abs r)
    +  L.writeFile p' string
    +  renameFile p' path
    +
    +obtainPrefixLock :: FilePath -> IO PrefixLock
    +obtainPrefixLock prefix = do
    +    createDirectoryIfMissing True prefix
    +    -- catchIO obtainLock onError
    +    catchIO obtainLock onError
    +    where fp = prefix ++ ".lock" 
    +          obtainLock = do
    +              h <- openExclusively fp
    +              return (fp, h)
    +          onError e = do
    +              putStrLn "There may already be an instance of this application running, which could result in a loss of data."
    +              putStrLn ("Please make sure there is no other application attempting to access '" ++ prefix ++ "'")
    +              throw e
    +
    +releasePrefixLock :: PrefixLock -> IO ()
    +releasePrefixLock (fp, h) = do
    +     tryE $ hClose h
    +     tryE $ removeFile fp
    +     return ()
    +
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-Memory.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-Memory.html 1 + + + + +src/Happstack/State/Saver/Impl/Memory.hs + + + +
    module Happstack.State.Saver.Impl.Memory where
    +
    +import Happstack.Data.Serialize
    +import Happstack.State.Saver.Types
    +
    +import Control.Concurrent
    +
    +import qualified Data.ByteString.Lazy.Char8 as L
    +import Data.Maybe
    +
    +import qualified Data.Map as M
    +
    +type Store = M.Map String (M.Map Int L.ByteString)
    +
    +newMemoryStore :: IO (MVar Store)
    +newMemoryStore = newMVar M.empty
    +
    +memoryReader :: Serialize a => MVar Store -> String -> Int -> IO (ReaderStream a)
    +memoryReader store key cutoff
    +    = do return $ ReaderStream
    +                    { readerClose = do return ()
    +                    , readerGet   = withMVar store $ \storeData ->
    +                                    let getAllData ((cut,_):xs) n | n > cut = getAllData xs n
    +                                        getAllData ((cut,dat):xs) n | n == cut = dat : getAllData xs (n+1)
    +                                        getAllData _ _ = []
    +                                        allData = getAllData (maybe [] M.toList $ M.lookup key storeData) cutoff
    +                                    in return $ (parseAll (L.concat allData), length allData)
    +                    , readerGetUncut = withMVar store $ \storeData ->
    +                                       return $ parseAll $ fromMaybe L.empty $ M.lookup cutoff =<< M.lookup key storeData
    +                    }
    +
    +memoryWriter :: Serialize a => MVar Store -> String -> Int -> IO (WriterStream a)
    +memoryWriter store key cutoffInit
    +    = do cutoffVar <- newMVar cutoffInit
    +         modifyMVar_ store $ \storeData -> return (addToStore key cutoffInit L.empty storeData)
    +         return $ WriterStream
    +                    { writerClose = return ()
    +                    , writerAdd   = \m f ->
    +                                    do cutoff <- readMVar cutoffVar
    +                                       modifyMVar_ store $ \storeData -> return $ addToStore key cutoff (serialize m) storeData
    +                                       forkIO f
    +                                       return ()
    +                    , writerAtomicReplace = \ss -> do cutoff <- readMVar cutoffVar
    +                                                      modifyMVar_ store $ \storeData -> return $ setStore key cutoff (serialize ss) storeData
    +                    , writerCut = do newCut <- modifyMVar cutoffVar $ \cutoff -> return (cutoff+1, cutoff+1)
    +                                     modifyMVar_ store $ \storeData -> return (addToStore key newCut L.empty storeData)
    +                                     return newCut
    +                    }
    +
    +parseAll :: Serialize a => L.ByteString -> [a]
    +parseAll = loop
    +    where loop l | L.null l = []
    +          loop l = let (a,rest) = deserialize l
    +                   in a:loop rest
    +
    +addToStore :: (Ord a, Ord b) => a -> b -> L.ByteString
    +                         -> M.Map a (M.Map b L.ByteString)
    +                         -> M.Map a (M.Map b L.ByteString)
    +addToStore key cutoff val store
    +    = M.unionWith (M.unionWith L.append) store element
    +   where element = M.singleton key $ M.singleton cutoff val
    +
    +setStore :: (Ord a) => a -> b -> c
    +                       -> M.Map a (M.Map b c)
    +                       -> M.Map a (M.Map b c)
    +setStore key cutoff val store
    +    = M.unionWith (\_ _ -> M.singleton cutoff val) store element
    +   where element = M.singleton key $ M.singleton cutoff val
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-Queue.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Saver-Impl-Queue.html 1 + + + + +src/Happstack/State/Saver/Impl/Queue.hs + + + +
    {-# LANGUAGE DeriveDataTypeable #-}
    +module Happstack.State.Saver.Impl.Queue
    +    ( queueReader
    +    , queueWriter
    +    ) where
    +
    +import Happstack.State.Saver.Types
    +import Happstack.Data.Serialize
    +
    +import Control.Concurrent.STM
    +import Control.Concurrent
    +import Control.Monad
    +import Data.Typeable
    +
    +import Data.Binary
    +
    +data Item = Close (IO ())
    +          | Add Put (IO ())
    +
    +queueReader :: ReaderStream a -> IO (ReaderStream a)
    +queueReader stream = return stream
    +
    +data Encoded = Encoded Put deriving Typeable
    +instance Version Encoded where mode = Primitive
    +instance Serialize Encoded where
    +    putCopy (Encoded out) = contain out
    +    getCopy = error "decoding from writer queue."
    +
    +-- | A saver that bunches writes.
    +queueWriter :: Serialize a => WriterStream Encoded -> IO (WriterStream a)
    +queueWriter writer = do
    +  ch   <- newCh
    +  let handler = do
    +        input <- getChs ch
    +        let il (Add p f : rest) a0 a1 = il rest (p:a0) (f:a1)
    +            il something        a0 a1 = (reverse a0, sequence_ $ reverse a1, something)
    +        let (ps,io,rest) = il input [] []
    +        when (not (null ps)) $ writerAdd writer (Encoded $ sequence_ ps) io
    +        case rest of
    +          []           -> handler
    +          (Close io':_) -> writerClose writer >> io'
    +          _            -> fail "queueSaver: Invalid saver bunch!"
    +
    +  forkIO handler
    +  return $ WriterStream
    +    { writerClose = do
    +        mv <- newEmptyMVar
    +        writeCh ch $ Close (writerClose writer >> putMVar mv ())
    +        takeMVar mv
    +    , writerAdd   = \ps fin -> writeCh ch $ Add (safePut ps) fin
    +    , writerAtomicReplace = \a -> writerAtomicReplace writer (Encoded $ safePut a)
    +    , writerCut = writerCut writer
    +    }
    +
    +
    +-- Sample variables/queues
    +newtype Ch a = Ch (TVar [a])
    +newCh :: IO (Ch a)
    +newCh = fmap Ch $ newTVarIO []
    +writeCh :: Ch a -> a -> IO ()
    +writeCh (Ch ch) x = atomically $ do vs <- readTVar ch
    +                                    writeTVar ch (x:vs)
    +
    +getChs :: Ch a -> IO [a]
    +getChs (Ch ch) = atomically $ do vs <- readTVar ch
    +                                 guard (not (null vs))
    +                                 writeTVar ch []
    +                                 return (reverse vs)
    +
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Saver-Types.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Saver-Types.html 1 + + + + +src/Happstack/State/Saver/Types.hs + + + +
    module Happstack.State.Saver.Types where
    +
    +data ReaderStream a
    +    = ReaderStream
    +    { readerClose    :: IO ()
    +    , readerGet      :: IO ([a], Int)
    +    , readerGetUncut :: IO [a]
    +    }
    +
    +data WriterStream a
    +    = WriterStream
    +    { writerClose         :: IO ()
    +    , writerAdd           :: a -> IO () -> IO ()
    +    , writerAtomicReplace :: a -> IO ()
    +    , writerCut           :: IO Int
    +    }
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Saver.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Saver.html 1 + + + + +src/Happstack/State/Saver.hs + + + +
    module Happstack.State.Saver
    +    ( module Happstack.State.Saver.Types
    +    , PrefixLock
    +    , Saver(..)
    +    , createReader
    +    , createWriter
    +    , obtainLock
    +    , releaseLock
    +    ) where
    +
    +import Control.Concurrent
    +import Happstack.State.Saver.Impl.File
    +import Happstack.State.Saver.Impl.Memory
    +import Happstack.State.Saver.Impl.Queue
    +import Happstack.State.Saver.Types
    +import Happstack.Data.Serialize
    +
    +data Saver = NullSaver        -- ^ A saver that discards all output
    +           | FileSaver String -- ^ A saver that operates on files. The parameter is the prefix for the files.
    +           | Queue Saver      -- ^ Enable queueing.
    +           | Memory (MVar Store)
    +
    +-- | Dispatches over the Saver type provided to return a 'ReaderStream' for the inferred
    +-- type. 
    +createReader :: Serialize a => Saver -> String -> Int -> IO (ReaderStream a)
    +createReader (FileSaver prefix) key cutoff = fileReader prefix key cutoff
    +createReader (Memory store) key cutoff = memoryReader store key cutoff
    +createReader (Queue saver)      key cutoff = queueReader =<< createReader saver key cutoff
    +createReader NullSaver _key _cutoff
    +    = return $ ReaderStream
    +               { readerClose = return ()
    +               , readerGet   = fail "NullSaver: readerGet"
    +               , readerGetUncut = fail "NullSaver: readerGetUncut" }
    +
    +-- | Dispatches over the Saver type provided to return a WriterStream for the
    +-- inferred type. 
    +createWriter :: Serialize a => Saver -> String -> Int -> IO (WriterStream a)
    +createWriter (FileSaver prefix) key cutoff = fileWriter prefix key cutoff
    +createWriter (Memory store) key cutoff = memoryWriter store key cutoff
    +createWriter (Queue saver)      key cutoff = queueWriter =<< createWriter saver key cutoff
    +createWriter NullSaver _key _cutoff
    +    = return $ WriterStream
    +               { writerClose = return ()
    +               , writerAdd   = \_ io -> io
    +               , writerAtomicReplace = fail "NullSaver: writerAtomicReplace"
    +               , writerCut   = fail "NullSaver: writerCut" }
    +
    +obtainLock :: Saver -> IO (Maybe PrefixLock)
    +obtainLock (Queue saver) = obtainLock saver
    +obtainLock (FileSaver prefix) = fmap Just (obtainPrefixLock prefix)
    +obtainLock _ = return Nothing
    +
    +releaseLock :: Maybe PrefixLock -> IO ()
    +releaseLock (Just lock) = releasePrefixLock lock
    +releaseLock Nothing = return ()
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Transaction.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Transaction.html 1 + + + + +src/Happstack/State/Transaction.hs + + + +
    {-# LANGUAGE CPP, TemplateHaskell, MagicHash,
    +    ExistentialQuantification, DeriveDataTypeable,
    +    GADTs, MultiParamTypeClasses #-}
    +module Happstack.State.Transaction where
    +
    +import Control.Concurrent
    +import Control.Concurrent.STM
    +import Control.Exception.Extensible
    +import Control.Monad.State
    +import Control.Monad.Reader
    +import qualified Data.Map as M
    +import qualified Data.ByteString.Lazy as L
    +import Data.IORef
    +import System.IO.Unsafe
    +import System.Random
    +import System.Time(getClockTime,ClockTime(TOD))
    +import System.Log.Logger
    +
    +import Happstack.State.ComponentSystem
    +import Happstack.State.Monad
    +import Happstack.State.Saver
    +import Happstack.Data.Serialize
    +import Happstack.Data.SerializeTH
    +import Happstack.State.Types
    +
    +import Data.Dynamic
    +import GHC.Base
    +
    +import Prelude hiding (catch)
    +
    +import qualified Data.Binary as Binary
    +
    +type ExceptionT = SomeException
    +
    +logMT :: Priority -> String -> IO ()
    +logMT = logM "Happstack.State.Transaction"
    +
    +getTime :: (Integral epochTime) => AnyEv epochTime
    +getTime = sel (fromIntegral . txTime . evContext)
    +
    +getEventClockTime :: AnyEv ClockTime
    +getEventClockTime = do 
    +  milliSeconds <- sel (txTime . evContext)
    +  let (seconds, justMilliSeconds) = (fromIntegral milliSeconds) `divMod` 1000
    +  return $ TOD seconds (justMilliSeconds * 1000000000)
    +
    +
    +
    +getEventId :: (Integral txId) => AnyEv txId
    +getEventId = sel (fromIntegral . txId . evContext)
    +
    +
    +instance Version TxContext -- Default to version 0
    +
    +$(deriveSerialize ''TxContext)
    +
    +-- Isomorphic to (), we're interested in a descriptive name.
    +data GetCheckpointState = GetCheckpointState deriving (Typeable)
    +instance Version GetCheckpointState
    +$(deriveSerialize ''GetCheckpointState)
    +
    +newtype SetCheckpointState = SetCheckpointState L.ByteString deriving (Typeable)
    +instance Version SetCheckpointState
    +$(deriveSerialize ''SetCheckpointState)
    +
    +
    +instance Version StdGen
    +instance Serialize StdGen where
    +    getCopy = contain $ liftM read safeGet
    +    putCopy = contain . safePut . show
    +
    +{- Durablity:
    +* Pending queue is TChan (TxContext, ev)
    +* Get events from the input sources in circular fashion
    +* Dump events on disk before adding to pending queue
    +* Checkpoints as follows:
    +  * check point event arrives from one of the input sources
    +  * write a new checkpoint file with:
    +    + list of pending transactions (all non-pending are out of system)
    +    + next txid
    +    + save state
    +    + rotare log files
    +  * resume transaction processing
    +
    +
    +-}
    +
    +
    +type TypeString = String
    +
    +data EventHandler where
    +    UpdateHandler :: UpdateEvent ev res =>
    +                     (TxContext -> ev -> IO res) ->
    +                     (ev -> IO res) ->
    +                     (Object -> ev) ->
    +                     EventHandler
    +    QueryHandler :: QueryEvent ev res =>
    +                    (ev -> IO res) ->
    +                    (Object -> ev) ->
    +                    EventHandler
    +
    +type EventMap = M.Map TypeString EventHandler
    +data EmitInternal = EmitInternal EventMap
    +
    +{-# NOINLINE emitRef #-}
    +emitRef :: IORef EmitInternal
    +emitRef = unsafePerformIO $ newIORef (error "Happstack not initiated")
    +
    +-- Low level function for emitting events. Very unsafe, do not expose.
    +emitFunc :: (Serialize ev, Typeable res) =>
    +            EventMap -> TypeString -> ev -> IO res
    +emitFunc eventMap eventType ev
    +     = case M.lookup eventType eventMap of
    +         Nothing -> error $ "Emitted event to unknown component. Ev: " ++ eventType
    +         Just (UpdateHandler _cold hot _parse) -> unsafeCoerce# hot ev
    +         Just (QueryHandler fn _parse) -> unsafeCoerce# fn ev
    +
    +-- Wrapper around the global emitter map. Very unsafe, do not expose.
    +-- This function is only safe through 'query' and 'update'.
    +emitEvent' :: (Serialize ev, Typeable res) => TypeString -> ev -> IO res
    +emitEvent' eventType ev
    +    = do internal <- readIORef emitRef
    +         case internal of
    +           EmitInternal eventMap -> emitFunc eventMap eventType ev
    +
    +emitEvent :: (Serialize ev, Typeable res) => ev -> IO res
    +emitEvent ev = emitEvent' (show (typeOf ev)) ev
    +
    +setNewEventMap :: EventMap -> IO ()
    +setNewEventMap eventMap
    +    = writeIORef emitRef $ EmitInternal eventMap
    +
    +data EventItem = EventItem
    +    { eventContext :: TxContext
    +    , eventData    :: Dynamic }
    +
    +{-# NOINLINE eventStreamRef #-}
    +eventStreamRef :: MVar (Chan EventItem)
    +eventStreamRef = unsafePerformIO $ newMVar $ error "eventStreamRef not initialized."
    +
    +
    +initEventStream :: IO ()
    +initEventStream = do c <- newChan
    +                     forkIO $ forever $ readChan c -- Immediately discard items from this channel.
    +                     swapMVar eventStreamRef c
    +                     return ()
    +
    +pushEventItem :: Serialize ev => TxContext -> ev -> IO ()
    +pushEventItem context ev
    +    = do c <- readMVar eventStreamRef
    +         writeChan c $ EventItem context (toDyn ev)
    +
    +getEventStream :: IO (IO EventItem)
    +getEventStream = do c <- dupChan =<< readMVar eventStreamRef
    +                    return (readChan c)
    +
    +{-
    +  Events for different components can be executed in parallel.
    +-}
    +-- Casting the event and the result type is safe. The types are kept sane due to the
    +-- EventUpdate and EventQuery classes.
    +createEventMap :: (Methods st, Component st) => MVar TxControl -> Proxy st -> IO EventMap
    +createEventMap ctlVar componentProxy
    +    = do initEventStream
    +         maps <- forM (M.elems componentTree) $ \(MethodMap m) ->
    +                 do tx <- createNewTxRun
    +                    ctl <- readMVar ctlVar
    +                    runTxLoop (ctlEventSaver ctl) (txProcessQueue tx) initialValue
    +                    return $ M.union (extraEvents tx) (M.map (eventHandler tx) m)
    +         return $ M.unions maps
    +    where (componentTree, _versions, _ioActions) = collectHandlers componentProxy
    +          eventHandler tx (Update fn)
    +              = let updateCold' ev getCxt
    +                        = do mv <- newEmptyMVar
    +                             let handler = do cxt <- getCxt
    +                                              lastCxt <- readTVar (txLastTxContext tx)
    +                                              if txId lastCxt < txId cxt
    +                                                 then do writeTVar (txLastTxContext tx) cxt
    +                                                         writeTChan (txProcessQueue tx) $ IHR cxt ev $
    +                                                           handleUpdate (putMVar mv) $ fn ev
    +                                                         return $ return ()
    +                                                 else return $ putMVar mv $ Right $ error "Cold event not executed"
    +                             join $ atomically $ handler
    +                             me <- takeMVar mv
    +                             case me of
    +                                 Left e -> throwIO e
    +                                 Right e -> return e
    +                    updateCold cxt ev = do updateCold' ev $ return cxt
    +                    updateHot ev
    +                        = do cxt <- newTxContext
    +                             updateCold' ev $ addTxId tx cxt
    +                in UpdateHandler updateCold updateHot parseObject
    +          eventHandler tx (Query fn)
    +              = let queryEmitter ev
    +                        = do mv <- newEmptyMVar
    +                             quickQuery' tx $ HR ev $ handleQuery (putMVar mv) (fn ev)
    +                             me <- takeMVar mv
    +                             case me of
    +                                 Left e -> throwIO e
    +                                 Right e -> return e
    +                in QueryHandler queryEmitter parseObject
    +
    +
    +instance QueryEvent GetCheckpointState L.ByteString
    +instance UpdateEvent SetCheckpointState ()
    +
    +extraEvents :: Serialize st => TxRun st -> EventMap
    +extraEvents tx
    +    = M.fromList [ (getStateType stateType, getStateHandler tx)
    +                 , (setNewStateType stateType, setNewStateHandler tx)
    +                 ]
    +    where t :: TxRun st -> st
    +          t _ = undefined
    +          stateType = show (typeOf (t tx))
    +          getStateHandler tx'
    +              = let fn :: GetCheckpointState -> IO L.ByteString
    +                    fn ev = do mv <- newEmptyMVar
    +                               quickQuery' tx' $ HR ev $ \context st ->
    +                                 return (Nothing, putMVar mv (serialize (context, st)))
    +                               takeMVar mv
    +                in QueryHandler fn parseObject
    +          setNewStateHandler tx'
    +              = let fn :: SetCheckpointState -> IO ()
    +                    fn (SetCheckpointState bs)
    +                        =    do ((context, newState), rest) <- evaluate $ deserialize bs
    +                                unless (L.null rest) $ error $ "Junk after checkpoint for state: " ++ stateType
    +                                mv <- newEmptyMVar
    +                                quickQuery' tx' $ HR () $ \_context _oldState ->
    +                                    return (Just newState, putMVar mv ())
    +                                takeMVar mv
    +                                atomically $ writeTVar (txLastTxContext tx') context
    +                in UpdateHandler (error "No cold setState handler") fn parseObject
    +
    +
    +allStateTypes :: (Methods a, Component a) => Proxy a -> [TypeString]
    +allStateTypes prox = let (componentTree, _versions, _ioActions) = collectHandlers prox
    +                     in M.keys componentTree
    +
    +componentVersions :: (Methods a, Component a) => Proxy a -> M.Map String [L.ByteString]
    +componentVersions prox = let (_componentTree, versions, _ioActions) = collectHandlers prox
    +                         in versions
    +
    +componentIO :: (Methods a, Component a) => Proxy a -> [IO ()]
    +componentIO prox = let (_componentTree, _versions, ioActions) = collectHandlers prox
    +                   in ioActions
    +
    +createNewTxRun :: IO (TxRun st)
    +createNewTxRun =
    +    atomically $
    +    do processQueue <- newTChan
    +       lastContext <- newTVar (TxContext 0 0 0 (mkStdGen 42))
    +       return $ TxRun processQueue lastContext
    +
    +setNewStateType :: String -> String
    +setNewStateType str = "SetNewState: " ++ str
    +
    +getStateType :: String -> String
    +getStateType str = "GetState: " ++ str
    +
    +setNewState :: TypeString -> L.ByteString -> IO ()
    +setNewState stateType state
    +    = emitEvent' (setNewStateType stateType) (SetCheckpointState state)
    +
    +setNewState' :: EventMap -> TypeString -> L.ByteString -> IO ()
    +setNewState' eventMap stateType state
    +    = emitFunc eventMap (setNewStateType stateType) (SetCheckpointState state)
    +
    +getState :: TypeString -> IO L.ByteString
    +getState stateType
    +    = emitEvent' (getStateType stateType) GetCheckpointState
    +
    +data SetNewState st = SetNewState L.ByteString deriving (Typeable)
    +data GetState st = GetState deriving (Typeable)
    +
    +instance Version (SetNewState st)
    +instance Typeable st => Serialize (SetNewState st) where
    +    putCopy (SetNewState lbs) = contain $ Binary.put lbs
    +    getCopy = contain $ liftM SetNewState Binary.get
    +instance Version (GetState st)
    +instance Typeable st => Serialize (GetState st) where
    +    putCopy GetState = contain $ return ()
    +    getCopy = contain $ return GetState
    +
    +instance Typeable st => UpdateEvent (SetNewState st) ()
    +
    +instance Typeable st => QueryEvent (GetState st) L.ByteString
    +
    +
    +
    +
    +
    +-- | Schedule an update and wait for it to complete. When this function returns, you're
    +-- guaranteed the update will be persistent.
    +update :: (MonadIO m, UpdateEvent ev res) => ev -> m res
    +update = liftIO . emitEvent
    +
    +-- | Emit a state query and wait for the result.
    +query :: (MonadIO m, QueryEvent ev res) => ev -> m res
    +query = liftIO . emitEvent
    +
    +
    +-- Execute a query immediately without giving it a unique timestamp & transaction ID.
    +quickQuery' :: (Serialize st) => TxRun st -> HR st -> IO ()
    +quickQuery' txrun (HR ev fun)
    +    = do now <- getEpochMilli
    +         atomically $
    +           do tx <- readTVar (txLastTxContext txrun)
    +              writeTChan (txProcessQueue txrun) $ IHR tx{txTime=now} ev fun
    +
    +
    +type Runner ev res = IO (IO ev, res -> IO ())
    +type EH i o = i -> IO o
    +
    +data Event = forall ev. Serialize ev => Event ev
    +
    +data IHR st = forall ev. (Serialize ev)
    +    => IHR TxContext
    +           ev
    +           (RunHandler st ev)
    +data HR st = forall ev. (Serialize ev)
    +    => HR ev
    +          (RunHandler st ev)
    +type RunHandler st ev = TxContext -> st -> IO (Maybe st, IO ())
    +data Res a = Ok a | Error ExceptionT
    +type EventQueue st = TChan (HR st) -- Queue of local event not yet given a TxContext.
    +type ProcessQueue st = TChan (IHR st) -- Queue of events to be processed. TxContext'es have been asigned at this point.
    +data TxRun st   = TxRun {txProcessQueue  :: !(ProcessQueue st)
    +                        ,txLastTxContext :: !(TVar TxContext)}
    +
    +
    +type EvLoaders' st = M.Map String (ProcessQueue st -> L.ByteString -> IO (TxId,L.ByteString))
    +type EvLoaders =  M.Map String (L.ByteString -> IO (TxId,L.ByteString))
    +
    +setEvLoadersQueue :: ProcessQueue st -> EvLoaders' st -> EvLoaders
    +setEvLoadersQueue queue = M.map (\fn -> fn queue)
    +
    +-- serialized object -> serialized response
    +runObjectEvent :: Object -> IO Object
    +runObjectEvent obj
    +    = do EmitInternal eventMap <- readIORef emitRef
    +         runObjectEventFunc obj eventMap
    +
    +runObjectEventFunc :: Object -> EventMap -> IO Object
    +runObjectEventFunc obj eventMap
    +    = do handler <- lookupEventHandler (objectType obj) eventMap
    +         case handler of
    +           -- FIXME: This will have to be filled in when doing sharding.
    +           QueryHandler{} -> error $ "Cold event was a query: " ++ objectType obj
    +           UpdateHandler _runCold runHot parse
    +               -> do res <- runHot (parse obj)
    +                     return $ mkObject res
    +
    +runColdEvent :: TxContext -> Object -> IO Object
    +runColdEvent cxt obj
    +    = do EmitInternal eventMap <- readIORef emitRef
    +         runColdEventFunc cxt obj eventMap
    +
    +runColdEventFunc :: TxContext -> Object -> EventMap -> IO Object
    +runColdEventFunc cxt obj eventMap
    +    = do handler <- lookupEventHandler (objectType obj) eventMap
    +         case handler of
    +           QueryHandler{} -> error $ "Cold event was a query: " ++ objectType obj
    +           UpdateHandler runCold _runHotObj parse
    +               -> do res <- runCold cxt (parse obj)
    +                     return $ mkObject res
    +
    +lookupEventHandler :: TypeString -> EventMap -> IO EventHandler
    +lookupEventHandler eventType eventMap
    +    = case M.lookup eventType eventMap of
    +        Nothing -> error $ "Couldn't find handler for event of type: " ++ eventType
    +        Just handler -> return handler
    +        
    +
    +eventTString :: Serialize ev => ev -> TypeString
    +eventTString ev = show (typeOf ev)
    +
    +
    +
    +handleEvent :: (st -> Env -> Ev m res -> STM intermediate) -> (st -> intermediate -> IO (Maybe st, res))
    +            -> (Either ExceptionT res -> IO ()) -> Ev m res -> RunHandler st ev
    +handleEvent runner stateCheck ofun action tx st
    +    = handle eh $
    +      do intermediate <- atomically $ runQuery'
    +         (newState, res) <- stateCheck st intermediate
    +         return (newState, ofun (Right res))
    +    where runQuery' = do rs <- newTVar (txStdGen tx)
    +                         let env = Env { evContext = tx, evRandoms = rs }
    +                         intermediate <- runner st env action
    +                         return $ intermediate
    +          eh e = do logMT ERROR ("handleEvent FAIL: "++ show e)
    +                    return (Nothing,ofun (Left e))
    +
    +handleQuery :: (Either ExceptionT res -> IO ()) -> Query st res -> RunHandler st ev
    +handleQuery = handleEvent (\st env (Ev cmd) -> runReaderT (cmd env) st) (\_st res -> return (Nothing, res))
    +
    +handleUpdate :: (Either ExceptionT res -> IO ()) -> Update st res -> RunHandler st ev
    +handleUpdate = handleEvent (\st env (Ev cmd) -> runStateT (cmd env) st) (\st (res,st') -> checkDiff st st' >>= \diff -> return (diff, res))
    +
    +{- Some updates might not modify the state.
    +   Doing a pointer-check might be worth it.
    +   (as a side note, reallyUnsafePtrEquality# is orders of magnitude faster
    +    than comparing StableNames.)
    +-}
    +checkDiff :: a -> a -> IO (Maybe a)
    +checkDiff _old new
    +    = return (Just new)
    +
    +getEpochMilli :: IO EpochMilli
    +getEpochMilli =
    +    do TOD sec pico <- getClockTime
    +       return $ fromIntegral $ sec * 1000 + pico `div` 10^9
    +
    +newTxContext :: IO TxContext
    +newTxContext = do
    +  milli <- getEpochMilli
    +  let txid = -1 -- Not set yet.
    +  sgen <- modifyMVar globalRandomGen (return . split)
    +  let (rand, sgen') = random sgen
    +  return $ TxContext txid rand milli sgen'
    +
    +addTxId :: TxRun st -> TxContext -> STM TxContext
    +addTxId tx context
    +    = do lastContext <- readTVar (txLastTxContext tx)
    +         let new = context{txId = txId lastContext + 1}
    +         writeTVar (txLastTxContext tx) new
    +         return new{txId = txId new + 1}
    +
    +{-# NOINLINE globalRandomGen #-}
    +-- XXX: why are we using a global StdGen? Isn't there already one in System.Random?
    +globalRandomGen :: MVar StdGen
    +globalRandomGen = unsafePerformIO (newMVar =<< getStdGen)
    +
    +
    +data TxControl = TxControl
    +    { ctlSaver      :: Saver           -- ^ Saver given by the user.
    +    , ctlEventSaver :: MVar (WriterStream EventLogEntry)
    +    , ctlAllComponents   :: [String]   -- ^ Types of each component used.
    +    , ctlComponentVersions :: M.Map String [L.ByteString] -- ^ Map listing all versions of a component
    +    , ctlChildren   :: [(ThreadId, MVar ())] -- 
    +    , ctlPrefixLock :: Maybe PrefixLock -- ^ Stores exclusive prefix lock (implemented in filesystem)
    +    , ctlCreateCheckpoint :: IO ()
    +    }
    +
    +data EventLogEntry = EventLogEntry TxContext Object deriving (Typeable, Show)
    +instance Version EventLogEntry
    +instance Serialize EventLogEntry where
    +    putCopy (EventLogEntry context obj) = contain $ safePut (context,obj)
    +    getCopy = contain $ 
    +              do (context, obj) <- safeGet
    +                 return $ EventLogEntry context obj
    +
    +
    +runTxLoop :: MVar (WriterStream EventLogEntry) -> ProcessQueue st -> st -> IO ()
    +runTxLoop eventSaverVar queue st0 =
    +  let loop st = do
    +      IHR context ev fun <- atomically $ readTChan queue
    +      pushEventItem context ev -- Notify the user that this event is about to be executed.
    +                               -- FIXME: What if the user wants to know when the event has
    +                               -- finished executing?
    +      let tstring = eventTString ev
    +      logMT NOTICE $ ("> Event "++show (txId context)++" of "++tstring)
    +      (mst,ra) <- fun context st
    +      case mst of
    +            -- State was not updated.
    +            --
    +            -- Thus the response can be executed immediately.
    +            Nothing  -> do forkIO $ logMT NOTICE "> pure" >> ra
    +                           loop st 
    +            -- There is a new State.
    +            --
    +            -- Note that saverAdd can return without yet writing the result
    +            -- as long as:
    +            -- 1) saverAdd calls honor the sequence in which they were made.
    +            -- 2) saverAdd calls execute the finalizers only after the value
    +            --    has been serialized. The finalizers typically return the
    +            --    result to the user so they should not be kept
    +            --    waiting too long.
    +            -- 3) This means that checkpoints need to flush the saver
    +            --    which will guarantee that all pending result/side-effects
    +            --    have been processed.
    +            -- 4) Savers must *not* block while running the finalizers
    +            Just st' -> do eventSaver <- readMVar eventSaverVar
    +                           writerAdd eventSaver (EventLogEntry context (mkObject ev)) (logMT NOTICE "> disk " >> ra)
    +                           loop st'
    +  in do forkIO $ (loop st0) `catch` (\ThreadKilled -> return ())
    +#if MIN_VERSION_base(4,2,0)
    +                            `catch` (\BlockedIndefinitelyOnSTM -> return ())
    +#else
    +                            `catch` (\BlockedIndefinitely -> return ())
    +#endif
    +        return ()
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-TxControl.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-TxControl.html 1 + + + + +src/Happstack/State/TxControl.hs + + + +
    {-# LANGUAGE CPP #-}
    +module Happstack.State.TxControl
    +    ( runTxSystem
    +    , runTxSystemAmazon
    +    , shutdownSystem
    +    , createCheckpoint
    +    ) where
    +
    +import System.Log.Logger
    +import Control.Monad
    +import Control.Exception
    +import Control.Concurrent
    +
    +import qualified Happstack.State.Checkpoint as Checkpoint
    +import Happstack.State.Saver
    +import Happstack.State.Transaction
    +
    +#ifdef REPLICATION
    +import qualified Happstack.State.CentralLogServer as LogServer
    +#endif
    +
    +import Happstack.State.ComponentSystem
    +import Happstack.Data.Proxy
    +
    +logMM :: Priority -> String -> IO ()
    +logMM = logM "Happstack.State.TxControl"
    +
    +
    +-- | Given a Saver and a Proxy, createTxControl will 
    +-- initialize a TxControl.  This does not actually start the
    +-- state system.
    +createTxControl :: (Methods state, Component state) =>
    +                   Saver -> Proxy state -> IO (MVar TxControl)
    +createTxControl saver prox
    +    = do 
    +
    +         -- The state hasn't been loaded yet. Ignore events.
    +         eventSaverVar   <- newMVar =<< createWriter NullSaver "events" 0
    +         -- obtain a prefix lock
    +         lock <- obtainLock saver
    +         newMVar $ TxControl
    +                       { ctlSaver             = saver
    +                       , ctlEventSaver        = eventSaverVar
    +                       , ctlAllComponents     = allStateTypes prox
    +                       , ctlComponentVersions = componentVersions prox
    +                       , ctlChildren          = []
    +                       , ctlPrefixLock        = lock
    +                       , ctlCreateCheckpoint  = return () }
    +
    +
    +-- | Saves the state and closes the serialization
    +closeTxControl :: MVar TxControl -> IO ()
    +closeTxControl ctlVar
    +    = do ctl <- takeMVar ctlVar
    +         writerClose =<< takeMVar (ctlEventSaver ctl)
    +         releaseLock (ctlPrefixLock ctl)
    +
    +
    +
    +-- | Run the MACID system without multimaster support and with the given Saver.
    +runTxSystem :: (Methods st, Component st) => Saver -> Proxy st -> IO (MVar TxControl)
    +runTxSystem saver stateProxy =
    +    do logMM NOTICE "Initializing system control."
    +       ctl <- createTxControl saver stateProxy
    +       -- insert code to lock based on the saver
    +       logMM NOTICE "Creating event mapper."
    +       localEventMap <- createEventMap ctl stateProxy
    +       setNewEventMap localEventMap
    +       logMM NOTICE "Restoring state."
    +       enableLogging <- Checkpoint.restoreState ctl
    +       -- Multimaster support used to be here. --
    +       enableLogging
    +       let ioActions = componentIO stateProxy
    +       logMM NOTICE "Forking children."
    +       children <- forM ioActions $ \action -> do mv <- newEmptyMVar
    +                                                  tid <- forkIO (action `finally` putMVar mv ())
    +                                                  return (tid,mv)
    +       modifyMVar_ ctl $ \c -> return c{ ctlChildren = children
    +                                       , ctlCreateCheckpoint = Checkpoint.createCheckpoint ctl }
    +       return ctl
    +
    +#ifdef REPLICATION
    +runTxSystemAmazon :: (Methods st, Component st) => LogServer.ApplicationName -> Proxy st -> IO (MVar TxControl)
    +runTxSystemAmazon appName stateProxy
    +    = do logMM NOTICE "Initializing system control"
    +         ctl <- createTxControl NullSaver stateProxy
    +         logMM NOTICE "Creating local event mapper."
    +         localEventMap <- createEventMap ctl stateProxy
    +         logMM NOTICE "Connecting to central log server."
    +         cluster <- LogServer.connectToCluster appName localEventMap
    +         logMM NOTICE "Modifying local event map."
    +         eventMap <- LogServer.changeEventMapping localEventMap cluster
    +         setNewEventMap eventMap
    +         let ioActions = componentIO stateProxy
    +         logMM NOTICE "Forking children."
    +         children <- forM ioActions $ \action -> do mv <- newEmptyMVar
    +                                                    tid <- forkIO (action `finally` putMVar mv ())
    +                                                    return (tid,mv)
    +         modifyMVar_ ctl $ \c -> return c{ ctlChildren = children
    +                                         , ctlCreateCheckpoint = LogServer.createCheckpoint ctl cluster }
    +         return ctl
    +#else
    +type ApplicationName = String -- Hm, this should actually be defined in CentralLogServer.hs
    +
    +runTxSystemAmazon :: (Methods st, Component st) => ApplicationName -> Proxy st -> IO (MVar TxControl)
    +runTxSystemAmazon appName stateProxy
    +    = error "Happstack-state has been built without replication support."
    +#endif
    +
    +
    +createCheckpoint :: MVar TxControl -> IO ()
    +createCheckpoint
    +    = join . fmap ctlCreateCheckpoint . readMVar
    +
    +-- | Shuts down a transaction system
    +shutdownSystem :: MVar TxControl -> IO ()
    +shutdownSystem ctl
    +    = do logMM NOTICE "Shutting down."
    +         children <- liftM ctlChildren $ readMVar ctl
    +         logMM NOTICE "Killing children."
    +         mapM_ (killThread . fst) children
    +         mapM_ (takeMVar . snd) children -- FIXME: Use a timeout.
    +         logMM NOTICE "Shutdown complete"
    +         closeTxControl ctl
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Types.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Types.html 1 + + + + +src/Happstack/State/Types.hs + + + +
    {-# LANGUAGE UndecidableInstances, TemplateHaskell,
    +    ExistentialQuantification, RankNTypes,
    +    FlexibleInstances, DeriveDataTypeable,
    +    ScopedTypeVariables
    + #-}
    +
    +
    +module Happstack.State.Types where
    +
    +import Control.Concurrent.STM
    +import Data.Int
    +import Data.Word
    +import qualified GHC.Conc(unsafeIOToSTM)
    +import System.Random -- (StdGen)
    +
    +import Control.Monad.State
    +import Control.Monad.Reader
    +import Data.Generics
    +-- Monad things
    +
    +
    +data Env = Env
    +    { evRandoms :: TVar StdGen
    +    , evContext :: TxContext }
    +
    +type TxId      = Int64
    +type EpochMilli= Int64
    +
    +instance Typeable StdGen where typeOf _ = mkTyConApp (mkTyCon "System.Random.StdGen") []
    +
    +instance Random Word64 where
    +  randomR = integralRandomR
    +  random = randomR (minBound,maxBound)
    +
    +instance Random Int64 where
    +  randomR = integralRandomR
    +  random = randomR (minBound,maxBound)
    +
    +integralRandomR :: (Integral a, RandomGen g) => (a,a) -> g -> (a,g)
    +integralRandomR  (a,b) g = case randomR (fromIntegral a :: Integer,
    +                                         fromIntegral b :: Integer) g of
    +                            (x,g') -> (fromIntegral x, g')
    +
    +
    +data TxContext = TxContext
    +    { txId     :: TxId,
    +      txRand   :: Word64,
    +      txTime   :: EpochMilli,
    +      txStdGen :: StdGen
    +    }  deriving (Read,Show,Typeable)
    +
    +
    +{-
    +  Is STM really be best backend monad?
    +  We don't use any of the STM features.
    +-}
    +-- | ACID computations that work with any state and event types.
    +type AnyEv a = forall t. (Monad (t STM), MonadTrans t) => Ev (t STM) a
    +
    +-- | Monad for ACID event handlers.
    +newtype Ev m t = Ev { unEv :: Env -> m t }
    +
    +instance (Typeable st, Typeable1 m) => Typeable1 (ReaderT st m) where
    +    typeOf1 x = mkTyConApp (mkTyCon "Control.Monad.Reader.ReaderT") [typeOf (undefined :: st), typeOf1 (m x)]
    +        where m :: ReaderT st m a -> m a
    +              m = undefined
    +
    +instance (Typeable st, Typeable1 m) => Typeable1 (StateT st m) where
    +    typeOf1 x = mkTyConApp (mkTyCon "Control.Monad.State.StateT") [typeOf (undefined :: st), typeOf1 (m x)]
    +        where m :: StateT st m a -> m a
    +              m = undefined
    +
    +instance (Typeable state, Typeable t) => Typeable (Ev (ReaderT state STM) t) where
    +    typeOf (Ev _cmd) = mkTyConApp (mkTyCon "Happstack.State.Types.Ev") [typeOf (u::ReaderT state STM t)]
    +        where u = undefined
    +instance (Typeable state, Typeable t) => Typeable (Ev (StateT state STM) t) where
    +    typeOf (Ev _cmd) = mkTyConApp (mkTyCon "Happstack.State.Types.Ev") [typeOf (u::StateT state STM t)]
    +        where u = undefined
    +
    +type Query state = Ev (ReaderT state STM)
    +type Update state = Ev (StateT state STM)
    +
    +-- unsafe lifting
    +
    +unsafeIOToEv :: IO a -> AnyEv a
    +unsafeIOToEv c = unsafeSTMToEv (unsafeIOToSTM c)
    +unsafeSTMToEv :: STM a -> AnyEv a
    +unsafeSTMToEv c = Ev $ \_ -> lift c
    +unsafeIOToSTM :: IO a -> STM a
    +unsafeIOToSTM = GHC.Conc.unsafeIOToSTM
    +
    +
    +
    +-- Misc
    +
    +newtype Shadow t a = Shadow { unShadow :: a }  deriving Typeable
    +
    +newtype UsingXml a = UsingXml { unXml :: a } deriving Typeable
    +
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State-Util.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State-Util.html 1 + + + + +src/Happstack/State/Util.hs + + + +
    {-# LANGUAGE TemplateHaskell, CPP #-}
    +module Happstack.State.Util
    +    ( -- * Random numbers
    +     getRandom, getRandomR,
    +      -- * TH helpers
    +     inferRecordUpdaters
    +    ) where
    +
    +import Control.Concurrent.STM
    +import System.Random
    +
    +import Happstack.State.Monad
    +import Happstack.State.Types
    +
    +import Data.Char(toUpper)
    +import Language.Haskell.TH
    +
    +
    +-- Random numbers
    +
    +-- | Get a random number.
    +getRandom :: Random a => AnyEv a
    +getRandom = do r <- sel evRandoms
    +               g <- liftSTM $ readTVar r
    +               let (x,g') = random g
    +               liftSTM $ writeTVar r g'
    +               return x
    +
    +-- | Get a random number inside the range.
    +getRandomR :: Random a => (a,a) -> AnyEv a
    +getRandomR z = do r <- sel evRandoms
    +                  g <- liftSTM $ readTVar r
    +                  let (x,g') = randomR z g
    +                  liftSTM $ writeTVar r g'
    +                  return x
    +
    +--------------------------------------------------------------
    +-- inferRecordUpdater
    +--------------------------------------------------------------
    +
    +
    +-- FIXME: Throw a decent error message if the input isn't a record.
    +-- | Infer updating functions for a record.  Given a data declaration
    +-- of @data Foo = Foo {bar :: String, baz :: Int}@ then @$(inferRecordUpdaters ''Foo)@
    +-- will define functions @a_bar :: String -> Foo -> Foo@, @withBar :: Update String a -> Update Foo a@,
    +-- etc. that can be used as convenience updaters.  
    +inferRecordUpdaters :: Name -> Q [Dec]
    +inferRecordUpdaters typeName = do
    +    con <- decToSimpleRecord =<< nameToDec typeName
    +    let c name upd s = 
    +            do let un = mkName ("a_"++ns)
    +                   wn = mkName ("with"++(toUpper (head ns):tail ns))
    +                   ns = nameBase name
    +               ud <- un `sdef` upd
    +               wd <- wn `sdef` (varE 'localState `appE` s `appE` varE un)
    +               return [ud, wd]
    +    xs <- sequence $ zipWith3 c (fieldNames con) (updFuns con) (selFuns con)
    +    return $ concat xs
    +
    +
    +-- Utilities
    +
    +decToSimpleRecord :: Dec -> Q Con
    +decToSimpleRecord (DataD _ _ _ [con] _)  = return con
    +decToSimpleRecord (DataD _ n _ _     _)  =
    +    fail ("Not a simple record (has multiple constructors): "++show n)
    +decToSimpleRecord (NewtypeD _ _ _ con _) = return con
    +decToSimpleRecord x = fail ("Wanted a simple record, got: "++show x)
    +
    +nameToDec :: Name -> Q Dec
    +nameToDec ty = reify ty >>= un
    +    where un (TyConI d) = return $ d
    +          un _          = fail "nameToDec: expected TyCon"
    +
    +-- | Create a list of selection functions for a record.
    +selFuns :: Con -> [ExpQ]
    +selFuns (RecC _ ts) = [ varE n | (n,_,_) <- ts ]
    +selFuns _ = error "Constructors other than RecC not handled in selFuns"
    +
    +-- | Create a list of update functions for a record.
    +updFuns :: Con -> [ExpQ]
    +updFuns (RecC _ ts) = [ upd n | (n,_,_) <- ts ]
    +    where [x,y] = map mkName ["x","y"]
    +          upd f = lamE [varP x, varP y] $ rup f
    +          rup f = recUpdE (varE y) [return (f,VarE x)]
    +updFuns _ = error "Constructors other than RecC not handled in updFuns"
    +
    +-- | Return field names
    +fieldNames :: Con -> [Name]
    +fieldNames (RecC _ ts) = [ n | (n,_,_) <- ts ]
    +fieldNames _ = error "Constructors other than RecC not handled in fieldNames"
    +
    +-- | Simple definition
    +sdef :: Name -> ExpQ -> DecQ
    +sdef vn ve = valD (varP vn) (normalB ve) []
    +
    +
    +--------------------------------------------------------------
    +-- inferRecordUpdater end
    +--------------------------------------------------------------
    +
    + addfile ./docs/0.5.0/happstack-state/src/Happstack-State.html hunk ./docs/0.5.0/happstack-state/src/Happstack-State.html 1 + + + + +src/Happstack/State.hs + + + +
    module Happstack.State
    +    (-- * ACID monad
    +     Ev, AnyEv,
    +     TxControl, query, update, Update, Query,
    +     -- * Types
    +     TxId, EpochMilli, Saver(..),
    +     -- * Misc utilities
    +     module Happstack.State.Monad,
    +     getEventId, getTime, getEventClockTime, getEventStream, EventItem(..),
    +     module Happstack.State.Util,
    +     -- * Serialization
    +     module Happstack.Data.Serialize,
    +     module Happstack.Data.SerializeTH,
    +
    +     module Happstack.State.Control,
    +     module Happstack.State.ComponentTH,
    +     module Happstack.State.ComponentSystem,
    +     --closeTxControl,
    +     runTxSystem,
    +     createCheckpoint,
    +     shutdownSystem,
    +     -- * Unsafe things
    +     unsafeIOToEv
    +    ) where
    +
    +
    +import Happstack.State.Monad
    +import Happstack.State.Saver
    +import Happstack.Data.Serialize
    +import Happstack.Data.SerializeTH
    +import Happstack.State.Transaction
    +import Happstack.State.ComponentSystem
    +import Happstack.State.Types
    +import Happstack.State.Util
    +import Happstack.State.ComponentTH
    +import Happstack.State.TxControl
    +import Happstack.State.Control
    +
    + addfile ./docs/0.5.0/happstack-state/src/hscolour.css hunk ./docs/0.5.0/happstack-state/src/hscolour.css 1 +.hs-keyglyph, .hs-layout {color: red;} +.hs-keyword {color: blue;} +.hs-comment, .hs-comment a {color: green;} +.hs-str, .hs-chr {color: teal;} +.hs-keyword, .hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {} adddir ./docs/0.5.0/happstack-util addfile ./docs/0.5.0/happstack-util.haddock binary ./docs/0.5.0/happstack-util.haddock oldhex * newhex *0d0cface000f00008d08000080f774000000000000000000000001000000010000000000000001 *000000020000000000000002000000030000000000000002000000040000000000000003000000 *050000000000000004000000060000000000000004000000070000000000000004000000080000 *0000000000040000000900000000000000040000000a00000000000000040000000b0000000000 *0000040000000c00000000000000040000000d00000000000000040000000e0000000000000004 *0000000f0000000000000004000000100000000000000004000000110000000000000005000000 *120000000000000005000000130000000000000006000000140000000000000006000000150000 *000000000006000000160000000000000006000000170000000000000007000000180000000000 *0000080000001900000000000000080000001a00000000000000080000001b0000000000000008 *0000001c00000000000000080000001d00000000000000080000001e0000000000000008000000 *1f0000000000000008000000200000000000000008000000210000000000000008000000220000 *000000000008000000230000000000000009000000240000000000000009000000250000000000 *000009000000260000000000000009000000270000000000000009000000280000000000000009 *0000002900000000000000090000002a000000000000000a0000002b000000000000000a000000 *2c000000000000000a0000002d000000000000000a0000002e000000000000000a0000002f0000 *00000000000a00000030000000000000000a00000031000000000000000a000000320000000000 *00000a00000033000000000000000a00000034000000000000000a00000035000000000000000a *00000036000000000000000a00000037000000000000000a00000038000000000000000a000000 *39000000000000000a0000003a000000000000000a0000003b000000000000000a0000003c0000 *00000000000a0000003d000000000000000a0000003e000000000000000a0000003f0000000000 *00000a00000040000000000000000a00000041000000000000000a00000042000000000000000a *00000043000000000000000a00000044000000000000000a00000045000000000000000a000000 *46000000000000000a00000047000000000000000a00000048000000000000000b000000490000 *00000000000b0000004a000000000000000b0000004b000000000000000b0000004c0000000000 *00000b0000004d000000000000000c0000004e000000000000000d0000004f000000000000000d *00000050000000000000000d00000051000000000000000d00000052000000000000000d000000 *53000000000000000d00000054000000000000000d00000055000000000000000d000000560000 *00000000000d00000057000000000000000e00000058000000000000000e000000590000000000 *00000e0000005a000000000000000f0000005b000000000000000f0000005c0000000000000010 *0000005d00000000000000100000005e00000000000000100000005f0000000000000010000000 *600000000000000011000000610000000000000011000000620000000000000011000000630000 *000000000011000000640000000000000011000000650000000000000011000000660000000000 *000011000000670000000000000011000000680000000000000011000000690000000000000011 *0000006a00000000000000110000006b00000000000000110000006c0000000000000011000000 *6d00000000000000110000006e00000000000000110000006f0000000000000011000000700000 *000000000012000000710000000000000012000000720000000000000012000000730000000000 *000013130000000000000001000000001100000074000000000075000000000076010301023b00 *00004d0000006f0000006e0000006100000064000000690000006300000020000000630000006f *0000006e0000007400000061000000690000006e00000065000000720000002000000066000000 *6f000000720000002000000066000000690000006c0000006500000020000000690000006e0000 *00660000006f000000720000006d0000006100000074000000690000006f0000006e0000002c00 *000020000000610000006c0000006c0000006f00000077000000690000006e0000006700000020 *000000660000006f0000007200000020000000630000006c00000065000000610000006e000000 *0a01022900000020000000630000006f0000006e00000073000000740000007200000075000000 *6300000074000000690000006f0000006e000000200000006f0000006600000020000000630000 *006f0000006d00000062000000690000006e00000061000000740000006f000000720000007300 *00002e000000200000002000000057000000720000006100000070000000730000002000000074 *0000006800000065000000200104020000007700000078010211000000200000006d0000006f00 *00006e00000061000000640000002c000000200000006200000075000000740000002000000064 *0000006f00000065000000730000006e01020100000027010202000000740000000a0102070000 *0020000000610000006c0000006c0000006f000000770000002001040100000079010204000000 *200000006f00000072000000200104010000007a02020000002e0000000a000000007b00000000 *007c00000000007d0103023b000000490000006e000000660000006f000000720000006d000000 *6100000074000000690000006f0000006e00000020000000630000006f0000006c0000006c0000 *006500000063000000740000006500000064000000200000006400000075000000720000006900 *00006e000000670000002000000074000000680000006500000020000000740000007200000061 *00000076000000650000007200000073000000610000006c000000200000006f00000066000000 *2000000061000000200000006400000069000000720000006500000063000000740000006f0000 *0072000000790000002e0000000a000000007e00000000007f0103020a00000066000000690000 *006c0000006500000020000000700000006100000074000000680000000a000000008001030218 *00000063000000750000007200000072000000650000006e000000740000002000000072000000 *6500000063000000750000007200000073000000690000006f0000006e00000020000000640000 *00650000007000000074000000680000000a00000000810103020f000000730000007400000061 *000000740000007500000073000000200000006f00000066000000200000006600000069000000 *6c000000650000000a0000000082010301020c000000430000006f0000006e0000007300000074 *000000720000007500000063000000740000002000000061000000200104020000007e0000007d *02080000002000000076000000610000006c00000075000000650000002e0000000a0000000083 *01010301020e00000052000000750000006e000000200000007400000068000000650000002000 *0000670000006900000076000000650000006e000000200104010000007601020e000000200000 *006f0000006e000000200000007400000068000000650000002000000067000000690000007600 *0000650000006e000000200104020000007e0000007d01021000000020000000610000006e0000 *00640000002000000072000000650000007400000075000000720000006e000000200000006900 *000074000000730000000a01024300000020000000720000006500000073000000750000006c00 *0000740000002e0000002000000020000000540000006800000069000000730000002000000063 *000000610000006e00000020000000620000006500000020000000750000007300000065000000 *66000000750000006c00000020000000690000006600000020000000790000006f000000750000 *002000000061000000720000006500000020000000770000007200000069000000740000006900 *00006e0000006700000020000000610000002000000066000000750000006e0000006300000074 *000000690000006f0000006e00000020000000740000006f000000200000007000000061000000 *73000000730000000a01020400000020000000740000006f00000020010204000000660000006f *0000006c0000006402020000002e0000000a010302090000004500000078000000610000006d00 *0000700000006c000000650000003a0000000a07010222000000200000006d0000007900000046 *0000006f0000006c0000006400000046000000750000006e00000063000000200000003a000000 *3a0000002000000061000000200000002d0000003e0000002000000046000000690000006c0000 *0065000000490000006e000000660000006f000000200000002d0000003e000000200000006100 *00000a010246000000200000006d00000079000000460000006f0000006c000000640000004600 *0000750000006e0000006300000020000000610000002000000069000000200000003d00000020 *0000006c0000006500000074000000200000007500000073000000650000005400000068000000 *690000007300000046000000690000006c00000065000000200000003d00000020000000650000 *0076000000610000006c000000430000006c000000610000007500000073000000650000002000 *00002800000066000000690000006c000000650000004e000000610000006d0000006500000020 *0000003d0000003d0000003f0000002000000022000000660000006f0000006f00000022000000 *2900000020000000690000000a0102240000002000000020000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *00200000002000000020000000690000006e000000200000006900000066000000200000007500 *000073000000650000005400000068000000690000007300000046000000690000006c00000065 *0000000a0102270000002000000020000000200000002000000020000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *200000002000000020000000200000007400000068000000650000006e00000020000000660000 *006900000064000000640000006c00000065000000570000006900000074000000680000002000 *0000610000000a021c000000200000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *000020000000200000002000000020000000650000006c00000073000000650000002000000061 *0000000a0000000084000000000085010301023b0000004c000000690000007300000074000000 *200000007400000068000000650000002000000066000000690000006c00000065000000730000 *0020000000690000006e0000002000000074000000680000006500000020000000670000006900 *000076000000650000006e00000020000000640000006900000072000000650000006300000074 *0000006f00000072000000790000002c00000020000000730000006f0000007200000074000000 *65000000640000002c00000020000000610000006e000000640000002000000077000000690000 *0074000000680000006f000000750000007400000020010201000000220102010000002e010201 *000000220102010000000a010204000000200000006f0000007200000020010201000000220102 *020000002e0000002e0102010000002202020000002e0000000a0000000086010301023f000000 *530000006500000061000000720000006300000068000000200000006100000020000000640000 *0069000000720000006500000063000000740000006f0000007200000079000000200000007200 *000065000000630000007500000072000000730000006900000076000000650000006c00000079 *0000002c0000002000000077000000690000007400000068000000200000007200000065000000 *63000000750000007200000073000000690000006f0000006e00000020000000630000006f0000 *006e00000074000000720000006f0000006c0000006c0000006500000064000000200000006200 *00007900000020000000610000000a010201000000200104010000007401022c0000002e000000 *20000000200000004c000000610000007a000000690000006c0000007900000020000000720000 *00650000007400000075000000720000006e000000200000006100000020000000730000006f00 *000072000000740000006500000064000000200000006c00000069000000730000007400000020 *0000006f0000006600000020000000610000006c0000006c000000200000006600000069000000 *6c00000065000000730000000a010214000000200000006d000000610000007400000063000000 *68000000690000006e000000670000002000000074000000680000006500000020000000670000 *006900000076000000650000006e000000200104010000007501021d0000002e00000020000000 *20000000410000006e00000079000000200000006500000072000000720000006f000000720000 *00730000002000000074000000680000006100000074000000200000006f000000630000006300 *00007500000072000000200000006100000072000000650000000a022200000020000000640000 *0065000000610000006c0000007400000020000000770000006900000074000000680000002000 *000062000000790000002000000074000000680000006500000020000000670000006900000076 *000000650000006e0000002000000068000000610000006e000000640000006c00000065000000 *720000002e0000000a05000000000000000003020e0000006500000072000000720000006f0000 *00720000002000000068000000610000006e000000640000006c00000065000000720000000a00 *00000000000001030226000000630000006f0000006e00000074000000720000006f0000006c00 *000020000000720000006500000063000000750000007200000073000000690000006f0000006e *00000020000000690000006e000000740000006f00000020000000730000007500000062000000 *6400000069000000720000006500000063000000740000006f0000007200000069000000650000 *00730000000a000000000000000203022c00000064000000650000006300000069000000640000 *006500000020000000770000006800000065000000740000006800000065000000720000002000 *0000610000002000000066000000690000006c0000006500000020000000610000007000000070 *0000006500000061000000720000007300000020000000690000006e0000002000000074000000 *680000006500000020000000720000006500000073000000750000006c000000740000000a0000 *00000000000303021d0000006400000069000000720000006500000063000000740000006f0000 *00720000007900000020000000740000006f000000200000007300000074000000610000007200 *00007400000020000000730000006500000061000000720000006300000068000000690000006e *000000670000000a00000000000000040301021700000066000000690000006c00000065000000 *730000002000000074000000680000006100000074000000200000006d00000061000000740000 *006300000068000000650000006400000020000000740000006800000065000000200104010000 *007502010000000a00000000010301023f00000053000000650000006100000072000000630000 *006800000020000000610000002000000064000000690000007200000065000000630000007400 *00006f000000720000007900000020000000720000006500000063000000750000007200000073 *0000006900000076000000650000006c000000790000002c000000200000007700000069000000 *740000006800000020000000720000006500000063000000750000007200000073000000690000 *006f0000006e00000020000000630000006f0000006e00000074000000720000006f0000006c00 *00006c000000650000006400000020000000620000007900000020000000610000000a01020100 *0000200104010000007401022c0000002e00000020000000200000004c000000610000007a0000 *00690000006c000000790000002000000072000000650000007400000075000000720000006e00 *0000200000006100000020000000730000006f0000007200000074000000650000006400000020 *0000006c000000690000007300000074000000200000006f000000660000002000000061000000 *6c0000006c0000002000000066000000690000006c00000065000000730000000a010214000000 *200000006d00000061000000740000006300000068000000690000006e00000067000000200000 *0074000000680000006500000020000000670000006900000076000000650000006e0000002001 *04010000007501021d0000002e0000002000000020000000410000006e00000079000000200000 *006500000072000000720000006f00000072000000730000002000000074000000680000006100 *000074000000200000006f00000063000000630000007500000072000000200000006100000072 *000000650000000a0102230000002000000069000000670000006e0000006f0000007200000065 *000000640000002c00000020000000770000006900000074000000680000002000000077000000 *61000000720000006e000000690000006e00000067000000730000002000000070000000720000 *00690000006e00000074000000650000006400000020000000740000006f000000200104010000 *008702020000002e0000000a040000000000000000030226000000630000006f0000006e000000 *74000000720000006f0000006c0000002000000072000000650000006300000075000000720000 *0073000000690000006f0000006e00000020000000690000006e000000740000006f0000002000 *00007300000075000000620000006400000069000000720000006500000063000000740000006f *000000720000006900000065000000730000000a000000000000000103022c0000006400000065 *000000630000006900000064000000650000002000000077000000680000006500000074000000 *68000000650000007200000020000000610000002000000066000000690000006c000000650000 *002000000061000000700000007000000065000000610000007200000073000000200000006900 *00006e000000200000007400000068000000650000002000000072000000650000007300000075 *0000006c000000740000000a000000000000000203021d00000064000000690000007200000065 *00000063000000740000006f000000720000007900000020000000740000006f00000020000000 *730000007400000061000000720000007400000020000000730000006500000061000000720000 *006300000068000000690000006e000000670000000a0000000000000003030102170000006600 *0000690000006c0000006500000073000000200000007400000068000000610000007400000020 *0000006d0000006100000074000000630000006800000065000000640000002000000074000000 *6800000065000000200104010000007502010000000a000000010103010217000000550000006e *000000630000006f0000006e000000640000006900000074000000690000006f0000006e000000 *610000006c0000006c000000790000002000000072000000650000007400000075000000720000 *006e000000200104010000008802020000002e0000000a00020000000000000001020000000100 *0000000002000000000000000001000000000000000002000000000200000002010301020b0000 *0056000000650000007200000073000000690000006f0000006e000000200000006f0000006600 *000020010401000000890102170000002000000074000000680000006100000074000000200000 *0074000000610000006b000000650000007300000020000000690000006e000000200000006100 *00002000000051000000200000005b0000004400000065000000630102010000005d0102140000 *0020000000690000006e0000007300000074000000650000006100000064000000200000006f00 *0000660000002000000061000000200000005b0000005100000020000000440000006500000063 *0102010000005d0102010000000a023a00000020000000610000006e0000006400000020000000 *66000000690000006c00000074000000650000007200000073000000200000006f000000750000 *0074000000200000007300000069000000670000006e0000006100000074000000750000007200 *000065000000730000002000000066000000720000006f0000006d000000200000007400000068 *00000065000000200000006c000000690000007300000074000000200000006f00000066000000 *200000006400000065000000630000006c00000061000000720000006100000074000000690000 *006f0000006e000000730000000a00000000030103023300000052000000650000007400000075 *000000720000006e00000073000000200000007400000072000000750000006500000020000000 *690000006600000020000000740000006800000065000000200000004400000065000000630000 *00200000006d000000610000007400000063000000680000006500000073000000200000006100 *0000200000005300000069000000670000004400000020000000630000006f0000006e00000073 *00000074000000720000007500000063000000740000006f000000720000000a00020000000200 *000003020000000200000003000200000002000000000300000000000000000300000000010000 *000400000100000004010000000400010000000400000000000000000400010d0000006c000000 *690000006e00000075000000780000002f00000077000000690000006e000000640000006f0000 *007700000073010b00000070000000720000006f00000076000000690000007300000069000000 *6f0000006e000000610000006c010d0000004d0000006100000074000000740000006800000065 *0000007700000020000000450000006c0000006400000065000000720a0000000900000000000a *00000000000b0103020e0000005400000068000000650000002000000073000000650000006e00 *00006400000065000000720000002800000073000000290000000a000000000c01030211000000 *540000006800000065000000200000007200000065000000630000006900000070000000690000 *00650000006e000000740000002800000073000000290000000a000000000d0103021100000054 *0000006800000065000000200000007300000075000000620000006a0000006500000063000000 *74000000200000006c000000690000006e000000650000000a000000000e010302090000005400 *0000680000006500000020000000620000006f00000064000000790000000a000000008a000000 *00008b00000000000f0103026200000053000000690000006d000000700000006c000000650000 *0073000000740000002000000077000000610000007900000020000000740000006f0000002000 *000073000000650000006e00000064000000200000006d00000061000000690000006c0000002e *000000200000002000000054000000610000006b00000065000000730000002000000074000000 *680000006500000020000000730000006d000000610000007200000074000000680000006f0000 *0073000000740000002000000069000000700000002c0000002000000074000000680000006500 *00002000000048000000450000004c0000004f00000020000000640000006f0000006d00000061 *000000690000006e0000002c00000020000000610000006e000000640000002000000061000000 *200000006c000000690000007300000074000000200000006f0000006600000020000000530000 *00690000006d000000700000006c000000650000004d0000006500000073000000730000006100 *000067000000650000002e0000000a03000000000000000003021c000000490000005000000020 *00000061000000640000006400000072000000650000007300000073000000200000006f000000 *660000002000000074000000680000006500000020000000730000006d00000061000000720000 *0074000000680000006f00000073000000740000000a000000000000000103023d000000480000 *00450000004c0000004f00000020000000640000006f0000006d00000061000000690000006e00 *0000200000002800000073000000680000006f000000750000006c000000640000002000000062 *00000065000000200000007400000068000000650000002000000073000000610000006d000000 *6500000020000000610000007300000020000000790000006f0000007500000072000000200000 *0066000000720000006f0000006d0000002d000000610000006400000064000000720000006500 *000073000000730000002d000000640000006f0000006d00000061000000690000006e00000029 *0000000a00000000000000020302200000004c000000690000007300000074000000200000006f *000000660000002000000073000000690000006d000000700000006c0000006500000020000000 *6d0000006500000073000000730000006100000067000000650000007300000020000000740000 *006f0000002000000073000000650000006e000000640000000a00000010010302450000005500 *000073000000650000002000000074000000680000006900000073000000200000006900000066 *00000020000000790000006f00000075000000200000006e000000650000006500000064000000 *200000006d0000006f000000720000006500000020000000630000006f0000006e000000740000 *00720000006f0000006c000000200000007400000068000000610000006e000000200000007300 *0000650000006e0000006400000053000000690000006d000000700000006c000000650000004d *000000650000007300000073000000610000006700000065000000730000002000000067000000 *6900000076000000650000007300000020000000790000006f000000750000002e0000000a0300 *0000000000000003021b000000530000006f000000630000006b00000041000000640000006400 *00007200000020000000660000006f000000720000002000000074000000680000006500000020 *000000730000006d000000610000007200000074000000680000006f0000007300000074000000 *0a000000000000000103023d00000048000000450000004c0000004f0000002000000064000000 *6f0000006d00000061000000690000006e000000200000002800000073000000680000006f0000 *00750000006c000000640000002000000062000000650000002000000074000000680000006500 *00002000000073000000610000006d000000650000002000000061000000730000002000000079 *0000006f00000075000000720000002000000066000000720000006f0000006d0000002d000000 *610000006400000064000000720000006500000073000000730000002d000000640000006f0000 *006d00000061000000690000006e000000290000000a00000000000000020302190000004c0000 *00690000007300000074000000200000006f00000066000000200000006d000000650000007300 *0000730000006100000067000000650000007300000020000000740000006f0000002000000073 *000000650000006e000000640000000a0c00000005000000060000000700000008000000090000 *000a0000000b0000000c0000000d0000000e0000000f000000100c000000050000000600000008 *00000007000000090000000a0000000b0000000c0000000d0000000e000000100000000f000800 *000009050000000a0000000b0000000c0000000d0000000e0000000a000000000b000000000c00 *0000000d000000000e000000000f00000000100000000000000000050000000002000000110101 *0301023f000000460000006f000000720000006d00000061000000740000002000000074000000 *68000000650000002000000074000000690000006d000000650000002000000061000000730000 *002000000064000000650000007300000063000000720000006900000062000000650000002000 *0000690000006e0000002000000074000000680000006500000020000000410000007000000061 *00000063000000680000006500000020000000630000006f0000006d0000006200000069000000 *6e0000006500000064000000200000006c0000006f0000006700000020000000660000006f0000 *00720000006d00000061000000740000002e0000000a0102080000002000000020000000200000 *00680000007400000074000000700000003a010602000102100000006800000074000000740000 *0070000000640000002e0000006100000070000000610000006300000068000000650000002e00 *00006f000000720000006701060204000000640000006f00000063000000730102030000003200 *00002e000000320102010000002f0102090000006c0000006f00000067000000730000002e0000 *0068000000740000006d0000006c010201000000230209000000630000006f0000006d00000062 *000000690000006e00000065000000640000000a0301020f000000540000006800000065000000 *20000000660000006f000000720000006d00000061000000740000002000000069000000730000 *003a0000000a0102070000002000000020000000200000005b0000006400000061000000790106 *02050000006d0000006f0000006e000000740000006801021c0000007900000065000000610000 *00720000003a000000680000006f00000075000000720000003a0000006d000000690000006e00 *00007500000074000000650000003a0000007300000065000000630000006f0000006e00000064 *000000200000007a0000006f0000006e000000650102010000005d0102010000000a0102120000 *0020000000200000002000000020000000640000006100000079000000200000003d0000002000 *0000320000002a00000064000000690000006700000069000000740000000a0102150000002000 *00002000000020000000200000006d0000006f0000006e0000007400000068000000200000003d *00000020000000330000002a0000006c0000006500000074000000740000006500000072000000 *0a0102130000002000000020000000200000002000000079000000650000006100000072000000 *200000003d00000020000000340000002a00000064000000690000006700000069000000740000 *000a01021300000020000000200000002000000020000000680000006f00000075000000720000 *00200000003d00000020000000320000002a000000640000006900000067000000690000007400 *00000a010215000000200000002000000020000000200000006d000000690000006e0000007500 *00007400000065000000200000003d00000020000000320000002a000000640000006900000067 *00000069000000740000000a010215000000200000002000000020000000200000007300000065 *000000630000006f0000006e00000064000000200000003d00000020000000320000002a000000 *64000000690000006700000069000000740000000a01020c000000200000002000000020000000 *200000007a0000006f0000006e00000065000000200000003d0000002000000028010401000000 *8c010203000000200000007c000000200104010000008d020b0000002900000020000000340000 *002a0000006400000069000000670000006900000074000000200000000a000000001201010301 *0242000000460000006f000000720000006d000000610000007400000020000000740000006800 *000065000000200000007200000065000000710000007500000065000000730000007400000020 *000000610000007300000020000000640000006500000073000000630000007200000069000000 *620000006500000020000000690000006e00000020000000740000006800000065000000200000 *0041000000700000006100000063000000680000006500000020000000630000006f0000006d00 *000062000000690000006e0000006500000064000000200000006c0000006f0000006700000020 *000000660000006f000000720000006d00000061000000740000002e0000000a01020800000020 *0000002000000020000000680000007400000074000000700000003a0106020001021000000068 *000000740000007400000070000000640000002e00000061000000700000006100000063000000 *68000000650000002e0000006f000000720000006701060204000000640000006f000000630000 *0073010203000000320000002e000000320102010000002f0102090000006c0000006f00000067 *000000730000002e00000068000000740000006d0000006c010201000000230209000000630000 *006f0000006d00000062000000690000006e00000065000000640000000a0301020f0000005400 *0000680000006500000020000000660000006f000000720000006d000000610000007400000020 *00000069000000730000003a000000200105350000002500000068000000200000002d00000020 *000000250000007500000020000000250000007400000020000000220000002500000072000000 *2200000020000000250000003e0000007300000020000000250000006200000020000000220000 *00250000007b000000520000006500000066000000650000007200000065000000720000007d00 *000069000000220000002000000022000000250000007b00000055000000730000006500000072 *0000002d0000006100000067000000650000006e000000740000007d0000006900000022010201 *0000000a0102690000002000000025000000680000003a00000020000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000054000000 *680000006900000073000000200000006900000073000000200000007400000068000000650000 *002000000049000000500000002000000061000000640000006400000072000000650000007300 *000073000000200000006f00000066000000200000007400000068000000650000002000000063 *0000006c00000069000000650000006e0000007400000020000000280000007200000065000000 *6d0000006f000000740000006500000020000000680000006f0000007300000074000000290000 *00200000007700000068000000690000006300000068000000200000006d000000610000006400 *000065000000200000007400000068000000650000002000000072000000650000007100000075 *00000065000000730000007400000020000000740000006f000000200000007400000068000000 *65000000200000007300000065000000720000007600000065000000720000002e0000000a0102 *6f0000002000000025000000750000003a00000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000054000000680000006900 *000073000000200000006900000073000000200000007400000068000000650000002000000075 *0000007300000065000000720000006900000064000000200000006f0000006600000020000000 *74000000680000006500000020000000700000006500000072000000730000006f0000006e0000 *002000000072000000650000007100000075000000650000007300000074000000690000006e00 *0000670000002000000074000000680000006500000020000000640000006f0000006300000075 *0000006d000000650000006e000000740000002000000061000000730000002000000064000000 *650000007400000065000000720000006d000000690000006e0000006500000064000000200000 *006200000079000000200000004800000054000000540000005000000020000000610000007500 *00007400000068000000650000006e000000740000006900000063000000610000007400000069 *0000006f0000006e0000002e0000000a0102380000002000000025000000740000003a00000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *20000000200000005400000068000000650000002000000074000000690000006d000000650000 *002000000074000000680000006100000074000000200000007400000068000000650000002000 *000072000000650000007100000075000000650000007300000074000000200000007700000061 *000000730000002000000072000000650000006300000065000000690000007600000065000000 *640000002e0000000a01024c0000002000000025000000720000003a0000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *005400000068000000650000002000000072000000650000007100000075000000650000007300 *000074000000200000006c000000690000006e000000650000002000000066000000720000006f *0000006d0000002000000074000000680000006500000020000000630000006c00000069000000 *650000006e00000074000000200000006900000073000000200000006700000069000000760000 *00650000006e00000020000000690000006e00000020000000640000006f000000750000006200 *00006c000000650000002000000071000000750000006f0000007400000065000000730000002e *0000000a01025200000020000000250000003e000000730000003a000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000054000000 *680000006900000073000000200000006900000073000000200000007400000068000000650000 *002000000073000000740000006100000074000000750000007300000020000000630000006f00 *000064000000650000002000000074000000680000006100000074000000200000007400000068 *000000650000002000000073000000650000007200000076000000650000007200000020000000 *73000000650000006e0000006400000073000000200000006200000061000000630000006b0000 *0020000000740000006f0000002000000074000000680000006500000020000000630000006c00 *000069000000650000006e000000740000002e0000000a01027b00000020000000250000006200 *00003a000000200000002000000020000000200000002000000020000000200000002000000020 *000000200000002000000020000000540000006800000065000000200000006c00000061000000 *7300000074000000200000007000000061000000720000007400000020000000690000006e0000 *006400000069000000630000006100000074000000650000007300000020000000740000006800 *0000650000002000000073000000690000007a00000065000000200000006f0000006600000020 *000000740000006800000065000000200000006f000000620000006a0000006500000063000000 *740000002000000072000000650000007400000075000000720000006e00000065000000640000 *0020000000740000006f0000002000000074000000680000006500000020000000630000006c00 *000069000000650000006e000000740000002c000000200000006e0000006f0000007400000020 *000000690000006e000000630000006c0000007500000064000000690000006e00000067000000 *2000000074000000680000006500000020000000720000006500000073000000700000006f0000 *006e00000073000000650000002000000068000000650000006100000064000000650000007200 *0000730000002e0000000a01021400000020000000250000007b00000052000000650000006600 *0000650000007200000065000000720000007d0000003a00000020000000200000002000000020 *000000540000006800000065000000200105070000005200000065000000660000006500000072 *000000650000007201021c00000020000000280000007300000069000000630000002900000020 *000000480000005400000054000000500000002000000072000000650000007100000075000000 *650000007300000074000000200000006800000065000000610000006400000065000000720000 *002e0000000a023500000020000000250000007b00000055000000730000006500000072000000 *2d0000006100000067000000650000006e000000740000007d0000003a00000020000000540000 *00680000006500000020000000550000007300000065000000720000002d000000410000006700 *0000650000006e0000007400000020000000480000005400000054000000500000002000000072 *000000650000007100000075000000650000007300000074000000200000006800000065000000 *610000006400000065000000720000002e000000200000000a0002000000110000001202000000 *110000001200020000001100000000120000000000000000060000000004000000130000000000 *140000000000150103023b000000430000006f0000006e00000076000000650000007200000074 *00000073000000200000006100000020000000480000006f000000730000007400000041000000 *64000000640000007200000065000000730000007300000020000000740000006f000000200000 *006100000020000000530000007400000072000000690000006e00000067000000200000006900 *00006e00000020000000640000006f000000740000002d00000064000000650000006300000069 *0000006d000000610000006c000000200000006e0000006f000000740000006100000074000000 *690000006f0000006e0000000a000000001601030236000000430000006f0000006e0000007600 *000065000000720000007400000073000000200000006100000020000000490000005000000076 *0000003600000020000000480000006f0000007300000074000000410000006400000064000000 *720000006500000073000000730000003600000020000000740000006f00000020000000730000 *0074000000610000006e0000006400000061000000720000006400000020000000680000006500 *000078000000200000006e0000006f000000740000006100000074000000690000006f0000006e *0000000a0004000000130000001400000015000000160400000015000000160000001400000013 *00040000001300000000140000000015000000001600000000000000000700000000020000008e *000000000017010301023f000000470000006900000076000000650000006e0000002000000061 *0000006e00000020000000610000006300000074000000690000006f0000006e00000020000000 *6600000020000000610000006e000000640000002000000061000000200000006e000000750000 *006d000000620000006500000072000000200000006f0000006600000020000000730000006500 *0000630000006f0000006e000000640000007300000020000000740000002c0000002000000063 *000000720000006f0000006e0000002000000077000000690000006c0000006c00000020000000 *650000007800000065000000630000007500000074000000650000000a01024c00000020000000 *660000002000000065000000760000006500000072000000790000002000000074000000200000 *007300000065000000630000006f0000006e000000640000007300000020000000770000006900 *000074000000680000002000000074000000680000006500000020000000660000006900000072 *000000730000007400000020000000650000007800000065000000630000007500000074000000 *690000006f0000006e0000002000000074000000200000007300000065000000630000006f0000 *006e00000064000000730000002000000061000000660000007400000065000000720000002000 *000063000000720000006f0000006e000000200000006900000073000000200000006300000061 *0000006c0000006c00000065000000640000002e0000000a022300000020000000630000007200 *00006f0000006e00000020000000640000006f0000006500000073000000200000006e0000006f *0000007400000020000000730000007000000061000000770000006e0000002000000061000000 *200000006e00000065000000770000002000000074000000680000007200000065000000610000 *00640000002e0000000a0001000000170100000017000100000017000000000000000008000000 *000b00000018010302320000004500000071000000750000006900000076000000610000006c00 *0000650000006e0000007400000020000000740000006f00000020000000610000002000000063 *0000006f0000006d000000700000006f000000730000006900000074000000690000006f000000 *6e000000200000006f0000006600000020000000660000006f000000720000006b000000200000 *00610000006e0000006400000020000000660000006f0000007200000065000000760000006500 *00007200000053000000740000000a0000000019010301024900000053000000690000006d0000 *00690000006c000000610000007200000020000000740000006f00000020000000660000006f00 *000072000000650000007600000065000000720000002000000062000000750000007400000020 *0000007700000069000000740000006800000020000000610000006e0000002000000065000000 *78000000700000006c000000690000006300000069000000740000002000000073000000740000 *0061000000740000006500000020000000700000006100000072000000610000006d0000006500 *000074000000650000007200000020000000740000006800000072000000650000006100000064 *0000006500000064000000200000007400000068000000720000006f0000007500000067000000 *680000000a02120000002000000074000000680000006500000020000000630000006f0000006d *0000007000000075000000740000006100000074000000690000006f0000006e0000002e000000 *0a000000001a010302300000004500000071000000750000006900000076000000610000006c00 *0000650000006e0000007400000020000000740000006f00000020000000610000002000000063 *0000006f0000006d000000700000006f000000730000006900000074000000690000006f000000 *6e000000200000006f0000006600000020000000660000006f000000720000006b000000200000 *00610000006e0000006400000020000000660000006f0000007200000065000000760000006500 *0000720000000a000000001b0103023e0000004c00000069000000660000007400000073000000 *2000000074000000680000006500000020000000610000007200000067000000750000006d0000 *00650000006e000000740000002000000077000000690000007400000068000000200000005200 *000069000000670000006800000074000000200000006200000065000000660000006f00000072 *000000650000002000000077000000720000006900000074000000690000006e00000067000000 *20000000690000007400000020000000690000006e000000740000006f00000020000000740000 *006800000065000000200000006300000068000000610000006e0000000a000000001c0103023d *0000004c0000006900000066000000740000007300000020000000740000006800000065000000 *20000000610000007200000067000000750000006d000000650000006e00000074000000200000 *0077000000690000007400000068000000200000004c0000006500000066000000740000002000 *00006200000065000000660000006f000000720000006500000020000000770000007200000069 *00000074000000690000006e000000670000002000000069000000740000002000000069000000 *6e000000740000006f000000200000007400000068000000650000002000000063000000680000 *00610000006e0000000a000000001d01030223000000460000006f000000720000006b00000020 *00000074000000680000006100000074000000200000007400000068000000720000006f000000 *770000007300000020000000610000007700000061000000790000002000000074000000680000 *006500000020000000540000006800000072000000650000006100000064000000490000006400 *00000a000000001e010301024b0000004100000020000000760000006500000072000000730000 *00690000006f0000006e000000200000006f0000006600000020000000660000006f0000007200 *000065000000760000006500000072000000200000007400000068000000610000007400000020 *00000077000000690000006c0000006c0000002000000067000000720000006100000063000000 *6500000066000000750000006c0000006c00000079000000200000006300000061000000740000 *00630000006800000020000000490000004f000000200000006500000078000000630000006500 *00007000000074000000690000006f0000006e0000007300000020000000610000006e00000064 *00000020000000630000006f0000006e00000074000000690000006e0000007500000065000000 *0a022000000020000000650000007800000065000000630000007500000074000000690000006e *00000067000000200000007400000068000000650000002000000070000000720000006f000000 *760000006900000064000000650000006400000020000000610000006300000074000000690000 *006f0000006e0000002e0000000a000000001f01030213000000460000006f000000720000006b *0000002000000061000000200000006e0000006500000077000000200000007400000068000000 *720000006500000061000000640000002e0000000a000000002001030235000000520000006500 *000067000000690000007300000074000000650000007200000020000000610000006e00000020 *000000610000006300000074000000690000006f0000006e00000020000000740000006f000000 *2000000062000000650000002000000072000000750000006e0000002000000077000000680000 *00650000006e000000200000006700000068000000630000006900000020000000690000007300 *000020000000720000006500000073000000740000006100000072000000740000006500000064 *0000002e0000000a00000000210103020c00000052000000650000007300000065000000740000 *002000000073000000740000006100000074000000650000000a00000000220103021000000053 *0000006c000000650000006500000070000000200000004e000000200000007300000065000000 *630000006f0000006e00000064000000730000000a000b00000018000000190000001a0000001b *0000001c0000001d0000001e0000001f0000002000000021000000220b00000018000000190000 *001a0000001b0000001c0000001d0000001f00000020000000210000001e00000022000b000000 *180000000019000000001a000000001b000000001c000000001d000000001e000000001f000000 *002000000000210000000022000000000000000009000108000000750000007300000065000000 *73000000200000006d000000640000006f0000120000002300000000002400000000008f000000 *000090000000000091000000000092000000000093000000000094000000000095000000000096 *000000000097000000000098000000000025010301021500000054000000680000006900000073 *0000002000000068000000610000006e000000640000006c000000650000007200000020000000 *72000000650000007400000075000000720000006e0000007300000020010702070000004e0000 *006f0000007400000068000000690000006e0000006701021b0000002000000069000000660000 *00200000007400000068000000650000002000000074000000690000006d000000650000006f00 *00007500000074000000200000006f000000630000006300000075000000720000007300000020 *000000610000006e0000006400000020010702060000004a000000750000007300000074000000 *200000006101021100000020000000690000006600000020000000630000006f0000006d000000 *7000000075000000740000006100000074000000690000006f0000006e000000200000000a0102 *090000002000000072000000650000007400000075000000720000006e00000073000000200107 *02010000006102020000002e0000000a0000000026010301024c00000054000000680000006900 *00007300000020000000690000007300000020000000740000006800000065000000200000006e *0000006f000000720000006d000000610000006c0000002000000074000000690000006d000000 *650000006f00000075000000740000002000000068000000610000006e000000640000006c0000 *0065000000720000002e0000002000000049000000740000002000000074000000680000007200 *00006f000000770000007300000020000000610000002000000054000000690000006d00000065 *0000004f0000007500000074000000450000007800000063000000650000007000000074000000 *690000006f0000006e000000200000006500000078000000630000006500000070000000740000 *00690000006f0000006e0000002c0000000a021800000020000000690000006600000020000000 *7400000068000000650000002000000074000000690000006d000000650000006f000000750000 *0074000000200000006f00000063000000630000007500000072000000730000002e0000000a00 *00000099000000000027010301024c0000004c000000690000006b000000650000002000000074 *000000690000006d000000650000004f00000075000000740000002c0000002000000062000000 *7500000074000000200000006100000064000000640000006900000074000000690000006f0000 *006e000000610000006c0000006c00000079000000200000006900000074000000200000007700 *00006f000000720000006b00000073000000200000006500000076000000650000006e00000020 *00000069000000660000002000000074000000680000006500000020000000630000006f000000 *6d0000007000000075000000740000006100000074000000690000006f0000006e000000200000 *00690000007300000020000000620000006c0000006f000000630000006b000000690000006e00 *0000670000000a010249000000200000006100000073000000790000006e000000630000002000 *0000650000007800000063000000650000007000000074000000690000006f0000006e00000073 *00000020000000280000006500000078000000700000006c000000690000006300000069000000 *74000000650000006c00000079000000200000006f000000720000002000000062000000790000 *00200000006100000020000000620000006c0000006f000000630000006b000000690000006e00 *000067000000200000004600000046000000490000002000000063000000610000006c0000006c *000000290000002e00000020000000540000006800000069000000730000002000000063000000 *6f0000006e00000073000000750000006d00000065000000730000000a0237000000200000006d *0000006f0000007200000065000000200000007200000065000000730000006f00000075000000 *72000000630000006500000073000000200000007400000068000000610000006e000000200000 *0074000000690000006d000000650000004f00000075000000740000002c000000200000006200 *00007500000074000000200000006900000073000000200000007300000074000000690000006c *0000006c0000002000000071000000750000006900000074000000650000002000000066000000 *6100000073000000740000002e0000000a0000000028010301025a0000004c000000690000006b *00000065000000200000007700000069000000740000006800000054000000690000006d000000 *650000004f00000075000000740000004d000000610000007900000062000000650000002c0000 *00200000006200000075000000740000002000000068000000610000006e000000640000006c00 *0000650000007300000020000000740000006800000065000000200000006f0000007000000065 *000000720000006100000074000000690000006f0000006e00000020000000620000006c000000 *6f000000630000006b000000690000006e00000067000000200000006500000078000000630000 *00650000007000000074000000690000006f0000006e00000073000000200000006c0000006900 *00006b000000650000002000000077000000690000007400000068000000530000006100000066 *0000006500000054000000690000006d000000650000004f00000075000000740000000a020700 *000020000000640000006f00000065000000730000002e0000000a000000002901030222000000 *430000006f0000006e0000007300000074000000610000006e0000007400000020000000720000 *006500000070000000720000006500000073000000650000006e00000074000000690000006e00 *000067000000200000006f0000006e00000065000000200000007300000065000000630000006f *0000006e000000640000002e0000000a0007000000230000002400000025000000260000002700 *000028000000290700000026000000250000002700000028000000230000002400000029000700 *000023010000002400000024000000002500000000260000000027000000002800000000290000 *0000000000000a000000001e0000002a00000000002b00000000002c00000000002d0000000000 *2e00000000002f0000000000300103010225000000500000007500000074000000200000006100 *0000200000006c000000690000006e0000006500000020000000690000006e000000740000006f *00000020000000610000002000000068000000610000006e000000640000006c00000065000000 *20000000660000006f0000006c0000006c0000006f000000770000006500000064000000200000 *00620000007900000020010502000000720000006e021400000020000000610000006e00000064 *000000200000006500000063000000680000006f00000020000000740000006f00000020000000 *7300000074000000640000006f00000075000000740000000a00000000310103022e0000004700 *000065000000740000002000000061000000200000006c000000690000006e0000006500000020 *00000066000000720000006f0000006d0000002000000074000000680000006500000020000000 *68000000610000006e000000640000006c0000006500000020000000610000006e000000640000 *00200000006500000063000000680000006f00000020000000740000006f000000200000007300 *000074000000640000006f00000075000000740000000a00000000320000000000330000000000 *3400000000003500000000003601010101010301023400000052000000650000006d0000006f00 *000076000000650000007300000020000000740000006800000065000000200000007700000068 *000000690000007400000065000000730000007000000061000000630000006500000020000000 *730000007500000072000000720000006f000000750000006e00000064000000690000006e0000 *0067000000200000006100000020000000730000007400000072000000690000006e0000006700 *00002000000061000000730000002000000077000000650000006c0000006c0000000a01022200 *000020000000610000007300000020000000740000006800000065000000200000006600000069 *00000072000000730000007400000020000000610000006e00000064000000200000006c000000 *610000007300000074000000200000006300000068000000610000007200000061000000630000 *007400000065000000720000002e0000000a01020100000020010701020a000000750000006e00 *0000420000007200000061000000630000006b0000006500000074000000200105090000002000 *000020000000280000006100000073000000640000006600000029000000200102030000002000 *00003d0000002005040000006100000073000000640000006602010000000a0302300000004400 *0000720000006f0000007000000073000000200000007400000068000000650000002000000077 *000000680000006900000074000000650000007300000070000000610000006300000065000000 *200000006100000074000000200000007400000068000000650000002000000073000000740000 *00610000007200000074000000200000006f000000660000002000000074000000680000006500 *000020000000730000007400000072000000690000006e000000670000000a03022e0000004400 *0000720000006f0000007000000073000000200000007400000068000000650000002000000077 *000000680000006900000074000000650000007300000070000000610000006300000065000000 *2000000061000000740000002000000074000000680000006500000020000000650000006e0000 *0064000000200000006f0000006600000020000000740000006800000065000000200000007300 *00007400000072000000690000006e000000670000000a03023600000054000000720000006900 *00006d000000730000002000000074000000680000006500000020000000620000006500000067 *000000690000006e0000006e000000690000006e0000006700000020000000610000006e000000 *6400000020000000650000006e00000064000000690000006e0000006700000020000000770000 *006800000069000000740000006500000073000000700000006100000063000000650000002000 *00006f00000066000000200000006100000020000000730000007400000072000000690000006e *000000670000000a03024a0000005200000065000000700000006500000061000000640000006c *000000790000002000000073000000700000006c00000069000000740000007300000020000000 *61000000200000006c000000690000007300000074000000200000006200000079000000200000 *007400000068000000650000002000000070000000720000006f00000076000000690000006400 *000065000000640000002000000073000000650000007000000061000000720000006100000074 *0000006f0000007200000020000000610000006e0000006400000020000000630000006f000000 *6c0000006c00000065000000630000007400000073000000200000007400000068000000650000 *0020000000720000006500000073000000750000006c00000074000000730000000a0000000037 *010302320000005200000065000000700000006500000061000000740000006500000064000000 *6c000000790000002000000073000000700000006c000000690000007400000073000000200000 *0061000000200000006c00000069000000730000007400000020000000610000006e0000006400 *000020000000630000006f0000006c0000006c0000006500000063000000740000007300000020 *00000074000000680000006500000020000000720000006500000073000000750000006c000000 *74000000730000000a00000000380103023a00000053000000700000006c000000690000007400 *0000200000006900000073000000200000006c000000690000006b000000650000002000000062 *0000007200000065000000610000006b0000002c00000020000000620000007500000074000000 *20000000740000006800000065000000200000006d000000610000007400000063000000680000 *00690000006e0000006700000020000000650000006c000000650000006d000000650000006e00 *0000740000002000000069000000730000002000000064000000720000006f0000007000000070 *00000065000000640000002e0000000a00000000390103023b0000005200000065000000610000 *00640000002000000066000000690000006c000000650000002000000077000000690000007400 *00006800000020000000610000002000000064000000650000006600000061000000750000006c *000000740000002000000076000000610000006c00000075000000650000002000000069000000 *66000000200000007400000068000000650000002000000066000000690000006c000000650000 *0020000000640000006f0000006500000073000000200000006e0000006f000000740000002000 *000065000000780000006900000073000000740000002e0000000a000000003a00000000003b00 *000000003c010302380000006100000070000000700000006c0000006900000065000000730000 *0020000000740000006800000065000000200000006c0000006900000073000000740000002000 *00006f000000660000002000000066000000750000006e0000006300000074000000690000006f *0000006e0000007300000020000000740000006f00000020000000740000006800000065000000 *2000000070000000720000006f0000007600000069000000640000006500000064000000200000 *00610000007200000067000000750000006d000000650000006e00000074000000200000000a00 *0000003d01030107020a000000630000006f0000006d0000007000000020000000660000002000 *000061000000200000006201020a00000020000000630000006f0000006d000000700000006100 *000072000000650000007300000020010702010000006101020500000020000000610000006e00 *00006400000020010702010000006201020d000000200000006100000066000000740000006500 *000072000000200000006100000070000000700000006c000000790000000a0102010000002001 *0702010000006602020000002e0000000a000000003e010301023300000052000000750000006e *00000020000000610000006e000000200000006500000078000000740000006500000072000000 *6e000000610000006c00000020000000630000006f0000006d0000006d000000610000006e0000 *00640000002e0000002000000055000000700000006f0000006e00000020000000660000006100 *0000690000006c000000750000007200000065000000200000007000000072000000690000006e *00000074000000200000007300000074000000610000007400000075000000730000000a020e00 *0000200000002000000020000000740000006f0000002000000073000000740000006400000065 *00000072000000720000002e0000000a000000003f0103023d000000550000006e000000730000 *006100000066000000650000002000000074000000720000006100000063000000690000006e00 *0000670000002c000000200000006f000000750000007400000070000000750000007400000073 *00000020000000740000006800000065000000200000006d000000650000007300000073000000 *61000000670000006500000020000000610000006e000000640000002000000074000000680000 *00650000002000000076000000610000006c000000750000006500000020000000740000006f00 *0000200000007300000074000000640000006500000072000000720000002e0000000a00000000 *4001030228000000550000006e0000007300000061000000660000006500000020000000740000 *00720000006100000063000000690000006e00000067000000200000006d000000650000007300 *0000730000006100000067000000650000007300000020000000690000006e0000007300000069 *00000064000000650000002000000061000000200000006d0000006f0000006e00000061000000 *640000002e0000000a000000004101030213000000520000006500000061000000640000002000 *0000690000006e00000020000000610000006e00000079000000200000006d0000006f0000006e *00000061000000640000002e0000000a0000000042010301024c000000430000006f0000006e00 *000076000000650000007200000074000000200000004d00000061000000790000006200000065 *00000020000000690000006e000000740000006f00000020000000610000006e00000020000000 *610000006e0000006f00000074000000680000006500000072000000200000006d0000006f0000 *006e00000061000000640000002e00000020000000200000005400000068000000690000007300 *000020000000690000007300000020000000610000002000000073000000690000006d00000070 *0000006c0000006500000020000000690000006e0000006a000000650000006300000074000000 *690000006f0000006e000000200000007400000068000000610000007400000020000000630000 *00610000006c0000006c000000730000000a021c00000020000000660000006100000069000000 *6c000000200000007700000068000000650000006e000000200000006700000069000000760000 *00650000006e0000002000000061000000200000004e0000006f00000074000000680000006900 *00006e000000670000002e0000000a00000000430103023f0000004c0000006900000066000000 *7400000073000000200000006100000020000000620000006f0000006f0000006c000000200000 *00690000006e000000740000006f0000002000000061000000200000004d0000006f0000006e00 *00006100000064000000500000006c00000075000000730000002c000000200000007700000069 *00000074000000680000002000000046000000610000006c000000730000006500000020000000 *6d000000610000007000000070000000650000006400000020000000740000006f000000200000 *00740000006800000065000000200000006d0000007a00000065000000720000006f0000002e00 *00000a00000000440103010702090000006e0000006f000000740000004d000000620000002000 *000061000000200000006201020900000020000000720000006500000074000000750000007200 *00006e0000007300000020010702060000004a0000007500000073000000740000002000000061 *010204000000200000006900000066000000200107020100000062010204000000200000006900 *00007300000020010702070000004e0000006f0000007400000068000000690000006e00000067 *01020500000020000000610000006e0000006400000020010702070000004e0000006f00000074 *00000068000000690000006e000000670102040000002000000069000000660000000a01020100 *000020010702010000006201020400000020000000690000007300000020010702060000004a00 *0000750000007300000074000000200000005f02020000002e0000000a0000000045010301023d *00000054000000610000006b00000065000000730000002000000061000000200000006c000000 *690000007300000074000000200000006f000000660000002000000064000000650000006c0000 *006100000079000000730000002c00000020000000690000006e00000020000000730000006500 *0000630000006f0000006e00000064000000730000002c00000020000000610000006e00000064 *00000020000000610000006e00000020000000610000006300000074000000690000006f000000 *6e00000020000000740000006f0000002000000065000000780000006500000063000000750000 *0074000000650000000a01024a0000002000000072000000650000007000000065000000610000 *007400000065000000640000006c000000790000002e0000002000000020000000540000006800 *00006500000020000000610000006300000074000000690000006f0000006e0000002000000069 *00000073000000200000007400000068000000650000006e000000200000006500000078000000 *650000006300000075000000740000006500000064000000200000007200000065000000700000 *0065000000610000007400000065000000640000006c0000007900000020000000690000006e00 *000020000000610000002000000073000000650000007000000061000000720000006100000074 *00000065000000200000007400000068000000720000006500000061000000640000000a025000 *000020000000750000006e00000074000000690000006c00000020000000740000006800000065 *000000200000006c00000069000000730000007400000020000000680000006100000073000000 *200000006200000065000000650000006e00000020000000630000006f0000006e000000730000 *00750000006d00000065000000640000002e000000200000002000000054000000680000006500 *000020000000660000006900000072000000730000007400000020000000610000006300000074 *000000690000006f0000006e0000002000000074000000610000006b0000006500000073000000 *20000000700000006c00000061000000630000006500000020000000690000006d0000006d0000 *006500000064000000690000006100000074000000650000006c000000790000002e0000002000 *0000200000000a0000000046000000000047010301020b00000053000000690000006d00000069 *0000006c000000610000007200000020000000740000006f0000002001040100000045021d0000 *00200000006200000075000000740000002000000072000000750000006e000000730000002000 *0000690000006e000000200000007400000068000000650000002000000073000000610000006d *00000065000000200000007400000068000000720000006500000061000000640000000a001e00 *00002a0000002b0000002c0000002d0000002e0000002f00000030000000310000003200000033 *0000003400000035000000360000003700000038000000390000003a0000003b0000003c000000 *3d0000003e0000003f000000400000004100000042000000430000004400000045000000460000 *00471e0000002b0000002a0000002c0000002d0000002e0000002f000000300000003100000033 *000000340000003500000032000000360000003700000038000000390000003a0000003b000000 *3c0000003d0000003e0000003f0000004000000041000000420000004300000044000000450000 *004600000047001e0000002a000000002b000000002c000000002d000000002e000000002f0000 *000030000000003100000000320000000033000000003400000000350000000036000000003700 *000000380000000039000000003a000000003b000000003c000000003d000000003e000000003f *000000004000000000410000000042000000004300000000440000000045000000004600000000 *4700000000000000000b0000000006000000480103022c00000053000000650000006d00000061 *0000006e000000740000006900000063000000610000006c0000006c0000007900000020000000 *6500000071000000750000006900000076000000610000006c000000650000006e000000740000 *0020000000740000006f00000020000000620000007200000065000000610000006b0000002000 *00006f0000006e00000020000000730000007400000072000000690000006e0000006700000073 *0000000a0000000049010103010401000000490102310000002000000062000000650000006800 *000061000000760000006500000073000000200000006c000000690000006b0000006500000020 *000000620000007200000065000000610000006b00000043000000680000006100000072000000 *2c000000200000006200000075000000740000002000000066000000720000006f0000006d0000 *002000000074000000680000006500000020000000650000006e00000064000000200000006f00 *000066000000200000007400000068000000650000000a020d0000002000000042000000790000 *007400000065000000530000007400000072000000690000006e000000670000002e0000000a01 *07023400000020000000620000007200000065000000610000006b000000430000006800000061 *00000072000000450000006e000000640000002000000028000000270000006200000027000000 *2900000020000000280000007000000061000000630000006b0000002000000022000000610000 *0061000000620000006200000063000000630000002200000029000000200000003d0000003d00 *0000200000002800000022000000610000006100000062000000220000002c0000002200000063 *0000006300000022000000290000000a01030222000000610000006e0000006400000020000000 *74000000680000006500000020000000660000006f0000006c0000006c0000006f000000770000 *00690000006e000000670000002000000061000000720000006500000020000000650000007100 *0000750000006900000076000000610000006c000000650000006e000000740000003a0000000a *0701021b00000020000000620000007200000065000000610000006b0000004300000068000000 *6100000072000000450000006e0000006400000020000000270000006300000027000000200000 *0022000000610000006200000063000000640000006500000066000000220000000a01022e0000 *00200000006c00000065000000740000002000000028000000780000002c000000790000002900 *0000200000003d00000020000000620000007200000065000000610000006b0000002000000028 *0000003d0000003d00000027000000630000002700000029000000200000002800000072000000 *650000007600000065000000720000007300000065000000200000002200000061000000620000 *006300000064000000650000006600000022000000290000000a02240000002000000069000000 *6e0000002000000028000000720000006500000076000000650000007200000073000000650000 *00200000002800000064000000720000006f000000700000002000000031000000200000007900 *0000290000002c0000002000000072000000650000007600000065000000720000007300000065 *0000002000000078000000290000000a000000004a0103022700000044000000720000006f0000 *007000000073000000200000006c000000650000006100000064000000690000006e0000006700 *00002000000073000000700000006100000063000000650000007300000020000000690000006e *000000200000007400000068000000650000002000000042000000790000007400000065000000 *530000007400000072000000690000006e000000670000000a000000004b010302280000004400 *0000720000006f000000700000007300000020000000740000007200000061000000690000006c *000000690000006e00000067000000200000007300000070000000610000006300000065000000 *7300000020000000690000006e0000002000000074000000680000006500000020000000420000 *00790000007400000065000000530000007400000072000000690000006e000000670000000a00 *0000009a00000000004c01030102450000004300000068000000750000006e0000006b00000020 *00000061000000200000006c000000610000007a00000079000000200000006200000079000000 *7400000065000000730000007400000072000000690000006e0000006700000020000000690000 *006e000000740000006f00000020000000720000006500000061000000730000006f0000006e00 *000061000000620000006c00000065000000200000006300000068000000750000006e0000006b *00000073000000200000002d000000200000006900000073000000200000006900000064000000 *2000000066000000720000006f0000006d000000200000006f0000007500000074000000730000 *006900000064000000650000002e0000000a010246000000200000002000000020000000540000 *006800000069000000730000002000000069000000730000002000000075000000730000006500 *000066000000750000006c00000020000000740000006f000000200000006d000000610000006b *000000650000002000000062000000790000007400000065000000730000007400000072000000 *690000006e00000067000000200000006300000068000000750000006e0000006b000000730000 *0020000000720000006500000061000000730000006f0000006e00000061000000620000006c00 *0000650000002000000073000000690000007a000000650000006400000020000000660000006f *0000007200000020000000650000002e000000670000002e0000000a0210000000200000002000 *000020000000630000006f0000006d000000700000007200000065000000730000007300000069 *0000006f0000006e0000002e0000000a000500000048000000490000004a0000004b0000004c05 *00000048000000490000004a0000004b0000004c0005000000480000000049000000004a000000 *004b000000004c00000000000000000c00010d0000006c000000690000006e0000007500000078 *0000002f00000077000000690000006e000000640000006f0000007700000073010b0000007000 *0000720000006f000000760000006900000073000000690000006f0000006e000000610000006c *010d0000004d000000610000007400000074000000680000006500000077000000200000004500 *00006c000000640000006500000072050000004d010301022600000046000000750000006e0000 *006300000074000000690000006f0000006e000000610000006c00000069000000740000007900 *000020000000660000006f00000072000000200000007400000068000000650000002000000061 *00000075000000740000006f0000004200000075000000690000006c0000006400000020000000 *740000006f0000006f0000006c0000002e0000000a021b00000020000000200000002000000049 *0000006e0000007300000070000000690000007200000065000000640000002000000062000000 *790000002000000073000000650000006100000072000000630000006800000070000000610000 *0074000000680000002e0000000a03000000000000000003020e00000042000000750000006900 *00006c0000006400000020000000630000006f0000006d0000006d000000610000006e00000064 *0000000a000000000000000103020f000000500000006100000074000000680000002000000074 *0000006f0000002000000062000000690000006e0000006100000072000000790000000a000000 *0000000002030225000000410000007200000067000000750000006d000000650000006e000000 *740000007300000020000000740000006f00000020000000750000007300000065000000200000 *007700000068000000650000006e0000002000000072000000750000006e0000006e0000006900 *00006e000000670000002000000062000000690000006e0000006100000072000000790000000a *0000009b00000000009c00000000009d00000000009e0000010000004d010000004d0001000000 *4d00000000000000000d000000001a0000004e00000000009f0000000000a00000000000a10000 *000000a20000000000a30000000000a40000000000a50000000000a60000000000a70000000000 *a800000000004f0000000000a90000000000aa0000000000ab0000000000ac0000000000500103 *01023900000057000000690000006c0000006c0000002000000072000000650000006100000064 *00000020000000740000006800000065000000200000006c000000610000007a00000079000000 *2000000042000000790000007400000065000000530000007400000072000000690000006e0000 *006700000020000000610000006e00000064000000200000007200000065000000740000007500 *0000720000006e00000020000000740000006800000065000000200000006d0000006400000035 *000000200000006400000069000000670000006500000073000000740000002e0000000a024500 *0000200000002000000020000000530000006f0000006d00000065000000200000006100000070 *000000700000006c00000069000000630000006100000074000000690000006f0000006e000000 *200000006d000000690000006700000068000000740000002000000077000000610000006e0000 *007400000020000000740000006f00000020000000770000007200000061000000700000002000 *0000740000006800000069000000730000002000000066000000750000006e0000006300000074 *000000690000006f0000006e00000020000000660000006f000000720000002000000074000000 *7900000070000000650000002000000073000000610000006600000074000000790000002e0000 *000a00000000510000000000ad0000000000520000000000ae0000000000af0000000000530000 *000000540000000000550000000000560000090000004e0000004f000000500000005100000052 *0000005300000054000000550000005609000000500000004f00000052000000510000004e0000 *005600000054000000530000005500090000004e000000004f0000000050000000005100000000 *52000000005300000000540000000055000000005600000000000000000e0000000015000000b0 *0000000000b10000000000b20000000000570000000000580000000000590000000000b3000000 *0000b40000000000b50000000000b60000000000b70000000000b80000000000b90000000000ba *0000000000bb0000000000bc0000000000bd0000000000be0000000000bf0000000000c0000000 *0000c1000003000000570000005800000059030000005700000058000000590003000000570000 *000058000000005900000000000000000f00000000020000005a00000000005b0000020000005a *0000005b020000005a0000005b00020000005a000000005b000000000000000010000000002800 *0000c20000000000c30000000000c40000000000c50000000000c60000000000c700000000005c *00000000005d0000000000c80000000000c90000000000ca0000000000cb0000000000cc000000 *0000cd0000000000ce0000000000cf0000000000d00000000000d10000000000d20000000000d3 *00000000005e00000000005f0000000000d40000000000d50000000000d60000000000d7000000 *0000d80000000000d90000000000da0000000000db0000000000dc0000000000dd0000000000de *0000000000df0000000000e00000000000e10000000000e20000000000e30000000000e4000000 *0000e50000040000005c0000005d0000005e0000005f040000005e0000005f0000005d0000005c *00040000005c000000005d000000005e000000005f000000000000000011000000001000000060 *000000000061000000000062000000000063000000000064000000000065000000000066000000 *00006700000000006800000000006900000000006a00000000006b00000000006c00000000006d *00000000006e00000000006f000010000000600000006100000062000000630000006400000065 *000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e000000 *6f1000000060000000610000006200000063000000640000006500000066000000670000006800 *0000690000006a0000006b0000006c0000006d0000006e0000006f001000000060000000006100 *000000620000000063000000006400000000650000000066000000006700000000680000000069 *000000006a000000006b000000006c000000006d000000006e000000006f000000000000000012 *000000000a000000e60000000000e70000000000e80000000000e9000000000070010302420000 *004300000075000000740000002000000075000000700000002000000061000000200000007300 *00007400000072000000690000006e0000006700000020000000690000006e000000740000006f *000000200000003700000032000000200000006300000068000000610000007200000020000000 *6c000000690000006e00000065000000730000002c000000200000006500000061000000630000 *0068000000200000006c000000690000006e000000650000002000000074000000650000007200 *00006d000000690000006e00000061000000740000006500000064000000200000006200000079 *0000002000000043000000520000004c000000460000002e0000000a00000000ea0000000000eb *0000000000ec000000000071000000000072000003000000700000007100000072030000007100 *000072000000700003000000700000000071000000007200000000000000001300000000010000 *00730000010000007301000000730001000000730000000000000000ed00000000000000010000 *000014000000000000000100000000150000000000000002000000001600000000000000020000 *00001700000000000000030000000018000000190000001a030000001b000000190000001a0100 *00001b000000190000001a000000001c000000190000001a000000001d00000000000000040300 *00001e0000000000000004010000001e0000000000000004000000001f00000000000000040000 *000020000000000000000400000000210000000000000004000000002200000000000000040000 *000023000000000000000400000000240000000000000005000000002500000000000000050000 *000026000000000000000603000000270000000000000006030000002800000000000000060000 *0000290000000000000006000000002a0000000000000007000000002b00000000000000080000 *00002c0000000000000008000000002d0000000000000008000000002e00000000000000080000 *00002f000000000000000800000000300000000000000008000000003100000000000000080000 *000032000000000000000800000000330000000000000008000000003400000000000000080000 *000035000000000000000800000000360000000000000009030000003700000000000000090100 *000037000000000000000900000000380000000000000009000000003900000000000000090000 *00003a0000000000000009000000003b0000000000000009000000003c000000000000000a0300 *00003d000000000000000a030000003e000000000000000a000000003f000000000000000a0000 *000040000000000000000a0000000041000000000000000a0000000042000000000000000a0000 *000043000000000000000a0000000044000000000000000a0000000045000000000000000a0000 *000046000000000000000a0000000047000000000000000a0000000048000000000000000a0000 *000049000000000000000a000000004a000000000000000a000000004b000000000000000a0000 *00004c000000000000000a000000004d000000000000000a000000004e000000000000000a0000 *00004f000000000000000a0000000050000000000000000a0000000051000000000000000a0000 *000052000000000000000a0000000053000000000000000a0000000054000000000000000a0000 *000055000000000000000a0000000056000000000000000a0000000057000000000000000a0000 *000058000000000000000a0000000059000000000000000a000000005a000000000000000b0000 *00005b000000000000000b000000005c000000000000000b000000005d000000000000000b0000 *00005e000000000000000b000000005f000000000000000c0000000060000000000000000d0300 *000061000000000000000d0000000062000000000000000d0000000063000000000000000d0000 *000064000000000000000d0000000065000000000000000d0000000066000000000000000d0000 *000067000000000000000d0000000068000000000000000d0000000069000000000000000e0000 *00006a000000000000000e000000006b000000000000000e000000006c000000000000000f0000 *00006d000000000000000f000000006e0000000000000010030000006f00000000000000100300 *000070000000000000001000000000710000000000000010000000007200000000000000110000 *000073000000000000001100000000740000000000000011000000007500000000000000110000 *000076000000000000001100000000770000000000000011000000007800000000000000110000 *0000790000000000000011000000007a0000000000000011000000007b00000000000000110000 *00007c0000000000000011000000007d0000000000000011000000007e00000000000000110000 *00007f000000000000001100000000800000000000000011000000008100000000000000110000 *000082000000000000001200000000830000000000000012000000008400000000000000120000 *000085000000000000001300000000860000000000000001030000008700000000000000010300 *000088000000000000000103000000890000008a0000008b010000008c0000008a0000008b0300 *00008c0000008a0000008d000000008e0000008a0000008d000000008f00000000000000010100 *000090000000000000000100000000910000000000000001030000009200000000000000010100 *000092000000000000000100000000930000000000000001000000009400000000000000010000 *000095000000000000000100000000960000000000000001000000009700000000000000010000 *000098000000000000000100000000990000000000000001000000009a0000009b0000009c0000 *00009d0000009e0000009f01000000a0000000a1000000a200000000a300000000000000040000 *0000a4000000000000000400000000a50000009b000000a600000000a70000009b000000a60000 *0000a80000000000000007030000003e000000000000000903000000a900000000000000090100 *0000a9000000000000000903000000aa000000000000000900000000ab00000000000000090000 *0000ac000000000000000900000000ad000000000000000900000000ae00000000000000090000 *0000af000000000000000900000000b0000000000000000900000000b100000000000000090000 *0000b2000000000000000b00000000b3000000000000000c00000000b4000000000000000c0000 *0000b5000000000000000c00000000b6000000000000000c00000000b7000000000000000d0100 *0000b8000000000000000d00000000b9000000000000000d00000000ba000000000000000d0000 *0000bb000000000000000d03000000bc000000000000000d01000000bd000000000000000d0000 *0000be000000000000000d00000000bf000000000000000d00000000c0000000000000000d0000 *0000c1000000000000000d00000000c2000000000000000d00000000c3000000000000000d0000 *0000c4000000000000000d00000000c5000000000000000d00000000c6000000000000000d0000 *0000c7000000000000000d00000000c8000000000000000e03000000c9000000000000000e0300 *0000ca000000000000000e03000000cb000000000000000e00000000cc000000000000000e0000 *0000cd000000000000000e00000000ce000000000000000e00000000c6000000000000000e0000 *0000cf000000000000000e00000000d0000000000000000e00000000d1000000000000000e0000 *0000d2000000000000000e00000000d3000000000000000e00000000d4000000000000000e0000 *0000d5000000000000000e00000000d6000000000000000e00000000d7000000000000000e0000 *0000d8000000000000000e00000000d9000000000000001003000000da00000000000000100300 *0000db000000000000001003000000dc000000000000001003000000dd00000000000000100300 *0000de000000000000001003000000df000000000000001003000000e000000000000000100300 *0000c9000000000000001003000000e1000000000000001001000000e200000000000000100000 *0000e3000000000000001000000000e4000000000000001000000000e500000000000000100000 *0000e6000000000000001000000000e7000000000000001000000000e800000000000000100000 *0000e9000000000000001000000000ea000000000000001000000000eb00000000000000100000 *0000ec000000000000001000000000ed000000000000001000000000ee00000000000000100000 *0000ef000000000000001000000000f0000000000000001000000000f100000000000000100000 *0000f2000000000000001000000000f3000000000000001000000000f400000000000000100000 *0000f5000000000000001000000000f6000000000000001000000000f700000000000000100000 *0000f8000000000000001000000000f9000000000000001000000000fa00000000000000100000 *0000fb000000000000001000000000d4000000000000001200000000fc00000000000000120000 *0000fd000000000000001200000000fe000000000000001200000000ff00000000000000120000 *000100000000000000001200000001010000000000000012000000010200000000000001030000 *00000000001468617070737461636b2d7574696c2d302e352e3000000000000000184861707073 *7461636b2e5574696c2e46696c654d616e6970000000000000001148617070737461636b2e5574 *696c2e5448000000000000001e48617070737461636b2e5574696c2e4f70656e4578636c757369 *76656c79000000000000001348617070737461636b2e5574696c2e4d61696c0000000000000018 *48617070737461636b2e5574696c2e4c6f67466f726d6174000000000000001a48617070737461 *636b2e5574696c2e486f737441646472657373000000000000001348617070737461636b2e5574 *696c2e43726f6e000000000000001948617070737461636b2e5574696c2e436f6e63757272656e *74000000000000001648617070737461636b2e5574696c2e54696d654f75740000000000000015 *48617070737461636b2e5574696c2e436f6d6d6f6e000000000000001f48617070737461636b2e *5574696c2e42797465537472696e67436f6d706174000000000000001848617070737461636b2e *5574696c2e4175746f4275696c64000000000000001448617070737461636b2e43727970746f2e *4d4435000000000000001548617070737461636b2e43727970746f2e5348413100000000000000 *1848617070737461636b2e5574696c2e4461656d6f6e697a650000000000000014486170707374 *61636b2e43727970746f2e444553000000000000001448617070737461636b2e43727970746f2e *573634000000000000001748617070737461636b2e43727970746f2e4261736536340000000000 *00001548617070737461636b2e43727970746f2e484d4143000000000000000466696e64000000 *0000000006616c77617973000000000000000a696e7374616e6365442700000000000000066973 *53696744000000000000000f6f70656e4578636c75736976656c79000000000000000b6873656d *61696c2d312e360000000000000025546578742e506172736572436f6d62696e61746f72732e50 *61727365632e5266633238323200000000000000084e616d6541646472000000000000000d6e61 *6d65416464725f61646472000000000000000d6e616d65416464725f6e616d6500000000000000 *0d53696d706c654d657373616765000000000000000466726f6d0000000000000002746f000000 *00000000077375626a6563740000000000000004626f6479000000000000001273656e6453696d *706c654d65737361676573000000000000000f73656e645261774d657373616765730000000000 *000012666f726d617454696d65436f6d62696e65640000000000000015666f726d617452657175 *657374436f6d62696e6564000000000000000c486f73744164647265737336000000000000000b *486f737441646472657373000000000000000f73686f77486f7374416464726573730000000000 *00001073686f77486f73744164647265737336000000000000000463726f6e000000000000000a *666f726b4576657253740000000000000009666f726576657253740000000000000008666f726b *45766572000000000000000e77726974654368616e5269676874000000000000000d7772697465 *4368616e4c6566740000000000000005666f726b5f0000000000000007666f7265766572000000 *0000000004666f726b000000000000001372656769737465725265736574416374696f6e000000 *000000000572657365740000000000000005736c656570000000000000001054696d654f757445 *7863657074696f6e00000000000000107769746854696d654f75744d6179626500000000000000 *0b7769746854696d654f7574000000000000000f776974685361666554696d654f757400000000 *00000014776974685361666554696d654f75744d6179626500000000000000067365636f6e6400 *0000000000000c45706f63685365636f6e647300000000000000075365636f6e64730000000000 *00000c65706f63685365636f6e6473000000000000000e6553656373546f43616c54696d650000 *00000000000965706f63685069636f00000000000000056c6f674d430000000000000008685075 *744c696e650000000000000006684765744c6e0000000000000009756e427261636b6574000000 *00000000056c7472696d0000000000000005727472696d00000000000000047472696d00000000 *0000000973706c69744c697374000000000000000b73706c69744c697374427900000000000000 *0573706c6974000000000000000a6d625265616446696c6500000000000000066d617046737400 *000000000000066d6170536e6400000000000000067265766d61700000000000000004636f6d70 *000000000000000a72756e436f6d6d616e64000000000000000564656275670000000000000006 *64656275674d0000000000000005726561644d00000000000000066d617962654d000000000000 *0005626f6f6c4d00000000000000056e6f744d620000000000000008706572696f646963000000 *00000000022e5e0000000000000009706572696f646963270000000000000009627265616b4368 *6172000000000000000c627265616b43686172456e64000000000000000964726f705370616365 *000000000000000c64726f705370616365456e64000000000000000b72656368756e6b4c617a79 *00000000000000096175746f4275696c64000000000000000a4d4435436f6e7465787400000000 *000000116d6435496e697469616c436f6e7465787400000000000000036d643500000000000000 *0b6d643546696e616c697a6500000000000000096d6435557064617465000000000000000e6170 *706c794d4435526f756e64730000000000000009737472696e674d443500000000000000047465 *737400000000000000076d643546696c6500000000000000047368613100000000000000077368 *61315261770000000000000009736861315f73697a6500000000000000096461656d6f6e697a65 *000000000000000f6765744461656d6f6e697a656449640000000000000003456e630000000000 *0000074d65737361676500000000000000076465735f656e6300000000000000076465735f6465 *6300000000000000037061640000000000000005756e706164000000000000000d70726f705f50 *6164556e506164000000000000000769733443686172000000000000000d717561644368617254 *6f573634000000000000000d773634546f5175616443686172000000000000000c773634546f51 *7561644e756d000000000000000b746f517561644368617273000000000000000c737472696e67 *546f57363473000000000000000c77363473546f537472696e67000000000000000e70726f705f *737472696e675736340000000000000008686578546f573634000000000000000b737472696e67 *546f4b6579000000000000000b6465735f656e6372797074000000000000000b6465735f646563 *72797074000000000000000870726f705f444553000000000000000663686f7037320000000000 *000006656e636f646500000000000000066465636f64650000000000000008686d616353484131 *0000000000000012526563757273696f6e507265646963617465000000000000000f46696c7465 *72507265646963617465000000000000000a46696e64436c61757365000000000000000b6d746c *2d312e312e302e320000000000000018436f6e74726f6c2e4d6f6e61642e53746174652e4c617a *79000000000000000553746174650000000000000019436f6e74726f6c2e4d6f6e61642e537461 *74652e436c61737300000000000000036765740000000000000003707574000000000000000246 *43000000000000000572756e4643000000000000000846696c65496e666f000000000000000869 *6e666f506174680000000000000009696e666f4465707468000000000000000a696e666f537461 *74757300000000000000046d6b4649000000000000000a6576616c436c61757365000000000000 *00066576616c4649000000000000000e676574446972436f6e74656e7473000000000000000f66 *696e645769746848616e646c657200000000000000046261736500000000000000104748432e49 *4f2e48616e646c652e4644000000000000000673746465727200000000000000086768632d7072 *696d00000000000000084748432e426f6f6c000000000000000454727565000000000000001074 *656d706c6174652d6861736b656c6c00000000000000174c616e67756167652e4861736b656c6c *2e54482e4c69620000000000000009696e7374616e6365440000000000000009746f4d65737361 *676500000000000000046c6f672700000000000000074748432e4e756d00000000000000012b00 *000000000000012d000000000000001154696d654f7574457863657074696f6e49000000000000 *000a54696d654f7574544964000000000000000e74696d654f7574496453746174650000000000 *00000d6e65787454696d654f7574496400000000000000067468726f7727000000000000000874 *68726f77546f270000000000000006636174636827000000000000000474727927000000000000 *000d636174636854696d654f75744900000000000000096d61796265546f457800000000000000 *0c6c6173746e6f6e737061636500000000000000076275696c646572000000000000000672756e *6e6572000000000000000672756e42696e00000000000000086275696c6442696e000000000000 *00064d443543747800000000000000096d645061727469616c000000000000000a6d644c656674 *4f766572000000000000000a6d64546f74616c4c656e000000000000000a4d4435506172746961 *6c00000000000000064d44355061720000000000000009626c6f636b53697a6500000000000000 *0e626c6f636b53697a6542797465730000000000000011626c6f636b53697a6542797465735736 *34000000000000000d626c6f636b53697a65426974730000000000000002683000000000000000 *0268310000000000000002683200000000000000026833000000000000000a73697a655f73706c *69740000000000000005626c6f636b0000000000000010706572666f726d4d4435557064617465 *0000000000000008526f746174696f6e000000000000000358595a000000000000000541424344 *450000000000000018736861315f737465705f315f325f7061645f6c656e677468000000000000 *0012736861315f737465705f315f325f776f726b000000000000000a7265706c69636174652700 *00000000000010736861315f737465705f335f696e69740000000000000010736861315f737465 *705f345f6d61696e0000000000000004646f6974000000000000000b736861315f6164645f7773 *000000000000000c6765745f776f72645f333273000000000000000874616b6544726f70000000 *0000000013736861315f737465705f355f646973706c61790000000000000012736861315f7374 *65705f355f636f6e6361740000000000000015646973706c61795f3332626974735f61735f6865 *780000000000000017646973706c61795f3332626974735f61735f386269747300000000000000 *04726f744c00000000000000064269747336340000000000000006426974733536000000000000 *000642697473343800000000000000064269747333320000000000000005426974733600000000 *00000005426974733400000000000000034b657900000000000000065a6f726436340000000000 *00000357363400000000000000026c6f00000000000000026869000000000000000c773634546f *496e7465676572000000000000000c696e7465676572546f573634000000000000000662697469 *66790000000000000008756e6269746966790000000000000013696e697469616c5f7065726d75 *746174696f6e00000000000000126b65795f7472616e73666f726d6174696f6e00000000000000 *06646f5f64657300000000000000086465735f776f726b0000000000000008646f5f726f756e64 *00000000000000076765745f6b65790000000000000017636f6d7072657373696f6e5f7065726d *75746174696f6e0000000000000015657870616e73696f6e5f7065726d75746174696f6e000000 *0000000005735f626f780000000000000007735f626f785f310000000000000007735f626f785f *320000000000000007735f626f785f330000000000000007735f626f785f340000000000000007 *735f626f785f350000000000000007735f626f785f360000000000000007735f626f785f370000 *000000000007735f626f785f380000000000000005705f626f78000000000000000a66696e616c *5f7065726d000000000000000b656e636f64654172726179000000000000000a696e74345f6368 *617233000000000000000a63686172335f696e74340000000000000004656e6331000000000000 *000b717561647275706c6574730000000000000003656e630000000000000003646364 addfile ./docs/0.5.0/happstack-util/Happstack-Crypto-Base64.html hunk ./docs/0.5.0/happstack-util/Happstack-Crypto-Base64.html 1 + + +Happstack.Crypto.Base64
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Crypto.Base64
    Synopsis
    encode :: String -> String
    decode :: String -> String
    chop72 :: String -> String
    Documentation
    encode :: String -> StringSource
    decode :: String -> StringSource
    chop72 :: String -> StringSource
    Cut up a string into 72 char lines, each line terminated by CRLF. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Crypto-DES.html hunk ./docs/0.5.0/happstack-util/Happstack-Crypto-DES.html 1 + + +Happstack.Crypto.DES
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Crypto.DES
    Documentation
    des_enc :: Message -> Key -> EncSource
    des_dec :: Message -> Key -> EncSource
    type Message = Zord64Source
    type Enc = Zord64Source
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Crypto-HMAC.html hunk ./docs/0.5.0/happstack-util/Happstack-Crypto-HMAC.html 1 + + +Happstack.Crypto.HMAC
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Crypto.HMAC
    Documentation
    hmacSHA1 :: String -> String -> StringSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Crypto-MD5.html hunk ./docs/0.5.0/happstack-util/Happstack-Crypto-MD5.html 1 + + +Happstack.Crypto.MD5
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Crypto.MD5
    Synopsis
    md5 :: ByteString -> ByteString
    md5InitialContext :: MD5Context
    md5Update :: MD5Context -> ByteString -> MD5Context
    md5Finalize :: MD5Context -> ByteString
    data MD5Context
    md5File :: String -> IO ()
    stringMD5 :: ByteString -> String
    applyMD5Rounds :: MD5Partial -> ByteString -> MD5Partial
    test :: IO ()
    Documentation
    md5 :: ByteString -> ByteStringSource
    Will read the lazy ByteString and return the md5 digest. + Some application might want to wrap this function for type safty. +
    md5InitialContext :: MD5ContextSource
    md5Update :: MD5Context -> ByteString -> MD5ContextSource
    md5Finalize :: MD5Context -> ByteStringSource
    data MD5Context Source
    md5File :: String -> IO ()Source
    stringMD5 :: ByteString -> StringSource
    applyMD5Rounds :: MD5Partial -> ByteString -> MD5PartialSource
    test :: IO ()Source
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Crypto-SHA1.html hunk ./docs/0.5.0/happstack-util/Happstack-Crypto-SHA1.html 1 + + +Happstack.Crypto.SHA1
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Crypto.SHA1
    Documentation
    sha1 :: String -> StringSource
    sha1Raw :: String -> StringSource
    sha1_size :: Integral a => a -> String -> StringSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Crypto-W64.html hunk ./docs/0.5.0/happstack-util/Happstack-Crypto-W64.html 1 + + +Happstack.Crypto.W64
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Crypto.W64
    Documentation
    pad :: String -> StringSource
    unpad :: Enum a => [a] -> [a]Source
    prop_PadUnPad :: String -> BoolSource
    is4Char :: [a] -> BoolSource
    quadCharToW64 :: (Num b, Enum a) => [a] -> bSource
    w64ToQuadChar :: (Integral a, Enum b) => a -> [b]Source
    w64ToQuadNum :: Integral a => a -> [a]Source
    toQuadChars :: [a] -> [[a]]Source
    stringToW64s :: Num a => String -> [a]Source
    w64sToString :: Enum b => [Integer] -> [b]Source
    prop_stringW64 :: String -> BoolSource
    hexToW64 :: Num a => String -> aSource
    stringToKey :: Num a => String -> aSource
    des_encrypt :: String -> String -> [Enc]Source
    des_decrypt :: Enum a => String -> [Message] -> [a]Source
    prop_DES :: String -> String -> BoolSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-AutoBuild.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-AutoBuild.html 1 + + +Happstack.Util.AutoBuild
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.AutoBuild
    Portabilitylinux/windows
    Stabilityprovisional
    MaintainerMatthew Elder
    Description
    Synopsis
    autoBuild :: String -> String -> [String] -> IO ()
    Documentation
    autoBuildSource
    :: StringBuild command +
    -> StringPath to binary +
    -> [String]Arguments to use when running binary +
    -> IO ()
    Functionality for the autoBuild tool. + Inspired by searchpath. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-ByteStringCompat.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-ByteStringCompat.html 1 + + +Happstack.Util.ByteStringCompat
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.ByteStringCompat
    Description
    Compatiblity for ByteStrings +
    Synopsis
    breakChar :: Char -> ByteString -> (ByteString, ByteString)
    breakCharEnd :: Char -> ByteString -> (ByteString, ByteString)
    dropSpace :: ByteString -> ByteString
    dropSpaceEnd :: ByteString -> ByteString
    rechunkLazy :: ByteString -> ByteString
    Documentation
    breakChar :: Char -> ByteString -> (ByteString, ByteString)Source
    Semantically equivalent to break on strings +
    breakCharEnd :: Char -> ByteString -> (ByteString, ByteString)Source

    breakCharEnd behaves like breakChar, but from the end of the + ByteString. +

     breakCharEnd ('b') (pack "aabbcc") == ("aab","cc")
    +

    and the following are equivalent: +

     breakCharEnd 'c' "abcdef"
    + let (x,y) = break (=='c') (reverse "abcdef")
    + in (reverse (drop 1 y), reverse x)
    +
    dropSpace :: ByteString -> ByteStringSource
    Drops leading spaces in the ByteString +
    dropSpaceEnd :: ByteString -> ByteStringSource
    Drops trailing spaces in the ByteString +
    rechunkLazy :: ByteString -> ByteStringSource
    Chunk a lazy bytestring into reasonable chunks - is id from outside. + This is useful to make bytestring chunks reasonable sized for e.g. + compression. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-Common.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-Common.html 1 + + +Happstack.Util.Common
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.Common
    Description
    Various helper routines. +
    Synopsis
    type Seconds = Int
    type EpochSeconds = Int64
    epochSeconds :: CalendarTime -> EpochSeconds
    eSecsToCalTime :: EpochSeconds -> IO CalendarTime
    epochPico :: CalendarTime -> Integer
    logMC :: Priority -> String -> IO ()
    hPutLine :: Handle -> String -> IO ()
    hGetLn :: Handle -> IO String
    ltrim :: String -> String
    rtrim :: String -> String
    trim :: String -> String
    unBracket :: String -> String
    splitList :: Eq a => a -> [a] -> [[a]]
    splitListBy :: (a -> Bool) -> [a] -> [[a]]
    split :: (a -> Bool) -> [a] -> ([a], [a])
    mbReadFile :: a -> (String -> a) -> FilePath -> IO a
    mapFst :: (a -> b) -> [(a, x)] -> [(b, x)]
    mapSnd :: (a -> b) -> [(x, a)] -> [(x, b)]
    revmap :: a -> [a -> b] -> [b]
    comp :: Ord t => (a -> t) -> a -> a -> Ordering
    runCommand :: String -> [String] -> IO ()
    debug :: Show a => String -> a -> a
    debugM :: Monad m => String -> m ()
    readM :: (Monad m, Read t) => String -> m t
    maybeM :: Monad m => Maybe a -> m a
    boolM :: MonadPlus m => Bool -> m Bool
    notMb :: a -> Maybe a -> Maybe a
    periodic :: [Int] -> IO () -> IO ThreadId
    (.^) :: Int -> Int -> Int
    periodic' :: [Int] -> IO a -> IO a
    Documentation
    type Seconds = IntSource
    type EpochSeconds = Int64Source
    epochSeconds :: CalendarTime -> EpochSecondsSource
    eSecsToCalTime :: EpochSeconds -> IO CalendarTimeSource
    epochPico :: CalendarTime -> IntegerSource
    logMC :: Priority -> String -> IO ()Source
    hPutLine :: Handle -> String -> IO ()Source
    Put a line into a handle followed by rn and echo to stdout +
    hGetLn :: Handle -> IO StringSource
    Get a line from the handle and echo to stdout +
    ltrim :: String -> StringSource
    rtrim :: String -> StringSource
    trim :: String -> StringSource
    unBracket :: String -> StringSource
    splitList :: Eq a => a -> [a] -> [[a]]Source

    Removes the whitespace surrounding a string as well + as the first and last character. + unBracket (asdf) = asdf +

    Drops the whitespace at the start of the string +

    Drops the whitespace at the end of the string +

    Trims the beginning and ending whitespace of a string +

    Repeadly splits a list by the provided separator and collects the results +

    splitListBy :: (a -> Bool) -> [a] -> [[a]]Source
    Repeatedly splits a list and collects the results +
    split :: (a -> Bool) -> [a] -> ([a], [a])Source
    Split is like break, but the matching element is dropped. +
    mbReadFile :: a -> (String -> a) -> FilePath -> IO aSource
    Read file with a default value if the file does not exist. +
    mapFst :: (a -> b) -> [(a, x)] -> [(b, x)]Source
    mapSnd :: (a -> b) -> [(x, a)] -> [(x, b)]Source
    revmap :: a -> [a -> b] -> [b]Source
    applies the list of functions to the provided argument +
    comp :: Ord t => (a -> t) -> a -> a -> OrderingSource
    comp f a b compares a and b after apply + f. +
    runCommand :: String -> [String] -> IO ()Source
    Run an external command. Upon failure print status + to stderr. +
    debug :: Show a => String -> a -> aSource
    Unsafe tracing, outputs the message and the value to stderr. +
    debugM :: Monad m => String -> m ()Source
    Unsafe tracing messages inside a monad. +
    readM :: (Monad m, Read t) => String -> m tSource
    Read in any monad. +
    maybeM :: Monad m => Maybe a -> m aSource
    Convert Maybe into an another monad. This is a simple injection that calls + fail when given a Nothing. +
    boolM :: MonadPlus m => Bool -> m BoolSource
    Lifts a bool into a MonadPlus, with False mapped to the mzero. +
    notMb :: a -> Maybe a -> Maybe aSource
    notMb a b returns Just a if b is Nothing and Nothing if + b is Just _. +
    periodic :: [Int] -> IO () -> IO ThreadIdSource
    Takes a list of delays, in seconds, and an action to execute + repeatedly. The action is then executed repeatedly in a separate thread + until the list has been consumed. The first action takes place immediately. +
    (.^) :: Int -> Int -> IntSource
    periodic' :: [Int] -> IO a -> IO aSource
    Similar to periodic but runs in the same thread +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-Concurrent.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-Concurrent.html 1 + + +Happstack.Util.Concurrent
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.Concurrent
    Synopsis
    forkEverSt :: (t -> IO t) -> t -> IO ThreadId
    foreverSt :: Monad m => (t -> m t) -> t -> m b
    forkEver :: IO a -> IO ThreadId
    writeChanRight :: Chan (Either a b) -> b -> IO ()
    writeChanLeft :: Chan (Either a b) -> a -> IO ()
    fork_ :: IO a -> IO ()
    fork :: IO a -> IO ThreadId
    registerResetAction :: IO () -> IO ()
    reset :: IO ()
    forever :: IO a -> IO a
    sleep :: Int -> IO ()
    Documentation
    forkEverSt :: (t -> IO t) -> t -> IO ThreadIdSource
    Equivalent to a composition of fork and foreverSt +
    foreverSt :: Monad m => (t -> m t) -> t -> m bSource
    Similar to forever but with an explicit state parameter threaded through + the computation. +
    forkEver :: IO a -> IO ThreadIdSource
    Equivalent to a composition of fork and forever +
    writeChanRight :: Chan (Either a b) -> b -> IO ()Source
    Lifts the argument with Right before writing it into the chan +
    writeChanLeft :: Chan (Either a b) -> a -> IO ()Source
    Lifts the argument with Left before writing it into the chan +
    fork_ :: IO a -> IO ()Source
    Fork that throws away the ThreadId +
    fork :: IO a -> IO ThreadIdSource
    Fork a new thread. +
    registerResetAction :: IO () -> IO ()Source
    Register an action to be run when ghci is restarted. +
    reset :: IO ()Source
    Reset state +
    forever :: IO a -> IO aSource
    A version of forever that will gracefully catch IO exceptions and continue + executing the provided action. +
    sleep :: Int -> IO ()Source
    Sleep N seconds +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-Cron.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-Cron.html 1 + + +Happstack.Util.Cron
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.Cron
    Synopsis
    cron :: Seconds -> IO () -> IO a
    Documentation
    cron :: Seconds -> IO () -> IO aSource
    Given an action f and a number of seconds t, cron will execute + f every t seconds with the first execution t seconds after cron is called. + cron does not spawn a new thread. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-Daemonize.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-Daemonize.html 1 + + +Happstack.Util.Daemonize
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.Daemonize
    Documentation
    daemonize :: FilePath -> IO a -> IO aSource
    getDaemonizedId :: IO StringSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-FileManip.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-FileManip.html 1 + + +Happstack.Util.FileManip
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.FileManip
    Synopsis
    always :: FindClause Bool
    find :: RecursionPredicate -> FilterPredicate -> FilePath -> IO [FilePath]
    Documentation
    always :: FindClause BoolSource
    Unconditionally return True. +
    findSource
    :: RecursionPredicatecontrol recursion into subdirectories +
    -> FilterPredicatedecide whether a file appears in the result +
    -> FilePathdirectory to start searching +
    -> IO [FilePath]files that matched the FilterPredicate +
    Search a directory recursively, with recursion controlled by a + RecursionPredicate. Lazily return a sorted list of all files + matching the given FilterPredicate. Any errors that occur are + ignored, with warnings printed to stderr. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-HostAddress.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-HostAddress.html 1 + + +Happstack.Util.HostAddress
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.HostAddress
    Synopsis
    showHostAddress :: HostAddress -> String
    showHostAddress6 :: HostAddress6 -> String
    type HostAddress = Word32
    type HostAddress6 = (Word32, Word32, Word32, Word32)
    Documentation
    showHostAddress :: HostAddress -> StringSource
    Converts a HostAddress to a String in dot-decimal notation +
    showHostAddress6 :: HostAddress6 -> StringSource
    Converts a IPv6 HostAddress6 to standard hex notation +
    type HostAddress = Word32Source
    type HostAddress6 = (Word32, Word32, Word32, Word32)Source
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-LogFormat.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-LogFormat.html 1 + + +Happstack.Util.LogFormat
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.LogFormat
    Synopsis
    formatTimeCombined :: FormatTime t => t -> String
    formatRequestCombined :: FormatTime t => String -> String -> t -> String -> Int -> Integer -> String -> String -> String
    Documentation
    formatTimeCombined :: FormatTime t => t -> StringSource

    Format the time as describe in the Apache combined log format. + http:httpd.apache.orgdocs2.2/logs.html#combined +

    The format is: + [daymonthyear:hour:minute:second zone] + day = 2*digit + month = 3*letter + year = 4*digit + hour = 2*digit + minute = 2*digit + second = 2*digit + zone = (+ | -) 4*digit +

    formatRequestCombined :: FormatTime t => String -> String -> t -> String -> Int -> Integer -> String -> String -> StringSource

    Format the request as describe in the Apache combined log format. + http:httpd.apache.orgdocs2.2/logs.html#combined +

    The format is: s %b "%{Referer}i" "%{User-agent}i".html" +>%h - %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i" + %h: This is the IP address of the client (remote host) which made the request to the server. + %u: This is the userid of the person requesting the document as determined by HTTP authentication. + %t: The time that the request was received. + %r: The request line from the client is given in double quotes. + %>s: This is the status code that the server sends back to the client. + %b: The last part indicates the size of the object returned to the client, not including the response headers. + %{Referer}: The Referer (sic) HTTP request header. + %{User-agent}: The User-Agent HTTP request header. +

    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-Mail.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-Mail.html 1 + + +Happstack.Util.Mail
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.Mail
    Portabilitylinux/windows
    Stabilityprovisional
    MaintainerMatthew Elder
    Description

    Mail is a simple library with which you can add email functionality to your + application. It assumes you have access to a smarthost which can relay all + your mail. +

    As an example: +

     import Happstack.Util.Mail
    + main :: IO ()
    + main = do
    +     sendSimpleMessages "10.2.23.11" "example.com" [message]
    +     where message = SimpleMessage
    +                         [NameAddr (Just "John Doe") "johnd@example.com"]
    +                         [NameAddr (Just "Patch-Tag Team") "team@patch-tag.com"]
    +                         "My test email using Happstack.Util.Mail"
    +                         "Hi, this is a test email which uses Happstack."
    +
    Synopsis
    data NameAddr = NameAddr {
    nameAddr_name :: Maybe String
    nameAddr_addr :: String
    }
    data SimpleMessage = SimpleMessage {
    from :: [NameAddr]
    to :: [NameAddr]
    subject :: String
    body :: String
    }
    sendRawMessages :: SockAddr -> String -> [Message] -> IO ()
    sendSimpleMessages :: String -> String -> [SimpleMessage] -> IO ()
    Documentation
    data NameAddr Source
    Constructors
    NameAddr
    nameAddr_name :: Maybe String
    nameAddr_addr :: String
    data SimpleMessage Source
    Constructors
    SimpleMessage
    from :: [NameAddr]The sender(s) +
    to :: [NameAddr]The recipient(s) +
    subject :: StringThe subject line +
    body :: StringThe body +
    sendRawMessagesSource
    :: SockAddrSockAddr for the smarthost +
    -> StringHELO domain (should be the same as your from-address-domain) +
    -> [Message]List of messages to send +
    -> IO ()
    Use this if you need more control than sendSimpleMessages gives you. +
    sendSimpleMessagesSource
    :: StringIP address of the smarthost +
    -> StringHELO domain (should be the same as your from-address-domain) +
    -> [SimpleMessage]List of simple messages to send +
    -> IO ()
    Simplest way to send mail. Takes the smarthost ip, the HELO domain, and a list of SimpleMessage. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-OpenExclusively.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-OpenExclusively.html 1 + + +Happstack.Util.OpenExclusively
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.OpenExclusively
    Description
    Cross platform way to open a file exclusively +
    Synopsis
    openExclusively :: FilePath -> IO Handle
    Documentation
    Cross platform way to open a file exclusively +
    openExclusively :: FilePath -> IO HandleSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-TH.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-TH.html 1 + + +Happstack.Util.TH
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.TH
    Synopsis
    instanceD' :: CxtQ -> TypeQ -> Q [Dec] -> DecQ
    isSigD :: Dec -> Bool
    Documentation
    instanceD' :: CxtQ -> TypeQ -> Q [Dec] -> DecQSource
    Version of instanceD that takes in a Q [Dec] instead of a [Q Dec] + and filters out signatures from the list of declarations +
    isSigD :: Dec -> BoolSource
    Returns true if the Dec matches a SigD constructor +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/Happstack-Util-TimeOut.html hunk ./docs/0.5.0/happstack-util/Happstack-Util-TimeOut.html 1 + + +Happstack.Util.TimeOut
     happstack-util-0.5.0: Web frameworkSource codeContentsIndex
    Happstack.Util.TimeOut
    Portabilityuses mdo
    Description

    Timeout implementation for performing operations in the IO monad + with a timeout added. Both using Maybe and exceptions to handle + timeouts are supported. +

    Timeouts can be implemented in GHC with either a global handler + or a per-timeout thread which sleeps until the timeout. The latter + is used in this module. Blocking on foreign calls can cause + problems as GHC has no way of interrupting such threads. + The module provides a slightly slower alternative implementation + which returns even if the computation has blocked on a foreign + call. This should not be an issue unless -threaded is used. +

    The timeouts are currently limited to a maximum of about + 2000 seconds. This is a feature of threadDelay, but + supporting longer timeouts is certainly possible if + that is desirable. +

    For nested timeouts there are different ways to implement them: + a) attach an id to the exception so that the catch knows wether it may catch + this timout exception. I've choosen this because overhead is only passing + and incrementing an integer value. A integer wrap araound is possible but + too unlikely to happen to make me worry about it + b) start a new workiing and killing thread so that if the original thread + was run within withTimeOut itself it catches the exception and not an inner + timout. (this is done in withSafeTimeOut, for another reason though) + c) keep throwing exceptions until the the withTimeOut function kills the + killing thread. But consider sequence (forever (timeOut threadDelay 10sec) ) + In this case the exception will be called and the next timOut may be entered + before the second Exception has been thrown +

    All exceptions but the internal TimeOutExceptionI are rethrown in the calling thread +

    Synopsis
    withTimeOut :: Int -> IO a -> IO a
    withTimeOutMaybe :: Int -> IO a -> IO (Maybe a)
    withSafeTimeOut :: Int -> IO a -> IO a
    withSafeTimeOutMaybe :: Int -> IO a -> IO (Maybe a)
    data TimeOutException = TimeOutException
    second :: Int
    Documentation
    withTimeOut :: Int -> IO a -> IO aSource
    This is the normal timeout handler. It throws a TimeOutException exception, + if the timeout occurs. +
    withTimeOutMaybe :: Int -> IO a -> IO (Maybe a)Source
    This handler returns Nothing if the timeout occurs and Just a if computation + returns a. +
    withSafeTimeOut :: Int -> IO a -> IO aSource
    Like timeOut, but additionally it works even if the computation is blocking + async exceptions (explicitely or by a blocking FFI call). This consumes + more resources than timeOut, but is still quite fast. +
    withSafeTimeOutMaybe :: Int -> IO a -> IO (Maybe a)Source
    Like withTimeOutMaybe, but handles the operation blocking exceptions like withSafeTimeOut + does. +
    data TimeOutException Source
    Constructors
    TimeOutException
    second :: IntSource
    Constant representing one second. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/doc-index.html hunk ./docs/0.5.0/happstack-util/doc-index.html 1 + + +happstack-util-0.5.0: Web framework (Index)
     happstack-util-0.5.0: Web frameworkContentsIndex
    .^
    always
    applyMD5Rounds
    autoBuild
    body
    boolM
    breakChar
    breakCharEnd
    chop72
    comp
    cron
    daemonize
    debug
    debugM
    decode
    des_dec
    des_decrypt
    des_enc
    des_encrypt
    dropSpace
    dropSpaceEnd
    Enc
    encode
    epochPico
    EpochSeconds
    epochSeconds
    eSecsToCalTime
    find
    forever
    foreverSt
    fork
    forkEver
    forkEverSt
    fork_
    formatRequestCombined
    formatTimeCombined
    from
    getDaemonizedId
    hexToW64
    hGetLn
    hmacSHA1
    HostAddress
    HostAddress6
    hPutLine
    instanceD'
    is4Char
    isSigD
    logMC
    ltrim
    mapFst
    mapSnd
    maybeM
    mbReadFile
    md5
    MD5Context
    md5File
    md5Finalize
    md5InitialContext
    md5Update
    Message
    NameAddr
    1 (Type/Class)
    2 (Data Constructor)
    nameAddr_addr
    nameAddr_name
    notMb
    openExclusively
    pad
    periodic
    periodic'
    prop_DES
    prop_PadUnPad
    prop_stringW64
    quadCharToW64
    readM
    rechunkLazy
    registerResetAction
    reset
    revmap
    rtrim
    runCommand
    second
    Seconds
    sendRawMessages
    sendSimpleMessages
    sha1
    sha1Raw
    sha1_size
    showHostAddress
    showHostAddress6
    SimpleMessage
    1 (Type/Class)
    2 (Data Constructor)
    sleep
    split
    splitList
    splitListBy
    stringMD5
    stringToKey
    stringToW64s
    subject
    test
    TimeOutException
    1 (Type/Class)
    2 (Data Constructor)
    to
    toQuadChars
    trim
    unBracket
    unpad
    w64sToString
    w64ToQuadChar
    w64ToQuadNum
    withSafeTimeOut
    withSafeTimeOutMaybe
    withTimeOut
    withTimeOutMaybe
    writeChanLeft
    writeChanRight
    addfile ./docs/0.5.0/happstack-util/frames.html hunk ./docs/0.5.0/happstack-util/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/happstack-util/haddock-util.js hunk ./docs/0.5.0/happstack-util/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/happstack-util/haddock.css hunk ./docs/0.5.0/happstack-util/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + addfile ./docs/0.5.0/happstack-util/happstack-util.haddock binary ./docs/0.5.0/happstack-util/happstack-util.haddock oldhex * newhex *0d0cface000f00008d08000080f774000000000000000000000001000000010000000000000001 *000000020000000000000002000000030000000000000002000000040000000000000003000000 *050000000000000004000000060000000000000004000000070000000000000004000000080000 *0000000000040000000900000000000000040000000a00000000000000040000000b0000000000 *0000040000000c00000000000000040000000d00000000000000040000000e0000000000000004 *0000000f0000000000000004000000100000000000000004000000110000000000000005000000 *120000000000000005000000130000000000000006000000140000000000000006000000150000 *000000000006000000160000000000000006000000170000000000000007000000180000000000 *0000080000001900000000000000080000001a00000000000000080000001b0000000000000008 *0000001c00000000000000080000001d00000000000000080000001e0000000000000008000000 *1f0000000000000008000000200000000000000008000000210000000000000008000000220000 *000000000008000000230000000000000009000000240000000000000009000000250000000000 *000009000000260000000000000009000000270000000000000009000000280000000000000009 *0000002900000000000000090000002a000000000000000a0000002b000000000000000a000000 *2c000000000000000a0000002d000000000000000a0000002e000000000000000a0000002f0000 *00000000000a00000030000000000000000a00000031000000000000000a000000320000000000 *00000a00000033000000000000000a00000034000000000000000a00000035000000000000000a *00000036000000000000000a00000037000000000000000a00000038000000000000000a000000 *39000000000000000a0000003a000000000000000a0000003b000000000000000a0000003c0000 *00000000000a0000003d000000000000000a0000003e000000000000000a0000003f0000000000 *00000a00000040000000000000000a00000041000000000000000a00000042000000000000000a *00000043000000000000000a00000044000000000000000a00000045000000000000000a000000 *46000000000000000a00000047000000000000000a00000048000000000000000b000000490000 *00000000000b0000004a000000000000000b0000004b000000000000000b0000004c0000000000 *00000b0000004d000000000000000c0000004e000000000000000d0000004f000000000000000d *00000050000000000000000d00000051000000000000000d00000052000000000000000d000000 *53000000000000000d00000054000000000000000d00000055000000000000000d000000560000 *00000000000d00000057000000000000000e00000058000000000000000e000000590000000000 *00000e0000005a000000000000000f0000005b000000000000000f0000005c0000000000000010 *0000005d00000000000000100000005e00000000000000100000005f0000000000000010000000 *600000000000000011000000610000000000000011000000620000000000000011000000630000 *000000000011000000640000000000000011000000650000000000000011000000660000000000 *000011000000670000000000000011000000680000000000000011000000690000000000000011 *0000006a00000000000000110000006b00000000000000110000006c0000000000000011000000 *6d00000000000000110000006e00000000000000110000006f0000000000000011000000700000 *000000000012000000710000000000000012000000720000000000000012000000730000000000 *000013130000000000000001000000001100000074000000000075000000000076010301023b00 *00004d0000006f0000006e0000006100000064000000690000006300000020000000630000006f *0000006e0000007400000061000000690000006e00000065000000720000002000000066000000 *6f000000720000002000000066000000690000006c0000006500000020000000690000006e0000 *00660000006f000000720000006d0000006100000074000000690000006f0000006e0000002c00 *000020000000610000006c0000006c0000006f00000077000000690000006e0000006700000020 *000000660000006f0000007200000020000000630000006c00000065000000610000006e000000 *0a01022900000020000000630000006f0000006e00000073000000740000007200000075000000 *6300000074000000690000006f0000006e000000200000006f0000006600000020000000630000 *006f0000006d00000062000000690000006e00000061000000740000006f000000720000007300 *00002e000000200000002000000057000000720000006100000070000000730000002000000074 *0000006800000065000000200104020000007700000078010211000000200000006d0000006f00 *00006e00000061000000640000002c000000200000006200000075000000740000002000000064 *0000006f00000065000000730000006e01020100000027010202000000740000000a0102070000 *0020000000610000006c0000006c0000006f000000770000002001040100000079010204000000 *200000006f00000072000000200104010000007a02020000002e0000000a000000007b00000000 *007c00000000007d0103023b000000490000006e000000660000006f000000720000006d000000 *6100000074000000690000006f0000006e00000020000000630000006f0000006c0000006c0000 *006500000063000000740000006500000064000000200000006400000075000000720000006900 *00006e000000670000002000000074000000680000006500000020000000740000007200000061 *00000076000000650000007200000073000000610000006c000000200000006f00000066000000 *2000000061000000200000006400000069000000720000006500000063000000740000006f0000 *0072000000790000002e0000000a000000007e00000000007f0103020a00000066000000690000 *006c0000006500000020000000700000006100000074000000680000000a000000008001030218 *00000063000000750000007200000072000000650000006e000000740000002000000072000000 *6500000063000000750000007200000073000000690000006f0000006e00000020000000640000 *00650000007000000074000000680000000a00000000810103020f000000730000007400000061 *000000740000007500000073000000200000006f00000066000000200000006600000069000000 *6c000000650000000a0000000082010301020c000000430000006f0000006e0000007300000074 *000000720000007500000063000000740000002000000061000000200104020000007e0000007d *02080000002000000076000000610000006c00000075000000650000002e0000000a0000000083 *01010301020e00000052000000750000006e000000200000007400000068000000650000002000 *0000670000006900000076000000650000006e000000200104010000007601020e000000200000 *006f0000006e000000200000007400000068000000650000002000000067000000690000007600 *0000650000006e000000200104020000007e0000007d01021000000020000000610000006e0000 *00640000002000000072000000650000007400000075000000720000006e000000200000006900 *000074000000730000000a01024300000020000000720000006500000073000000750000006c00 *0000740000002e0000002000000020000000540000006800000069000000730000002000000063 *000000610000006e00000020000000620000006500000020000000750000007300000065000000 *66000000750000006c00000020000000690000006600000020000000790000006f000000750000 *002000000061000000720000006500000020000000770000007200000069000000740000006900 *00006e0000006700000020000000610000002000000066000000750000006e0000006300000074 *000000690000006f0000006e00000020000000740000006f000000200000007000000061000000 *73000000730000000a01020400000020000000740000006f00000020010204000000660000006f *0000006c0000006402020000002e0000000a010302090000004500000078000000610000006d00 *0000700000006c000000650000003a0000000a07010222000000200000006d0000007900000046 *0000006f0000006c0000006400000046000000750000006e00000063000000200000003a000000 *3a0000002000000061000000200000002d0000003e0000002000000046000000690000006c0000 *0065000000490000006e000000660000006f000000200000002d0000003e000000200000006100 *00000a010246000000200000006d00000079000000460000006f0000006c000000640000004600 *0000750000006e0000006300000020000000610000002000000069000000200000003d00000020 *0000006c0000006500000074000000200000007500000073000000650000005400000068000000 *690000007300000046000000690000006c00000065000000200000003d00000020000000650000 *0076000000610000006c000000430000006c000000610000007500000073000000650000002000 *00002800000066000000690000006c000000650000004e000000610000006d0000006500000020 *0000003d0000003d0000003f0000002000000022000000660000006f0000006f00000022000000 *2900000020000000690000000a0102240000002000000020000000200000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *00200000002000000020000000690000006e000000200000006900000066000000200000007500 *000073000000650000005400000068000000690000007300000046000000690000006c00000065 *0000000a0102270000002000000020000000200000002000000020000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *200000002000000020000000200000007400000068000000650000006e00000020000000660000 *006900000064000000640000006c00000065000000570000006900000074000000680000002000 *0000610000000a021c000000200000002000000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000020000000200000002000 *000020000000200000002000000020000000650000006c00000073000000650000002000000061 *0000000a0000000084000000000085010301023b0000004c000000690000007300000074000000 *200000007400000068000000650000002000000066000000690000006c00000065000000730000 *0020000000690000006e0000002000000074000000680000006500000020000000670000006900 *000076000000650000006e00000020000000640000006900000072000000650000006300000074 *0000006f00000072000000790000002c00000020000000730000006f0000007200000074000000 *65000000640000002c00000020000000610000006e000000640000002000000077000000690000 *0074000000680000006f000000750000007400000020010201000000220102010000002e010201 *000000220102010000000a010204000000200000006f0000007200000020010201000000220102 *020000002e0000002e0102010000002202020000002e0000000a0000000086010301023f000000 *530000006500000061000000720000006300000068000000200000006100000020000000640000 *0069000000720000006500000063000000740000006f0000007200000079000000200000007200 *000065000000630000007500000072000000730000006900000076000000650000006c00000079 *0000002c0000002000000077000000690000007400000068000000200000007200000065000000 *63000000750000007200000073000000690000006f0000006e00000020000000630000006f0000 *006e00000074000000720000006f0000006c0000006c0000006500000064000000200000006200 *00007900000020000000610000000a010201000000200104010000007401022c0000002e000000 *20000000200000004c000000610000007a000000690000006c0000007900000020000000720000 *00650000007400000075000000720000006e000000200000006100000020000000730000006f00 *000072000000740000006500000064000000200000006c00000069000000730000007400000020 *0000006f0000006600000020000000610000006c0000006c000000200000006600000069000000 *6c00000065000000730000000a010214000000200000006d000000610000007400000063000000 *68000000690000006e000000670000002000000074000000680000006500000020000000670000 *006900000076000000650000006e000000200104010000007501021d0000002e00000020000000 *20000000410000006e00000079000000200000006500000072000000720000006f000000720000 *00730000002000000074000000680000006100000074000000200000006f000000630000006300 *00007500000072000000200000006100000072000000650000000a022200000020000000640000 *0065000000610000006c0000007400000020000000770000006900000074000000680000002000 *000062000000790000002000000074000000680000006500000020000000670000006900000076 *000000650000006e0000002000000068000000610000006e000000640000006c00000065000000 *720000002e0000000a05000000000000000003020e0000006500000072000000720000006f0000 *00720000002000000068000000610000006e000000640000006c00000065000000720000000a00 *00000000000001030226000000630000006f0000006e00000074000000720000006f0000006c00 *000020000000720000006500000063000000750000007200000073000000690000006f0000006e *00000020000000690000006e000000740000006f00000020000000730000007500000062000000 *6400000069000000720000006500000063000000740000006f0000007200000069000000650000 *00730000000a000000000000000203022c00000064000000650000006300000069000000640000 *006500000020000000770000006800000065000000740000006800000065000000720000002000 *0000610000002000000066000000690000006c0000006500000020000000610000007000000070 *0000006500000061000000720000007300000020000000690000006e0000002000000074000000 *680000006500000020000000720000006500000073000000750000006c000000740000000a0000 *00000000000303021d0000006400000069000000720000006500000063000000740000006f0000 *00720000007900000020000000740000006f000000200000007300000074000000610000007200 *00007400000020000000730000006500000061000000720000006300000068000000690000006e *000000670000000a00000000000000040301021700000066000000690000006c00000065000000 *730000002000000074000000680000006100000074000000200000006d00000061000000740000 *006300000068000000650000006400000020000000740000006800000065000000200104010000 *007502010000000a00000000010301023f00000053000000650000006100000072000000630000 *006800000020000000610000002000000064000000690000007200000065000000630000007400 *00006f000000720000007900000020000000720000006500000063000000750000007200000073 *0000006900000076000000650000006c000000790000002c000000200000007700000069000000 *740000006800000020000000720000006500000063000000750000007200000073000000690000 *006f0000006e00000020000000630000006f0000006e00000074000000720000006f0000006c00 *00006c000000650000006400000020000000620000007900000020000000610000000a01020100 *0000200104010000007401022c0000002e00000020000000200000004c000000610000007a0000 *00690000006c000000790000002000000072000000650000007400000075000000720000006e00 *0000200000006100000020000000730000006f0000007200000074000000650000006400000020 *0000006c000000690000007300000074000000200000006f000000660000002000000061000000 *6c0000006c0000002000000066000000690000006c00000065000000730000000a010214000000 *200000006d00000061000000740000006300000068000000690000006e00000067000000200000 *0074000000680000006500000020000000670000006900000076000000650000006e0000002001 *04010000007501021d0000002e0000002000000020000000410000006e00000079000000200000 *006500000072000000720000006f00000072000000730000002000000074000000680000006100 *000074000000200000006f00000063000000630000007500000072000000200000006100000072 *000000650000000a0102230000002000000069000000670000006e0000006f0000007200000065 *000000640000002c00000020000000770000006900000074000000680000002000000077000000 *61000000720000006e000000690000006e00000067000000730000002000000070000000720000 *00690000006e00000074000000650000006400000020000000740000006f000000200104010000 *008702020000002e0000000a040000000000000000030226000000630000006f0000006e000000 *74000000720000006f0000006c0000002000000072000000650000006300000075000000720000 *0073000000690000006f0000006e00000020000000690000006e000000740000006f0000002000 *00007300000075000000620000006400000069000000720000006500000063000000740000006f *000000720000006900000065000000730000000a000000000000000103022c0000006400000065 *000000630000006900000064000000650000002000000077000000680000006500000074000000 *68000000650000007200000020000000610000002000000066000000690000006c000000650000 *002000000061000000700000007000000065000000610000007200000073000000200000006900 *00006e000000200000007400000068000000650000002000000072000000650000007300000075 *0000006c000000740000000a000000000000000203021d00000064000000690000007200000065 *00000063000000740000006f000000720000007900000020000000740000006f00000020000000 *730000007400000061000000720000007400000020000000730000006500000061000000720000 *006300000068000000690000006e000000670000000a0000000000000003030102170000006600 *0000690000006c0000006500000073000000200000007400000068000000610000007400000020 *0000006d0000006100000074000000630000006800000065000000640000002000000074000000 *6800000065000000200104010000007502010000000a000000010103010217000000550000006e *000000630000006f0000006e000000640000006900000074000000690000006f0000006e000000 *610000006c0000006c000000790000002000000072000000650000007400000075000000720000 *006e000000200104010000008802020000002e0000000a00020000000000000001020000000100 *0000000002000000000000000001000000000000000002000000000200000002010301020b0000 *0056000000650000007200000073000000690000006f0000006e000000200000006f0000006600 *000020010401000000890102170000002000000074000000680000006100000074000000200000 *0074000000610000006b000000650000007300000020000000690000006e000000200000006100 *00002000000051000000200000005b0000004400000065000000630102010000005d0102140000 *0020000000690000006e0000007300000074000000650000006100000064000000200000006f00 *0000660000002000000061000000200000005b0000005100000020000000440000006500000063 *0102010000005d0102010000000a023a00000020000000610000006e0000006400000020000000 *66000000690000006c00000074000000650000007200000073000000200000006f000000750000 *0074000000200000007300000069000000670000006e0000006100000074000000750000007200 *000065000000730000002000000066000000720000006f0000006d000000200000007400000068 *00000065000000200000006c000000690000007300000074000000200000006f00000066000000 *200000006400000065000000630000006c00000061000000720000006100000074000000690000 *006f0000006e000000730000000a00000000030103023300000052000000650000007400000075 *000000720000006e00000073000000200000007400000072000000750000006500000020000000 *690000006600000020000000740000006800000065000000200000004400000065000000630000 *00200000006d000000610000007400000063000000680000006500000073000000200000006100 *0000200000005300000069000000670000004400000020000000630000006f0000006e00000073 *00000074000000720000007500000063000000740000006f000000720000000a00020000000200 *000003020000000200000003000200000002000000000300000000000000000300000000010000 *000400000100000004010000000400010000000400000000000000000400010d0000006c000000 *690000006e00000075000000780000002f00000077000000690000006e000000640000006f0000 *007700000073010b00000070000000720000006f00000076000000690000007300000069000000 *6f0000006e000000610000006c010d0000004d0000006100000074000000740000006800000065 *0000007700000020000000450000006c0000006400000065000000720a0000000900000000000a *00000000000b0103020e0000005400000068000000650000002000000073000000650000006e00 *00006400000065000000720000002800000073000000290000000a000000000c01030211000000 *540000006800000065000000200000007200000065000000630000006900000070000000690000 *00650000006e000000740000002800000073000000290000000a000000000d0103021100000054 *0000006800000065000000200000007300000075000000620000006a0000006500000063000000 *74000000200000006c000000690000006e000000650000000a000000000e010302090000005400 *0000680000006500000020000000620000006f00000064000000790000000a000000008a000000 *00008b00000000000f0103026200000053000000690000006d000000700000006c000000650000 *0073000000740000002000000077000000610000007900000020000000740000006f0000002000 *000073000000650000006e00000064000000200000006d00000061000000690000006c0000002e *000000200000002000000054000000610000006b00000065000000730000002000000074000000 *680000006500000020000000730000006d000000610000007200000074000000680000006f0000 *0073000000740000002000000069000000700000002c0000002000000074000000680000006500 *00002000000048000000450000004c0000004f00000020000000640000006f0000006d00000061 *000000690000006e0000002c00000020000000610000006e000000640000002000000061000000 *200000006c000000690000007300000074000000200000006f0000006600000020000000530000 *00690000006d000000700000006c000000650000004d0000006500000073000000730000006100 *000067000000650000002e0000000a03000000000000000003021c000000490000005000000020 *00000061000000640000006400000072000000650000007300000073000000200000006f000000 *660000002000000074000000680000006500000020000000730000006d00000061000000720000 *0074000000680000006f00000073000000740000000a000000000000000103023d000000480000 *00450000004c0000004f00000020000000640000006f0000006d00000061000000690000006e00 *0000200000002800000073000000680000006f000000750000006c000000640000002000000062 *00000065000000200000007400000068000000650000002000000073000000610000006d000000 *6500000020000000610000007300000020000000790000006f0000007500000072000000200000 *0066000000720000006f0000006d0000002d000000610000006400000064000000720000006500 *000073000000730000002d000000640000006f0000006d00000061000000690000006e00000029 *0000000a00000000000000020302200000004c000000690000007300000074000000200000006f *000000660000002000000073000000690000006d000000700000006c0000006500000020000000 *6d0000006500000073000000730000006100000067000000650000007300000020000000740000 *006f0000002000000073000000650000006e000000640000000a00000010010302450000005500 *000073000000650000002000000074000000680000006900000073000000200000006900000066 *00000020000000790000006f00000075000000200000006e000000650000006500000064000000 *200000006d0000006f000000720000006500000020000000630000006f0000006e000000740000 *00720000006f0000006c000000200000007400000068000000610000006e000000200000007300 *0000650000006e0000006400000053000000690000006d000000700000006c000000650000004d *000000650000007300000073000000610000006700000065000000730000002000000067000000 *6900000076000000650000007300000020000000790000006f000000750000002e0000000a0300 *0000000000000003021b000000530000006f000000630000006b00000041000000640000006400 *00007200000020000000660000006f000000720000002000000074000000680000006500000020 *000000730000006d000000610000007200000074000000680000006f0000007300000074000000 *0a000000000000000103023d00000048000000450000004c0000004f0000002000000064000000 *6f0000006d00000061000000690000006e000000200000002800000073000000680000006f0000 *00750000006c000000640000002000000062000000650000002000000074000000680000006500 *00002000000073000000610000006d000000650000002000000061000000730000002000000079 *0000006f00000075000000720000002000000066000000720000006f0000006d0000002d000000 *610000006400000064000000720000006500000073000000730000002d000000640000006f0000 *006d00000061000000690000006e000000290000000a00000000000000020302190000004c0000 *00690000007300000074000000200000006f00000066000000200000006d000000650000007300 *0000730000006100000067000000650000007300000020000000740000006f0000002000000073 *000000650000006e000000640000000a0c00000005000000060000000700000008000000090000 *000a0000000b0000000c0000000d0000000e0000000f000000100c000000050000000600000008 *00000007000000090000000a0000000b0000000c0000000d0000000e000000100000000f000800 *000009050000000a0000000b0000000c0000000d0000000e0000000a000000000b000000000c00 *0000000d000000000e000000000f00000000100000000000000000050000000002000000110101 *0301023f000000460000006f000000720000006d00000061000000740000002000000074000000 *68000000650000002000000074000000690000006d000000650000002000000061000000730000 *002000000064000000650000007300000063000000720000006900000062000000650000002000 *0000690000006e0000002000000074000000680000006500000020000000410000007000000061 *00000063000000680000006500000020000000630000006f0000006d0000006200000069000000 *6e0000006500000064000000200000006c0000006f0000006700000020000000660000006f0000 *00720000006d00000061000000740000002e0000000a0102080000002000000020000000200000 *00680000007400000074000000700000003a010602000102100000006800000074000000740000 *0070000000640000002e0000006100000070000000610000006300000068000000650000002e00 *00006f000000720000006701060204000000640000006f00000063000000730102030000003200 *00002e000000320102010000002f0102090000006c0000006f00000067000000730000002e0000 *0068000000740000006d0000006c010201000000230209000000630000006f0000006d00000062 *000000690000006e00000065000000640000000a0301020f000000540000006800000065000000 *20000000660000006f000000720000006d00000061000000740000002000000069000000730000 *003a0000000a0102070000002000000020000000200000005b0000006400000061000000790106 *02050000006d0000006f0000006e000000740000006801021c0000007900000065000000610000 *00720000003a000000680000006f00000075000000720000003a0000006d000000690000006e00 *00007500000074000000650000003a0000007300000065000000630000006f0000006e00000064 *000000200000007a0000006f0000006e000000650102010000005d0102010000000a0102120000 *0020000000200000002000000020000000640000006100000079000000200000003d0000002000 *0000320000002a00000064000000690000006700000069000000740000000a0102150000002000 *00002000000020000000200000006d0000006f0000006e0000007400000068000000200000003d *00000020000000330000002a0000006c0000006500000074000000740000006500000072000000 *0a0102130000002000000020000000200000002000000079000000650000006100000072000000 *200000003d00000020000000340000002a00000064000000690000006700000069000000740000 *000a01021300000020000000200000002000000020000000680000006f00000075000000720000 *00200000003d00000020000000320000002a000000640000006900000067000000690000007400 *00000a010215000000200000002000000020000000200000006d000000690000006e0000007500 *00007400000065000000200000003d00000020000000320000002a000000640000006900000067 *00000069000000740000000a010215000000200000002000000020000000200000007300000065 *000000630000006f0000006e00000064000000200000003d00000020000000320000002a000000 *64000000690000006700000069000000740000000a01020c000000200000002000000020000000 *200000007a0000006f0000006e00000065000000200000003d0000002000000028010401000000 *8c010203000000200000007c000000200104010000008d020b0000002900000020000000340000 *002a0000006400000069000000670000006900000074000000200000000a000000001201010301 *0242000000460000006f000000720000006d000000610000007400000020000000740000006800 *000065000000200000007200000065000000710000007500000065000000730000007400000020 *000000610000007300000020000000640000006500000073000000630000007200000069000000 *620000006500000020000000690000006e00000020000000740000006800000065000000200000 *0041000000700000006100000063000000680000006500000020000000630000006f0000006d00 *000062000000690000006e0000006500000064000000200000006c0000006f0000006700000020 *000000660000006f000000720000006d00000061000000740000002e0000000a01020800000020 *0000002000000020000000680000007400000074000000700000003a0106020001021000000068 *000000740000007400000070000000640000002e00000061000000700000006100000063000000 *68000000650000002e0000006f000000720000006701060204000000640000006f000000630000 *0073010203000000320000002e000000320102010000002f0102090000006c0000006f00000067 *000000730000002e00000068000000740000006d0000006c010201000000230209000000630000 *006f0000006d00000062000000690000006e00000065000000640000000a0301020f0000005400 *0000680000006500000020000000660000006f000000720000006d000000610000007400000020 *00000069000000730000003a000000200105350000002500000068000000200000002d00000020 *000000250000007500000020000000250000007400000020000000220000002500000072000000 *2200000020000000250000003e0000007300000020000000250000006200000020000000220000 *00250000007b000000520000006500000066000000650000007200000065000000720000007d00 *000069000000220000002000000022000000250000007b00000055000000730000006500000072 *0000002d0000006100000067000000650000006e000000740000007d0000006900000022010201 *0000000a0102690000002000000025000000680000003a00000020000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000054000000 *680000006900000073000000200000006900000073000000200000007400000068000000650000 *002000000049000000500000002000000061000000640000006400000072000000650000007300 *000073000000200000006f00000066000000200000007400000068000000650000002000000063 *0000006c00000069000000650000006e0000007400000020000000280000007200000065000000 *6d0000006f000000740000006500000020000000680000006f0000007300000074000000290000 *00200000007700000068000000690000006300000068000000200000006d000000610000006400 *000065000000200000007400000068000000650000002000000072000000650000007100000075 *00000065000000730000007400000020000000740000006f000000200000007400000068000000 *65000000200000007300000065000000720000007600000065000000720000002e0000000a0102 *6f0000002000000025000000750000003a00000020000000200000002000000020000000200000 *002000000020000000200000002000000020000000200000002000000054000000680000006900 *000073000000200000006900000073000000200000007400000068000000650000002000000075 *0000007300000065000000720000006900000064000000200000006f0000006600000020000000 *74000000680000006500000020000000700000006500000072000000730000006f0000006e0000 *002000000072000000650000007100000075000000650000007300000074000000690000006e00 *0000670000002000000074000000680000006500000020000000640000006f0000006300000075 *0000006d000000650000006e000000740000002000000061000000730000002000000064000000 *650000007400000065000000720000006d000000690000006e0000006500000064000000200000 *006200000079000000200000004800000054000000540000005000000020000000610000007500 *00007400000068000000650000006e000000740000006900000063000000610000007400000069 *0000006f0000006e0000002e0000000a0102380000002000000025000000740000003a00000020 *000000200000002000000020000000200000002000000020000000200000002000000020000000 *20000000200000005400000068000000650000002000000074000000690000006d000000650000 *002000000074000000680000006100000074000000200000007400000068000000650000002000 *000072000000650000007100000075000000650000007300000074000000200000007700000061 *000000730000002000000072000000650000006300000065000000690000007600000065000000 *640000002e0000000a01024c0000002000000025000000720000003a0000002000000020000000 *200000002000000020000000200000002000000020000000200000002000000020000000200000 *005400000068000000650000002000000072000000650000007100000075000000650000007300 *000074000000200000006c000000690000006e000000650000002000000066000000720000006f *0000006d0000002000000074000000680000006500000020000000630000006c00000069000000 *650000006e00000074000000200000006900000073000000200000006700000069000000760000 *00650000006e00000020000000690000006e00000020000000640000006f000000750000006200 *00006c000000650000002000000071000000750000006f0000007400000065000000730000002e *0000000a01025200000020000000250000003e000000730000003a000000200000002000000020 *000000200000002000000020000000200000002000000020000000200000002000000054000000 *680000006900000073000000200000006900000073000000200000007400000068000000650000 *002000000073000000740000006100000074000000750000007300000020000000630000006f00 *000064000000650000002000000074000000680000006100000074000000200000007400000068 *000000650000002000000073000000650000007200000076000000650000007200000020000000 *73000000650000006e0000006400000073000000200000006200000061000000630000006b0000 *0020000000740000006f0000002000000074000000680000006500000020000000630000006c00 *000069000000650000006e000000740000002e0000000a01027b00000020000000250000006200 *00003a000000200000002000000020000000200000002000000020000000200000002000000020 *000000200000002000000020000000540000006800000065000000200000006c00000061000000 *7300000074000000200000007000000061000000720000007400000020000000690000006e0000 *006400000069000000630000006100000074000000650000007300000020000000740000006800 *0000650000002000000073000000690000007a00000065000000200000006f0000006600000020 *000000740000006800000065000000200000006f000000620000006a0000006500000063000000 *740000002000000072000000650000007400000075000000720000006e00000065000000640000 *0020000000740000006f0000002000000074000000680000006500000020000000630000006c00 *000069000000650000006e000000740000002c000000200000006e0000006f0000007400000020 *000000690000006e000000630000006c0000007500000064000000690000006e00000067000000 *2000000074000000680000006500000020000000720000006500000073000000700000006f0000 *006e00000073000000650000002000000068000000650000006100000064000000650000007200 *0000730000002e0000000a01021400000020000000250000007b00000052000000650000006600 *0000650000007200000065000000720000007d0000003a00000020000000200000002000000020 *000000540000006800000065000000200105070000005200000065000000660000006500000072 *000000650000007201021c00000020000000280000007300000069000000630000002900000020 *000000480000005400000054000000500000002000000072000000650000007100000075000000 *650000007300000074000000200000006800000065000000610000006400000065000000720000 *002e0000000a023500000020000000250000007b00000055000000730000006500000072000000 *2d0000006100000067000000650000006e000000740000007d0000003a00000020000000540000 *00680000006500000020000000550000007300000065000000720000002d000000410000006700 *0000650000006e0000007400000020000000480000005400000054000000500000002000000072 *000000650000007100000075000000650000007300000074000000200000006800000065000000 *610000006400000065000000720000002e000000200000000a0002000000110000001202000000 *110000001200020000001100000000120000000000000000060000000004000000130000000000 *140000000000150103023b000000430000006f0000006e00000076000000650000007200000074 *00000073000000200000006100000020000000480000006f000000730000007400000041000000 *64000000640000007200000065000000730000007300000020000000740000006f000000200000 *006100000020000000530000007400000072000000690000006e00000067000000200000006900 *00006e00000020000000640000006f000000740000002d00000064000000650000006300000069 *0000006d000000610000006c000000200000006e0000006f000000740000006100000074000000 *690000006f0000006e0000000a000000001601030236000000430000006f0000006e0000007600 *000065000000720000007400000073000000200000006100000020000000490000005000000076 *0000003600000020000000480000006f0000007300000074000000410000006400000064000000 *720000006500000073000000730000003600000020000000740000006f00000020000000730000 *0074000000610000006e0000006400000061000000720000006400000020000000680000006500 *000078000000200000006e0000006f000000740000006100000074000000690000006f0000006e *0000000a0004000000130000001400000015000000160400000015000000160000001400000013 *00040000001300000000140000000015000000001600000000000000000700000000020000008e *000000000017010301023f000000470000006900000076000000650000006e0000002000000061 *0000006e00000020000000610000006300000074000000690000006f0000006e00000020000000 *6600000020000000610000006e000000640000002000000061000000200000006e000000750000 *006d000000620000006500000072000000200000006f0000006600000020000000730000006500 *0000630000006f0000006e000000640000007300000020000000740000002c0000002000000063 *000000720000006f0000006e0000002000000077000000690000006c0000006c00000020000000 *650000007800000065000000630000007500000074000000650000000a01024c00000020000000 *660000002000000065000000760000006500000072000000790000002000000074000000200000 *007300000065000000630000006f0000006e000000640000007300000020000000770000006900 *000074000000680000002000000074000000680000006500000020000000660000006900000072 *000000730000007400000020000000650000007800000065000000630000007500000074000000 *690000006f0000006e0000002000000074000000200000007300000065000000630000006f0000 *006e00000064000000730000002000000061000000660000007400000065000000720000002000 *000063000000720000006f0000006e000000200000006900000073000000200000006300000061 *0000006c0000006c00000065000000640000002e0000000a022300000020000000630000007200 *00006f0000006e00000020000000640000006f0000006500000073000000200000006e0000006f *0000007400000020000000730000007000000061000000770000006e0000002000000061000000 *200000006e00000065000000770000002000000074000000680000007200000065000000610000 *00640000002e0000000a0001000000170100000017000100000017000000000000000008000000 *000b00000018010302320000004500000071000000750000006900000076000000610000006c00 *0000650000006e0000007400000020000000740000006f00000020000000610000002000000063 *0000006f0000006d000000700000006f000000730000006900000074000000690000006f000000 *6e000000200000006f0000006600000020000000660000006f000000720000006b000000200000 *00610000006e0000006400000020000000660000006f0000007200000065000000760000006500 *00007200000053000000740000000a0000000019010301024900000053000000690000006d0000 *00690000006c000000610000007200000020000000740000006f00000020000000660000006f00 *000072000000650000007600000065000000720000002000000062000000750000007400000020 *0000007700000069000000740000006800000020000000610000006e0000002000000065000000 *78000000700000006c000000690000006300000069000000740000002000000073000000740000 *0061000000740000006500000020000000700000006100000072000000610000006d0000006500 *000074000000650000007200000020000000740000006800000072000000650000006100000064 *0000006500000064000000200000007400000068000000720000006f0000007500000067000000 *680000000a02120000002000000074000000680000006500000020000000630000006f0000006d *0000007000000075000000740000006100000074000000690000006f0000006e0000002e000000 *0a000000001a010302300000004500000071000000750000006900000076000000610000006c00 *0000650000006e0000007400000020000000740000006f00000020000000610000002000000063 *0000006f0000006d000000700000006f000000730000006900000074000000690000006f000000 *6e000000200000006f0000006600000020000000660000006f000000720000006b000000200000 *00610000006e0000006400000020000000660000006f0000007200000065000000760000006500 *0000720000000a000000001b0103023e0000004c00000069000000660000007400000073000000 *2000000074000000680000006500000020000000610000007200000067000000750000006d0000 *00650000006e000000740000002000000077000000690000007400000068000000200000005200 *000069000000670000006800000074000000200000006200000065000000660000006f00000072 *000000650000002000000077000000720000006900000074000000690000006e00000067000000 *20000000690000007400000020000000690000006e000000740000006f00000020000000740000 *006800000065000000200000006300000068000000610000006e0000000a000000001c0103023d *0000004c0000006900000066000000740000007300000020000000740000006800000065000000 *20000000610000007200000067000000750000006d000000650000006e00000074000000200000 *0077000000690000007400000068000000200000004c0000006500000066000000740000002000 *00006200000065000000660000006f000000720000006500000020000000770000007200000069 *00000074000000690000006e000000670000002000000069000000740000002000000069000000 *6e000000740000006f000000200000007400000068000000650000002000000063000000680000 *00610000006e0000000a000000001d01030223000000460000006f000000720000006b00000020 *00000074000000680000006100000074000000200000007400000068000000720000006f000000 *770000007300000020000000610000007700000061000000790000002000000074000000680000 *006500000020000000540000006800000072000000650000006100000064000000490000006400 *00000a000000001e010301024b0000004100000020000000760000006500000072000000730000 *00690000006f0000006e000000200000006f0000006600000020000000660000006f0000007200 *000065000000760000006500000072000000200000007400000068000000610000007400000020 *00000077000000690000006c0000006c0000002000000067000000720000006100000063000000 *6500000066000000750000006c0000006c00000079000000200000006300000061000000740000 *00630000006800000020000000490000004f000000200000006500000078000000630000006500 *00007000000074000000690000006f0000006e0000007300000020000000610000006e00000064 *00000020000000630000006f0000006e00000074000000690000006e0000007500000065000000 *0a022000000020000000650000007800000065000000630000007500000074000000690000006e *00000067000000200000007400000068000000650000002000000070000000720000006f000000 *760000006900000064000000650000006400000020000000610000006300000074000000690000 *006f0000006e0000002e0000000a000000001f01030213000000460000006f000000720000006b *0000002000000061000000200000006e0000006500000077000000200000007400000068000000 *720000006500000061000000640000002e0000000a000000002001030235000000520000006500 *000067000000690000007300000074000000650000007200000020000000610000006e00000020 *000000610000006300000074000000690000006f0000006e00000020000000740000006f000000 *2000000062000000650000002000000072000000750000006e0000002000000077000000680000 *00650000006e000000200000006700000068000000630000006900000020000000690000007300 *000020000000720000006500000073000000740000006100000072000000740000006500000064 *0000002e0000000a00000000210103020c00000052000000650000007300000065000000740000 *002000000073000000740000006100000074000000650000000a00000000220103021000000053 *0000006c000000650000006500000070000000200000004e000000200000007300000065000000 *630000006f0000006e00000064000000730000000a000b00000018000000190000001a0000001b *0000001c0000001d0000001e0000001f0000002000000021000000220b00000018000000190000 *001a0000001b0000001c0000001d0000001f00000020000000210000001e00000022000b000000 *180000000019000000001a000000001b000000001c000000001d000000001e000000001f000000 *002000000000210000000022000000000000000009000108000000750000007300000065000000 *73000000200000006d000000640000006f0000120000002300000000002400000000008f000000 *000090000000000091000000000092000000000093000000000094000000000095000000000096 *000000000097000000000098000000000025010301021500000054000000680000006900000073 *0000002000000068000000610000006e000000640000006c000000650000007200000020000000 *72000000650000007400000075000000720000006e0000007300000020010702070000004e0000 *006f0000007400000068000000690000006e0000006701021b0000002000000069000000660000 *00200000007400000068000000650000002000000074000000690000006d000000650000006f00 *00007500000074000000200000006f000000630000006300000075000000720000007300000020 *000000610000006e0000006400000020010702060000004a000000750000007300000074000000 *200000006101021100000020000000690000006600000020000000630000006f0000006d000000 *7000000075000000740000006100000074000000690000006f0000006e000000200000000a0102 *090000002000000072000000650000007400000075000000720000006e00000073000000200107 *02010000006102020000002e0000000a0000000026010301024c00000054000000680000006900 *00007300000020000000690000007300000020000000740000006800000065000000200000006e *0000006f000000720000006d000000610000006c0000002000000074000000690000006d000000 *650000006f00000075000000740000002000000068000000610000006e000000640000006c0000 *0065000000720000002e0000002000000049000000740000002000000074000000680000007200 *00006f000000770000007300000020000000610000002000000054000000690000006d00000065 *0000004f0000007500000074000000450000007800000063000000650000007000000074000000 *690000006f0000006e000000200000006500000078000000630000006500000070000000740000 *00690000006f0000006e0000002c0000000a021800000020000000690000006600000020000000 *7400000068000000650000002000000074000000690000006d000000650000006f000000750000 *0074000000200000006f00000063000000630000007500000072000000730000002e0000000a00 *00000099000000000027010301024c0000004c000000690000006b000000650000002000000074 *000000690000006d000000650000004f00000075000000740000002c0000002000000062000000 *7500000074000000200000006100000064000000640000006900000074000000690000006f0000 *006e000000610000006c0000006c00000079000000200000006900000074000000200000007700 *00006f000000720000006b00000073000000200000006500000076000000650000006e00000020 *00000069000000660000002000000074000000680000006500000020000000630000006f000000 *6d0000007000000075000000740000006100000074000000690000006f0000006e000000200000 *00690000007300000020000000620000006c0000006f000000630000006b000000690000006e00 *0000670000000a010249000000200000006100000073000000790000006e000000630000002000 *0000650000007800000063000000650000007000000074000000690000006f0000006e00000073 *00000020000000280000006500000078000000700000006c000000690000006300000069000000 *74000000650000006c00000079000000200000006f000000720000002000000062000000790000 *00200000006100000020000000620000006c0000006f000000630000006b000000690000006e00 *000067000000200000004600000046000000490000002000000063000000610000006c0000006c *000000290000002e00000020000000540000006800000069000000730000002000000063000000 *6f0000006e00000073000000750000006d00000065000000730000000a0237000000200000006d *0000006f0000007200000065000000200000007200000065000000730000006f00000075000000 *72000000630000006500000073000000200000007400000068000000610000006e000000200000 *0074000000690000006d000000650000004f00000075000000740000002c000000200000006200 *00007500000074000000200000006900000073000000200000007300000074000000690000006c *0000006c0000002000000071000000750000006900000074000000650000002000000066000000 *6100000073000000740000002e0000000a0000000028010301025a0000004c000000690000006b *00000065000000200000007700000069000000740000006800000054000000690000006d000000 *650000004f00000075000000740000004d000000610000007900000062000000650000002c0000 *00200000006200000075000000740000002000000068000000610000006e000000640000006c00 *0000650000007300000020000000740000006800000065000000200000006f0000007000000065 *000000720000006100000074000000690000006f0000006e00000020000000620000006c000000 *6f000000630000006b000000690000006e00000067000000200000006500000078000000630000 *00650000007000000074000000690000006f0000006e00000073000000200000006c0000006900 *00006b000000650000002000000077000000690000007400000068000000530000006100000066 *0000006500000054000000690000006d000000650000004f00000075000000740000000a020700 *000020000000640000006f00000065000000730000002e0000000a000000002901030222000000 *430000006f0000006e0000007300000074000000610000006e0000007400000020000000720000 *006500000070000000720000006500000073000000650000006e00000074000000690000006e00 *000067000000200000006f0000006e00000065000000200000007300000065000000630000006f *0000006e000000640000002e0000000a0007000000230000002400000025000000260000002700 *000028000000290700000026000000250000002700000028000000230000002400000029000700 *000023010000002400000024000000002500000000260000000027000000002800000000290000 *0000000000000a000000001e0000002a00000000002b00000000002c00000000002d0000000000 *2e00000000002f0000000000300103010225000000500000007500000074000000200000006100 *0000200000006c000000690000006e0000006500000020000000690000006e000000740000006f *00000020000000610000002000000068000000610000006e000000640000006c00000065000000 *20000000660000006f0000006c0000006c0000006f000000770000006500000064000000200000 *00620000007900000020010502000000720000006e021400000020000000610000006e00000064 *000000200000006500000063000000680000006f00000020000000740000006f00000020000000 *7300000074000000640000006f00000075000000740000000a00000000310103022e0000004700 *000065000000740000002000000061000000200000006c000000690000006e0000006500000020 *00000066000000720000006f0000006d0000002000000074000000680000006500000020000000 *68000000610000006e000000640000006c0000006500000020000000610000006e000000640000 *00200000006500000063000000680000006f00000020000000740000006f000000200000007300 *000074000000640000006f00000075000000740000000a00000000320000000000330000000000 *3400000000003500000000003601010101010301023400000052000000650000006d0000006f00 *000076000000650000007300000020000000740000006800000065000000200000007700000068 *000000690000007400000065000000730000007000000061000000630000006500000020000000 *730000007500000072000000720000006f000000750000006e00000064000000690000006e0000 *0067000000200000006100000020000000730000007400000072000000690000006e0000006700 *00002000000061000000730000002000000077000000650000006c0000006c0000000a01022200 *000020000000610000007300000020000000740000006800000065000000200000006600000069 *00000072000000730000007400000020000000610000006e00000064000000200000006c000000 *610000007300000074000000200000006300000068000000610000007200000061000000630000 *007400000065000000720000002e0000000a01020100000020010701020a000000750000006e00 *0000420000007200000061000000630000006b0000006500000074000000200105090000002000 *000020000000280000006100000073000000640000006600000029000000200102030000002000 *00003d0000002005040000006100000073000000640000006602010000000a0302300000004400 *0000720000006f0000007000000073000000200000007400000068000000650000002000000077 *000000680000006900000074000000650000007300000070000000610000006300000065000000 *200000006100000074000000200000007400000068000000650000002000000073000000740000 *00610000007200000074000000200000006f000000660000002000000074000000680000006500 *000020000000730000007400000072000000690000006e000000670000000a03022e0000004400 *0000720000006f0000007000000073000000200000007400000068000000650000002000000077 *000000680000006900000074000000650000007300000070000000610000006300000065000000 *2000000061000000740000002000000074000000680000006500000020000000650000006e0000 *0064000000200000006f0000006600000020000000740000006800000065000000200000007300 *00007400000072000000690000006e000000670000000a03023600000054000000720000006900 *00006d000000730000002000000074000000680000006500000020000000620000006500000067 *000000690000006e0000006e000000690000006e0000006700000020000000610000006e000000 *6400000020000000650000006e00000064000000690000006e0000006700000020000000770000 *006800000069000000740000006500000073000000700000006100000063000000650000002000 *00006f00000066000000200000006100000020000000730000007400000072000000690000006e *000000670000000a03024a0000005200000065000000700000006500000061000000640000006c *000000790000002000000073000000700000006c00000069000000740000007300000020000000 *61000000200000006c000000690000007300000074000000200000006200000079000000200000 *007400000068000000650000002000000070000000720000006f00000076000000690000006400 *000065000000640000002000000073000000650000007000000061000000720000006100000074 *0000006f0000007200000020000000610000006e0000006400000020000000630000006f000000 *6c0000006c00000065000000630000007400000073000000200000007400000068000000650000 *0020000000720000006500000073000000750000006c00000074000000730000000a0000000037 *010302320000005200000065000000700000006500000061000000740000006500000064000000 *6c000000790000002000000073000000700000006c000000690000007400000073000000200000 *0061000000200000006c00000069000000730000007400000020000000610000006e0000006400 *000020000000630000006f0000006c0000006c0000006500000063000000740000007300000020 *00000074000000680000006500000020000000720000006500000073000000750000006c000000 *74000000730000000a00000000380103023a00000053000000700000006c000000690000007400 *0000200000006900000073000000200000006c000000690000006b000000650000002000000062 *0000007200000065000000610000006b0000002c00000020000000620000007500000074000000 *20000000740000006800000065000000200000006d000000610000007400000063000000680000 *00690000006e0000006700000020000000650000006c000000650000006d000000650000006e00 *0000740000002000000069000000730000002000000064000000720000006f0000007000000070 *00000065000000640000002e0000000a00000000390103023b0000005200000065000000610000 *00640000002000000066000000690000006c000000650000002000000077000000690000007400 *00006800000020000000610000002000000064000000650000006600000061000000750000006c *000000740000002000000076000000610000006c00000075000000650000002000000069000000 *66000000200000007400000068000000650000002000000066000000690000006c000000650000 *0020000000640000006f0000006500000073000000200000006e0000006f000000740000002000 *000065000000780000006900000073000000740000002e0000000a000000003a00000000003b00 *000000003c010302380000006100000070000000700000006c0000006900000065000000730000 *0020000000740000006800000065000000200000006c0000006900000073000000740000002000 *00006f000000660000002000000066000000750000006e0000006300000074000000690000006f *0000006e0000007300000020000000740000006f00000020000000740000006800000065000000 *2000000070000000720000006f0000007600000069000000640000006500000064000000200000 *00610000007200000067000000750000006d000000650000006e00000074000000200000000a00 *0000003d01030107020a000000630000006f0000006d0000007000000020000000660000002000 *000061000000200000006201020a00000020000000630000006f0000006d000000700000006100 *000072000000650000007300000020010702010000006101020500000020000000610000006e00 *00006400000020010702010000006201020d000000200000006100000066000000740000006500 *000072000000200000006100000070000000700000006c000000790000000a0102010000002001 *0702010000006602020000002e0000000a000000003e010301023300000052000000750000006e *00000020000000610000006e000000200000006500000078000000740000006500000072000000 *6e000000610000006c00000020000000630000006f0000006d0000006d000000610000006e0000 *00640000002e0000002000000055000000700000006f0000006e00000020000000660000006100 *0000690000006c000000750000007200000065000000200000007000000072000000690000006e *00000074000000200000007300000074000000610000007400000075000000730000000a020e00 *0000200000002000000020000000740000006f0000002000000073000000740000006400000065 *00000072000000720000002e0000000a000000003f0103023d000000550000006e000000730000 *006100000066000000650000002000000074000000720000006100000063000000690000006e00 *0000670000002c000000200000006f000000750000007400000070000000750000007400000073 *00000020000000740000006800000065000000200000006d000000650000007300000073000000 *61000000670000006500000020000000610000006e000000640000002000000074000000680000 *00650000002000000076000000610000006c000000750000006500000020000000740000006f00 *0000200000007300000074000000640000006500000072000000720000002e0000000a00000000 *4001030228000000550000006e0000007300000061000000660000006500000020000000740000 *00720000006100000063000000690000006e00000067000000200000006d000000650000007300 *0000730000006100000067000000650000007300000020000000690000006e0000007300000069 *00000064000000650000002000000061000000200000006d0000006f0000006e00000061000000 *640000002e0000000a000000004101030213000000520000006500000061000000640000002000 *0000690000006e00000020000000610000006e00000079000000200000006d0000006f0000006e *00000061000000640000002e0000000a0000000042010301024c000000430000006f0000006e00 *000076000000650000007200000074000000200000004d00000061000000790000006200000065 *00000020000000690000006e000000740000006f00000020000000610000006e00000020000000 *610000006e0000006f00000074000000680000006500000072000000200000006d0000006f0000 *006e00000061000000640000002e00000020000000200000005400000068000000690000007300 *000020000000690000007300000020000000610000002000000073000000690000006d00000070 *0000006c0000006500000020000000690000006e0000006a000000650000006300000074000000 *690000006f0000006e000000200000007400000068000000610000007400000020000000630000 *00610000006c0000006c000000730000000a021c00000020000000660000006100000069000000 *6c000000200000007700000068000000650000006e000000200000006700000069000000760000 *00650000006e0000002000000061000000200000004e0000006f00000074000000680000006900 *00006e000000670000002e0000000a00000000430103023f0000004c0000006900000066000000 *7400000073000000200000006100000020000000620000006f0000006f0000006c000000200000 *00690000006e000000740000006f0000002000000061000000200000004d0000006f0000006e00 *00006100000064000000500000006c00000075000000730000002c000000200000007700000069 *00000074000000680000002000000046000000610000006c000000730000006500000020000000 *6d000000610000007000000070000000650000006400000020000000740000006f000000200000 *00740000006800000065000000200000006d0000007a00000065000000720000006f0000002e00 *00000a00000000440103010702090000006e0000006f000000740000004d000000620000002000 *000061000000200000006201020900000020000000720000006500000074000000750000007200 *00006e0000007300000020010702060000004a0000007500000073000000740000002000000061 *010204000000200000006900000066000000200107020100000062010204000000200000006900 *00007300000020010702070000004e0000006f0000007400000068000000690000006e00000067 *01020500000020000000610000006e0000006400000020010702070000004e0000006f00000074 *00000068000000690000006e000000670102040000002000000069000000660000000a01020100 *000020010702010000006201020400000020000000690000007300000020010702060000004a00 *0000750000007300000074000000200000005f02020000002e0000000a0000000045010301023d *00000054000000610000006b00000065000000730000002000000061000000200000006c000000 *690000007300000074000000200000006f000000660000002000000064000000650000006c0000 *006100000079000000730000002c00000020000000690000006e00000020000000730000006500 *0000630000006f0000006e00000064000000730000002c00000020000000610000006e00000064 *00000020000000610000006e00000020000000610000006300000074000000690000006f000000 *6e00000020000000740000006f0000002000000065000000780000006500000063000000750000 *0074000000650000000a01024a0000002000000072000000650000007000000065000000610000 *007400000065000000640000006c000000790000002e0000002000000020000000540000006800 *00006500000020000000610000006300000074000000690000006f0000006e0000002000000069 *00000073000000200000007400000068000000650000006e000000200000006500000078000000 *650000006300000075000000740000006500000064000000200000007200000065000000700000 *0065000000610000007400000065000000640000006c0000007900000020000000690000006e00 *000020000000610000002000000073000000650000007000000061000000720000006100000074 *00000065000000200000007400000068000000720000006500000061000000640000000a025000 *000020000000750000006e00000074000000690000006c00000020000000740000006800000065 *000000200000006c00000069000000730000007400000020000000680000006100000073000000 *200000006200000065000000650000006e00000020000000630000006f0000006e000000730000 *00750000006d00000065000000640000002e000000200000002000000054000000680000006500 *000020000000660000006900000072000000730000007400000020000000610000006300000074 *000000690000006f0000006e0000002000000074000000610000006b0000006500000073000000 *20000000700000006c00000061000000630000006500000020000000690000006d0000006d0000 *006500000064000000690000006100000074000000650000006c000000790000002e0000002000 *0000200000000a0000000046000000000047010301020b00000053000000690000006d00000069 *0000006c000000610000007200000020000000740000006f0000002001040100000045021d0000 *00200000006200000075000000740000002000000072000000750000006e000000730000002000 *0000690000006e000000200000007400000068000000650000002000000073000000610000006d *00000065000000200000007400000068000000720000006500000061000000640000000a001e00 *00002a0000002b0000002c0000002d0000002e0000002f00000030000000310000003200000033 *0000003400000035000000360000003700000038000000390000003a0000003b0000003c000000 *3d0000003e0000003f000000400000004100000042000000430000004400000045000000460000 *00471e0000002b0000002a0000002c0000002d0000002e0000002f000000300000003100000033 *000000340000003500000032000000360000003700000038000000390000003a0000003b000000 *3c0000003d0000003e0000003f0000004000000041000000420000004300000044000000450000 *004600000047001e0000002a000000002b000000002c000000002d000000002e000000002f0000 *000030000000003100000000320000000033000000003400000000350000000036000000003700 *000000380000000039000000003a000000003b000000003c000000003d000000003e000000003f *000000004000000000410000000042000000004300000000440000000045000000004600000000 *4700000000000000000b0000000006000000480103022c00000053000000650000006d00000061 *0000006e000000740000006900000063000000610000006c0000006c0000007900000020000000 *6500000071000000750000006900000076000000610000006c000000650000006e000000740000 *0020000000740000006f00000020000000620000007200000065000000610000006b0000002000 *00006f0000006e00000020000000730000007400000072000000690000006e0000006700000073 *0000000a0000000049010103010401000000490102310000002000000062000000650000006800 *000061000000760000006500000073000000200000006c000000690000006b0000006500000020 *000000620000007200000065000000610000006b00000043000000680000006100000072000000 *2c000000200000006200000075000000740000002000000066000000720000006f0000006d0000 *002000000074000000680000006500000020000000650000006e00000064000000200000006f00 *000066000000200000007400000068000000650000000a020d0000002000000042000000790000 *007400000065000000530000007400000072000000690000006e000000670000002e0000000a01 *07023400000020000000620000007200000065000000610000006b000000430000006800000061 *00000072000000450000006e000000640000002000000028000000270000006200000027000000 *2900000020000000280000007000000061000000630000006b0000002000000022000000610000 *0061000000620000006200000063000000630000002200000029000000200000003d0000003d00 *0000200000002800000022000000610000006100000062000000220000002c0000002200000063 *0000006300000022000000290000000a01030222000000610000006e0000006400000020000000 *74000000680000006500000020000000660000006f0000006c0000006c0000006f000000770000 *00690000006e000000670000002000000061000000720000006500000020000000650000007100 *0000750000006900000076000000610000006c000000650000006e000000740000003a0000000a *0701021b00000020000000620000007200000065000000610000006b0000004300000068000000 *6100000072000000450000006e0000006400000020000000270000006300000027000000200000 *0022000000610000006200000063000000640000006500000066000000220000000a01022e0000 *00200000006c00000065000000740000002000000028000000780000002c000000790000002900 *0000200000003d00000020000000620000007200000065000000610000006b0000002000000028 *0000003d0000003d00000027000000630000002700000029000000200000002800000072000000 *650000007600000065000000720000007300000065000000200000002200000061000000620000 *006300000064000000650000006600000022000000290000000a02240000002000000069000000 *6e0000002000000028000000720000006500000076000000650000007200000073000000650000 *00200000002800000064000000720000006f000000700000002000000031000000200000007900 *0000290000002c0000002000000072000000650000007600000065000000720000007300000065 *0000002000000078000000290000000a000000004a0103022700000044000000720000006f0000 *007000000073000000200000006c000000650000006100000064000000690000006e0000006700 *00002000000073000000700000006100000063000000650000007300000020000000690000006e *000000200000007400000068000000650000002000000042000000790000007400000065000000 *530000007400000072000000690000006e000000670000000a000000004b010302280000004400 *0000720000006f000000700000007300000020000000740000007200000061000000690000006c *000000690000006e00000067000000200000007300000070000000610000006300000065000000 *7300000020000000690000006e0000002000000074000000680000006500000020000000420000 *00790000007400000065000000530000007400000072000000690000006e000000670000000a00 *0000009a00000000004c01030102450000004300000068000000750000006e0000006b00000020 *00000061000000200000006c000000610000007a00000079000000200000006200000079000000 *7400000065000000730000007400000072000000690000006e0000006700000020000000690000 *006e000000740000006f00000020000000720000006500000061000000730000006f0000006e00 *000061000000620000006c00000065000000200000006300000068000000750000006e0000006b *00000073000000200000002d000000200000006900000073000000200000006900000064000000 *2000000066000000720000006f0000006d000000200000006f0000007500000074000000730000 *006900000064000000650000002e0000000a010246000000200000002000000020000000540000 *006800000069000000730000002000000069000000730000002000000075000000730000006500 *000066000000750000006c00000020000000740000006f000000200000006d000000610000006b *000000650000002000000062000000790000007400000065000000730000007400000072000000 *690000006e00000067000000200000006300000068000000750000006e0000006b000000730000 *0020000000720000006500000061000000730000006f0000006e00000061000000620000006c00 *0000650000002000000073000000690000007a000000650000006400000020000000660000006f *0000007200000020000000650000002e000000670000002e0000000a0210000000200000002000 *000020000000630000006f0000006d000000700000007200000065000000730000007300000069 *0000006f0000006e0000002e0000000a000500000048000000490000004a0000004b0000004c05 *00000048000000490000004a0000004b0000004c0005000000480000000049000000004a000000 *004b000000004c00000000000000000c00010d0000006c000000690000006e0000007500000078 *0000002f00000077000000690000006e000000640000006f0000007700000073010b0000007000 *0000720000006f000000760000006900000073000000690000006f0000006e000000610000006c *010d0000004d000000610000007400000074000000680000006500000077000000200000004500 *00006c000000640000006500000072050000004d010301022600000046000000750000006e0000 *006300000074000000690000006f0000006e000000610000006c00000069000000740000007900 *000020000000660000006f00000072000000200000007400000068000000650000002000000061 *00000075000000740000006f0000004200000075000000690000006c0000006400000020000000 *740000006f0000006f0000006c0000002e0000000a021b00000020000000200000002000000049 *0000006e0000007300000070000000690000007200000065000000640000002000000062000000 *790000002000000073000000650000006100000072000000630000006800000070000000610000 *0074000000680000002e0000000a03000000000000000003020e00000042000000750000006900 *00006c0000006400000020000000630000006f0000006d0000006d000000610000006e00000064 *0000000a000000000000000103020f000000500000006100000074000000680000002000000074 *0000006f0000002000000062000000690000006e0000006100000072000000790000000a000000 *0000000002030225000000410000007200000067000000750000006d000000650000006e000000 *740000007300000020000000740000006f00000020000000750000007300000065000000200000 *007700000068000000650000006e0000002000000072000000750000006e0000006e0000006900 *00006e000000670000002000000062000000690000006e0000006100000072000000790000000a *0000009b00000000009c00000000009d00000000009e0000010000004d010000004d0001000000 *4d00000000000000000d000000001a0000004e00000000009f0000000000a00000000000a10000 *000000a20000000000a30000000000a40000000000a50000000000a60000000000a70000000000 *a800000000004f0000000000a90000000000aa0000000000ab0000000000ac0000000000500103 *01023900000057000000690000006c0000006c0000002000000072000000650000006100000064 *00000020000000740000006800000065000000200000006c000000610000007a00000079000000 *2000000042000000790000007400000065000000530000007400000072000000690000006e0000 *006700000020000000610000006e00000064000000200000007200000065000000740000007500 *0000720000006e00000020000000740000006800000065000000200000006d0000006400000035 *000000200000006400000069000000670000006500000073000000740000002e0000000a024500 *0000200000002000000020000000530000006f0000006d00000065000000200000006100000070 *000000700000006c00000069000000630000006100000074000000690000006f0000006e000000 *200000006d000000690000006700000068000000740000002000000077000000610000006e0000 *007400000020000000740000006f00000020000000770000007200000061000000700000002000 *0000740000006800000069000000730000002000000066000000750000006e0000006300000074 *000000690000006f0000006e00000020000000660000006f000000720000002000000074000000 *7900000070000000650000002000000073000000610000006600000074000000790000002e0000 *000a00000000510000000000ad0000000000520000000000ae0000000000af0000000000530000 *000000540000000000550000000000560000090000004e0000004f000000500000005100000052 *0000005300000054000000550000005609000000500000004f00000052000000510000004e0000 *005600000054000000530000005500090000004e000000004f0000000050000000005100000000 *52000000005300000000540000000055000000005600000000000000000e0000000015000000b0 *0000000000b10000000000b20000000000570000000000580000000000590000000000b3000000 *0000b40000000000b50000000000b60000000000b70000000000b80000000000b90000000000ba *0000000000bb0000000000bc0000000000bd0000000000be0000000000bf0000000000c0000000 *0000c1000003000000570000005800000059030000005700000058000000590003000000570000 *000058000000005900000000000000000f00000000020000005a00000000005b0000020000005a *0000005b020000005a0000005b00020000005a000000005b000000000000000010000000002800 *0000c20000000000c30000000000c40000000000c50000000000c60000000000c700000000005c *00000000005d0000000000c80000000000c90000000000ca0000000000cb0000000000cc000000 *0000cd0000000000ce0000000000cf0000000000d00000000000d10000000000d20000000000d3 *00000000005e00000000005f0000000000d40000000000d50000000000d60000000000d7000000 *0000d80000000000d90000000000da0000000000db0000000000dc0000000000dd0000000000de *0000000000df0000000000e00000000000e10000000000e20000000000e30000000000e4000000 *0000e50000040000005c0000005d0000005e0000005f040000005e0000005f0000005d0000005c *00040000005c000000005d000000005e000000005f000000000000000011000000001000000060 *000000000061000000000062000000000063000000000064000000000065000000000066000000 *00006700000000006800000000006900000000006a00000000006b00000000006c00000000006d *00000000006e00000000006f000010000000600000006100000062000000630000006400000065 *000000660000006700000068000000690000006a0000006b0000006c0000006d0000006e000000 *6f1000000060000000610000006200000063000000640000006500000066000000670000006800 *0000690000006a0000006b0000006c0000006d0000006e0000006f001000000060000000006100 *000000620000000063000000006400000000650000000066000000006700000000680000000069 *000000006a000000006b000000006c000000006d000000006e000000006f000000000000000012 *000000000a000000e60000000000e70000000000e80000000000e9000000000070010302420000 *004300000075000000740000002000000075000000700000002000000061000000200000007300 *00007400000072000000690000006e0000006700000020000000690000006e000000740000006f *000000200000003700000032000000200000006300000068000000610000007200000020000000 *6c000000690000006e00000065000000730000002c000000200000006500000061000000630000 *0068000000200000006c000000690000006e000000650000002000000074000000650000007200 *00006d000000690000006e00000061000000740000006500000064000000200000006200000079 *0000002000000043000000520000004c000000460000002e0000000a00000000ea0000000000eb *0000000000ec000000000071000000000072000003000000700000007100000072030000007100 *000072000000700003000000700000000071000000007200000000000000001300000000010000 *00730000010000007301000000730001000000730000000000000000ed00000000000000010000 *000014000000000000000100000000150000000000000002000000001600000000000000020000 *00001700000000000000030000000018000000190000001a030000001b000000190000001a0100 *00001b000000190000001a000000001c000000190000001a000000001d00000000000000040300 *00001e0000000000000004010000001e0000000000000004000000001f00000000000000040000 *000020000000000000000400000000210000000000000004000000002200000000000000040000 *000023000000000000000400000000240000000000000005000000002500000000000000050000 *000026000000000000000603000000270000000000000006030000002800000000000000060000 *0000290000000000000006000000002a0000000000000007000000002b00000000000000080000 *00002c0000000000000008000000002d0000000000000008000000002e00000000000000080000 *00002f000000000000000800000000300000000000000008000000003100000000000000080000 *000032000000000000000800000000330000000000000008000000003400000000000000080000 *000035000000000000000800000000360000000000000009030000003700000000000000090100 *000037000000000000000900000000380000000000000009000000003900000000000000090000 *00003a0000000000000009000000003b0000000000000009000000003c000000000000000a0300 *00003d000000000000000a030000003e000000000000000a000000003f000000000000000a0000 *000040000000000000000a0000000041000000000000000a0000000042000000000000000a0000 *000043000000000000000a0000000044000000000000000a0000000045000000000000000a0000 *000046000000000000000a0000000047000000000000000a0000000048000000000000000a0000 *000049000000000000000a000000004a000000000000000a000000004b000000000000000a0000 *00004c000000000000000a000000004d000000000000000a000000004e000000000000000a0000 *00004f000000000000000a0000000050000000000000000a0000000051000000000000000a0000 *000052000000000000000a0000000053000000000000000a0000000054000000000000000a0000 *000055000000000000000a0000000056000000000000000a0000000057000000000000000a0000 *000058000000000000000a0000000059000000000000000a000000005a000000000000000b0000 *00005b000000000000000b000000005c000000000000000b000000005d000000000000000b0000 *00005e000000000000000b000000005f000000000000000c0000000060000000000000000d0300 *000061000000000000000d0000000062000000000000000d0000000063000000000000000d0000 *000064000000000000000d0000000065000000000000000d0000000066000000000000000d0000 *000067000000000000000d0000000068000000000000000d0000000069000000000000000e0000 *00006a000000000000000e000000006b000000000000000e000000006c000000000000000f0000 *00006d000000000000000f000000006e0000000000000010030000006f00000000000000100300 *000070000000000000001000000000710000000000000010000000007200000000000000110000 *000073000000000000001100000000740000000000000011000000007500000000000000110000 *000076000000000000001100000000770000000000000011000000007800000000000000110000 *0000790000000000000011000000007a0000000000000011000000007b00000000000000110000 *00007c0000000000000011000000007d0000000000000011000000007e00000000000000110000 *00007f000000000000001100000000800000000000000011000000008100000000000000110000 *000082000000000000001200000000830000000000000012000000008400000000000000120000 *000085000000000000001300000000860000000000000001030000008700000000000000010300 *000088000000000000000103000000890000008a0000008b010000008c0000008a0000008b0300 *00008c0000008a0000008d000000008e0000008a0000008d000000008f00000000000000010100 *000090000000000000000100000000910000000000000001030000009200000000000000010100 *000092000000000000000100000000930000000000000001000000009400000000000000010000 *000095000000000000000100000000960000000000000001000000009700000000000000010000 *000098000000000000000100000000990000000000000001000000009a0000009b0000009c0000 *00009d0000009e0000009f01000000a0000000a1000000a200000000a300000000000000040000 *0000a4000000000000000400000000a50000009b000000a600000000a70000009b000000a60000 *0000a80000000000000007030000003e000000000000000903000000a900000000000000090100 *0000a9000000000000000903000000aa000000000000000900000000ab00000000000000090000 *0000ac000000000000000900000000ad000000000000000900000000ae00000000000000090000 *0000af000000000000000900000000b0000000000000000900000000b100000000000000090000 *0000b2000000000000000b00000000b3000000000000000c00000000b4000000000000000c0000 *0000b5000000000000000c00000000b6000000000000000c00000000b7000000000000000d0100 *0000b8000000000000000d00000000b9000000000000000d00000000ba000000000000000d0000 *0000bb000000000000000d03000000bc000000000000000d01000000bd000000000000000d0000 *0000be000000000000000d00000000bf000000000000000d00000000c0000000000000000d0000 *0000c1000000000000000d00000000c2000000000000000d00000000c3000000000000000d0000 *0000c4000000000000000d00000000c5000000000000000d00000000c6000000000000000d0000 *0000c7000000000000000d00000000c8000000000000000e03000000c9000000000000000e0300 *0000ca000000000000000e03000000cb000000000000000e00000000cc000000000000000e0000 *0000cd000000000000000e00000000ce000000000000000e00000000c6000000000000000e0000 *0000cf000000000000000e00000000d0000000000000000e00000000d1000000000000000e0000 *0000d2000000000000000e00000000d3000000000000000e00000000d4000000000000000e0000 *0000d5000000000000000e00000000d6000000000000000e00000000d7000000000000000e0000 *0000d8000000000000000e00000000d9000000000000001003000000da00000000000000100300 *0000db000000000000001003000000dc000000000000001003000000dd00000000000000100300 *0000de000000000000001003000000df000000000000001003000000e000000000000000100300 *0000c9000000000000001003000000e1000000000000001001000000e200000000000000100000 *0000e3000000000000001000000000e4000000000000001000000000e500000000000000100000 *0000e6000000000000001000000000e7000000000000001000000000e800000000000000100000 *0000e9000000000000001000000000ea000000000000001000000000eb00000000000000100000 *0000ec000000000000001000000000ed000000000000001000000000ee00000000000000100000 *0000ef000000000000001000000000f0000000000000001000000000f100000000000000100000 *0000f2000000000000001000000000f3000000000000001000000000f400000000000000100000 *0000f5000000000000001000000000f6000000000000001000000000f700000000000000100000 *0000f8000000000000001000000000f9000000000000001000000000fa00000000000000100000 *0000fb000000000000001000000000d4000000000000001200000000fc00000000000000120000 *0000fd000000000000001200000000fe000000000000001200000000ff00000000000000120000 *000100000000000000001200000001010000000000000012000000010200000000000001030000 *00000000001468617070737461636b2d7574696c2d302e352e3000000000000000184861707073 *7461636b2e5574696c2e46696c654d616e6970000000000000001148617070737461636b2e5574 *696c2e5448000000000000001e48617070737461636b2e5574696c2e4f70656e4578636c757369 *76656c79000000000000001348617070737461636b2e5574696c2e4d61696c0000000000000018 *48617070737461636b2e5574696c2e4c6f67466f726d6174000000000000001a48617070737461 *636b2e5574696c2e486f737441646472657373000000000000001348617070737461636b2e5574 *696c2e43726f6e000000000000001948617070737461636b2e5574696c2e436f6e63757272656e *74000000000000001648617070737461636b2e5574696c2e54696d654f75740000000000000015 *48617070737461636b2e5574696c2e436f6d6d6f6e000000000000001f48617070737461636b2e *5574696c2e42797465537472696e67436f6d706174000000000000001848617070737461636b2e *5574696c2e4175746f4275696c64000000000000001448617070737461636b2e43727970746f2e *4d4435000000000000001548617070737461636b2e43727970746f2e5348413100000000000000 *1848617070737461636b2e5574696c2e4461656d6f6e697a650000000000000014486170707374 *61636b2e43727970746f2e444553000000000000001448617070737461636b2e43727970746f2e *573634000000000000001748617070737461636b2e43727970746f2e4261736536340000000000 *00001548617070737461636b2e43727970746f2e484d4143000000000000000466696e64000000 *0000000006616c77617973000000000000000a696e7374616e6365442700000000000000066973 *53696744000000000000000f6f70656e4578636c75736976656c79000000000000000b6873656d *61696c2d312e360000000000000025546578742e506172736572436f6d62696e61746f72732e50 *61727365632e5266633238323200000000000000084e616d6541646472000000000000000d6e61 *6d65416464725f61646472000000000000000d6e616d65416464725f6e616d6500000000000000 *0d53696d706c654d657373616765000000000000000466726f6d0000000000000002746f000000 *00000000077375626a6563740000000000000004626f6479000000000000001273656e6453696d *706c654d65737361676573000000000000000f73656e645261774d657373616765730000000000 *000012666f726d617454696d65436f6d62696e65640000000000000015666f726d617452657175 *657374436f6d62696e6564000000000000000c486f73744164647265737336000000000000000b *486f737441646472657373000000000000000f73686f77486f7374416464726573730000000000 *00001073686f77486f73744164647265737336000000000000000463726f6e000000000000000a *666f726b4576657253740000000000000009666f726576657253740000000000000008666f726b *45766572000000000000000e77726974654368616e5269676874000000000000000d7772697465 *4368616e4c6566740000000000000005666f726b5f0000000000000007666f7265766572000000 *0000000004666f726b000000000000001372656769737465725265736574416374696f6e000000 *000000000572657365740000000000000005736c656570000000000000001054696d654f757445 *7863657074696f6e00000000000000107769746854696d654f75744d6179626500000000000000 *0b7769746854696d654f7574000000000000000f776974685361666554696d654f757400000000 *00000014776974685361666554696d654f75744d6179626500000000000000067365636f6e6400 *0000000000000c45706f63685365636f6e647300000000000000075365636f6e64730000000000 *00000c65706f63685365636f6e6473000000000000000e6553656373546f43616c54696d650000 *00000000000965706f63685069636f00000000000000056c6f674d430000000000000008685075 *744c696e650000000000000006684765744c6e0000000000000009756e427261636b6574000000 *00000000056c7472696d0000000000000005727472696d00000000000000047472696d00000000 *0000000973706c69744c697374000000000000000b73706c69744c697374427900000000000000 *0573706c6974000000000000000a6d625265616446696c6500000000000000066d617046737400 *000000000000066d6170536e6400000000000000067265766d61700000000000000004636f6d70 *000000000000000a72756e436f6d6d616e64000000000000000564656275670000000000000006 *64656275674d0000000000000005726561644d00000000000000066d617962654d000000000000 *0005626f6f6c4d00000000000000056e6f744d620000000000000008706572696f646963000000 *00000000022e5e0000000000000009706572696f646963270000000000000009627265616b4368 *6172000000000000000c627265616b43686172456e64000000000000000964726f705370616365 *000000000000000c64726f705370616365456e64000000000000000b72656368756e6b4c617a79 *00000000000000096175746f4275696c64000000000000000a4d4435436f6e7465787400000000 *000000116d6435496e697469616c436f6e7465787400000000000000036d643500000000000000 *0b6d643546696e616c697a6500000000000000096d6435557064617465000000000000000e6170 *706c794d4435526f756e64730000000000000009737472696e674d443500000000000000047465 *737400000000000000076d643546696c6500000000000000047368613100000000000000077368 *61315261770000000000000009736861315f73697a6500000000000000096461656d6f6e697a65 *000000000000000f6765744461656d6f6e697a656449640000000000000003456e630000000000 *0000074d65737361676500000000000000076465735f656e6300000000000000076465735f6465 *6300000000000000037061640000000000000005756e706164000000000000000d70726f705f50 *6164556e506164000000000000000769733443686172000000000000000d717561644368617254 *6f573634000000000000000d773634546f5175616443686172000000000000000c773634546f51 *7561644e756d000000000000000b746f517561644368617273000000000000000c737472696e67 *546f57363473000000000000000c77363473546f537472696e67000000000000000e70726f705f *737472696e675736340000000000000008686578546f573634000000000000000b737472696e67 *546f4b6579000000000000000b6465735f656e6372797074000000000000000b6465735f646563 *72797074000000000000000870726f705f444553000000000000000663686f7037320000000000 *000006656e636f646500000000000000066465636f64650000000000000008686d616353484131 *0000000000000012526563757273696f6e507265646963617465000000000000000f46696c7465 *72507265646963617465000000000000000a46696e64436c61757365000000000000000b6d746c *2d312e312e302e320000000000000018436f6e74726f6c2e4d6f6e61642e53746174652e4c617a *79000000000000000553746174650000000000000019436f6e74726f6c2e4d6f6e61642e537461 *74652e436c61737300000000000000036765740000000000000003707574000000000000000246 *43000000000000000572756e4643000000000000000846696c65496e666f000000000000000869 *6e666f506174680000000000000009696e666f4465707468000000000000000a696e666f537461 *74757300000000000000046d6b4649000000000000000a6576616c436c61757365000000000000 *00066576616c4649000000000000000e676574446972436f6e74656e7473000000000000000f66 *696e645769746848616e646c657200000000000000046261736500000000000000104748432e49 *4f2e48616e646c652e4644000000000000000673746465727200000000000000086768632d7072 *696d00000000000000084748432e426f6f6c000000000000000454727565000000000000001074 *656d706c6174652d6861736b656c6c00000000000000174c616e67756167652e4861736b656c6c *2e54482e4c69620000000000000009696e7374616e6365440000000000000009746f4d65737361 *676500000000000000046c6f672700000000000000074748432e4e756d00000000000000012b00 *000000000000012d000000000000001154696d654f7574457863657074696f6e49000000000000 *000a54696d654f7574544964000000000000000e74696d654f7574496453746174650000000000 *00000d6e65787454696d654f7574496400000000000000067468726f7727000000000000000874 *68726f77546f270000000000000006636174636827000000000000000474727927000000000000 *000d636174636854696d654f75744900000000000000096d61796265546f457800000000000000 *0c6c6173746e6f6e737061636500000000000000076275696c646572000000000000000672756e *6e6572000000000000000672756e42696e00000000000000086275696c6442696e000000000000 *00064d443543747800000000000000096d645061727469616c000000000000000a6d644c656674 *4f766572000000000000000a6d64546f74616c4c656e000000000000000a4d4435506172746961 *6c00000000000000064d44355061720000000000000009626c6f636b53697a6500000000000000 *0e626c6f636b53697a6542797465730000000000000011626c6f636b53697a6542797465735736 *34000000000000000d626c6f636b53697a65426974730000000000000002683000000000000000 *0268310000000000000002683200000000000000026833000000000000000a73697a655f73706c *69740000000000000005626c6f636b0000000000000010706572666f726d4d4435557064617465 *0000000000000008526f746174696f6e000000000000000358595a000000000000000541424344 *450000000000000018736861315f737465705f315f325f7061645f6c656e677468000000000000 *0012736861315f737465705f315f325f776f726b000000000000000a7265706c69636174652700 *00000000000010736861315f737465705f335f696e69740000000000000010736861315f737465 *705f345f6d61696e0000000000000004646f6974000000000000000b736861315f6164645f7773 *000000000000000c6765745f776f72645f333273000000000000000874616b6544726f70000000 *0000000013736861315f737465705f355f646973706c61790000000000000012736861315f7374 *65705f355f636f6e6361740000000000000015646973706c61795f3332626974735f61735f6865 *780000000000000017646973706c61795f3332626974735f61735f386269747300000000000000 *04726f744c00000000000000064269747336340000000000000006426974733536000000000000 *000642697473343800000000000000064269747333320000000000000005426974733600000000 *00000005426974733400000000000000034b657900000000000000065a6f726436340000000000 *00000357363400000000000000026c6f00000000000000026869000000000000000c773634546f *496e7465676572000000000000000c696e7465676572546f573634000000000000000662697469 *66790000000000000008756e6269746966790000000000000013696e697469616c5f7065726d75 *746174696f6e00000000000000126b65795f7472616e73666f726d6174696f6e00000000000000 *06646f5f64657300000000000000086465735f776f726b0000000000000008646f5f726f756e64 *00000000000000076765745f6b65790000000000000017636f6d7072657373696f6e5f7065726d *75746174696f6e0000000000000015657870616e73696f6e5f7065726d75746174696f6e000000 *0000000005735f626f780000000000000007735f626f785f310000000000000007735f626f785f *320000000000000007735f626f785f330000000000000007735f626f785f340000000000000007 *735f626f785f350000000000000007735f626f785f360000000000000007735f626f785f370000 *000000000007735f626f785f380000000000000005705f626f78000000000000000a66696e616c *5f7065726d000000000000000b656e636f64654172726179000000000000000a696e74345f6368 *617233000000000000000a63686172335f696e74340000000000000004656e6331000000000000 *000b717561647275706c6574730000000000000003656e630000000000000003646364 addfile ./docs/0.5.0/happstack-util/haskell_icon.gif binary ./docs/0.5.0/happstack-util/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/happstack-util/index-frames.html hunk ./docs/0.5.0/happstack-util/index-frames.html 1 + + +happstack-util-0.5.0: Web framework

    Happstack.Crypto.Base64
    Happstack.Crypto.DES
    Happstack.Crypto.HMAC
    Happstack.Crypto.MD5
    Happstack.Crypto.SHA1
    Happstack.Crypto.W64
    Happstack.Util.AutoBuild
    Happstack.Util.ByteStringCompat
    Happstack.Util.Common
    Happstack.Util.Concurrent
    Happstack.Util.Cron
    Happstack.Util.Daemonize
    Happstack.Util.FileManip
    Happstack.Util.HostAddress
    Happstack.Util.LogFormat
    Happstack.Util.Mail
    Happstack.Util.OpenExclusively
    Happstack.Util.TH
    Happstack.Util.TimeOut

    addfile ./docs/0.5.0/happstack-util/index.html hunk ./docs/0.5.0/happstack-util/index.html 1 + + +happstack-util-0.5.0: Web framework
     happstack-util-0.5.0: Web frameworkContentsIndex
    happstack-util-0.5.0: Web framework
    Miscellaneous utilities for Happstack packages. +
    Modules
    show/hideHappstack
    show/hideCrypto
    Happstack.Crypto.Base64
    Happstack.Crypto.DES
    Happstack.Crypto.HMAC
    Happstack.Crypto.MD5
    Happstack.Crypto.SHA1
    Happstack.Crypto.W64
    show/hideUtil
    Happstack.Util.AutoBuild
    Happstack.Util.ByteStringCompat
    Happstack.Util.Common
    Happstack.Util.Concurrent
    Happstack.Util.Cron
    Happstack.Util.Daemonize
    Happstack.Util.FileManip
    Happstack.Util.HostAddress
    Happstack.Util.LogFormat
    Happstack.Util.Mail
    Happstack.Util.OpenExclusively
    Happstack.Util.TH
    Happstack.Util.TimeOut
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-Base64.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-Base64.html 1 + + +Happstack.Crypto.Base64
    Happstack.Crypto.Base64
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-DES.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-DES.html 1 + + +Happstack.Crypto.DES
    Happstack.Crypto.DES
    type Message
    type Enc
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-HMAC.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-HMAC.html 1 + + +Happstack.Crypto.HMAC
    Happstack.Crypto.HMAC
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-MD5.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-MD5.html 1 + + +Happstack.Crypto.MD5 addfile ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-SHA1.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-SHA1.html 1 + + +Happstack.Crypto.SHA1
    Happstack.Crypto.SHA1
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-W64.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Crypto-W64.html 1 + + +Happstack.Crypto.W64 addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-AutoBuild.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-AutoBuild.html 1 + + +Happstack.Util.AutoBuild
    Happstack.Util.AutoBuild
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-ByteStringCompat.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-ByteStringCompat.html 1 + + +Happstack.Util.ByteStringCompat addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-Common.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-Common.html 1 + + +Happstack.Util.Common addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-Concurrent.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-Concurrent.html 1 + + +Happstack.Util.Concurrent addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-Cron.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-Cron.html 1 + + +Happstack.Util.Cron
    Happstack.Util.Cron
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-Daemonize.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-Daemonize.html 1 + + +Happstack.Util.Daemonize
    Happstack.Util.Daemonize
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-FileManip.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-FileManip.html 1 + + +Happstack.Util.FileManip
    Happstack.Util.FileManip
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-HostAddress.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-HostAddress.html 1 + + +Happstack.Util.HostAddress
    Happstack.Util.HostAddress
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-LogFormat.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-LogFormat.html 1 + + +Happstack.Util.LogFormat addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-Mail.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-Mail.html 1 + + +Happstack.Util.Mail addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-OpenExclusively.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-OpenExclusively.html 1 + + +Happstack.Util.OpenExclusively
    Happstack.Util.OpenExclusively
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-TH.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-TH.html 1 + + +Happstack.Util.TH
    Happstack.Util.TH
    addfile ./docs/0.5.0/happstack-util/mini_Happstack-Util-TimeOut.html hunk ./docs/0.5.0/happstack-util/mini_Happstack-Util-TimeOut.html 1 + + +Happstack.Util.TimeOut addfile ./docs/0.5.0/happstack-util/minus.gif binary ./docs/0.5.0/happstack-util/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/happstack-util/plus.gif binary ./docs/0.5.0/happstack-util/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b adddir ./docs/0.5.0/happstack-util/src addfile ./docs/0.5.0/happstack-util/src/Happstack-Crypto-Base64.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Crypto-Base64.html 1 + + + + +src/Happstack/Crypto/Base64.hs + + + +
    -- BSDLicensed
    +-- Copyright (c) 2002, Warrick Gray All rights reserved.
    +-- See http://www.ietf.org/rfc/rfc2045.txt for definition.
    +module Happstack.Crypto.Base64 (
    +    encode,
    +    decode,
    +    chop72
    +) where
    +
    +{-
    +
    +The following properties should hold:
    +
    +  decode . encode = id
    +  decode . chop72 . encode = id
    +
    +I.E. Both "encode" and "chop72 . encode" are valid methods of encoding input,
    +the second variation corresponds better with the RFC above, but outside of
    +MIME applications might be undesireable.
    +
    +
    +
    +But: The Haskell98 Char type is at least 16bits (and often 32), these implementations assume only 
    +     8 significant bits, which is more than enough for US-ASCII.  
    +-}
    +
    +
    +
    +
    +import Data.Array.Unboxed
    +import Data.Bits
    +import Data.Char (chr,ord)
    +
    +
    +encodeArray :: UArray Int Char
    +encodeArray = array (0,64) 
    +          [ (0,'A'),  (1,'B'),  (2,'C'),  (3,'D'),  (4,'E'),  (5,'F')                    
    +          , (6,'G'),  (7,'H'),  (8,'I'),  (9,'J'),  (10,'K'), (11,'L')                    
    +          , (12,'M'), (13,'N'), (14,'O'), (15,'P'), (16,'Q'), (17,'R')
    +          , (18,'S'), (19,'T'), (20,'U'), (21,'V'), (22,'W'), (23,'X')
    +          , (24,'Y'), (25,'Z'), (26,'a'), (27,'b'), (28,'c'), (29,'d')
    +          , (30,'e'), (31,'f'), (32,'g'), (33,'h'), (34,'i'), (35,'j')
    +          , (36,'k'), (37,'l'), (38,'m'), (39,'n'), (40,'o'), (41,'p')
    +          , (42,'q'), (43,'r'), (44,'s'), (45,'t'), (46,'u'), (47,'v')
    +          , (48,'w'), (49,'x'), (50,'y'), (51,'z'), (52,'0'), (53,'1')
    +          , (54,'2'), (55,'3'), (56,'4'), (57,'5'), (58,'6'), (59,'7')
    +          , (60,'8'), (61,'9'), (62,'+'), (63,'/') ]
    +
    +
    +-- Convert between 4 base64 (6bits ea) integers and 1 ordinary integer (32 bits)
    +-- clearly the upmost/leftmost 8 bits of the answer are 0.
    +-- Hack Alert: In the last entry of the answer, the upper 8 bits encode 
    +-- the integer number of 6bit groups encoded in that integer, ie 1, 2, 3.
    +-- 0 represents a 4 :(
    +int4_char3 :: [Int] -> [Char]
    +int4_char3 (a:b:c:d:t) = 
    +    let n = (a `shiftL` 18 .|. b `shiftL` 12 .|. c `shiftL` 6 .|. d)
    +    in (chr (n `shiftR` 16 .&. 0xff))
    +     : (chr (n `shiftR` 8 .&. 0xff))
    +     : (chr (n .&. 0xff)) : int4_char3 t
    +
    +int4_char3 [a,b,c] =
    +    let n = (a `shiftL` 18 .|. b `shiftL` 12 .|. c `shiftL` 6)
    +    in [ (chr (n `shiftR` 16 .&. 0xff))
    +       , (chr (n `shiftR` 8 .&. 0xff)) ]
    +
    +int4_char3 [a,b] = 
    +    let n = (a `shiftL` 18 .|. b `shiftL` 12)
    +    in [ (chr (n `shiftR` 16 .&. 0xff)) ]
    +
    +int4_char3 [] = []     
    +int4_char3 _ = error "Case not implemented in int4_char3"
    +
    +
    +
    +-- Convert triplets of characters to
    +-- 4 base64 integers.  The last entries
    +-- in the list may not produce 4 integers,
    +-- a trailing 2 character group gives 3 integers,
    +-- while a trailing single character gives 2 integers.
    +char3_int4 :: [Char] -> [Int]
    +char3_int4 (a:b:c:t) 
    +    = let n = (ord a `shiftL` 16 .|. ord b `shiftL` 8 .|. ord c)
    +      in (n `shiftR` 18 .&. 0x3f) : (n `shiftR` 12 .&. 0x3f) : (n `shiftR` 6  .&. 0x3f) : (n .&. 0x3f) : char3_int4 t
    +
    +char3_int4 [a,b]
    +    = let n = (ord a `shiftL` 16 .|. ord b `shiftL` 8)
    +      in [ (n `shiftR` 18 .&. 0x3f)
    +         , (n `shiftR` 12 .&. 0x3f)
    +         , (n `shiftR` 6  .&. 0x3f) ]
    +    
    +char3_int4 [a]
    +    = let n = (ord a `shiftL` 16)
    +      in [(n `shiftR` 18 .&. 0x3f),(n `shiftR` 12 .&. 0x3f)]
    +
    +char3_int4 [] = []
    +
    +
    +-- Retrieve base64 char, given an array index integer in the range [0..63]
    +enc1 :: Int -> Char
    +enc1 ch = encodeArray!ch
    +
    +
    +-- | Cut up a string into 72 char lines, each line terminated by CRLF.
    +chop72 :: String -> String
    +chop72 str =  let (bgn,end) = splitAt 70 str
    +              in if null end then bgn else bgn ++ "\r\n" ++ chop72 end
    +
    +
    +-- Pads a base64 code to a multiple of 4 characters, using the special
    +-- '=' character.
    +quadruplets :: String -> String
    +quadruplets (a:b:c:d:t) = a:b:c:d:quadruplets t
    +quadruplets [a,b,c]     = [a,b,c,'=']      -- 16bit tail unit
    +quadruplets [a,b]       = [a,b,'=','=']    -- 8bit tail unit
    +quadruplets []          = []               -- 24bit tail unit
    +quadruplets _ = error "Case not implemented in quadruplets"
    +
    +enc :: [Int] -> [Char]
    +enc = quadruplets . map enc1
    +
    +
    +dcd :: String -> [Int]
    +dcd [] = []
    +dcd (h:t)
    +    | h <= 'Z' && h >= 'A'  =  ord h - ord 'A'      : dcd t
    +    | h >= '0' && h <= '9'  =  ord h - ord '0' + 52 : dcd t
    +    | h >= 'a' && h <= 'z'  =  ord h - ord 'a' + 26 : dcd t
    +    | h == '+'  = 62 : dcd t
    +    | h == '/'  = 63 : dcd t
    +    | h == '='  = []  -- terminate data stream
    +    | otherwise = dcd t
    +
    +
    +-- Principal encoding and decoding functions.
    +encode, decode :: String -> String
    +encode = enc . char3_int4
    +decode = int4_char3 . dcd
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Crypto-DES.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Crypto-DES.html 1 + + + + +src/Happstack/Crypto/DES.lhs + + + +
    > {-# LANGUAGE FlexibleInstances  #-}
    +> {-# OPTIONS -fno-warn-missing-methods -fno-warn-orphans #-}
    +
    + +{-- +Copyright (C) 2001 Ian Lynagh + +DES.lhs can be used under either the BSD or GPL. + +http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/sha1/haskell-sha1-0.1.0/ + +Copyright (c) The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +--} + + +
    > module Happstack.Crypto.DES (des_enc, des_dec, Message, Enc) where
    +
    +
    > import Data.Bits
    +> import Data.Word
    +
    +more stuff just copied in + +
    > import Numeric
    +
    +-- added by alex + +
    > data Zord64 = W64 {lo,hi::Word32} deriving (Eq, Ord, Bounded)
    +
    +
    > w64ToInteger :: Zord64 -> Integer
    +> w64ToInteger W64{lo=l,hi=h} = toInteger l + 0x100000000 * toInteger h
    +> integerToW64 :: Integer -> Zord64
    +> integerToW64 x = case x `quotRem` 0x100000000 of
    +>                  (h,l) -> W64{lo=fromInteger l, hi=fromInteger h}
    +
    +
    > instance Show Zord64 where
    +>   showsPrec _ = showInt . w64ToInteger
    +
    +
    > instance Read Zord64 where
    +>   readsPrec _ s = [ (integerToW64 x,r) | (x,r) <- readDec s ]
    +
    +
    > instance Num Zord64 where
    +>  W64{lo=lo_a,hi=hi_a} + W64{lo=lo_b,hi=hi_b} = W64{lo=lo', hi=hi'}
    +>   where lo' = lo_a + lo_b
    +>         hi' = hi_a + hi_b + if lo' < lo_a then 1 else 0
    +>  fromInteger = integerToW64
    +
    +Added by alex + +
    >  signum 0 = 0
    +>  signum _ = 1
    +>  x * y = integerToW64 $ (w64ToInteger x) * (w64ToInteger y)
    +
    + +
    > instance Bits Zord64 where
    +>  W64{lo=lo_a,hi=hi_a} .&. W64{lo=lo_b,hi=hi_b} = W64{lo=lo', hi=hi'}
    +>   where lo' = lo_a .&. lo_b
    +>         hi' = hi_a .&. hi_b
    +>  W64{lo=lo_a,hi=hi_a} .|. W64{lo=lo_b,hi=hi_b} = W64{lo=lo', hi=hi'}
    +>   where lo' = lo_a .|. lo_b
    +>         hi' = hi_a .|. hi_b
    +>  shift w 0 = w
    +>  shift W64{lo=l,hi=h} x
    +>   | x > 63 = W64{lo=0,hi=0}
    +>   | x > 31 = W64{lo = 0, hi = shift l (x-32)}
    +>   | x > 0 = W64{lo = shift l x, hi = shift h x .|. shift l (x-32)}
    +>  shift _ _ = error "Case not defined in Bits instance for Zord64"
    +
    +
    > instance Integral Zord64 where
    +>  toInteger = w64ToInteger
    +
    +added by alex + +
    >  quotRem numer divis = 
    +>      let (d,r)= quotRem (w64ToInteger numer) (w64ToInteger divis)
    +>                    in (fromInteger d,fromInteger r)
    +
    +
    > instance Real Zord64
    +> instance Enum Zord64
    +
    +--simplifying so we don't need all the hugs decls. + + +
    > type Rotation = Int
    +> type Key     = Zord64
    +> type Message = Zord64
    +> type Enc     = Zord64
    +
    +
    > -- type BitsX  = [Bool]
    +> type Bits4  = [Bool]
    +> type Bits6  = [Bool]
    +> type Bits32 = [Bool]
    +> type Bits48 = [Bool]
    +> type Bits56 = [Bool]
    +> type Bits64 = [Bool]
    +
    + + +
    > instance Num [Bool] where {}
    +
    +
    + +
    > instance Bits [Bool] where
    +>  xor = zipWith (\x y -> (not x && y) || (x && not y))
    +>  rotate bits rot = drop rot' bits ++ take rot' bits
    +>   where rot' = rot `mod` (length bits)
    +
    +
    > bitify :: Zord64 -> Bits64
    +> bitify w = map (\b -> w .&. (shiftL 1 b) /= 0) [63,62..0]
    +
    +
    > unbitify :: Bits64 -> Zord64
    +
    +Added by Alex + +
    > unbitify = foldl (\i b -> if b then 1 + shiftL i 1 else shiftL i 1) 0 
    +
    +
    > initial_permutation :: Bits64 -> Bits64
    +> initial_permutation mb = map ((!!) mb) i
    +>  where i = [57, 49, 41, 33, 25, 17,  9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
    +>             61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7,
    +>             56, 48, 40, 32, 24, 16,  8, 0, 58, 50, 42, 34, 26, 18, 10, 2,
    +>             60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6]
    +
    +
    > key_transformation :: Bits64 -> Bits56
    +> key_transformation kb = map ((!!) kb) i
    +>  where i = [56, 48, 40, 32, 24, 16,  8,  0, 57, 49, 41, 33, 25, 17,
    +>              9,  1, 58, 50, 42, 34, 26, 18, 10,  2, 59, 51, 43, 35,
    +>             62, 54, 46, 38, 30, 22, 14,  6, 61, 53, 45, 37, 29, 21,
    +>             13,  5, 60, 52, 44, 36, 28, 20, 12,  4, 27, 19, 11,  3]
    +
    +
    > des_enc :: Message -> Key -> Enc
    +> des_enc = do_des [1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28]
    +
    +
    > des_dec :: Message -> Key -> Enc
    +> des_dec = do_des [28,27,25,23,21,19,17,15,14,12,10,8,6,4,2,1]
    +
    +
    > do_des :: [Rotation] -> Message -> Key -> Enc
    +> do_des rots m k = des_work rots (takeDrop 32 mb) kb
    +>  where kb = key_transformation $ bitify k
    +>        mb = initial_permutation $ bitify m
    +
    +
    > des_work :: [Rotation] -> (Bits32, Bits32) -> Bits56 -> Enc
    +> des_work [] (ml, mr) _ = unbitify $ final_perm $ (mr ++ ml)
    +> des_work (r:rs) mb kb = des_work rs mb' kb
    +>  where mb' = do_round r mb kb
    +
    +
    > do_round :: Rotation -> (Bits32, Bits32) -> Bits56 -> (Bits32, Bits32)
    +> do_round r (ml, mr) kb = (mr, m')
    +>  where kb' = get_key kb r
    +>        comp_kb = compression_permutation kb'
    +>        expa_mr = expansion_permutation mr
    +>        res = comp_kb `xor` expa_mr
    +>        res' = tail $ iterate (trans 6) ([], res)
    +>        trans n (_, b) = (take n b, drop n b)
    +>        res_s = concat $ zipWith (\f (x,_) -> f x) [s_box_1, s_box_2,
    +>                                                    s_box_3, s_box_4,
    +>                                                    s_box_5, s_box_6,
    +>                                                    s_box_7, s_box_8] res'
    +>        res_p = p_box res_s
    +>        m' = res_p `xor` ml
    +
    +
    > get_key :: Bits56 -> Rotation -> Bits56
    +> get_key kb r = kb'
    +>  where (kl, kr) = takeDrop 28 kb
    +>        kb' = rotateL kl r ++ rotateL kr r
    +
    +
    > compression_permutation :: Bits56 -> Bits48
    +> compression_permutation kb = map ((!!) kb) i
    +>  where i = [13, 16, 10, 23,  0,  4,  2, 27, 14,  5, 20,  9,
    +>             22, 18, 11,  3, 25,  7, 15,  6, 26, 19, 12,  1,
    +>             40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
    +>             43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31]
    +
    +
    > expansion_permutation :: Bits32 -> Bits48
    +> expansion_permutation mb = map ((!!) mb) i
    +>  where i = [31,  0,  1,  2,  3,  4,  3,  4,  5,  6,  7,  8,
    +>              7,  8,  9, 10, 11, 12, 11, 12, 13, 14, 15, 16,
    +>             15, 16, 17, 18, 19, 20, 19, 20, 21, 22, 23, 24,
    +>             23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31,  0]
    +
    +
    > s_box :: [[Word8]] -> Bits6 -> Bits4
    +> s_box s [a,b,c,d,e,f] = to_bool 4 $ (s !! row) !! col
    +>  where row = sum $ zipWith numericise [a,f]     [1, 0]
    +>        col = sum $ zipWith numericise [b,c,d,e] [3, 2, 1, 0]
    +>        numericise = (\x y -> if x then 2^y else 0)
    +>        to_bool 0 _ = []
    +>        to_bool n i = ((i .&. 8) == 8):to_bool (n-1) (shiftL i 1)
    +> s_box _ _ = error "second arg to s_box must have length 6"
    +
    +
    > s_box_1 :: Bits6 -> Bits4
    +> s_box_1 = s_box i
    +>  where i = [[14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7],
    +>             [ 0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8],
    +>             [ 4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0],
    +>             [15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13]]
    +
    +
    > s_box_2 :: Bits6 -> Bits4
    +> s_box_2 = s_box i
    +>  where i = [[15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10],
    +>             [3,  13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9,  11, 5],
    +>             [0,  14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15],
    +>             [13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5,  14, 9]]
    +
    +
    > s_box_3 :: Bits6 -> Bits4
    +> s_box_3 = s_box i
    +>  where i = [[10,  0,  9, 14 , 6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8],
    +>             [13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1],
    +>             [13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7],
    +>             [1,  10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12]]
    +
    +
    > s_box_4 :: Bits6 -> Bits4
    +> s_box_4 = s_box i
    +>  where i = [[7,  13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15],
    +>             [13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9],
    +>             [10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4],
    +>             [3,  15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14]]
    +
    +
    > s_box_5 :: Bits6 -> Bits4
    +> s_box_5 = s_box i
    +>  where i = [[2,  12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9],
    +>             [14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6],
    +>             [4,   2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14],
    +>             [11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3]]
    +
    +
    > s_box_6 :: Bits6 -> Bits4
    +> s_box_6 = s_box i
    +>  where i = [[12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11],
    +>             [10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8],
    +>             [9,  14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6],
    +>             [4,  3,   2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13]]
    +
    +
    > s_box_7 :: Bits6 -> Bits4
    +> s_box_7 = s_box i
    +>  where i = [[4,  11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1],
    +>             [13, 0,  11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6],
    +>             [1,  4,  11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2],
    +>             [6,  11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12]]
    +
    +
    > s_box_8 :: Bits6 -> Bits4
    +> s_box_8 = s_box i
    +>  where i = [[13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7],
    +>             [1,  15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2],
    +>             [7,  11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8],
    +>             [2,   1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11]]
    +
    +
    > p_box :: Bits32 -> Bits32
    +> p_box kb = map ((!!) kb) i
    +>  where i = [15, 6, 19, 20, 28, 11, 27, 16,  0, 14, 22, 25,  4, 17, 30,  9,
    +>              1, 7, 23, 13, 31, 26,  2,  8, 18, 12, 29,  5, 21, 10,  3, 24]
    +
    +
    > final_perm :: Bits64 -> Bits64
    +> final_perm kb = map ((!!) kb) i
    +>  where i = [39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30,
    +>             37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28,
    +>             35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26,
    +>             33, 1, 41,  9, 49, 17, 57, 25, 32, 0, 40 , 8, 48, 16, 56, 24]
    +
    +
    > takeDrop :: Int -> [a] -> ([a], [a])
    +> takeDrop _ [] = ([], [])
    +> takeDrop 0 xs = ([], xs)
    +> takeDrop n (x:xs) = (x:ys, zs)
    +>  where (ys, zs) = takeDrop (n-1) xs
    +
    + + addfile ./docs/0.5.0/happstack-util/src/Happstack-Crypto-HMAC.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Crypto-HMAC.html 1 + + + + +src/Happstack/Crypto/HMAC.hs + + + +
    module Happstack.Crypto.HMAC where
    +
    +import Happstack.Crypto.SHA1
    +import Happstack.Crypto.Base64
    +
    +import Data.Bits
    +import Data.Char
    +
    +hmacSHA1 :: String -> String -> String
    +hmacSHA1 key str
    +    | length key > b = fail "hmacSHA1 doesn't support large keys yet"
    +    | otherwise
    +    = encode $ sha1Raw (doxor key opad ++ sha1Raw (doxor key ipad ++ str))
    +    where b = 64
    +          opad = replicate b '\x5C'
    +          ipad = replicate b '\x36'
    +          doxor a = zipWith fn (a++repeat '\0')
    +          fn x y = chr (ord x `xor` ord y)
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Crypto-MD5.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Crypto-MD5.html 1 + + + + +src/Happstack/Crypto/MD5.hs + + + +
    {-# LANGUAGE BangPatterns #-}
    +{-# OPTIONS_GHC -funbox-strict-fields -fvia-c -optc-funroll-all-loops -optc-O3 #-}
    +--
    +-- Module      : Happstack.Crypto.MD5
    +-- License     : BSD3
    +-- Maintainer  : lemmih@vo.com
    +-- Author      : Thomas.DuBuisson@mail.google.com
    +-- Stability   : experimental
    +-- Portability : portable, requires bang patterns and ByteString
    +-- Tested with : GHC-6.8.1
    +--
    +
    +module Happstack.Crypto.MD5
    +	(md5
    +        ,md5InitialContext
    +	,md5Update
    +	,md5Finalize
    +	,MD5Context
    +	,md5File
    +        ,stringMD5
    +	,applyMD5Rounds
    +        ,test
    +	) where
    +
    +import Prelude hiding ((!!))
    +import qualified Data.ByteString as B
    +import qualified Data.ByteString.Lazy as L
    +import Data.ByteString.Internal
    +import Data.Bits
    +import Data.List hiding ((!!))
    +import Data.Int(Int64)
    +import Data.Word
    +import Foreign.Storable
    +import Foreign.Ptr
    +import Foreign.ForeignPtr
    +import Numeric
    +import System.Environment()
    +import System.IO
    +
    +blockSize :: Int
    +blockSize = 512		-- Block size in bits
    +
    +blockSizeBytes :: Int
    +blockSizeBytes = blockSize `div` 8
    +
    +blockSizeBytesW64 :: Int64
    +blockSizeBytesW64 = fromIntegral blockSizeBytes
    +
    +blockSizeBits :: Word64
    +blockSizeBits = fromIntegral blockSize
    +
    +data MD5Partial = MD5Par !Word32 !Word32 !Word32 !Word32
    +data MD5Context = MD5Ctx { mdPartial  :: MD5Partial,
    +			   mdLeftOver :: ByteString,
    +			   mdTotalLen :: Word64
    +			}
    +
    +md5InitialContext :: MD5Context
    +md5InitialContext = MD5Ctx (MD5Par h0 h1 h2 h3) B.empty 0
    +h0, h1, h2, h3 :: Word32
    +h0 = 0x67452301
    +h1 = 0xEFCDAB89
    +h2 = 0x98BADCFE
    +h3 = 0x10325476
    +
    +-- | Will read the lazy ByteString and return the md5 digest.
    +--   Some application might want to wrap this function for type safty.
    +md5 :: L.ByteString -> L.ByteString
    +md5 bs = md5Finalize $ md5Update md5InitialContext bs
    +
    +md5Finalize :: MD5Context -> L.ByteString
    +md5Finalize !ctx@(MD5Ctx (MD5Par _ _ _ _) r !totLen) =
    +	let totLen' = (totLen + 8*fromIntegral l) :: Word64
    +	    padBS = B.pack $ 0x80 : replicate lenZeroPad 0 ++ size_split 8 totLen'
    +
    +	    (MD5Ctx (MD5Par a' b' c' d') _ _) = md5Update ctx (L.fromChunks [r,padBS])
    +	in L.pack $ concatMap (size_split 4) [a',b',c',d']
    +	where
    +	l = B.length r
    +	lenZeroPad = if (l+1) <= blockSizeBytes - 8
    +			then (blockSizeBytes - 8) - (l+1)
    +			else (2*blockSizeBytes - 8) - (l+1)
    +
    +size_split :: (Integral t, Num a) => Int -> t -> [a]
    +size_split 0 _ = []
    +size_split p n = (fromIntegral d):size_split (p-1) n'
    +    where (n', d) = divMod n 256
    +
    +md5Update :: MD5Context -> L.ByteString -> MD5Context
    +md5Update ctx bsLazy =
    +	let _ = L.toChunks bsLazy
    +	    blks = block bsLazy
    +	in foldl' performMD5Update ctx blks
    +
    +block :: L.ByteString -> [ByteString]
    +block bs = case L.toChunks bs of
    +             []		-> []
    +             _ 	        -> (B.concat . L.toChunks) top : block rest
    +    where
    +      (top,rest) = L.splitAt blockSizeBytesW64 bs
    +{-# INLINE block #-}
    +
    +-- Assumes ByteString length == blockSizeBytes, will fold the 
    +-- context across calls to applyMD5Rounds.
    +performMD5Update :: MD5Context -> ByteString -> MD5Context
    +performMD5Update !ctx@(MD5Ctx !par@(MD5Par !a !b !c !d) _ !len) bs =
    +	let MD5Par a' b' c' d' = applyMD5Rounds par bs
    +	in if B.length bs == blockSizeBytes
    +		then MD5Ctx {
    +			mdPartial = MD5Par (a' + a) (b' + b) (c' + c) (d' + d),
    +			mdLeftOver = B.empty,
    +			mdTotalLen = len + blockSizeBits
    +			}
    +		else ctx { mdLeftOver = bs } 
    +
    +applyMD5Rounds :: MD5Partial -> ByteString -> MD5Partial
    +applyMD5Rounds (MD5Par a b c d) w =
    +	let -- Round 1
    +	    !r0 = ff   a  b  c  d   (w!!0)  7  3614090360
    +	    !r1 = ff   d r0  b  c   (w!!1)  12 3905402710
    +	    !r2 = ff   c r1 r0  b   (w!!2)  17 606105819
    +	    !r3 = ff   b r2 r1 r0   (w!!3)  22 3250441966
    +	    !r4 = ff  r0 r3 r2 r1   (w!!4)  7  4118548399
    +	    !r5 = ff  r1 r4 r3 r2   (w!!5)  12 1200080426
    +	    !r6 = ff  r2 r5 r4 r3   (w!!6)  17 2821735955
    +	    !r7 = ff  r3 r6 r5 r4   (w!!7)  22 4249261313
    +	    !r8 = ff  r4 r7 r6 r5   (w!!8)  7  1770035416
    +	    !r9 = ff  r5 r8 r7 r6   (w!!9)  12 2336552879
    +	    !r10 = ff r6 r9 r8 r7  (w!!10) 17 4294925233
    +	    !r11 = ff r7 r10 r9 r8 (w!!11) 22 2304563134
    +	    !r12 = ff r8 r11 r10 r9 (w!!12) 7  1804603682
    +	    !r13 = ff r9 r12 r11 r10 (w!!13) 12 4254626195
    +	    !r14 = ff r10 r13 r12 r11 (w!!14) 17 2792965006
    +	    !r15 = ff r11 r14 r13 r12 (w!!15) 22 1236535329
    +	    -- Round 2
    +	    !r16 = gg r12 r15 r14 r13 (w!!1)  5  4129170786
    +	    !r17 = gg r13 r16 r15 r14 (w!!6)  9  3225465664
    +	    !r18 = gg r14 r17 r16 r15 (w!!11) 14 643717713
    +	    !r19 = gg r15 r18 r17 r16 (w!!0)  20 3921069994
    +	    !r20 = gg r16 r19 r18 r17 (w!!5)  5  3593408605
    +	    !r21 = gg r17 r20 r19 r18 (w!!10) 9  38016083
    +	    !r22 = gg r18 r21 r20 r19 (w!!15) 14 3634488961
    +	    !r23 = gg r19 r22 r21 r20 (w!!4)  20 3889429448
    +	    !r24 = gg r20 r23 r22 r21 (w!!9)  5  568446438
    +	    !r25 = gg r21 r24 r23 r22 (w!!14) 9  3275163606
    +	    !r26 = gg r22 r25 r24 r23 (w!!3)  14 4107603335
    +	    !r27 = gg r23 r26 r25 r24 (w!!8)  20 1163531501
    +	    !r28 = gg r24 r27 r26 r25 (w!!13) 5  2850285829
    +	    !r29 = gg r25 r28 r27 r26 (w!!2)  9  4243563512
    +	    !r30 = gg r26 r29 r28 r27 (w!!7)  14 1735328473
    +	    !r31 = gg r27 r30 r29 r28 (w!!12) 20 2368359562
    +	    -- Round 3
    +	    !r32 = hh r28 r31 r30 r29 (w!!5)  4  4294588738
    +	    !r33 = hh r29 r32 r31 r30 (w!!8)  11 2272392833
    +	    !r34 = hh r30 r33 r32 r31 (w!!11) 16 1839030562
    +	    !r35 = hh r31 r34 r33 r32 (w!!14) 23 4259657740
    +	    !r36 = hh r32 r35 r34 r33 (w!!1)  4  2763975236
    +	    !r37 = hh r33 r36 r35 r34 (w!!4)  11 1272893353
    +	    !r38 = hh r34 r37 r36 r35 (w!!7)  16 4139469664
    +	    !r39 = hh r35 r38 r37 r36 (w!!10) 23 3200236656
    +	    !r40 = hh r36 r39 r38 r37 (w!!13) 4  681279174
    +	    !r41 = hh r37 r40 r39 r38 (w!!0)  11 3936430074
    +	    !r42 = hh r38 r41 r40 r39 (w!!3)  16 3572445317
    +	    !r43 = hh r39 r42 r41 r40 (w!!6)  23 76029189
    +	    !r44 = hh r40 r43 r42 r41 (w!!9)  4  3654602809
    +	    !r45 = hh r41 r44 r43 r42 (w!!12) 11 3873151461
    +	    !r46 = hh r42 r45 r44 r43 (w!!15) 16 530742520
    +	    !r47 = hh r43 r46 r45 r44 (w!!2)  23 3299628645
    +	    -- Round 4
    +	    !r48 = ii r44 r47 r46 r45 (w!!0)  6  4096336452
    +	    !r49 = ii r45 r48 r47 r46 (w!!7)  10 1126891415
    +	    !r50 = ii r46 r49 r48 r47 (w!!14) 15 2878612391
    +	    !r51 = ii r47 r50 r49 r48 (w!!5)  21 4237533241
    +	    !r52 = ii r48 r51 r50 r49 (w!!12) 6  1700485571
    +	    !r53 = ii r49 r52 r51 r50 (w!!3)  10 2399980690
    +	    !r54 = ii r50 r53 r52 r51 (w!!10) 15 4293915773
    +	    !r55 = ii r51 r54 r53 r52 (w!!1)  21 2240044497
    +	    !r56 = ii r52 r55 r54 r53 (w!!8)  6  1873313359
    +	    !r57 = ii r53 r56 r55 r54 (w!!15) 10 4264355552
    +	    !r58 = ii r54 r57 r56 r55 (w!!6)  15 2734768916
    +	    !r59 = ii r55 r58 r57 r56 (w!!13) 21 1309151649
    +	    !r60 = ii r56 r59 r58 r57 (w!!4)  6  4149444226
    +	    !r61 = ii r57 r60 r59 r58 (w!!11) 10 3174756917
    +	    !r62 = ii r58 r61 r60 r59 (w!!2)  15 718787259
    +	    !r63 = ii r59 r62 r61 r60 (w!!9)  21 3951481745
    +	in MD5Par r60 r63 r62 r61
    +	where
    +	f !x !y !z = (x .&. y) .|. ((complement x) .&. z)
    +	{-# INLINE f #-}
    +	g !x !y !z = (x .&. z) .|. (y .&. (complement z))
    +	{-# INLINE g #-}
    +	h !x !y !z = (x `xor` y `xor` z)
    +	{-# INLINE h #-}
    +	i !x !y !z = y `xor` (x .|. (complement z))
    +	{-# INLINE i #-}
    +	ff a_ b_ c_ d_ x s ac = {-# SCC "ff" #-}
    +		let !a' = f b_ c_ d_ + x + ac + a_
    +		    !a'' = rotateL a' s
    +		in a'' + b_
    +	{-# INLINE ff #-}
    +	gg a_ b_ c_ d_ x s ac = {-# SCC "gg" #-}
    +		let !a' = g b_ c_ d_ + x + ac + a_
    +		    !a'' = rotateL a' s
    +		in a'' + b_
    +	{-# INLINE gg #-}
    +	hh a_ b_ c_ d_ x s ac = {-# SCC "hh" #-}
    +		let !a' = h b_ c_ d_ + x + ac + a_
    +		    !a'' = rotateL a' s
    +		    in a'' + b_
    +	{-# INLINE hh #-}
    +	ii a_ b_ c_ d_  x s ac = {-# SCC "ii" #-}
    +		let !a' = i b_ c_ d_ + x + ac + a_
    +		    !a'' = rotateL a' s
    +		in a'' + b_
    +	{-# INLINE ii #-}
    +	(!!) word32s pos = getNthWord pos word32s
    +	{-# INLINE (!!) #-}
    +
    +	getNthWord n (PS ptr off _) =
    +		inlinePerformIO $ withForeignPtr ptr $ \ptr' -> do
    +		let p = castPtr $ plusPtr ptr' off
    +		peekElemOff p n
    +	{-# INLINE getNthWord #-}
    +{-# INLINE applyMD5Rounds #-}
    +
    +stringMD5 :: L.ByteString -> String
    +stringMD5 lazy = 
    +	let x = L.toChunks lazy
    +	    w = B.unpack (B.concat x)
    +	    s = map (\v -> showHex v "") w
    +	    s' = map (\v -> if length v == 1 then '0':v else v) s
    +	in concat s'
    +
    +test :: IO ()
    +test = do
    +	let h = md5 $ L.pack []
    +	putStrLn $ "Hash is:   " ++ (stringMD5 h)
    +	putStrLn $ "Should Be: d41d8cd98f00b204e9800998ecf8427e" 
    +
    +md5File :: String -> IO ()
    +md5File f = do
    +	h <- openFile f ReadMode
    +	s <- L.hGetContents h
    +	let hash = md5 s
    +	putStrLn (stringMD5 hash)
    +	return ()
    +
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Crypto-SHA1.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Crypto-SHA1.html 1 + + + + +src/Happstack/Crypto/SHA1.lhs + + + +{-- +Copyright (C) 2001 Ian Lynagh + +SHA.lhs can be used under either the BSD or GPL. + +http://web.comlab.ox.ac.uk/oucl/work/ian.lynagh/sha1/haskell-sha1-0.1.0/ + +Copyright (c) The Regents of the University of California. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. +--} + +
    > module Happstack.Crypto.SHA1 (sha1, sha1Raw, sha1_size) where
    +
    +
    > import Data.Char
    +> import Data.Bits
    +> import Data.Word
    +
    +
    > type ABCDE = (Word32, Word32, Word32, Word32, Word32)
    +> type XYZ = (Word32, Word32, Word32)
    +> type Rotation = Int
    +
    +
    > sha1 :: String -> String
    +> sha1 s = s5
    +>  where s1_2 = sha1_step_1_2_pad_length s
    +>        abcde = sha1_step_3_init
    +>        abcde' = sha1_step_4_main abcde s1_2
    +>        s5 = sha1_step_5_display abcde'
    +
    +
    > sha1Raw :: String -> String
    +> sha1Raw s = s5
    +>  where s1_2 = sha1_step_1_2_pad_length s
    +>        abcde = sha1_step_3_init
    +>        abcde' = sha1_step_4_main abcde s1_2
    +>        s5 = sha1_step_5_concat abcde'
    +
    +
    > sha1_size :: (Integral a) => a -> String -> String
    +> sha1_size l s = s5
    +>  where s1_2 = s ++ sha1_step_1_2_work (fromIntegral ((toInteger l) `mod` (2^64::Integer))) ""
    +>        abcde = sha1_step_3_init
    +>        abcde' = sha1_step_4_main abcde s1_2
    +>        s5 = sha1_step_5_display abcde'
    +
    +
    > sha1_step_1_2_pad_length :: String -> String
    +> sha1_step_1_2_pad_length = sha1_step_1_2_work 0
    +
    +
    > sha1_step_1_2_work :: Integer -> String -> String
    +> sha1_step_1_2_work c64 "" = padding ++ len
    +>  where padding = '\128':replicate' (shiftR (fromIntegral $ (440 - c64) `mod` 512) 3) '\000'
    +>        len = map chr $ size_split 8 c64
    +> sha1_step_1_2_work c64 (c:cs) = c:sha1_step_1_2_work (((c64 + 8) `mod` (2^64))::Integer) cs
    +
    +
    > replicate' :: Word16 -> a -> [a]
    +> replicate' 0 _ = []
    +> replicate' n x = x:replicate' (n-1) x
    +
    +
    > size_split :: Int -> Integer -> [Int]
    +> size_split 0 _ = []
    +> size_split p n = size_split (p-1) n' ++ [fromIntegral d]
    +>  where (n', d) = divMod n 256
    +
    +
    > sha1_step_3_init :: ABCDE
    +> sha1_step_3_init = (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0)
    +
    +[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] + +wm3 = [13,14,15] +wm8 = [8,9,10,11,12,13,14,15] +wm14 = [2,3,4,5,6,7,8,9,10,11,12,13,14,15] +wm16 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] + +
    > sha1_step_4_main :: ABCDE -> String -> ABCDE
    +> sha1_step_4_main abcde "" = {- abcde -} abcde
    +> sha1_step_4_main abcde0 s = sha1_step_4_main abcde5 s'
    +>  where (s64, s') = takeDrop 64 s
    +>        s16 = get_word_32s s64
    +>        s80 = s16 ++ sha1_add_ws 16 (drop 13 s16, drop 8 s16, drop 2 s16, s16)
    +>        (s20_0, s60) = takeDrop 20 s80
    +>        (s20_1, s40) = takeDrop 20 s60
    +>        (s20_2, s20_3) = takeDrop 20 s40
    +>        abcde1 = foldl (doit f1 0x5a827999) abcde0 s20_0
    +>        abcde2 = foldl (doit f2 0x6ed9eba1) abcde1 s20_1
    +>        abcde3 = foldl (doit f3 0x8f1bbcdc) abcde2 s20_2
    +>        abcde4 = foldl (doit f2 0xca62c1d6) abcde3 s20_3
    +>        f1 (x, y, z) = (x .&. y) .|. ((complement x) .&. z)
    +>        f2 (x, y, z) = x `xor` y `xor` z
    +>        f3 (x, y, z) = (x .&. y) .|. (x .&. z) .|. (y .&. z)
    +>        (a,  b,  c,  d,  e ) = abcde0
    +>        (a', b', c', d', e') = abcde4
    +>        abcde5 = (a + a', b + b', c + c', d + d', e + e')
    +
    +
    > doit :: (XYZ -> Word32) -> Word32 -> ABCDE -> Word32 -> ABCDE
    +> doit f k (a, b, c, d, e) w = (a', a, rotL b 30, c, d)
    +>  where a' = rotL a 5 + f(b, c, d) + e + w + k
    +
    +
    > sha1_add_ws :: Int -> ([Word32], [Word32], [Word32], [Word32]) -> [Word32]
    +> sha1_add_ws 80 _ = []
    +> sha1_add_ws n (w1:w1s, w2:w2s, w3:w3s, w4:w4s)
    +>  = w:sha1_add_ws (n + 1) (w1s ++ [w], w2s ++ [w], w3s ++ [w], w4s ++ [w])
    +>  where w = rotL (foldr1 xor [w1, w2, w3, w4]) 1
    +> sha1_add_ws _ _ = error "Case not defined in sha1_add_ws"
    +> 
    +> get_word_32s :: String -> [Word32]
    +> get_word_32s "" = []
    +> get_word_32s ss = this:rest
    +>  where (s, ss') = takeDrop 4 ss
    +>        this = sum $ zipWith shiftL (map (fromIntegral.ord) s) [24, 16, 8, 0]
    +>        rest = get_word_32s ss'
    +
    +
    > takeDrop :: Int -> [a] -> ([a], [a])
    +> takeDrop _ [] = ([], [])
    +> takeDrop 0 xs = ([], xs)
    +> takeDrop n (x:xs) = (x:ys, zs)
    +>  where (ys, zs) = takeDrop (n-1) xs
    +
    +
    > sha1_step_5_display :: ABCDE -> String
    +> sha1_step_5_display (a, b, c, d, e)
    +>  = foldr (\x y -> display_32bits_as_hex x ++ y) "" [a, b, c, d, e]
    +
    +
    > sha1_step_5_concat :: ABCDE -> String
    +> sha1_step_5_concat (a, b, c, d, e)
    +>  = foldr (\x y -> display_32bits_as_8bits x y) "" [a, b, c, d, e]
    +
    +
    > display_32bits_as_hex :: Word32 -> String
    +> display_32bits_as_hex x0 = map getc [y8,y7,y6,y5,y4,y3,y2,y1]
    +>  where (x1, y1) = divMod x0 16
    +>        (x2, y2) = divMod x1 16
    +>        (x3, y3) = divMod x2 16
    +>        (x4, y4) = divMod x3 16
    +>        (x5, y5) = divMod x4 16
    +>        (x6, y6) = divMod x5 16
    +>        (y8, y7) = divMod x6 16
    +>        getc n = (['0'..'9'] ++ ['a'..'f']) !! (fromIntegral n)
    +
    +
    > display_32bits_as_8bits :: Word32 -> ShowS
    +> display_32bits_as_8bits x0 l
    +>     = getn 3 : getn 2 : getn 1 : getn 0 : l
    +>     where getn n = chr (fromIntegral (x0 `shiftR` (n*8) .&. 0xFF))
    +
    +
    > rotL :: Word32 -> Rotation -> Word32
    +> rotL a s = shiftL a s .|. shiftL a (s-32)
    +
    + + addfile ./docs/0.5.0/happstack-util/src/Happstack-Crypto-W64.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Crypto-W64.html 1 + + + + +src/Happstack/Crypto/W64.hs + + + +
    {-# LANGUAGE CPP, UndecidableInstances #-}
    +module Happstack.Crypto.W64 where
    +
    +import Happstack.Crypto.DES
    +import Happstack.Crypto.SHA1
    +import Data.List
    +import Numeric(readHex)
    +#ifdef TEST
    +import Test.QuickCheck
    +#endif
    +
    +--the first character to be encrypted is 0 1 2 3 the number that should
    +--be ignored at the end of the string
    +
    +
    +pad :: String -> String
    +pad x = padding++x
    +    where 
    +    padLength = 4 - (length x) `mod` 4
    +    padding = (toEnum padLength) : (replicate (padLength-1) 'A')
    +
    +unpad :: (Enum a) => [a] -> [a]
    +unpad x = drop (fromEnum $ head x) x
    +
    +prop_PadUnPad :: String -> Bool
    +prop_PadUnPad x = x==(unpad $ pad x)
    +
    +is4Char :: [a] -> Bool
    +is4Char x = length x==4
    +
    +quadCharToW64 :: (Num b, Enum a) => [a] -> b
    +quadCharToW64 = fromInteger . impl . map (fromIntegral.fromEnum)
    +    where impl :: [Integer] -> Integer
    +          impl [a,b,c,d]=(a*2^24+b*2^16+c*2^8+d)
    +          impl _ = error "Argument to quadCharToW64 must be length 4"
    +
    +w64ToQuadChar :: (Integral a, Enum b) => a -> [b]
    +w64ToQuadChar w64 = 
    +    map (toEnum.fromIntegral) $! reverse $! take 4 $! v ++ (repeat 0)
    +    where v = w64ToQuadNum w64
    +
    +w64ToQuadNum :: (Integral a) => a -> [a]
    +w64ToQuadNum = unfoldr (\x->if x==0 then Nothing else 
    +                            Just (x `mod` 256,x `div` 256))
    +
    +#ifdef TEST
    +prop_quadCharW64 x = is4Char x ==> x == (w64ToQuadChar $ quadCharToW64 x)
    +#endif
    +
    +--assume padded
    +toQuadChars :: [a] -> [[a]]
    +toQuadChars [] = []
    +toQuadChars (a:b:c:d:rest) = [a,b,c,d]:toQuadChars rest
    +toQuadChars _ = error "Argument for toQuadChars must have a length that is a multiple of 4"
    +
    +stringToW64s :: (Num a) => String -> [a]
    +stringToW64s = map quadCharToW64 . toQuadChars . pad
    +
    +w64sToString :: (Enum b) => [Integer] -> [b]
    +w64sToString = unpad . concatMap w64ToQuadChar
    +
    +prop_stringW64 :: String -> Bool
    +prop_stringW64 x = x == (w64sToString $ stringToW64s x)
    +
    +--des takes a 64 bit number and encrypts it with another 64 bit number
    +
    +--so string DES is an key string converted to a w64 and a value converted
    +--to a list of w64s
    +--the result is then converted from a list of w64s back to a string
    +--the key is an sha1 hash of the string converted to a 64 bit int or 
    +-- the first 16 hex digits  -- `1/3 of total key space
    +
    +hexToW64 :: (Num a) => String -> a
    +hexToW64 = fromInteger . fst . head . readHex . take 16
    +
    +stringToKey :: (Num a) => String -> a
    +stringToKey = hexToW64 . sha1
    +
    +des_encrypt :: String -> String -> [Enc]
    +des_encrypt key = map (flip des_enc $ stringToKey key) . stringToW64s
    +
    +des_decrypt :: (Enum a) => String -> [Message] -> [a]
    +des_decrypt key = 
    +    w64sToString . 
    +    map (toInteger . flip des_dec (stringToKey key)) 
    +              
    +
    +prop_DES :: String -> String -> Bool
    +prop_DES key val = val == (des_decrypt key $ des_encrypt key val)
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-AutoBuild.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-AutoBuild.html 1 + + + + +src/Happstack/Util/AutoBuild.hs + + + +
    -------------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Util.AutoBuild
    +-- Copyright   :  Happstack.com 2009
    +-- License     :  BSD3
    +--
    +-- Maintainer  :  Matthew Elder
    +-- Stability   :  provisional
    +-- Portability :  linux/windows
    +--
    +-------------------------------------------------------------------------------
    +module Happstack.Util.AutoBuild (
    +    autoBuild
    +    ) where
    +
    +import Control.Concurrent (forkIO, threadDelay)
    +import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar)
    +import Control.Exception (bracket)
    +import System.Directory (getModificationTime)
    +import System.Exit (ExitCode(..), exitFailure)
    +import System.Process
    +import System.Time (ClockTime)
    +import System.IO
    +
    +-- | Functionality for the autoBuild tool.
    +--   Inspired by searchpath.
    +autoBuild :: String   -- ^ Build command
    +          -> String   -- ^ Path to binary
    +          -> [String] -- ^ Arguments to use when running binary
    +          -> IO ()
    +autoBuild buildCmd binPath binArgs = do
    +    putStrLn "Performing the initial build. . ."
    +    buildSuccess <- buildBin buildCmd -- initial build
    +    if buildSuccess
    +        then do
    +            mph <- newEmptyMVar
    +            newMod <- getModificationTime binPath
    +            forkIO (builder mph buildCmd binPath newMod)
    +            runner mph binPath binArgs
    +            
    +        else do
    +            putStrLn "Initial build failed, see 'build.out.log' and 'build.err.log'."
    +            exitFailure
    +
    +-- builds the program
    +builder :: MVar ProcessHandle -> String -> FilePath -> ClockTime -> IO ()
    +builder mph buildCmd binPath lastMod = do
    +    -- add a delay between build attempts (5 seconds)
    +    threadDelay 5000000
    +    
    +    buildSuccess <- buildBin buildCmd
    +    newMod <- getModificationTime binPath
    +    
    +    -- if the build yielded a new binary, terminate the process
    +    if buildSuccess && (newMod /= lastMod)
    +        then do
    +            putStrLn "A new binary has been built, killing the existing one. . ."
    +            terminateProcess =<< takeMVar mph
    +        else return ()
    +        
    +    -- continue loop
    +    builder mph buildCmd binPath newMod
    +
    +-- runs the program
    +runner :: MVar ProcessHandle -> FilePath -> [String] -> IO ()
    +runner mph binPath binArgs = do
    +    bracket
    +        (runBin binPath binArgs)
    +        (terminateProcess)
    +        (\ph -> putMVar mph ph >> waitForProcess ph)
    +    
    +    -- continue loop
    +    runner mph binPath binArgs
    +
    +-- does not block, returns ph
    +runBin :: String -> [String] -> IO ProcessHandle
    +runBin binPath binArgs = do
    +    putStrLn $ "Running binary: " ++ (showCmd binPath binArgs)
    +    ph <- runProcess binPath binArgs Nothing Nothing Nothing Nothing Nothing
    +    return ph
    +    where showCmd bp [] = bp
    +          showCmd bp ba = bp ++ " " ++ unwords ba
    +
    +-- blocks until built, returns True if build was a success
    +buildBin :: String -> IO Bool
    +buildBin buildCmd = do
    +    (_inp,out,err,ph) <- runInteractiveCommand buildCmd
    +    appendFile "build.out.log" =<< hGetContents out
    +    appendFile "build.err.log" =<< hGetContents err
    +    waitForProcess ph
    +    exitCode <- getProcessExitCode ph
    +    return (exitCode == Just ExitSuccess)
    +
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-ByteStringCompat.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-ByteStringCompat.html 1 + + + + +src/Happstack/Util/ByteStringCompat.hs + + + +
    {-# OPTIONS -cpp #-}
    +-- | Compatiblity for ByteStrings
    +module Happstack.Util.ByteStringCompat
    +    (breakChar, breakCharEnd,
    +     dropSpace, dropSpaceEnd,
    +     rechunkLazy
    +    ) where
    +
    +import Data.ByteString(ByteString)
    +import qualified Data.ByteString       as B
    +import qualified Data.ByteString.Internal as B
    +import qualified Data.ByteString.Char8 as C
    +import qualified Data.ByteString.Lazy  as L
    +import Data.Char(isSpace)
    +import Foreign
    +
    +#define STRICT2(f) f a b | a `seq` b `seq` False = undefined
    +
    +
    +-- | Semantically equivalent to break on strings
    +{-# INLINE breakChar #-}
    +breakChar :: Char -> ByteString -> (ByteString, ByteString)
    +breakChar ch = B.break ((==) x) where x = B.c2w ch
    +
    +-- | 'breakCharEnd' behaves like breakChar, but from the end of the
    +-- ByteString.
    +--
    +-- > breakCharEnd ('b') (pack "aabbcc") == ("aab","cc")
    +--
    +-- and the following are equivalent:
    +--
    +-- > breakCharEnd 'c' "abcdef"
    +-- > let (x,y) = break (=='c') (reverse "abcdef")
    +-- > in (reverse (drop 1 y), reverse x)
    +--
    +{-# INLINE breakCharEnd #-}
    +breakCharEnd :: Char -> ByteString -> (ByteString, ByteString)
    +breakCharEnd c p = B.breakEnd ((==) x) p where x = B.c2w c
    +
    +-- | Drops leading spaces in the ByteString
    +{-# INLINE dropSpace #-}
    +dropSpace :: ByteString -> ByteString
    +dropSpace = C.dropWhile isSpace
    +
    +-- | Drops trailing spaces in the ByteString
    +{-# INLINE dropSpaceEnd #-}
    +dropSpaceEnd :: ByteString -> ByteString
    +dropSpaceEnd (B.PS x s l) = B.inlinePerformIO $ withForeignPtr x $ \p -> do
    +    i <- lastnonspace (p `plusPtr` s) (l-1)
    +    return $! if i == (-1) then B.empty else B.PS x s (i+1)
    +
    +lastnonspace :: Ptr Word8 -> Int -> IO Int
    +STRICT2(lastnonspace)
    +lastnonspace ptr n
    +    | n < 0     = return n
    +    | otherwise = do w <- peekElemOff ptr n
    +                     if B.isSpaceWord8 w then lastnonspace ptr (n-1) else return n
    +
    +-- | Chunk a lazy bytestring into reasonable chunks - is id from outside.
    +--   This is useful to make bytestring chunks reasonable sized for e.g.
    +--   compression.
    +rechunkLazy :: L.ByteString -> L.ByteString
    +rechunkLazy = L.fromChunks . norm . foldr w ([],[],0) . L.toChunks
    +    where norm (acc, [],  _) = acc
    +          norm (acc, cur, _) = B.concat cur : acc
    +          w chunk (acc,cur,len) = let bl = len + B.length chunk
    +                                  in if bl > 0x100 then (B.concat (chunk : cur) : acc, [], 0) else (acc, chunk : cur, bl)
    +
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-Common.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-Common.html 1 + + + + +src/Happstack/Util/Common.hs + + + +
    -----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Util.Common
    +-- Copyright   :  (c) Happstack.com, 2009; (c) HAppS.org, 2005
    +-- License     :  BSD3
    +-- 
    +--
    +-- Various helper routines.
    +-----------------------------------------------------------------------------
    +module Happstack.Util.Common where
    +
    +import System.Log.Logger
    +import Control.Concurrent
    +import Control.Monad
    +import qualified Data.ByteString.Char8 as P
    +import Data.Char
    +import Data.Int
    +import System.IO
    +import System.Exit
    +import System.IO.Error
    +import System.Process
    +import System.IO.Unsafe
    +import System.Time
    +import Control.Arrow (first,second)
    +
    +type Seconds = Int
    +type EpochSeconds = Int64
    +epochSeconds :: CalendarTime -> EpochSeconds
    +epochSeconds ct = let TOD sec _ = toClockTime ct in fromIntegral sec
    +eSecsToCalTime :: EpochSeconds -> IO CalendarTime
    +eSecsToCalTime s = toCalendarTime (TOD (fromIntegral s) 0)
    +epochPico :: CalendarTime -> Integer
    +epochPico ct = fromIntegral (epochSeconds ct) * 1000
    +
    +----reliable getline and putline
    +
    +logMC :: Priority -> String -> IO ()
    +logMC = logM "Happstack.Util.Common"
    +
    +-- | Put a line into a handle followed by "\r\n" and echo to stdout
    +hPutLine :: Handle -> String -> IO ()
    +hPutLine handle line = do
    +	hPutStr handle line
    +	hPutStr handle "\r\n"
    +	hFlush handle
    +	logMC DEBUG line
    +	return ()
    +
    +-- | Get a line from the handle and echo to stdout
    +hGetLn :: Handle -> IO String
    +hGetLn handle = do
    +    let hGetLn' = do
    +          c <- hGetChar handle
    +          case c of
    +	    '\n' -> return []
    +            '\r' -> do c2 <- hGetChar handle 
    +		       if c2 == '\n' then return [] else getRest c
    +	    _    -> getRest c
    +	getRest c = fmap (c:) hGetLn'
    +    line <- hGetLn'
    +    logMC DEBUG line
    +    return line
    +
    +
    +unBracket, ltrim, rtrim, trim :: String -> String
    +-- | Removes the whitespace surrounding a string as well
    +-- as the first and last character.
    +-- @unBracket "  (asdf) " = "asdf"@
    +unBracket = tail . init . trim
    +
    +-- | Drops the whitespace at the start of the string
    +ltrim = dropWhile isSpace
    +
    +-- | Drops the whitespace at the end of the string
    +rtrim = reverse.ltrim.reverse
    +
    +-- | Trims the beginning and ending whitespace of a string
    +trim=ltrim.rtrim
    +
    +-- | Repeadly splits a list by the provided separator and collects the results
    +splitList :: Eq a => a -> [a] -> [[a]]
    +splitList _   [] = []
    +splitList sep list = h:splitList sep t
    +	where (h,t)=split (==sep) list
    +
    +-- | Repeatedly splits a list and collects the results
    +splitListBy :: (a -> Bool) -> [a] -> [[a]]
    +splitListBy _ [] = []
    +splitListBy f list = h:splitListBy f t
    +	where (h,t)=split f list
    +
    +-- | Split is like break, but the matching element is dropped.
    +split :: (a -> Bool) -> [a] -> ([a], [a])
    +split f s = (left,right)
    +	where
    +	(left,right')=break f s
    +	right = if null right' then [] else tail right'
    +							
    +
    +-- | Read file with a default value if the file does not exist.
    +mbReadFile :: a -> (String -> a) -> FilePath -> IO a
    +mbReadFile noth just path  = 
    +	(do text <- readFile path;return $ just text)
    +	`catch` \err -> if isDoesNotExistError err then return noth else ioError err
    +
    +mapFst :: (a -> b) -> [(a,x)] -> [(b,x)]
    +mapFst = map . first
    +
    +mapSnd :: (a -> b) -> [(x,a)] -> [(x,b)]
    +mapSnd = map . second 
    +
    +-- | applies the list of functions to the provided argument 
    +revmap :: a -> [a -> b] -> [b]
    +revmap item = map (\f->f item)
    +
    +-- | @comp f a b@ compares @a@ and @b@ after apply
    +-- @f@.
    +comp :: Ord t => (a -> t) -> a -> a -> Ordering
    +comp f e1 e2 = f e1 `compare` f e2
    +
    +-- | Run an external command. Upon failure print status
    +--   to stderr.
    +runCommand :: String -> [String] -> IO ()
    +runCommand cmd args = do 
    +    (_, outP, errP, pid) <- runInteractiveProcess cmd args Nothing Nothing
    +    let pGetContents h = do mv <- newEmptyMVar
    +                            let put [] = putMVar mv []
    +                                put xs = last xs `seq` putMVar mv xs
    +                            forkIO (hGetContents h >>= put)
    +                            takeMVar mv
    +    os <- pGetContents outP
    +    es <- pGetContents errP
    +    ec <- waitForProcess pid
    +    case ec of
    +      ExitSuccess   -> return ()
    +      ExitFailure e ->
    +          do hPutStrLn stderr ("Running process "++unwords (cmd:args)++" FAILED ("++show e++")")
    +             hPutStrLn stderr os
    +             hPutStrLn stderr es
    +             hPutStrLn stderr "Raising error..."
    +             fail "Running external command failed"
    +
    +
    +-- | Unsafe tracing, outputs the message and the value to stderr.
    +debug :: Show a => String -> a -> a
    +debug msg s = 
    +    seq (unsafePerformIO (hPutStr stderr ("DEBUG: "++msg++"\n") >> 
    +                                  hPutStr stderr (show s++"\n"))) s
    +
    +{-# NOINLINE debugM #-}
    +-- | Unsafe tracing messages inside a monad.
    +debugM :: Monad m => String -> m ()
    +debugM msg = unsafePerformIO (P.hPutStr stderr (P.pack (msg++"\n")) >> hFlush stderr) `seq` return ()
    +
    +-- | Read in any monad.
    +readM :: (Monad m, Read t) => String -> m t
    +readM s = case reads s of
    +            [(v,"")] -> return v
    +            _        -> fail "readM: parse error"
    +
    +-- | Convert Maybe into an another monad.  This is a simple injection that calls
    +-- fail when given a Nothing.
    +maybeM :: Monad m => Maybe a -> m a
    +maybeM (Just x) = return x
    +maybeM _        = fail "maybeM: Nothing"
    +
    +-- | Lifts a bool into a MonadPlus, with False mapped to the mzero.
    +boolM :: (MonadPlus m) => Bool -> m Bool
    +boolM False = mzero
    +boolM True  = return True
    +
    +-- | @notMb a b@ returns @Just a@ if @b@ is @Nothing@ and @Nothing@ if
    +-- @b@ is @Just _@.
    +notMb :: a-> Maybe a-> Maybe a
    +notMb v1 v2 = maybe (Just v1) (const Nothing) v2
    +
    +-- | Takes a list of delays, in seconds, and an action to execute
    +-- repeatedly.  The action is then executed repeatedly in a separate thread
    +-- until the list has been consumed.  The first action takes place immediately.  
    +periodic :: [Int] -> IO () -> IO ThreadId
    +periodic ts = forkIO . periodic' ts
    +
    +-- a little something to fix the types of ^
    +infixr 8 .^
    +(.^) :: Int->Int->Int
    +a .^ b = a ^ b
    +
    +-- | Similar to 'periodic' but runs in the same thread
    +periodic' :: [Int] -> IO a -> IO a
    +periodic' [] x = x
    +periodic' (t:ts) x = x >> threadDelay ((10 .^ 6)*t) >> periodic' ts x
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-Concurrent.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-Concurrent.html 1 + + + + +src/Happstack/Util/Concurrent.hs + + + +
    {-# OPTIONS -cpp #-}
    +{- Copyright (c) Happstack.com, 2009; (c) HAppS.org, 2005
    +
    +   Using Happstack in GHCi
    +
    +   Because there are many threads and reloading everything
    +   is slow here is a way to kill all threads from GHCi:
    +   add -DINTERACTIVE to the command line and use the
    +   function happsKill from the prompt.
    +-}
    +module Happstack.Util.Concurrent where
    +
    +import Control.Concurrent
    +import Prelude hiding (catch)
    +import Control.Exception -- hiding (catch)
    +#ifdef INTERACTIVE
    +import System.IO.Unsafe
    +import System.Mem
    +#endif
    +
    +--generic utils
    +-- | Equivalent to a composition of fork and foreverSt
    +forkEverSt :: (t -> IO t) -> t -> IO ThreadId
    +forkEverSt f = fork . foreverSt f
    +
    +-- | Similar to forever but with an explicit state parameter threaded through
    +-- the computation.
    +foreverSt :: (Monad m) => (t -> m t) -> t -> m b
    +foreverSt f state= f state >>= foreverSt f
    +
    +-- | Equivalent to a composition of fork and forever
    +forkEver :: IO a -> IO ThreadId
    +forkEver = fork . forever
    +
    +-- | Lifts the argument with Right before writing it into the chan
    +writeChanRight :: Chan (Either a b) -> b -> IO ()
    +writeChanRight chan = writeChan chan . Right
    +
    +-- | Lifts the argument with Left before writing it into the chan
    +writeChanLeft :: Chan (Either a b) -> a -> IO ()
    +writeChanLeft chan = writeChan chan . Left
    +
    +-- | Fork that throws away the ThreadId
    +fork_ :: IO a -> IO ()
    +fork_ c = fork c >> return ()
    +
    +-- | Fork a new thread.
    +fork :: IO a -> IO ThreadId
    +
    +-- | Register an action to be run when ghci is restarted.
    +registerResetAction :: IO () -> IO ()
    +-- | Reset state
    +reset :: IO ()
    +
    +-- | A version of forever that will gracefully catch IO exceptions and continue
    +-- executing the provided action.
    +forever :: IO a -> IO a
    +
    +#ifndef INTERACTIVE
    +forever a = finally a (forever a)
    +fork c = forkIO (c >> return ())
    +registerResetAction _ = return ()
    +reset = return ()
    +#else
    +forever a = try a >>= w
    +    where w (Right _)                            = forever a
    +          w (Left (AsyncException ThreadKilled)) = return ()
    +          w (Left e)                             = print e >> forever a
    +registerResetAction x = modifyMVar_ happsThreadList (return . (x:))
    +
    +fork c = do
    +    x <- forkIO (c >> return ())
    +    modifyMVar_ happsThreadList (\xs -> return (killThread x:xs))
    +    return x
    +reset = do xs <- swapMVar happsThreadList []
    +           sequence_ xs
    +           threadDelay 10000
    +           performGC
    +           logM "Happstack.Util.Concurrent" INFO "reset ok"
    +{-# NOINLINE happsThreadList #-}
    +happsThreadList = unsafePerformIO $ newMVar []
    +#endif
    +
    +-- | Sleep N seconds
    +sleep :: Int -> IO ()
    +sleep n = threadDelay (n * second) where second = 1000000
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-Cron.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-Cron.html 1 + + + + +src/Happstack/Util/Cron.hs + + + +
    module Happstack.Util.Cron (cron) where
    +
    +import Control.Concurrent (threadDelay)
    +
    +type Seconds = Int
    +
    +-- | Given an action f and a number of seconds t, cron will execute
    +-- f every t seconds with the first execution t seconds after cron is called.
    +-- cron does not spawn a new thread.
    +cron :: Seconds -> IO () -> IO a
    +cron seconds0 action = loop seconds0
    +    where maxSeconds = (maxBound :: Int) `div`  10^(6 ::Int)
    +          loop seconds = 
    +              if seconds <= maxSeconds
    +                then do threadDelay (10^(6 :: Int) * seconds)
    +                        action
    +                        loop seconds0
    +                else do threadDelay (10^(6 :: Int) * maxSeconds)
    +                        loop (seconds - maxSeconds)
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-Daemonize.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-Daemonize.html 1 + + + + +src/Happstack/Util/Daemonize.hs + + + +
    module Happstack.Util.Daemonize where 
    +
    +import System.Directory
    +import System.Environment
    +import System.Exit
    +import System.Time
    +import Control.Concurrent
    +import Control.Exception.Extensible as E
    +import Control.Monad.Error
    +import Happstack.Crypto.SHA1
    +import Happstack.Util.Common
    +
    +
    +{--
    +  1. don't start the app if already running. the app is already running if something
    +  has written to the daemon file recently
    +  
    +  2. kill the app if the binary has changed since the app started
    +--}
    +
    +-- Will placing the lock-file in the current directory work if we run the application from cron?
    +daemonize :: FilePath -> IO a -> IO a
    +daemonize binarylocation main = 
    +    do
    +    startTime <- getClockTime
    +    tid1 <- exitIfAlreadyRunning startTime
    +    mId <- myThreadId
    +    tid2 <- appCheck binarylocation startTime mId
    +    main `finally` mapM killThread [tid1,tid2]
    +    where 
    +    seconds n = noTimeDiff { tdSec = n }
    +    exitIfAlreadyRunning startTime = 
    +        do
    +        uniqueId <- getDaemonizedId
    +        let name = ".haskell_daemon." ++ uniqueId
    +        fe <- doesFileExist name
    +        when fe $ 
    +             do 
    +             daemonTime <- getModificationTime name         
    +             when (diffClockTimes startTime daemonTime < seconds 2) $
    +                  exitWith ExitSuccess  >> return ()
    +        periodic (repeat 1) $ writeFile name "daemon" 
    +
    +    appCheck bl startTime mId = periodic (repeat 1) $ 
    +        do 
    +        fe <- doesFileExist bl
    +        if not fe then return () else do
    +        appModTime <- getModificationTime bl
    +        when (startTime < appModTime) (E.throwTo mId ExitSuccess) -- throws to the main thread
    +
    +getDaemonizedId :: IO String
    +getDaemonizedId
    +    = do prog <- getProgName
    +         args <- getArgs
    +         return (sha1 (prog ++ unwords args))
    +
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-FileManip.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-FileManip.html 1 + + + + +src/Happstack/Util/FileManip.hs + + + +
    {-# LANGUAGE GeneralizedNewtypeDeriving #-}
    +
    +module Happstack.Util.FileManip (always, find) where
    +
    +import qualified System.PosixCompat.Files as F
    +import Control.Monad.State
    +import qualified Control.Exception.Extensible as E
    +import System.IO
    +import Data.List (sort)
    +import System.Directory (getDirectoryContents)
    +import System.IO.Unsafe (unsafeInterleaveIO)
    +import System.FilePath ((</>))
    +
    +
    +-- | Information collected during the traversal of a directory.
    +data FileInfo = FileInfo
    +    {
    +      infoPath :: FilePath -- ^ file path
    +    , infoDepth :: Int -- ^ current recursion depth
    +    , infoStatus :: F.FileStatus -- ^ status of file
    +    } deriving (Eq)
    +instance Eq F.FileStatus where
    +    a == b = F.deviceID a == F.deviceID b &&
    +             F.fileID a == F.fileID b
    +
    +-- | Construct a 'FileInfo' value.
    +
    +mkFI :: FilePath -> Int -> F.FileStatus -> FileInfo
    +
    +mkFI = FileInfo
    +
    +-- | Monadic container for file information, allowing for clean
    +-- construction of combinators.  Wraps the 'State' monad, but doesn't
    +-- allow 'get' or 'put'.
    +newtype FindClause a = FC { runFC :: State FileInfo a }
    +    deriving (Functor, Monad)
    +
    +-- | Run the given 'FindClause' on the given 'FileInfo' and return its
    +-- result.  This can be useful if you are writing a function to pass
    +-- to 'fold'.
    +--
    +-- Example:
    +--
    +-- > myFoldFunc :: a -> FileInfo -> a
    +-- > myFoldFunc a i = let useThisFile = evalClause (fileName ==? "foo") i
    +-- >                  in if useThisFile
    +-- >                     then fiddleWith a
    +-- >                     else a
    +--
    +evalClause :: FindClause a -> FileInfo -> a
    +evalClause = evalState . runFC
    +
    +evalFI :: FindClause a
    +       -> FilePath
    +       -> Int
    +       -> F.FileStatus
    +       -> a
    +evalFI m p d s = evalClause m (mkFI p d s)
    +
    +type FilterPredicate = FindClause Bool
    +type RecursionPredicate = FindClause Bool
    +
    +-- | List the files in the given directory, sorted, and without \".\"
    +-- or \"..\".
    +getDirContents :: FilePath -> IO [FilePath]
    +
    +getDirContents dir = (sort . filter goodName) `liftM` getDirectoryContents dir
    +    where goodName "." = False
    +          goodName ".." = False
    +          goodName _ = True
    +
    +-- | Search a directory recursively, with recursion controlled by a
    +-- 'RecursionPredicate'.  Lazily return a sorted list of all files
    +-- matching the given 'FilterPredicate'.  Any errors that occur are
    +-- dealt with by the given handler.
    +findWithHandler ::
    +    (FilePath -> E.SomeException -> IO [FilePath]) -- ^ error handler
    +    -> RecursionPredicate -- ^ control recursion into subdirectories
    +    -> FilterPredicate -- ^ decide whether a file appears in the result
    +    -> FilePath -- ^ directory to start searching
    +    -> IO [FilePath] -- ^ files that matched the 'FilterPredicate'
    +
    +findWithHandler errHandler recurse filter path =
    +    E.handle (errHandler path) $ F.getSymbolicLinkStatus path >>= visit path 0
    +  where visit path' depth st =
    +            if F.isDirectory st && evalFI recurse path' depth st
    +              then unsafeInterleaveIO (traverse path' (succ depth) st)
    +              else filterPath path' depth st []
    +        traverse dir depth dirSt = do
    +            names <- E.catch (getDirContents dir) (errHandler dir)
    +            filteredPaths <- forM names $ \name -> do
    +                let path' = dir </> name
    +                unsafeInterleaveIO $ E.handle (errHandler path')
    +                    (F.getSymbolicLinkStatus path >>= visit path' depth)
    +            filterPath dir depth dirSt (concat filteredPaths)
    +        filterPath path' depth st result =
    +            return $ if evalFI filter path' depth st
    +                then path':result
    +                else result
    +
    +-- | Search a directory recursively, with recursion controlled by a
    +-- 'RecursionPredicate'.  Lazily return a sorted list of all files
    +-- matching the given 'FilterPredicate'.  Any errors that occur are
    +-- ignored, with warnings printed to 'stderr'.
    +find :: RecursionPredicate -- ^ control recursion into subdirectories
    +     -> FilterPredicate -- ^ decide whether a file appears in the result
    +     -> FilePath -- ^ directory to start searching
    +     -> IO [FilePath] -- ^ files that matched the 'FilterPredicate'
    +
    +find = findWithHandler warnOnError
    +    where warnOnError path err =
    +              hPutStrLn stderr (path ++ ": " ++ show err) >> return []
    +
    +-- | Unconditionally return 'True'.
    +always :: FindClause Bool
    +always = return True
    +
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-HostAddress.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-HostAddress.html 1 + + + + +src/Happstack/Util/HostAddress.hs + + + +
    -- Pure Haskell functions to convert HostAddress and HostAddress6 to a human
    +-- readable string format.
    +module Happstack.Util.HostAddress (showHostAddress, showHostAddress6, HostAddress, HostAddress6) where
    +import Data.Word (Word32)
    +import Numeric (showHex)
    +import Data.List (intersperse)
    +
    +type HostAddress = Word32
    +type HostAddress6 = (Word32, Word32, Word32, Word32)
    +
    +-- | Converts a HostAddress to a String in dot-decimal notation
    +showHostAddress :: HostAddress -> String
    +showHostAddress num = concat [show q1, ".", show q2, ".", show q3, ".", show q4]
    +  where (num',q1)   = num `quotRem` 256
    +        (num'',q2)  = num' `quotRem` 256
    +        (num''',q3) = num'' `quotRem` 256
    +        (_,q4)      = num''' `quotRem` 256
    +
    +-- | Converts a IPv6 HostAddress6 to standard hex notation
    +showHostAddress6 :: HostAddress6 -> String
    +showHostAddress6 (a,b,c,d) =
    +  (concat . intersperse ":" . map (flip showHex ""))
    +    [p1,p2,p3,p4,p5,p6,p7,p8]
    +  where (a',p2) = a `quotRem` 65536
    +        (_,p1)  = a' `quotRem` 65536
    +        (b',p4) = b `quotRem` 65536
    +        (_,p3)  = b' `quotRem` 65536
    +        (c',p6) = c `quotRem` 65536
    +        (_,p5)  = c' `quotRem` 65536
    +        (d',p8) = d `quotRem` 65536
    +        (_,p7)  = d' `quotRem` 65536
    +
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-LogFormat.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-LogFormat.html 1 + + + + +src/Happstack/Util/LogFormat.hs + + + +
    module Happstack.Util.LogFormat
    +  ( formatTimeCombined
    +  , formatRequestCombined
    +  ) where
    +
    +import System.Locale (defaultTimeLocale)
    +import Data.Time.Format (FormatTime(..), formatTime)
    +
    +-- | Format the time as describe in the Apache combined log format.
    +--   http://httpd.apache.org/docs/2.2/logs.html#combined
    +--
    +-- The format is:
    +--   [day/month/year:hour:minute:second zone]
    +--    day = 2*digit
    +--    month = 3*letter
    +--    year = 4*digit
    +--    hour = 2*digit
    +--    minute = 2*digit
    +--    second = 2*digit
    +--    zone = (`+' | `-') 4*digit 
    +formatTimeCombined :: FormatTime t => t -> String
    +formatTimeCombined = formatTime defaultTimeLocale "%d/%b/%Y:%H:%M:%S %z"
    +
    +-- | Format the request as describe in the Apache combined log format.
    +--   http://httpd.apache.org/docs/2.2/logs.html#combined
    +-- 
    +-- The format is: "%h - %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
    +-- %h:            This is the IP address of the client (remote host) which made the request to the server.
    +-- %u:            This is the userid of the person requesting the document as determined by HTTP authentication.
    +-- %t:            The time that the request was received.
    +-- %r:            The request line from the client is given in double quotes.
    +-- %>s:           This is the status code that the server sends back to the client.
    +-- %b:            The last part indicates the size of the object returned to the client, not including the response headers.
    +-- %{Referer}:    The "Referer" (sic) HTTP request header.
    +-- %{User-agent}: The User-Agent HTTP request header. 
    +formatRequestCombined :: FormatTime t =>
    +  String
    +  -> String
    +  -> t
    +  -> String
    +  -> Int
    +  -> Integer
    +  -> String
    +  -> String
    +  -> String
    +formatRequestCombined host user time requestLine responseCode size referer userAgent =
    +  unwords 
    +    [ host
    +    , user
    +    , "[" ++ formattedTime ++ "]"
    +    , show requestLine
    +    , show responseCode
    +    , show size
    +    , show referer
    +    , show userAgent
    +    ]
    +  where formattedTime = formatTimeCombined time
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-Mail.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-Mail.html 1 + + + + +src/Happstack/Util/Mail.hs + + + +
    -----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Util.Mail
    +-- Copyright   :  Happstack.com 2009
    +-- License     :  BSD3
    +--
    +-- Maintainer  :  Matthew Elder
    +-- Stability   :  provisional
    +-- Portability :  linux/windows
    +--
    +-- Mail is a simple library with which you can add email functionality to your
    +-- application. It assumes you have access to a smarthost which can relay all
    +-- your mail.
    +-- 
    +-- As an example:
    +--
    +-- > import Happstack.Util.Mail
    +-- > main :: IO ()
    +-- > main = do
    +-- >     sendSimpleMessages "10.2.23.11" "example.com" [message]
    +-- >     where message = SimpleMessage
    +-- >                         [NameAddr (Just "John Doe") "johnd@example.com"]
    +-- >                         [NameAddr (Just "Patch-Tag Team") "team@patch-tag.com"]
    +-- >                         "My test email using Happstack.Util.Mail"
    +-- >                         "Hi, this is a test email which uses Happstack."
    +
    +module Happstack.Util.Mail
    +    ( NameAddr(..)
    +    , SimpleMessage(..)
    +    , sendRawMessages
    +    , sendSimpleMessages
    +    ) where
    +
    +import Data.IORef (newIORef, readIORef)
    +import Network.Socket
    +    (SockAddr(..)
    +    , inet_addr
    +    )
    +import Network.SMTP.Client
    +import System.Log.Logger (Priority(..), logM)
    +import System.Time
    +    ( CalendarTime(..)
    +    , getClockTime
    +    , toCalendarTime
    +    )
    +
    +data SimpleMessage
    +    = SimpleMessage
    +        { from :: [NameAddr] -- ^ The sender(s)
    +        , to :: [NameAddr]   -- ^ The recipient(s)
    +        , subject :: String  -- ^ The subject line
    +        , body :: String     -- ^ The body
    +        }
    +    deriving (Show)
    +
    +toMessage :: CalendarTime -> SimpleMessage -> Message
    +toMessage ct sm =
    +    Message
    +        [From (from sm), To (to sm), Subject (subject sm), Date ct]
    +        (body sm)
    +        
    +log' :: Priority -> String -> IO ()
    +log' = logM "Happstack.Util.Mail"
    +
    +-- | Simplest way to send mail.  Takes the smarthost ip, the HELO domain, and a list of SimpleMessage.
    +sendSimpleMessages :: String          -- ^ IP address of the smarthost
    +                   -> String          -- ^ HELO domain (should be the same as your from-address-domain)
    +                   -> [SimpleMessage] -- ^ List of simple messages to send
    +                   -> IO ()
    +sendSimpleMessages smartHostIp heloDomain simpleMessages = do
    +    nowCT <- toCalendarTime =<< getClockTime
    +    hostAddr <- inet_addr smartHostIp
    +    let smtpSockAddr = SockAddrInet 25 hostAddr
    +    sendRawMessages smtpSockAddr heloDomain (map (toMessage nowCT) simpleMessages)
    +
    +-- | Use this if you need more control than sendSimpleMessages gives you.
    +sendRawMessages :: SockAddr  -- ^ SockAddr for the smarthost
    +                -> String    -- ^ HELO domain (should be the same as your from-address-domain)
    +                -> [Message] -- ^ List of messages to send
    +                -> IO ()
    +sendRawMessages smtpSockAddr heloDomain messages = do
    +    log' NOTICE $ "connecting to SMTP smarthost: " ++ show smtpSockAddr
    +    sentRef <- newIORef []
    +    sendSMTP' (log' INFO) (Just sentRef) heloDomain smtpSockAddr messages
    +    statuses <- readIORef sentRef
    +  
    +    -- If no exception was caught, statuses is guaranteed to be
    +    -- the same length as the list of input messages, therefore head won't fail here.
    +    log' NOTICE $ "attempting to send messages:\n" ++ show messages
    +    case head statuses of
    +        Nothing ->
    +            return ()
    +        Just status ->
    +            log' ERROR $ "message failed: " ++ show status
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-OpenExclusively.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-OpenExclusively.html 1 + + + + +src/Happstack/Util/OpenExclusively.hs + + + +
    {-# LANGUAGE CPP #-}
    + -- | Cross platform way to open a file exclusively
    +module Happstack.Util.OpenExclusively
    +    ( -- | Cross platform way to open a file exclusively
    +      openExclusively
    +    ) where
    +    
    +import System.IO
    +
    +#ifdef mingw32_HOST_OS
    +-- Windows opens files for exclusive writing by default
    +openExclusively :: FilePath -> IO Handle
    +openExclusively fp = openFile fp ReadWriteMode
    +#endif
    +
    +#ifndef mingw32_HOST_OS
    +import System.Posix.IO
    +
    +-- Unix needs to use a special open call to open files for exclusive writing
    +openExclusively :: FilePath -> IO Handle
    +openExclusively fp =
    +    fdToHandle =<< openFd fp ReadWrite (Just 0o600) flags
    +    where flags = defaultFileFlags {exclusive = True, trunc = True}
    +#endif
    +
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-TH.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-TH.html 1 + + + + +src/Happstack/Util/TH.hs + + + +
    {-# LANGUAGE TemplateHaskell #-}
    +module Happstack.Util.TH where
    +
    +import Language.Haskell.TH
    +
    +-- | Version of 'instanceD' that takes in a Q [Dec] instead of a [Q Dec]
    +-- and filters out signatures from the list of declarations
    +instanceD' :: CxtQ -> TypeQ -> Q [Dec] -> DecQ
    +instanceD' ctxt ty decs =
    +    do decs' <- decs
    +       let decs'' = filter (not . isSigD) decs'
    +       instanceD ctxt ty (map return decs'')
    +
    +-- | Returns true if the Dec matches a SigD constructor
    +isSigD :: Dec -> Bool
    +isSigD (SigD _ _) = True
    +isSigD _ = False
    +
    +
    + addfile ./docs/0.5.0/happstack-util/src/Happstack-Util-TimeOut.html hunk ./docs/0.5.0/happstack-util/src/Happstack-Util-TimeOut.html 1 + + + + +src/Happstack/Util/TimeOut.hs + + + +
    {-# LANGUAGE StandaloneDeriving, DeriveDataTypeable, RecursiveDo,
    +             BangPatterns, UnboxedTuples #-}
    +
    +-----------------------------------------------------------------------------
    +-- |
    +-- Module      :  Happstack.Util.TimeOut
    +-- Copyright   :  (c) Happstack.com, 2009; (c) HAppS.org, 2005
    +-- License     :  BSD3
    +-- 
    +-- Portability :  uses mdo
    +--
    +-- Timeout implementation for performing operations in the IO monad
    +-- with a timeout added. Both using Maybe and exceptions to handle
    +-- timeouts are supported.
    +--
    +-- Timeouts can be implemented in GHC with either a global handler
    +-- or a per-timeout thread which sleeps until the timeout. The latter
    +-- is used in this module. Blocking on foreign calls can cause
    +-- problems as GHC has no way of interrupting such threads.
    +-- The module provides a slightly slower alternative implementation
    +-- which returns even if the computation has blocked on a foreign
    +-- call. This should not be an issue unless -threaded is used.
    +--
    +-- The timeouts are currently limited to a maximum of about
    +-- 2000 seconds. This is a feature of threadDelay, but
    +-- supporting longer timeouts is certainly possible if
    +-- that is desirable.
    +--
    +-- For nested timeouts there are different ways to implement them:
    +-- a) attach an id to the exception so that the catch knows wether it may catch
    +--    this timout exception. I've choosen this because overhead is only passing
    +--    and incrementing an integer value. A integer wrap araound is possible but
    +--    too unlikely to happen to make me worry about it
    +-- b) start a new workiing and killing thread so that if the original thread
    +--   was run within withTimeOut itself it catches the exception and not an inner
    +--   timout. (this is done in withSafeTimeOut, for another reason though)
    +-- c) keep throwing exceptions until the the withTimeOut function kills the
    +--   killing thread. But consider sequence (forever (timeOut threadDelay 10sec) )
    +--   In this case the exception will be called and the next timOut may be entered
    +--   before the second Exception has been thrown
    +--
    +-- All exceptions but the internal TimeOutExceptionI are rethrown in the calling thread
    +-----------------------------------------------------------------------------
    +module Happstack.Util.TimeOut 
    +    (withTimeOut, withTimeOutMaybe,
    +     withSafeTimeOut, withSafeTimeOutMaybe,
    +     TimeOutException(..), second
    +    ) where
    +
    +import Control.Concurrent
    +import qualified Control.Concurrent.MVar.Strict as SM
    +import Control.Exception.Extensible as E
    +import Data.Typeable(Typeable)
    +import System.IO.Unsafe (unsafePerformIO)
    +import Control.Monad (when)
    +
    +import Happstack.Util.Concurrent
    +
    +type TimeOutTId = Int -- must be distinct within a thread only 
    +
    +{-# NOINLINE timeOutIdState #-}
    +timeOutIdState :: SM.MVar TimeOutTId
    +timeOutIdState = unsafePerformIO $ SM.newMVar minBound
    +
    +nextTimeOutId :: IO TimeOutTId
    +nextTimeOutId = 
    +  SM.modifyMVar timeOutIdState $ \a ->
    +      let nid = nextId a in return (nid `seq` (nid,nid))
    +
    +  where nextId !i | i == maxBound = minBound
    +        nextId !i = i + 1
    +
    +data TimeOutExceptionI = TimeOutExceptionI !TimeOutTId -- internal exception, should only be used within this module 
    +  deriving(Typeable)
    +
    +data TimeOutException = TimeOutException -- that's the exception the user may catch 
    +  deriving(Typeable)
    +
    +instance Show TimeOutExceptionI where show _ = error "this TimeOutExceptionI should have been caught within this module"
    +instance E.Exception TimeOutExceptionI
    +
    +deriving instance Show TimeOutException
    +instance E.Exception TimeOutException
    +
    +throw' :: Exception exception => exception -> b
    +throw' = throw
    +
    +throwTo' :: Exception e => ThreadId -> e -> IO ()
    +throwTo' = E.throwTo
    +
    +catch' :: Exception e => IO a -> (e -> IO a) -> IO a
    +catch' = E.catch
    +
    +try' :: IO a -> IO (Either SomeException a) -- give a type signature for try 
    +try' = E.try
    +
    +
    +-- module internal function 
    +catchTimeOutI :: TimeOutTId -> IO a -> IO a -> IO a
    +catchTimeOutI toId op handler =
    +  op `catch'` (\e@(TimeOutExceptionI i) -> if i == toId then handler  else throw' e)
    +
    +-- | This handler returns @Nothing@ if the timeout occurs and @Just a@ if computation 
    +-- returns @a@.
    +withTimeOutMaybe :: Int -> IO a -> IO (Maybe a)
    +withTimeOutMaybe tout op = do 
    +  toId <- nextTimeOutId
    +  wtid <- myThreadId
    +  ktid <- fork ( do threadDelay tout 
    +                    throwTo' wtid (TimeOutExceptionI toId)
    +               )
    +  catchTimeOutI toId (fmap Just (op >>= \r -> killThread ktid >> return  r)) (return Nothing)
    +
    +-- | This is the normal timeout handler. It throws a TimeOutException exception,
    +-- if the timeout occurs.
    +withTimeOut :: Int -> IO a -> IO a
    +withTimeOut tout op = maybeToEx =<< withTimeOutMaybe tout op
    +
    +maybeToEx :: (Monad m) => Maybe t -> m t  
    +maybeToEx (Just r) = return r
    +maybeToEx Nothing = throw' TimeOutException
    +
    +-- | Like timeOut, but additionally it works even if the computation is blocking
    +-- async exceptions (explicitely or by a blocking FFI call). This consumes
    +-- more resources than timeOut, but is still quite fast.
    +withSafeTimeOut :: Int -> IO a -> IO a
    +withSafeTimeOut tout op = maybeToEx =<< withSafeTimeOutMaybe tout op
    +
    +-- | Like withTimeOutMaybe, but handles the operation blocking exceptions like withSafeTimeOut
    +-- does.
    +withSafeTimeOutMaybe :: Int -> IO a -> IO (Maybe a)
    +withSafeTimeOutMaybe tout op = mdo
    +  mv <- newEmptyMVar
    +  wt <- fork $ do 
    +          t <- try' op
    +          case t of
    +            Left e -> tryPutMVar mv (Left e)
    +            Right r -> tryPutMVar mv (Right (Just r))
    +          killThread kt
    +  kt <- fork $ do 
    +          threadDelay tout
    +          e <- tryPutMVar mv (Right Nothing)
    +          when e $ killThread wt
    +  eitherToEx =<< takeMVar mv
    +  where eitherToEx (Left e) = throw' e
    +        eitherToEx (Right r) = return r
    +  
    +
    +-- | Constant representing one second.
    +second :: Int
    +second = 1000000
    +
    + addfile ./docs/0.5.0/happstack-util/src/hscolour.css hunk ./docs/0.5.0/happstack-util/src/hscolour.css 1 +.hs-keyglyph, .hs-layout {color: red;} +.hs-keyword {color: blue;} +.hs-comment, .hs-comment a {color: green;} +.hs-str, .hs-chr {color: teal;} +.hs-keyword, .hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {} addfile ./docs/0.5.0/happstack.haddock binary ./docs/0.5.0/happstack.haddock oldhex * newhex *0d0cface000f00000a720000082112000000000000000000000001000000010000000000000001 *000000020000000000000002000000030000000000000002000000040000000000000002000000 *050000000000000002000000060000000000000003000000070000000000000004000000080000 *0000000000050000000900000000000000050000000a00000000000000050000000b0000000000 *0000050000000c00000000000000050000000d00000000000000060000000e0000000000000006 *0000000f00000000000000070000001000000000000000080000001100000000000000080a0000 *000000000009000000000a00000012000000000013000000000014000000000015000000000016 *00000000001700000000001800000000001900000000001a00000000001b000006000000120000 *001700000018000000190000001a0000001b000100060000001200000000170000000018000000 *0019000000001a000000001b000000000000000002000000000400000002000000000003000000 *000004000000000005000004000000020000000300000004000000050400000002000000030000 *000400000005000400000002010000000300000003000000000400000000050000000000000000 *030000000001000000060000050000001c0000001d0000001e0000001f00000006010000000600 *010000000600000000000000000400000000010000000700000500000020000000210000002200 *000023000000070100000007000100000007000000000000000005000000000800000008000000 *00000900000000000a00000000000b00000000002400000000002500000000002600000000000c *00000500000008000000090000000a0000000b0000000c050000000c0000000800000009000000 *0a0000000b0005000000080000000009020000000a0000000b0000000a000000000b000000000c *00000000000000000600000000050000000d000000000027000000000028000000000029000000 *00000e0000020000000d0000000e020000000d0000000e00020000000d000000000e0000000000 *0000000100000000020000002a00000000002b0000020000000000000001020000000000000001 *0000000000000000000700000000020000002c00000000000f0103010702100000007700000065 *000000620000005300000054000000200000006e000000610000006d0000006500000020000000 *610000007400000074000000720000007302240000002000000072000000650000006e00000064 *0000006500000072000000730000002000000061000000200000006e000000610000006d000000 *650000002000000074000000650000006d000000700000006c0000006100000074000000650000 *002000000077000000690000007400000068000000200000006100000074000000740000007200 *0000730000000a00010000000f010000000f00010000000f00000000000000000a000000000000 *0000000000000000000008000000000200000010010301020b000000430000006f0000006e0000 *007600000065000000720000007400000073000000200000006100000020010702070000004800 *0000530000005000000020000000580000004d0000004c01021a00000020000000740000006f00 *000020000000610000002000000048000000610000007000000070000000730000007400000061 *000000630000006b00000020000000520000006500000073000000700000006f0000006e000000 *73000000650000002e0000000a0102070000002000000053000000690000006e00000063000000 *65000000200107020700000048000000530000005000000020000000580000004d0000004c0102 *330000002000000069000000730000002000000074000000680000006500000020000000740000 *007900000070000000650000002000000072000000650000007400000075000000720000006e00 *00006500000064000000200000006200000079000000200000007500000073000000690000006e *00000067000000200000006c00000069000000740000006500000072000000610000006c000000 *2000000048000000540000004d0000004c0000002000000073000000790000006e000000740000 *0061000000780000000a0102310000002000000077000000690000007400000068000000200000 *004800000053000000500000002c00000020000000790000006f00000075000000200000006300 *0000610000006e0000002000000077000000720000006100000070000000200000007500000070 *00000020000000790000006f00000075000000720000002000000048000000540000004d000000 *4c0000002000000061000000730000002000000077000000650000006200000048000000530000 *0050000000200000002400000020010c0e00000068000000740000006d0000006c0000003e0000 *002e0000002e0000002e0000003c0000002f00000068000000740000006d0000006c0102010000 *000a021b00000020000000740000006f0000002000000075000000730000006500000020000000 *690000007400000020000000770000006900000074000000680000002000000048000000610000 *007000000070000000730000007400000061000000630000006b0000002e0000000a0000000011 *010302180000007700000065000000620000004800000053000000500000002000000077000000 *69000000740000006800000020000000580000004d0000004c0000004d00000065000000740000 *0061000000440000006100000074000000610000000a0002000000100000001102000000100000 *0011000200000010000000001100000000000000002d0000000b0000000c030000000d0000000b *0000000c010000000e0000000000000002030000000f0000000000000002010000000f00000000 *000000020000000010000000000000000200000000110000000000000003000000001200000000 *000000040000000012000000000000000503000000130000000000000005030000001400000000 *000000050100000014000000000000000500000000150000000000000005000000001600000000 *000000060300000017000000000000000600000000180000000000000007000000001900000000 *00000008000000001a0000000000000008000000001b0000000000000009000000001c00000000 *00000009000000001d0000000000000009000000001e0000000000000009000000001f00000000 *000000090000000020000000000000000900000000210000000000000009000000002200000000 *000000090000000023000000000000000900000000240000000000000009000000002500000000 *000000030100000026000000000000000300000000270000000000000003010000002800000000 *0000000300000000290000000000000004010000002a0000000000000004000000002b00000000 *00000004010000002c0000000000000004000000002d0000000000000005000000002e00000000 *00000005000000002f000000000000000500000000300000000000000006000000002e00000000 *00000006000000002f000000000000000600000000300000000000000001000000003100000000 *000000010000000032000000000000000700000000330000000000000034000000000000000f68 *617070737461636b2d302e352e30000000000000001948617070737461636b2e53746174652e43 *6c6f636b54696d6500000000000000144853502e476f6f676c652e416e616c7974696373000000 *00000000084853502e57656254000000000000000f4853502e5365727665725061727454000000 *000000000d4853502e4964656e7469747954000000000000000c4853502e4964656e7469747900 *0000000000002048617070737461636b2e5365727665722e48537472696e6754656d706c617465 *000000000000001948617070737461636b2e5365727665722e4853502e48544d4c000000000000 *000f50617468735f68617070737461636b000000000000001448617070737461636b2e53657276 *65722e48535800000000000000106f6c642d74696d652d312e302e302e33000000000000000b53 *797374656d2e54696d650000000000000009436c6f636b54696d650000000000000003544f4400 *0000000000000555414343540000000000000009616e616c7974696373000000000000000c6164 *64416e616c7974696373000000000000000c666c617474656e4344415441000000000000000649 *64656e745400000000000000094964656e7469747954000000000000000c72756e4964656e7469 *747954000000000000000d6576616c4964656e746974795400000000000000054964656e740000 *00000000000c6576616c4964656e74697479000000000000000577656253540000000000000006 *776562485350000000000000000777656248535027000000000000000776657273696f6e000000 *000000000662696e64697200000000000000066c69626469720000000000000007646174616469 *72000000000000000a6c696265786563646972000000000000000967657442696e446972000000 *00000000096765744c6962446972000000000000000a6765744461746144697200000000000000 *0d6765744c696265786563446972000000000000000f6765744461746146696c654e616d650000 *000000000006574368696c640000000000000008756e574368696c640000000000000005574174 *74720000000000000007756e57417474720000000000000006534368696c640000000000000008 *756e534368696c64000000000000000553417474720000000000000007756e5341747472000000 *0000000009737472697041747472000000000000000a73747269704368696c6400000000000000 *06696e73657274000000000000000c636f6e7374725b61686b795d000000000000000e64617461 *547970655b61686b785d00000000000000046c6f6727 addfile ./docs/0.5.0/happstack/HSP-Google-Analytics.html hunk ./docs/0.5.0/happstack/HSP-Google-Analytics.html 1 + + +HSP.Google.Analytics
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    HSP.Google.Analytics
    Documentation
    newtype UACCT Source
    Constructors
    UACCT String
    analytics :: XMLGenerator m => UACCT -> GenXMLList mSource
    addAnalytics :: (AppendChild m XML, EmbedAsChild m XML, EmbedAsAttr m Attribute, XMLGenerator m) => UACCT -> XMLGenT m XML -> GenXML mSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/HSP-Identity.html hunk ./docs/0.5.0/happstack/HSP-Identity.html 1 + + +HSP.Identity
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    HSP.Identity
    Documentation
    type Ident = XMLGenT IdentitySource
    evalIdentity :: XMLGenT Identity XML -> XMLSource
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/HSP-IdentityT.html hunk ./docs/0.5.0/happstack/HSP-IdentityT.html 1 + + +HSP.IdentityT
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    HSP.IdentityT
    Documentation
    evalIdentityT :: (Functor m, Monad m) => XMLGenT (IdentityT m) XML -> m XMLSource
    type IdentT m = XMLGenT (IdentityT m) XMLSource
    newtype IdentityT m a Source
    Constructors
    IdentityT
    runIdentityT :: m a
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/HSP-ServerPartT.html hunk ./docs/0.5.0/happstack/HSP-ServerPartT.html 1 + + +HSP.ServerPartT
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    HSP.ServerPartT
    Documentation
    flattenCDATA :: [XML] -> [XML]Source
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/HSP-WebT.html hunk ./docs/0.5.0/happstack/HSP-WebT.html 1 + + +HSP.WebT
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    HSP.WebT
    Documentation
    flattenCDATA :: [XML] -> [XML]Source
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/Happstack-Server-HSP-HTML.html hunk ./docs/0.5.0/happstack/Happstack-Server-HSP-HTML.html 1 + + +Happstack.Server.HSP.HTML
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    Happstack.Server.HSP.HTML
    Synopsis
    webHSP :: MonadIO m => HSP XML -> m Response
    webHSP' :: MonadIO m => Maybe XMLMetaData -> HSP XML -> m Response
    Documentation
    webHSP :: MonadIO m => HSP XML -> m ResponseSource
    Converts a HSP XML to a Happstack Response. + Since HSP XML is the type returned by using literal HTML syntax + with HSP, you can wrap up your HTML as webHSP $ html>...</html + to use it with Happstack. +
    webHSP' :: MonadIO m => Maybe XMLMetaData -> HSP XML -> m ResponseSource
    webHSP with XMLMetaData +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/Happstack-Server-HSX.html hunk ./docs/0.5.0/happstack/Happstack-Server-HSX.html 1 + + +Happstack.Server.HSX
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    Happstack.Server.HSX
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/Happstack-Server-HStringTemplate.html hunk ./docs/0.5.0/happstack/Happstack-Server-HStringTemplate.html 1 + + +Happstack.Server.HStringTemplate
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    Happstack.Server.HStringTemplate
    Synopsis
    webST :: MonadIO m => String -> [(String, String)] -> m Response
    Documentation
    webST :: MonadIO m => String -> [(String, String)] -> m ResponseSource
    webST name attrs renders a name template with attrs +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/Happstack-State-ClockTime.html hunk ./docs/0.5.0/happstack/Happstack-State-ClockTime.html 1 + + +Happstack.State.ClockTime
     happstack-0.5.0: The haskell application server stack + code generationSource codeContentsIndex
    Happstack.State.ClockTime
    Description
    instances of Typeable, Data, Serialize, Version, and Default for ClockTime +
    Synopsis
    data ClockTime = TOD Integer Integer
    Documentation
    data ClockTime Source
    A representation of the internal clock time. + Clock times may be compared, converted to strings, or converted to an + external calendar time CalendarTime for I/O or other manipulations. +
    Constructors
    TOD Integer Integer

    Construct a clock time. The arguments are a number + of seconds since 00:00:00 (UTC) on 1 January 1970, + and an additional number of picoseconds. +

    In Haskell 98, the ClockTime type is abstract. +

    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/doc-index.html hunk ./docs/0.5.0/happstack/doc-index.html 1 + + +happstack-0.5.0: The haskell application server stack + code generation (Index)
     happstack-0.5.0: The haskell application server stack + code generationContentsIndex
    addAnalytics
    analytics
    ClockTime
    evalIdentity
    evalIdentityT
    flattenCDATA
    1 (Function)
    2 (Function)
    Ident
    IdentityT
    1 (Type/Class)
    2 (Data Constructor)
    IdentT
    runIdentityT
    SAttr
    SChild
    TOD
    UACCT
    1 (Type/Class)
    2 (Data Constructor)
    unSAttr
    unSChild
    unWAttr
    unWChild
    WAttr
    WChild
    webHSP
    webHSP'
    webST
    addfile ./docs/0.5.0/happstack/frames.html hunk ./docs/0.5.0/happstack/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/happstack/haddock-util.js hunk ./docs/0.5.0/happstack/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/happstack/haddock.css hunk ./docs/0.5.0/happstack/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + addfile ./docs/0.5.0/happstack/happstack.haddock binary ./docs/0.5.0/happstack/happstack.haddock oldhex * newhex *0d0cface000f00000a720000082112000000000000000000000001000000010000000000000001 *000000020000000000000002000000030000000000000002000000040000000000000002000000 *050000000000000002000000060000000000000003000000070000000000000004000000080000 *0000000000050000000900000000000000050000000a00000000000000050000000b0000000000 *0000050000000c00000000000000050000000d00000000000000060000000e0000000000000006 *0000000f00000000000000070000001000000000000000080000001100000000000000080a0000 *000000000009000000000a00000012000000000013000000000014000000000015000000000016 *00000000001700000000001800000000001900000000001a00000000001b000006000000120000 *001700000018000000190000001a0000001b000100060000001200000000170000000018000000 *0019000000001a000000001b000000000000000002000000000400000002000000000003000000 *000004000000000005000004000000020000000300000004000000050400000002000000030000 *000400000005000400000002010000000300000003000000000400000000050000000000000000 *030000000001000000060000050000001c0000001d0000001e0000001f00000006010000000600 *010000000600000000000000000400000000010000000700000500000020000000210000002200 *000023000000070100000007000100000007000000000000000005000000000800000008000000 *00000900000000000a00000000000b00000000002400000000002500000000002600000000000c *00000500000008000000090000000a0000000b0000000c050000000c0000000800000009000000 *0a0000000b0005000000080000000009020000000a0000000b0000000a000000000b000000000c *00000000000000000600000000050000000d000000000027000000000028000000000029000000 *00000e0000020000000d0000000e020000000d0000000e00020000000d000000000e0000000000 *0000000100000000020000002a00000000002b0000020000000000000001020000000000000001 *0000000000000000000700000000020000002c00000000000f0103010702100000007700000065 *000000620000005300000054000000200000006e000000610000006d0000006500000020000000 *610000007400000074000000720000007302240000002000000072000000650000006e00000064 *0000006500000072000000730000002000000061000000200000006e000000610000006d000000 *650000002000000074000000650000006d000000700000006c0000006100000074000000650000 *002000000077000000690000007400000068000000200000006100000074000000740000007200 *0000730000000a00010000000f010000000f00010000000f00000000000000000a000000000000 *0000000000000000000008000000000200000010010301020b000000430000006f0000006e0000 *007600000065000000720000007400000073000000200000006100000020010702070000004800 *0000530000005000000020000000580000004d0000004c01021a00000020000000740000006f00 *000020000000610000002000000048000000610000007000000070000000730000007400000061 *000000630000006b00000020000000520000006500000073000000700000006f0000006e000000 *73000000650000002e0000000a0102070000002000000053000000690000006e00000063000000 *65000000200107020700000048000000530000005000000020000000580000004d0000004c0102 *330000002000000069000000730000002000000074000000680000006500000020000000740000 *007900000070000000650000002000000072000000650000007400000075000000720000006e00 *00006500000064000000200000006200000079000000200000007500000073000000690000006e *00000067000000200000006c00000069000000740000006500000072000000610000006c000000 *2000000048000000540000004d0000004c0000002000000073000000790000006e000000740000 *0061000000780000000a0102310000002000000077000000690000007400000068000000200000 *004800000053000000500000002c00000020000000790000006f00000075000000200000006300 *0000610000006e0000002000000077000000720000006100000070000000200000007500000070 *00000020000000790000006f00000075000000720000002000000048000000540000004d000000 *4c0000002000000061000000730000002000000077000000650000006200000048000000530000 *0050000000200000002400000020010c0e00000068000000740000006d0000006c0000003e0000 *002e0000002e0000002e0000003c0000002f00000068000000740000006d0000006c0102010000 *000a021b00000020000000740000006f0000002000000075000000730000006500000020000000 *690000007400000020000000770000006900000074000000680000002000000048000000610000 *007000000070000000730000007400000061000000630000006b0000002e0000000a0000000011 *010302180000007700000065000000620000004800000053000000500000002000000077000000 *69000000740000006800000020000000580000004d0000004c0000004d00000065000000740000 *0061000000440000006100000074000000610000000a0002000000100000001102000000100000 *0011000200000010000000001100000000000000002d0000000b0000000c030000000d0000000b *0000000c010000000e0000000000000002030000000f0000000000000002010000000f00000000 *000000020000000010000000000000000200000000110000000000000003000000001200000000 *000000040000000012000000000000000503000000130000000000000005030000001400000000 *000000050100000014000000000000000500000000150000000000000005000000001600000000 *000000060300000017000000000000000600000000180000000000000007000000001900000000 *00000008000000001a0000000000000008000000001b0000000000000009000000001c00000000 *00000009000000001d0000000000000009000000001e0000000000000009000000001f00000000 *000000090000000020000000000000000900000000210000000000000009000000002200000000 *000000090000000023000000000000000900000000240000000000000009000000002500000000 *000000030100000026000000000000000300000000270000000000000003010000002800000000 *0000000300000000290000000000000004010000002a0000000000000004000000002b00000000 *00000004010000002c0000000000000004000000002d0000000000000005000000002e00000000 *00000005000000002f000000000000000500000000300000000000000006000000002e00000000 *00000006000000002f000000000000000600000000300000000000000001000000003100000000 *000000010000000032000000000000000700000000330000000000000034000000000000000f68 *617070737461636b2d302e352e30000000000000001948617070737461636b2e53746174652e43 *6c6f636b54696d6500000000000000144853502e476f6f676c652e416e616c7974696373000000 *00000000084853502e57656254000000000000000f4853502e5365727665725061727454000000 *000000000d4853502e4964656e7469747954000000000000000c4853502e4964656e7469747900 *0000000000002048617070737461636b2e5365727665722e48537472696e6754656d706c617465 *000000000000001948617070737461636b2e5365727665722e4853502e48544d4c000000000000 *000f50617468735f68617070737461636b000000000000001448617070737461636b2e53657276 *65722e48535800000000000000106f6c642d74696d652d312e302e302e33000000000000000b53 *797374656d2e54696d650000000000000009436c6f636b54696d650000000000000003544f4400 *0000000000000555414343540000000000000009616e616c7974696373000000000000000c6164 *64416e616c7974696373000000000000000c666c617474656e4344415441000000000000000649 *64656e745400000000000000094964656e7469747954000000000000000c72756e4964656e7469 *747954000000000000000d6576616c4964656e746974795400000000000000054964656e740000 *00000000000c6576616c4964656e74697479000000000000000577656253540000000000000006 *776562485350000000000000000777656248535027000000000000000776657273696f6e000000 *000000000662696e64697200000000000000066c69626469720000000000000007646174616469 *72000000000000000a6c696265786563646972000000000000000967657442696e446972000000 *00000000096765744c6962446972000000000000000a6765744461746144697200000000000000 *0d6765744c696265786563446972000000000000000f6765744461746146696c654e616d650000 *000000000006574368696c640000000000000008756e574368696c640000000000000005574174 *74720000000000000007756e57417474720000000000000006534368696c640000000000000008 *756e534368696c64000000000000000553417474720000000000000007756e5341747472000000 *0000000009737472697041747472000000000000000a73747269704368696c6400000000000000 *06696e73657274000000000000000c636f6e7374725b61686b795d000000000000000e64617461 *547970655b61686b785d00000000000000046c6f6727 addfile ./docs/0.5.0/happstack/haskell_icon.gif binary ./docs/0.5.0/happstack/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/happstack/index-frames.html hunk ./docs/0.5.0/happstack/index-frames.html 1 + + +happstack-0.5.0: The haskell application server stack + code generation

    HSP.Google.Analytics
    HSP.Identity
    HSP.IdentityT
    HSP.ServerPartT
    HSP.WebT
    Happstack.Server.HSP.HTML
    Happstack.Server.HSX
    Happstack.Server.HStringTemplate
    Happstack.State.ClockTime

    addfile ./docs/0.5.0/happstack/index.html hunk ./docs/0.5.0/happstack/index.html 1 + + +happstack-0.5.0: The haskell application server stack + code generation
     happstack-0.5.0: The haskell application server stack + code generationContentsIndex
    happstack-0.5.0: The haskell application server stack + code generation
    The haskell application server stack +
    Modules
    show/hideHSP
    show/hideGoogle
    HSP.Google.Analytics
    HSP.Identity
    HSP.IdentityT
    HSP.ServerPartT
    HSP.WebT
    show/hideHappstack
    show/hideServer
    show/hideHSP
    Happstack.Server.HSP.HTML
    Happstack.Server.HSX
    Happstack.Server.HStringTemplate
    show/hideState
    Happstack.State.ClockTime
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/happstack/mini_HSP-Google-Analytics.html hunk ./docs/0.5.0/happstack/mini_HSP-Google-Analytics.html 1 + + +HSP.Google.Analytics
    HSP.Google.Analytics
    addfile ./docs/0.5.0/happstack/mini_HSP-Identity.html hunk ./docs/0.5.0/happstack/mini_HSP-Identity.html 1 + + +HSP.Identity
    HSP.Identity
    addfile ./docs/0.5.0/happstack/mini_HSP-IdentityT.html hunk ./docs/0.5.0/happstack/mini_HSP-IdentityT.html 1 + + +HSP.IdentityT
    HSP.IdentityT
    type IdentT m
    data IdentityT m a
    addfile ./docs/0.5.0/happstack/mini_HSP-ServerPartT.html hunk ./docs/0.5.0/happstack/mini_HSP-ServerPartT.html 1 + + +HSP.ServerPartT
    HSP.ServerPartT
    addfile ./docs/0.5.0/happstack/mini_HSP-WebT.html hunk ./docs/0.5.0/happstack/mini_HSP-WebT.html 1 + + +HSP.WebT
    HSP.WebT
    addfile ./docs/0.5.0/happstack/mini_Happstack-Server-HSP-HTML.html hunk ./docs/0.5.0/happstack/mini_Happstack-Server-HSP-HTML.html 1 + + +Happstack.Server.HSP.HTML
    Happstack.Server.HSP.HTML
    addfile ./docs/0.5.0/happstack/mini_Happstack-Server-HSX.html hunk ./docs/0.5.0/happstack/mini_Happstack-Server-HSX.html 1 + + +Happstack.Server.HSX
    Happstack.Server.HSX
    addfile ./docs/0.5.0/happstack/mini_Happstack-Server-HStringTemplate.html hunk ./docs/0.5.0/happstack/mini_Happstack-Server-HStringTemplate.html 1 + + +Happstack.Server.HStringTemplate
    Happstack.Server.HStringTemplate
    addfile ./docs/0.5.0/happstack/mini_Happstack-State-ClockTime.html hunk ./docs/0.5.0/happstack/mini_Happstack-State-ClockTime.html 1 + + +Happstack.State.ClockTime
    Happstack.State.ClockTime
    data ClockTime
    addfile ./docs/0.5.0/happstack/minus.gif binary ./docs/0.5.0/happstack/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/happstack/plus.gif binary ./docs/0.5.0/happstack/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b adddir ./docs/0.5.0/happstack/src addfile ./docs/0.5.0/happstack/src/HSP-Google-Analytics.html hunk ./docs/0.5.0/happstack/src/HSP-Google-Analytics.html 1 + + + + +src/HSP/Google/Analytics.hs + + + +
    {-# OPTIONS_GHC -fglasgow-exts -F -pgmFtrhsx #-}
    +module HSP.Google.Analytics 
    +    ( UACCT(..)
    +    , analytics
    +    , addAnalytics
    +    ) where
    +
    +import Data.Generics (Data, Typeable)
    +import HSP
    +import Prelude hiding (head)
    +
    +newtype UACCT = UACCT String -- ^ The UACCT provided to you by Google
    +    deriving (Read, Show, Eq, Ord, Typeable, Data)
    +
    +-- |create the google analytics script tags
    +-- NOTE: you must put the <% analytics yourUACCT %> immediately before the </body> tag
    +-- See also: addAnalytics
    +analytics :: (XMLGenerator m) => UACCT -> GenXMLList m
    +analytics (UACCT uacct) =
    +    do a <- <script type="text/javascript">
    +              var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    +              document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
    +            </script>
    +       b <- <script type="text/javascript">
    +              var pageTracker = _gat._getTracker("<% uacct %>");
    +              pageTracker._initData();
    +              pageTracker._trackPageview();
    +            </script>
    +       return [a,b]
    +
    +-- |automatically add the google analytics scipt tags immediately before the </body> element
    +-- NOTE: this function is not idepotent
    +addAnalytics :: ( AppendChild m XML
    +                , EmbedAsChild m XML
    +                , EmbedAsAttr m Attribute
    +                , XMLGenerator m) 
    +             => UACCT 
    +             -> XMLGenT m XML 
    +             -> GenXML m
    +addAnalytics uacct pg =
    +    do page <- pg
    +       a <- analytics uacct
    +       case page of
    +         <html hattrs><[ head, body ]></html> ->
    +             <html hattrs>
    +                <% head %>
    +                <% body <: a %>
    +             </html>
    +         o -> error ("Failed to add analytics." ++ show o)
    +
    +{- Example Analytics Code from Google:
    +
    +<script type="text/javascript">
    +var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
    +document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
    +</script>
    +<script type="text/javascript">
    +var pageTracker = _gat._getTracker("UA-4353757-1");
    +pageTracker._initData();
    +pageTracker._trackPageview();
    +</script>
    +-}
    +
    + addfile ./docs/0.5.0/happstack/src/HSP-Identity.html hunk ./docs/0.5.0/happstack/src/HSP-Identity.html 1 + + + + +src/HSP/Identity.hs + + + +
    {-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances, TypeFamilies #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +module HSP.Identity 
    +    ( Ident
    +    , evalIdentity
    +    ) where
    +
    +import qualified Data.Text as T
    +import qualified Data.Text.Lazy as TL
    +import HSP
    +import Control.Monad.Identity (Identity(Identity, runIdentity))
    +import qualified HSX.XMLGenerator as HSX
    +
    +instance HSX.XMLGenerator Identity
    +
    +instance HSX.XMLGen Identity where
    +    type HSX.XML Identity = XML
    +    newtype HSX.Child Identity = IChild { unIChild :: XML }
    +    newtype HSX.Attribute Identity = IAttr { unIAttr :: Attribute }
    +    genElement n attrs children = HSX.XMLGenT $ Identity (Element
    +                                                          (toName n)
    +                                                          (map unIAttr $ concatMap runIdentity $ map HSX.unXMLGenT attrs)
    +                                                          (map unIChild $ concatMap runIdentity $ map HSX.unXMLGenT children)
    +                                                         )
    +    xmlToChild = IChild
    +    pcdataToChild = HSX.xmlToChild . pcdata
    +
    +instance IsAttrValue Identity T.Text where
    +    toAttrValue = toAttrValue . T.unpack
    +
    +instance IsAttrValue Identity TL.Text where
    +    toAttrValue = toAttrValue . TL.unpack
    +
    +instance EmbedAsAttr Identity Attribute where
    +    asAttr = return . (:[]) . IAttr 
    +
    +instance EmbedAsAttr Identity (Attr String Char) where
    +    asAttr (n := c)  = asAttr (n := [c])
    +
    +instance EmbedAsAttr Identity (Attr String String) where
    +    asAttr (n := str)  = asAttr $ MkAttr (toName n, pAttrVal str)
    +
    +instance EmbedAsAttr Identity (Attr String Bool) where
    +    asAttr (n := True)  = asAttr $ MkAttr (toName n, pAttrVal "true")
    +    asAttr (n := False) = asAttr $ MkAttr (toName n, pAttrVal "false")
    +
    +instance EmbedAsAttr Identity (Attr String Int) where
    +    asAttr (n := i)  = asAttr $ MkAttr (toName n, pAttrVal (show i))
    +
    +instance (IsName n) => (EmbedAsAttr Identity (Attr n TL.Text)) where
    +    asAttr (n := a) = asAttr $ MkAttr (toName n, pAttrVal $ TL.unpack a)
    +
    +instance (IsName n) => (EmbedAsAttr Identity (Attr n T.Text)) where
    +    asAttr (n := a) = asAttr $ MkAttr (toName n, pAttrVal $ T.unpack a)
    +
    +instance EmbedAsChild Identity Char where
    +    asChild = XMLGenT . Identity . (:[]) . IChild . pcdata . (:[])
    +
    +instance EmbedAsChild Identity String where
    +    asChild = XMLGenT . Identity . (:[]) . IChild . pcdata
    +
    +instance (EmbedAsChild Identity TL.Text) where
    +    asChild = asChild . TL.unpack
    +
    +instance (EmbedAsChild Identity T.Text) where
    +    asChild = asChild . T.unpack
    +
    +instance EmbedAsChild Identity XML where
    +    asChild = XMLGenT . Identity . (:[]) . IChild
    +
    +instance EmbedAsChild Identity () where
    +  asChild () = return []
    +
    +instance AppendChild Identity XML where
    + appAll xml children = do
    +        chs <- children
    +        case xml of
    +         CDATA _ _       -> return xml
    +         Element n as cs -> return $ Element n as (cs ++ (map stripChild chs))
    +
    +stripAttr :: HSX.Attribute Identity -> Attribute
    +stripAttr  (IAttr a) = a
    +
    +stripChild :: HSX.Child Identity -> XML
    +stripChild (IChild c) = c
    +
    +instance SetAttr Identity XML where
    + setAll xml hats = do
    +        attrs <- hats
    +        case xml of
    +         CDATA _ _       -> return xml
    +         Element n as cs -> return $ Element n (foldr insert as (map stripAttr attrs)) cs
    +
    +insert :: Attribute -> Attributes -> Attributes
    +insert = (:)
    +
    +evalIdentity :: XMLGenT Identity XML -> XML
    +evalIdentity = runIdentity . HSX.unXMLGenT
    +
    +type Ident = XMLGenT Identity
    +
    + addfile ./docs/0.5.0/happstack/src/HSP-IdentityT.html hunk ./docs/0.5.0/happstack/src/HSP-IdentityT.html 1 + + + + +src/HSP/IdentityT.hs + + + +
    {-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances, TypeFamilies, GeneralizedNewtypeDeriving #-}
    +{-# OPTIONS_GHC -fno-warn-orphans -F -pgmF trhsx #-}
    +module HSP.IdentityT 
    +    ( evalIdentityT
    +    , IdentT
    +    , IdentityT(..)
    +    ) where
    +
    +import Control.Applicative  (Applicative((<*>), pure))
    +import Control.Monad        (MonadPlus)
    +import Control.Monad.Writer (MonadWriter)
    +import Control.Monad.Reader (MonadReader)
    +import Control.Monad.State  (MonadState)
    +import Control.Monad.RWS    (MonadRWS)
    +import Control.Monad.Trans  (MonadTrans(lift), MonadIO(liftIO))
    +import qualified Data.Text as T
    +import qualified Data.Text.Lazy as TL
    +import HSP
    +import qualified HSX.XMLGenerator as HSX
    +
    +-- * IdentityT Monad Transformer
    +
    +newtype IdentityT m a = IdentityT { runIdentityT :: m a }
    +    deriving (Functor, Monad, MonadWriter w, MonadReader r, MonadState s, MonadRWS r w s, MonadIO, MonadPlus)
    +
    +instance (Applicative f) => Applicative (IdentityT f) where
    +    pure  = IdentityT . pure     
    +    (IdentityT f) <*> (IdentityT a) = IdentityT (f <*> a)
    +
    +instance MonadTrans IdentityT where
    +    lift = IdentityT
    +
    +-- * HSX.XMLGenerator for IdentityT
    +
    +instance (Monad m, Functor m) => HSX.XMLGenerator (IdentityT m)
    +
    +instance (Functor m, Monad m) => HSX.XMLGen (IdentityT m) where
    +    type HSX.XML (IdentityT m) = XML
    +    newtype HSX.Child (IdentityT m) = IChild { unIChild :: XML }
    +    newtype HSX.Attribute (IdentityT m) = IAttr { unIAttr :: Attribute }
    +    genElement n attrs children = HSX.XMLGenT $ 
    +                                  do attrs'    <- HSX.unXMLGenT (fmap (map unIAttr . concat) (sequence attrs))
    +                                     children' <- HSX.unXMLGenT (fmap (map unIChild . concat) (sequence children))
    +                                     return (Element (toName n) attrs' children')
    +    xmlToChild = IChild
    +    pcdataToChild = HSX.xmlToChild . pcdata
    +
    +instance (Monad m, Functor m) => IsAttrValue (IdentityT m) T.Text where
    +    toAttrValue = toAttrValue . T.unpack
    +
    +instance (Monad m, Functor m) => IsAttrValue (IdentityT m) TL.Text where
    +    toAttrValue = toAttrValue . TL.unpack
    +
    +instance (Monad m, Functor m) => HSX.EmbedAsAttr (IdentityT m) Attribute where
    +    asAttr = return . (:[]) . IAttr 
    +
    +instance (Monad m, Functor m) => HSX.EmbedAsAttr (IdentityT m) (Attr String Char) where
    +    asAttr (n := c)  = asAttr (n := [c])
    +
    +instance (Monad m, Functor m) => HSX.EmbedAsAttr (IdentityT m) (Attr String String) where
    +    asAttr (n := str)  = asAttr $ MkAttr (toName n, pAttrVal str)
    +
    +instance (Monad m, Functor m) => HSX.EmbedAsAttr (IdentityT m) (Attr String Bool) where
    +    asAttr (n := True)  = asAttr $ MkAttr (toName n, pAttrVal "true")
    +    asAttr (n := False) = asAttr $ MkAttr (toName n, pAttrVal "false")
    +
    +instance (Monad m, Functor m) => HSX.EmbedAsAttr (IdentityT m) (Attr String Int) where
    +    asAttr (n := i)  = asAttr $ MkAttr (toName n, pAttrVal (show i))
    +
    +instance (Monad m, Functor m, IsName n) => (EmbedAsAttr (IdentityT m) (Attr n TL.Text)) where
    +    asAttr (n := a) = asAttr $ MkAttr (toName n, pAttrVal $ TL.unpack a)
    +
    +instance (Monad m, Functor m, IsName n) => (EmbedAsAttr (IdentityT m) (Attr n T.Text)) where
    +    asAttr (n := a) = asAttr $ MkAttr (toName n, pAttrVal $ T.unpack a)
    +
    +instance (Monad m, Functor m) => EmbedAsChild (IdentityT m) Char where
    +    asChild = XMLGenT . return . (:[]) . IChild . pcdata . (:[])
    +
    +instance (Monad m, Functor m) => EmbedAsChild (IdentityT m) String where
    +    asChild = XMLGenT . return . (:[]) . IChild . pcdata
    +
    +instance (Monad m, Functor m) => EmbedAsChild (IdentityT m) (IdentityT m String) where
    +    asChild c = 
    +        do c' <- lift c
    +           lift . return . (:[]) . IChild . pcdata $ c'
    +
    +instance (Monad m, Functor m) => (EmbedAsChild (IdentityT m) TL.Text) where
    +    asChild = asChild . TL.unpack
    +
    +instance (Monad m, Functor m) => (EmbedAsChild (IdentityT m) T.Text) where
    +    asChild = asChild . T.unpack
    +
    +instance (Monad m, Functor m) => EmbedAsChild (IdentityT m) XML where
    +    asChild = XMLGenT . return . (:[]) . IChild
    +
    +instance (Monad m, Functor m) => EmbedAsChild (IdentityT m) () where
    +  asChild () = return []
    +
    +instance (Monad m, Functor m) => AppendChild (IdentityT m) XML where
    + appAll xml children = do
    +        chs <- children
    +        case xml of
    +         CDATA _ _       -> return xml
    +         Element n as cs -> return $ Element n as (cs ++ (map stripChild chs))
    +
    +stripAttr :: (Monad m, Functor m) => HSX.Attribute (IdentityT m) -> Attribute
    +stripAttr  (IAttr a) = a
    +
    +stripChild :: (Monad m, Functor m) => HSX.Child (IdentityT m) -> XML
    +stripChild (IChild c) = c
    +
    +instance (Monad m, Functor m) => SetAttr (IdentityT m) XML where
    + setAll xml hats = do
    +        attrs <- hats
    +        case xml of
    +         CDATA _ _       -> return xml
    +         Element n as cs -> return $ Element n (foldr insert as (map stripAttr attrs)) cs
    +
    +insert :: Attribute -> Attributes -> Attributes
    +insert = (:)
    +
    +evalIdentityT :: (Functor m, Monad m) => XMLGenT (IdentityT m) XML -> m XML
    +evalIdentityT = runIdentityT . HSX.unXMLGenT
    +
    +type IdentT m = XMLGenT (IdentityT m) XML
    +
    + addfile ./docs/0.5.0/happstack/src/HSP-ServerPartT.html hunk ./docs/0.5.0/happstack/src/HSP-ServerPartT.html 1 + + + + +src/HSP/ServerPartT.hs + + + +
    {-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances, TypeFamilies #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +module HSP.ServerPartT where
    +
    +import HSP
    +import Control.Applicative ((<$>))
    +import qualified Data.Text as T
    +import qualified Data.Text.Lazy as TL
    +import qualified HSX.XMLGenerator as HSX
    +import Happstack.Server (ServerPartT)
    +
    +instance (Monad m) => HSX.XMLGen (ServerPartT m) where
    +    type HSX.XML (ServerPartT m) = XML
    +    newtype HSX.Child (ServerPartT m) = SChild { unSChild :: XML }
    +    newtype HSX.Attribute (ServerPartT m) = SAttr { unSAttr :: Attribute }
    +    genElement n attrs children = 
    +        do attribs <- map unSAttr <$> asAttr attrs
    +           childer <- flattenCDATA . map unSChild <$> asChild children
    +           HSX.XMLGenT $ return (Element
    +                              (toName n)
    +                              attribs
    +                              childer
    +                             )
    +    xmlToChild = SChild
    +    pcdataToChild = HSX.xmlToChild . pcdata
    +
    +flattenCDATA :: [XML] -> [XML]
    +flattenCDATA cxml = 
    +                case flP cxml [] of
    +                 [] -> []
    +                 [CDATA _ ""] -> []
    +                 xs -> xs                       
    +    where
    +        flP :: [XML] -> [XML] -> [XML]
    +        flP [] bs = reverse bs
    +        flP [x] bs = reverse (x:bs)
    +        flP (x:y:xs) bs = case (x,y) of
    +                           (CDATA e1 s1, CDATA e2 s2) | e1 == e2 -> flP (CDATA e1 (s1++s2) : xs) bs
    +                           _ -> flP (y:xs) (x:bs)
    +
    +
    +instance (Monad m, Functor m) => IsAttrValue (ServerPartT m) T.Text where
    +    toAttrValue = toAttrValue . T.unpack
    +
    +instance (Monad m, Functor m) => IsAttrValue (ServerPartT m) TL.Text where
    +    toAttrValue = toAttrValue . TL.unpack
    +
    +instance (Monad m) => HSX.EmbedAsAttr (ServerPartT m) Attribute where
    +    asAttr = return . (:[]) . SAttr 
    +
    +instance (Monad m) => HSX.EmbedAsAttr (ServerPartT m) (Attr String Char) where
    +    asAttr (n := c)  = asAttr (n := [c])
    +
    +instance (Monad m) => HSX.EmbedAsAttr (ServerPartT m) (Attr String String) where
    +    asAttr (n := str)  = asAttr $ MkAttr (toName n, pAttrVal str)
    +
    +instance (Monad m) => HSX.EmbedAsAttr (ServerPartT m) (Attr String Bool) where
    +    asAttr (n := True)  = asAttr $ MkAttr (toName n, pAttrVal "true")
    +    asAttr (n := False) = asAttr $ MkAttr (toName n, pAttrVal "false")
    +
    +instance (Monad m) => HSX.EmbedAsAttr (ServerPartT m) (Attr String Int) where
    +    asAttr (n := i)  = asAttr $ MkAttr (toName n, pAttrVal (show i))
    +
    +instance (Monad m, Functor m, IsName n) => (EmbedAsAttr (ServerPartT m) (Attr n TL.Text)) where
    +    asAttr (n := a) = asAttr $ MkAttr (toName n, pAttrVal $ TL.unpack a)
    +
    +instance (Monad m, Functor m, IsName n) => (EmbedAsAttr (ServerPartT m) (Attr n T.Text)) where
    +    asAttr (n := a) = asAttr $ MkAttr (toName n, pAttrVal $ T.unpack a)
    +
    +instance (Monad m) => EmbedAsChild (ServerPartT m) Char where
    +    asChild = XMLGenT . return . (:[]) . SChild . pcdata . (:[])
    +
    +instance (Monad m) => EmbedAsChild (ServerPartT m) String where
    +    asChild = XMLGenT . return . (:[]) . SChild . pcdata
    +
    +instance (Monad m) => EmbedAsChild (ServerPartT m) XML where
    +    asChild = XMLGenT . return . (:[]) . SChild
    +
    +instance Monad m => EmbedAsChild (ServerPartT m) () where
    +  asChild () = return []
    +
    +instance (Monad m, Functor m) => (EmbedAsChild (ServerPartT m) TL.Text) where
    +    asChild = asChild . TL.unpack
    +
    +instance (Monad m, Functor m) => (EmbedAsChild (ServerPartT m) T.Text) where
    +    asChild = asChild . T.unpack
    +
    +instance (Monad m) => AppendChild (ServerPartT m) XML where
    + appAll xml children = do
    +        chs <- children
    +        case xml of
    +         CDATA _ _       -> return xml
    +         Element n as cs -> return $ Element n as (cs ++ (map unSChild chs))
    +
    +instance (Monad m) => SetAttr (ServerPartT m) XML where
    + setAll xml hats = do
    +        attrs <- hats
    +        case xml of
    +         CDATA _ _       -> return xml
    +         Element n as cs -> return $ Element n (foldr (:) as (map unSAttr attrs)) cs
    +
    +instance (Monad m) => XMLGenerator (ServerPartT m)
    +
    + addfile ./docs/0.5.0/happstack/src/HSP-WebT.html hunk ./docs/0.5.0/happstack/src/HSP-WebT.html 1 + + + + +src/HSP/WebT.hs + + + +
    {-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances, FlexibleInstances, TypeFamilies #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +module HSP.WebT where
    +
    +import HSP
    +import Control.Applicative ((<$>))
    +import qualified Data.Text as T
    +import qualified Data.Text.Lazy as TL
    +import qualified HSX.XMLGenerator as HSX
    +import Happstack.Server (WebT)
    +
    +instance (Monad m) => HSX.XMLGen (WebT m) where
    +    type HSX.XML (WebT m) = XML
    +    newtype HSX.Child (WebT m) = WChild { unWChild :: XML }
    +    newtype HSX.Attribute (WebT m) = WAttr { unWAttr :: Attribute }
    +    genElement n attrs children = 
    +        do attribs <- map unWAttr <$> asAttr attrs
    +           childer <- flattenCDATA . map unWChild <$> asChild children
    +           HSX.XMLGenT $ return (Element
    +                              (toName n)
    +                              attribs
    +                              childer
    +                             )
    +    xmlToChild = WChild
    +    pcdataToChild = HSX.xmlToChild . pcdata
    +
    +flattenCDATA :: [XML] -> [XML]
    +flattenCDATA cxml = 
    +                case flP cxml [] of
    +                 [] -> []
    +                 [CDATA _ ""] -> []
    +                 xs -> xs                       
    +    where
    +        flP :: [XML] -> [XML] -> [XML]
    +        flP [] bs = reverse bs
    +        flP [x] bs = reverse (x:bs)
    +        flP (x:y:xs) bs = case (x,y) of
    +                           (CDATA e1 s1, CDATA e2 s2) | e1 == e2 -> flP (CDATA e1 (s1++s2) : xs) bs
    +                           _ -> flP (y:xs) (x:bs)
    +
    +
    +instance (Monad m, Functor m) => IsAttrValue (WebT m) T.Text where
    +    toAttrValue = toAttrValue . T.unpack
    +
    +instance (Monad m, Functor m) => IsAttrValue (WebT m) TL.Text where
    +    toAttrValue = toAttrValue . TL.unpack
    +
    +instance (Monad m) => HSX.EmbedAsAttr (WebT m) Attribute where
    +    asAttr = return . (:[]) . WAttr 
    +
    +instance (Monad m) => HSX.EmbedAsAttr (WebT m) (Attr String Char) where
    +    asAttr (n := c)  = asAttr (n := [c])
    +
    +instance (Monad m) => HSX.EmbedAsAttr (WebT m) (Attr String String) where
    +    asAttr (n := str)  = asAttr $ MkAttr (toName n, pAttrVal str)
    +
    +instance (Monad m) => HSX.EmbedAsAttr (WebT m) (Attr String Bool) where
    +    asAttr (n := True)  = asAttr $ MkAttr (toName n, pAttrVal "true")
    +    asAttr (n := False) = asAttr $ MkAttr (toName n, pAttrVal "false")
    +
    +instance (Monad m) => HSX.EmbedAsAttr (WebT m) (Attr String Int) where
    +    asAttr (n := i)  = asAttr $ MkAttr (toName n, pAttrVal (show i))
    +
    +instance (Monad m, Functor m, IsName n) => (EmbedAsAttr (WebT m) (Attr n TL.Text)) where
    +    asAttr (n := a) = asAttr $ MkAttr (toName n, pAttrVal $ TL.unpack a)
    +
    +instance (Monad m, Functor m, IsName n) => (EmbedAsAttr (WebT m) (Attr n T.Text)) where
    +    asAttr (n := a) = asAttr $ MkAttr (toName n, pAttrVal $ T.unpack a)
    +
    +instance (Monad m) => EmbedAsChild (WebT m) Char where
    +    asChild = XMLGenT . return . (:[]) . WChild . pcdata . (:[])
    +
    +instance (Monad m) => EmbedAsChild (WebT m) String where
    +    asChild = XMLGenT . return . (:[]) . WChild . pcdata
    +
    +instance (Monad m, Functor m) => (EmbedAsChild (WebT m) TL.Text) where
    +    asChild = asChild . TL.unpack
    +
    +instance (Monad m, Functor m) => (EmbedAsChild (WebT m) T.Text) where
    +    asChild = asChild . T.unpack
    +
    +instance (Monad m) => EmbedAsChild (WebT m) XML where
    +    asChild = XMLGenT . return . (:[]) . WChild
    +
    +instance Monad m => EmbedAsChild (WebT m) () where
    +  asChild () = return []
    +
    +instance (Monad m) => AppendChild (WebT m) XML where
    + appAll xml children = do
    +        chs <- children
    +        case xml of
    +         CDATA _ _       -> return xml
    +         Element n as cs -> return $ Element n as (cs ++ (map unWChild chs))
    +
    +instance (Monad m) => SetAttr (WebT m) XML where
    + setAll xml hats = do
    +        attrs <- hats
    +        case xml of
    +         CDATA _ _       -> return xml
    +         Element n as cs -> return $ Element n (foldr (:) as (map unWAttr attrs)) cs
    +
    +instance (Monad m) => XMLGenerator (WebT m)
    +
    + addfile ./docs/0.5.0/happstack/src/Happstack-Server-HSP-HTML.html hunk ./docs/0.5.0/happstack/src/Happstack-Server-HSP-HTML.html 1 + + + + +src/Happstack/Server/HSP/HTML.hs + + + +
    {-# LANGUAGE FlexibleInstances, FlexibleContexts #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +module Happstack.Server.HSP.HTML
    +  ( webHSP
    +  , webHSP'
    +  ) where
    +
    +import Control.Monad.Trans (MonadIO(), liftIO)
    +import qualified Data.ByteString.Char8 as P
    +import qualified Data.ByteString.Lazy.UTF8 as L
    +import Control.Monad (liftM)
    +import Happstack.Server
    +  ( ToMessage(toMessage, toContentType, toResponse)
    +  , Response()
    +  )
    +import HSP
    +  ( HSP()
    +  , XML()
    +  , XMLMetaData(XMLMetaData, contentType)
    +  , evalHSP
    +  , html4Strict
    +  , renderAsHTML
    +  )
    +
    +instance ToMessage XML where
    +    toContentType _ = P.pack "text/html;charset=utf-8"
    +    toMessage xml   = toMessage (html4Strict, xml)
    +
    +instance ToMessage (Maybe XMLMetaData, XML) where
    +    toContentType (Just md,_) = P.pack (contentType md)
    +    toContentType _ = P.pack "text/html;charset=utf-8"
    +    toMessage (Just (XMLMetaData (showDt, dt) _ pr), xml) = 
    +        L.fromString ((if showDt then (dt ++) else id) (pr xml))
    +    toMessage (Nothing, xml) =
    +        L.fromString (renderAsHTML xml)
    +
    +-- | Converts a @HSP XML@ to a Happstack Response.
    +-- Since @HSP XML@ is the type returned by using literal HTML syntax
    +-- with HSP, you can wrap up your HTML as webHSP $ <html>...</html>
    +-- to use it with Happstack.
    +webHSP :: (MonadIO m) => HSP XML -> m Response
    +webHSP = webHSP' Nothing
    +
    +-- | webHSP with XMLMetaData
    +webHSP' :: (MonadIO m) => Maybe XMLMetaData -> HSP XML -> m Response
    +webHSP' metadata hsp = toResponse `liftM` liftIO (evalHSP metadata hsp)
    +
    + addfile ./docs/0.5.0/happstack/src/Happstack-Server-HSX.html hunk ./docs/0.5.0/happstack/src/Happstack-Server-HSX.html 1 + + + + +src/Happstack/Server/HSX.hs + + + +
    {-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +module Happstack.Server.HSX where
    +
    +import Happstack.Server.SimpleHTTP (ServerMonad(..), FilterMonad(..), WebMonad(..))
    +import HSX.XMLGenerator (XMLGenT(..))
    +
    +instance (ServerMonad m) => ServerMonad (XMLGenT m) where
    +    askRq = XMLGenT askRq
    +    localRq f (XMLGenT m) = XMLGenT (localRq f m)
    +
    +instance (FilterMonad a m) => FilterMonad a (XMLGenT m) where
    +    setFilter = XMLGenT . setFilter
    +    composeFilter f = XMLGenT (composeFilter f)
    +    getFilter (XMLGenT m) = XMLGenT (getFilter m)
    +
    +instance (WebMonad a m) => WebMonad a (XMLGenT m) where
    +    finishWith r = XMLGenT $ finishWith r
    +
    + addfile ./docs/0.5.0/happstack/src/Happstack-Server-HStringTemplate.html hunk ./docs/0.5.0/happstack/src/Happstack-Server-HStringTemplate.html 1 + + + + +src/Happstack/Server/HStringTemplate.hs + + + +
    {-# LANGUAGE ScopedTypeVariables, FlexibleInstances, PatternSignatures #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +module Happstack.Server.HStringTemplate (webST) where
    +
    +import Happstack.Server
    +  ( ToMessage(toMessage, toContentType, toResponse)
    +  , Response
    +  )
    +import Control.Monad.Trans (MonadIO, liftIO)
    +import Text.StringTemplate
    +  ( STGroup
    +  , StringTemplate
    +  , directoryGroupLazy
    +  , getStringTemplate
    +  , render
    +  , setManyAttrib
    +  )
    +import qualified Data.ByteString.Char8 as B (pack)
    +import qualified Data.ByteString.Lazy.Char8 as L (pack)
    +import System.Log.Logger (Priority(..), logM)
    +log' :: Priority -> String -> IO ()
    +log' = logM "Happstack.Server.HStringTemplate"
    +
    +-- FIXME: Caveat, assumes text/html, can this be handled at the filter level?
    +instance ToMessage (StringTemplate String) where
    +    toContentType _ = B.pack "text/plain;charset=utf-8"
    +    toMessage = L.pack . render
    +
    +-- | @webST name attrs@ renders a name template with attrs
    +webST :: (MonadIO m) => String -> [(String, String)] -> m Response
    +webST name attrs = do
    +  grp :: STGroup String <- liftIO $ directoryGroupLazy "templates"
    +  case getStringTemplate name grp of
    +    Just tmp -> do
    +      -- FIXME: I would rather use show, but StringTemplate String has no Show instance
    +      liftIO $ log' INFO ("webST executing: " ++ name)
    +      return . toResponse $ setManyAttrib attrs tmp
    +    Nothing  -> fail $ "Template does not exist: " ++ name
    +
    +
    + addfile ./docs/0.5.0/happstack/src/Happstack-State-ClockTime.html hunk ./docs/0.5.0/happstack/src/Happstack-State-ClockTime.html 1 + + + + +src/Happstack/State/ClockTime.hs + + + +
    {-# LANGUAGE TemplateHaskell, TypeFamilies, DeriveDataTypeable,
    +    FlexibleInstances, MultiParamTypeClasses, FlexibleContexts,
    +    UndecidableInstances, StandaloneDeriving, TypeSynonymInstances
    +    #-}
    +{-# OPTIONS_GHC -fno-warn-orphans #-}
    +-- |instances of Typeable, Data, Serialize, Version, and Default for ClockTime
    +module Happstack.State.ClockTime (ClockTime(..)) where
    +
    +import Data.Generics (Data, Typeable)
    +import Happstack.Data (deriveNewData)
    +import Happstack.State (Version, deriveSerialize)
    +import System.Time (ClockTime(..))
    +
    +deriving instance Typeable ClockTime
    +deriving instance Data ClockTime
    +instance Version ClockTime
    +$(deriveSerialize ''ClockTime)
    +$(deriveNewData [''ClockTime])
    +
    + addfile ./docs/0.5.0/happstack/src/Paths_happstack.html hunk ./docs/0.5.0/happstack/src/Paths_happstack.html 1 + + + + +dist/build/autogen/Paths_happstack.hs + + + +
    module Paths_happstack (
    +    version,
    +    getBinDir, getLibDir, getDataDir, getLibexecDir,
    +    getDataFileName
    +  ) where
    +
    +import Data.Version (Version(..))
    +import System.Environment (getEnv)
    +
    +version :: Version
    +version = Version {versionBranch = [0,5,0], versionTags = []}
    +
    +bindir, libdir, datadir, libexecdir :: FilePath
    +
    +bindir     = "/home/stepcut/.cabal/bin"
    +libdir     = "/home/stepcut/.cabal/lib/happstack-0.5.0/ghc-6.13"
    +datadir    = "/home/stepcut/.cabal/share/happstack-0.5.0"
    +libexecdir = "/home/stepcut/.cabal/libexec"
    +
    +getBinDir, getLibDir, getDataDir, getLibexecDir :: IO FilePath
    +getBinDir = catch (getEnv "happstack_bindir") (\_ -> return bindir)
    +getLibDir = catch (getEnv "happstack_libdir") (\_ -> return libdir)
    +getDataDir = catch (getEnv "happstack_datadir") (\_ -> return datadir)
    +getLibexecDir = catch (getEnv "happstack_libexecdir") (\_ -> return libexecdir)
    +
    +getDataFileName :: FilePath -> IO FilePath
    +getDataFileName name = do
    +  dir <- getDataDir
    +  return (dir ++ "/" ++ name)
    +
    + addfile ./docs/0.5.0/happstack/src/hscolour.css hunk ./docs/0.5.0/happstack/src/hscolour.css 1 +.hs-keyglyph, .hs-layout {color: red;} +.hs-keyword {color: blue;} +.hs-comment, .hs-comment a {color: green;} +.hs-str, .hs-chr {color: teal;} +.hs-keyword, .hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {} addfile ./docs/0.5.0/haskell_icon.gif binary ./docs/0.5.0/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/index-frames.html hunk ./docs/0.5.0/index-frames.html 1 + + +Happstack

    HSP.Google.Analytics
    HSP.Identity
    HSP.IdentityT
    HSP.ServerPartT
    HSP.WebT
    Happstack.Crypto.Base64
    Happstack.Crypto.DES
    Happstack.Crypto.HMAC
    Happstack.Crypto.MD5
    Happstack.Crypto.SHA1
    Happstack.Crypto.W64
    Happstack.Data
    Happstack.Data.Default
    Happstack.Data.Default.Generic
    Happstack.Data.DeriveAll
    Happstack.Data.GOps
    Happstack.Data.IxSet
    Happstack.Data.IxSet.Ix
    Happstack.Data.Migrate
    Happstack.Data.Normalize
    Happstack.Data.Pairs
    Happstack.Data.Proxy
    Happstack.Data.Serialize
    Happstack.Data.SerializeTH
    Happstack.Data.Xml
    Happstack.Data.Xml.HaXml
    Happstack.Server
    Happstack.Server.Cookie
    Happstack.Server.HSP.HTML
    Happstack.Server.HSX
    Happstack.Server.HStringTemplate
    Happstack.Server.HTTP.Client
    Happstack.Server.HTTP.FileServe
    Happstack.Server.HTTP.LowLevel
    Happstack.Server.HTTP.Types
    Happstack.Server.MessageWrap
    Happstack.Server.MinHaXML
    Happstack.Server.Parts
    Happstack.Server.SURI
    Happstack.Server.SimpleHTTP
    Happstack.Server.StdConfig
    Happstack.Server.XSLT
    Happstack.State
    Happstack.State.ClockTime
    Happstack.State.ComponentSystem
    Happstack.State.ComponentTH
    Happstack.State.Control
    Happstack.State.Saver
    Happstack.State.Transaction
    Happstack.Util.AutoBuild
    Happstack.Util.ByteStringCompat
    Happstack.Util.Common
    Happstack.Util.Concurrent
    Happstack.Util.Cron
    Happstack.Util.Daemonize
    Happstack.Util.FileManip
    Happstack.Util.HostAddress
    Happstack.Util.LogFormat
    Happstack.Util.Mail
    Happstack.Util.OpenExclusively
    Happstack.Util.TH
    Happstack.Util.TimeOut
    Network.Socket.SendFile
    Text.StringTemplate
    Text.StringTemplate.Base
    Text.StringTemplate.Classes
    Text.StringTemplate.GenericStandard
    Text.StringTemplate.GenericWithClass
    Text.StringTemplate.QQ

    addfile ./docs/0.5.0/index.html hunk ./docs/0.5.0/index.html 1 + + +Happstack
     HappstackContentsIndex
    Happstack
    Happstack documentation. +
    Modules
    show/hideHSP
    show/hideGoogle
    HSP.Google.Analyticshappstack-0.5.0
    HSP.Identityhappstack-0.5.0
    HSP.IdentityThappstack-0.5.0
    HSP.ServerPartThappstack-0.5.0
    HSP.WebThappstack-0.5.0
    show/hideHappstack
    show/hideCrypto
    Happstack.Crypto.Base64happstack-util-0.5.0
    Happstack.Crypto.DEShappstack-util-0.5.0
    Happstack.Crypto.HMAChappstack-util-0.5.0
    Happstack.Crypto.MD5happstack-util-0.5.0
    Happstack.Crypto.SHA1happstack-util-0.5.0
    Happstack.Crypto.W64happstack-util-0.5.0
    show/hideHappstack.Datahappstack-data-0.5.0
    show/hideHappstack.Data.Defaulthappstack-data-0.5.0
    Happstack.Data.Default.Generichappstack-data-0.5.0
    Happstack.Data.DeriveAllhappstack-data-0.5.0
    Happstack.Data.GOpshappstack-data-0.5.0
    show/hideHappstack.Data.IxSetAn efficient implementation of queryable sets. +happstack-ixset-0.5.0
    Happstack.Data.IxSet.Ixhappstack-ixset-0.5.0
    Happstack.Data.Migratehappstack-data-0.5.0
    Happstack.Data.Normalizehappstack-data-0.5.0
    Happstack.Data.Pairshappstack-data-0.5.0
    Happstack.Data.Proxyhappstack-data-0.5.0
    Happstack.Data.Serializehappstack-data-0.5.0
    Happstack.Data.SerializeTHhappstack-data-0.5.0
    show/hideHappstack.Data.Xmlhappstack-data-0.5.0
    Happstack.Data.Xml.HaXmlhappstack-data-0.5.0
    show/hideHappstack.Serverhappstack-server-0.5.0
    Happstack.Server.Cookiehappstack-server-0.5.0
    show/hideHSP
    Happstack.Server.HSP.HTMLhappstack-0.5.0
    Happstack.Server.HSXhappstack-0.5.0
    Happstack.Server.HStringTemplatehappstack-0.5.0
    show/hideHTTP
    Happstack.Server.HTTP.Clienthappstack-server-0.5.0
    Happstack.Server.HTTP.FileServehappstack-server-0.5.0
    Happstack.Server.HTTP.LowLevelhappstack-server-0.5.0
    Happstack.Server.HTTP.Typeshappstack-server-0.5.0
    Happstack.Server.MessageWraphappstack-server-0.5.0
    Happstack.Server.MinHaXMLhappstack-server-0.5.0
    Happstack.Server.Partshappstack-server-0.5.0
    Happstack.Server.SURIhappstack-server-0.5.0
    Happstack.Server.SimpleHTTPhappstack-server-0.5.0
    Happstack.Server.StdConfighappstack-server-0.5.0
    Happstack.Server.XSLThappstack-server-0.5.0
    show/hideHappstack.Statehappstack-state-0.5.0
    Happstack.State.ClockTimehappstack-0.5.0
    Happstack.State.ComponentSystemhappstack-state-0.5.0
    Happstack.State.ComponentTHhappstack-state-0.5.0
    Happstack.State.Controlhappstack-state-0.5.0
    Happstack.State.Saverhappstack-state-0.5.0
    Happstack.State.Transactionhappstack-state-0.5.0
    show/hideUtil
    Happstack.Util.AutoBuildhappstack-util-0.5.0
    Happstack.Util.ByteStringCompathappstack-util-0.5.0
    Happstack.Util.Commonhappstack-util-0.5.0
    Happstack.Util.Concurrenthappstack-util-0.5.0
    Happstack.Util.Cronhappstack-util-0.5.0
    Happstack.Util.Daemonizehappstack-util-0.5.0
    Happstack.Util.FileManiphappstack-util-0.5.0
    Happstack.Util.HostAddresshappstack-util-0.5.0
    Happstack.Util.LogFormathappstack-util-0.5.0
    Happstack.Util.Mailhappstack-util-0.5.0
    Happstack.Util.OpenExclusivelyhappstack-util-0.5.0
    Happstack.Util.THhappstack-util-0.5.0
    Happstack.Util.TimeOuthappstack-util-0.5.0
    show/hideNetwork
    show/hideSocket
    Network.Socket.SendFilesendfile-0.6.1
    show/hideText
    show/hideText.StringTemplateHStringTemplate-0.6.2
    Text.StringTemplate.BaseHStringTemplate-0.6.2
    Text.StringTemplate.ClassesHStringTemplate-0.6.2
    Text.StringTemplate.GenericStandardHStringTemplate-0.6.2
    Text.StringTemplate.GenericWithClassHStringTemplate-0.6.2
    Text.StringTemplate.QQHStringTemplate-0.6.2
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/minus.gif binary ./docs/0.5.0/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/plus.gif binary ./docs/0.5.0/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b addfile ./docs/0.5.0/prologue.txt hunk ./docs/0.5.0/prologue.txt 1 +Happstack documentation. adddir ./docs/0.5.0/sendfile addfile ./docs/0.5.0/sendfile.haddock binary ./docs/0.5.0/sendfile.haddock oldhex * newhex *0d0cface000f00001a7f0000193f07000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000001000000 *050000000000000001000000060000000000000001030000000000000002000000000500000007 *00000000000800000000000900000000000a00000000000b000001000000080001000100000008 *00000000000000000300000000090000000c00000000000d00000000000e00000000000f000000 *000010000000000011000000000012000400000000000000000302120000005400000068000000 *65000000200000006f000000750000007400000070000000750000007400000020000000680000 *00610000006e000000640000006c000000650000000a0000000000000001030213000000540000 *00680000006500000020000000690000006e000000700000007500000074000000200000006600 *0000690000006c00000065000000700000006100000074000000680000000a0000000000000002 *030217000000540000006800000065000000200000006f00000066000000660000007300000065 *0000007400000020000000740000006f0000002000000073000000740000006100000072000000 *740000002000000061000000740000000a000000000000000303021c0000005400000068000000 *65000000200000006e000000750000006d000000620000006500000072000000200000006f0000 *006600000020000000620000007900000074000000650000007300000020000000740000006f00 *00002000000073000000650000006e000000640000000a00000013010301020e00000077000000 *720000006100000070000000730000002000000073000000650000006e00000064000000460000 *00690000006c0000006501020100000027021400000020000000740000006f0000002000000063 *0000006800000065000000630000006b0000002000000061000000720000006700000075000000 *6d000000650000006e00000074000000730000000a00000000140000050000000c0000000f0000 *00100000001100000012000100050000000c000000000f00000000100000000011000000001200 *00000000000000010000000007000000000103022b000000540000006800000065000000200000 *006c000000650000006e0000006700000074000000680000002000000028000000690000006e00 *000020000000620000007900000074000000650000007300000029000000200000007700000068 *0000006900000063000000680000002000000073000000680000006f000000750000006c000000 *640000002000000062000000650000002000000073000000650000006e000000740000000a0000 *000001010302290000005400000068000000650000002000000066000000690000006c00000065 *000000200000006f00000066000000660000007300000065000000740000002000000028000000 *690000006e00000020000000620000007900000074000000650000007300000029000000200000 *00740000006f000000200000007300000074000000610000007200000074000000200000006600 *0000720000006f0000006d0000000a000000000201030102310000005400000068000000650000 *002000000073000000690000006d000000700000006c0000006500000073000000740000002000 *0000690000006e000000740000006500000072000000660000006100000063000000650000002e *0000002000000053000000690000006d000000700000006c000000790000002000000067000000 *69000000760000006500000020000000690000007400000020000000610000006e000000200000 *006f00000075000000740000007000000075000000740000002001040100000015010209000000 *20000000610000006e000000640000002000000074000000680000006500000020010401000000 *16021400000020000000740000006f000000200000007400000068000000650000002000000069 *0000006e0000007000000075000000740000002000000066000000690000006c00000065000000 *2e0000000a020000000000000000030212000000540000006800000065000000200000006f0000 *00750000007400000070000000750000007400000020000000730000006f000000630000006b00 *000065000000740000000a00000000000000010302260000005400000068000000650000002000 *000070000000610000007400000068000000200000007700000068000000650000007200000065 *0000002000000074000000680000006500000020000000690000006e0000007000000075000000 *740000002000000066000000690000006c00000065000000200000007200000065000000730000 *00690000006400000065000000730000000a00000003010302ff00000152000000410000002000 *00006d0000006f000000720000006500000020000000700000006f000000770000006500000072 *00000066000000750000006c00000020000000690000006e000000740000006500000072000000 *66000000610000006300000065000000200000007400000068000000610000006e000000200000 *0073000000650000006e0000006400000046000000690000006c00000065000000200000007700 *000068000000690000006300000068000000200000006100000063000000630000006500000070 *000000740000007300000020000000610000002000000073000000740000006100000072000000 *74000000690000006e00000067000000200000006f000000660000006600000073000000650000 *00740000002c00000020000000610000006e000000640000002000000074000000680000006500 *00002000000062000000790000007400000065000000630000006f000000750000006e00000074 *00000020000000740000006f0000002000000073000000650000006e000000640000003b000000 *20000000740000006800000065000000200000006f000000660000006600000073000000650000 *007400000020000000610000006e00000064000000200000007400000068000000650000002000 *0000630000006f000000750000006e00000074000000200000006d000000750000007300000074 *000000200000006200000065000000200000006100000020000000700000006f00000073000000 *690000007400000069000000760000006500000020000000690000006e00000074000000650000 *006700000065000000720000002e00000020000000540000006800000065000000200000006900 *00006e000000690000007400000069000000610000006c00000020000000700000006f00000073 *0000006900000074000000690000006f0000006e000000200000006f0000006600000020000000 *74000000680000006500000020000000690000006e000000700000007500000074000000200000 *0066000000690000006c000000650000002000000068000000610000006e000000640000006c00 *000065000000200000006d00000061000000740000007400000065000000720000007300000020 *0000006e0000006f000000740000002000000073000000690000006e0000006300000065000000 *20000000740000006800000065000000200000006f000000660000006600000073000000650000 *0074000000200000006900000073000000200000006100000062000000730000006f0000006c00 *00007500000074000000650000002c00000020000000610000006e000000640000002000000074 *00000068000000650000002000000066000000690000006e000000610000006c00000020000000 *700000006f000000730000006900000074000000690000006f0000006e000000200000006d0000 *006100000079000000200000006200000065000000200000006400000069000000660000006600 *00006500000072000000650000006e000000740000002000000064000000650000007000000065 *0000006e00000064000000690000006e00000067000000200000006f0000006e00000020000000 *74000000680000006500000020000000700000006c0000006100000074000000660000006f0000 *00720000006d000000200000002d0000002d000000200000006e0000006f000000200000006100 *00007300000073000000750000006d0000007000000074000000690000006f0000006e00000073 *0000002000000063000000610000006e000000200000006200000065000000200000006d000000 *6100000064000000650000002e0000000a04000000000000000003021200000054000000680000 *0065000000200000006f0000007500000074000000700000007500000074000000200000007300 *00006f000000630000006b00000065000000740000000a00000000000000010302160000005400 *0000680000006500000020000000690000006e0000007000000075000000740000002000000066 *000000690000006c000000650000002000000068000000610000006e000000640000006c000000 *650000000a0000000000000002030217000000540000006800000065000000200000006f000000 *660000006600000073000000650000007400000020000000740000006f00000020000000730000 *00740000006100000072000000740000002000000061000000740000000a000000000000000303 *021c000000540000006800000065000000200000006e000000750000006d000000620000006500 *000072000000200000006f00000066000000200000006200000079000000740000006500000073 *00000020000000740000006f0000002000000073000000650000006e000000640000000a000000 *04010301022f00000054000000680000006500000020000000750000006e000000730000006100 *000066000000650000002000000076000000650000007200000073000000690000006f0000006e *000000200000006f000000660000002000000073000000650000006e0000006400000046000000 *690000006c00000065000000200000007700000068000000690000006300000068000000200000 *006100000063000000630000006500000070000000740000007300000020000000610000002001 *04010000001701020e00000020000000690000006e000000730000007400000065000000610000 *0064000000200000006f0000006600000020000000610000002001040100000015025000000020 *000000660000006f0000007200000020000000740000006800000065000000200000006f000000 *75000000740000007000000075000000740000002e000000200000002000000049000000740000 *002000000077000000690000006c0000006c00000020000000660000006c000000750000007300 *00006800000020000000740000006800000065000000200000006f000000750000007400000070 *00000075000000740000002000000068000000610000006e000000640000006c00000065000000 *200000006200000065000000660000006f00000072000000650000002000000073000000650000 *006e00000064000000690000006e0000006700000020000000610000006e000000790000002000 *000066000000690000006c0000006500000020000000640000006100000074000000610000002e *0000000a020000000000000000030212000000540000006800000065000000200000006f000000 *75000000740000007000000075000000740000002000000068000000610000006e000000640000 *006c000000650000000a0000000000000001030226000000540000006800000065000000200000 *007000000061000000740000006800000020000000770000006800000065000000720000006500 *00002000000074000000680000006500000020000000690000006e000000700000007500000074 *0000002000000066000000690000006c0000006500000020000000720000006500000073000000 *690000006400000065000000730000000a00000005010301021e00000054000000680000006500 *000020000000750000006e00000073000000610000006600000065000000200000007600000065 *0000007200000073000000690000006f0000006e000000200000006f0000006600000020000000 *73000000650000006e0000006400000046000000690000006c0000006501020100000027010211 *000000200000007700000068000000690000006300000068000000200000006100000063000000 *63000000650000007000000074000000730000002000000061000000200104010000001701020e *00000020000000690000006e000000730000007400000065000000610000006400000020000000 *6f0000006600000020000000610000002001040100000015024f00000020000000660000006f00 *00007200000020000000740000006800000065000000200000006f000000750000007400000070 *00000075000000740000002e000000200000004900000074000000200000007700000069000000 *6c0000006c00000020000000660000006c00000075000000730000006800000020000000740000 *006800000065000000200000006f00000075000000740000007000000075000000740000002000 *000068000000610000006e000000640000006c0000006500000020000000620000006500000066 *0000006f00000072000000650000002000000073000000650000006e0000006400000069000000 *6e0000006700000020000000610000006e000000790000002000000066000000690000006c0000 *006500000020000000640000006100000074000000610000002e0000000a040000000000000000 *030212000000540000006800000065000000200000006f00000075000000740000007000000075 *000000740000002000000068000000610000006e000000640000006c000000650000000a000000 *000000000103021300000054000000680000006500000020000000690000006e00000070000000 *75000000740000002000000066000000690000006c000000650000007000000061000000740000 *00680000000a0000000000000002030217000000540000006800000065000000200000006f0000 *00660000006600000073000000650000007400000020000000740000006f000000200000007300 *0000740000006100000072000000740000002000000061000000740000000a0000000000000003 *03021c000000540000006800000065000000200000006e000000750000006d0000006200000065 *00000072000000200000006f000000660000002000000062000000790000007400000065000000 *7300000020000000740000006f0000002000000073000000650000006e000000640000000a0000 *0006010301024c00000052000000650000007400000075000000720000006e0000007300000020 *000000740000006800000065000000200000006d0000006f000000640000006500000020000000 *740000006800000061000000740000002000000073000000650000006e00000064000000660000 *00690000006c000000650000002000000077000000610000007300000020000000630000006f00 *00006d00000070000000690000006c000000650000006400000020000000770000006900000074 *000000680000002e000000200000004d00000061000000690000006e0000006c00000079000000 *20000000660000006f000000720000002000000064000000650000006200000075000000670000 *0067000000690000006e00000067000000200000007500000073000000650000002e0000000a01 *0217000000200000007c00000020000000500000006f0000007300000073000000690000006200 *00006c000000650000002000000076000000610000006c00000075000000650000007300000020 *0000006100000072000000650000002001020e00000057000000490000004e0000003300000032 *0000005f00000053000000450000004e0000004400000046000000490000004c00000045010202 *0000002c0000002001020e0000004c000000490000004e00000055000000580000005f00000053 *000000450000004e0000004400000046000000490000004c000000450102020000002c00000020 *010210000000460000005200000045000000450000004200000053000000440000005f00000053 *000000450000004e0000004400000046000000490000004c000000450102020000002c0000000a *010203000000200000007c0000002001020f000000440000004100000052000000570000004900 *00004e0000005f00000053000000450000004e0000004400000046000000490000004c00000045 *0102060000002c00000020000000610000006e0000006400000020010211000000500000004f00 *0000520000005400000041000000420000004c000000450000005f00000053000000450000004e *0000004400000046000000490000004c0000004502020000002e0000000a010000000000000000 *030229000000540000006800000065000000200000006d0000006f000000640000006500000020 *000000740000006800000061000000740000002000000073000000650000006e00000064000000 *66000000690000006c000000650000002000000077000000610000007300000020000000630000 *006f0000006d00000070000000690000006c000000650000006400000020000000770000006900 *000074000000680000000a07000000000000000100000002000000030000000400000005000000 *060700000000000000010000000200000003000000040000000500000006000700000000000000 *000100000000020000000003000000000400000000050000000006000000000000000018000000 *000000000103000000040000000000000001030000000500000000000000010000000006000000 *000000000100000000070000000000000001000000000800000000000000010000000009000000 *0000000001000000000a0000000000000002000000000b0000000000000002000000000c000000 *0000000002000000000d0000000000000002000000000e0000000000000002000000000f000000 *0000000003000000000a0000000000000003000000001000000000000000030000000011000000 *000000000300000000060000000000000003000000000700000000000000030000000008000000 *000000000300000000090000000000000003000000001200000000000000030000000013000000 *1400000015030000001600000017000000180300000019000000170000001a030000001b000000 *000000001c000000000000000e73656e6466696c652d302e362e3100000000000000174e657477 *6f726b2e536f636b65742e53656e6446696c65000000000000001d4e6574776f726b2e536f636b *65742e53656e6446696c652e4c696e757800000000000000204e6574776f726b2e536f636b6574 *2e53656e6446696c652e496e7465726e616c000000000000000942797465436f756e7400000000 *000000064f6666736574000000000000000873656e6446696c65000000000000000973656e6446 *696c6527000000000000000e756e7361666553656e6446696c65000000000000000f756e736166 *6553656e6446696c6527000000000000000c73656e6446696c654d6f6465000000000000000a63 *5f73656e6466696c6500000000000000095f73656e6446696c6500000000000000097273656e64 *66696c65000000000000000873656e6466696c6500000000000000086d61784279746573000000 *000000000a73656e6446696c6527270000000000000010756e7361666553656e6446696c652727 *000000000000000d7772617053656e6446696c6527000000000000000a68616e646c65546f4664 *000000000000000f6e6574776f726b2d322e322e312e37000000000000000e4e6574776f726b2e *536f636b65740000000000000006536f636b657400000000000000046261736500000000000000 *064748432e494f000000000000000846696c655061746800000000000000134748432e494f2e48 *616e646c652e5479706573000000000000000648616e646c65 addfile ./docs/0.5.0/sendfile/Network-Socket-SendFile.html hunk ./docs/0.5.0/sendfile/Network-Socket-SendFile.html 1 + + +Network.Socket.SendFile
     sendfile-0.6.1: A portable sendfile librarySource codeContentsIndex
    Network.Socket.SendFile
    Contents
    Safe functions (recommended) +
    Utility functions +
    Description

    A cross-platform wrapper for sendfile -- this implements an available operating-system call if supported, otherwise it falls back to a portable haskell implementation. +

    Two interfaces are provided for both the unsafe and safe sets of functions. The first interface accepts an output socket/handle and the path of the file you want to send; sendFile and unsafeSendFile comprise this interface. The second interface accepts an output socket/handle, a handle to the file you want to send, an offset, and the number of bytes you want to send; sendFile' and unsafeSendFile' comprise this interface. +

    For consistent read/write behavior with either sendFile' or unsafeSendFile', the input handle should be opened in Binary mode rather than Text mode. +

    Synopsis
    type ByteCount = Integer
    type Offset = Integer
    sendFile :: Socket -> FilePath -> IO ()
    sendFile' :: Socket -> FilePath -> Offset -> ByteCount -> IO ()
    unsafeSendFile :: Handle -> FilePath -> IO ()
    unsafeSendFile' :: Handle -> FilePath -> Offset -> ByteCount -> IO ()
    sendFileMode :: String
    Documentation
    type ByteCount = IntegerSource
    The length (in bytes) which should be sent +
    type Offset = IntegerSource
    The file offset (in bytes) to start from +
    Safe functions (recommended) +
    sendFileSource
    :: SocketThe output socket +
    -> FilePathThe path where the input file resides +
    -> IO ()
    The simplest interface. Simply give it an output Socket and the FilePath to the input file. +
    sendFile'Source
    :: SocketThe output socket +
    -> FilePathThe input file handle +
    -> OffsetThe offset to start at +
    -> ByteCountThe number of bytes to send +
    -> IO ()
    A more powerful interface than sendFile which accepts a starting offset, and the bytecount to send; the offset and the count must be a positive integer. The initial position of the input file handle matters not since the offset is absolute, and the final position may be different depending on the platform -- no assumptions can be made. +
    unsafeSendFileSource
    :: HandleThe output handle +
    -> FilePathThe path where the input file resides +
    -> IO ()
    The unsafe version of sendFile which accepts a Handle instead of a Socket for the output. It will flush the output handle before sending any file data. +
    unsafeSendFile'Source
    :: HandleThe output handle +
    -> FilePathThe input filepath +
    -> OffsetThe offset to start at +
    -> ByteCountThe number of bytes to send +
    -> IO ()
    The unsafe version of sendFile' which accepts a Handle instead of a Socket for the output. It will flush the output handle before sending any file data. +
    Utility functions +
    sendFileModeSource
    :: StringThe mode that sendfile was compiled with +
    Returns the mode that sendfile was compiled with. Mainly for debugging use. + | Possible values are WIN32_SENDFILE, LINUX_SENDFILE, FREEBSD_SENDFILE, + | DARWIN_SENDFILE, and PORTABLE_SENDFILE. +
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/sendfile/doc-index.html hunk ./docs/0.5.0/sendfile/doc-index.html 1 + + +sendfile-0.6.1: A portable sendfile library (Index)
     sendfile-0.6.1: A portable sendfile libraryContentsIndex
    ByteCount
    Offset
    sendFile
    sendFile'
    sendFileMode
    unsafeSendFile
    unsafeSendFile'
    addfile ./docs/0.5.0/sendfile/frames.html hunk ./docs/0.5.0/sendfile/frames.html 1 + + + + + + + + + + + + + + + addfile ./docs/0.5.0/sendfile/haddock-util.js hunk ./docs/0.5.0/sendfile/haddock-util.js 1 +// Haddock JavaScript utilities +function toggle(button,id) +{ + var n = document.getElementById(id).style; + if (n.display == "none") + { + button.src = "minus.gif"; + n.display = "block"; + } + else + { + button.src = "plus.gif"; + n.display = "none"; + } +} + + +var max_results = 75; // 50 is not enough to search for map in the base libraries +var shown_range = null; +var last_search = null; + +function quick_search() +{ + perform_search(false); +} + +function full_search() +{ + perform_search(true); +} + + +function perform_search(full) +{ + var text = document.getElementById("searchbox").value.toLowerCase(); + if (text == last_search && !full) return; + last_search = text; + + var table = document.getElementById("indexlist"); + var status = document.getElementById("searchmsg"); + var children = table.firstChild.childNodes; + + // first figure out the first node with the prefix + var first = bisect(-1); + var last = (first == -1 ? -1 : bisect(1)); + + if (first == -1) + { + table.className = ""; + status.innerHTML = "No results found, displaying all"; + } + else if (first == 0 && last == children.length - 1) + { + table.className = ""; + status.innerHTML = ""; + } + else if (last - first >= max_results && !full) + { + table.className = ""; + status.innerHTML = "More than " + max_results + ", press Search to display"; + } + else + { + // decide what you need to clear/show + if (shown_range) + setclass(shown_range[0], shown_range[1], "indexrow"); + setclass(first, last, "indexshow"); + shown_range = [first, last]; + table.className = "indexsearch"; + status.innerHTML = ""; + } + + + function setclass(first, last, status) + { + for (var i = first; i <= last; i++) + { + children[i].className = status; + } + } + + + // do a binary search, treating 0 as ... + // return either -1 (no 0's found) or location of most far match + function bisect(dir) + { + var first = 0, finish = children.length - 1; + var mid, success = false; + + while (finish - first > 3) + { + mid = Math.floor((finish + first) / 2); + + var i = checkitem(mid); + if (i == 0) i = dir; + if (i == -1) + finish = mid; + else + first = mid; + } + var a = (dir == 1 ? first : finish); + var b = (dir == 1 ? finish : first); + for (var i = b; i != a - dir; i -= dir) + { + if (checkitem(i) == 0) return i; + } + return -1; + } + + + // from an index, decide what the result is + // 0 = match, -1 is lower, 1 is higher + function checkitem(i) + { + var s = getitem(i).toLowerCase().substr(0, text.length); + if (s == text) return 0; + else return (s > text ? -1 : 1); + } + + + // from an index, get its string + // this abstracts over alternates + function getitem(i) + { + for ( ; i >= 0; i--) + { + var s = children[i].firstChild.firstChild.data; + if (s.indexOf(' ') == -1) + return s; + } + return ""; // should never be reached + } +} + +function setSynopsis(filename) { + if (parent.window.synopsis) { + parent.window.synopsis.location = filename; + } +} addfile ./docs/0.5.0/sendfile/haddock.css hunk ./docs/0.5.0/sendfile/haddock.css 1 +/* -------- Global things --------- */ + +BODY { + background-color: #ffffff; + color: #000000; + font-family: sans-serif; + padding: 0 0; + } + +A:link { color: #0000e0; text-decoration: none } +A:visited { color: #0000a0; text-decoration: none } +A:hover { background-color: #e0e0ff; text-decoration: none } + +TABLE.vanilla { + width: 100%; + border-width: 0px; + /* I can't seem to specify cellspacing or cellpadding properly using CSS... */ +} + +TABLE.vanilla2 { + border-width: 0px; +} + +/* font is a little too small in MSIE */ +TT { font-size: 100%; } +PRE { font-size: 100%; } + +LI P { margin: 0pt } + +TD { + border-width: 0px; +} + +TABLE.narrow { + border-width: 0px; +} + +TD.s8 { height: 8px; } +TD.s15 { height: 15px; } + +SPAN.keyword { text-decoration: underline; } + +/* Resize the buttom image to match the text size */ +IMG.coll { width : 0.75em; height: 0.75em; margin-bottom: 0; margin-right: 0.5em } + +/* --------- Contents page ---------- */ + +DIV.node { + padding-left: 3em; +} + +DIV.cnode { + padding-left: 1.75em; +} + +SPAN.pkg { + position: absolute; + left: 50em; +} + +/* --------- Documentation elements ---------- */ + +TD.children { + padding-left: 25px; + } + +TD.synopsis { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace + } + +TD.decl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + } + +TD.topdecl { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; +} + +TABLE.declbar { + border-spacing: 0px; + } + +TD.declname { + width: 100%; + } + +TD.declbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #000099; + border-left-style: solid; + white-space: nowrap; + font-size: small; + } + +/* + arg is just like decl, except that wrapping is not allowed. It is + used for function and constructor arguments which have a text box + to the right, where if wrapping is allowed the text box squashes up + the declaration by wrapping it. +*/ +TD.arg { + padding: 2px; + background-color: #f0f0f0; + font-family: monospace; + vertical-align: top; + white-space: nowrap; + } + +TD.recfield { padding-left: 20px } + +TD.doc { + padding-top: 2px; + padding-left: 10px; + } + +TD.ndoc { + padding: 2px; + } + +TD.rdoc { + padding: 2px; + padding-left: 10px; + width: 100%; + } + +TD.body { + padding-left: 10px + } + +TD.pkg { + width: 100%; + padding-left: 10px +} + +TABLE.indexsearch TR.indexrow { + display: none; +} +TABLE.indexsearch TR.indexshow { + display: table-row; +} + +TD.indexentry { + vertical-align: top; + padding-right: 10px + } + +TD.indexannot { + vertical-align: top; + padding-left: 20px; + white-space: nowrap + } + +TD.indexlinks { + width: 100% + } + +/* ------- Section Headings ------- */ + +TD.section1 { + padding-top: 15px; + font-weight: bold; + font-size: 150% + } + +TD.section2 { + padding-top: 10px; + font-weight: bold; + font-size: 130% + } + +TD.section3 { + padding-top: 5px; + font-weight: bold; + font-size: 110% + } + +TD.section4 { + font-weight: bold; + font-size: 100% + } + +/* -------------- The title bar at the top of the page */ + +TD.infohead { + color: #ffffff; + font-weight: bold; + padding-right: 10px; + text-align: left; +} + +TD.infoval { + color: #ffffff; + padding-right: 10px; + text-align: left; +} + +TD.topbar { + background-color: #000099; + padding: 5px; +} + +TD.title { + color: #ffffff; + padding-left: 10px; + width: 100% + } + +TD.topbut { + padding-left: 5px; + padding-right: 5px; + border-left-width: 1px; + border-left-color: #ffffff; + border-left-style: solid; + white-space: nowrap; + } + +TD.topbut A:link { + color: #ffffff + } + +TD.topbut A:visited { + color: #ffff00 + } + +TD.topbut A:hover { + background-color: #6060ff; + } + +TD.topbut:hover { + background-color: #6060ff + } + +TD.modulebar { + background-color: #0077dd; + padding: 5px; + border-top-width: 1px; + border-top-color: #ffffff; + border-top-style: solid; + } + +/* --------- The page footer --------- */ + +TD.botbar { + background-color: #000099; + color: #ffffff; + padding: 5px + } +TD.botbar A:link { + color: #ffffff; + text-decoration: underline + } +TD.botbar A:visited { + color: #ffff00 + } +TD.botbar A:hover { + background-color: #6060ff + } + +/* --------- Mini Synopsis for Frame View --------- */ + +.outer { + margin: 0 0; + padding: 0 0; +} + +.mini-synopsis { + padding: 0.25em 0.25em; +} + +.mini-synopsis H1 { font-size: 130%; } +.mini-synopsis H2 { font-size: 110%; } +.mini-synopsis H3 { font-size: 100%; } +.mini-synopsis H1, .mini-synopsis H2, .mini-synopsis H3 { + margin-top: 0.5em; + margin-bottom: 0.25em; + padding: 0 0; +} + +.mini-synopsis H1 { border-bottom: 1px solid #ccc; } + +.mini-topbar { + font-size: 130%; + background: #0077dd; + padding: 0.25em; +} + + addfile ./docs/0.5.0/sendfile/haskell_icon.gif binary ./docs/0.5.0/sendfile/haskell_icon.gif oldhex * newhex *47494638376110001000f70f00000000800000008000808000000080800080008080c0c0c08080 *80ff000000ff00ffff000000ffff00ff00ffffffffff0000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *000000000000000000000000000000000000000000000000000000000000000000000000000000 *0021f90401000000002c000000001000100007086c0001007840b0a0418202073e38b0b021c387 *07143e2440c0a143040e091cd0787021c686151f84347800e343901d4b12646870e44a930d0952 *3ca832a6cc990555b2bc2992e4c79d3847ea2c88b3a7c89a2c8b8aa43874e941a60810003840b5 *aa55aa511346ddca75abc080003b addfile ./docs/0.5.0/sendfile/index-frames.html hunk ./docs/0.5.0/sendfile/index-frames.html 1 + + +sendfile-0.6.1: A portable sendfile library

    Network.Socket.SendFile

    addfile ./docs/0.5.0/sendfile/index.html hunk ./docs/0.5.0/sendfile/index.html 1 + + +sendfile-0.6.1: A portable sendfile library
     sendfile-0.6.1: A portable sendfile libraryContentsIndex
    sendfile-0.6.1: A portable sendfile library

    A library which exposes zero-copy sendfile functionality in a portable way. If a platform does not support sendfile, a fallback implementation in haskell is provided. +

    Currently supported platforms: Windows 2000+ (Native), Linux 2.6+ (Native), FreeBSD (Native), OS-X 10.5+ (Native), Everything else (Portable Haskell code). +

    Modules
    show/hideNetwork
    show/hideSocket
    Network.Socket.SendFile
    Produced by Haddock version 2.5.0
    addfile ./docs/0.5.0/sendfile/mini_Network-Socket-SendFile.html hunk ./docs/0.5.0/sendfile/mini_Network-Socket-SendFile.html 1 + + +Network.Socket.SendFile
    Network.Socket.SendFile
    type ByteCount
    type Offset

    Safe functions (recommended) +

    Utility functions +

    addfile ./docs/0.5.0/sendfile/minus.gif binary ./docs/0.5.0/sendfile/minus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002118c8f *a00bc6eb5e0b40583b6596f1a11f14003b addfile ./docs/0.5.0/sendfile/plus.gif binary ./docs/0.5.0/sendfile/plus.gif oldhex * newhex *47494638396109000900910000fefefe8282820202020000002c00000000090009000002148c8f *a00bb6b29c82ca897b5b7871cfce74085200003b addfile ./docs/0.5.0/sendfile/sendfile.haddock binary ./docs/0.5.0/sendfile/sendfile.haddock oldhex * newhex *0d0cface000f00001a7f0000193f07000000000000000000000001000000010000000000000001 *000000020000000000000001000000030000000000000001000000040000000000000001000000 *050000000000000001000000060000000000000001030000000000000002000000000500000007 *00000000000800000000000900000000000a00000000000b000001000000080001000100000008 *00000000000000000300000000090000000c00000000000d00000000000e00000000000f000000 *000010000000000011000000000012000400000000000000000302120000005400000068000000 *65000000200000006f000000750000007400000070000000750000007400000020000000680000 *00610000006e000000640000006c000000650000000a0000000000000001030213000000540000 *00680000006500000020000000690000006e000000700000007500000074000000200000006600 *0000690000006c00000065000000700000006100000074000000680000000a0000000000000002 *030217000000540000006800000065000000200000006f00000066000000660000007300000065 *0000007400000020000000740000006f0000002000000073000000740000006100000072000000 *740000002000000061000000740000000a000000000000000303021c0000005400000068000000 *65000000200000006e000000750000006d000000620000006500000072000000200000006f0000 *006600000020000000620000007900000074000000650000007300000020000000740000006f00 *00002000000073000000650000006e000000640000000a00000013010301020e00000077000000 *720000006100000070000000730000002000000073000000650000006e00000064000000460000 *00690000006c0000006501020100000027021400000020000000740000006f0000002000000063 *0000006800000065000000630000006b0000002000000061000000720000006700000075000000 *6d000000650000006e00000074000000730000000a00000000140000050000000c0000000f0000 *00100000001100000012000100050000000c000000000f00000000100000000011000000001200 *00000000000000010000000007000000000103022b000000540000006800000065000000200000 *006c000000650000006e0000006700000074000000680000002000000028000000690000006e00 *000020000000620000007900000074000000650000007300000029000000200000007700000068 *0000006900000063000000680000002000000073000000680000006f000000750000006c000000 *640000002000000062000000650000002000000073000000650000006e000000740000000a0000 *000001010302290000005400000068000000650000002000000066000000690000006c00000065 *000000200000006f00000066000000660000007300000065000000740000002000000028000000 *690000006e00000020000000620000007900000074000000650000007300000029000000200000 *00740000006f000000200000007300000074000000610000007200000074000000200000006600 *0000720000006f0000006d0000000a000000000201030102310000005400000068000000650000 *002000000073000000690000006d000000700000006c0000006500000073000000740000002000 *0000690000006e000000740000006500000072000000660000006100000063000000650000002e *0000002000000053000000690000006d000000700000006c000000790000002000000067000000 *69000000760000006500000020000000690000007400000020000000610000006e000000200000 *006f00000075000000740000007000000075000000740000002001040100000015010209000000 *20000000610000006e000000640000002000000074000000680000006500000020010401000000 *16021400000020000000740000006f000000200000007400000068000000650000002000000069 *0000006e0000007000000075000000740000002000000066000000690000006c00000065000000 *2e0000000a020000000000000000030212000000540000006800000065000000200000006f0000 *00750000007400000070000000750000007400000020000000730000006f000000630000006b00 *000065000000740000000a00000000000000010302260000005400000068000000650000002000 *000070000000610000007400000068000000200000007700000068000000650000007200000065 *0000002000000074000000680000006500000020000000690000006e0000007000000075000000 *740000002000000066000000690000006c00000065000000200000007200000065000000730000 *00690000006400000065000000730000000a00000003010302ff00000152000000410000002000 *00006d0000006f000000720000006500000020000000700000006f000000770000006500000072 *00000066000000750000006c00000020000000690000006e000000740000006500000072000000 *66000000610000006300000065000000200000007400000068000000610000006e000000200000 *0073000000650000006e0000006400000046000000690000006c00000065000000200000007700 *000068000000690000006300000068000000200000006100000063000000630000006500000070 *000000740000007300000020000000610000002000000073000000740000006100000072000000 *74000000690000006e00000067000000200000006f000000660000006600000073000000650000 *00740000002c00000020000000610000006e000000640000002000000074000000680000006500 *00002000000062000000790000007400000065000000630000006f000000750000006e00000074 *00000020000000740000006f0000002000000073000000650000006e000000640000003b000000 *20000000740000006800000065000000200000006f000000660000006600000073000000650000 *007400000020000000610000006e00000064000000200000007400000068000000650000002000 *0000630000006f000000750000006e00000074000000200000006d000000750000007300000074 *000000200000006200000065000000200000006100000020000000700000006f00000073000000 *690000007400000069000000760000006500000020000000690000006e00000074000000650000 *006700000065000000720000002e00000020000000540000006800000065000000200000006900 *00006e000000690000007400000069000000610000006c00000020000000700000006f00000073 *0000006900000074000000690000006f0000006e000000200000006f0000006600000020000000 *74000000680000006500000020000000690000006e000000700000007500000074000000200000 *0066000000690000006c000000650000002000000068000000610000006e000000640000006c00 *000065000000200000006d00000061000000740000007400000065000000720000007300000020 *0000006e0000006f000000740000002000000073000000690000006e0000006300000065000000 *20000000740000006800000065000000200000006f000000660000006600000073000000650000 *0074000000200000006900000073000000200000006100000062000000730000006f0000006c00 *00007500000074000000650000002c00000020000000610000006e000000640000002000000074 *00000068000000650000002000000066000000690000006e000000610000006c00000020000000 *700000006f000000730000006900000074000000690000006f0000006e000000200000006d0000 *006100000079000000200000006200000065000000200000006400000069000000660000006600 *00006500000072000000650000006e000000740000002000000064000000650000007000000065 *0000006e00000064000000690000006e00000067000000200000006f0000006e00000020000000 *74000000680000006500000020000000700000006c0000006100000074000000660000006f0000 *00720000006d000000200000002d0000002d000000200000006e0000006f000000200000006100 *00007300000073000000750000006d0000007000000074000000690000006f0000006e00000073 *0000002000000063000000610000006e000000200000006200000065000000200000006d000000 *6100000064000000650000002e0000000a04000000000000000003021200000054000000680000 *0065000000200000006f0000007500000074000000700000007500000074000000200000007300 *00006f000000630000006b00000065000000740000000a00000000000000010302160000005400 *0000680000006500000020000000690000006e0000007000000075000000740000002000000066 *000000690000006c000000650000002000000068000000610000006e000000640000006c000000 *650000000a0000000000000002030217000000540000006800000065000000200000006f000000 *660000006600000073000000650000007400000020000000740000006f00000020000000730000 *00740000006100000072000000740000002000000061000000740000000a000000000000000303 *021c000000540000006800000065000000200000006e000000750000006d000000620000006500 *000072000000200000006f00000066000000200000006200000079000000740000006500000073 *00000020000000740000006f0000002000000073000000650000006e000000640000000a000000 *04010301022f00000054000000680000006500000020000000750000006e000000730000006100 *000066000000650000002000000076000000650000007200000073000000690000006f0000006e *000000200000006f000000660000002000000073000000650000006e0000006400000046000000 *690000006c00000065000000200000007700000068000000690000006300000068000000200000 *006100000063000000630000006500000070000000740000007300000020000000610000002001 *04010000001701020e00000020000000690000006e000000730000007400000065000000610000 *0064000000200000006f0000006600000020000000610000002001040100000015025000000020 *000000660000006f0000007200000020000000740000006800000065000000200000006f000000 *75000000740000007000000075000000740000002e000000200000002000000049000000740000 *002000000077000000690000006c0000006c00000020000000660000006c000000750000007300 *00006800000020000000740000006800000065000000200000006f000000750000007400000070 *00000075000000740000002000000068000000610000006e000000640000006c00000065000000 *200000006200000065000000660000006f00000072000000650000002000000073000000650000 *006e00000064000000690000006e0000006700000020000000610000006e000000790000002000 *000066000000690000006c0000006500000020000000640000006100000074000000610000002e *0000000a020000000000000000030212000000540000006800000065000000200000006f000000 *75000000740000007000000075000000740000002000000068000000610000006e000000640000 *006c000000650000000a0000000000000001030226000000540000006800000065000000200000 *007000000061000000740000006800000020000000770000006800000065000000720000006500 *00002000000074000000680000006500000020000000690000006e000000700000007500000074 *0000002000000066000000690000006c0000006500000020000000720000006500000073000000 *690000006400000065000000730000000a00000005010301021e00000054000000680000006500 *000020000000750000006e00000073000000610000006600000065000000200000007600000065 *0000007200000073000000690000006f0000006e000000200000006f0000006600000020000000 *73000000650000006e0000006400000046000000690000006c0000006501020100000027010211 *000000200000007700000068000000690000006300000068000000200000006100000063000000 *63000000650000007000000074000000730000002000000061000000200104010000001701020e *00000020000000690000006e000000730000007400000065000000610000006400000020000000 *6f0000006600000020000000610000002001040100000015024f00000020000000660000006f00 *00007200000020000000740000006800000065000000200000006f000000750000007400000070 *00000075000000740000002e000000200000004900000074000000200000007700000069000000 *6c0000006c00000020000000660000006c00000075000000730000006800000020000000740000 *006800000065000000200000006f00000075000000740000007000000075000000740000002000 *000068000000610000006e000000640000006c0000006500000020000000620000006500000066 *0000006f00000072000000650000002000000073000000650000006e0000006400000069000000 *6e0000006700000020000000610000006e000000790000002000000066000000690000006c0000 *006500000020000000640000006100000074000000610000002e0000000a040000000000000000 *030212000000540000006800000065000000200000006f00000075000000740000007000000075 *000000740000002000000068000000610000006e000000640000006c000000650000000a000000 *000000000103021300000054000000680000006500000020000000690000006e00000070000000 *75000000740000002000000066000000690000006c000000650000007000000061000000740000 *00680000000a0000000000000002030217000000540000006800000065000000200000006f0000 *00660000006600000073000000650000007400000020000000740000006f000000200000007300 *0000740000006100000072000000740000002000000061000000740000000a0000000000000003 *03021c000000540000006800000065000000200000006e000000750000006d0000006200000065 *00000072000000200000006f000000660000002000000062000000790000007400000065000000 *7300000020000000740000006f0000002000000073000000650000006e000000640000000a0000 *0006010301024c00000052000000650000007400000075000000720000006e0000007300000020 *000000740000006800000065000000200000006d0000006f000000640000006500000020000000 *740000006800000061000000740000002000000073000000650000006e00000064000000660000 *00690000006c000000650000002000000077000000610000007300000020000000630000006f00 *00006d00000070000000690000006c000000650000006400000020000000770000006900000074 *000000680000002e000000200000004d00000061000000690000006e0000006c00000079000000 *20000000660000006f000000720000002000000064000000650000006200000075000000670000 *0067000000690000006e00000067000000200000007500000073000000650000002e0000000a01 *0217000000200000007c00000020000000500000006f0000007300000073000000690000006200 *00006c000000650000002000000076000000610000006c00000075000000650000007300000020 *0000006100000072000000650000002001020e00000057000000490000004e0000003300000032 *0000005f00000053000000450000004e0000004400000046000000490000004c00000045010202 *0000002c0000002001020e0000004c000000490000004e00000055000000580000005f00000053 *000000450000004e0000004400000046000000490000004c000000450102020000002c00000020 *010210000000460000005200000045000000450000004200000053000000440000005f00000053 *000000450000004e0000004400000046000000490000004c000000450102020000002c0000000a *010203000000200000007c0000002001020f000000440000004100000052000000570000004900 *00004e0000005f00000053000000450000004e0000004400000046000000490000004c00000045 *0102060000002c00000020000000610000006e0000006400000020010211000000500000004f00 *0000520000005400000041000000420000004c000000450000005f00000053000000450000004e *0000004400000046000000490000004c0000004502020000002e0000000a010000000000000000 *030229000000540000006800000065000000200000006d0000006f000000640000006500000020 *000000740000006800000061000000740000002000000073000000650000006e00000064000000 *66000000690000006c000000650000002000000077000000610000007300000020000000630000 *006f0000006d00000070000000690000006c000000650000006400000020000000770000006900 *000074000000680000000a07000000000000000100000002000000030000000400000005000000 *060700000000000000010000000200000003000000040000000500000006000700000000000000 *000100000000020000000003000000000400000000050000000006000000000000000018000000 *000000000103000000040000000000000001030000000500000000000000010000000006000000 *000000000100000000070000000000000001000000000800000000000000010000000009000000 *0000000001000000000a0000000000000002000000000b0000000000000002000000000c000000 *0000000002000000000d0000000000000002000000000e0000000000000002000000000f000000 *0000000003000000000a0000000000000003000000001000000000000000030000000011000000 *000000000300000000060000000000000003000000000700000000000000030000000008000000 *000000000300000000090000000000000003000000001200000000000000030000000013000000 *1400000015030000001600000017000000180300000019000000170000001a030000001b000000 *000000001c000000000000000e73656e6466696c652d302e362e3100000000000000174e657477 *6f726b2e536f636b65742e53656e6446696c65000000000000001d4e6574776f726b2e536f636b *65742e53656e6446696c652e4c696e757800000000000000204e6574776f726b2e536f636b6574 *2e53656e6446696c652e496e7465726e616c000000000000000942797465436f756e7400000000 *000000064f6666736574000000000000000873656e6446696c65000000000000000973656e6446 *696c6527000000000000000e756e7361666553656e6446696c65000000000000000f756e736166 *6553656e6446696c6527000000000000000c73656e6446696c654d6f6465000000000000000a63 *5f73656e6466696c6500000000000000095f73656e6446696c6500000000000000097273656e64 *66696c65000000000000000873656e6466696c6500000000000000086d61784279746573000000 *000000000a73656e6446696c6527270000000000000010756e7361666553656e6446696c652727 *000000000000000d7772617053656e6446696c6527000000000000000a68616e646c65546f4664 *000000000000000f6e6574776f726b2d322e322e312e37000000000000000e4e6574776f726b2e *536f636b65740000000000000006536f636b657400000000000000046261736500000000000000 *064748432e494f000000000000000846696c655061746800000000000000134748432e494f2e48 *616e646c652e5479706573000000000000000648616e646c65 adddir ./docs/0.5.0/sendfile/src addfile ./docs/0.5.0/sendfile/src/Network-Socket-SendFile-Internal.html hunk ./docs/0.5.0/sendfile/src/Network-Socket-SendFile-Internal.html 1 + + + + +src/Network/Socket/SendFile/Internal.hs + + + +
    {-# LANGUAGE CPP, RecordWildCards #-}
    +module Network.Socket.SendFile.Internal (
    +    sendFile,
    +    sendFile',
    +    unsafeSendFile,
    +    unsafeSendFile',
    +    sendFileMode,
    +    ) where
    +#if defined(PORTABLE_SENDFILE)
    +import Data.ByteString.Char8 (hGet, hPutStr, length, ByteString)
    +import Network.Socket.ByteString (sendAll)
    +import Network.Socket (Socket(..))
    +import Prelude hiding (length)
    +import System.IO (Handle, IOMode(..), SeekMode(..), hFileSize, hSeek, withBinaryFile)
    +#else
    +import Network.Socket (Socket(..), fdSocket)
    +import System.IO (Handle, IOMode(..), hFileSize, withBinaryFile)
    +import System.Posix.Types (Fd(..))
    +#endif
    +#ifdef __GLASGOW_HASKELL__
    +#if __GLASGOW_HASKELL__ >= 611
    +import GHC.IO.Handle.Internals (withHandle, flushWriteBuffer)
    +import GHC.IO.Handle.Types (Handle__(..), HandleType(..))
    +import qualified GHC.IO.FD as FD
    +-- import qualified GHC.IO.Handle.FD as FD
    +import GHC.IO.Exception
    +import Data.Typeable (cast)
    +import System.IO (hFlush)
    +import System.IO.Error
    +#else
    +import GHC.IOBase
    +import GHC.Handle hiding (fdToHandle)
    +import qualified GHC.Handle
    +#endif
    +#endif
    +
    +#if defined(WIN32_SENDFILE)
    +import Network.Socket.SendFile.Win32 (_sendFile)
    +
    +sendFileMode :: String
    +sendFileMode = "WIN32_SENDFILE"
    +#endif
    +
    +#if defined(LINUX_SENDFILE)
    +import Network.Socket.SendFile.Linux (_sendFile)
    +
    +sendFileMode :: String
    +sendFileMode = "LINUX_SENDFILE"
    +#endif
    +
    +#if defined(FREEBSD_SENDFILE)
    +import Network.Socket.SendFile.FreeBSD (_sendFile)
    +
    +sendFileMode :: String
    +sendFileMode = "FREEBSD_SENDFILE"
    +#endif
    +
    +#if defined(DARWIN_SENDFILE)
    +import Network.Socket.SendFile.Darwin (_sendFile)
    +
    +sendFileMode :: String
    +sendFileMode = "DARWIN_SENDFILE"
    +#endif
    +
    +#if defined(PORTABLE_SENDFILE)
    +sendFileMode :: String
    +sendFileMode = "PORTABLE_SENDFILE"
    +
    +sendFile'' :: Socket -> Handle -> Integer -> Integer -> IO ()
    +sendFile'' = wrapSendFile' $ \outs inp off count -> do
    +    hSeek inp AbsoluteSeek off
    +    rsend (sendAll outs) inp count
    +
    +unsafeSendFile'' :: Handle -> Handle -> Integer -> Integer -> IO ()
    +unsafeSendFile'' = wrapSendFile' $ \outp inp off count -> do
    +    hSeek inp AbsoluteSeek off
    +    rsend (hPutStr outp) inp count
    +    hFlush outp -- match the behavior that all data is "flushed to the os" of native implementations
    +
    +rsend :: (ByteString -> IO ()) -> Handle -> Integer -> IO ()
    +rsend write inp n = do
    +  loop n
    +  where
    +    loop 0        = return ()
    +    loop reqBytes = do
    +      let bytes = min 32768 reqBytes :: Integer
    +      buf <- hGet inp (fromIntegral bytes)
    +      write buf
    +      loop $ reqBytes - (fromIntegral $ length buf)
    +#else
    +sendFile'' :: Socket -> Handle -> Integer -> Integer -> IO ()
    +sendFile'' outs inp off count =
    +    do let out_fd = Fd (fdSocket outs)
    +       in_fd <- handleToFd inp
    +       wrapSendFile' _sendFile out_fd in_fd off count
    +
    +unsafeSendFile'' :: Handle -> Handle -> Integer -> Integer -> IO ()
    +unsafeSendFile'' outp inp off count =
    +    do hFlush outp
    +       out_fd <- handleToFd outp
    +       in_fd  <- handleToFd inp
    +       wrapSendFile' _sendFile out_fd in_fd off count
    +    
    +#endif
    +
    +sendFile :: Socket -> FilePath -> IO ()
    +sendFile outs infp = withBinaryFile infp ReadMode $ \inp -> do
    +    count <- hFileSize inp
    +    sendFile'' outs inp 0 count
    +
    +sendFile' :: Socket -> FilePath -> Integer -> Integer -> IO ()
    +sendFile' outs infp offset count =
    +    withBinaryFile infp ReadMode $ \inp ->
    +        sendFile'' outs inp offset count
    +
    +unsafeSendFile :: Handle -> FilePath -> IO ()
    +unsafeSendFile outp infp = 
    +    withBinaryFile infp ReadMode $ \inp -> do
    +      count <- hFileSize inp
    +      unsafeSendFile'' outp inp 0 count
    +
    +unsafeSendFile'
    +    :: Handle    -- ^ The output handle
    +    -> FilePath  -- ^ The input filepath
    +    -> Integer    -- ^ The offset to start at
    +    -> Integer -- ^ The number of bytes to send
    +    -> IO ()
    +unsafeSendFile' outp infp offset count =
    +    withBinaryFile infp ReadMode $ \inp -> do
    +      unsafeSendFile'' outp inp offset count
    +          
    +-- | wraps sendFile' to check arguments
    +wrapSendFile' :: Integral i => (a -> b -> i -> i -> IO ()) -> a -> b -> Integer -> Integer -> IO ()
    +wrapSendFile' fun outp inp off count
    +    | off < 0    = error "SendFile - offset must be a positive integer"
    +    | count < 0  = error "SendFile - count must be a positive integer"
    +    | count == 0 = return () -- Send nothing -- why do the work? Also, Windows and FreeBSD treat '0' as 'send the whole file'.
    +    | otherwise  = fun outp inp (fromIntegral off) (fromIntegral count)
    +
    +#if !defined(PORTABLE_SENDFILE)
    +handleToFd :: Handle -> IO Fd
    +#ifdef __GLASGOW_HASKELL__
    +#if __GLASGOW_HASKELL__ >= 611
    +handleToFd h = withHandle "handleToFd" h $ \ Handle__{..} -> do
    +  case cast haDevice of
    +    Nothing -> ioError (ioeSetErrorString (mkIOError IllegalOperation
    +                                           "handleToFd" (Just h) Nothing) 
    +                        "handle is not a file descriptor")
    +    Just fd -> do
    +     return (Handle__{..} , Fd (fromIntegral (FD.fdFD fd)))
    +#else
    +handleToFd h = withHandle "handleToFd" h $ \ h_ -> do
    +  return (h_, Fd (fromIntegral (haFD h_)))
    +#endif
    +#endif
    +#endif
    +
    + addfile ./docs/0.5.0/sendfile/src/Network-Socket-SendFile-Linux.html hunk ./docs/0.5.0/sendfile/src/Network-Socket-SendFile-Linux.html 1 + + + + +dist/build/Network/Socket/SendFile/Linux.hs + + + +
    {-# LINE 1 "src/Network/Socket/SendFile/Linux.hsc" #-}
    +{-# LANGUAGE ForeignFunctionInterface #-}
    +{-# LINE 2 "src/Network/Socket/SendFile/Linux.hsc" #-}
    +-- | Linux system-dependent code for 'sendfile'.
    +module Network.Socket.SendFile.Linux (_sendFile) where
    +import Data.Int
    +import Data.Word
    +import Foreign.C.Error (eAGAIN, getErrno, throwErrno)
    +import Foreign.Marshal (alloca)
    +import Foreign.Ptr (Ptr)
    +import Foreign.Storable(poke)
    +import System.Posix.Types (Fd)
    +import Control.Concurrent (threadWaitWrite)
    +
    +
    +{-# LINE 14 "src/Network/Socket/SendFile/Linux.hsc" #-}
    +
    +_sendFile :: Fd -> Fd -> Int64 -> Int64 -> IO ()
    +_sendFile out_fd in_fd off count = do
    +    alloca $ \poff -> do
    +    poke poff off
    +    rsendfile out_fd in_fd poff count
    +
    +rsendfile :: Fd -> Fd -> Ptr Int64 -> Int64 -> IO ()
    +rsendfile _      _     _    0         = return ()
    +rsendfile out_fd in_fd poff remaining = do
    +    let bytes = min remaining maxBytes
    +    sbytes <- sendfile out_fd in_fd poff bytes
    +    rsendfile out_fd in_fd poff (remaining - sbytes)
    +    
    +sendfile :: Fd -> Fd -> Ptr Int64 -> Int64 -> IO Int64
    +sendfile out_fd in_fd poff bytes = do
    +    threadWaitWrite out_fd
    +    sbytes <- c_sendfile out_fd in_fd poff (fromIntegral bytes)
    +    if sbytes <= -1
    +      then do errno <- getErrno
    +              if errno == eAGAIN
    +                then sendfile out_fd in_fd poff bytes
    +                else throwErrno "Network.Socket.SendFile.Linux"
    +      else return (fromIntegral sbytes)
    +
    +-- max num of bytes in one send
    +maxBytes :: Int64
    +maxBytes = fromIntegral (maxBound :: (Int32))
    +{-# LINE 42 "src/Network/Socket/SendFile/Linux.hsc" #-}
    +
    +-- sendfile64 gives LFS support
    +foreign import ccall unsafe "sendfile64" c_sendfile
    +    :: Fd -> Fd -> Ptr (Int64) -> (Word32) -> IO (Int32)
    +{-# LINE 46 "src/Network/Socket/SendFile/Linux.hsc" #-}
    +
    +
    + addfile ./docs/0.5.0/sendfile/src/Network-Socket-SendFile.html hunk ./docs/0.5.0/sendfile/src/Network-Socket-SendFile.html 1 + + + + +src/Network/Socket/SendFile.hs + + + +
    -- | A cross-platform wrapper for sendfile -- this implements an available operating-system call if supported, otherwise it falls back to a portable haskell implementation.
    +--
    +--   Two interfaces are provided for both the unsafe and safe sets of functions. The first interface accepts an output socket\/handle and the path of the file you want to send; sendFile and unsafeSendFile comprise this interface. The second interface accepts an output socket\/handle, a handle to the file you want to send, an offset, and the number of bytes you want to send; sendFile' and unsafeSendFile' comprise this interface.
    +--
    +--   For consistent read/write behavior with either sendFile' or unsafeSendFile', the input handle should be opened in Binary mode rather than Text mode.
    +--
    +
    +module Network.Socket.SendFile (
    +    ByteCount,
    +    Offset,
    +    -- * Safe functions (recommended)
    +    sendFile,
    +    sendFile',
    +    unsafeSendFile,
    +    unsafeSendFile',
    +    -- * Utility functions
    +    sendFileMode
    +    ) where
    +import qualified Network.Socket.SendFile.Internal (sendFile, sendFile', unsafeSendFile, unsafeSendFile', sendFileMode)
    +import Network.Socket (Socket)
    +import System.IO (Handle)
    +
    +-- | The file offset (in bytes) to start from
    +type Offset = Integer
    +
    +-- | The length (in bytes) which should be sent
    +type ByteCount = Integer
    +
    +-- | The simplest interface. Simply give it an output `Socket` and the `FilePath` to the input file.
    +sendFile
    +    :: Socket   -- ^ The output socket
    +    -> FilePath -- ^ The path where the input file resides
    +    -> IO ()
    +sendFile = Network.Socket.SendFile.Internal.sendFile
    +
    +-- | A more powerful interface than sendFile which accepts a starting offset, and the bytecount to send; the offset and the count must be a positive integer. The initial position of the input file handle matters not since the offset is absolute, and the final position may be different depending on the platform -- no assumptions can be made.
    +sendFile'
    +    :: Socket    -- ^ The output socket
    +    -> FilePath    -- ^ The input file handle
    +    -> Offset    -- ^ The offset to start at
    +    -> ByteCount -- ^ The number of bytes to send
    +    -> IO ()
    +sendFile' = Network.Socket.SendFile.Internal.sendFile'
    +
    +-- | The unsafe version of sendFile which accepts a `Handle` instead of a `Socket` for the output.  It will flush the output handle before sending any file data.
    +unsafeSendFile
    +    :: Handle   -- ^ The output handle
    +    -> FilePath -- ^ The path where the input file resides
    +    -> IO ()
    +unsafeSendFile = Network.Socket.SendFile.Internal.unsafeSendFile
    +
    +-- | The unsafe version of sendFile' which accepts a `Handle` instead of a `Socket` for the output. It will flush the output handle before sending any file data.
    +unsafeSendFile'
    +    :: Handle    -- ^ The output handle
    +    -> FilePath  -- ^ The input filepath
    +    -> Offset    -- ^ The offset to start at
    +    -> ByteCount -- ^ The number of bytes to send
    +    -> IO ()
    +unsafeSendFile' = Network.Socket.SendFile.Internal.unsafeSendFile'
    +
    +-- | Returns the mode that sendfile was compiled with. Mainly for debugging use.
    +-- | Possible values are 'WIN32_SENDFILE', 'LINUX_SENDFILE', 'FREEBSD_SENDFILE',
    +-- | 'DARWIN_SENDFILE', and 'PORTABLE_SENDFILE'.
    +sendFileMode :: String -- ^ The mode that sendfile was compiled with
    +sendFileMode = Network.Socket.SendFile.Internal.sendFileMode
    +
    +
    + addfile ./docs/0.5.0/sendfile/src/hscolour.css hunk ./docs/0.5.0/sendfile/src/hscolour.css 1 +.hs-keyglyph, .hs-layout {color: red;} +.hs-keyword {color: blue;} +.hs-comment, .hs-comment a {color: green;} +.hs-str, .hs-chr {color: teal;} +.hs-keyword, .hs-conid, .hs-varid, .hs-conop, .hs-varop, .hs-num, .hs-cpp, .hs-sel, .hs-definition {} hunk ./happstack.com.cabal 2 -Version: 0.0.20 +Version: 0.0.21