packages feed

http2 0.1.2 → 0.2.0

raw patch · 26 files changed

+715/−941 lines, 26 filesdep ~basedep ~bytestringdep ~containersnew-component:exe:hpack-stat

Dependency ranges changed: base, bytestring, containers

Files

Network/HPACK.hs view
@@ -3,12 +3,8 @@   -- * Encoding and decoding     HPACKEncoding   , HPACKDecoding-  -- * Request-  , encodeRequestHeader-  , decodeRequestHeader-  -- * Response-  , encodeResponseHeader-  , decodeResponseHeader+  , encodeHeader+  , decodeHeader   -- * Contenxt   , Context   , newContextForEncoding@@ -35,7 +31,6 @@ import Control.Exception (throwIO) import Network.HPACK.Context (Context, newContextForEncoding, newContextForDecoding, HeaderSet) import Network.HPACK.HeaderBlock (toHeaderBlock, fromHeaderBlock, toByteStream, fromByteStream)-import Network.HPACK.Huffman (huffmanEncodeInRequest, huffmanDecodeInRequest, huffmanEncodeInResponse, huffmanDecodeInResponse) import Network.HPACK.Table (Size) import Network.HPACK.Types @@ -50,35 +45,15 @@ ----------------------------------------------------------------  -- | Converting 'HeaderSet' for HTTP request to the low level format.-encodeRequestHeader :: EncodeStrategy -> HPACKEncoding-encodeRequestHeader stgy ctx hs = second toBS <$> toHeaderBlock algo ctx hs+encodeHeader :: EncodeStrategy -> HPACKEncoding+encodeHeader stgy ctx hs = second toBS <$> toHeaderBlock algo ctx hs   where     algo = compressionAlgo stgy-    toBS-      | useHuffman stgy = toByteStream huffmanEncodeInRequest True-      | otherwise       = toByteStream id                     False+    toBS = toByteStream (useHuffman stgy)  -- | Converting the low level format for HTTP request to 'HeaderSet'. --   'DecodeError' would be thrown.-decodeRequestHeader :: HPACKDecoding-decodeRequestHeader ctx bs = either throwIO (fromHeaderBlock ctx) ehb-  where-    ehb = fromByteStream huffmanDecodeInRequest bs---------------------------------------------------------------------- | Converting 'HeaderSet' for HTTP response to the low level format.-encodeResponseHeader :: EncodeStrategy -> HPACKEncoding-encodeResponseHeader stgy ctx hs = second toBS <$> toHeaderBlock algo ctx hs-  where-    algo = compressionAlgo stgy-    toBS-      | useHuffman stgy = toByteStream huffmanEncodeInResponse True-      | otherwise       = toByteStream id                      False---- | Converting the low level format for HTTP response to 'HeaderSet'.---   'DecodeError' would be thrown.-decodeResponseHeader :: HPACKDecoding-decodeResponseHeader ctx bs = either throwIO (fromHeaderBlock ctx) ehb+decodeHeader :: HPACKDecoding+decodeHeader ctx bs = either throwIO (fromHeaderBlock ctx) ehb   where-    ehb = fromByteStream huffmanDecodeInResponse bs+    ehb = fromByteStream bs
Network/HPACK/HeaderBlock/Decode.hs view
@@ -10,29 +10,27 @@ import Network.HPACK.HeaderBlock.HeaderField import qualified Network.HPACK.HeaderBlock.Integer as I import qualified Network.HPACK.HeaderBlock.String as S-import Network.HPACK.Huffman import Network.HPACK.Types  ----------------------------------------------------------------  -- | Converting the low level format to 'HeaderBlock'.-fromByteStream :: HuffmanDecoding -> ByteStream-               -> Either DecodeError HeaderBlock-fromByteStream hd inp = go inp empty+fromByteStream :: ByteStream -> Either DecodeError HeaderBlock+fromByteStream inp = go inp empty   where     go bs builder       | BS.null bs = Right $ run builder       | otherwise  = do-        (hf, bs') <- toHeaderField hd bs+        (hf, bs') <- toHeaderField bs         go bs' (builder << hf) -toHeaderField :: HuffmanDecoding -> ByteString+toHeaderField :: ByteString               -> Either DecodeError (HeaderField, ByteString)-toHeaderField hd bs+toHeaderField bs   | BS.null bs    = Left EmptyBlock   | w `testBit` 7 = Right $ indexed w bs'-  | w `testBit` 6 = withoutIndexing hd w bs'-  | otherwise     = incrementalIndexing hd w bs'+  | w `testBit` 6 = withoutIndexing w bs'+  | otherwise     = incrementalIndexing w bs'   where     w = BS.head bs     bs' = BS.tail bs@@ -45,24 +43,24 @@     w' = clearBit w 7     (idx, ws') = I.parseInteger 7 w' ws -withoutIndexing :: HuffmanDecoding -> Word8 -> ByteString+withoutIndexing :: Word8 -> ByteString                 -> Either DecodeError (HeaderField, ByteString)-withoutIndexing hd w ws-  | isIndexedName w = indexedName NotAdd hd w ws-  | otherwise       = newName NotAdd hd ws+withoutIndexing w ws+  | isIndexedName w = indexedName NotAdd w ws+  | otherwise       = newName NotAdd ws -incrementalIndexing :: HuffmanDecoding -> Word8 -> ByteString+incrementalIndexing :: Word8 -> ByteString                     -> Either DecodeError (HeaderField, ByteString)-incrementalIndexing hd w ws-  | isIndexedName w = indexedName Add hd w ws-  | otherwise       = newName Add hd ws+incrementalIndexing w ws+  | isIndexedName w = indexedName Add w ws+  | otherwise       = newName Add ws  ---------------------------------------------------------------- -indexedName :: Indexing -> HuffmanDecoding -> Word8 -> ByteString+indexedName :: Indexing -> Word8 -> ByteString             -> Either DecodeError (HeaderField, ByteString)-indexedName indexing hd w ws = do-    (val,ws'') <- headerStuff hd ws'+indexedName indexing w ws = do+    (val,ws'') <- headerStuff ws'     let hf = Literal indexing (Idx idx) val     return (hf, ws'')   where@@ -70,21 +68,21 @@     (idx,ws') = I.parseInteger 6 p ws  -newName :: Indexing -> HuffmanDecoding -> ByteString+newName :: Indexing -> ByteString         -> Either DecodeError (HeaderField, ByteString)-newName indexing hd ws = do-    (key,ws')  <- headerStuff hd ws-    (val,ws'') <- headerStuff hd ws'+newName indexing ws = do+    (key,ws')  <- headerStuff ws+    (val,ws'') <- headerStuff ws'     let hf = Literal indexing (Lit key) val     return (hf, ws'')  ---------------------------------------------------------------- -headerStuff :: HuffmanDecoding -> ByteString+headerStuff :: ByteString             -> Either DecodeError (HeaderStuff, ByteString)-headerStuff hd bs+headerStuff bs   | BS.null bs  = Left EmptyEncodedString-  | otherwise   = S.parseString hd huff len bs''+  | otherwise   = S.parseString huff len bs''   where     w = BS.head bs     bs' = BS.tail bs
Network/HPACK/HeaderBlock/Encode.hs view
@@ -12,23 +12,22 @@ import Network.HPACK.HeaderBlock.HeaderField import qualified Network.HPACK.HeaderBlock.Integer as I import qualified Network.HPACK.HeaderBlock.String as S-import Network.HPACK.Huffman import Network.HPACK.Types  ----------------------------------------------------------------  -- | Converting 'HeaderBlock' to the low level format.-toByteStream :: HuffmanEncoding -> Bool -> HeaderBlock -> ByteStream-toByteStream he huff hbs = BB.toByteString $ foldl' (<>) mempty $ map toBB hbs+toByteStream :: Bool -> HeaderBlock -> ByteStream+toByteStream huff hbs = BB.toByteString $ foldl' (<>) mempty $ map toBB hbs   where-    toBB = fromHeaderField he huff+    toBB = fromHeaderField huff -fromHeaderField :: HuffmanEncoding -> Bool -> HeaderField -> Builder-fromHeaderField _  _    (Indexed idx)                = index idx-fromHeaderField he huff (Literal NotAdd (Idx idx) v) = indexedName he huff set01 idx v-fromHeaderField he huff (Literal NotAdd (Lit key) v) = newName     he huff set01 key v-fromHeaderField he huff (Literal Add    (Idx idx) v) = indexedName he huff set00 idx v-fromHeaderField he huff (Literal Add    (Lit key) v) = newName     he huff set00 key v+fromHeaderField :: Bool -> HeaderField -> Builder+fromHeaderField _    (Indexed idx)                = index idx+fromHeaderField huff (Literal NotAdd (Idx idx) v) = indexedName huff set01 idx v+fromHeaderField huff (Literal NotAdd (Lit key) v) = newName     huff set01 key v+fromHeaderField huff (Literal Add    (Idx idx) v) = indexedName huff set00 idx v+fromHeaderField huff (Literal Add    (Lit key) v) = newName     huff set00 key v  ---------------------------------------------------------------- @@ -39,12 +38,12 @@     w' = set1 w  -- Using Huffman encoding-indexedName :: HuffmanEncoding -> Bool -> Setter -> Int -> HeaderValue -> Builder-indexedName he huff set idx v = pre <> vlen <> val+indexedName :: Bool -> Setter -> Int -> HeaderValue -> Builder+indexedName huff set idx v = pre <> vlen <> val   where     (p:ps) = I.encode 6 idx     pre = BB.fromWord8s $ set p : ps-    value = S.encode he v+    value = S.encode huff v     valueLen = BS.length value     vlen       | huff      = BB.fromWord8s $ setH $ I.encode 7 valueLen@@ -52,13 +51,13 @@     val = BB.fromByteString value  -- Using Huffman encoding-newName :: HuffmanEncoding -> Bool -> Setter -> HeaderName -> HeaderValue -> Builder-newName he huff set k v = pre <> klen <> key <> vlen <> val+newName :: Bool -> Setter -> HeaderName -> HeaderValue -> Builder+newName huff set k v = pre <> klen <> key <> vlen <> val   where     pre = BB.fromWord8 $ set 0-    key0 = S.encode he k+    key0 = S.encode huff k     keyLen = BS.length key0-    value = S.encode he v+    value = S.encode huff v     valueLen = BS.length value     klen       | huff      = BB.fromWord8s $ setH $ I.encode 7 keyLen
Network/HPACK/HeaderBlock/String.hs view
@@ -1,26 +1,31 @@-module Network.HPACK.HeaderBlock.String where+module Network.HPACK.HeaderBlock.String (+    encode+  , parseString+  ) where  import Data.ByteString (ByteString) import qualified Data.ByteString as BS-import Network.HPACK.Huffman+import qualified Network.HPACK.Huffman as Huffman import Network.HPACK.Types  -- | Encoding 'HeaderStuff' to 'ByteString' according to 'HuffmanEncoding'.-encode :: HuffmanEncoding -> HeaderStuff -> ByteString-encode he h = he h+encode :: Bool -> HeaderStuff -> ByteString+encode True h = Huffman.encode h+encode _    h = h +-- fixme: removing -- | Decoding 'ByteString' to 'HeaderStuff' according to 'HuffmanDecoding'.-decode :: HuffmanDecoding -> ByteString -> Either DecodeError HeaderStuff-decode hd ws = hd ws+decode :: ByteString -> Either DecodeError HeaderStuff+decode ws = Huffman.decode ws  -- | Parsing 'HeaderStuff' from 'ByteString'. --   The second 'Bool' is whether or not huffman encoding is used. --   The third 'Int' is the length of the encoded string.-parseString :: HuffmanDecoding -> Bool -> Int -> ByteString+parseString :: Bool -> Int -> ByteString             -> Either DecodeError (HeaderStuff, ByteString)-parseString _  False len bs = Right (es, bs')+parseString False len bs = Right (es, bs')   where     (es, bs') = BS.splitAt len bs-parseString hd True  len bs = decode hd es >>= \x -> return (x,bs')+parseString True  len bs = decode es >>= \x -> return (x,bs')   where     (es, bs') = BS.splitAt len bs
Network/HPACK/HeaderBlock/To.hs view
@@ -20,6 +20,7 @@               -> HeaderSet               -> IO (Context, HeaderBlock) toHeaderBlock Naive  !ctx hs = reset ctx >>= encodeLoop naiveStep  hs+toHeaderBlock Static !ctx hs = reset ctx >>= encodeLoop staticStep hs toHeaderBlock Linear !ctx hs = reset ctx >>= encodeLoop linearStep hs toHeaderBlock Diff   !ctx hs = encodeLoop diffStep hs (ctx, empty) @@ -53,6 +54,20 @@ naiveStep :: Step naiveStep (!ctx,!builder) (k,v) = do     let builder' = builder << Literal NotAdd (Lit k) v+    return (ctx, builder')++----------------------------------------------------------------++staticStep :: Step+staticStep (!ctx,!builder) h@(k,v) = do+    let cache = lookupHeader h ctx+        b = case cache of+            None                     -> Literal NotAdd (Lit k) v+            KeyOnly  InStaticTable i -> Literal NotAdd (Idx i) v+            KeyOnly  InHeaderTable _ -> Literal NotAdd (Lit k) v+            KeyValue InStaticTable i -> Literal NotAdd (Idx i) v+            KeyValue InHeaderTable _ -> Literal NotAdd (Lit k) v+    let builder' = builder << b     return (ctx, builder')  ----------------------------------------------------------------
Network/HPACK/Huffman.hs view
@@ -3,13 +3,9 @@     HuffmanEncoding   , HuffmanDecoding   -- * Encoding/decoding-  , huffmanEncodeInRequest-  , huffmanDecodeInRequest-  , huffmanEncodeInResponse-  , huffmanDecodeInResponse+  , encode+  , decode   ) where  import Network.HPACK.Huffman.Decode import Network.HPACK.Huffman.Encode-import Network.HPACK.Huffman.Request-import Network.HPACK.Huffman.Response
Network/HPACK/Huffman/Decode.hs view
@@ -1,8 +1,6 @@ module Network.HPACK.Huffman.Decode (   -- * Huffman decoding-    Decoder-  , toDecoder-  , HuffmanDecoding+    HuffmanDecoding   , decode   ) where @@ -13,6 +11,7 @@ import Network.HPACK.Huffman.Bit import Network.HPACK.Huffman.ByteString import Network.HPACK.Huffman.Params+import Network.HPACK.Huffman.Table import Network.HPACK.Huffman.Tree import Network.HPACK.Types (DecodeError(..)) @@ -35,18 +34,16 @@ next :: Way16 -> Word8 -> Pin next (Way16 _ a16) w = a16 ! w -newtype Decoder = Decoder Way256- ----------------------------------------------------------------  -- | Huffman decoding.-decode :: Decoder -> HuffmanDecoding-decode (Decoder way256) bs = dec way256 qs+decode :: HuffmanDecoding+decode bs = dec qs   where     qs = unpack4bits bs -dec :: Way256 -> [Word8] -> Either DecodeError ByteString-dec way256 inp = go (way256 ! 0) inp w8empty+dec :: [Word8] -> Either DecodeError ByteString+dec inp = go (way256 ! 0) inp w8empty   where     go :: Way16 -> [Word8] -> Word8Builder -> Either DecodeError ByteString     go (Way16 Nothing  _) [] _       = Left IllegalEos@@ -60,11 +57,11 @@  ---------------------------------------------------------------- -toDecoder :: [Bits] -> Decoder-toDecoder = construct . toHTree+way256 :: Way256+way256 = construct $ toHTree huffmanTable -construct :: HTree -> Decoder-construct decoder = Decoder $ listArray (0,255) $ map to16ways $ flatten decoder+construct :: HTree -> Way256+construct decoder = listArray (0,255) $ map to16ways $ flatten decoder   where     to16ways x = Way16 ei a16       where
Network/HPACK/Huffman/Encode.hs view
@@ -2,9 +2,7 @@  module Network.HPACK.Huffman.Encode (   -- * Huffman encoding-    Encoder-  , toEncoder-  , HuffmanEncoding+    HuffmanEncoding   , encode   ) where @@ -21,12 +19,12 @@ import Network.HPACK.Huffman.Bit import Network.HPACK.Huffman.ByteString import Network.HPACK.Huffman.Params+import Network.HPACK.Huffman.Table import System.IO.Unsafe (unsafePerformIO)  ---------------------------------------------------------------- --- | Type for Huffman encoding.-newtype Encoder = Encoder (Array Int ShiftedArray) deriving Show+type AOSA = Array Int ShiftedArray  type ShiftedArray = Array Int Shifted @@ -37,9 +35,8 @@  ---------------------------------------------------------------- --- | Creating 'Encoder'.-toEncoder :: [Bits] -> Encoder-toEncoder bss = Encoder $ listArray (0,idxEos) $ map toShiftedArray bss+aosa :: AOSA+aosa = listArray (0,idxEos) $ map toShiftedArray huffmanTable  -- fixme -- |@@ -78,8 +75,8 @@ type HuffmanEncoding = ByteString -> ByteString  -- | Huffman encoding.-encode :: Encoder -> HuffmanEncoding-encode (Encoder aoa) (PS fptr off len) = unsafePerformIO $ withForeignPtr fptr $ \ptr -> do+encode :: HuffmanEncoding+encode (PS fptr off len) = unsafePerformIO $ withForeignPtr fptr $ \ptr -> do     let beg = ptr `plusPtr` off         end = beg `plusPtr` len     size <- accumSize beg end 0 0@@ -90,7 +87,7 @@       | src == lim = return acc       | otherwise  = do           i <- fromIntegral <$> peek src-          let Shifted l n' _ = (aoa ! i) ! n+          let Shifted l n' _ = (aosa ! i) ! n           let !acc'                | n == 0    = acc + l                | otherwise = acc + l - 1@@ -99,13 +96,13 @@     go dst n src lim       | src == lim = do           when (n /= 0) $ do-              let Shifted _ _ bs = (aoa ! idxEos) ! n+              let Shifted _ _ bs = (aosa ! idxEos) ! n               w0 <- peek dst               let w1 = BS.head bs               poke dst (w0 .|. w1)       | otherwise  = do           i <- fromIntegral <$> peek src-          let Shifted l n' bs = (aoa ! i) ! n+          let Shifted l n' bs = (aosa ! i) ! n           if n == 0 then               copy dst bs             else do
− Network/HPACK/Huffman/Request.hs
@@ -1,289 +0,0 @@-module Network.HPACK.Huffman.Request (-    huffmanEncodeInRequest-  , huffmanDecodeInRequest-  ) where--import Network.HPACK.Huffman.Bit-import Network.HPACK.Huffman.Decode-import Network.HPACK.Huffman.Encode--------------------------------------------------------------------encoderForRequest :: Encoder-encoderForRequest = toEncoder huffmanRequest---- | Hoffman encoding in HTTP/2.0 request.-huffmanEncodeInRequest :: HuffmanEncoding-huffmanEncodeInRequest = encode encoderForRequest--------------------------------------------------------------------decoderForRequest :: Decoder-decoderForRequest = toDecoder huffmanRequest---- | Hoffman decoding in HTTP/2.0 request.-huffmanDecodeInRequest :: HuffmanDecoding-huffmanDecodeInRequest = decode decoderForRequest--------------------------------------------------------------------huffmanRequest :: [Bits]-huffmanRequest = [-    [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]-  , [T,T,T,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,F,F,T,F,F]-  , [T,T,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,F,T,F,F,T]-  , [T,F,F,T,F,T]-  , [F,F,T,F,F]-  , [F,F,F,F]-  , [F,F,T,F,T]-  , [F,F,T,T,F]-  , [F,F,T,T,T]-  , [T,F,F,T,T,F]-  , [T,F,F,T,T,T]-  , [T,F,T,F,F,F]-  , [T,F,T,F,F,T]-  , [T,F,T,F,T,F]-  , [T,F,T,F,T,T]-  , [T,F,T,T,F,F]-  , [T,T,T,T,F,T,T,F,F]-  , [T,T,T,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]-  , [T,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,F,T,T]-  , [T,T,F,T,T,T,T]-  , [T,T,T,F,T,F,T,T]-  , [T,T,T,F,T,T,F,F]-  , [T,T,T,F,T,T,F,T]-  , [T,T,T,F,T,T,T,F]-  , [T,T,T,F,F,F,F]-  , [T,T,T,T,F,T,T,T,F]-  , [T,T,T,T,F,T,T,T,T]-  , [T,T,T,T,T,F,F,F,F]-  , [T,T,T,T,T,F,F,F,T]-  , [T,T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,F,F,T,F]-  , [T,T,T,F,T,T,T,T]-  , [T,T,T,T,T,F,F,T,T]-  , [T,T,T,T,T,F,T,F,F]-  , [T,T,T,T,T,F,T,F,T]-  , [T,T,T,T,T,F,T,T,F]-  , [T,T,T,T,T,F,T,T,T]-  , [T,T,T,T,F,F,F,F]-  , [T,T,T,T,F,F,F,T]-  , [T,T,T,T,T,T,F,F,F]-  , [T,T,T,T,T,T,F,F,T]-  , [T,T,T,T,T,T,F,T,F]-  , [T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]-  , [F,T,F,F,F]-  , [T,F,T,T,T,T]-  , [F,T,F,F,T]-  , [T,T,F,F,F,F]-  , [F,F,F,T]-  , [T,T,F,F,F,T]-  , [T,T,F,F,T,F]-  , [T,T,F,F,T,T]-  , [F,T,F,T,F]-  , [T,T,T,F,F,F,T]-  , [T,T,T,F,F,T,F]-  , [F,T,F,T,T]-  , [T,T,F,T,F,F]-  , [F,T,T,F,F]-  , [F,T,T,F,T]-  , [F,T,T,T,F]-  , [T,T,T,T,F,F,T,F]-  , [F,T,T,T,T]-  , [T,F,F,F,F]-  , [T,F,F,F,T]-  , [T,T,F,T,F,T]-  , [T,T,T,F,F,T,T]-  , [T,T,F,T,T,F]-  , [T,T,T,T,F,F,T,T]-  , [T,T,T,T,F,T,F,F]-  , [T,T,T,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]-  ]
− Network/HPACK/Huffman/Response.hs
@@ -1,288 +0,0 @@-module Network.HPACK.Huffman.Response (-    huffmanEncodeInResponse-  , huffmanDecodeInResponse-  ) where--import Network.HPACK.Huffman.Bit-import Network.HPACK.Huffman.Decode-import Network.HPACK.Huffman.Encode--------------------------------------------------------------------encoderForResponse :: Encoder-encoderForResponse = toEncoder huffmanResponse---- | Hoffman encoding in HTTP/2.0 request.-huffmanEncodeInResponse :: HuffmanEncoding-huffmanEncodeInResponse = encode encoderForResponse--------------------------------------------------------------------decoderForResponse :: Decoder-decoderForResponse = toDecoder huffmanResponse---- | Hoffman decoding in HTTP/2.0 request.-huffmanDecodeInResponse :: HuffmanDecoding-huffmanDecodeInResponse = decode decoderForResponse--------------------------------------------------------------------huffmanResponse :: [Bits]-huffmanResponse = [-    [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]-  , [F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,F,T,F]-  , [T,T,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,F,T,T,F,F]-  , [T,T,T,T,T,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,F,T,T,F,T]-  , [T,T,T,T,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,F,T,F]-  , [T,F,F,F,T,F]-  , [T,F,F,F,T,T]-  , [T,F,F,T,F,F]-  , [T,T,F,T,F,T,T]-  , [F,F,F,T]-  , [F,F,T,F]-  , [F,F,T,T]-  , [F,T,F,F,F]-  , [F,T,F,F,T]-  , [F,T,F,T,F]-  , [T,F,F,T,F,T]-  , [T,F,F,T,T,F]-  , [F,T,F,T,T]-  , [F,T,T,F,F]-  , [F,T,T,F,T]-  , [T,T,T,T,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]-  , [T,T,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]-  , [T,T,F,T,T,F,T]-  , [T,T,T,F,T,F,T,F]-  , [T,T,T,F,T,F,T,T]-  , [T,T,T,F,T,T,F,F]-  , [T,T,T,F,T,T,F,T]-  , [T,T,T,F,T,T,T,F]-  , [T,F,F,T,T,T]-  , [T,T,T,T,T,F,F,F,F]-  , [T,T,T,F,T,T,T,T]-  , [T,T,T,T,F,F,F,F]-  , [T,T,T,T,T,T,T,F,F,T]-  , [T,T,T,T,T,F,F,F,T]-  , [T,F,T,F,F,F]-  , [T,T,T,T,F,F,F,T]-  , [T,T,T,T,F,F,T,F]-  , [T,T,T,T,T,F,F,T,F]-  , [T,T,T,T,T,T,T,F,T,F]-  , [T,T,T,T,T,F,F,T,T]-  , [T,F,T,F,F,T]-  , [F,T,T,T,F]-  , [T,T,T,T,T,F,T,F,F]-  , [T,T,T,T,T,F,T,F,T]-  , [T,T,T,T,F,F,T,T]-  , [T,T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]-  , [F,T,T,T,T]-  , [T,T,F,T,T,T,F]-  , [T,F,T,F,T,F]-  , [T,F,T,F,T,T]-  , [T,F,F,F,F]-  , [T,T,F,T,T,T,T]-  , [T,T,T,F,F,F,F]-  , [T,T,T,F,F,F,T]-  , [T,F,T,T,F,F]-  , [T,T,T,T,T,T,F,F,F]-  , [T,T,T,T,T,T,F,F,T]-  , [T,T,T,F,F,T,F]-  , [T,F,T,T,F,T]-  , [T,F,T,T,T,F]-  , [T,F,T,T,T,T]-  , [T,T,F,F,F,F]-  , [T,T,T,T,T,T,F,T,F]-  , [T,T,F,F,F,T]-  , [T,T,F,F,T,F]-  , [T,T,F,F,T,T]-  , [T,T,F,T,F,F]-  , [T,T,T,F,F,T,T]-  , [T,T,T,T,F,T,F,F]-  , [T,T,T,F,T,F,F]-  , [T,T,T,T,F,T,F,T]-  , [T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]-  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]]
+ Network/HPACK/Huffman/Table.hs view
@@ -0,0 +1,266 @@+module Network.HPACK.Huffman.Table where++import Network.HPACK.Huffman.Bit++huffmanTable :: [Bits]+huffmanTable = [+    [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]+  , [T,T,T,F,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+  , [T,F,F,T,F,F]+  , [T,T,F,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+  , [T,T,T,T,T,T,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,F,T,T]+  , [T,T,T,T,T,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,F,T,F,F,T]+  , [T,F,F,T,F,T]+  , [F,F,T,F,F]+  , [F,F,F,F]+  , [F,F,T,F,T]+  , [F,F,T,T,F]+  , [F,F,T,T,T]+  , [T,F,F,T,T,F]+  , [T,F,F,T,T,T]+  , [T,F,T,F,F,F]+  , [T,F,T,F,F,T]+  , [T,F,T,F,T,F]+  , [T,F,T,F,T,T]+  , [T,F,T,T,F,F]+  , [T,T,T,T,F,T,T,F,F]+  , [T,T,T,F,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+  , [T,F,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,F,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,F,T,T]+  , [T,T,F,T,T,T,T]+  , [T,T,T,F,T,F,T,T]+  , [T,T,T,F,T,T,F,F]+  , [T,T,T,F,T,T,F,T]+  , [T,T,T,F,T,T,T,F]+  , [T,T,T,F,F,F,F]+  , [T,T,T,T,F,T,T,T,F]+  , [T,T,T,T,F,T,T,T,T]+  , [T,T,T,T,T,F,F,F,F]+  , [T,T,T,T,T,F,F,F,T]+  , [T,T,T,T,T,T,T,F,T,T]+  , [T,T,T,T,T,F,F,T,F]+  , [T,T,T,F,T,T,T,T]+  , [T,T,T,T,T,F,F,T,T]+  , [T,T,T,T,T,F,T,F,F]+  , [T,T,T,T,T,F,T,F,T]+  , [T,T,T,T,T,F,T,T,F]+  , [T,T,T,T,T,F,T,T,T]+  , [T,T,T,T,F,F,F,F]+  , [T,T,T,T,F,F,F,T]+  , [T,T,T,T,T,T,F,F,F]+  , [T,T,T,T,T,T,F,F,T]+  , [T,T,T,T,T,T,F,T,F]+  , [T,T,T,T,T,T,F,T,T]+  , [T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,F,T]+  , [T,F,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+  , [F,T,F,F,F]+  , [T,F,T,T,T,T]+  , [F,T,F,F,T]+  , [T,T,F,F,F,F]+  , [F,F,F,T]+  , [T,T,F,F,F,T]+  , [T,T,F,F,T,F]+  , [T,T,F,F,T,T]+  , [F,T,F,T,F]+  , [T,T,T,F,F,F,T]+  , [T,T,T,F,F,T,F]+  , [F,T,F,T,T]+  , [T,T,F,T,F,F]+  , [F,T,T,F,F]+  , [F,T,T,F,T]+  , [F,T,T,T,F]+  , [T,T,T,T,F,F,T,F]+  , [F,T,T,T,T]+  , [T,F,F,F,F]+  , [T,F,F,F,T]+  , [T,T,F,T,F,T]+  , [T,T,T,F,F,T,T]+  , [T,T,F,T,T,F]+  , [T,T,T,T,F,F,T,T]+  , [T,T,T,T,F,T,F,F]+  , [T,T,T,T,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,T,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,F,T,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,F,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,F]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,F,T,T]+  , [T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,T,T,T,F,F]+  ]++
Network/HPACK/Types.hs view
@@ -40,6 +40,7 @@  -- | Compression algorithms for HPACK encoding. data CompressionAlgo = Naive  -- ^ No compression+                     | Static -- ^ Using the static table only                      | Linear -- ^ Using indices only                      | Diff   -- ^ Calculating difference 
http2.cabal view
@@ -1,12 +1,12 @@ Name:                   http2-Version:                0.1.2+Version:                0.2.0 Author:                 Kazu Yamamoto <kazu@iij.ad.jp> Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp> License:                BSD3 License-File:           LICENSE Synopsis:               HTTP/2.0 library including HPACK Description:            HTTP/2.0 library including HPACK.-                        Currently only (coming) HPACK 06 is supported.+                        Currently only HPACK 06 is supported. Category:               Network Cabal-Version:          >= 1.10 Build-Type:             Simple@@ -26,8 +26,7 @@                         Network.HPACK.Huffman.Decode                         Network.HPACK.Huffman.Encode                         Network.HPACK.Huffman.Params-                        Network.HPACK.Huffman.Request-                        Network.HPACK.Huffman.Response+                        Network.HPACK.Huffman.Table                         Network.HPACK.Huffman.Tree                         Network.HPACK.HeaderBlock                         Network.HPACK.HeaderBlock.Decode@@ -55,6 +54,7 @@   HS-Source-Dirs:       test-hpack, .   GHC-Options:          -Wall   Main-Is:              hpack-encode.hs+  Other-Modules:        HPACKEncode   Build-Depends:        base >= 4 && < 5                       , PSQueue                       , aeson@@ -85,6 +85,26 @@                       , vector                       , word8 +Executable hpack-stat+  Default-Language:     Haskell2010+  HS-Source-Dirs:       test-hpack, .+  GHC-Options:          -Wall+  Main-Is:              hpack-stat.hs+  Build-Depends:        base >= 4 && < 5+                      , PSQueue+                      , aeson+                      , aeson-pretty+                      , array+                      , blaze-builder+                      , bytestring+                      , containers+                      , directory+                      , filepath+                      , text+                      , unordered-containers+                      , vector+                      , word8+ Test-Suite doctest   Type:                 exitcode-stdio-1.0   Default-Language:     Haskell2010@@ -104,8 +124,7 @@                         HeaderBlock                         HeaderBlockSpec                         HexString-                        HuffmanRequestSpec-                        HuffmanResponseSpec+                        HuffmanSpec                         IntegerSpec   Build-Depends:        base                       , PSQueue@@ -123,7 +142,7 @@   HS-Source-Dirs:       test-hpack, .   Ghc-Options:          -Wall   Main-Is:              Spec.hs-  Other-Modules:        HPACK+  Other-Modules:        HPACKDecode                         HPACKSpec                         HexString                         Types
− test-hpack/HPACK.hs
@@ -1,106 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module HPACK (run-           , Result(..)-           , EncodeStrategy(..)-           , defaultEncodeStrategy-           , CompressionAlgo(..)-           ) where--import Control.Exception-import Control.Monad (when)-import Data.ByteString (ByteString)-import qualified Data.ByteString.Char8 as B8-import Data.List (sort)-import Network.HPACK-import Network.HPACK.Context-import Network.HPACK.Context.HeaderSet-import Network.HPACK.HeaderBlock-import Network.HPACK.Huffman--import HexString-import Types--data Conf = Conf {-    debug :: Bool-  , enc :: HPACKEncoding-  , dec :: HPACKDecoding-  , hbk :: ByteStream -> Either DecodeError HeaderBlock-  }--data Result = Pass [ByteString] | Fail String deriving (Eq,Show)--run :: Bool -> EncodeStrategy -> Test -> IO Result-run _ _    (Test _ _        _ [])        = return $ Pass []-run d stgy (Test _ reqOrRsp _ ccs@(c:_)) = do-    let siz = size c-    dctx <- newContextForDecoding siz-    ectx <- newContextForEncoding siz-    let conf-          | reqOrRsp == "request" = Conf {-                debug = d-              , enc = encodeRequestHeader stgy-              , dec = decodeRequestHeader-              , hbk = fromByteStream huffmanDecodeInRequest-              }-          | otherwise = Conf {-                debug = d-              , enc = encodeResponseHeader stgy-              , dec = decodeResponseHeader-              , hbk = fromByteStream huffmanDecodeInResponse-              }-    testLoop conf ccs dctx ectx []--testLoop :: Conf-         -> [Case]-         -> Context-         -> Context-         -> [ByteString]-         -> IO Result-testLoop _    []     _    _    hexs = return $ Pass $ reverse hexs-testLoop conf (c:cs) dctx ectx hexs = do-    res <- test conf c dctx ectx-    case res of-        Right (dctx', ectx', hex) -> testLoop conf cs dctx' ectx' (hex:hexs)-        Left e                    -> return $ Fail e--test :: Conf-     -> Case-     -> Context-     -> Context-     -> IO (Either String (Context, Context, ByteString))-test conf c dctx ectx = do-    -- context is destructive!!!-    when (debug conf) $ do-        putStrLn "--------------------------------"-        putStrLn "---- Input headerset"-        printHeaderSet $ sort hs-        putStrLn "---- Input context"-        printContext dctx-        putStrLn "---- Input Hex"-        B8.putStrLn hex-        putStrLn "---- Input header block"-        print hd-    x <- try $ dec conf dctx inp-    case x of-        Left e -> return $ Left $ show (e :: DecodeError)-        Right (dctx',hs') -> do-            -- This is for hpack-encoding only.-            (ectx',out) <- enc conf ectx hs-            let pass = sort hs == sort hs'-                hex' = toHexString out-            when (debug conf) $ do-                putStrLn "---- Output headerset"-                printHeaderSet $ sort hs'-                putStrLn "---- Output context"-                printContext dctx'-                putStrLn "--------------------------------"-            if pass then-                return $ Right (dctx', ectx', hex')-              else-                return $ Left $ "Headers are different in " ++ B8.unpack hex ++ ":\n" ++ show hd ++ "\n" ++ show hs ++ "\n" ++ show hs'-  where-    hex = wire c-    inp = fromHexString hex-    hs = headers c-    hd = hbk conf inp
+ test-hpack/HPACKDecode.hs view
@@ -0,0 +1,77 @@+{-# LANGUAGE OverloadedStrings #-}++module HPACKDecode (+    run+  , Result(..)+  , EncodeStrategy(..)+  , defaultEncodeStrategy+  , CompressionAlgo(..)+  ) where++import Control.Exception+import Control.Monad (when)+import qualified Data.ByteString.Char8 as B8+import Data.List (sort)+import Network.HPACK+import Network.HPACK.Context+import Network.HPACK.Context.HeaderSet+import Network.HPACK.HeaderBlock++import HexString+import Types++data Conf = Conf {+    debug :: Bool+  }++data Result = Pass | Fail String deriving (Eq,Show)++run :: Bool -> Test -> IO Result+run _ (Test _ _ _ [])        = return $ Pass+run d (Test _ _ _ ccs@(c:_)) = do+    let siz = size c+    dctx <- newContextForDecoding siz+    let conf = Conf { debug = d }+    testLoop conf ccs dctx++testLoop :: Conf+         -> [Case]+         -> Context+         -> IO Result+testLoop _    []     _    = return $ Pass+testLoop conf (c:cs) dctx  = do+    res <- test conf c dctx+    case res of+        Right dctx' -> testLoop conf cs dctx'+        Left  e     -> return $ Fail e++test :: Conf+     -> Case+     -> Context+     -> IO (Either String Context)+test conf c dctx = do+    -- context is destructive!!!+    when (debug conf) $ do+        putStrLn "--------------------------------"+        putStrLn "---- Input headerset"+        printHeaderSet $ sort hs+        putStrLn "---- Input context"+        printContext dctx+        putStrLn "---- Input Hex"+        B8.putStrLn hex+        putStrLn "---- Input header block"+        print hd+    x <- try $ decodeHeader dctx inp+    case x of+        Left e -> return $ Left $ show (e :: DecodeError)+        Right (dctx',hs') -> do+            let pass = sort hs == sort hs'+            if pass then+                return $ Right (dctx')+              else+                return $ Left $ "Headers are different in " ++ B8.unpack hex ++ ":\n" ++ show hd ++ "\n" ++ show hs ++ "\n" ++ show hs'+  where+    hex = wire c+    inp = fromHexString hex+    hs = headers c+    hd = fromByteStream inp
+ test-hpack/HPACKEncode.hs view
@@ -0,0 +1,54 @@+{-# LANGUAGE OverloadedStrings #-}++module HPACKEncode (+    run+  , EncodeStrategy(..)+  , defaultEncodeStrategy+  , CompressionAlgo(..)+  ) where++import Control.Monad (when)+import Data.ByteString (ByteString)+import Network.HPACK+import Network.HPACK.Context++import HexString+import Types++data Conf = Conf {+    debug :: Bool+  , enc :: HPACKEncoding+  }++run :: Bool -> EncodeStrategy -> Test -> IO [ByteString]+run _ _    (Test _ _        _ [])        = return []+run d stgy (Test _ _ _ ccs@(c:_)) = do+    let siz = size c+    ectx <- newContextForEncoding siz+    let conf = Conf { debug = d, enc = encodeHeader stgy }+    testLoop conf ccs ectx []++testLoop :: Conf+         -> [Case]+         -> Context+         -> [ByteString]+         -> IO [ByteString]+testLoop _    []     _    hexs = return $ reverse hexs+testLoop conf (c:cs) ectx hexs = do+    (ectx',hex) <- test conf c ectx+    testLoop conf cs ectx' (hex:hexs)++test :: Conf+     -> Case+     -> Context+     -> IO (Context, ByteString)+test conf c ectx = do+    (ectx',out) <- enc conf ectx hs+    let hex' = toHexString out+    when (debug conf) $ do+        putStrLn "---- Output context"+        printContext ectx'+        putStrLn "--------------------------------"+    return (ectx', hex')+  where+    hs = headers c
test-hpack/HPACKSpec.hs view
@@ -10,7 +10,7 @@ import Test.Hspec  import Types-import HPACK+import HPACKDecode  testDir :: FilePath testDir = "test-hpack/hpack-test-case"@@ -37,9 +37,9 @@     case etc of         Left e   -> return $ Just $ file ++ ": " ++ e         Right tc -> do-            res <- run False defaultEncodeStrategy tc+            res <- run False tc             case res of-                Pass _ -> return Nothing+                Pass   -> return Nothing                 Fail e -> return $ Just $ file ++ ": " ++ e  spec :: Spec
test-hpack/Types.hs view
@@ -41,6 +41,7 @@     size :: Int   , wire :: ByteString   , headers :: HeaderSet+  , seqno :: Maybe Int   } deriving Show  instance FromJSON Test where@@ -61,13 +62,15 @@     parseJSON (Object o) = Case <$> o .: "header_table_size"                                 <*> (textToByteString <$> (o .: "wire"))                                 <*> o .: "headers"+                                <*> o .:? "seqno"     parseJSON _          = mzero  instance ToJSON Case where-    toJSON (Case siz w hs) = object ["header_table_size" .= siz-                                    ,"wire" .= byteStringToText w-                                    ,"headers" .= hs-                                    ]+    toJSON (Case siz w hs no) = object ["header_table_size" .= siz+                                       ,"wire" .= byteStringToText w+                                       ,"headers" .= hs+                                       ,"seqno" .= no+                                       ]  instance FromJSON HeaderSet where     parseJSON (Array a) = mapM parseJSON $ V.toList a
test-hpack/hpack-debug.hs view
@@ -4,7 +4,7 @@ import qualified Data.ByteString.Lazy as BL  import Types-import HPACK+import HPACKDecode  main :: IO () main = do@@ -13,8 +13,8 @@     res <- case etc of         Left e   -> return $ Just e         Right tc -> do-            res <- run True defaultEncodeStrategy tc+            res <- run True tc             case res of-                Pass _ -> return Nothing+                Pass   -> return Nothing                 Fail e -> return $ Just e     print res
test-hpack/hpack-encode.hs view
@@ -8,35 +8,36 @@ import System.Exit (exitFailure) import System.IO (hPutStrLn, stderr) -import HPACK+import HPACKEncode import Types  main :: IO () main = do     args <- getArgs-    when (length args /= 2) $ do-        hPutStrLn stderr "hpack-encode on/off naive|linear|diff"+    when (length args /= 3) $ do+        hPutStrLn stderr "hpack-encode on/off naive|linear|diff <desc>"         exitFailure-    let [arg1,arg2] = args+    let [arg1,arg2,desc] = args         huffman           | arg1 == "on" = True           | otherwise = False         algo           | arg2 == "naive"  = Naive+          | arg2 == "static" = Static           | arg2 == "linear" = Linear           | otherwise        = Diff         stgy = EncodeStrategy algo huffman-    hpackEncode stgy+    hpackEncode stgy desc -hpackEncode :: EncodeStrategy -> IO ()-hpackEncode stgy = do+hpackEncode :: EncodeStrategy -> String -> IO ()+hpackEncode stgy desc = do     bs <- BL.getContents     let Just tc = decode bs :: Maybe Test-    Pass hexs <- run False stgy tc+    hexs <- run False stgy tc     let cs = cases tc         cs' = zipWith update cs hexs         tc' = tc {-            description = "Encoded by the http2 library in Haskell. First clear the reference set and encode all headers"+            description = desc           , cases = cs'           }     BL.putStrLn $ encodePretty tc'
+ test-hpack/hpack-stat.hs view
@@ -0,0 +1,95 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Main where++import Control.Applicative+import Data.Aeson+import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy.Char8 as BL+import Data.List+import System.Directory+import System.FilePath+import Control.Monad++import Types++hdir :: FilePath+hdir = "test-hpack/hpack-test-case/haskell-http2"++wdir1 :: FilePath+wdir1 = "test-hpack/hpack-test-case/haskell-http2-naive"++wdir2 :: FilePath+wdir2 = "test-hpack/hpack-test-case/haskell-http2-naive-huffman"++wdir3 :: FilePath+wdir3 = "test-hpack/hpack-test-case/haskell-http2-linear"++wdir4 :: FilePath+wdir4 = "test-hpack/hpack-test-case/haskell-http2-linear-huffman"++wdir5 :: FilePath+wdir5 = "test-hpack/hpack-test-case/haskell-http2-diff"++wdir6 :: FilePath+wdir6 = "test-hpack/hpack-test-case/haskell-http2-diff-huffman"+++main :: IO ()+main = do+    hs  <- get getHeaderSize hdir+    hlen <- get getHeaderLen hdir+    ws1 <- get getWireSize wdir1+    ws2 <- get getWireSize wdir2+    ws3 <- get getWireSize wdir3+    ws4 <- get getWireSize wdir4+    ws5 <- get getWireSize wdir5+    ws6 <- get getWireSize wdir6+    let h  :: Float = fromIntegral $ sum hs+        w1 :: Float = fromIntegral $ sum ws1+        w2 :: Float = fromIntegral $ sum ws2+        w3 :: Float = fromIntegral $ sum ws3+        w4 :: Float = fromIntegral $ sum ws4+        w5 :: Float = fromIntegral $ sum ws5+        w6 :: Float = fromIntegral $ sum ws6+        hl :: Float = fromIntegral $ sum hlen+    print (w1 / h+          ,w2 / h+          ,w3 / h+          ,w4 / h+          ,w5 / h+          ,w6 / h)+    print ((w4 - w6) / hl)++get :: (FilePath -> IO Int) -> String -> IO [Int]+get func dir = do+    files0 <- valid . sort <$> getDirectoryContents dir+    files1 <- filterM doesFileExist files0+    mapM func files1+  where+    valid = map (dir </>) . filter (isSuffixOf ".json")++getHeaderSize :: FilePath -> IO Int+getHeaderSize file = do+    bs <- BL.readFile file+    let Just tc = decode bs :: Maybe Test+    let len = sum $ map toT $ cases tc+    return len+  where+    toT (Case _ _ hs _) = sum $ map (\(x,y) -> BS.length x + BS.length y) hs++getHeaderLen :: FilePath -> IO Int+getHeaderLen file = do+    bs <- BL.readFile file+    let Just tc = decode bs :: Maybe Test+    let len = length $ cases tc+    return len++getWireSize :: FilePath -> IO Int+getWireSize file = do+    bs <- BL.readFile file+    let Just tc = decode bs :: Maybe Test+    let len = sum $ map toT $ cases tc+    return len+  where+    toT (Case _ w _ _) = BS.length w `div` 2
test/HeaderBlock.hs view
@@ -82,12 +82,11 @@         ]  e51b :: ByteStream-e51b = fromHexString "0882409f1886c31b39bf387f2292a2fba20320f2ab303124018b490d3209e8773093e39e7864dd7afd3d3d248747db87284955f6ff"+e51b = fromHexString "088298a7188573d5cd111f2298ef6b3a7a0e6e8fa263d0729a6e8397d869bd873747bbbfc73090ce31743d801b6db107cd1a396244b74f"  e52 :: HeaderBlock e52 = [-    Indexed 4-  , Indexed 12+    Indexed 12   ]  e52h :: HeaderSet@@ -98,12 +97,11 @@         ]  e52b :: ByteStream-e52b = fromHexString "848c"+e52b = fromHexString "8c"  e53 :: HeaderBlock e53 = [-    Indexed 3-  , Indexed 4+    Indexed 4   , Indexed 4   , Literal Add (Idx 3) "Mon, 21 Oct 2013 20:13:22 GMT"   , Literal Add (Idx 29) "gzip"@@ -111,7 +109,7 @@   , Indexed 4   , Indexed 3   , Indexed 3-  , Literal Add (Idx 58) "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"+  ,Literal Add (Idx 58) "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"   ]  e53h :: HeaderSet@@ -123,4 +121,4 @@         ,("set-cookie","foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1")]  e53b :: ByteStream-e53b = fromHexString "8384840392a2fba20320f2ab303124018b490d3309e8771d84e1fbb30f848483833ab3df7dfb36d3d9e1fcfc3fafe7abfcfefcbfaf3edf2f977fd36ff7fd79f6f977fd3de16bfa46fe10d889447de1ce18e565f76c2f"+e53b = fromHexString "84840398ef6b3a7a0e6e8fa263d0729a6e8397d869bd873f47bbbfc71d83cbd54e848483833ab3c5adb77f876fc7fbf7fdbfbebff3f7f4fb7ebbbe9f5f87e37fefedfaeefa7c3f1d5d1a23ce546436cd494bd5d1cc5f0535969b"
test/HeaderBlockSpec.hs view
@@ -4,7 +4,6 @@  import qualified Data.ByteString.Char8 as BS import Network.HPACK.HeaderBlock-import Network.HPACK.Huffman import Test.Hspec import Test.Hspec.QuickCheck @@ -14,30 +13,28 @@ spec = do     describe "toByteStream" $ do         it "encodes HeaderBlock" $ do-            toByteStream huffmanEncodeInRequest  True e31 `shouldBe` e31b-            toByteStream huffmanEncodeInRequest  True e32 `shouldBe` e32b-            toByteStream huffmanEncodeInRequest  True e33 `shouldBe` e33b-            toByteStream huffmanEncodeInResponse True e51 `shouldBe` e51b-            toByteStream huffmanEncodeInResponse True e52 `shouldBe` e52b-            toByteStream huffmanEncodeInResponse True e53 `shouldBe` e53b+            toByteStream True e31 `shouldBe` e31b+            toByteStream True e32 `shouldBe` e32b+            toByteStream True e33 `shouldBe` e33b+            toByteStream True e51 `shouldBe` e51b+            toByteStream True e52 `shouldBe` e52b+            toByteStream True e53 `shouldBe` e53b      describe "fromByteStream" $ do         it "encodes HeaderBlock" $ do-            fromByteStream huffmanDecodeInRequest  e31b `shouldBe` Right e31-            fromByteStream huffmanDecodeInRequest  e32b `shouldBe` Right e32-            fromByteStream huffmanDecodeInRequest  e33b `shouldBe` Right e33-            fromByteStream huffmanDecodeInResponse e51b `shouldBe` Right e51-            fromByteStream huffmanDecodeInResponse e52b `shouldBe` Right e52-            fromByteStream huffmanDecodeInResponse e53b `shouldBe` Right e53+            fromByteStream e31b `shouldBe` Right e31+            fromByteStream e32b `shouldBe` Right e32+            fromByteStream e33b `shouldBe` Right e33+            fromByteStream e51b `shouldBe` Right e51+            fromByteStream e52b `shouldBe` Right e52+            fromByteStream e53b `shouldBe` Right e53     describe "toByteStream & fromByteStream" $ do         prop "duality for request" $ \k v -> do             let key = BS.pack ('k':k)                 val = BS.pack ('v':v)                 hb = [Literal Add (Lit key) val]-            fromByteStream huffmanDecodeInRequest-                (toByteStream huffmanEncodeInRequest True hb) `shouldBe` Right hb+            fromByteStream (toByteStream True hb) `shouldBe` Right hb         prop "duality for response" $ \v -> do             let val = BS.pack ('v':v)                 hb = [Literal Add (Idx 3) val]-            fromByteStream huffmanDecodeInResponse-                (toByteStream huffmanEncodeInResponse True hb) `shouldBe` Right hb+            fromByteStream (toByteStream True hb) `shouldBe` Right hb
− test/HuffmanRequestSpec.hs
@@ -1,45 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module HuffmanRequestSpec where--import Data.ByteString (ByteString)-import qualified Data.ByteString as BS-import Network.HPACK.Huffman.Request-import Network.HPACK.Types-import Test.Hspec-import Test.Hspec.QuickCheck--import HexString--shouldBeEncoded :: ByteString -> ByteString -> Expectation-shouldBeEncoded inp out = enc inp `shouldBe` out-  where-    enc = toHexString . huffmanEncodeInRequest--shouldBeDecoded :: ByteString -> Either DecodeError ByteString -> Expectation-shouldBeDecoded inp out = dec inp `shouldBe` out-  where-    dec x = huffmanDecodeInRequest (fromHexString x)--spec :: Spec-spec = do-    describe "huffmanEncodeInRequest and huffmanDecodeInRequest" $ do-        prop "duality" $ \cs ->-            let bs = BS.pack cs-            in huffmanDecodeInRequest (huffmanEncodeInRequest bs) == Right bs-    describe "huffmanEncodeInRequest" $ do-        it "encodes in request" $ do-            "www.example.com" `shouldBeEncoded` "db6d883e68d1cb1225ba7f"-            "no-cache" `shouldBeEncoded` "63654a1398ff"-            "custom-key" `shouldBeEncoded` "4eb08b749790fa7f"-            "custom-value" `shouldBeEncoded` "4eb08b74979a17a8ff"-            "" `shouldBeEncoded` ""-    describe "huffmanDecodeInRequest" $ do-        it "decodes in request" $ do-            "db6d883e68d1cb1225ba7f" `shouldBeDecoded` Right "www.example.com"-            "63654a1398ff" `shouldBeDecoded` Right "no-cache"-            "4eb08b749790fa7f" `shouldBeDecoded` Right "custom-key"-            "4eb08b74979a17a8ff" `shouldBeDecoded` Right "custom-value"-            "ff" `shouldBeDecoded` Left TooLongEos-            "fffff77f" `shouldBeDecoded` Right "\1"-            "fffff77fff" `shouldBeDecoded` Left TooLongEos
− test/HuffmanResponseSpec.hs
@@ -1,44 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module HuffmanResponseSpec where--import Data.ByteString (ByteString)-import qualified Data.ByteString as BS-import Network.HPACK.Huffman.Response-import Test.Hspec-import Test.Hspec.QuickCheck--import HexString--shouldBeEncoded :: ByteString -> ByteString -> Expectation-shouldBeEncoded inp out = enc inp `shouldBe` out-  where-    enc = toHexString . huffmanEncodeInResponse--shouldBeDecoded :: ByteString -> ByteString -> Expectation-shouldBeDecoded inp out = dec inp `shouldBe` Right out-  where-    dec x = huffmanDecodeInResponse (fromHexString x)--spec :: Spec-spec = do-    describe "huffmanEncodeInResponse and huffmanDecodeInResponse" $ do-        prop "duality" $ \cs ->-            let bs = BS.pack cs-            in huffmanDecodeInResponse (huffmanEncodeInResponse bs) == Right bs-    describe "huffmanEncodeInResponse" $ do-        it "encodes in response" $ do-            "private" `shouldBeEncoded` "c31b39bf387f"-            "Mon, 21 Oct 2013 20:13:21 GMT" `shouldBeEncoded` "a2fba20320f2ab303124018b490d3209e877"-            "https://www.example.com" `shouldBeEncoded` "e39e7864dd7afd3d3d248747db87284955f6ff"-            "Mon, 21 Oct 2013 20:13:22 GMT" `shouldBeEncoded` "a2fba20320f2ab303124018b490d3309e877"-            "gzip" `shouldBeEncoded` "e1fbb30f"-            "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1" `shouldBeEncoded` "df7dfb36d3d9e1fcfc3fafe7abfcfefcbfaf3edf2f977fd36ff7fd79f6f977fd3de16bfa46fe10d889447de1ce18e565f76c2f"-    describe "huffmanDecodeInResponse" $ do-        it "decodes in response" $ do-            "c31b39bf387f" `shouldBeDecoded` "private"-            "a2fba20320f2ab303124018b490d3209e877"`shouldBeDecoded` "Mon, 21 Oct 2013 20:13:21 GMT"-            "e39e7864dd7afd3d3d248747db87284955f6ff" `shouldBeDecoded` "https://www.example.com"-            "a2fba20320f2ab303124018b490d3309e877" `shouldBeDecoded` "Mon, 21 Oct 2013 20:13:22 GMT"-            "e1fbb30f" `shouldBeDecoded` "gzip"-            "df7dfb36d3d9e1fcfc3fafe7abfcfefcbfaf3edf2f977fd36ff7fd79f6f977fd3de16bfa46fe10d889447de1ce18e565f76c2f" `shouldBeDecoded` "foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1"
+ test/HuffmanSpec.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE OverloadedStrings #-}++module HuffmanSpec where++import Data.ByteString (ByteString)+import qualified Data.ByteString as BS+import Network.HPACK+import Network.HPACK.Huffman+import Test.Hspec+import Test.Hspec.QuickCheck++import HexString++testData :: [(ByteString, ByteString)]+testData = [+    ("", "")+  , ("www.example.com", "db6d883e68d1cb1225ba7f")+  , ("no-cache", "63654a1398ff")+  , ("custom-key", "4eb08b749790fa7f")+  , ("custom-value", "4eb08b74979a17a8ff")+  , ("private", "73d5cd111f")+  , ("Mon, 21 Oct 2013 20:13:21 GMT", "ef6b3a7a0e6e8fa263d0729a6e8397d869bd873747bbbfc7")+  , ("https://www.example.com", "ce31743d801b6db107cd1a396244b74f")+  , ("Mon, 21 Oct 2013 20:13:22 GMT", "ef6b3a7a0e6e8fa263d0729a6e8397d869bd873f47bbbfc7")+  , ("gzip", "cbd54e")+  , ("foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1", "c5adb77f876fc7fbf7fdbfbebff3f7f4fb7ebbbe9f5f87e37fefedfaeefa7c3f1d5d1a23ce546436cd494bd5d1cc5f0535969b")+  ]++shouldBeEncoded :: ByteString -> ByteString -> Expectation+shouldBeEncoded inp out = enc inp `shouldBe` out+  where+    enc = toHexString . encode++shouldBeDecoded :: ByteString -> Either DecodeError ByteString -> Expectation+shouldBeDecoded inp out = dec inp `shouldBe` out+  where+    dec = decode . fromHexString++spec :: Spec+spec = do+    describe "encode and decode" $ do+        prop "duality" $ \cs ->+            let bs = BS.pack cs+            in decode (encode bs) == Right bs+    describe "encode" $ do+        it "encodes" $ do+            mapM_ (\(x,y) -> x `shouldBeEncoded` y) testData+    describe "decode" $ do+        it "decodes" $ do+            "ff" `shouldBeDecoded` Left TooLongEos+            "fffff77f" `shouldBeDecoded` Right "\1"+            "fffff77fff" `shouldBeDecoded` Left TooLongEos+            mapM_ (\(x,y) -> y `shouldBeDecoded` Right x) testData