APNX
----

apnx files are used by the Amazon Kindle (firmware revision 3.1+) to
map pages from a print book to the Kindle version. Integers within
the file are big-endian.


Layout
------

bytes   content             comments

4       00010001            Format identifier. Value of 65537 little-endian.
4       start of next       The offset after ending location of the first header.
                            Starts a new sequence of header info
4       length              Length of first header
N       first header        String containing content header
Starts next sequence
2       unknown             Always 1
2       length              Length of second header
2       page count          Total number of bytes after second header that
                            represent pages. This total includes bytes that
                            are ignored by the pageMap.
2       unknown             Always 32
N       second header       String containing the page mapping header
4*N     padding             The first number given in the page mapping header indicates the number of 0 bytes.
4*N     page list


Content Header
--------------

The content header is a string enclosed in {} containing key, value pairs.

content             comments

contentGuid         Guid.
asin                Amazon identifier for the Kindle version of the book.
cdeType             MOBI cdeType. Should always be EBOK for ebooks.
fileRevisionId      Revision of this file.

Example:
{"contentGuid":"d8c14b0","asin":"B000JML5VM","cdeType":"EBOK","fileRevisionId":"1296874359405"}


In devices with KF8 support, we're seeing an extended content header (which seems to be required by some FW versions for KF8 files, like FW 3.4):

format              Mobi version. MOBI_8 for KF8, MOBI_7 for legacy mobi files.
acr                 Palm DB name

Example:
{"contentGuid":"f2fc7597","asin":"B003M68YKM","cdeType":"EBOK","format":"MOBI_8","fileRevisionId":"1342776186889","acr":"CR!1F5WDHWWVN4Y78MA87Z13H9K6RKE"}

Page Mapping Header
-------------------

The page mapping header is a string enclosed in {} containing key, value pairs.

content             comments

asin                The ISBN 10 for the paper book the pages correspond to
pageMap             Three value tuple. Looks like: "(N,N,N)"
                    1) 1 based page list entry number for the first page described by this tuple.
                    2) Page number type, a: Indo-Arabic numeral, r: Roman numeral, c: character.
                    3) Value of page number for the first page of this sequence.

The third value of the tuple is a decimal number if the type is "a" or "r" and
a character string of page labels separated by "|" characters.

Example:
{"asin":"1906694184","pageMap":"(4,a,1),(197,c,A-1|A-2|A-3)"}


Page List
---------

The page list is a sequence of offsets in the uncompressed HTML. Each
value is the beginning of a new page. Each entry is a 4 byte big endian
int. The list is ordered lowest to highest.

For more information
--------------------

MobileRead wiki https://wiki.mobileread.com/wiki/APNX
