    {-# LANGUAGE BangPatterns #-}
    {-# LANGUAGE MagicHash #-}
    {-# LANGUAGE TypeApplications #-}
    -- |
    -- Module       : Data.ByteString.Base64.Internal.Tables
    -- Copyright    : (c) 2019-2020 Emily Pillmore
    -- License      : BSD-style
    --
    -- Maintainer   : Emily Pillmore <emilypi@cohomolo.gy>
    -- Stability    : Experimental
    -- Portability  : portable
    --
    -- Shared internal tables
    --
    module Data.ByteString.Base64.Internal.Tables
    ( base64Table
    , base64UrlTable
    , decodeB64Table
    , decodeB64UrlTable
    ) where

    import Data.ByteString.Base64.Internal.Utils

    import Foreign.ForeignPtr

    import GHC.Word

    -- | Base64url encoding table
    --
    base64UrlTable :: EncodingTable
    base64UrlTable :: EncodingTable
    base64UrlTable = Addr# -> EncodingTable
    packTable Addr#
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"#
    {-# NOINLINE base64UrlTable #-}

    -- | Base64 std encoding table
    --
    base64Table :: EncodingTable
    base64Table :: EncodingTable
    base64Table = Addr# -> EncodingTable
    packTable Addr#
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"#
    {-# NOINLINE base64Table #-}

    -- | Non-URLsafe b64 decoding table (naive)
    --
    decodeB64Table :: ForeignPtr Word8
    decodeB64Table :: ForeignPtr Word8
    decodeB64Table = forall a b. (Storable a, Storable b) => Int -> [a] -> ForeignPtr b
    writeNPlainForeignPtrBytes @Word8 Int
    256
          [ Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0x3e,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0x3f
          , Word8
    0x34,Word8
    0x35,Word8
    0x36,Word8
    0x37,Word8
    0x38,Word8
    0x39,Word8
    0x3a,Word8
    0x3b,Word8
    0x3c,Word8
    0x3d,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0x63,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0x00,Word8
    0x01,Word8
    0x02,Word8
    0x03,Word8
    0x04,Word8
    0x05,Word8
    0x06,Word8
    0x07,Word8
    0x08,Word8
    0x09,Word8
    0x0a,Word8
    0x0b,Word8
    0x0c,Word8
    0x0d,Word8
    0x0e
          , Word8
    0x0f,Word8
    0x10,Word8
    0x11,Word8
    0x12,Word8
    0x13,Word8
    0x14,Word8
    0x15,Word8
    0x16,Word8
    0x17,Word8
    0x18,Word8
    0x19,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0x1a,Word8
    0x1b,Word8
    0x1c,Word8
    0x1d,Word8
    0x1e,Word8
    0x1f,Word8
    0x20,Word8
    0x21,Word8
    0x22,Word8
    0x23,Word8
    0x24,Word8
    0x25,Word8
    0x26,Word8
    0x27,Word8
    0x28
          , Word8
    0x29,Word8
    0x2a,Word8
    0x2b,Word8
    0x2c,Word8
    0x2d,Word8
    0x2e,Word8
    0x2f,Word8
    0x30,Word8
    0x31,Word8
    0x32,Word8
    0x33,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          ]
    {-# NOINLINE decodeB64Table #-}

    -- | URLsafe b64 decoding table (naive)
    --
    decodeB64UrlTable :: ForeignPtr Word8
    decodeB64UrlTable :: ForeignPtr Word8
    decodeB64UrlTable = forall a b. (Storable a, Storable b) => Int -> [a] -> ForeignPtr b
    writeNPlainForeignPtrBytes @Word8 Int
    256
          [ Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0x3e,Word8
    0xff,Word8
    0xff
          , Word8
    0x34,Word8
    0x35,Word8
    0x36,Word8
    0x37,Word8
    0x38,Word8
    0x39,Word8
    0x3a,Word8
    0x3b,Word8
    0x3c,Word8
    0x3d,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0x63,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0x00,Word8
    0x01,Word8
    0x02,Word8
    0x03,Word8
    0x04,Word8
    0x05,Word8
    0x06,Word8
    0x07,Word8
    0x08,Word8
    0x09,Word8
    0x0a,Word8
    0x0b,Word8
    0x0c,Word8
    0x0d,Word8
    0x0e
          , Word8
    0x0f,Word8
    0x10,Word8
    0x11,Word8
    0x12,Word8
    0x13,Word8
    0x14,Word8
    0x15,Word8
    0x16,Word8
    0x17,Word8
    0x18,Word8
    0x19,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0x3f
          , Word8
    0xff,Word8
    0x1a,Word8
    0x1b,Word8
    0x1c,Word8
    0x1d,Word8
    0x1e,Word8
    0x1f,Word8
    0x20,Word8
    0x21,Word8
    0x22,Word8
    0x23,Word8
    0x24,Word8
    0x25,Word8
    0x26,Word8
    0x27,Word8
    0x28
          , Word8
    0x29,Word8
    0x2a,Word8
    0x2b,Word8
    0x2c,Word8
    0x2d,Word8
    0x2e,Word8
    0x2f,Word8
    0x30,Word8
    0x31,Word8
    0x32,Word8
    0x33,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          , Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff,Word8
    0xff
          ]
    {-# NOINLINE decodeB64UrlTable #-}