1{
2  "version": 3,
3  "file": "generated.js",
4  "sources": [
5    "/Users/devongovett/projects/codecs/mp3.js/node_modules/browserify/node_modules/browser-pack/_prelude.js",
6    "/Users/devongovett/projects/codecs/mp3.js/index.js",
7    "/Users/devongovett/projects/codecs/mp3.js/src/decoder.js",
8    "/Users/devongovett/projects/codecs/mp3.js/src/demuxer.js",
9    "/Users/devongovett/projects/codecs/mp3.js/src/frame.js",
10    "/Users/devongovett/projects/codecs/mp3.js/src/header.js",
11    "/Users/devongovett/projects/codecs/mp3.js/src/huffman.js",
12    "/Users/devongovett/projects/codecs/mp3.js/src/id3.js",
13    "/Users/devongovett/projects/codecs/mp3.js/src/imdct.js",
14    "/Users/devongovett/projects/codecs/mp3.js/src/layer1.js",
15    "/Users/devongovett/projects/codecs/mp3.js/src/layer2.js",
16    "/Users/devongovett/projects/codecs/mp3.js/src/layer3.js",
17    "/Users/devongovett/projects/codecs/mp3.js/src/stream.js",
18    "/Users/devongovett/projects/codecs/mp3.js/src/synth.js",
19    "/Users/devongovett/projects/codecs/mp3.js/src/tables.js",
20    "/Users/devongovett/projects/codecs/mp3.js/src/utils.js"
21  ],
22  "names": [],
23  "mappings": "AAAA;ACAA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACz6FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACltCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrlCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
24  "sourcesContent": [
25    "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})",
26    "exports.MP3Demuxer = require('./src/demuxer');\nexports.MP3Decoder = require('./src/decoder');\n",
27    "var AV = (window.AV);\nvar MP3FrameHeader = require('./header');\nvar MP3Stream = require('./stream');\nvar MP3Frame = require('./frame');\nvar MP3Synth = require('./synth');\nvar Layer1 = require('./layer1');\nvar Layer2 = require('./layer2');\nvar Layer3 = require('./layer3');\n\nvar MP3Decoder = AV.Decoder.extend(function() {\n    AV.Decoder.register('mp3', this);\n    \n    this.prototype.init = function() {\n        this.mp3_stream = new MP3Stream(this.bitstream);\n        this.frame = new MP3Frame();\n        this.synth = new MP3Synth();\n        this.seeking = false;\n    };\n    \n    this.prototype.readChunk = function() {\n        var stream = this.mp3_stream;\n        var frame = this.frame;\n        var synth = this.synth;\n\n        // if we just seeked, we may start getting errors involving the frame reservoir,\n        // so keep going until we successfully decode a frame\n        if (this.seeking) {\n            while (true) {\n                try {\n                    frame.decode(stream);\n                    break;\n                } catch (err) {\n                    if (err instanceof AV.UnderflowError)\n                        throw err;\n                }\n            }\n            \n            this.seeking = false;\n        } else {\n            frame.decode(stream);\n        }\n        \n        synth.frame(frame);\n        \n        // interleave samples\n        var data = synth.pcm.samples,\n            channels = synth.pcm.channels,\n            len = synth.pcm.length,\n            output = new Float32Array(len * channels),\n            j = 0;\n        \n        for (var k = 0; k < len; k++) {\n            for (var i = 0; i < channels; i++) {\n                output[j++] = data[i][k];\n            }\n        }\n        \n        return output;\n    };\n    \n    this.prototype.seek = function(timestamp) {\n        var offset;\n        \n        // if there was a Xing or VBRI tag with a seek table, use that\n        // otherwise guesstimate based on CBR bitrate\n        if (this.demuxer.seekPoints.length > 0) {\n            timestamp = this._super(timestamp);\n            offset = this.stream.offset;\n        } else {\n            offset = timestamp * this.format.bitrate / 8 / this.format.sampleRate;\n        }\n        \n        this.mp3_stream.reset(offset);\n        \n        // try to find 3 consecutive valid frame headers in a row\n        for (var i = 0; i < 4096; i++) {\n            var pos = offset + i;\n            for (var j = 0; j < 3; j++) {\n                this.mp3_stream.reset(pos);\n                \n                try {\n                    var header = MP3FrameHeader.decode(this.mp3_stream);\n                } catch (e) {\n                    break;\n                }\n                \n                // skip the rest of the frame\n                var size = header.framesize();\n                if (size == null)\n                    break;\n                        \n                pos += size;\n            }\n            \n            // check if we're done\n            if (j === 3)\n                break;\n        }\n        \n        // if we didn't find 3 frames, just try the first one and hope for the best\n        if (j !== 3)\n            i = 0;\n            \n        this.mp3_stream.reset(offset + i);\n        \n        // if we guesstimated, update the timestamp to another estimate of where we actually seeked to\n        if (this.demuxer.seekPoints.length === 0)\n            timestamp = this.stream.offset / (this.format.bitrate / 8) * this.format.sampleRate;\n        \n        this.seeking = true;\n        return timestamp;\n    };\n});\n\nmodule.exports = MP3Decoder;\n",
28    "var AV = (window.AV);\nvar ID3v23Stream = require('./id3').ID3v23Stream;\nvar ID3v22Stream = require('./id3').ID3v22Stream;\nvar MP3FrameHeader = require('./header');\nvar MP3Stream = require('./stream');\n\nvar MP3Demuxer = AV.Demuxer.extend(function() {\n    AV.Demuxer.register(this);\n    \n    this.probe = function(stream) {\n        var off = stream.offset;\n        \n        // skip id3 metadata if it exists\n        var id3header = MP3Demuxer.getID3v2Header(stream);\n        if (id3header)\n            stream.advance(10 + id3header.length);\n        \n        // attempt to read the header of the first audio frame\n        var s = new MP3Stream(new AV.Bitstream(stream));\n        var header = null;\n        \n        try {\n            header = MP3FrameHeader.decode(s);\n        } catch (e) {};\n        \n        // go back to the beginning, for other probes\n        stream.seek(off);\n        \n        return !!header;\n    };\n    \n    this.getID3v2Header = function(stream) {\n        if (stream.peekString(0, 3) == 'ID3') {\n            stream = AV.Stream.fromBuffer(stream.peekBuffer(0, 10));\n            stream.advance(3); // 'ID3'\n\n            var major = stream.readUInt8();\n            var minor = stream.readUInt8();\n            var flags = stream.readUInt8();\n            var bytes = stream.readBuffer(4).data;\n            var length = (bytes[0] << 21) | (bytes[1] << 14) | (bytes[2] << 7) | bytes[3];\n\n            return { \n                version: '2.' + major + '.' + minor, \n                major: major, \n                minor: minor, \n                flags: flags, \n                length: length \n            };\n        }\n        \n        return null;\n    };\n    \n    const XING_OFFSETS = [[32, 17], [17, 9]];\n    this.prototype.parseDuration = function(header) {\n        var stream = this.stream;\n        var frames;\n                \n        var offset = stream.offset;\n        if (!header || header.layer !== 3)\n            return false;\n        \n        // Check for Xing/Info tag\n        stream.advance(XING_OFFSETS[header.flags & MP3FrameHeader.FLAGS.LSF_EXT ? 1 : 0][header.nchannels() === 1 ? 1 : 0]);\n        var tag = stream.readString(4);\n        if (tag === 'Xing' || tag === 'Info') {\n            var flags = stream.readUInt32();\n            if (flags & 1) \n                frames = stream.readUInt32();\n                \n            if (flags & 2)\n                var size = stream.readUInt32();\n                \n            if (flags & 4 && frames && size) {\n                for (var i = 0; i < 100; i++) {\n                    var b = stream.readUInt8();\n                    var pos = b / 256 * size | 0;\n                    var time = i / 100 * (frames * header.nbsamples() * 32) | 0;\n                    this.addSeekPoint(pos, time);\n                }\n            }\n                \n            if (flags & 8)\n                stream.advance(4);\n                \n        } else {\n            // Check for VBRI tag (always 32 bytes after end of mpegaudio header)\n            stream.seek(offset + 4 + 32);\n            tag = stream.readString(4);\n            if (tag == 'VBRI' && stream.readUInt16() === 1) { // Check tag version\n                stream.advance(4); // skip delay and quality\n                stream.advance(4); // skip size\n                frames = stream.readUInt32();\n                \n                var entries = stream.readUInt16();\n                var scale = stream.readUInt16();\n                var bytesPerEntry = stream.readUInt16();\n                var framesPerEntry = stream.readUInt16();\n                var fn = 'readUInt' + (bytesPerEntry * 8);\n                \n                var pos = 0;\n                for (var i = 0; i < entries; i++) {\n                    this.addSeekPoint(pos, framesPerEntry * i);\n                    pos += stream[fn]();\n                }\n            }\n        }\n        \n        if (!frames)\n            return false;\n            \n        this.emit('duration', (frames * header.nbsamples() * 32) / header.samplerate * 1000 | 0);\n        return true;\n    };\n    \n    this.prototype.readChunk = function() {\n        var stream = this.stream;\n        \n        if (!this.sentInfo) {\n            // read id3 metadata if it exists\n            var id3header = MP3Demuxer.getID3v2Header(stream);\n            if (id3header) {\n                stream.advance(10);\n                \n                if (id3header.major > 2) {\n                    var id3 = new ID3v23Stream(id3header, stream);\n                } else {\n                    var id3 = new ID3v22Stream(id3header, stream);\n                }\n                \n                this.emit('metadata', id3.read());\n            }\n            \n            // read the header of the first audio frame\n            var off = stream.offset;\n            var s = new MP3Stream(new AV.Bitstream(stream));\n            \n            var header = MP3FrameHeader.decode(s);\n            if (!header)\n                return this.emit('error', 'Could not find first frame.');\n            \n            this.emit('format', {\n                formatID: 'mp3',\n                sampleRate: header.samplerate,\n                channelsPerFrame: header.nchannels(),\n                bitrate: header.bitrate,\n                floatingPoint: true\n            });\n            \n            var sentDuration = this.parseDuration(header);\n            stream.advance(off - stream.offset);\n            \n            // if there were no Xing/VBRI tags, guesstimate the duration based on data size and bitrate\n            this.dataSize = 0;\n            if (!sentDuration) {\n                this.on('end', function() {\n                    this.emit('duration', this.dataSize * 8 / header.bitrate * 1000 | 0);\n                });\n            }\n            \n            this.sentInfo = true;\n        }\n        \n        while (stream.available(1)) {\n            var buffer = stream.readSingleBuffer(stream.remainingBytes());\n            this.dataSize += buffer.length;\n            this.emit('data', buffer);\n        }\n    };\n});\n\nmodule.exports = MP3Demuxer;\n",
29    "var MP3FrameHeader = require('./header');\nvar utils = require('./utils');\n\nfunction MP3Frame() {\n    this.header = null;                     // MPEG audio header\n    this.options = 0;                       // decoding options (from stream)\n    this.sbsample = utils.makeArray([2, 36, 32]); // synthesis subband filter samples\n    this.overlap = utils.makeArray([2, 32, 18]);  // Layer III block overlap data\n    this.decoders = [];\n}\n\n// included layer decoders are registered here\nMP3Frame.layers = [];\n\nMP3Frame.prototype.decode = function(stream) {\n    if (!this.header || !(this.header.flags & MP3FrameHeader.FLAGS.INCOMPLETE))\n        this.header = MP3FrameHeader.decode(stream);\n\n    this.header.flags &= ~MP3FrameHeader.FLAGS.INCOMPLETE;\n    \n    // make an instance of the decoder for this layer if needed\n    var decoder = this.decoders[this.header.layer - 1];\n    if (!decoder) {\n        var Layer = MP3Frame.layers[this.header.layer];\n        if (!Layer)\n            throw new Error(\"Layer \" + this.header.layer + \" is not supported.\");\n            \n        decoder = this.decoders[this.header.layer - 1] = new Layer();\n    }\n    \n    decoder.decode(stream, this);\n};\n\nmodule.exports = MP3Frame;\n",
30    "var AV = (window.AV);\n\nfunction MP3FrameHeader() {\n    this.layer          = 0; // audio layer (1, 2, or 3)\n    this.mode           = 0; // channel mode (see above)\n    this.mode_extension = 0; // additional mode info\n    this.emphasis       = 0; // de-emphasis to use (see above)\n\n    this.bitrate        = 0; // stream bitrate (bps)\n    this.samplerate     = 0; // sampling frequency (Hz)\n\n    this.crc_check      = 0; // frame CRC accumulator\n    this.crc_target     = 0; // final target CRC checksum\n\n    this.flags          = 0; // flags (see above)\n    this.private_bits   = 0; // private bits\n}\n\nconst BITRATES = [\n    // MPEG-1\n    [ 0,  32000,  64000,  96000, 128000, 160000, 192000, 224000,  // Layer I\n         256000, 288000, 320000, 352000, 384000, 416000, 448000 ],\n    [ 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  // Layer II\n         128000, 160000, 192000, 224000, 256000, 320000, 384000 ],\n    [ 0,  32000,  40000,  48000,  56000,  64000,  80000,  96000,  // Layer III\n         112000, 128000, 160000, 192000, 224000, 256000, 320000 ],\n\n    // MPEG-2 LSF\n    [ 0,  32000,  48000,  56000,  64000,  80000,  96000, 112000,  // Layer I\n         128000, 144000, 160000, 176000, 192000, 224000, 256000 ],\n    [ 0,   8000,  16000,  24000,  32000,  40000,  48000,  56000,  // Layers\n          64000,  80000,  96000, 112000, 128000, 144000, 160000 ] // II & III\n];\n\nconst SAMPLERATES = [ \n    44100, 48000, 32000 \n];\n\nMP3FrameHeader.FLAGS = {\n    NPRIVATE_III: 0x0007,   // number of Layer III private bits\n    INCOMPLETE  : 0x0008,   // header but not data is decoded\n\n    PROTECTION  : 0x0010,   // frame has CRC protection\n    COPYRIGHT   : 0x0020,   // frame is copyright\n    ORIGINAL    : 0x0040,   // frame is original (else copy)\n    PADDING     : 0x0080,   // frame has additional slot\n\n    I_STEREO    : 0x0100,   // uses intensity joint stereo\n    MS_STEREO   : 0x0200,   // uses middle/side joint stereo\n    FREEFORMAT  : 0x0400,   // uses free format bitrate\n\n    LSF_EXT     : 0x1000,   // lower sampling freq. extension\n    MC_EXT      : 0x2000,   // multichannel audio extension\n    MPEG_2_5_EXT: 0x4000    // MPEG 2.5 (unofficial) extension\n};\n\nconst PRIVATE = {\n    HEADER  : 0x0100, // header private bit\n    III     : 0x001f  // Layer III private bits (up to 5)\n};\n\nMP3FrameHeader.MODE = {\n    SINGLE_CHANNEL: 0, // single channel\n    DUAL_CHANNEL  : 1, // dual channel\n    JOINT_STEREO  : 2, // joint (MS/intensity) stereo\n    STEREO        : 3  // normal LR stereo\n};\n\nconst EMPHASIS = {\n    NONE      : 0, // no emphasis\n    _50_15_US : 1, // 50/15 microseconds emphasis\n    CCITT_J_17: 3, // CCITT J.17 emphasis\n    RESERVED  : 2  // unknown emphasis\n};\n\nMP3FrameHeader.BUFFER_GUARD = 8;\nMP3FrameHeader.BUFFER_MDLEN = (511 + 2048 + MP3FrameHeader.BUFFER_GUARD);\n\nMP3FrameHeader.prototype.copy = function() {\n    var clone = new MP3FrameHeader();\n    var keys = Object.keys(this);\n    \n    for (var key in keys) {\n        clone[key] = this[key];\n    }\n    \n    return clone;\n}\n\nMP3FrameHeader.prototype.nchannels = function () {\n    return this.mode === 0 ? 1 : 2;\n};\n\nMP3FrameHeader.prototype.nbsamples = function() {\n    return (this.layer === 1 ? 12 : ((this.layer === 3 && (this.flags & MP3FrameHeader.FLAGS.LSF_EXT)) ? 18 : 36));\n};\n\nMP3FrameHeader.prototype.framesize = function() {\n    if (this.bitrate === 0)\n        return null;\n    \n    var padding = (this.flags & MP3FrameHeader.FLAGS.PADDING ? 1 : 0);\n    switch (this.layer) {\n        case 1:\n            var size = (this.bitrate * 12) / this.samplerate | 0;\n            return (size + padding) * 4;\n            \n        case 2:\n            var size = (this.bitrate * 144) / this.samplerate | 0;\n            return size + padding;\n            \n        case 3:\n        default:\n            var lsf = this.flags & MP3FrameHeader.FLAGS.LSF_EXT ? 1 : 0;\n            var size = (this.bitrate * 144) / (this.samplerate << lsf) | 0;\n            return size + padding;\n    }\n};\n\nMP3FrameHeader.prototype.decode = function(stream) {\n    this.flags        = 0;\n    this.private_bits = 0;\n    \n    // syncword \n    stream.advance(11);\n\n    // MPEG 2.5 indicator (really part of syncword) \n    if (stream.read(1) === 0)\n        this.flags |= MP3FrameHeader.FLAGS.MPEG_2_5_EXT;\n\n    // ID \n    if (stream.read(1) === 0) {\n        this.flags |= MP3FrameHeader.FLAGS.LSF_EXT;\n    } else if (this.flags & MP3FrameHeader.FLAGS.MPEG_2_5_EXT) {\n        throw new AV.UnderflowError(); // LOSTSYNC\n    }\n\n    // layer \n    this.layer = 4 - stream.read(2);\n\n    if (this.layer === 4)\n        throw new Error('Invalid layer');\n\n    // protection_bit \n    if (stream.read(1) === 0)\n        this.flags |= MP3FrameHeader.FLAGS.PROTECTION;\n\n    // bitrate_index \n    var index = stream.read(4);\n    if (index === 15)\n        throw new Error('Invalid bitrate');\n\n    if (this.flags & MP3FrameHeader.FLAGS.LSF_EXT) {\n        this.bitrate = BITRATES[3 + (this.layer >> 1)][index];\n    } else {\n        this.bitrate = BITRATES[this.layer - 1][index];\n    }\n\n    // sampling_frequency \n    index = stream.read(2);\n    if (index === 3)\n        throw new Error('Invalid sampling frequency');\n\n    this.samplerate = SAMPLERATES[index];\n\n    if (this.flags & MP3FrameHeader.FLAGS.LSF_EXT) {\n        this.samplerate /= 2;\n\n        if (this.flags & MP3FrameHeader.FLAGS.MPEG_2_5_EXT)\n            this.samplerate /= 2;\n    }\n\n    // padding_bit \n    if (stream.read(1))\n        this.flags |= MP3FrameHeader.FLAGS.PADDING;\n\n    // private_bit \n    if (stream.read(1))\n        this.private_bits |= PRIVATE.HEADER;\n\n    // mode \n    this.mode = 3 - stream.read(2);\n\n    // mode_extension \n    this.mode_extension = stream.read(2);\n\n    // copyright \n    if (stream.read(1))\n        this.flags |= MP3FrameHeader.FLAGS.COPYRIGHT;\n\n    // original/copy \n    if (stream.read(1))\n        this.flags |= MP3FrameHeader.FLAGS.ORIGINAL;\n\n    // emphasis \n    this.emphasis = stream.read(2);\n\n    // crc_check \n    if (this.flags & MP3FrameHeader.FLAGS.PROTECTION)\n        this.crc_target = stream.read(16);\n};\n\nMP3FrameHeader.decode = function(stream) {\n    // synchronize\n    var ptr = stream.next_frame;\n    var syncing = true;\n    var header = null;\n    \n    while (syncing) {\n        syncing = false;\n        \n        if (stream.sync) {\n            if (!stream.available(MP3FrameHeader.BUFFER_GUARD)) {\n                stream.next_frame = ptr;\n                throw new AV.UnderflowError();\n            } else if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) {\n                // mark point where frame sync word was expected\n                stream.this_frame = ptr;\n                stream.next_frame = ptr + 1;\n                throw new AV.UnderflowError(); // LOSTSYNC\n            }\n        } else {\n            stream.seek(ptr * 8);\n            if (!stream.doSync())\n                throw new AV.UnderflowError();\n                \n            ptr = stream.nextByte();\n        }\n        \n        // begin processing\n        stream.this_frame = ptr;\n        stream.next_frame = ptr + 1; // possibly bogus sync word\n        \n        stream.seek(stream.this_frame * 8);\n        \n        header = new MP3FrameHeader();\n        header.decode(stream);\n        \n        if (header.bitrate === 0) {\n            if (stream.freerate === 0 || !stream.sync || (header.layer === 3 && stream.freerate > 640000))\n                MP3FrameHeader.free_bitrate(stream, header);\n            \n            header.bitrate = stream.freerate;\n            header.flags |= MP3FrameHeader.FLAGS.FREEFORMAT;\n        }\n        \n        // calculate beginning of next frame\n        var pad_slot = (header.flags & MP3FrameHeader.FLAGS.PADDING) ? 1 : 0;\n        \n        if (header.layer === 1) {\n            var N = (((12 * header.bitrate / header.samplerate) << 0) + pad_slot) * 4;\n        } else {\n            var slots_per_frame = (header.layer === 3 && (header.flags & MP3FrameHeader.FLAGS.LSF_EXT)) ? 72 : 144;\n            var N = ((slots_per_frame * header.bitrate / header.samplerate) << 0) + pad_slot;\n        }\n        \n        // verify there is enough data left in buffer to decode this frame\n        if (!stream.available(N + MP3FrameHeader.BUFFER_GUARD)) {\n            stream.next_frame = stream.this_frame;\n            throw new AV.UnderflowError();\n        }\n        \n        stream.next_frame = stream.this_frame + N;\n        \n        if (!stream.sync) {\n            // check that a valid frame header follows this frame\n            ptr = stream.next_frame;\n            \n            if (!(stream.getU8(ptr) === 0xff && (stream.getU8(ptr + 1) & 0xe0) === 0xe0)) {\n                ptr = stream.next_frame = stream.this_frame + 1;\n\n                // emulating 'goto sync'\n                syncing = true;\n                continue;\n            }\n            \n            stream.sync = true;\n        }\n    }\n    \n    header.flags |= MP3FrameHeader.FLAGS.INCOMPLETE;\n    return header;\n};\n\nMP3FrameHeader.free_bitrate = function(stream, header) {\n    var pad_slot = header.flags & MP3FrameHeader.FLAGS.PADDING ? 1 : 0,\n        slots_per_frame = header.layer === 3 && header.flags & MP3FrameHeader.FLAGS.LSF_EXT ? 72 : 144;\n    \n    var start = stream.offset();\n    var rate = 0;\n        \n    while (stream.doSync()) {\n        var peek_header = header.copy();\n        var peek_stream = stream.copy();\n        \n        if (peek_header.decode(peek_stream) && peek_header.layer === header.layer && peek_header.samplerate === header.samplerate) {\n            var N = stream.nextByte() - stream.this_frame;\n            \n            if (header.layer === 1) {\n                rate = header.samplerate * (N - 4 * pad_slot + 4) / 48 / 1000 | 0;\n            } else {\n                rate = header.samplerate * (N - pad_slot + 1) / slots_per_frame / 1000 | 0;\n            }\n            \n            if (rate >= 8)\n                break;\n        }\n        \n        stream.advance(8);\n    }\n    \n    stream.seek(start);\n    \n    if (rate < 8 || (header.layer === 3 && rate > 640))\n        throw new AV.UnderflowError(); // LOSTSYNC\n    \n    stream.freerate = rate * 1000;\n};\n\nmodule.exports = MP3FrameHeader;\n",
31    "/*\n * These are the Huffman code words for Layer III.\n * The data for these tables are derived from Table B.7 of ISO/IEC 11172-3.\n *\n * These tables support decoding up to 4 Huffman code bits at a time.\n */\n\nvar PTR = function(offs, bits) {\n    return {\n        final: 0,\n        ptr: {\n            bits:   bits,\n            offset: offs\n        }\n    };\n};\n\nvar huffquad_V = function (v, w, x, y, hlen) {\n    return {\n        final: 1,\n        value: {\n            v: v,\n            w: w,\n            x: x,\n            y: y,\n            hlen: hlen\n        }\n    };\n};\n\nconst hufftabA = [\n  /* 0000 */ PTR(16, 2),\n  /* 0001 */ PTR(20, 2),\n  /* 0010 */ PTR(24, 1),\n  /* 0011 */ PTR(26, 1),\n  /* 0100 */ huffquad_V(0, 0, 1, 0, 4),\n  /* 0101 */ huffquad_V(0, 0, 0, 1, 4),\n  /* 0110 */ huffquad_V(0, 1, 0, 0, 4),\n  /* 0111 */ huffquad_V(1, 0, 0, 0, 4),\n  /* 1000 */ huffquad_V(0, 0, 0, 0, 1),\n  /* 1001 */ huffquad_V(0, 0, 0, 0, 1),\n  /* 1010 */ huffquad_V(0, 0, 0, 0, 1),\n  /* 1011 */ huffquad_V(0, 0, 0, 0, 1),\n  /* 1100 */ huffquad_V(0, 0, 0, 0, 1),\n  /* 1101 */ huffquad_V(0, 0, 0, 0, 1),\n  /* 1110 */ huffquad_V(0, 0, 0, 0, 1),\n  /* 1111 */ huffquad_V(0, 0, 0, 0, 1),\n\n  /* 0000 ... */\n  /* 00   */ huffquad_V(1, 0, 1, 1, 2),\t/* 16 */\n  /* 01   */ huffquad_V(1, 1, 1, 1, 2),\n  /* 10   */ huffquad_V(1, 1, 0, 1, 2),\n  /* 11   */ huffquad_V(1, 1, 1, 0, 2),\n\n  /* 0001 ... */\n  /* 00   */ huffquad_V(0, 1, 1, 1, 2),\t/* 20 */\n  /* 01   */ huffquad_V(0, 1, 0, 1, 2),\n  /* 10   */ huffquad_V(1, 0, 0, 1, 1),\n  /* 11   */ huffquad_V(1, 0, 0, 1, 1),\n\n  /* 0010 ... */\n  /* 0    */ huffquad_V(0, 1, 1, 0, 1),\t/* 24 */\n  /* 1    */ huffquad_V(0, 0, 1, 1, 1),\n\n  /* 0011 ... */\n  /* 0    */ huffquad_V(1, 0, 1, 0, 1),\t/* 26 */\n  /* 1    */ huffquad_V(1, 1, 0, 0, 1)\n];\n\nconst hufftabB = [\n  /* 0000 */ huffquad_V(1, 1, 1, 1, 4),\n  /* 0001 */ huffquad_V(1, 1, 1, 0, 4),\n  /* 0010 */ huffquad_V(1, 1, 0, 1, 4),\n  /* 0011 */ huffquad_V(1, 1, 0, 0, 4),\n  /* 0100 */ huffquad_V(1, 0, 1, 1, 4),\n  /* 0101 */ huffquad_V(1, 0, 1, 0, 4),\n  /* 0110 */ huffquad_V(1, 0, 0, 1, 4),\n  /* 0111 */ huffquad_V(1, 0, 0, 0, 4),\n  /* 1000 */ huffquad_V(0, 1, 1, 1, 4),\n  /* 1001 */ huffquad_V(0, 1, 1, 0, 4),\n  /* 1010 */ huffquad_V(0, 1, 0, 1, 4),\n  /* 1011 */ huffquad_V(0, 1, 0, 0, 4),\n  /* 1100 */ huffquad_V(0, 0, 1, 1, 4),\n  /* 1101 */ huffquad_V(0, 0, 1, 0, 4),\n  /* 1110 */ huffquad_V(0, 0, 0, 1, 4),\n  /* 1111 */ huffquad_V(0, 0, 0, 0, 4)\n];\n\nvar V = function (x, y, hlen) {\n    return {\n        final: 1,\n        value: {\n            x: x,\n            y: y,\n            hlen: hlen\n        }\n    };\n};\n\nconst hufftab0 = [\n  /*      */ V(0, 0, 0)\n];\n\nconst hufftab1 = [\n  /* 000  */ V(1, 1, 3),\n  /* 001  */ V(0, 1, 3),\n  /* 010  */ V(1, 0, 2),\n  /* 011  */ V(1, 0, 2),\n  /* 100  */ V(0, 0, 1),\n  /* 101  */ V(0, 0, 1),\n  /* 110  */ V(0, 0, 1),\n  /* 111  */ V(0, 0, 1)\n];\n\nconst hufftab2 = [\n  /* 000  */ PTR(8, 3),\n  /* 001  */ V(1, 1, 3),\n  /* 010  */ V(0, 1, 3),\n  /* 011  */ V(1, 0, 3),\n  /* 100  */ V(0, 0, 1),\n  /* 101  */ V(0, 0, 1),\n  /* 110  */ V(0, 0, 1),\n  /* 111  */ V(0, 0, 1),\n\n  /* 000 ... */\n  /* 000  */ V(2, 2, 3),\t/* 8 */\n  /* 001  */ V(0, 2, 3),\n  /* 010  */ V(1, 2, 2),\n  /* 011  */ V(1, 2, 2),\n  /* 100  */ V(2, 1, 2),\n  /* 101  */ V(2, 1, 2),\n  /* 110  */ V(2, 0, 2),\n  /* 111  */ V(2, 0, 2)\n];\n\nconst hufftab3 = [\n  /* 000  */ PTR(8, 3),\n  /* 001  */ V(1, 0, 3),\n  /* 010  */ V(1, 1, 2),\n  /* 011  */ V(1, 1, 2),\n  /* 100  */ V(0, 1, 2),\n  /* 101  */ V(0, 1, 2),\n  /* 110  */ V(0, 0, 2),\n  /* 111  */ V(0, 0, 2),\n\n  /* 000 ... */\n  /* 000  */ V(2, 2, 3),\t/* 8 */\n  /* 001  */ V(0, 2, 3),\n  /* 010  */ V(1, 2, 2),\n  /* 011  */ V(1, 2, 2),\n  /* 100  */ V(2, 1, 2),\n  /* 101  */ V(2, 1, 2),\n  /* 110  */ V(2, 0, 2),\n  /* 111  */ V(2, 0, 2)\n];\n\nconst hufftab5 = [\n  /* 000  */ PTR(8, 4),\n  /* 001  */ V(1, 1, 3),\n  /* 010  */ V(0, 1, 3),\n  /* 011  */ V(1, 0, 3),\n  /* 100  */ V(0, 0, 1),\n  /* 101  */ V(0, 0, 1),\n  /* 110  */ V(0, 0, 1),\n  /* 111  */ V(0, 0, 1),\n\n  /* 000 ... */\n  /* 0000 */ PTR(24, 1),\t/* 8 */\n  /* 0001 */ V(3, 2, 4),\n  /* 0010 */ V(3, 1, 3),\n  /* 0011 */ V(3, 1, 3),\n  /* 0100 */ V(1, 3, 4),\n  /* 0101 */ V(0, 3, 4),\n  /* 0110 */ V(3, 0, 4),\n  /* 0111 */ V(2, 2, 4),\n  /* 1000 */ V(1, 2, 3),\n  /* 1001 */ V(1, 2, 3),\n  /* 1010 */ V(2, 1, 3),\n  /* 1011 */ V(2, 1, 3),\n  /* 1100 */ V(0, 2, 3),\n  /* 1101 */ V(0, 2, 3),\n  /* 1110 */ V(2, 0, 3),\n  /* 1111 */ V(2, 0, 3),\n\n  /* 000 0000 ... */\n  /* 0    */ V(3, 3, 1),\t/* 24 */\n  /* 1    */ V(2, 3, 1)\n];\n\nconst hufftab6 = [\n  /* 0000 */ PTR(16, 3),\n  /* 0001 */ PTR(24, 1),\n  /* 0010 */ PTR(26, 1),\n  /* 0011 */ V(1, 2, 4),\n  /* 0100 */ V(2, 1, 4),\n  /* 0101 */ V(2, 0, 4),\n  /* 0110 */ V(0, 1, 3),\n  /* 0111 */ V(0, 1, 3),\n  /* 1000 */ V(1, 1, 2),\n  /* 1001 */ V(1, 1, 2),\n  /* 1010 */ V(1, 1, 2),\n  /* 1011 */ V(1, 1, 2),\n  /* 1100 */ V(1, 0, 3),\n  /* 1101 */ V(1, 0, 3),\n  /* 1110 */ V(0, 0, 3),\n  /* 1111 */ V(0, 0, 3),\n\n  /* 0000 ... */\n  /* 000  */ V(3, 3, 3),\t/* 16 */\n  /* 001  */ V(0, 3, 3),\n  /* 010  */ V(2, 3, 2),\n  /* 011  */ V(2, 3, 2),\n  /* 100  */ V(3, 2, 2),\n  /* 101  */ V(3, 2, 2),\n  /* 110  */ V(3, 0, 2),\n  /* 111  */ V(3, 0, 2),\n\n  /* 0001 ... */\n  /* 0    */ V(1, 3, 1),\t/* 24 */\n  /* 1    */ V(3, 1, 1),\n\n  /* 0010 ... */\n  /* 0    */ V(2, 2, 1),\t/* 26 */\n  /* 1    */ V(0, 2, 1)\n];\n\nconst hufftab7 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ PTR(48, 2),\n  /* 0011 */ V(1, 1, 4),\n  /* 0100 */ V(0, 1, 3),\n  /* 0101 */ V(0, 1, 3),\n  /* 0110 */ V(1, 0, 3),\n  /* 0111 */ V(1, 0, 3),\n  /* 1000 */ V(0, 0, 1),\n  /* 1001 */ V(0, 0, 1),\n  /* 1010 */ V(0, 0, 1),\n  /* 1011 */ V(0, 0, 1),\n  /* 1100 */ V(0, 0, 1),\n  /* 1101 */ V(0, 0, 1),\n  /* 1110 */ V(0, 0, 1),\n  /* 1111 */ V(0, 0, 1),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(52, 2),\t/* 16 */\n  /* 0001 */ PTR(56, 1),\n  /* 0010 */ PTR(58, 1),\n  /* 0011 */ V(1, 5, 4),\n  /* 0100 */ V(5, 1, 4),\n  /* 0101 */ PTR(60, 1),\n  /* 0110 */ V(5, 0, 4),\n  /* 0111 */ PTR(62, 1),\n  /* 1000 */ V(2, 4, 4),\n  /* 1001 */ V(4, 2, 4),\n  /* 1010 */ V(1, 4, 3),\n  /* 1011 */ V(1, 4, 3),\n  /* 1100 */ V(4, 1, 3),\n  /* 1101 */ V(4, 1, 3),\n  /* 1110 */ V(4, 0, 3),\n  /* 1111 */ V(4, 0, 3),\n\n  /* 0001 ... */\n  /* 0000 */ V(0, 4, 4),\t/* 32 */\n  /* 0001 */ V(2, 3, 4),\n  /* 0010 */ V(3, 2, 4),\n  /* 0011 */ V(0, 3, 4),\n  /* 0100 */ V(1, 3, 3),\n  /* 0101 */ V(1, 3, 3),\n  /* 0110 */ V(3, 1, 3),\n  /* 0111 */ V(3, 1, 3),\n  /* 1000 */ V(3, 0, 3),\n  /* 1001 */ V(3, 0, 3),\n  /* 1010 */ V(2, 2, 3),\n  /* 1011 */ V(2, 2, 3),\n  /* 1100 */ V(1, 2, 2),\n  /* 1101 */ V(1, 2, 2),\n  /* 1110 */ V(1, 2, 2),\n  /* 1111 */ V(1, 2, 2),\n\n  /* 0010 ... */\n  /* 00   */ V(2, 1, 1),\t/* 48 */\n  /* 01   */ V(2, 1, 1),\n  /* 10   */ V(0, 2, 2),\n  /* 11   */ V(2, 0, 2),\n\n  /* 0000 0000 ... */\n  /* 00   */ V(5, 5, 2),\t/* 52 */\n  /* 01   */ V(4, 5, 2),\n  /* 10   */ V(5, 4, 2),\n  /* 11   */ V(5, 3, 2),\n\n  /* 0000 0001 ... */\n  /* 0    */ V(3, 5, 1),\t/* 56 */\n  /* 1    */ V(4, 4, 1),\n\n  /* 0000 0010 ... */\n  /* 0    */ V(2, 5, 1),\t/* 58 */\n  /* 1    */ V(5, 2, 1),\n\n  /* 0000 0101 ... */\n  /* 0    */ V(0, 5, 1),\t/* 60 */\n  /* 1    */ V(3, 4, 1),\n\n  /* 0000 0111 ... */\n  /* 0    */ V(4, 3, 1),\t/* 62 */\n  /* 1    */ V(3, 3, 1)\n];\n\nconst hufftab8 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ V(1, 2, 4),\n  /* 0011 */ V(2, 1, 4),\n  /* 0100 */ V(1, 1, 2),\n  /* 0101 */ V(1, 1, 2),\n  /* 0110 */ V(1, 1, 2),\n  /* 0111 */ V(1, 1, 2),\n  /* 1000 */ V(0, 1, 3),\n  /* 1001 */ V(0, 1, 3),\n  /* 1010 */ V(1, 0, 3),\n  /* 1011 */ V(1, 0, 3),\n  /* 1100 */ V(0, 0, 2),\n  /* 1101 */ V(0, 0, 2),\n  /* 1110 */ V(0, 0, 2),\n  /* 1111 */ V(0, 0, 2),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(48, 3),\t/* 16 */\n  /* 0001 */ PTR(56, 2),\n  /* 0010 */ PTR(60, 1),\n  /* 0011 */ V(1, 5, 4),\n  /* 0100 */ V(5, 1, 4),\n  /* 0101 */ PTR(62, 1),\n  /* 0110 */ PTR(64, 1),\n  /* 0111 */ V(2, 4, 4),\n  /* 1000 */ V(4, 2, 4),\n  /* 1001 */ V(1, 4, 4),\n  /* 1010 */ V(4, 1, 3),\n  /* 1011 */ V(4, 1, 3),\n  /* 1100 */ V(0, 4, 4),\n  /* 1101 */ V(4, 0, 4),\n  /* 1110 */ V(2, 3, 4),\n  /* 1111 */ V(3, 2, 4),\n\n  /* 0001 ... */\n  /* 0000 */ V(1, 3, 4),\t/* 32 */\n  /* 0001 */ V(3, 1, 4),\n  /* 0010 */ V(0, 3, 4),\n  /* 0011 */ V(3, 0, 4),\n  /* 0100 */ V(2, 2, 2),\n  /* 0101 */ V(2, 2, 2),\n  /* 0110 */ V(2, 2, 2),\n  /* 0111 */ V(2, 2, 2),\n  /* 1000 */ V(0, 2, 2),\n  /* 1001 */ V(0, 2, 2),\n  /* 1010 */ V(0, 2, 2),\n  /* 1011 */ V(0, 2, 2),\n  /* 1100 */ V(2, 0, 2),\n  /* 1101 */ V(2, 0, 2),\n  /* 1110 */ V(2, 0, 2),\n  /* 1111 */ V(2, 0, 2),\n\n  /* 0000 0000 ... */\n  /* 000  */ V(5, 5, 3),\t/* 48 */\n  /* 001  */ V(5, 4, 3),\n  /* 010  */ V(4, 5, 2),\n  /* 011  */ V(4, 5, 2),\n  /* 100  */ V(5, 3, 1),\n  /* 101  */ V(5, 3, 1),\n  /* 110  */ V(5, 3, 1),\n  /* 111  */ V(5, 3, 1),\n\n  /* 0000 0001 ... */\n  /* 00   */ V(3, 5, 2),\t/* 56 */\n  /* 01   */ V(4, 4, 2),\n  /* 10   */ V(2, 5, 1),\n  /* 11   */ V(2, 5, 1),\n\n  /* 0000 0010 ... */\n  /* 0    */ V(5, 2, 1),\t/* 60 */\n  /* 1    */ V(0, 5, 1),\n\n  /* 0000 0101 ... */\n  /* 0    */ V(3, 4, 1),\t/* 62 */\n  /* 1    */ V(4, 3, 1),\n\n  /* 0000 0110 ... */\n  /* 0    */ V(5, 0, 1),\t/* 64 */\n  /* 1    */ V(3, 3, 1)\n];\n\nconst hufftab9 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 3),\n  /* 0010 */ PTR(40, 2),\n  /* 0011 */ PTR(44, 2),\n  /* 0100 */ PTR(48, 1),\n  /* 0101 */ V(1, 2, 4),\n  /* 0110 */ V(2, 1, 4),\n  /* 0111 */ V(2, 0, 4),\n  /* 1000 */ V(1, 1, 3),\n  /* 1001 */ V(1, 1, 3),\n  /* 1010 */ V(0, 1, 3),\n  /* 1011 */ V(0, 1, 3),\n  /* 1100 */ V(1, 0, 3),\n  /* 1101 */ V(1, 0, 3),\n  /* 1110 */ V(0, 0, 3),\n  /* 1111 */ V(0, 0, 3),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(50, 1),\t/* 16 */\n  /* 0001 */ V(3, 5, 4),\n  /* 0010 */ V(5, 3, 4),\n  /* 0011 */ PTR(52, 1),\n  /* 0100 */ V(4, 4, 4),\n  /* 0101 */ V(2, 5, 4),\n  /* 0110 */ V(5, 2, 4),\n  /* 0111 */ V(1, 5, 4),\n  /* 1000 */ V(5, 1, 3),\n  /* 1001 */ V(5, 1, 3),\n  /* 1010 */ V(3, 4, 3),\n  /* 1011 */ V(3, 4, 3),\n  /* 1100 */ V(4, 3, 3),\n  /* 1101 */ V(4, 3, 3),\n  /* 1110 */ V(5, 0, 4),\n  /* 1111 */ V(0, 4, 4),\n\n  /* 0001 ... */\n  /* 000  */ V(2, 4, 3),\t/* 32 */\n  /* 001  */ V(4, 2, 3),\n  /* 010  */ V(3, 3, 3),\n  /* 011  */ V(4, 0, 3),\n  /* 100  */ V(1, 4, 2),\n  /* 101  */ V(1, 4, 2),\n  /* 110  */ V(4, 1, 2),\n  /* 111  */ V(4, 1, 2),\n\n  /* 0010 ... */\n  /* 00   */ V(2, 3, 2),\t/* 40 */\n  /* 01   */ V(3, 2, 2),\n  /* 10   */ V(1, 3, 1),\n  /* 11   */ V(1, 3, 1),\n\n  /* 0011 ... */\n  /* 00   */ V(3, 1, 1),\t/* 44 */\n  /* 01   */ V(3, 1, 1),\n  /* 10   */ V(0, 3, 2),\n  /* 11   */ V(3, 0, 2),\n\n  /* 0100 ... */\n  /* 0    */ V(2, 2, 1),\t/* 48 */\n  /* 1    */ V(0, 2, 1),\n\n  /* 0000 0000 ... */\n  /* 0    */ V(5, 5, 1),\t/* 50 */\n  /* 1    */ V(4, 5, 1),\n\n  /* 0000 0011 ... */\n  /* 0    */ V(5, 4, 1),\t/* 52 */\n  /* 1    */ V(0, 5, 1)\n];\n\nconst hufftab10 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ PTR(48, 2),\n  /* 0011 */ V(1, 1, 4),\n  /* 0100 */ V(0, 1, 3),\n  /* 0101 */ V(0, 1, 3),\n  /* 0110 */ V(1, 0, 3),\n  /* 0111 */ V(1, 0, 3),\n  /* 1000 */ V(0, 0, 1),\n  /* 1001 */ V(0, 0, 1),\n  /* 1010 */ V(0, 0, 1),\n  /* 1011 */ V(0, 0, 1),\n  /* 1100 */ V(0, 0, 1),\n  /* 1101 */ V(0, 0, 1),\n  /* 1110 */ V(0, 0, 1),\n  /* 1111 */ V(0, 0, 1),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(52, 3),\t/* 16 */\n  /* 0001 */ PTR(60, 2),\n  /* 0010 */ PTR(64, 3),\n  /* 0011 */ PTR(72, 1),\n  /* 0100 */ PTR(74, 2),\n  /* 0101 */ PTR(78, 2),\n  /* 0110 */ PTR(82, 2),\n  /* 0111 */ V(1, 7, 4),\n  /* 1000 */ V(7, 1, 4),\n  /* 1001 */ PTR(86, 1),\n  /* 1010 */ PTR(88, 2),\n  /* 1011 */ PTR(92, 2),\n  /* 1100 */ V(1, 6, 4),\n  /* 1101 */ V(6, 1, 4),\n  /* 1110 */ V(6, 0, 4),\n  /* 1111 */ PTR(96, 1),\n\n  /* 0001 ... */\n  /* 0000 */ PTR(98, 1),\t/* 32 */\n  /* 0001 */ PTR(100, 1),\n  /* 0010 */ V(1, 4, 4),\n  /* 0011 */ V(4, 1, 4),\n  /* 0100 */ V(4, 0, 4),\n  /* 0101 */ V(2, 3, 4),\n  /* 0110 */ V(3, 2, 4),\n  /* 0111 */ V(0, 3, 4),\n  /* 1000 */ V(1, 3, 3),\n  /* 1001 */ V(1, 3, 3),\n  /* 1010 */ V(3, 1, 3),\n  /* 1011 */ V(3, 1, 3),\n  /* 1100 */ V(3, 0, 3),\n  /* 1101 */ V(3, 0, 3),\n  /* 1110 */ V(2, 2, 3),\n  /* 1111 */ V(2, 2, 3),\n\n  /* 0010 ... */\n  /* 00   */ V(1, 2, 2),\t/* 48 */\n  /* 01   */ V(2, 1, 2),\n  /* 10   */ V(0, 2, 2),\n  /* 11   */ V(2, 0, 2),\n\n  /* 0000 0000 ... */\n  /* 000  */ V(7, 7, 3),\t/* 52 */\n  /* 001  */ V(6, 7, 3),\n  /* 010  */ V(7, 6, 3),\n  /* 011  */ V(5, 7, 3),\n  /* 100  */ V(7, 5, 3),\n  /* 101  */ V(6, 6, 3),\n  /* 110  */ V(4, 7, 2),\n  /* 111  */ V(4, 7, 2),\n\n  /* 0000 0001 ... */\n  /* 00   */ V(7, 4, 2),\t/* 60 */\n  /* 01   */ V(5, 6, 2),\n  /* 10   */ V(6, 5, 2),\n  /* 11   */ V(3, 7, 2),\n\n  /* 0000 0010 ... */\n  /* 000  */ V(7, 3, 2),\t/* 64 */\n  /* 001  */ V(7, 3, 2),\n  /* 010  */ V(4, 6, 2),\n  /* 011  */ V(4, 6, 2),\n  /* 100  */ V(5, 5, 3),\n  /* 101  */ V(5, 4, 3),\n  /* 110  */ V(6, 3, 2),\n  /* 111  */ V(6, 3, 2),\n\n  /* 0000 0011 ... */\n  /* 0    */ V(2, 7, 1),\t/* 72 */\n  /* 1    */ V(7, 2, 1),\n\n  /* 0000 0100 ... */\n  /* 00   */ V(6, 4, 2),\t/* 74 */\n  /* 01   */ V(0, 7, 2),\n  /* 10   */ V(7, 0, 1),\n  /* 11   */ V(7, 0, 1),\n\n  /* 0000 0101 ... */\n  /* 00   */ V(6, 2, 1),\t/* 78 */\n  /* 01   */ V(6, 2, 1),\n  /* 10   */ V(4, 5, 2),\n  /* 11   */ V(3, 5, 2),\n\n  /* 0000 0110 ... */\n  /* 00   */ V(0, 6, 1),\t/* 82 */\n  /* 01   */ V(0, 6, 1),\n  /* 10   */ V(5, 3, 2),\n  /* 11   */ V(4, 4, 2),\n\n  /* 0000 1001 ... */\n  /* 0    */ V(3, 6, 1),\t/* 86 */\n  /* 1    */ V(2, 6, 1),\n\n  /* 0000 1010 ... */\n  /* 00   */ V(2, 5, 2),\t/* 88 */\n  /* 01   */ V(5, 2, 2),\n  /* 10   */ V(1, 5, 1),\n  /* 11   */ V(1, 5, 1),\n\n  /* 0000 1011 ... */\n  /* 00   */ V(5, 1, 1),\t/* 92 */\n  /* 01   */ V(5, 1, 1),\n  /* 10   */ V(3, 4, 2),\n  /* 11   */ V(4, 3, 2),\n\n  /* 0000 1111 ... */\n  /* 0    */ V(0, 5, 1),\t/* 96 */\n  /* 1    */ V(5, 0, 1),\n\n  /* 0001 0000 ... */\n  /* 0    */ V(2, 4, 1),\t/* 98 */\n  /* 1    */ V(4, 2, 1),\n\n  /* 0001 0001 ... */\n  /* 0    */ V(3, 3, 1),\t/* 100 */\n  /* 1    */ V(0, 4, 1)\n];\n\nconst hufftab11 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ PTR(48, 4),\n  /* 0011 */ PTR(64, 3),\n  /* 0100 */ V(1, 2, 4),\n  /* 0101 */ PTR(72, 1),\n  /* 0110 */ V(1, 1, 3),\n  /* 0111 */ V(1, 1, 3),\n  /* 1000 */ V(0, 1, 3),\n  /* 1001 */ V(0, 1, 3),\n  /* 1010 */ V(1, 0, 3),\n  /* 1011 */ V(1, 0, 3),\n  /* 1100 */ V(0, 0, 2),\n  /* 1101 */ V(0, 0, 2),\n  /* 1110 */ V(0, 0, 2),\n  /* 1111 */ V(0, 0, 2),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(74, 2),\t/* 16 */\n  /* 0001 */ PTR(78, 3),\n  /* 0010 */ PTR(86, 2),\n  /* 0011 */ PTR(90, 1),\n  /* 0100 */ PTR(92, 2),\n  /* 0101 */ V(2, 7, 4),\n  /* 0110 */ V(7, 2, 4),\n  /* 0111 */ PTR(96, 1),\n  /* 1000 */ V(7, 1, 3),\n  /* 1001 */ V(7, 1, 3),\n  /* 1010 */ V(1, 7, 4),\n  /* 1011 */ V(7, 0, 4),\n  /* 1100 */ V(3, 6, 4),\n  /* 1101 */ V(6, 3, 4),\n  /* 1110 */ V(6, 0, 4),\n  /* 1111 */ PTR(98, 1),\n\n  /* 0001 ... */\n  /* 0000 */ PTR(100, 1),\t/* 32 */\n  /* 0001 */ V(1, 5, 4),\n  /* 0010 */ V(6, 2, 3),\n  /* 0011 */ V(6, 2, 3),\n  /* 0100 */ V(2, 6, 4),\n  /* 0101 */ V(0, 6, 4),\n  /* 0110 */ V(1, 6, 3),\n  /* 0111 */ V(1, 6, 3),\n  /* 1000 */ V(6, 1, 3),\n  /* 1001 */ V(6, 1, 3),\n  /* 1010 */ V(5, 1, 4),\n  /* 1011 */ V(3, 4, 4),\n  /* 1100 */ V(5, 0, 4),\n  /* 1101 */ PTR(102, 1),\n  /* 1110 */ V(2, 4, 4),\n  /* 1111 */ V(4, 2, 4),\n\n  /* 0010 ... */\n  /* 0000 */ V(1, 4, 4),\t/* 48 */\n  /* 0001 */ V(4, 1, 4),\n  /* 0010 */ V(0, 4, 4),\n  /* 0011 */ V(4, 0, 4),\n  /* 0100 */ V(2, 3, 3),\n  /* 0101 */ V(2, 3, 3),\n  /* 0110 */ V(3, 2, 3),\n  /* 0111 */ V(3, 2, 3),\n  /* 1000 */ V(1, 3, 2),\n  /* 1001 */ V(1, 3, 2),\n  /* 1010 */ V(1, 3, 2),\n  /* 1011 */ V(1, 3, 2),\n  /* 1100 */ V(3, 1, 2),\n  /* 1101 */ V(3, 1, 2),\n  /* 1110 */ V(3, 1, 2),\n  /* 1111 */ V(3, 1, 2),\n\n  /* 0011 ... */\n  /* 000  */ V(0, 3, 3),\t/* 64 */\n  /* 001  */ V(3, 0, 3),\n  /* 010  */ V(2, 2, 2),\n  /* 011  */ V(2, 2, 2),\n  /* 100  */ V(2, 1, 1),\n  /* 101  */ V(2, 1, 1),\n  /* 110  */ V(2, 1, 1),\n  /* 111  */ V(2, 1, 1),\n\n  /* 0101 ... */\n  /* 0    */ V(0, 2, 1),\t/* 72 */\n  /* 1    */ V(2, 0, 1),\n\n  /* 0000 0000 ... */\n  /* 00   */ V(7, 7, 2),\t/* 74 */\n  /* 01   */ V(6, 7, 2),\n  /* 10   */ V(7, 6, 2),\n  /* 11   */ V(7, 5, 2),\n\n  /* 0000 0001 ... */\n  /* 000  */ V(6, 6, 2),\t/* 78 */\n  /* 001  */ V(6, 6, 2),\n  /* 010  */ V(4, 7, 2),\n  /* 011  */ V(4, 7, 2),\n  /* 100  */ V(7, 4, 2),\n  /* 101  */ V(7, 4, 2),\n  /* 110  */ V(5, 7, 3),\n  /* 111  */ V(5, 5, 3),\n\n  /* 0000 0010 ... */\n  /* 00   */ V(5, 6, 2),\t/* 86 */\n  /* 01   */ V(6, 5, 2),\n  /* 10   */ V(3, 7, 1),\n  /* 11   */ V(3, 7, 1),\n\n  /* 0000 0011 ... */\n  /* 0    */ V(7, 3, 1),\t/* 90 */\n  /* 1    */ V(4, 6, 1),\n\n  /* 0000 0100 ... */\n  /* 00   */ V(4, 5, 2),\t/* 92 */\n  /* 01   */ V(5, 4, 2),\n  /* 10   */ V(3, 5, 2),\n  /* 11   */ V(5, 3, 2),\n\n  /* 0000 0111 ... */\n  /* 0    */ V(6, 4, 1),\t/* 96 */\n  /* 1    */ V(0, 7, 1),\n\n  /* 0000 1111 ... */\n  /* 0    */ V(4, 4, 1),\t/* 98 */\n  /* 1    */ V(2, 5, 1),\n\n  /* 0001 0000 ... */\n  /* 0    */ V(5, 2, 1),\t/* 100 */\n  /* 1    */ V(0, 5, 1),\n\n  /* 0001 1101 ... */\n  /* 0    */ V(4, 3, 1),\t/* 102 */\n  /* 1    */ V(3, 3, 1)\n];\n\nconst hufftab12 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ PTR(48, 4),\n  /* 0011 */ PTR(64, 2),\n  /* 0100 */ PTR(68, 3),\n  /* 0101 */ PTR(76, 1),\n  /* 0110 */ V(1, 2, 4),\n  /* 0111 */ V(2, 1, 4),\n  /* 1000 */ PTR(78, 1),\n  /* 1001 */ V(0, 0, 4),\n  /* 1010 */ V(1, 1, 3),\n  /* 1011 */ V(1, 1, 3),\n  /* 1100 */ V(0, 1, 3),\n  /* 1101 */ V(0, 1, 3),\n  /* 1110 */ V(1, 0, 3),\n  /* 1111 */ V(1, 0, 3),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(80, 2),\t/* 16 */\n  /* 0001 */ PTR(84, 1),\n  /* 0010 */ PTR(86, 1),\n  /* 0011 */ PTR(88, 1),\n  /* 0100 */ V(5, 6, 4),\n  /* 0101 */ V(3, 7, 4),\n  /* 0110 */ PTR(90, 1),\n  /* 0111 */ V(2, 7, 4),\n  /* 1000 */ V(7, 2, 4),\n  /* 1001 */ V(4, 6, 4),\n  /* 1010 */ V(6, 4, 4),\n  /* 1011 */ V(1, 7, 4),\n  /* 1100 */ V(7, 1, 4),\n  /* 1101 */ PTR(92, 1),\n  /* 1110 */ V(3, 6, 4),\n  /* 1111 */ V(6, 3, 4),\n\n  /* 0001 ... */\n  /* 0000 */ V(4, 5, 4),\t/* 32 */\n  /* 0001 */ V(5, 4, 4),\n  /* 0010 */ V(4, 4, 4),\n  /* 0011 */ PTR(94, 1),\n  /* 0100 */ V(2, 6, 3),\n  /* 0101 */ V(2, 6, 3),\n  /* 0110 */ V(6, 2, 3),\n  /* 0111 */ V(6, 2, 3),\n  /* 1000 */ V(6, 1, 3),\n  /* 1001 */ V(6, 1, 3),\n  /* 1010 */ V(1, 6, 4),\n  /* 1011 */ V(6, 0, 4),\n  /* 1100 */ V(3, 5, 4),\n  /* 1101 */ V(5, 3, 4),\n  /* 1110 */ V(2, 5, 4),\n  /* 1111 */ V(5, 2, 4),\n\n  /* 0010 ... */\n  /* 0000 */ V(1, 5, 3),\t/* 48 */\n  /* 0001 */ V(1, 5, 3),\n  /* 0010 */ V(5, 1, 3),\n  /* 0011 */ V(5, 1, 3),\n  /* 0100 */ V(3, 4, 3),\n  /* 0101 */ V(3, 4, 3),\n  /* 0110 */ V(4, 3, 3),\n  /* 0111 */ V(4, 3, 3),\n  /* 1000 */ V(5, 0, 4),\n  /* 1001 */ V(0, 4, 4),\n  /* 1010 */ V(2, 4, 3),\n  /* 1011 */ V(2, 4, 3),\n  /* 1100 */ V(4, 2, 3),\n  /* 1101 */ V(4, 2, 3),\n  /* 1110 */ V(1, 4, 3),\n  /* 1111 */ V(1, 4, 3),\n\n  /* 0011 ... */\n  /* 00   */ V(3, 3, 2),\t/* 64 */\n  /* 01   */ V(4, 1, 2),\n  /* 10   */ V(2, 3, 2),\n  /* 11   */ V(3, 2, 2),\n\n  /* 0100 ... */\n  /* 000  */ V(4, 0, 3),\t/* 68 */\n  /* 001  */ V(0, 3, 3),\n  /* 010  */ V(3, 0, 2),\n  /* 011  */ V(3, 0, 2),\n  /* 100  */ V(1, 3, 1),\n  /* 101  */ V(1, 3, 1),\n  /* 110  */ V(1, 3, 1),\n  /* 111  */ V(1, 3, 1),\n\n  /* 0101 ... */\n  /* 0    */ V(3, 1, 1),\t/* 76 */\n  /* 1    */ V(2, 2, 1),\n\n  /* 1000 ... */\n  /* 0    */ V(0, 2, 1),\t/* 78 */\n  /* 1    */ V(2, 0, 1),\n\n  /* 0000 0000 ... */\n  /* 00   */ V(7, 7, 2),\t/* 80 */\n  /* 01   */ V(6, 7, 2),\n  /* 10   */ V(7, 6, 1),\n  /* 11   */ V(7, 6, 1),\n\n  /* 0000 0001 ... */\n  /* 0    */ V(5, 7, 1),\t/* 84 */\n  /* 1    */ V(7, 5, 1),\n\n  /* 0000 0010 ... */\n  /* 0    */ V(6, 6, 1),\t/* 86 */\n  /* 1    */ V(4, 7, 1),\n\n  /* 0000 0011 ... */\n  /* 0    */ V(7, 4, 1),\t/* 88 */\n  /* 1    */ V(6, 5, 1),\n\n  /* 0000 0110 ... */\n  /* 0    */ V(7, 3, 1),\t/* 90 */\n  /* 1    */ V(5, 5, 1),\n\n  /* 0000 1101 ... */\n  /* 0    */ V(0, 7, 1),\t/* 92 */\n  /* 1    */ V(7, 0, 1),\n\n  /* 0001 0011 ... */\n  /* 0    */ V(0, 6, 1),\t/* 94 */\n  /* 1    */ V(0, 5, 1)\n];\n\nconst hufftab13 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ PTR(48, 4),\n  /* 0011 */ PTR(64, 2),\n  /* 0100 */ V(1, 1, 4),\n  /* 0101 */ V(0, 1, 4),\n  /* 0110 */ V(1, 0, 3),\n  /* 0111 */ V(1, 0, 3),\n  /* 1000 */ V(0, 0, 1),\n  /* 1001 */ V(0, 0, 1),\n  /* 1010 */ V(0, 0, 1),\n  /* 1011 */ V(0, 0, 1),\n  /* 1100 */ V(0, 0, 1),\n  /* 1101 */ V(0, 0, 1),\n  /* 1110 */ V(0, 0, 1),\n  /* 1111 */ V(0, 0, 1),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(68, 4),\t/* 16 */\n  /* 0001 */ PTR(84, 4),\n  /* 0010 */ PTR(100, 4),\n  /* 0011 */ PTR(116, 4),\n  /* 0100 */ PTR(132, 4),\n  /* 0101 */ PTR(148, 4),\n  /* 0110 */ PTR(164, 3),\n  /* 0111 */ PTR(172, 3),\n  /* 1000 */ PTR(180, 3),\n  /* 1001 */ PTR(188, 3),\n  /* 1010 */ PTR(196, 3),\n  /* 1011 */ PTR(204, 3),\n  /* 1100 */ PTR(212, 1),\n  /* 1101 */ PTR(214, 2),\n  /* 1110 */ PTR(218, 3),\n  /* 1111 */ PTR(226, 1),\n\n  /* 0001 ... */\n  /* 0000 */ PTR(228, 2),\t/* 32 */\n  /* 0001 */ PTR(232, 2),\n  /* 0010 */ PTR(236, 2),\n  /* 0011 */ PTR(240, 2),\n  /* 0100 */ V(8, 1, 4),\n  /* 0101 */ PTR(244, 1),\n  /* 0110 */ PTR(246, 1),\n  /* 0111 */ PTR(248, 1),\n  /* 1000 */ PTR(250, 2),\n  /* 1001 */ PTR(254, 1),\n  /* 1010 */ V(1, 5, 4),\n  /* 1011 */ V(5, 1, 4),\n  /* 1100 */ PTR(256, 1),\n  /* 1101 */ PTR(258, 1),\n  /* 1110 */ PTR(260, 1),\n  /* 1111 */ V(1, 4, 4),\n\n  /* 0010 ... */\n  /* 0000 */ V(4, 1, 3),\t/* 48 */\n  /* 0001 */ V(4, 1, 3),\n  /* 0010 */ V(0, 4, 4),\n  /* 0011 */ V(4, 0, 4),\n  /* 0100 */ V(2, 3, 4),\n  /* 0101 */ V(3, 2, 4),\n  /* 0110 */ V(1, 3, 3),\n  /* 0111 */ V(1, 3, 3),\n  /* 1000 */ V(3, 1, 3),\n  /* 1001 */ V(3, 1, 3),\n  /* 1010 */ V(0, 3, 3),\n  /* 1011 */ V(0, 3, 3),\n  /* 1100 */ V(3, 0, 3),\n  /* 1101 */ V(3, 0, 3),\n  /* 1110 */ V(2, 2, 3),\n  /* 1111 */ V(2, 2, 3),\n\n  /* 0011 ... */\n  /* 00   */ V(1, 2, 2),\t/* 64 */\n  /* 01   */ V(2, 1, 2),\n  /* 10   */ V(0, 2, 2),\n  /* 11   */ V(2, 0, 2),\n\n  /* 0000 0000 ... */\n  /* 0000 */ PTR(262, 4),\t/* 68 */\n  /* 0001 */ PTR(278, 4),\n  /* 0010 */ PTR(294, 4),\n  /* 0011 */ PTR(310, 3),\n  /* 0100 */ PTR(318, 2),\n  /* 0101 */ PTR(322, 2),\n  /* 0110 */ PTR(326, 3),\n  /* 0111 */ PTR(334, 2),\n  /* 1000 */ PTR(338, 1),\n  /* 1001 */ PTR(340, 2),\n  /* 1010 */ PTR(344, 2),\n  /* 1011 */ PTR(348, 2),\n  /* 1100 */ PTR(352, 2),\n  /* 1101 */ PTR(356, 2),\n  /* 1110 */ V(1, 15, 4),\n  /* 1111 */ V(15, 1, 4),\n\n  /* 0000 0001 ... */\n  /* 0000 */ V(15, 0, 4),\t/* 84 */\n  /* 0001 */ PTR(360, 1),\n  /* 0010 */ PTR(362, 1),\n  /* 0011 */ PTR(364, 1),\n  /* 0100 */ V(14, 2, 4),\n  /* 0101 */ PTR(366, 1),\n  /* 0110 */ V(1, 14, 4),\n  /* 0111 */ V(14, 1, 4),\n  /* 1000 */ PTR(368, 1),\n  /* 1001 */ PTR(370, 1),\n  /* 1010 */ PTR(372, 1),\n  /* 1011 */ PTR(374, 1),\n  /* 1100 */ PTR(376, 1),\n  /* 1101 */ PTR(378, 1),\n  /* 1110 */ V(12, 6, 4),\n  /* 1111 */ V(3, 13, 4),\n\n  /* 0000 0010 ... */\n  /* 0000 */ PTR(380, 1),\t/* 100 */\n  /* 0001 */ V(2, 13, 4),\n  /* 0010 */ V(13, 2, 4),\n  /* 0011 */ V(1, 13, 4),\n  /* 0100 */ V(11, 7, 4),\n  /* 0101 */ PTR(382, 1),\n  /* 0110 */ PTR(384, 1),\n  /* 0111 */ V(12, 3, 4),\n  /* 1000 */ PTR(386, 1),\n  /* 1001 */ V(4, 11, 4),\n  /* 1010 */ V(13, 1, 3),\n  /* 1011 */ V(13, 1, 3),\n  /* 1100 */ V(0, 13, 4),\n  /* 1101 */ V(13, 0, 4),\n  /* 1110 */ V(8, 10, 4),\n  /* 1111 */ V(10, 8, 4),\n\n  /* 0000 0011 ... */\n  /* 0000 */ V(4, 12, 4),\t/* 116 */\n  /* 0001 */ V(12, 4, 4),\n  /* 0010 */ V(6, 11, 4),\n  /* 0011 */ V(11, 6, 4),\n  /* 0100 */ V(3, 12, 3),\n  /* 0101 */ V(3, 12, 3),\n  /* 0110 */ V(2, 12, 3),\n  /* 0111 */ V(2, 12, 3),\n  /* 1000 */ V(12, 2, 3),\n  /* 1001 */ V(12, 2, 3),\n  /* 1010 */ V(5, 11, 3),\n  /* 1011 */ V(5, 11, 3),\n  /* 1100 */ V(11, 5, 4),\n  /* 1101 */ V(8, 9, 4),\n  /* 1110 */ V(1, 12, 3),\n  /* 1111 */ V(1, 12, 3),\n\n  /* 0000 0100 ... */\n  /* 0000 */ V(12, 1, 3),\t/* 132 */\n  /* 0001 */ V(12, 1, 3),\n  /* 0010 */ V(9, 8, 4),\n  /* 0011 */ V(0, 12, 4),\n  /* 0100 */ V(12, 0, 3),\n  /* 0101 */ V(12, 0, 3),\n  /* 0110 */ V(11, 4, 4),\n  /* 0111 */ V(6, 10, 4),\n  /* 1000 */ V(10, 6, 4),\n  /* 1001 */ V(7, 9, 4),\n  /* 1010 */ V(3, 11, 3),\n  /* 1011 */ V(3, 11, 3),\n  /* 1100 */ V(11, 3, 3),\n  /* 1101 */ V(11, 3, 3),\n  /* 1110 */ V(8, 8, 4),\n  /* 1111 */ V(5, 10, 4),\n\n  /* 0000 0101 ... */\n  /* 0000 */ V(2, 11, 3),\t/* 148 */\n  /* 0001 */ V(2, 11, 3),\n  /* 0010 */ V(10, 5, 4),\n  /* 0011 */ V(6, 9, 4),\n  /* 0100 */ V(10, 4, 3),\n  /* 0101 */ V(10, 4, 3),\n  /* 0110 */ V(7, 8, 4),\n  /* 0111 */ V(8, 7, 4),\n  /* 1000 */ V(9, 4, 3),\n  /* 1001 */ V(9, 4, 3),\n  /* 1010 */ V(7, 7, 4),\n  /* 1011 */ V(7, 6, 4),\n  /* 1100 */ V(11, 2, 2),\n  /* 1101 */ V(11, 2, 2),\n  /* 1110 */ V(11, 2, 2),\n  /* 1111 */ V(11, 2, 2),\n\n  /* 0000 0110 ... */\n  /* 000  */ V(1, 11, 2),\t/* 164 */\n  /* 001  */ V(1, 11, 2),\n  /* 010  */ V(11, 1, 2),\n  /* 011  */ V(11, 1, 2),\n  /* 100  */ V(0, 11, 3),\n  /* 101  */ V(11, 0, 3),\n  /* 110  */ V(9, 6, 3),\n  /* 111  */ V(4, 10, 3),\n\n  /* 0000 0111 ... */\n  /* 000  */ V(3, 10, 3),\t/* 172 */\n  /* 001  */ V(10, 3, 3),\n  /* 010  */ V(5, 9, 3),\n  /* 011  */ V(9, 5, 3),\n  /* 100  */ V(2, 10, 2),\n  /* 101  */ V(2, 10, 2),\n  /* 110  */ V(10, 2, 2),\n  /* 111  */ V(10, 2, 2),\n\n  /* 0000 1000 ... */\n  /* 000  */ V(1, 10, 2),\t/* 180 */\n  /* 001  */ V(1, 10, 2),\n  /* 010  */ V(10, 1, 2),\n  /* 011  */ V(10, 1, 2),\n  /* 100  */ V(0, 10, 3),\n  /* 101  */ V(6, 8, 3),\n  /* 110  */ V(10, 0, 2),\n  /* 111  */ V(10, 0, 2),\n\n  /* 0000 1001 ... */\n  /* 000  */ V(8, 6, 3),\t/* 188 */\n  /* 001  */ V(4, 9, 3),\n  /* 010  */ V(9, 3, 2),\n  /* 011  */ V(9, 3, 2),\n  /* 100  */ V(3, 9, 3),\n  /* 101  */ V(5, 8, 3),\n  /* 110  */ V(8, 5, 3),\n  /* 111  */ V(6, 7, 3),\n\n  /* 0000 1010 ... */\n  /* 000  */ V(2, 9, 2),\t/* 196 */\n  /* 001  */ V(2, 9, 2),\n  /* 010  */ V(9, 2, 2),\n  /* 011  */ V(9, 2, 2),\n  /* 100  */ V(5, 7, 3),\n  /* 101  */ V(7, 5, 3),\n  /* 110  */ V(3, 8, 2),\n  /* 111  */ V(3, 8, 2),\n\n  /* 0000 1011 ... */\n  /* 000  */ V(8, 3, 2),\t/* 204 */\n  /* 001  */ V(8, 3, 2),\n  /* 010  */ V(6, 6, 3),\n  /* 011  */ V(4, 7, 3),\n  /* 100  */ V(7, 4, 3),\n  /* 101  */ V(5, 6, 3),\n  /* 110  */ V(6, 5, 3),\n  /* 111  */ V(7, 3, 3),\n\n  /* 0000 1100 ... */\n  /* 0    */ V(1, 9, 1),\t/* 212 */\n  /* 1    */ V(9, 1, 1),\n\n  /* 0000 1101 ... */\n  /* 00   */ V(0, 9, 2),\t/* 214 */\n  /* 01   */ V(9, 0, 2),\n  /* 10   */ V(4, 8, 2),\n  /* 11   */ V(8, 4, 2),\n\n  /* 0000 1110 ... */\n  /* 000  */ V(7, 2, 2),\t/* 218 */\n  /* 001  */ V(7, 2, 2),\n  /* 010  */ V(4, 6, 3),\n  /* 011  */ V(6, 4, 3),\n  /* 100  */ V(2, 8, 1),\n  /* 101  */ V(2, 8, 1),\n  /* 110  */ V(2, 8, 1),\n  /* 111  */ V(2, 8, 1),\n\n  /* 0000 1111 ... */\n  /* 0    */ V(8, 2, 1),\t/* 226 */\n  /* 1    */ V(1, 8, 1),\n\n  /* 0001 0000 ... */\n  /* 00   */ V(3, 7, 2),\t/* 228 */\n  /* 01   */ V(2, 7, 2),\n  /* 10   */ V(1, 7, 1),\n  /* 11   */ V(1, 7, 1),\n\n  /* 0001 0001 ... */\n  /* 00   */ V(7, 1, 1),\t/* 232 */\n  /* 01   */ V(7, 1, 1),\n  /* 10   */ V(5, 5, 2),\n  /* 11   */ V(0, 7, 2),\n\n  /* 0001 0010 ... */\n  /* 00   */ V(7, 0, 2),\t/* 236 */\n  /* 01   */ V(3, 6, 2),\n  /* 10   */ V(6, 3, 2),\n  /* 11   */ V(4, 5, 2),\n\n  /* 0001 0011 ... */\n  /* 00   */ V(5, 4, 2),\t/* 240 */\n  /* 01   */ V(2, 6, 2),\n  /* 10   */ V(6, 2, 2),\n  /* 11   */ V(3, 5, 2),\n\n  /* 0001 0101 ... */\n  /* 0    */ V(0, 8, 1),\t/* 244 */\n  /* 1    */ V(8, 0, 1),\n\n  /* 0001 0110 ... */\n  /* 0    */ V(1, 6, 1),\t/* 246 */\n  /* 1    */ V(6, 1, 1),\n\n  /* 0001 0111 ... */\n  /* 0    */ V(0, 6, 1),\t/* 248 */\n  /* 1    */ V(6, 0, 1),\n\n  /* 0001 1000 ... */\n  /* 00   */ V(5, 3, 2),\t/* 250 */\n  /* 01   */ V(4, 4, 2),\n  /* 10   */ V(2, 5, 1),\n  /* 11   */ V(2, 5, 1),\n\n  /* 0001 1001 ... */\n  /* 0    */ V(5, 2, 1),\t/* 254 */\n  /* 1    */ V(0, 5, 1),\n\n  /* 0001 1100 ... */\n  /* 0    */ V(3, 4, 1),\t/* 256 */\n  /* 1    */ V(4, 3, 1),\n\n  /* 0001 1101 ... */\n  /* 0    */ V(5, 0, 1),\t/* 258 */\n  /* 1    */ V(2, 4, 1),\n\n  /* 0001 1110 ... */\n  /* 0    */ V(4, 2, 1),\t/* 260 */\n  /* 1    */ V(3, 3, 1),\n\n  /* 0000 0000 0000 ... */\n  /* 0000 */ PTR(388, 3),\t/* 262 */\n  /* 0001 */ V(15, 15, 4),\n  /* 0010 */ V(14, 15, 4),\n  /* 0011 */ V(13, 15, 4),\n  /* 0100 */ V(14, 14, 4),\n  /* 0101 */ V(12, 15, 4),\n  /* 0110 */ V(13, 14, 4),\n  /* 0111 */ V(11, 15, 4),\n  /* 1000 */ V(15, 11, 4),\n  /* 1001 */ V(12, 14, 4),\n  /* 1010 */ V(13, 12, 4),\n  /* 1011 */ PTR(396, 1),\n  /* 1100 */ V(14, 12, 3),\n  /* 1101 */ V(14, 12, 3),\n  /* 1110 */ V(13, 13, 3),\n  /* 1111 */ V(13, 13, 3),\n\n  /* 0000 0000 0001 ... */\n  /* 0000 */ V(15, 10, 4),\t/* 278 */\n  /* 0001 */ V(12, 13, 4),\n  /* 0010 */ V(11, 14, 3),\n  /* 0011 */ V(11, 14, 3),\n  /* 0100 */ V(14, 11, 3),\n  /* 0101 */ V(14, 11, 3),\n  /* 0110 */ V(9, 15, 3),\n  /* 0111 */ V(9, 15, 3),\n  /* 1000 */ V(15, 9, 3),\n  /* 1001 */ V(15, 9, 3),\n  /* 1010 */ V(14, 10, 3),\n  /* 1011 */ V(14, 10, 3),\n  /* 1100 */ V(11, 13, 3),\n  /* 1101 */ V(11, 13, 3),\n  /* 1110 */ V(13, 11, 3),\n  /* 1111 */ V(13, 11, 3),\n\n  /* 0000 0000 0010 ... */\n  /* 0000 */ V(8, 15, 3),\t/* 294 */\n  /* 0001 */ V(8, 15, 3),\n  /* 0010 */ V(15, 8, 3),\n  /* 0011 */ V(15, 8, 3),\n  /* 0100 */ V(12, 12, 3),\n  /* 0101 */ V(12, 12, 3),\n  /* 0110 */ V(10, 14, 4),\n  /* 0111 */ V(9, 14, 4),\n  /* 1000 */ V(8, 14, 3),\n  /* 1001 */ V(8, 14, 3),\n  /* 1010 */ V(7, 15, 4),\n  /* 1011 */ V(7, 14, 4),\n  /* 1100 */ V(15, 7, 2),\n  /* 1101 */ V(15, 7, 2),\n  /* 1110 */ V(15, 7, 2),\n  /* 1111 */ V(15, 7, 2),\n\n  /* 0000 0000 0011 ... */\n  /* 000  */ V(13, 10, 2),\t/* 310 */\n  /* 001  */ V(13, 10, 2),\n  /* 010  */ V(10, 13, 3),\n  /* 011  */ V(11, 12, 3),\n  /* 100  */ V(12, 11, 3),\n  /* 101  */ V(15, 6, 3),\n  /* 110  */ V(6, 15, 2),\n  /* 111  */ V(6, 15, 2),\n\n  /* 0000 0000 0100 ... */\n  /* 00   */ V(14, 8, 2),\t/* 318 */\n  /* 01   */ V(5, 15, 2),\n  /* 10   */ V(9, 13, 2),\n  /* 11   */ V(13, 9, 2),\n\n  /* 0000 0000 0101 ... */\n  /* 00   */ V(15, 5, 2),\t/* 322 */\n  /* 01   */ V(14, 7, 2),\n  /* 10   */ V(10, 12, 2),\n  /* 11   */ V(11, 11, 2),\n\n  /* 0000 0000 0110 ... */\n  /* 000  */ V(4, 15, 2),\t/* 326 */\n  /* 001  */ V(4, 15, 2),\n  /* 010  */ V(15, 4, 2),\n  /* 011  */ V(15, 4, 2),\n  /* 100  */ V(12, 10, 3),\n  /* 101  */ V(14, 6, 3),\n  /* 110  */ V(15, 3, 2),\n  /* 111  */ V(15, 3, 2),\n\n  /* 0000 0000 0111 ... */\n  /* 00   */ V(3, 15, 1),\t/* 334 */\n  /* 01   */ V(3, 15, 1),\n  /* 10   */ V(8, 13, 2),\n  /* 11   */ V(13, 8, 2),\n\n  /* 0000 0000 1000 ... */\n  /* 0    */ V(2, 15, 1),\t/* 338 */\n  /* 1    */ V(15, 2, 1),\n\n  /* 0000 0000 1001 ... */\n  /* 00   */ V(6, 14, 2),\t/* 340 */\n  /* 01   */ V(9, 12, 2),\n  /* 10   */ V(0, 15, 1),\n  /* 11   */ V(0, 15, 1),\n\n  /* 0000 0000 1010 ... */\n  /* 00   */ V(12, 9, 2),\t/* 344 */\n  /* 01   */ V(5, 14, 2),\n  /* 10   */ V(10, 11, 1),\n  /* 11   */ V(10, 11, 1),\n\n  /* 0000 0000 1011 ... */\n  /* 00   */ V(7, 13, 2),\t/* 348 */\n  /* 01   */ V(13, 7, 2),\n  /* 10   */ V(4, 14, 1),\n  /* 11   */ V(4, 14, 1),\n\n  /* 0000 0000 1100 ... */\n  /* 00   */ V(12, 8, 2),\t/* 352 */\n  /* 01   */ V(13, 6, 2),\n  /* 10   */ V(3, 14, 1),\n  /* 11   */ V(3, 14, 1),\n\n  /* 0000 0000 1101 ... */\n  /* 00   */ V(11, 9, 1),\t/* 356 */\n  /* 01   */ V(11, 9, 1),\n  /* 10   */ V(9, 11, 2),\n  /* 11   */ V(10, 10, 2),\n\n  /* 0000 0001 0001 ... */\n  /* 0    */ V(11, 10, 1),\t/* 360 */\n  /* 1    */ V(14, 5, 1),\n\n  /* 0000 0001 0010 ... */\n  /* 0    */ V(14, 4, 1),\t/* 362 */\n  /* 1    */ V(8, 12, 1),\n\n  /* 0000 0001 0011 ... */\n  /* 0    */ V(6, 13, 1),\t/* 364 */\n  /* 1    */ V(14, 3, 1),\n\n  /* 0000 0001 0101 ... */\n  /* 0    */ V(2, 14, 1),\t/* 366 */\n  /* 1    */ V(0, 14, 1),\n\n  /* 0000 0001 1000 ... */\n  /* 0    */ V(14, 0, 1),\t/* 368 */\n  /* 1    */ V(5, 13, 1),\n\n  /* 0000 0001 1001 ... */\n  /* 0    */ V(13, 5, 1),\t/* 370 */\n  /* 1    */ V(7, 12, 1),\n\n  /* 0000 0001 1010 ... */\n  /* 0    */ V(12, 7, 1),\t/* 372 */\n  /* 1    */ V(4, 13, 1),\n\n  /* 0000 0001 1011 ... */\n  /* 0    */ V(8, 11, 1),\t/* 374 */\n  /* 1    */ V(11, 8, 1),\n\n  /* 0000 0001 1100 ... */\n  /* 0    */ V(13, 4, 1),\t/* 376 */\n  /* 1    */ V(9, 10, 1),\n\n  /* 0000 0001 1101 ... */\n  /* 0    */ V(10, 9, 1),\t/* 378 */\n  /* 1    */ V(6, 12, 1),\n\n  /* 0000 0010 0000 ... */\n  /* 0    */ V(13, 3, 1),\t/* 380 */\n  /* 1    */ V(7, 11, 1),\n\n  /* 0000 0010 0101 ... */\n  /* 0    */ V(5, 12, 1),\t/* 382 */\n  /* 1    */ V(12, 5, 1),\n\n  /* 0000 0010 0110 ... */\n  /* 0    */ V(9, 9, 1),\t/* 384 */\n  /* 1    */ V(7, 10, 1),\n\n  /* 0000 0010 1000 ... */\n  /* 0    */ V(10, 7, 1),\t/* 386 */\n  /* 1    */ V(9, 7, 1),\n\n  /* 0000 0000 0000 0000 ... */\n  /* 000  */ V(15, 14, 3),\t/* 388 */\n  /* 001  */ V(15, 12, 3),\n  /* 010  */ V(15, 13, 2),\n  /* 011  */ V(15, 13, 2),\n  /* 100  */ V(14, 13, 1),\n  /* 101  */ V(14, 13, 1),\n  /* 110  */ V(14, 13, 1),\n  /* 111  */ V(14, 13, 1),\n\n  /* 0000 0000 0000 1011 ... */\n  /* 0    */ V(10, 15, 1),\t/* 396 */\n  /* 1    */ V(14, 9, 1)\n];\n\nconst hufftab15 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ PTR(48, 4),\n  /* 0011 */ PTR(64, 4),\n  /* 0100 */ PTR(80, 4),\n  /* 0101 */ PTR(96, 3),\n  /* 0110 */ PTR(104, 3),\n  /* 0111 */ PTR(112, 2),\n  /* 1000 */ PTR(116, 1),\n  /* 1001 */ PTR(118, 1),\n  /* 1010 */ V(1, 1, 3),\n  /* 1011 */ V(1, 1, 3),\n  /* 1100 */ V(0, 1, 4),\n  /* 1101 */ V(1, 0, 4),\n  /* 1110 */ V(0, 0, 3),\n  /* 1111 */ V(0, 0, 3),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(120, 4),\t/* 16 */\n  /* 0001 */ PTR(136, 4),\n  /* 0010 */ PTR(152, 4),\n  /* 0011 */ PTR(168, 4),\n  /* 0100 */ PTR(184, 4),\n  /* 0101 */ PTR(200, 3),\n  /* 0110 */ PTR(208, 3),\n  /* 0111 */ PTR(216, 4),\n  /* 1000 */ PTR(232, 3),\n  /* 1001 */ PTR(240, 3),\n  /* 1010 */ PTR(248, 3),\n  /* 1011 */ PTR(256, 3),\n  /* 1100 */ PTR(264, 2),\n  /* 1101 */ PTR(268, 3),\n  /* 1110 */ PTR(276, 3),\n  /* 1111 */ PTR(284, 2),\n\n  /* 0001 ... */\n  /* 0000 */ PTR(288, 2),\t/* 32 */\n  /* 0001 */ PTR(292, 2),\n  /* 0010 */ PTR(296, 2),\n  /* 0011 */ PTR(300, 2),\n  /* 0100 */ PTR(304, 2),\n  /* 0101 */ PTR(308, 2),\n  /* 0110 */ PTR(312, 2),\n  /* 0111 */ PTR(316, 2),\n  /* 1000 */ PTR(320, 1),\n  /* 1001 */ PTR(322, 1),\n  /* 1010 */ PTR(324, 1),\n  /* 1011 */ PTR(326, 2),\n  /* 1100 */ PTR(330, 1),\n  /* 1101 */ PTR(332, 1),\n  /* 1110 */ PTR(334, 2),\n  /* 1111 */ PTR(338, 1),\n\n  /* 0010 ... */\n  /* 0000 */ PTR(340, 1),\t/* 48 */\n  /* 0001 */ PTR(342, 1),\n  /* 0010 */ V(9, 1, 4),\n  /* 0011 */ PTR(344, 1),\n  /* 0100 */ PTR(346, 1),\n  /* 0101 */ PTR(348, 1),\n  /* 0110 */ PTR(350, 1),\n  /* 0111 */ PTR(352, 1),\n  /* 1000 */ V(2, 8, 4),\n  /* 1001 */ V(8, 2, 4),\n  /* 1010 */ V(1, 8, 4),\n  /* 1011 */ V(8, 1, 4),\n  /* 1100 */ PTR(354, 1),\n  /* 1101 */ PTR(356, 1),\n  /* 1110 */ PTR(358, 1),\n  /* 1111 */ PTR(360, 1),\n\n  /* 0011 ... */\n  /* 0000 */ V(2, 7, 4),\t/* 64 */\n  /* 0001 */ V(7, 2, 4),\n  /* 0010 */ V(6, 4, 4),\n  /* 0011 */ V(1, 7, 4),\n  /* 0100 */ V(5, 5, 4),\n  /* 0101 */ V(7, 1, 4),\n  /* 0110 */ PTR(362, 1),\n  /* 0111 */ V(3, 6, 4),\n  /* 1000 */ V(6, 3, 4),\n  /* 1001 */ V(4, 5, 4),\n  /* 1010 */ V(5, 4, 4),\n  /* 1011 */ V(2, 6, 4),\n  /* 1100 */ V(6, 2, 4),\n  /* 1101 */ V(1, 6, 4),\n  /* 1110 */ PTR(364, 1),\n  /* 1111 */ V(3, 5, 4),\n\n  /* 0100 ... */\n  /* 0000 */ V(6, 1, 3),\t/* 80 */\n  /* 0001 */ V(6, 1, 3),\n  /* 0010 */ V(5, 3, 4),\n  /* 0011 */ V(4, 4, 4),\n  /* 0100 */ V(2, 5, 3),\n  /* 0101 */ V(2, 5, 3),\n  /* 0110 */ V(5, 2, 3),\n  /* 0111 */ V(5, 2, 3),\n  /* 1000 */ V(1, 5, 3),\n  /* 1001 */ V(1, 5, 3),\n  /* 1010 */ V(5, 1, 3),\n  /* 1011 */ V(5, 1, 3),\n  /* 1100 */ V(0, 5, 4),\n  /* 1101 */ V(5, 0, 4),\n  /* 1110 */ V(3, 4, 3),\n  /* 1111 */ V(3, 4, 3),\n\n  /* 0101 ... */\n  /* 000  */ V(4, 3, 3),\t/* 96 */\n  /* 001  */ V(2, 4, 3),\n  /* 010  */ V(4, 2, 3),\n  /* 011  */ V(3, 3, 3),\n  /* 100  */ V(4, 1, 2),\n  /* 101  */ V(4, 1, 2),\n  /* 110  */ V(1, 4, 3),\n  /* 111  */ V(0, 4, 3),\n\n  /* 0110 ... */\n  /* 000  */ V(2, 3, 2),\t/* 104 */\n  /* 001  */ V(2, 3, 2),\n  /* 010  */ V(3, 2, 2),\n  /* 011  */ V(3, 2, 2),\n  /* 100  */ V(4, 0, 3),\n  /* 101  */ V(0, 3, 3),\n  /* 110  */ V(1, 3, 2),\n  /* 111  */ V(1, 3, 2),\n\n  /* 0111 ... */\n  /* 00   */ V(3, 1, 2),\t/* 112 */\n  /* 01   */ V(3, 0, 2),\n  /* 10   */ V(2, 2, 1),\n  /* 11   */ V(2, 2, 1),\n\n  /* 1000 ... */\n  /* 0    */ V(1, 2, 1),\t/* 116 */\n  /* 1    */ V(2, 1, 1),\n\n  /* 1001 ... */\n  /* 0    */ V(0, 2, 1),\t/* 118 */\n  /* 1    */ V(2, 0, 1),\n\n  /* 0000 0000 ... */\n  /* 0000 */ PTR(366, 1),\t/* 120 */\n  /* 0001 */ PTR(368, 1),\n  /* 0010 */ V(14, 14, 4),\n  /* 0011 */ PTR(370, 1),\n  /* 0100 */ PTR(372, 1),\n  /* 0101 */ PTR(374, 1),\n  /* 0110 */ V(15, 11, 4),\n  /* 0111 */ PTR(376, 1),\n  /* 1000 */ V(13, 13, 4),\n  /* 1001 */ V(10, 15, 4),\n  /* 1010 */ V(15, 10, 4),\n  /* 1011 */ V(11, 14, 4),\n  /* 1100 */ V(14, 11, 4),\n  /* 1101 */ V(12, 13, 4),\n  /* 1110 */ V(13, 12, 4),\n  /* 1111 */ V(9, 15, 4),\n\n  /* 0000 0001 ... */\n  /* 0000 */ V(15, 9, 4),\t/* 136 */\n  /* 0001 */ V(14, 10, 4),\n  /* 0010 */ V(11, 13, 4),\n  /* 0011 */ V(13, 11, 4),\n  /* 0100 */ V(8, 15, 4),\n  /* 0101 */ V(15, 8, 4),\n  /* 0110 */ V(12, 12, 4),\n  /* 0111 */ V(9, 14, 4),\n  /* 1000 */ V(14, 9, 4),\n  /* 1001 */ V(7, 15, 4),\n  /* 1010 */ V(15, 7, 4),\n  /* 1011 */ V(10, 13, 4),\n  /* 1100 */ V(13, 10, 4),\n  /* 1101 */ V(11, 12, 4),\n  /* 1110 */ V(6, 15, 4),\n  /* 1111 */ PTR(378, 1),\n\n  /* 0000 0010 ... */\n  /* 0000 */ V(12, 11, 3),\t/* 152 */\n  /* 0001 */ V(12, 11, 3),\n  /* 0010 */ V(15, 6, 3),\n  /* 0011 */ V(15, 6, 3),\n  /* 0100 */ V(8, 14, 4),\n  /* 0101 */ V(14, 8, 4),\n  /* 0110 */ V(5, 15, 4),\n  /* 0111 */ V(9, 13, 4),\n  /* 1000 */ V(15, 5, 3),\n  /* 1001 */ V(15, 5, 3),\n  /* 1010 */ V(7, 14, 3),\n  /* 1011 */ V(7, 14, 3),\n  /* 1100 */ V(14, 7, 3),\n  /* 1101 */ V(14, 7, 3),\n  /* 1110 */ V(10, 12, 3),\n  /* 1111 */ V(10, 12, 3),\n\n  /* 0000 0011 ... */\n  /* 0000 */ V(12, 10, 3),\t/* 168 */\n  /* 0001 */ V(12, 10, 3),\n  /* 0010 */ V(11, 11, 3),\n  /* 0011 */ V(11, 11, 3),\n  /* 0100 */ V(13, 9, 4),\n  /* 0101 */ V(8, 13, 4),\n  /* 0110 */ V(4, 15, 3),\n  /* 0111 */ V(4, 15, 3),\n  /* 1000 */ V(15, 4, 3),\n  /* 1001 */ V(15, 4, 3),\n  /* 1010 */ V(3, 15, 3),\n  /* 1011 */ V(3, 15, 3),\n  /* 1100 */ V(15, 3, 3),\n  /* 1101 */ V(15, 3, 3),\n  /* 1110 */ V(13, 8, 3),\n  /* 1111 */ V(13, 8, 3),\n\n  /* 0000 0100 ... */\n  /* 0000 */ V(14, 6, 3),\t/* 184 */\n  /* 0001 */ V(14, 6, 3),\n  /* 0010 */ V(2, 15, 3),\n  /* 0011 */ V(2, 15, 3),\n  /* 0100 */ V(15, 2, 3),\n  /* 0101 */ V(15, 2, 3),\n  /* 0110 */ V(6, 14, 4),\n  /* 0111 */ V(15, 0, 4),\n  /* 1000 */ V(1, 15, 3),\n  /* 1001 */ V(1, 15, 3),\n  /* 1010 */ V(15, 1, 3),\n  /* 1011 */ V(15, 1, 3),\n  /* 1100 */ V(9, 12, 3),\n  /* 1101 */ V(9, 12, 3),\n  /* 1110 */ V(12, 9, 3),\n  /* 1111 */ V(12, 9, 3),\n\n  /* 0000 0101 ... */\n  /* 000  */ V(5, 14, 3),\t/* 200 */\n  /* 001  */ V(10, 11, 3),\n  /* 010  */ V(11, 10, 3),\n  /* 011  */ V(14, 5, 3),\n  /* 100  */ V(7, 13, 3),\n  /* 101  */ V(13, 7, 3),\n  /* 110  */ V(4, 14, 3),\n  /* 111  */ V(14, 4, 3),\n\n  /* 0000 0110 ... */\n  /* 000  */ V(8, 12, 3),\t/* 208 */\n  /* 001  */ V(12, 8, 3),\n  /* 010  */ V(3, 14, 3),\n  /* 011  */ V(6, 13, 3),\n  /* 100  */ V(13, 6, 3),\n  /* 101  */ V(14, 3, 3),\n  /* 110  */ V(9, 11, 3),\n  /* 111  */ V(11, 9, 3),\n\n  /* 0000 0111 ... */\n  /* 0000 */ V(2, 14, 3),\t/* 216 */\n  /* 0001 */ V(2, 14, 3),\n  /* 0010 */ V(10, 10, 3),\n  /* 0011 */ V(10, 10, 3),\n  /* 0100 */ V(14, 2, 3),\n  /* 0101 */ V(14, 2, 3),\n  /* 0110 */ V(1, 14, 3),\n  /* 0111 */ V(1, 14, 3),\n  /* 1000 */ V(14, 1, 3),\n  /* 1001 */ V(14, 1, 3),\n  /* 1010 */ V(0, 14, 4),\n  /* 1011 */ V(14, 0, 4),\n  /* 1100 */ V(5, 13, 3),\n  /* 1101 */ V(5, 13, 3),\n  /* 1110 */ V(13, 5, 3),\n  /* 1111 */ V(13, 5, 3),\n\n  /* 0000 1000 ... */\n  /* 000  */ V(7, 12, 3),\t/* 232 */\n  /* 001  */ V(12, 7, 3),\n  /* 010  */ V(4, 13, 3),\n  /* 011  */ V(8, 11, 3),\n  /* 100  */ V(13, 4, 2),\n  /* 101  */ V(13, 4, 2),\n  /* 110  */ V(11, 8, 3),\n  /* 111  */ V(9, 10, 3),\n\n  /* 0000 1001 ... */\n  /* 000  */ V(10, 9, 3),\t/* 240 */\n  /* 001  */ V(6, 12, 3),\n  /* 010  */ V(12, 6, 3),\n  /* 011  */ V(3, 13, 3),\n  /* 100  */ V(13, 3, 2),\n  /* 101  */ V(13, 3, 2),\n  /* 110  */ V(13, 2, 2),\n  /* 111  */ V(13, 2, 2),\n\n  /* 0000 1010 ... */\n  /* 000  */ V(2, 13, 3),\t/* 248 */\n  /* 001  */ V(0, 13, 3),\n  /* 010  */ V(1, 13, 2),\n  /* 011  */ V(1, 13, 2),\n  /* 100  */ V(7, 11, 2),\n  /* 101  */ V(7, 11, 2),\n  /* 110  */ V(11, 7, 2),\n  /* 111  */ V(11, 7, 2),\n\n  /* 0000 1011 ... */\n  /* 000  */ V(13, 1, 2),\t/* 256 */\n  /* 001  */ V(13, 1, 2),\n  /* 010  */ V(5, 12, 3),\n  /* 011  */ V(13, 0, 3),\n  /* 100  */ V(12, 5, 2),\n  /* 101  */ V(12, 5, 2),\n  /* 110  */ V(8, 10, 2),\n  /* 111  */ V(8, 10, 2),\n\n  /* 0000 1100 ... */\n  /* 00   */ V(10, 8, 2),\t/* 264 */\n  /* 01   */ V(4, 12, 2),\n  /* 10   */ V(12, 4, 2),\n  /* 11   */ V(6, 11, 2),\n\n  /* 0000 1101 ... */\n  /* 000  */ V(11, 6, 2),\t/* 268 */\n  /* 001  */ V(11, 6, 2),\n  /* 010  */ V(9, 9, 3),\n  /* 011  */ V(0, 12, 3),\n  /* 100  */ V(3, 12, 2),\n  /* 101  */ V(3, 12, 2),\n  /* 110  */ V(12, 3, 2),\n  /* 111  */ V(12, 3, 2),\n\n  /* 0000 1110 ... */\n  /* 000  */ V(7, 10, 2),\t/* 276 */\n  /* 001  */ V(7, 10, 2),\n  /* 010  */ V(10, 7, 2),\n  /* 011  */ V(10, 7, 2),\n  /* 100  */ V(10, 6, 2),\n  /* 101  */ V(10, 6, 2),\n  /* 110  */ V(12, 0, 3),\n  /* 111  */ V(0, 11, 3),\n\n  /* 0000 1111 ... */\n  /* 00   */ V(12, 2, 1),\t/* 284 */\n  /* 01   */ V(12, 2, 1),\n  /* 10   */ V(2, 12, 2),\n  /* 11   */ V(5, 11, 2),\n\n  /* 0001 0000 ... */\n  /* 00   */ V(11, 5, 2),\t/* 288 */\n  /* 01   */ V(1, 12, 2),\n  /* 10   */ V(8, 9, 2),\n  /* 11   */ V(9, 8, 2),\n\n  /* 0001 0001 ... */\n  /* 00   */ V(12, 1, 2),\t/* 292 */\n  /* 01   */ V(4, 11, 2),\n  /* 10   */ V(11, 4, 2),\n  /* 11   */ V(6, 10, 2),\n\n  /* 0001 0010 ... */\n  /* 00   */ V(3, 11, 2),\t/* 296 */\n  /* 01   */ V(7, 9, 2),\n  /* 10   */ V(11, 3, 1),\n  /* 11   */ V(11, 3, 1),\n\n  /* 0001 0011 ... */\n  /* 00   */ V(9, 7, 2),\t/* 300 */\n  /* 01   */ V(8, 8, 2),\n  /* 10   */ V(2, 11, 2),\n  /* 11   */ V(5, 10, 2),\n\n  /* 0001 0100 ... */\n  /* 00   */ V(11, 2, 1),\t/* 304 */\n  /* 01   */ V(11, 2, 1),\n  /* 10   */ V(10, 5, 2),\n  /* 11   */ V(1, 11, 2),\n\n  /* 0001 0101 ... */\n  /* 00   */ V(11, 1, 1),\t/* 308 */\n  /* 01   */ V(11, 1, 1),\n  /* 10   */ V(11, 0, 2),\n  /* 11   */ V(6, 9, 2),\n\n  /* 0001 0110 ... */\n  /* 00   */ V(9, 6, 2),\t/* 312 */\n  /* 01   */ V(4, 10, 2),\n  /* 10   */ V(10, 4, 2),\n  /* 11   */ V(7, 8, 2),\n\n  /* 0001 0111 ... */\n  /* 00   */ V(8, 7, 2),\t/* 316 */\n  /* 01   */ V(3, 10, 2),\n  /* 10   */ V(10, 3, 1),\n  /* 11   */ V(10, 3, 1),\n\n  /* 0001 1000 ... */\n  /* 0    */ V(5, 9, 1),\t/* 320 */\n  /* 1    */ V(9, 5, 1),\n\n  /* 0001 1001 ... */\n  /* 0    */ V(2, 10, 1),\t/* 322 */\n  /* 1    */ V(10, 2, 1),\n\n  /* 0001 1010 ... */\n  /* 0    */ V(1, 10, 1),\t/* 324 */\n  /* 1    */ V(10, 1, 1),\n\n  /* 0001 1011 ... */\n  /* 00   */ V(0, 10, 2),\t/* 326 */\n  /* 01   */ V(10, 0, 2),\n  /* 10   */ V(6, 8, 1),\n  /* 11   */ V(6, 8, 1),\n\n  /* 0001 1100 ... */\n  /* 0    */ V(8, 6, 1),\t/* 330 */\n  /* 1    */ V(4, 9, 1),\n\n  /* 0001 1101 ... */\n  /* 0    */ V(9, 4, 1),\t/* 332 */\n  /* 1    */ V(3, 9, 1),\n\n  /* 0001 1110 ... */\n  /* 00   */ V(9, 3, 1),\t/* 334 */\n  /* 01   */ V(9, 3, 1),\n  /* 10   */ V(7, 7, 2),\n  /* 11   */ V(0, 9, 2),\n\n  /* 0001 1111 ... */\n  /* 0    */ V(5, 8, 1),\t/* 338 */\n  /* 1    */ V(8, 5, 1),\n\n  /* 0010 0000 ... */\n  /* 0    */ V(2, 9, 1),\t/* 340 */\n  /* 1    */ V(6, 7, 1),\n\n  /* 0010 0001 ... */\n  /* 0    */ V(7, 6, 1),\t/* 342 */\n  /* 1    */ V(9, 2, 1),\n\n  /* 0010 0011 ... */\n  /* 0    */ V(1, 9, 1),\t/* 344 */\n  /* 1    */ V(9, 0, 1),\n\n  /* 0010 0100 ... */\n  /* 0    */ V(4, 8, 1),\t/* 346 */\n  /* 1    */ V(8, 4, 1),\n\n  /* 0010 0101 ... */\n  /* 0    */ V(5, 7, 1),\t/* 348 */\n  /* 1    */ V(7, 5, 1),\n\n  /* 0010 0110 ... */\n  /* 0    */ V(3, 8, 1),\t/* 350 */\n  /* 1    */ V(8, 3, 1),\n\n  /* 0010 0111 ... */\n  /* 0    */ V(6, 6, 1),\t/* 352 */\n  /* 1    */ V(4, 7, 1),\n\n  /* 0010 1100 ... */\n  /* 0    */ V(7, 4, 1),\t/* 354 */\n  /* 1    */ V(0, 8, 1),\n\n  /* 0010 1101 ... */\n  /* 0    */ V(8, 0, 1),\t/* 356 */\n  /* 1    */ V(5, 6, 1),\n\n  /* 0010 1110 ... */\n  /* 0    */ V(6, 5, 1),\t/* 358 */\n  /* 1    */ V(3, 7, 1),\n\n  /* 0010 1111 ... */\n  /* 0    */ V(7, 3, 1),\t/* 360 */\n  /* 1    */ V(4, 6, 1),\n\n  /* 0011 0110 ... */\n  /* 0    */ V(0, 7, 1),\t/* 362 */\n  /* 1    */ V(7, 0, 1),\n\n  /* 0011 1110 ... */\n  /* 0    */ V(0, 6, 1),\t/* 364 */\n  /* 1    */ V(6, 0, 1),\n\n  /* 0000 0000 0000 ... */\n  /* 0    */ V(15, 15, 1),\t/* 366 */\n  /* 1    */ V(14, 15, 1),\n\n  /* 0000 0000 0001 ... */\n  /* 0    */ V(15, 14, 1),\t/* 368 */\n  /* 1    */ V(13, 15, 1),\n\n  /* 0000 0000 0011 ... */\n  /* 0    */ V(15, 13, 1),\t/* 370 */\n  /* 1    */ V(12, 15, 1),\n\n  /* 0000 0000 0100 ... */\n  /* 0    */ V(15, 12, 1),\t/* 372 */\n  /* 1    */ V(13, 14, 1),\n\n  /* 0000 0000 0101 ... */\n  /* 0    */ V(14, 13, 1),\t/* 374 */\n  /* 1    */ V(11, 15, 1),\n\n  /* 0000 0000 0111 ... */\n  /* 0    */ V(12, 14, 1),\t/* 376 */\n  /* 1    */ V(14, 12, 1),\n\n  /* 0000 0001 1111 ... */\n  /* 0    */ V(10, 14, 1),\t/* 378 */\n  /* 1    */ V(0, 15, 1)\n];\n\nconst hufftab16 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ PTR(48, 4),\n  /* 0011 */ PTR(64, 2),\n  /* 0100 */ V(1, 1, 4),\n  /* 0101 */ V(0, 1, 4),\n  /* 0110 */ V(1, 0, 3),\n  /* 0111 */ V(1, 0, 3),\n  /* 1000 */ V(0, 0, 1),\n  /* 1001 */ V(0, 0, 1),\n  /* 1010 */ V(0, 0, 1),\n  /* 1011 */ V(0, 0, 1),\n  /* 1100 */ V(0, 0, 1),\n  /* 1101 */ V(0, 0, 1),\n  /* 1110 */ V(0, 0, 1),\n  /* 1111 */ V(0, 0, 1),\n\n  /* 0000 ... */\n  /* 0000 */ PTR(68, 3),\t/* 16 */\n  /* 0001 */ PTR(76, 3),\n  /* 0010 */ PTR(84, 2),\n  /* 0011 */ V(15, 15, 4),\n  /* 0100 */ PTR(88, 2),\n  /* 0101 */ PTR(92, 1),\n  /* 0110 */ PTR(94, 4),\n  /* 0111 */ V(15, 2, 4),\n  /* 1000 */ PTR(110, 1),\n  /* 1001 */ V(1, 15, 4),\n  /* 1010 */ V(15, 1, 4),\n  /* 1011 */ PTR(112, 4),\n  /* 1100 */ PTR(128, 4),\n  /* 1101 */ PTR(144, 4),\n  /* 1110 */ PTR(160, 4),\n  /* 1111 */ PTR(176, 4),\n\n  /* 0001 ... */\n  /* 0000 */ PTR(192, 4),\t/* 32 */\n  /* 0001 */ PTR(208, 3),\n  /* 0010 */ PTR(216, 3),\n  /* 0011 */ PTR(224, 3),\n  /* 0100 */ PTR(232, 3),\n  /* 0101 */ PTR(240, 3),\n  /* 0110 */ PTR(248, 3),\n  /* 0111 */ PTR(256, 3),\n  /* 1000 */ PTR(264, 2),\n  /* 1001 */ PTR(268, 2),\n  /* 1010 */ PTR(272, 1),\n  /* 1011 */ PTR(274, 2),\n  /* 1100 */ PTR(278, 2),\n  /* 1101 */ PTR(282, 1),\n  /* 1110 */ V(5, 1, 4),\n  /* 1111 */ PTR(284, 1),\n\n  /* 0010 ... */\n  /* 0000 */ PTR(286, 1),\t/* 48 */\n  /* 0001 */ PTR(288, 1),\n  /* 0010 */ PTR(290, 1),\n  /* 0011 */ V(1, 4, 4),\n  /* 0100 */ V(4, 1, 4),\n  /* 0101 */ PTR(292, 1),\n  /* 0110 */ V(2, 3, 4),\n  /* 0111 */ V(3, 2, 4),\n  /* 1000 */ V(1, 3, 3),\n  /* 1001 */ V(1, 3, 3),\n  /* 1010 */ V(3, 1, 3),\n  /* 1011 */ V(3, 1, 3),\n  /* 1100 */ V(0, 3, 4),\n  /* 1101 */ V(3, 0, 4),\n  /* 1110 */ V(2, 2, 3),\n  /* 1111 */ V(2, 2, 3),\n\n  /* 0011 ... */\n  /* 00   */ V(1, 2, 2),\t/* 64 */\n  /* 01   */ V(2, 1, 2),\n  /* 10   */ V(0, 2, 2),\n  /* 11   */ V(2, 0, 2),\n\n  /* 0000 0000 ... */\n  /* 000  */ V(14, 15, 3),\t/* 68 */\n  /* 001  */ V(15, 14, 3),\n  /* 010  */ V(13, 15, 3),\n  /* 011  */ V(15, 13, 3),\n  /* 100  */ V(12, 15, 3),\n  /* 101  */ V(15, 12, 3),\n  /* 110  */ V(11, 15, 3),\n  /* 111  */ V(15, 11, 3),\n\n  /* 0000 0001 ... */\n  /* 000  */ V(10, 15, 2),\t/* 76 */\n  /* 001  */ V(10, 15, 2),\n  /* 010  */ V(15, 10, 3),\n  /* 011  */ V(9, 15, 3),\n  /* 100  */ V(15, 9, 3),\n  /* 101  */ V(15, 8, 3),\n  /* 110  */ V(8, 15, 2),\n  /* 111  */ V(8, 15, 2),\n\n  /* 0000 0010 ... */\n  /* 00   */ V(7, 15, 2),\t/* 84 */\n  /* 01   */ V(15, 7, 2),\n  /* 10   */ V(6, 15, 2),\n  /* 11   */ V(15, 6, 2),\n\n  /* 0000 0100 ... */\n  /* 00   */ V(5, 15, 2),\t/* 88 */\n  /* 01   */ V(15, 5, 2),\n  /* 10   */ V(4, 15, 1),\n  /* 11   */ V(4, 15, 1),\n\n  /* 0000 0101 ... */\n  /* 0    */ V(15, 4, 1),\t/* 92 */\n  /* 1    */ V(15, 3, 1),\n\n  /* 0000 0110 ... */\n  /* 0000 */ V(15, 0, 1),\t/* 94 */\n  /* 0001 */ V(15, 0, 1),\n  /* 0010 */ V(15, 0, 1),\n  /* 0011 */ V(15, 0, 1),\n  /* 0100 */ V(15, 0, 1),\n  /* 0101 */ V(15, 0, 1),\n  /* 0110 */ V(15, 0, 1),\n  /* 0111 */ V(15, 0, 1),\n  /* 1000 */ V(3, 15, 2),\n  /* 1001 */ V(3, 15, 2),\n  /* 1010 */ V(3, 15, 2),\n  /* 1011 */ V(3, 15, 2),\n  /* 1100 */ PTR(294, 4),\n  /* 1101 */ PTR(310, 3),\n  /* 1110 */ PTR(318, 3),\n  /* 1111 */ PTR(326, 3),\n\n  /* 0000 1000 ... */\n  /* 0    */ V(2, 15, 1),\t/* 110 */\n  /* 1    */ V(0, 15, 1),\n\n  /* 0000 1011 ... */\n  /* 0000 */ PTR(334, 2),\t/* 112 */\n  /* 0001 */ PTR(338, 2),\n  /* 0010 */ PTR(342, 2),\n  /* 0011 */ PTR(346, 1),\n  /* 0100 */ PTR(348, 2),\n  /* 0101 */ PTR(352, 2),\n  /* 0110 */ PTR(356, 1),\n  /* 0111 */ PTR(358, 2),\n  /* 1000 */ PTR(362, 2),\n  /* 1001 */ PTR(366, 2),\n  /* 1010 */ PTR(370, 2),\n  /* 1011 */ V(14, 3, 4),\n  /* 1100 */ PTR(374, 1),\n  /* 1101 */ PTR(376, 1),\n  /* 1110 */ PTR(378, 1),\n  /* 1111 */ PTR(380, 1),\n\n  /* 0000 1100 ... */\n  /* 0000 */ PTR(382, 1),\t/* 128 */\n  /* 0001 */ PTR(384, 1),\n  /* 0010 */ PTR(386, 1),\n  /* 0011 */ V(0, 13, 4),\n  /* 0100 */ PTR(388, 1),\n  /* 0101 */ PTR(390, 1),\n  /* 0110 */ PTR(392, 1),\n  /* 0111 */ V(3, 12, 4),\n  /* 1000 */ PTR(394, 1),\n  /* 1001 */ V(1, 12, 4),\n  /* 1010 */ V(12, 0, 4),\n  /* 1011 */ PTR(396, 1),\n  /* 1100 */ V(14, 2, 3),\n  /* 1101 */ V(14, 2, 3),\n  /* 1110 */ V(2, 14, 4),\n  /* 1111 */ V(1, 14, 4),\n\n  /* 0000 1101 ... */\n  /* 0000 */ V(13, 3, 4),\t/* 144 */\n  /* 0001 */ V(2, 13, 4),\n  /* 0010 */ V(13, 2, 4),\n  /* 0011 */ V(13, 1, 4),\n  /* 0100 */ V(3, 11, 4),\n  /* 0101 */ PTR(398, 1),\n  /* 0110 */ V(1, 13, 3),\n  /* 0111 */ V(1, 13, 3),\n  /* 1000 */ V(12, 4, 4),\n  /* 1001 */ V(6, 11, 4),\n  /* 1010 */ V(12, 3, 4),\n  /* 1011 */ V(10, 7, 4),\n  /* 1100 */ V(2, 12, 3),\n  /* 1101 */ V(2, 12, 3),\n  /* 1110 */ V(12, 2, 4),\n  /* 1111 */ V(11, 5, 4),\n\n  /* 0000 1110 ... */\n  /* 0000 */ V(12, 1, 4),\t/* 160 */\n  /* 0001 */ V(0, 12, 4),\n  /* 0010 */ V(4, 11, 4),\n  /* 0011 */ V(11, 4, 4),\n  /* 0100 */ V(6, 10, 4),\n  /* 0101 */ V(10, 6, 4),\n  /* 0110 */ V(11, 3, 3),\n  /* 0111 */ V(11, 3, 3),\n  /* 1000 */ V(5, 10, 4),\n  /* 1001 */ V(10, 5, 4),\n  /* 1010 */ V(2, 11, 3),\n  /* 1011 */ V(2, 11, 3),\n  /* 1100 */ V(11, 2, 3),\n  /* 1101 */ V(11, 2, 3),\n  /* 1110 */ V(1, 11, 3),\n  /* 1111 */ V(1, 11, 3),\n\n  /* 0000 1111 ... */\n  /* 0000 */ V(11, 1, 3),\t/* 176 */\n  /* 0001 */ V(11, 1, 3),\n  /* 0010 */ V(0, 11, 4),\n  /* 0011 */ V(11, 0, 4),\n  /* 0100 */ V(6, 9, 4),\n  /* 0101 */ V(9, 6, 4),\n  /* 0110 */ V(4, 10, 4),\n  /* 0111 */ V(10, 4, 4),\n  /* 1000 */ V(7, 8, 4),\n  /* 1001 */ V(8, 7, 4),\n  /* 1010 */ V(10, 3, 3),\n  /* 1011 */ V(10, 3, 3),\n  /* 1100 */ V(3, 10, 4),\n  /* 1101 */ V(5, 9, 4),\n  /* 1110 */ V(2, 10, 3),\n  /* 1111 */ V(2, 10, 3),\n\n  /* 0001 0000 ... */\n  /* 0000 */ V(9, 5, 4),\t/* 192 */\n  /* 0001 */ V(6, 8, 4),\n  /* 0010 */ V(10, 1, 3),\n  /* 0011 */ V(10, 1, 3),\n  /* 0100 */ V(8, 6, 4),\n  /* 0101 */ V(7, 7, 4),\n  /* 0110 */ V(9, 4, 3),\n  /* 0111 */ V(9, 4, 3),\n  /* 1000 */ V(4, 9, 4),\n  /* 1001 */ V(5, 7, 4),\n  /* 1010 */ V(6, 7, 3),\n  /* 1011 */ V(6, 7, 3),\n  /* 1100 */ V(10, 2, 2),\n  /* 1101 */ V(10, 2, 2),\n  /* 1110 */ V(10, 2, 2),\n  /* 1111 */ V(10, 2, 2),\n\n  /* 0001 0001 ... */\n  /* 000  */ V(1, 10, 2),\t/* 208 */\n  /* 001  */ V(1, 10, 2),\n  /* 010  */ V(0, 10, 3),\n  /* 011  */ V(10, 0, 3),\n  /* 100  */ V(3, 9, 3),\n  /* 101  */ V(9, 3, 3),\n  /* 110  */ V(5, 8, 3),\n  /* 111  */ V(8, 5, 3),\n\n  /* 0001 0010 ... */\n  /* 000  */ V(2, 9, 2),\t/* 216 */\n  /* 001  */ V(2, 9, 2),\n  /* 010  */ V(9, 2, 2),\n  /* 011  */ V(9, 2, 2),\n  /* 100  */ V(7, 6, 3),\n  /* 101  */ V(0, 9, 3),\n  /* 110  */ V(1, 9, 2),\n  /* 111  */ V(1, 9, 2),\n\n  /* 0001 0011 ... */\n  /* 000  */ V(9, 1, 2),\t/* 224 */\n  /* 001  */ V(9, 1, 2),\n  /* 010  */ V(9, 0, 3),\n  /* 011  */ V(4, 8, 3),\n  /* 100  */ V(8, 4, 3),\n  /* 101  */ V(7, 5, 3),\n  /* 110  */ V(3, 8, 3),\n  /* 111  */ V(8, 3, 3),\n\n  /* 0001 0100 ... */\n  /* 000  */ V(6, 6, 3),\t/* 232 */\n  /* 001  */ V(2, 8, 3),\n  /* 010  */ V(8, 2, 2),\n  /* 011  */ V(8, 2, 2),\n  /* 100  */ V(4, 7, 3),\n  /* 101  */ V(7, 4, 3),\n  /* 110  */ V(1, 8, 2),\n  /* 111  */ V(1, 8, 2),\n\n  /* 0001 0101 ... */\n  /* 000  */ V(8, 1, 2),\t/* 240 */\n  /* 001  */ V(8, 1, 2),\n  /* 010  */ V(8, 0, 2),\n  /* 011  */ V(8, 0, 2),\n  /* 100  */ V(0, 8, 3),\n  /* 101  */ V(5, 6, 3),\n  /* 110  */ V(3, 7, 2),\n  /* 111  */ V(3, 7, 2),\n\n  /* 0001 0110 ... */\n  /* 000  */ V(7, 3, 2),\t/* 248 */\n  /* 001  */ V(7, 3, 2),\n  /* 010  */ V(6, 5, 3),\n  /* 011  */ V(4, 6, 3),\n  /* 100  */ V(2, 7, 2),\n  /* 101  */ V(2, 7, 2),\n  /* 110  */ V(7, 2, 2),\n  /* 111  */ V(7, 2, 2),\n\n  /* 0001 0111 ... */\n  /* 000  */ V(6, 4, 3),\t/* 256 */\n  /* 001  */ V(5, 5, 3),\n  /* 010  */ V(0, 7, 2),\n  /* 011  */ V(0, 7, 2),\n  /* 100  */ V(1, 7, 1),\n  /* 101  */ V(1, 7, 1),\n  /* 110  */ V(1, 7, 1),\n  /* 111  */ V(1, 7, 1),\n\n  /* 0001 1000 ... */\n  /* 00   */ V(7, 1, 1),\t/* 264  */\n  /* 01   */ V(7, 1, 1),\n  /* 10   */ V(7, 0, 2),\n  /* 11   */ V(3, 6, 2),\n\n  /* 0001 1001 ... */\n  /* 00   */ V(6, 3, 2),\t/* 268 */\n  /* 01   */ V(4, 5, 2),\n  /* 10   */ V(5, 4, 2),\n  /* 11   */ V(2, 6, 2),\n\n  /* 0001 1010 ... */\n  /* 0    */ V(6, 2, 1),\t/* 272 */\n  /* 1    */ V(1, 6, 1),\n\n  /* 0001 1011 ... */\n  /* 00   */ V(6, 1, 1),\t/* 274 */\n  /* 01   */ V(6, 1, 1),\n  /* 10   */ V(0, 6, 2),\n  /* 11   */ V(6, 0, 2),\n\n  /* 0001 1100 ... */\n  /* 00   */ V(5, 3, 1),\t/* 278 */\n  /* 01   */ V(5, 3, 1),\n  /* 10   */ V(3, 5, 2),\n  /* 11   */ V(4, 4, 2),\n\n  /* 0001 1101 ... */\n  /* 0    */ V(2, 5, 1),\t/* 282 */\n  /* 1    */ V(5, 2, 1),\n\n  /* 0001 1111 ... */\n  /* 0    */ V(1, 5, 1),\t/* 284 */\n  /* 1    */ V(0, 5, 1),\n\n  /* 0010 0000 ... */\n  /* 0    */ V(3, 4, 1),\t/* 286 */\n  /* 1    */ V(4, 3, 1),\n\n  /* 0010 0001 ... */\n  /* 0    */ V(5, 0, 1),\t/* 288 */\n  /* 1    */ V(2, 4, 1),\n\n  /* 0010 0010 ... */\n  /* 0    */ V(4, 2, 1),\t/* 290 */\n  /* 1    */ V(3, 3, 1),\n\n  /* 0010 0101 ... */\n  /* 0    */ V(0, 4, 1),\t/* 292 */\n  /* 1    */ V(4, 0, 1),\n\n  /* 0000 0110 1100 ... */\n  /* 0000 */ V(12, 14, 4),\t/* 294 */\n  /* 0001 */ PTR(400, 1),\n  /* 0010 */ V(13, 14, 3),\n  /* 0011 */ V(13, 14, 3),\n  /* 0100 */ V(14, 9, 3),\n  /* 0101 */ V(14, 9, 3),\n  /* 0110 */ V(14, 10, 4),\n  /* 0111 */ V(13, 9, 4),\n  /* 1000 */ V(14, 14, 2),\n  /* 1001 */ V(14, 14, 2),\n  /* 1010 */ V(14, 14, 2),\n  /* 1011 */ V(14, 14, 2),\n  /* 1100 */ V(14, 13, 3),\n  /* 1101 */ V(14, 13, 3),\n  /* 1110 */ V(14, 11, 3),\n  /* 1111 */ V(14, 11, 3),\n\n  /* 0000 0110 1101 ... */\n  /* 000  */ V(11, 14, 2),\t/* 310 */\n  /* 001  */ V(11, 14, 2),\n  /* 010  */ V(12, 13, 2),\n  /* 011  */ V(12, 13, 2),\n  /* 100  */ V(13, 12, 3),\n  /* 101  */ V(13, 11, 3),\n  /* 110  */ V(10, 14, 2),\n  /* 111  */ V(10, 14, 2),\n\n  /* 0000 0110 1110 ... */\n  /* 000  */ V(12, 12, 2),\t/* 318 */\n  /* 001  */ V(12, 12, 2),\n  /* 010  */ V(10, 13, 3),\n  /* 011  */ V(13, 10, 3),\n  /* 100  */ V(7, 14, 3),\n  /* 101  */ V(10, 12, 3),\n  /* 110  */ V(12, 10, 2),\n  /* 111  */ V(12, 10, 2),\n\n  /* 0000 0110 1111 ... */\n  /* 000  */ V(12, 9, 3),\t/* 326 */\n  /* 001  */ V(7, 13, 3),\n  /* 010  */ V(5, 14, 2),\n  /* 011  */ V(5, 14, 2),\n  /* 100  */ V(11, 13, 1),\n  /* 101  */ V(11, 13, 1),\n  /* 110  */ V(11, 13, 1),\n  /* 111  */ V(11, 13, 1),\n\n  /* 0000 1011 0000 ... */\n  /* 00   */ V(9, 14, 1),\t/* 334 */\n  /* 01   */ V(9, 14, 1),\n  /* 10   */ V(11, 12, 2),\n  /* 11   */ V(12, 11, 2),\n\n  /* 0000 1011 0001 ... */\n  /* 00   */ V(8, 14, 2),\t/* 338 */\n  /* 01   */ V(14, 8, 2),\n  /* 10   */ V(9, 13, 2),\n  /* 11   */ V(14, 7, 2),\n\n  /* 0000 1011 0010 ... */\n  /* 00   */ V(11, 11, 2),\t/* 342 */\n  /* 01   */ V(8, 13, 2),\n  /* 10   */ V(13, 8, 2),\n  /* 11   */ V(6, 14, 2),\n\n  /* 0000 1011 0011 ... */\n  /* 0    */ V(14, 6, 1),\t/* 346 */\n  /* 1    */ V(9, 12, 1),\n\n  /* 0000 1011 0100 ... */\n  /* 00   */ V(10, 11, 2),\t/* 348 */\n  /* 01   */ V(11, 10, 2),\n  /* 10   */ V(14, 5, 2),\n  /* 11   */ V(13, 7, 2),\n\n  /* 0000 1011 0101 ... */\n  /* 00   */ V(4, 14, 1),\t/* 352 */\n  /* 01   */ V(4, 14, 1),\n  /* 10   */ V(14, 4, 2),\n  /* 11   */ V(8, 12, 2),\n\n  /* 0000 1011 0110 ... */\n  /* 0    */ V(12, 8, 1),\t/* 356 */\n  /* 1    */ V(3, 14, 1),\n\n  /* 0000 1011 0111 ... */\n  /* 00   */ V(6, 13, 1),\t/* 358 */\n  /* 01   */ V(6, 13, 1),\n  /* 10   */ V(13, 6, 2),\n  /* 11   */ V(9, 11, 2),\n\n  /* 0000 1011 1000 ... */\n  /* 00   */ V(11, 9, 2),\t/* 362 */\n  /* 01   */ V(10, 10, 2),\n  /* 10   */ V(14, 1, 1),\n  /* 11   */ V(14, 1, 1),\n\n  /* 0000 1011 1001 ... */\n  /* 00   */ V(13, 4, 1),\t/* 366 */\n  /* 01   */ V(13, 4, 1),\n  /* 10   */ V(11, 8, 2),\n  /* 11   */ V(10, 9, 2),\n\n  /* 0000 1011 1010 ... */\n  /* 00   */ V(7, 11, 1),\t/* 370 */\n  /* 01   */ V(7, 11, 1),\n  /* 10   */ V(11, 7, 2),\n  /* 11   */ V(13, 0, 2),\n\n  /* 0000 1011 1100 ... */\n  /* 0    */ V(0, 14, 1),\t/* 374 */\n  /* 1    */ V(14, 0, 1),\n\n  /* 0000 1011 1101 ... */\n  /* 0    */ V(5, 13, 1),\t/* 376 */\n  /* 1    */ V(13, 5, 1),\n\n  /* 0000 1011 1110 ... */\n  /* 0    */ V(7, 12, 1),\t/* 378 */\n  /* 1    */ V(12, 7, 1),\n\n  /* 0000 1011 1111 ... */\n  /* 0    */ V(4, 13, 1),\t/* 380 */\n  /* 1    */ V(8, 11, 1),\n\n  /* 0000 1100 0000 ... */\n  /* 0    */ V(9, 10, 1),\t/* 382 */\n  /* 1    */ V(6, 12, 1),\n\n  /* 0000 1100 0001 ... */\n  /* 0    */ V(12, 6, 1),\t/* 384 */\n  /* 1    */ V(3, 13, 1),\n\n  /* 0000 1100 0010 ... */\n  /* 0    */ V(5, 12, 1),\t/* 386 */\n  /* 1    */ V(12, 5, 1),\n\n  /* 0000 1100 0100 ... */\n  /* 0    */ V(8, 10, 1),\t/* 388 */\n  /* 1    */ V(10, 8, 1),\n\n  /* 0000 1100 0101 ... */\n  /* 0    */ V(9, 9, 1),\t/* 390 */\n  /* 1    */ V(4, 12, 1),\n\n  /* 0000 1100 0110 ... */\n  /* 0    */ V(11, 6, 1),\t/* 392 */\n  /* 1    */ V(7, 10, 1),\n\n  /* 0000 1100 1000 ... */\n  /* 0    */ V(5, 11, 1),\t/* 394 */\n  /* 1    */ V(8, 9, 1),\n\n  /* 0000 1100 1011 ... */\n  /* 0    */ V(9, 8, 1),\t/* 396 */\n  /* 1    */ V(7, 9, 1),\n\n  /* 0000 1101 0101 ... */\n  /* 0    */ V(9, 7, 1),\t/* 398 */\n  /* 1    */ V(8, 8, 1),\n\n  /* 0000 0110 1100 0001 ... */\n  /* 0    */ V(14, 12, 1),\t/* 400 */\n  /* 1    */ V(13, 13, 1)\n];\n\nconst hufftab24 = [\n  /* 0000 */ PTR(16, 4),\n  /* 0001 */ PTR(32, 4),\n  /* 0010 */ PTR(48, 4),\n  /* 0011 */ V(15, 15, 4),\n  /* 0100 */ PTR(64, 4),\n  /* 0101 */ PTR(80, 4),\n  /* 0110 */ PTR(96, 4),\n  /* 0111 */ PTR(112, 4),\n  /* 1000 */ PTR(128, 4),\n  /* 1001 */ PTR(144, 4),\n  /* 1010 */ PTR(160, 3),\n  /* 1011 */ PTR(168, 2),\n  /* 1100 */ V(1, 1, 4),\n  /* 1101 */ V(0, 1, 4),\n  /* 1110 */ V(1, 0, 4),\n  /* 1111 */ V(0, 0, 4),\n\n  /* 0000 ... */\n  /* 0000 */ V(14, 15, 4),\t/* 16 */\n  /* 0001 */ V(15, 14, 4),\n  /* 0010 */ V(13, 15, 4),\n  /* 0011 */ V(15, 13, 4),\n  /* 0100 */ V(12, 15, 4),\n  /* 0101 */ V(15, 12, 4),\n  /* 0110 */ V(11, 15, 4),\n  /* 0111 */ V(15, 11, 4),\n  /* 1000 */ V(15, 10, 3),\n  /* 1001 */ V(15, 10, 3),\n  /* 1010 */ V(10, 15, 4),\n  /* 1011 */ V(9, 15, 4),\n  /* 1100 */ V(15, 9, 3),\n  /* 1101 */ V(15, 9, 3),\n  /* 1110 */ V(15, 8, 3),\n  /* 1111 */ V(15, 8, 3),\n\n  /* 0001 ... */\n  /* 0000 */ V(8, 15, 4),\t/* 32 */\n  /* 0001 */ V(7, 15, 4),\n  /* 0010 */ V(15, 7, 3),\n  /* 0011 */ V(15, 7, 3),\n  /* 0100 */ V(6, 15, 3),\n  /* 0101 */ V(6, 15, 3),\n  /* 0110 */ V(15, 6, 3),\n  /* 0111 */ V(15, 6, 3),\n  /* 1000 */ V(5, 15, 3),\n  /* 1001 */ V(5, 15, 3),\n  /* 1010 */ V(15, 5, 3),\n  /* 1011 */ V(15, 5, 3),\n  /* 1100 */ V(4, 15, 3),\n  /* 1101 */ V(4, 15, 3),\n  /* 1110 */ V(15, 4, 3),\n  /* 1111 */ V(15, 4, 3),\n\n  /* 0010 ... */\n  /* 0000 */ V(3, 15, 3),\t/* 48 */\n  /* 0001 */ V(3, 15, 3),\n  /* 0010 */ V(15, 3, 3),\n  /* 0011 */ V(15, 3, 3),\n  /* 0100 */ V(2, 15, 3),\n  /* 0101 */ V(2, 15, 3),\n  /* 0110 */ V(15, 2, 3),\n  /* 0111 */ V(15, 2, 3),\n  /* 1000 */ V(15, 1, 3),\n  /* 1001 */ V(15, 1, 3),\n  /* 1010 */ V(1, 15, 4),\n  /* 1011 */ V(15, 0, 4),\n  /* 1100 */ PTR(172, 3),\n  /* 1101 */ PTR(180, 3),\n  /* 1110 */ PTR(188, 3),\n  /* 1111 */ PTR(196, 3),\n\n  /* 0100 ... */\n  /* 0000 */ PTR(204, 4),\t/* 64 */\n  /* 0001 */ PTR(220, 3),\n  /* 0010 */ PTR(228, 3),\n  /* 0011 */ PTR(236, 3),\n  /* 0100 */ PTR(244, 2),\n  /* 0101 */ PTR(248, 2),\n  /* 0110 */ PTR(252, 2),\n  /* 0111 */ PTR(256, 2),\n  /* 1000 */ PTR(260, 2),\n  /* 1001 */ PTR(264, 2),\n  /* 1010 */ PTR(268, 2),\n  /* 1011 */ PTR(272, 2),\n  /* 1100 */ PTR(276, 2),\n  /* 1101 */ PTR(280, 3),\n  /* 1110 */ PTR(288, 2),\n  /* 1111 */ PTR(292, 2),\n\n  /* 0101 ... */\n  /* 0000 */ PTR(296, 2),\t/* 80 */\n  /* 0001 */ PTR(300, 3),\n  /* 0010 */ PTR(308, 2),\n  /* 0011 */ PTR(312, 3),\n  /* 0100 */ PTR(320, 1),\n  /* 0101 */ PTR(322, 2),\n  /* 0110 */ PTR(326, 2),\n  /* 0111 */ PTR(330, 1),\n  /* 1000 */ PTR(332, 2),\n  /* 1001 */ PTR(336, 1),\n  /* 1010 */ PTR(338, 1),\n  /* 1011 */ PTR(340, 1),\n  /* 1100 */ PTR(342, 1),\n  /* 1101 */ PTR(344, 1),\n  /* 1110 */ PTR(346, 1),\n  /* 1111 */ PTR(348, 1),\n\n  /* 0110 ... */\n  /* 0000 */ PTR(350, 1),\t/* 96 */\n  /* 0001 */ PTR(352, 1),\n  /* 0010 */ PTR(354, 1),\n  /* 0011 */ PTR(356, 1),\n  /* 0100 */ PTR(358, 1),\n  /* 0101 */ PTR(360, 1),\n  /* 0110 */ PTR(362, 1),\n  /* 0111 */ PTR(364, 1),\n  /* 1000 */ PTR(366, 1),\n  /* 1001 */ PTR(368, 1),\n  /* 1010 */ PTR(370, 2),\n  /* 1011 */ PTR(374, 1),\n  /* 1100 */ PTR(376, 2),\n  /* 1101 */ V(7, 3, 4),\n  /* 1110 */ PTR(380, 1),\n  /* 1111 */ V(7, 2, 4),\n\n  /* 0111 ... */\n  /* 0000 */ V(4, 6, 4),\t/* 112 */\n  /* 0001 */ V(6, 4, 4),\n  /* 0010 */ V(5, 5, 4),\n  /* 0011 */ V(7, 1, 4),\n  /* 0100 */ V(3, 6, 4),\n  /* 0101 */ V(6, 3, 4),\n  /* 0110 */ V(4, 5, 4),\n  /* 0111 */ V(5, 4, 4),\n  /* 1000 */ V(2, 6, 4),\n  /* 1001 */ V(6, 2, 4),\n  /* 1010 */ V(1, 6, 4),\n  /* 1011 */ V(6, 1, 4),\n  /* 1100 */ PTR(382, 1),\n  /* 1101 */ V(3, 5, 4),\n  /* 1110 */ V(5, 3, 4),\n  /* 1111 */ V(4, 4, 4),\n\n  /* 1000 ... */\n  /* 0000 */ V(2, 5, 4),\t/* 128 */\n  /* 0001 */ V(5, 2, 4),\n  /* 0010 */ V(1, 5, 4),\n  /* 0011 */ PTR(384, 1),\n  /* 0100 */ V(5, 1, 3),\n  /* 0101 */ V(5, 1, 3),\n  /* 0110 */ V(3, 4, 4),\n  /* 0111 */ V(4, 3, 4),\n  /* 1000 */ V(2, 4, 3),\n  /* 1001 */ V(2, 4, 3),\n  /* 1010 */ V(4, 2, 3),\n  /* 1011 */ V(4, 2, 3),\n  /* 1100 */ V(3, 3, 3),\n  /* 1101 */ V(3, 3, 3),\n  /* 1110 */ V(1, 4, 3),\n  /* 1111 */ V(1, 4, 3),\n\n  /* 1001 ... */\n  /* 0000 */ V(4, 1, 3),\t/* 144 */\n  /* 0001 */ V(4, 1, 3),\n  /* 0010 */ V(0, 4, 4),\n  /* 0011 */ V(4, 0, 4),\n  /* 0100 */ V(2, 3, 3),\n  /* 0101 */ V(2, 3, 3),\n  /* 0110 */ V(3, 2, 3),\n  /* 0111 */ V(3, 2, 3),\n  /* 1000 */ V(1, 3, 2),\n  /* 1001 */ V(1, 3, 2),\n  /* 1010 */ V(1, 3, 2),\n  /* 1011 */ V(1, 3, 2),\n  /* 1100 */ V(3, 1, 2),\n  /* 1101 */ V(3, 1, 2),\n  /* 1110 */ V(3, 1, 2),\n  /* 1111 */ V(3, 1, 2),\n\n  /* 1010 ... */\n  /* 000  */ V(0, 3, 3),\t/* 160 */\n  /* 001  */ V(3, 0, 3),\n  /* 010  */ V(2, 2, 2),\n  /* 011  */ V(2, 2, 2),\n  /* 100  */ V(1, 2, 1),\n  /* 101  */ V(1, 2, 1),\n  /* 110  */ V(1, 2, 1),\n  /* 111  */ V(1, 2, 1),\n\n  /* 1011 ... */\n  /* 00   */ V(2, 1, 1),\t/* 168 */\n  /* 01   */ V(2, 1, 1),\n  /* 10   */ V(0, 2, 2),\n  /* 11   */ V(2, 0, 2),\n\n  /* 0010 1100 ... */\n  /* 000  */ V(0, 15, 1),\t/* 172 */\n  /* 001  */ V(0, 15, 1),\n  /* 010  */ V(0, 15, 1),\n  /* 011  */ V(0, 15, 1),\n  /* 100  */ V(14, 14, 3),\n  /* 101  */ V(13, 14, 3),\n  /* 110  */ V(14, 13, 3),\n  /* 111  */ V(12, 14, 3),\n\n  /* 0010 1101 ... */\n  /* 000  */ V(14, 12, 3),\t/* 180 */\n  /* 001  */ V(13, 13, 3),\n  /* 010  */ V(11, 14, 3),\n  /* 011  */ V(14, 11, 3),\n  /* 100  */ V(12, 13, 3),\n  /* 101  */ V(13, 12, 3),\n  /* 110  */ V(10, 14, 3),\n  /* 111  */ V(14, 10, 3),\n\n  /* 0010 1110 ... */\n  /* 000  */ V(11, 13, 3),\t/* 188 */\n  /* 001  */ V(13, 11, 3),\n  /* 010  */ V(12, 12, 3),\n  /* 011  */ V(9, 14, 3),\n  /* 100  */ V(14, 9, 3),\n  /* 101  */ V(10, 13, 3),\n  /* 110  */ V(13, 10, 3),\n  /* 111  */ V(11, 12, 3),\n\n  /* 0010 1111 ... */\n  /* 000  */ V(12, 11, 3),\t/* 196 */\n  /* 001  */ V(8, 14, 3),\n  /* 010  */ V(14, 8, 3),\n  /* 011  */ V(9, 13, 3),\n  /* 100  */ V(13, 9, 3),\n  /* 101  */ V(7, 14, 3),\n  /* 110  */ V(14, 7, 3),\n  /* 111  */ V(10, 12, 3),\n\n  /* 0100 0000 ... */\n  /* 0000 */ V(12, 10, 3),\t/* 204 */\n  /* 0001 */ V(12, 10, 3),\n  /* 0010 */ V(11, 11, 3),\n  /* 0011 */ V(11, 11, 3),\n  /* 0100 */ V(8, 13, 3),\n  /* 0101 */ V(8, 13, 3),\n  /* 0110 */ V(13, 8, 3),\n  /* 0111 */ V(13, 8, 3),\n  /* 1000 */ V(0, 14, 4),\n  /* 1001 */ V(14, 0, 4),\n  /* 1010 */ V(0, 13, 3),\n  /* 1011 */ V(0, 13, 3),\n  /* 1100 */ V(14, 6, 2),\n  /* 1101 */ V(14, 6, 2),\n  /* 1110 */ V(14, 6, 2),\n  /* 1111 */ V(14, 6, 2),\n\n  /* 0100 0001 ... */\n  /* 000  */ V(6, 14, 3),\t/* 220 */\n  /* 001  */ V(9, 12, 3),\n  /* 010  */ V(12, 9, 2),\n  /* 011  */ V(12, 9, 2),\n  /* 100  */ V(5, 14, 2),\n  /* 101  */ V(5, 14, 2),\n  /* 110  */ V(11, 10, 2),\n  /* 111  */ V(11, 10, 2),\n\n  /* 0100 0010 ... */\n  /* 000  */ V(14, 5, 2),\t/* 228 */\n  /* 001  */ V(14, 5, 2),\n  /* 010  */ V(10, 11, 3),\n  /* 011  */ V(7, 13, 3),\n  /* 100  */ V(13, 7, 2),\n  /* 101  */ V(13, 7, 2),\n  /* 110  */ V(14, 4, 2),\n  /* 111  */ V(14, 4, 2),\n\n  /* 0100 0011 ... */\n  /* 000  */ V(8, 12, 2),\t/* 236 */\n  /* 001  */ V(8, 12, 2),\n  /* 010  */ V(12, 8, 2),\n  /* 011  */ V(12, 8, 2),\n  /* 100  */ V(4, 14, 3),\n  /* 101  */ V(2, 14, 3),\n  /* 110  */ V(3, 14, 2),\n  /* 111  */ V(3, 14, 2),\n\n  /* 0100 0100 ... */\n  /* 00   */ V(6, 13, 2),\t/* 244 */\n  /* 01   */ V(13, 6, 2),\n  /* 10   */ V(14, 3, 2),\n  /* 11   */ V(9, 11, 2),\n\n  /* 0100 0101 ... */\n  /* 00   */ V(11, 9, 2),\t/* 248 */\n  /* 01   */ V(10, 10, 2),\n  /* 10   */ V(14, 2, 2),\n  /* 11   */ V(1, 14, 2),\n\n  /* 0100 0110 ... */\n  /* 00   */ V(14, 1, 2),\t/* 252 */\n  /* 01   */ V(5, 13, 2),\n  /* 10   */ V(13, 5, 2),\n  /* 11   */ V(7, 12, 2),\n\n  /* 0100 0111 ... */\n  /* 00   */ V(12, 7, 2),\t/* 256 */\n  /* 01   */ V(4, 13, 2),\n  /* 10   */ V(8, 11, 2),\n  /* 11   */ V(11, 8, 2),\n\n  /* 0100 1000 ... */\n  /* 00   */ V(13, 4, 2),\t/* 260 */\n  /* 01   */ V(9, 10, 2),\n  /* 10   */ V(10, 9, 2),\n  /* 11   */ V(6, 12, 2),\n\n  /* 0100 1001 ... */\n  /* 00   */ V(12, 6, 2),\t/* 264 */\n  /* 01   */ V(3, 13, 2),\n  /* 10   */ V(13, 3, 2),\n  /* 11   */ V(2, 13, 2),\n\n  /* 0100 1010 ... */\n  /* 00   */ V(13, 2, 2),\t/* 268 */\n  /* 01   */ V(1, 13, 2),\n  /* 10   */ V(7, 11, 2),\n  /* 11   */ V(11, 7, 2),\n\n  /* 0100 1011 ... */\n  /* 00   */ V(13, 1, 2),\t/* 272 */\n  /* 01   */ V(5, 12, 2),\n  /* 10   */ V(12, 5, 2),\n  /* 11   */ V(8, 10, 2),\n\n  /* 0100 1100 ... */\n  /* 00   */ V(10, 8, 2),\t/* 276 */\n  /* 01   */ V(9, 9, 2),\n  /* 10   */ V(4, 12, 2),\n  /* 11   */ V(12, 4, 2),\n\n  /* 0100 1101 ... */\n  /* 000  */ V(6, 11, 2),\t/* 280 */\n  /* 001  */ V(6, 11, 2),\n  /* 010  */ V(11, 6, 2),\n  /* 011  */ V(11, 6, 2),\n  /* 100  */ V(13, 0, 3),\n  /* 101  */ V(0, 12, 3),\n  /* 110  */ V(3, 12, 2),\n  /* 111  */ V(3, 12, 2),\n\n  /* 0100 1110 ... */\n  /* 00   */ V(12, 3, 2),\t/* 288 */\n  /* 01   */ V(7, 10, 2),\n  /* 10   */ V(10, 7, 2),\n  /* 11   */ V(2, 12, 2),\n\n  /* 0100 1111 ... */\n  /* 00   */ V(12, 2, 2),\t/* 292 */\n  /* 01   */ V(5, 11, 2),\n  /* 10   */ V(11, 5, 2),\n  /* 11   */ V(1, 12, 2),\n\n  /* 0101 0000 ... */\n  /* 00   */ V(8, 9, 2),\t/* 296 */\n  /* 01   */ V(9, 8, 2),\n  /* 10   */ V(12, 1, 2),\n  /* 11   */ V(4, 11, 2),\n\n  /* 0101 0001 ... */\n  /* 000  */ V(12, 0, 3),\t/* 300 */\n  /* 001  */ V(0, 11, 3),\n  /* 010  */ V(3, 11, 2),\n  /* 011  */ V(3, 11, 2),\n  /* 100  */ V(11, 0, 3),\n  /* 101  */ V(0, 10, 3),\n  /* 110  */ V(1, 10, 2),\n  /* 111  */ V(1, 10, 2),\n\n  /* 0101 0010 ... */\n  /* 00   */ V(11, 4, 1),\t/* 308 */\n  /* 01   */ V(11, 4, 1),\n  /* 10   */ V(6, 10, 2),\n  /* 11   */ V(10, 6, 2),\n\n  /* 0101 0011 ... */\n  /* 000  */ V(7, 9, 2),\t/* 312 */\n  /* 001  */ V(7, 9, 2),\n  /* 010  */ V(9, 7, 2),\n  /* 011  */ V(9, 7, 2),\n  /* 100  */ V(10, 0, 3),\n  /* 101  */ V(0, 9, 3),\n  /* 110  */ V(9, 0, 2),\n  /* 111  */ V(9, 0, 2),\n\n  /* 0101 0100 ... */\n  /* 0    */ V(11, 3, 1),\t/* 320 */\n  /* 1    */ V(8, 8, 1),\n\n  /* 0101 0101 ... */\n  /* 00   */ V(2, 11, 2),\t/* 322 */\n  /* 01   */ V(5, 10, 2),\n  /* 10   */ V(11, 2, 1),\n  /* 11   */ V(11, 2, 1),\n\n  /* 0101 0110 ... */\n  /* 00   */ V(10, 5, 2),\t/* 326 */\n  /* 01   */ V(1, 11, 2),\n  /* 10   */ V(11, 1, 2),\n  /* 11   */ V(6, 9, 2),\n\n  /* 0101 0111 ... */\n  /* 0    */ V(9, 6, 1),\t/* 330 */\n  /* 1    */ V(10, 4, 1),\n\n  /* 0101 1000 ... */\n  /* 00   */ V(4, 10, 2),\t/* 332 */\n  /* 01   */ V(7, 8, 2),\n  /* 10   */ V(8, 7, 1),\n  /* 11   */ V(8, 7, 1),\n\n  /* 0101 1001 ... */\n  /* 0    */ V(3, 10, 1),\t/* 336 */\n  /* 1    */ V(10, 3, 1),\n\n  /* 0101 1010 ... */\n  /* 0    */ V(5, 9, 1),\t/* 338 */\n  /* 1    */ V(9, 5, 1),\n\n  /* 0101 1011 ... */\n  /* 0    */ V(2, 10, 1),\t/* 340 */\n  /* 1    */ V(10, 2, 1),\n\n  /* 0101 1100 ... */\n  /* 0    */ V(10, 1, 1),\t/* 342 */\n  /* 1    */ V(6, 8, 1),\n\n  /* 0101 1101 ... */\n  /* 0    */ V(8, 6, 1),\t/* 344 */\n  /* 1    */ V(7, 7, 1),\n\n  /* 0101 1110 ... */\n  /* 0    */ V(4, 9, 1),\t/* 346 */\n  /* 1    */ V(9, 4, 1),\n\n  /* 0101 1111 ... */\n  /* 0    */ V(3, 9, 1),\t/* 348 */\n  /* 1    */ V(9, 3, 1),\n\n  /* 0110 0000 ... */\n  /* 0    */ V(5, 8, 1),\t/* 350 */\n  /* 1    */ V(8, 5, 1),\n\n  /* 0110 0001 ... */\n  /* 0    */ V(2, 9, 1),\t/* 352 */\n  /* 1    */ V(6, 7, 1),\n\n  /* 0110 0010 ... */\n  /* 0    */ V(7, 6, 1),\t/* 354 */\n  /* 1    */ V(9, 2, 1),\n\n  /* 0110 0011 ... */\n  /* 0    */ V(1, 9, 1),\t/* 356 */\n  /* 1    */ V(9, 1, 1),\n\n  /* 0110 0100 ... */\n  /* 0    */ V(4, 8, 1),\t/* 358 */\n  /* 1    */ V(8, 4, 1),\n\n  /* 0110 0101 ... */\n  /* 0    */ V(5, 7, 1),\t/* 360 */\n  /* 1    */ V(7, 5, 1),\n\n  /* 0110 0110 ... */\n  /* 0    */ V(3, 8, 1),\t/* 362 */\n  /* 1    */ V(8, 3, 1),\n\n  /* 0110 0111 ... */\n  /* 0    */ V(6, 6, 1),\t/* 364 */\n  /* 1    */ V(2, 8, 1),\n\n  /* 0110 1000 ... */\n  /* 0    */ V(8, 2, 1),\t/* 366 */\n  /* 1    */ V(1, 8, 1),\n\n  /* 0110 1001 ... */\n  /* 0    */ V(4, 7, 1),\t/* 368 */\n  /* 1    */ V(7, 4, 1),\n\n  /* 0110 1010 ... */\n  /* 00   */ V(8, 1, 1),\t/* 370 */\n  /* 01   */ V(8, 1, 1),\n  /* 10   */ V(0, 8, 2),\n  /* 11   */ V(8, 0, 2),\n\n  /* 0110 1011 ... */\n  /* 0    */ V(5, 6, 1),\t/* 374 */\n  /* 1    */ V(6, 5, 1),\n\n  /* 0110 1100 ... */\n  /* 00   */ V(1, 7, 1),\t/* 376 */\n  /* 01   */ V(1, 7, 1),\n  /* 10   */ V(0, 7, 2),\n  /* 11   */ V(7, 0, 2),\n\n  /* 0110 1110 ... */\n  /* 0    */ V(3, 7, 1),\t/* 380  */\n  /* 1    */ V(2, 7, 1),\n\n  /* 0111 1100 ... */\n  /* 0    */ V(0, 6, 1),\t/* 382 */\n  /* 1    */ V(6, 0, 1),\n\n  /* 1000 0011 ... */\n  /* 0    */ V(0, 5, 1),\t/* 384 */\n  /* 1    */ V(5, 0, 1)\n];\n\n/* hufftable constructor */\nfunction MP3Hufftable(table, linbits, startbits) {\n    this.table = table;\n    this.linbits = linbits;\n    this.startbits = startbits;\n};\n\n/* external tables */\nexports.huff_quad_table = [ hufftabA, hufftabB ];\nexports.huff_pair_table = [\n  /*  0 */ new MP3Hufftable(hufftab0,   0, 0),\n  /*  1 */ new MP3Hufftable(hufftab1,   0, 3),\n  /*  2 */ new MP3Hufftable(hufftab2,   0, 3),\n  /*  3 */ new MP3Hufftable(hufftab3,   0, 3),\n  /*  4 */ null, //new MP3Hufftable(0 /* not used */),\n  /*  5 */ new MP3Hufftable(hufftab5,   0, 3),\n  /*  6 */ new MP3Hufftable(hufftab6,   0, 4),\n  /*  7 */ new MP3Hufftable(hufftab7,   0, 4),\n  /*  8 */ new MP3Hufftable(hufftab8,   0, 4),\n  /*  9 */ new MP3Hufftable(hufftab9,   0, 4),\n  /* 10 */ new MP3Hufftable(hufftab10,  0, 4),\n  /* 11 */ new MP3Hufftable(hufftab11,  0, 4),\n  /* 12 */ new MP3Hufftable(hufftab12,  0, 4),\n  /* 13 */ new MP3Hufftable(hufftab13,  0, 4),\n  /* 14 */ null, //new MP3Hufftable(0 /* not used */),\n  /* 15 */ new MP3Hufftable(hufftab15,  0, 4),\n  /* 16 */ new MP3Hufftable(hufftab16,  1, 4),\n  /* 17 */ new MP3Hufftable(hufftab16,  2, 4),\n  /* 18 */ new MP3Hufftable(hufftab16,  3, 4),\n  /* 19 */ new MP3Hufftable(hufftab16,  4, 4),\n  /* 20 */ new MP3Hufftable(hufftab16,  6, 4),\n  /* 21 */ new MP3Hufftable(hufftab16,  8, 4),\n  /* 22 */ new MP3Hufftable(hufftab16, 10, 4),\n  /* 23 */ new MP3Hufftable(hufftab16, 13, 4),\n  /* 24 */ new MP3Hufftable(hufftab24,  4, 4),\n  /* 25 */ new MP3Hufftable(hufftab24,  5, 4),\n  /* 26 */ new MP3Hufftable(hufftab24,  6, 4),\n  /* 27 */ new MP3Hufftable(hufftab24,  7, 4),\n  /* 28 */ new MP3Hufftable(hufftab24,  8, 4),\n  /* 29 */ new MP3Hufftable(hufftab24,  9, 4),\n  /* 30 */ new MP3Hufftable(hufftab24, 11, 4),\n  /* 31 */ new MP3Hufftable(hufftab24, 13, 4)\n];\n",
32    "var AV = (window.AV);\n\nconst ENCODINGS = ['latin1', 'utf16-bom', 'utf16-be', 'utf8'];\n\nvar ID3Stream = AV.Base.extend({\n    constructor: function(header, stream) {\n        this.header = header;\n        this.stream = stream;\n        this.offset = 0;\n    },\n    \n    read: function() {\n        if (!this.data) {\n            this.data = {};\n            \n            // read all frames\n            var frame;\n            while (frame = this.readFrame()) {\n                // if we already have an instance of this key, add it to an array\n                if (frame.key in this.data) {\n                    if (!Array.isArray(this.data[frame.key]))\n                        this.data[frame.key] = [this.data[frame.key]];\n                        \n                    this.data[frame.key].push(frame.value);\n                } else {\n                    this.data[frame.key] = frame.value;\n                }\n            }\n        }\n\n        return this.data;\n    },\n    \n    readFrame: function() {\n        if (this.offset >= this.header.length)\n            return null;\n        \n        // get the header    \n        var header = this.readHeader();\n        var decoder = header.identifier;\n        \n        if (header.identifier.charCodeAt(0) === 0) {\n            this.offset += this.header.length + 1;\n            return null;\n        }\n        \n        // map common frame names to a single type\n        if (!this.frameTypes[decoder]) {\n            for (var key in this.map) {\n                if (this.map[key].indexOf(decoder) !== -1) {\n                    decoder = key;\n                    break;\n                }\n            }\n        }\n\n        if (this.frameTypes[decoder]) {\n            // decode the frame\n            var frame = this.decodeFrame(header, this.frameTypes[decoder]),\n                keys = Object.keys(frame);\n            \n            // if it only returned one key, use that as the value    \n            if (keys.length === 1)\n                frame = frame[keys[0]];\n            \n            var result = {\n                value: frame\n            };\n            \n        } else {\n            // No frame type found, treat it as binary\n            var result = {\n                value: this.stream.readBuffer(Math.min(header.length, this.header.length - this.offset))\n            };\n        }\n\n        result.key = this.names[header.identifier] ? this.names[header.identifier] : header.identifier;\n        \n        // special sauce for cover art, which should just be a buffer\n        if (result.key === 'coverArt')\n            result.value = result.value.data;\n\n        this.offset += 10 + header.length;\n        return result;\n    },\n\n    decodeFrame: function(header, fields) {\n        var stream = this.stream,\n            start = stream.offset;\n            \n        var encoding = 0, ret = {};\n        var len = Object.keys(fields).length, i = 0;\n        \n        for (var key in fields) {\n            var type = fields[key];\n            var rest = header.length - (stream.offset - start);\n            i++;\n            \n            // check for special field names\n            switch (key) {\n                case 'encoding':\n                    encoding = stream.readUInt8();\n                    continue;\n                \n                case 'language':\n                    ret.language = stream.readString(3);\n                    continue;\n            }\n            \n            // check types\n            switch (type) {                    \n                case 'latin1':\n                    ret[key] = stream.readString(i === len ? rest : null, 'latin1');\n                    break;\n                    \n                case 'string':\n                    ret[key] = stream.readString(i === len ? rest : null, ENCODINGS[encoding]);\n                    break;\n                    \n                case 'binary':\n                    ret[key] = stream.readBuffer(rest)\n                    break;\n                    \n                case 'int16':\n                    ret[key] = stream.readInt16();\n                    break;\n                    \n                case 'int8':\n                    ret[key] = stream.readInt8();\n                    break;\n                    \n                case 'int24':\n                    ret[key] = stream.readInt24();\n                    break;\n                    \n                case 'int32':\n                    ret[key] = stream.readInt32();\n                    break;\n                    \n                case 'int32+':\n                    ret[key] = stream.readInt32();\n                    if (rest > 4)\n                        throw new Error('Seriously dude? Stop playing this song and get a life!');\n                        \n                    break;\n                    \n                case 'date':\n                    var val = stream.readString(8);\n                    ret[key] = new Date(val.slice(0, 4), val.slice(4, 6) - 1, val.slice(6, 8));\n                    break;\n                    \n                case 'frame_id':\n                    ret[key] = stream.readString(4);\n                    break;\n                    \n                default:\n                    throw new Error('Unknown key type ' + type);\n            }\n        }\n        \n        // Just in case something went wrong...\n        var rest = header.length - (stream.offset - start);\n        if (rest > 0)\n            stream.advance(rest);\n        \n        return ret;\n    }\n});\n\n// ID3 v2.3 and v2.4 support\nexports.ID3v23Stream = ID3Stream.extend({\n    readHeader: function() {\n        var identifier = this.stream.readString(4);        \n        var length = 0;\n        \n        if (this.header.major === 4) {\n            for (var i = 0; i < 4; i++)\n                length = (length << 7) + (this.stream.readUInt8() & 0x7f);\n        } else {\n            length = this.stream.readUInt32();\n        }\n        \n        return {\n            identifier: identifier,\n            length: length,\n            flags: this.stream.readUInt16()\n        };\n    },\n    \n    map: {\n        text: [\n            // Identification Frames\n            'TIT1', 'TIT2', 'TIT3', 'TALB', 'TOAL', 'TRCK', 'TPOS', 'TSST', 'TSRC',\n\n            // Involved Persons Frames\n            'TPE1', 'TPE2', 'TPE3', 'TPE4', 'TOPE', 'TEXT', 'TOLY', 'TCOM', 'TMCL', 'TIPL', 'TENC',\n\n            // Derived and Subjective Properties Frames\n            'TBPM', 'TLEN', 'TKEY', 'TLAN', 'TCON', 'TFLT', 'TMED', 'TMOO',\n\n            // Rights and Licence Frames\n            'TCOP', 'TPRO', 'TPUB', 'TOWN', 'TRSN', 'TRSO',\n\n            // Other Text Frames\n            'TOFN', 'TDLY', 'TDEN', 'TDOR', 'TDRC', 'TDRL', 'TDTG', 'TSSE', 'TSOA', 'TSOP', 'TSOT',\n            \n            // Deprecated Text Frames\n            'TDAT', 'TIME', 'TORY', 'TRDA', 'TSIZ', 'TYER',\n            \n            // Non-standard iTunes Frames\n            'TCMP', 'TSO2', 'TSOC'\n        ],\n        \n        url: [\n            'WCOM', 'WCOP', 'WOAF', 'WOAR', 'WOAS', 'WORS', 'WPAY', 'WPUB'\n        ]\n    },\n    \n    frameTypes: {        \n        text: {\n            encoding: 1,\n            value: 'string'\n        },\n        \n        url: {\n            value: 'latin1'\n        },\n        \n        TXXX: {\n            encoding: 1,\n            description: 'string',\n            value: 'string'\n        },\n        \n        WXXX: {\n            encoding: 1,\n            description: 'string',\n            value: 'latin1',\n        },\n        \n        USLT: {\n            encoding: 1,\n            language: 1,\n            description: 'string',\n            value: 'string'\n        },\n        \n        COMM: {\n            encoding: 1,\n            language: 1,\n            description: 'string',\n            value: 'string'\n        },\n        \n        APIC: {\n            encoding: 1,\n            mime: 'latin1',\n            type: 'int8',\n            description: 'string',\n            data: 'binary'\n        },\n        \n        UFID: {\n            owner: 'latin1',\n            identifier: 'binary'\n        },\n\n        MCDI: {\n            value: 'binary'\n        },\n        \n        PRIV: {\n            owner: 'latin1',\n            value: 'binary'\n        },\n        \n        GEOB: {\n            encoding: 1,\n            mime: 'latin1',\n            filename: 'string',\n            description: 'string',\n            data: 'binary'\n        },\n        \n        PCNT: {\n            value: 'int32+'\n        },\n        \n        POPM: {\n            email: 'latin1',\n            rating: 'int8',\n            counter: 'int32+'\n        },\n        \n        AENC: {\n            owner: 'latin1',\n            previewStart: 'int16',\n            previewLength: 'int16',\n            encryptionInfo: 'binary'\n        },\n        \n        ETCO: {\n            format: 'int8',\n            data: 'binary'  // TODO\n        },\n        \n        MLLT: {\n            framesBetweenReference: 'int16',\n            bytesBetweenReference: 'int24',\n            millisecondsBetweenReference: 'int24',\n            bitsForBytesDeviation: 'int8',\n            bitsForMillisecondsDev: 'int8',\n            data: 'binary' // TODO\n        },\n        \n        SYTC: {\n            format: 'int8',\n            tempoData: 'binary' // TODO\n        },\n        \n        SYLT: {\n            encoding: 1,\n            language: 1,\n            format: 'int8',\n            contentType: 'int8',\n            description: 'string',\n            data: 'binary' // TODO\n        },\n        \n        RVA2: {\n            identification: 'latin1',\n            data: 'binary' // TODO\n        },\n        \n        EQU2: {\n            interpolationMethod: 'int8',\n            identification: 'latin1',\n            data: 'binary' // TODO\n        },\n        \n        RVRB: {\n            left: 'int16',\n            right: 'int16',\n            bouncesLeft: 'int8',\n            bouncesRight: 'int8',\n            feedbackLL: 'int8',\n            feedbackLR: 'int8',\n            feedbackRR: 'int8',\n            feedbackRL: 'int8',\n            premixLR: 'int8',\n            premixRL: 'int8'\n        },\n        \n        RBUF: {\n            size: 'int24',\n            flag: 'int8',\n            offset: 'int32'\n        },\n        \n        LINK: {\n            identifier: 'frame_id',\n            url: 'latin1',\n            data: 'binary' // TODO stringlist?\n        },\n        \n        POSS: {\n            format: 'int8',\n            position: 'binary' // TODO\n        },\n        \n        USER: {\n            encoding: 1,\n            language: 1,\n            value: 'string'\n        },\n        \n        OWNE: {\n            encoding: 1,\n            price: 'latin1',\n            purchaseDate: 'date',\n            seller: 'string'\n        },\n        \n        COMR: {\n            encoding: 1,\n            price: 'latin1',\n            validUntil: 'date',\n            contactURL: 'latin1',\n            receivedAs: 'int8',\n            seller: 'string',\n            description: 'string',\n            logoMime: 'latin1',\n            logo: 'binary'\n        },\n        \n        ENCR: {\n            owner: 'latin1',\n            methodSymbol: 'int8',\n            data: 'binary'\n        },\n        \n        GRID: {\n            owner: 'latin1',\n            groupSymbol: 'int8',\n            data: 'binary'\n        },\n        \n        SIGN: {\n            groupSymbol: 'int8',\n            signature: 'binary'\n        },\n        \n        SEEK: {\n            value: 'int32'\n        },\n        \n        ASPI: {\n            dataStart: 'int32',\n            dataLength: 'int32',\n            numPoints: 'int16',\n            bitsPerPoint: 'int8',\n            data: 'binary' // TODO\n        },\n        \n        // Deprecated ID3 v2.3 frames\n        IPLS: {\n            encoding: 1,\n            value: 'string' // list?\n        },\n        \n        RVAD: {\n            adjustment: 'int8',\n            bits: 'int8',\n            data: 'binary' // TODO\n        },\n        \n        EQUA: {\n            adjustmentBits: 'int8',\n            data: 'binary' // TODO\n        }\n    },\n    \n    names: {\n        // Identification Frames\n        'TIT1': 'grouping',\n        'TIT2': 'title',\n        'TIT3': 'subtitle',\n        'TALB': 'album',\n        'TOAL': 'originalAlbumTitle',\n        'TRCK': 'trackNumber',\n        'TPOS': 'diskNumber',\n        'TSST': 'setSubtitle',\n        'TSRC': 'ISRC',\n\n        // Involved Persons Frames\n        'TPE1': 'artist',\n        'TPE2': 'albumArtist',\n        'TPE3': 'conductor',\n        'TPE4': 'modifiedBy',\n        'TOPE': 'originalArtist',\n        'TEXT': 'lyricist',\n        'TOLY': 'originalLyricist',\n        'TCOM': 'composer',\n        'TMCL': 'musicianCreditsList',\n        'TIPL': 'involvedPeopleList',\n        'TENC': 'encodedBy',\n\n        // Derived and Subjective Properties Frames\n        'TBPM': 'tempo',\n        'TLEN': 'length',\n        'TKEY': 'initialKey',\n        'TLAN': 'language',\n        'TCON': 'genre',\n        'TFLT': 'fileType',\n        'TMED': 'mediaType',\n        'TMOO': 'mood',\n\n        // Rights and Licence Frames\n        'TCOP': 'copyright',\n        'TPRO': 'producedNotice',\n        'TPUB': 'publisher',\n        'TOWN': 'fileOwner',\n        'TRSN': 'internetRadioStationName',\n        'TRSO': 'internetRadioStationOwner',\n\n        // Other Text Frames\n        'TOFN': 'originalFilename',\n        'TDLY': 'playlistDelay',\n        'TDEN': 'encodingTime',\n        'TDOR': 'originalReleaseTime',\n        'TDRC': 'recordingTime',\n        'TDRL': 'releaseTime',\n        'TDTG': 'taggingTime',\n        'TSSE': 'encodedWith',\n        'TSOA': 'albumSortOrder',\n        'TSOP': 'performerSortOrder',\n        'TSOT': 'titleSortOrder',\n        \n        // User defined text information\n        'TXXX': 'userText',\n        \n        // Unsynchronised lyrics/text transcription\n        'USLT': 'lyrics',\n\n        // Attached Picture Frame\n        'APIC': 'coverArt',\n\n        // Unique Identifier Frame\n        'UFID': 'uniqueIdentifier',\n\n        // Music CD Identifier Frame\n        'MCDI': 'CDIdentifier',\n\n        // Comment Frame\n        'COMM': 'comments',\n        \n        // URL link frames\n        'WCOM': 'commercialInformation',\n        'WCOP': 'copyrightInformation',\n        'WOAF': 'officialAudioFileWebpage',\n        'WOAR': 'officialArtistWebpage',\n        'WOAS': 'officialAudioSourceWebpage',\n        'WORS': 'officialInternetRadioStationHomepage',\n        'WPAY': 'payment',\n        'WPUB': 'officialPublisherWebpage',\n\n        // User Defined URL Link Frame\n        'WXXX': 'url',\n\n        'PRIV': 'private',\n        'GEOB': 'generalEncapsulatedObject',\n        'PCNT': 'playCount',\n        'POPM': 'rating',\n        'AENC': 'audioEncryption',\n        'ETCO': 'eventTimingCodes',\n        'MLLT': 'MPEGLocationLookupTable',\n        'SYTC': 'synchronisedTempoCodes',\n        'SYLT': 'synchronisedLyrics',\n        'RVA2': 'volumeAdjustment',\n        'EQU2': 'equalization',\n        'RVRB': 'reverb',\n        'RBUF': 'recommendedBufferSize',\n        'LINK': 'link',\n        'POSS': 'positionSynchronisation',\n        'USER': 'termsOfUse',\n        'OWNE': 'ownership',\n        'COMR': 'commercial',\n        'ENCR': 'encryption',\n        'GRID': 'groupIdentifier',\n        'SIGN': 'signature',\n        'SEEK': 'seek',\n        'ASPI': 'audioSeekPointIndex',\n\n        // Deprecated ID3 v2.3 frames\n        'TDAT': 'date',\n        'TIME': 'time',\n        'TORY': 'originalReleaseYear',\n        'TRDA': 'recordingDates',\n        'TSIZ': 'size',\n        'TYER': 'year',\n        'IPLS': 'involvedPeopleList',\n        'RVAD': 'volumeAdjustment',\n        'EQUA': 'equalization',\n        \n        // Non-standard iTunes frames\n        'TCMP': 'compilation',\n        'TSO2': 'albumArtistSortOrder',\n        'TSOC': 'composerSortOrder'\n    }\n});\n\n// ID3 v2.2 support\nexports.ID3v22Stream = exports.ID3v23Stream.extend({    \n    readHeader: function() {\n        var id = this.stream.readString(3);\n        \n        if (this.frameReplacements[id] && !this.frameTypes[id])\n            this.frameTypes[id] = this.frameReplacements[id];\n        \n        return {\n            identifier: this.replacements[id] || id,\n            length: this.stream.readUInt24()\n        };\n    },\n    \n    // map 3 char ID3 v2.2 names to 4 char ID3 v2.3/4 names\n    replacements: {\n        'UFI': 'UFID',\n        'TT1': 'TIT1',\n        'TT2': 'TIT2',\n        'TT3': 'TIT3',\n        'TP1': 'TPE1',\n        'TP2': 'TPE2',\n        'TP3': 'TPE3',\n        'TP4': 'TPE4',\n        'TCM': 'TCOM',\n        'TXT': 'TEXT',\n        'TLA': 'TLAN',\n        'TCO': 'TCON',\n        'TAL': 'TALB',\n        'TPA': 'TPOS',\n        'TRK': 'TRCK',\n        'TRC': 'TSRC',\n        'TYE': 'TYER',\n        'TDA': 'TDAT',\n        'TIM': 'TIME',\n        'TRD': 'TRDA',\n        'TMT': 'TMED',\n        'TFT': 'TFLT',\n        'TBP': 'TBPM',\n        'TCR': 'TCOP',\n        'TPB': 'TPUB',\n        'TEN': 'TENC',\n        'TSS': 'TSSE',\n        'TOF': 'TOFN',\n        'TLE': 'TLEN',\n        'TSI': 'TSIZ',\n        'TDY': 'TDLY',\n        'TKE': 'TKEY',\n        'TOT': 'TOAL',\n        'TOA': 'TOPE',\n        'TOL': 'TOLY',\n        'TOR': 'TORY',\n        'TXX': 'TXXX',\n        \n        'WAF': 'WOAF',\n        'WAR': 'WOAR',\n        'WAS': 'WOAS',\n        'WCM': 'WCOM',\n        'WCP': 'WCOP',\n        'WPB': 'WPUB',\n        'WXX': 'WXXX',\n        \n        'IPL': 'IPLS',\n        'MCI': 'MCDI',\n        'ETC': 'ETCO',\n        'MLL': 'MLLT',\n        'STC': 'SYTC',\n        'ULT': 'USLT',\n        'SLT': 'SYLT',\n        'COM': 'COMM',\n        'RVA': 'RVAD',\n        'EQU': 'EQUA',\n        'REV': 'RVRB',\n        \n        'GEO': 'GEOB',\n        'CNT': 'PCNT',\n        'POP': 'POPM',\n        'BUF': 'RBUF',\n        'CRA': 'AENC',\n        'LNK': 'LINK',\n        \n        // iTunes stuff\n        'TST': 'TSOT',\n        'TSP': 'TSOP',\n        'TSA': 'TSOA',\n        'TCP': 'TCMP',\n        'TS2': 'TSO2',\n        'TSC': 'TSOC'\n    },\n    \n    // replacements for ID3 v2.3/4 frames\n    frameReplacements: {\n        PIC: {\n            encoding: 1,\n            format: 'int24',\n            type: 'int8',\n            description: 'string',\n            data: 'binary'\n        },\n        \n        CRM: {\n            owner: 'latin1',\n            description: 'latin1',\n            data: 'binary'\n        }\n    }\n});",
33    "function IMDCT() {\n    this.tmp_imdct36 = new Float64Array(18);\n    this.tmp_dctIV = new Float64Array(18);\n    this.tmp_sdctII = new Float64Array(9);\n}\n\n// perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm\nIMDCT.prototype.imdct36 = function(x, y) {\n    var tmp = this.tmp_imdct36;\n\n    /* DCT-IV */\n    this.dctIV(x, tmp);\n\n    // convert 18-point DCT-IV to 36-point IMDCT\n    for (var i =  0; i <  9; ++i) {\n        y[i] =  tmp[9 + i];\n    }\n    for (var i =  9; i < 27; ++i) {\n        y[i] = -tmp[36 - (9 + i) - 1];\n    }\n    for (var i = 27; i < 36; ++i) {\n        y[i] = -tmp[i - 27];\n    }\n};\n\nvar dctIV_scale = [];\nfor(i = 0; i < 18; i++) {\n    dctIV_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (4 * 18));\n}\n\nIMDCT.prototype.dctIV = function(y, X) {\n    var tmp = this.tmp_dctIV;\n\n    // scaling\n    for (var i = 0; i < 18; ++i) {\n        tmp[i] = y[i] * dctIV_scale[i];\n    }\n\n    // SDCT-II\n    this.sdctII(tmp, X);\n\n    // scale reduction and output accumulation\n    X[0] /= 2;\n    for (var i = 1; i < 18; ++i) {\n        X[i] = X[i] / 2 - X[i - 1];\n    }\n};\n\nvar sdctII_scale = [];\nfor (var i = 0; i < 9; ++i) {\n    sdctII_scale[i] = 2 * Math.cos(Math.PI * (2 * i + 1) / (2 * 18));\n}\n\nIMDCT.prototype.sdctII = function(x, X) {\n    // divide the 18-point SDCT-II into two 9-point SDCT-IIs\n    var tmp = this.tmp_sdctII;\n\n    // even input butterfly\n    for (var i = 0; i < 9; ++i) {\n        tmp[i] = x[i] + x[18 - i - 1];\n    }\n\n    fastsdct(tmp, X, 0);\n\n    // odd input butterfly and scaling\n    for (var i = 0; i < 9; ++i) {\n        tmp[i] = (x[i] - x[18 - i - 1]) * sdctII_scale[i];\n    }\n\n    fastsdct(tmp, X, 1);\n\n    // output accumulation\n    for (var i = 3; i < 18; i += 2) {\n        X[i] -= X[i - 2];\n    }\n};\n\nvar c0 = 2 * Math.cos( 1 * Math.PI / 18);\nvar c1 = 2 * Math.cos( 3 * Math.PI / 18);\nvar c2 = 2 * Math.cos( 4 * Math.PI / 18);\nvar c3 = 2 * Math.cos( 5 * Math.PI / 18);\nvar c4 = 2 * Math.cos( 7 * Math.PI / 18);\nvar c5 = 2 * Math.cos( 8 * Math.PI / 18);\nvar c6 = 2 * Math.cos(16 * Math.PI / 18);\n\nfunction fastsdct(x, y, offset) {\n    var a0,  a1,  a2,  a3,  a4,  a5,  a6,  a7,  a8,  a9,  a10, a11, a12;\n    var a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;\n    var m0,  m1,  m2,  m3,  m4,  m5,  m6,  m7;\n\n    a0 = x[3] + x[5];\n    a1 = x[3] - x[5];\n    a2 = x[6] + x[2];\n    a3 = x[6] - x[2];\n    a4 = x[1] + x[7];\n    a5 = x[1] - x[7];\n    a6 = x[8] + x[0];\n    a7 = x[8] - x[0];\n\n    a8  = a0  + a2;\n    a9  = a0  - a2;\n    a10 = a0  - a6;\n    a11 = a2  - a6;\n    a12 = a8  + a6;\n    a13 = a1  - a3;\n    a14 = a13 + a7;\n    a15 = a3  + a7;\n    a16 = a1  - a7;\n    a17 = a1  + a3;\n\n    m0 = a17 * -c3;\n    m1 = a16 * -c0;\n    m2 = a15 * -c4;\n    m3 = a14 * -c1;\n    m4 = a5  * -c1;\n    m5 = a11 * -c6;\n    m6 = a10 * -c5;\n    m7 = a9  * -c2;\n\n    a18 =     x[4] + a4;\n    a19 = 2 * x[4] - a4;\n    a20 = a19 + m5;\n    a21 = a19 - m5;\n    a22 = a19 + m6;\n    a23 = m4  + m2;\n    a24 = m4  - m2;\n    a25 = m4  + m1;\n\n    // output to every other slot for convenience\n    y[offset +  0] = a18 + a12;\n    y[offset +  2] = m0  - a25;\n    y[offset +  4] = m7  - a20;\n    y[offset +  6] = m3;\n    y[offset +  8] = a21 - m6;\n    y[offset + 10] = a24 - m1;\n    y[offset + 12] = a12 - 2 * a18;\n    y[offset + 14] = a23 + m0;\n    y[offset + 16] = a22 + m7;\n}\n\nIMDCT.S = [\n  /*  0 */  [ 0.608761429,\n              -0.923879533,\n              -0.130526192,\n               0.991444861,\n              -0.382683432,\n              -0.793353340 ],\n\n  /*  6 */  [ -0.793353340,\n               0.382683432,\n               0.991444861,\n               0.130526192,\n              -0.923879533,\n              -0.608761429 ],\n\n  /*  1 */  [  0.382683432,\n              -0.923879533,\n               0.923879533,\n              -0.382683432,\n              -0.382683432,\n               0.923879533 ],\n\n  /*  7 */  [ -0.923879533,\n              -0.382683432,\n               0.382683432,\n               0.923879533,\n               0.923879533,\n               0.382683432 ],\n\n  /*  2 */  [  0.130526192,\n              -0.382683432,\n               0.608761429,\n              -0.793353340,\n               0.923879533,\n              -0.991444861 ],\n\n  /*  8 */  [ -0.991444861,\n              -0.923879533,\n              -0.793353340,\n              -0.608761429,\n              -0.382683432,\n              -0.130526192 ]\n];\n\nmodule.exports = IMDCT;\n",
34    "var tables = require('./tables');\nvar MP3FrameHeader = require('./header');\nvar MP3Frame = require('./frame');\nvar utils = require('./utils');\n\nfunction Layer1() {    \n    this.allocation = utils.makeArray([2, 32], Uint8Array);\n    this.scalefactor = utils.makeArray([2, 32], Uint8Array);\n}\n\nMP3Frame.layers[1] = Layer1;\n\n// linear scaling table\nconst LINEAR_TABLE = new Float32Array([\n    1.33333333333333, 1.14285714285714, 1.06666666666667,\n    1.03225806451613, 1.01587301587302, 1.00787401574803,\n    1.00392156862745, 1.00195694716243, 1.00097751710655,\n    1.00048851978505, 1.00024420024420, 1.00012208521548,\n    1.00006103888177, 1.00003051850948\n]);\n\nLayer1.prototype.decode = function(stream, frame) {\n    var header = frame.header;\n    var nch = header.nchannels();\n    \n    var bound = 32;\n    if (header.mode === MP3FrameHeader.MODE.JOINT_STEREO) {\n        header.flags |= MP3FrameHeader.FLAGS.I_STEREO;\n        bound = 4 + header.mode_extension * 4;\n    }\n    \n    if (header.flags & MP3FrameHeader.FLAGS.PROTECTION) {\n        // TODO: crc check\n    }\n    \n    // decode bit allocations\n    var allocation = this.allocation;\n    for (var sb = 0; sb < bound; sb++) {\n        for (var ch = 0; ch < nch; ch++) {\n            var nb = stream.read(4);\n            if (nb === 15)\n                throw new Error(\"forbidden bit allocation value\");\n                \n            allocation[ch][sb] = nb ? nb + 1 : 0;\n        }\n    }\n    \n    for (var sb = bound; sb < 32; sb++) {\n        var nb = stream.read(4);\n        if (nb === 15)\n            throw new Error(\"forbidden bit allocation value\");\n            \n        allocation[0][sb] =\n        allocation[1][sb] = nb ? nb + 1 : 0;\n    }\n    \n    // decode scalefactors\n    var scalefactor = this.scalefactor;\n    for (var sb = 0; sb < 32; sb++) {\n        for (var ch = 0; ch < nch; ch++) {\n            if (allocation[ch][sb]) {\n                scalefactor[ch][sb] = stream.read(6);\n                \n            \t/*\n            \t * Scalefactor index 63 does not appear in Table B.1 of\n            \t * ISO/IEC 11172-3. Nonetheless, other implementations accept it,\n                 * so we do as well \n                 */\n            }\n        }\n    }\n    \n    // decode samples\n    for (var s = 0; s < 12; s++) {\n        for (var sb = 0; sb < bound; sb++) {\n            for (var ch = 0; ch < nch; ch++) {\n                var nb = allocation[ch][sb];\n                frame.sbsample[ch][s][sb] = nb ? this.sample(stream, nb) * tables.SF_TABLE[scalefactor[ch][sb]] : 0;\n            }\n        }\n        \n        for (var sb = bound; sb < 32; sb++) {\n            var nb = allocation[0][sb];\n            if (nb) {\n                var sample = this.sample(stream, nb);\n                \n                for (var ch = 0; ch < nch; ch++) {\n                    frame.sbsample[ch][s][sb] = sample * tables.SF_TABLE[scalefactor[ch][sb]];\n                }\n            } else {\n                for (var ch = 0; ch < nch; ch++) {\n                    frame.sbsample[ch][s][sb] = 0;\n                }\n            }\n        }\n    }\n};\n\nLayer1.prototype.sample = function(stream, nb) {\n    var sample = stream.read(nb);\n    \n    // invert most significant bit, and form a 2's complement sample\n    sample ^= 1 << (nb - 1);\n    sample |= -(sample & (1 << (nb - 1)));\n    sample /= (1 << (nb - 1));\n        \n    // requantize the sample\n    // s'' = (2^nb / (2^nb - 1)) * (s''' + 2^(-nb + 1))\n    sample += 1 >> (nb - 1);\n    return sample * LINEAR_TABLE[nb - 2];\n};\n\nmodule.exports = Layer1;\n",
35    "var tables = require('./tables');\nvar MP3FrameHeader = require('./header');\nvar MP3Frame = require('./frame');\nvar utils = require('./utils');\n\nfunction Layer2() {    \n    this.samples = new Float64Array(3);\n    this.allocation = utils.makeArray([2, 32], Uint8Array);\n    this.scfsi = utils.makeArray([2, 32], Uint8Array);\n    this.scalefactor = utils.makeArray([2, 32, 3], Uint8Array);\n}\n\nMP3Frame.layers[2] = Layer2;\n\n// possible quantization per subband table\nconst SBQUANT = [\n  // ISO/IEC 11172-3 Table B.2a\n  { sblimit: 27, offsets:\n      [ 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0 ] },\n      \n  // ISO/IEC 11172-3 Table B.2b\n  { sblimit: 30, offsets:\n      [ 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0 ] },\n      \n  // ISO/IEC 11172-3 Table B.2c\n  {  sblimit: 8, offsets:\n      [ 5, 5, 2, 2, 2, 2, 2, 2 ] },\n      \n  // ISO/IEC 11172-3 Table B.2d\n  { sblimit: 12, offsets:\n      [ 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ] },\n      \n  // ISO/IEC 13818-3 Table B.1\n  { sblimit: 30, offsets:\n      [ 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] }\n];\n\n// bit allocation table\nconst BITALLOC = [\n    { nbal: 2, offset: 0 },  // 0\n    { nbal: 2, offset: 3 },  // 1\n    { nbal: 3, offset: 3 },  // 2\n    { nbal: 3, offset: 1 },  // 3\n    { nbal: 4, offset: 2 },  // 4\n    { nbal: 4, offset: 3 },  // 5\n    { nbal: 4, offset: 4 },  // 6\n    { nbal: 4, offset: 5 }   // 7\n];\n\n// offsets into quantization class table\nconst OFFSETS = [\n    [ 0, 1, 16                                             ],  // 0\n    [ 0, 1,  2, 3, 4, 5, 16                                ],  // 1\n    [ 0, 1,  2, 3, 4, 5,  6, 7,  8,  9, 10, 11, 12, 13, 14 ],  // 2\n    [ 0, 1,  3, 4, 5, 6,  7, 8,  9, 10, 11, 12, 13, 14, 15 ],  // 3\n    [ 0, 1,  2, 3, 4, 5,  6, 7,  8,  9, 10, 11, 12, 13, 16 ],  // 4\n    [ 0, 2,  4, 5, 6, 7,  8, 9, 10, 11, 12, 13, 14, 15, 16 ]   // 5\n];\n\n\n\n/*\n * These are the Layer II classes of quantization.\n * The table is derived from Table B.4 of ISO/IEC 11172-3.\n */\nconst QC_TABLE = [\n    { nlevels:     3, group: 2, bits:  5, C: 1.33333333333, D: 0.50000000000 },\n    { nlevels:     5, group: 3, bits:  7, C: 1.60000000000, D: 0.50000000000 },\n    { nlevels:     7, group: 0, bits:  3, C: 1.14285714286, D: 0.25000000000 },\n    { nlevels:     9, group: 4, bits: 10, C: 1.77777777777, D: 0.50000000000 },\n    { nlevels:    15, group: 0, bits:  4, C: 1.06666666666, D: 0.12500000000 },\n    { nlevels:    31, group: 0, bits:  5, C: 1.03225806452, D: 0.06250000000 },\n    { nlevels:    63, group: 0, bits:  6, C: 1.01587301587, D: 0.03125000000 },\n    { nlevels:   127, group: 0, bits:  7, C: 1.00787401575, D: 0.01562500000 },\n    { nlevels:   255, group: 0, bits:  8, C: 1.00392156863, D: 0.00781250000 },\n    { nlevels:   511, group: 0, bits:  9, C: 1.00195694716, D: 0.00390625000 },\n    { nlevels:  1023, group: 0, bits: 10, C: 1.00097751711, D: 0.00195312500 },\n    { nlevels:  2047, group: 0, bits: 11, C: 1.00048851979, D: 0.00097656250 },\n    { nlevels:  4095, group: 0, bits: 12, C: 1.00024420024, D: 0.00048828125 },\n    { nlevels:  8191, group: 0, bits: 13, C: 1.00012208522, D: 0.00024414063 },\n    { nlevels: 16383, group: 0, bits: 14, C: 1.00006103888, D: 0.00012207031 },\n    { nlevels: 32767, group: 0, bits: 15, C: 1.00003051851, D: 0.00006103516 },\n    { nlevels: 65535, group: 0, bits: 16, C: 1.00001525902, D: 0.00003051758 }\n];\n\nLayer2.prototype.decode = function(stream, frame) {\n    var header = frame.header;\n    var nch = header.nchannels();\n    var index;\n    \n    if (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) {\n        index = 4;\n    } else if (header.flags & MP3FrameHeader.FLAGS.FREEFORMAT) {\n        index = header.samplerate === 48000 ? 0 : 1;\n    } else {\n        var bitrate_per_channel = header.bitrate;\n        \n        if (nch === 2) {\n            bitrate_per_channel /= 2;\n            \n            /*\n             * ISO/IEC 11172-3 allows only single channel mode for 32, 48, 56, and\n             * 80 kbps bitrates in Layer II, but some encoders ignore this\n             * restriction, so we ignore it as well.\n             */\n        } else {\n            /*\n        \t * ISO/IEC 11172-3 does not allow single channel mode for 224, 256,\n        \t * 320, or 384 kbps bitrates in Layer II.\n        \t */\n            if (bitrate_per_channel > 192000)\n                throw new Error('bad bitrate/mode combination');\n        }\n        \n        if (bitrate_per_channel <= 48000)\n            index = header.samplerate === 32000 ? 3 : 2;\n        else if (bitrate_per_channel <= 80000)\n            index = 0;\n        else\n            index = header.samplerate === 48000 ? 0 : 1;\n    }\n    \n    var sblimit = SBQUANT[index].sblimit;\n    var offsets = SBQUANT[index].offsets;\n    \n    var bound = 32;\n    if (header.mode === MP3FrameHeader.MODE.JOINT_STEREO) {\n        header.flags |= MP3FrameHeader.FLAGS.I_STEREO;\n        bound = 4 + header.mode_extension * 4;\n    }\n    \n    if (bound > sblimit)\n        bound = sblimit;\n    \n    // decode bit allocations\n    var allocation = this.allocation;\n    for (var sb = 0; sb < bound; sb++) {\n        var nbal = BITALLOC[offsets[sb]].nbal;\n        \n        for (var ch = 0; ch < nch; ch++)\n            allocation[ch][sb] = stream.read(nbal);\n    }\n    \n    for (var sb = bound; sb < sblimit; sb++) {\n        var nbal = BITALLOC[offsets[sb]].nbal;\n        \n        allocation[0][sb] =\n        allocation[1][sb] = stream.read(nbal);\n    }\n    \n    // decode scalefactor selection info\n    var scfsi = this.scfsi;\n    for (var sb = 0; sb < sblimit; sb++) {\n        for (var ch = 0; ch < nch; ch++) {\n            if (allocation[ch][sb])\n                scfsi[ch][sb] = stream.read(2);\n        }\n    }\n    \n    if (header.flags & MP3FrameHeader.FLAGS.PROTECTION) {\n        // TODO: crc check\n    }\n    \n    // decode scalefactors\n    var scalefactor = this.scalefactor;\n    for (var sb = 0; sb < sblimit; sb++) {\n        for (var ch = 0; ch < nch; ch++) {\n            if (allocation[ch][sb]) {\n                scalefactor[ch][sb][0] = stream.read(6);\n                \n                switch (scfsi[ch][sb]) {\n            \t    case 2:\n            \t        scalefactor[ch][sb][2] =\n                        scalefactor[ch][sb][1] = scalefactor[ch][sb][0];\n                        break;\n                        \n                    case 0:\n                        scalefactor[ch][sb][1] = stream.read(6);\n                    \t// fall through\n                    \t\n                    case 1:\n                    case 3:\n                        scalefactor[ch][sb][2] = stream.read(6);\n                }\n                \n                if (scfsi[ch][sb] & 1)\n                    scalefactor[ch][sb][1] = scalefactor[ch][sb][scfsi[ch][sb] - 1];\n                    \n                /*\n            \t * Scalefactor index 63 does not appear in Table B.1 of\n            \t * ISO/IEC 11172-3. Nonetheless, other implementations accept it,\n            \t * so we do as well.\n            \t */\n            }\n        }\n    }\n    \n    // decode samples\n    for (var gr = 0; gr < 12; gr++) {\n        // normal\n        for (var sb = 0; sb < bound; sb++) {\n            for (var ch = 0; ch < nch; ch++) {                \n                if (index = allocation[ch][sb]) {\n                    index = OFFSETS[BITALLOC[offsets[sb]].offset][index - 1];\n                    this.decodeSamples(stream, QC_TABLE[index]);\n                    \n                    var scale = tables.SF_TABLE[scalefactor[ch][sb][gr >> 2]];\n                    for (var s = 0; s < 3; s++) {\n                        frame.sbsample[ch][3 * gr + s][sb] = this.samples[s] * scale;\n                    }\n                } else {\n                    for (var s = 0; s < 3; s++) {\n                        frame.sbsample[ch][3 * gr + s][sb] = 0;\n                    }\n                }\n            }\n        }\n        \n        // joint stereo\n        for (var sb = bound; sb < sblimit; sb++) {\n            if (index = allocation[0][sb]) {\n                index = OFFSETS[BITALLOC[offsets[sb]].offset][index - 1];\n                this.decodeSamples(stream, QC_TABLE[index]);\n                \n                for (var ch = 0; ch < nch; ch++) {\n                    var scale = tables.SF_TABLE[scalefactor[ch][sb][gr >> 2]];\n                    for (var s = 0; s < 3; s++) {\n                        frame.sbsample[ch][3 * gr + s][sb] = this.samples[s] * scale;\n                    }\n                }\n            } else {\n                for (var ch = 0; ch < nch; ch++) {\n                    for (var s = 0; s < 3; s++) {\n                        frame.sbsample[ch][3 * gr + s][sb] = 0;\n                    }\n                }\n            }\n        }\n        \n        // the rest\n        for (var ch = 0; ch < nch; ch++) {\n            for (var s = 0; s < 3; s++) {\n                for (var sb = sblimit; sb < 32; sb++) {\n                    frame.sbsample[ch][3 * gr + s][sb] = 0;\n                }\n            }\n        }\n    }\n};\n\nLayer2.prototype.decodeSamples = function(stream, quantclass) {\n    var sample = this.samples;\n    var nb = quantclass.group;\n    \n    if (nb) {\n        // degrouping\n        var c = stream.read(quantclass.bits);\n        var nlevels = quantclass.nlevels;\n        \n        for (var s = 0; s < 3; s++) {\n            sample[s] = c % nlevels;\n            c = c / nlevels | 0;\n        }\n    } else {\n        nb = quantclass.bits;\n        for (var s = 0; s < 3; s++) {\n            sample[s] = stream.read(nb);\n        }\n    }\n    \n    for (var s = 0; s < 3; s++) {\n        // invert most significant bit, and form a 2's complement sample\n        var requantized = sample[s] ^ (1 << (nb - 1));\n        requantized |= -(requantized & (1 << (nb - 1)));\n        requantized /= (1 << (nb - 1));\n        \n        // requantize the sample\n        sample[s] = (requantized + quantclass.D) * quantclass.C;\n    }\n};\n\nmodule.exports = Layer2;\n",
36    "var AV = (window.AV);\nvar tables = require('./tables');\nvar MP3FrameHeader = require('./header');\nvar MP3Frame = require('./frame');\nvar huffman = require('./huffman');\nvar IMDCT = require('./imdct');\nvar utils = require('./utils');\n\nfunction MP3SideInfo() {\n    this.main_data_begin = null;\n    this.private_bits = null;\n    this.gr = [new MP3Granule(), new MP3Granule()];\n    this.scfsi = new Uint8Array(2);\n}\n\nfunction MP3Granule() {\n    this.ch = [new MP3Channel(), new MP3Channel()];\n}\n\nfunction MP3Channel() {\n    // from side info\n    this.part2_3_length    = null;\n    this.big_values        = null;\n    this.global_gain       = null;\n    this.scalefac_compress = null;\n    \n    this.flags         = null;\n    this.block_type    = null;\n    this.table_select  = new Uint8Array(3);\n    this.subblock_gain = new Uint8Array(3);\n    this.region0_count = null;\n    this.region1_count = null;\n    \n    // from main_data\n    this.scalefac = new Uint8Array(39);\n}\n\nfunction Layer3() {\n    this.imdct = new IMDCT();\n    this.si = new MP3SideInfo();\n    \n    // preallocate reusable typed arrays for performance\n    this.xr = [new Float64Array(576), new Float64Array(576)];\n    this._exponents = new Int32Array(39);\n    this.reqcache = new Float64Array(16);\n    this.modes = new Int16Array(39);\n    this.output = new Float64Array(36);\n    \n    this.tmp = utils.makeArray([32, 3, 6]);\n    this.tmp2 = new Float64Array(32 * 3 * 6);\n}\n\nMP3Frame.layers[3] = Layer3;\n\nLayer3.prototype.decode = function(stream, frame) {\n    var header = frame.header;\n    var next_md_begin = 0;\n    var md_len = 0;\n    \n    var nch = header.nchannels();\n    var si_len = (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) ? (nch === 1 ? 9 : 17) : (nch === 1 ? 17 : 32);\n        \n    // check frame sanity\n    if (stream.next_frame - stream.nextByte() < si_len) {\n        stream.md_len = 0;\n        throw new Error('Bad frame length');\n    }\n    \n    // check CRC word\n    if (header.flags & MP3FrameHeader.FLAGS.PROTECTION) {\n        // TODO: crc check\n    }\n    \n    // decode frame side information\n    var sideInfo = this.sideInfo(stream, nch, header.flags & MP3FrameHeader.FLAGS.LSF_EXT);        \n    var si = sideInfo.si;\n    var data_bitlen = sideInfo.data_bitlen;\n    var priv_bitlen = sideInfo.priv_bitlen;\n    \n    header.flags        |= priv_bitlen;\n    header.private_bits |= si.private_bits;\n    \n    // find main_data of next frame\n    var peek = stream.copy();\n    peek.seek(stream.next_frame * 8);\n    \n    var nextHeader = peek.read(16);    \n    if ((nextHeader & 0xffe6) === 0xffe2) { // syncword | layer\n        if ((nextHeader & 1) === 0) // protection bit\n            peek.advance(16); // crc check\n            \n        peek.advance(16); // skip the rest of the header\n        next_md_begin = peek.read((nextHeader & 8) ? 9 : 8);\n    }\n    \n    // find main_data of this frame\n    var frame_space = stream.next_frame - stream.nextByte();\n    \n    if (next_md_begin > si.main_data_begin + frame_space)\n        next_md_begin = 0;\n        \n    var md_len = si.main_data_begin + frame_space - next_md_begin;\n    var frame_used = 0;\n    var ptr;\n    \n    if (si.main_data_begin === 0) {\n        ptr = stream.stream;\n        stream.md_len = 0;\n        frame_used = md_len;\n    } else {\n        if (si.main_data_begin > stream.md_len) {\n            throw new Error('bad main_data_begin pointer');\n        } else {\n            var old_md_len = stream.md_len;\n            \n            if (md_len > si.main_data_begin) {\n                if (stream.md_len + md_len - si.main_data_begin > MP3FrameHeader.BUFFER_MDLEN) {\n                    throw new Error(\"Assertion failed: (stream.md_len + md_len - si.main_data_begin <= MAD_MP3FrameHeader.BUFFER_MDLEN)\");\n                }\n                \n                frame_used = md_len - si.main_data_begin;\n                this.memcpy(stream.main_data, stream.md_len, stream.stream.stream, stream.nextByte(), frame_used);\n                stream.md_len += frame_used;\n            }\n            \n            ptr = new AV.Bitstream(AV.Stream.fromBuffer(new AV.Buffer(stream.main_data)));\n            ptr.advance((old_md_len - si.main_data_begin) * 8);\n        }\n    }\n    \n    var frame_free = frame_space - frame_used;\n    \n    // decode main_data\n    this.decodeMainData(ptr, frame, si, nch);\n    \n    // preload main_data buffer with up to 511 bytes for next frame(s)\n    if (frame_free >= next_md_begin) {\n        this.memcpy(stream.main_data, 0, stream.stream.stream, stream.next_frame - next_md_begin, next_md_begin);\n        stream.md_len = next_md_begin;\n    } else {\n        if (md_len < si.main_data_begin) {\n            var extra = si.main_data_begin - md_len;\n            if (extra + frame_free > next_md_begin)\n                extra = next_md_begin - frame_free;\n\n            if (extra < stream.md_len) {\n                this.memcpy(stream.main_data, 0, stream.main_data, stream.md_len - extra, extra);\n                stream.md_len = extra;\n            }\n        } else {\n            stream.md_len = 0;\n        }\n        \n        this.memcpy(stream.main_data, stream.md_len, stream.stream.stream, stream.next_frame - frame_free, frame_free);\n        stream.md_len += frame_free;\n    }\n};\n\nLayer3.prototype.memcpy = function(dst, dstOffset, pSrc, srcOffset, length) {\n    var subarr;\n    if (pSrc.subarray)\n        subarr = pSrc.subarray(srcOffset, srcOffset + length);\n    else\n        subarr = pSrc.peekBuffer(srcOffset - pSrc.offset, length).data;\n\n    // oh my, memcpy actually exists in JavaScript?\n    dst.set(subarr, dstOffset);\n    return dst;\n};\n\nLayer3.prototype.sideInfo = function(stream, nch, lsf) {\n    var si = this.si;\n    var data_bitlen = 0;\n    var priv_bitlen = lsf ? ((nch === 1) ? 1 : 2) : ((nch === 1) ? 5 : 3);\n    \n    si.main_data_begin = stream.read(lsf ? 8 : 9);\n    si.private_bits    = stream.read(priv_bitlen);\n\n    var ngr = 1;\n    if (!lsf) {\n        ngr = 2;\n        for (var ch = 0; ch < nch; ++ch)\n            si.scfsi[ch] = stream.read(4);\n    }\n    \n    for (var gr = 0; gr < ngr; gr++) {\n        var granule = si.gr[gr];\n        \n        for (var ch = 0; ch < nch; ch++) {\n            var channel = granule.ch[ch];\n            \n            channel.part2_3_length    = stream.read(12);\n            channel.big_values        = stream.read(9);\n            channel.global_gain       = stream.read(8);\n            channel.scalefac_compress = stream.read(lsf ? 9 : 4);\n\n            data_bitlen += channel.part2_3_length;\n\n            if (channel.big_values > 288)\n                throw new Error('bad big_values count');\n\n            channel.flags = 0;\n\n            // window_switching_flag\n            if (stream.read(1)) {\n                channel.block_type = stream.read(2);\n\n                if (channel.block_type === 0)\n                    throw new Error('reserved block_type');\n\n                if (!lsf && channel.block_type === 2 && si.scfsi[ch])\n                    throw new Error('bad scalefactor selection info');\n\n                channel.region0_count = 7;\n                channel.region1_count = 36;\n\n                if (stream.read(1))\n                    channel.flags |= tables.MIXED_BLOCK_FLAG;\n                else if (channel.block_type === 2)\n                    channel.region0_count = 8;\n\n                for (var i = 0; i < 2; i++)\n                    channel.table_select[i] = stream.read(5);\n\n                for (var i = 0; i < 3; i++)\n                    channel.subblock_gain[i] = stream.read(3);\n            } else {\n                channel.block_type = 0;\n\n                for (var i = 0; i < 3; i++)\n                    channel.table_select[i] = stream.read(5);\n\n                channel.region0_count = stream.read(4);\n                channel.region1_count = stream.read(3);\n            }\n\n            // [preflag,] scalefac_scale, count1table_select\n            channel.flags |= stream.read(lsf ? 2 : 3);\n        }\n    }\n    \n    return {\n        si: si,\n        data_bitlen: data_bitlen,\n        priv_bitlen: priv_bitlen\n    };\n};\n\nLayer3.prototype.decodeMainData = function(stream, frame, si, nch) {\n    var header = frame.header;\n    var sfreq = header.samplerate;\n\n    if (header.flags & MP3FrameHeader.FLAGS.MPEG_2_5_EXT)\n        sfreq *= 2;\n\n    // 48000 => 0, 44100 => 1, 32000 => 2,\n    // 24000 => 3, 22050 => 4, 16000 => 5\n    var sfreqi = ((sfreq >>  7) & 0x000f) + ((sfreq >> 15) & 0x0001) - 8;\n\n    if (header.flags & MP3FrameHeader.FLAGS.MPEG_2_5_EXT)\n        sfreqi += 3;\n        \n    // scalefactors, Huffman decoding, requantization\n    var ngr = (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) ? 1 : 2;\n    var xr = this.xr;\n    \n    for (var gr = 0; gr < ngr; ++gr) {\n        var granule = si.gr[gr];\n        var sfbwidth = [];\n        var l = 0;\n        \n        for (var ch = 0; ch < nch; ++ch) {\n            var channel = granule.ch[ch];\n            var part2_length;\n            \n            sfbwidth[ch] = tables.SFBWIDTH_TABLE[sfreqi].l;\n            if (channel.block_type === 2) {\n                sfbwidth[ch] = (channel.flags & tables.MIXED_BLOCK_FLAG) ? tables.SFBWIDTH_TABLE[sfreqi].m : tables.SFBWIDTH_TABLE[sfreqi].s;\n            }\n\n            if (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) {\n                part2_length = this.scalefactors_lsf(stream, channel, ch === 0 ? 0 : si.gr[1].ch[1], header.mode_extension);\n            } else {\n                part2_length = this.scalefactors(stream, channel, si.gr[0].ch[ch], gr === 0 ? 0 : si.scfsi[ch]);\n            }\n\n            this.huffmanDecode(stream, xr[ch], channel, sfbwidth[ch], part2_length);\n        }\n        \n        // joint stereo processing\n        if (header.mode === MP3FrameHeader.MODE.JOINT_STEREO && header.mode_extension !== 0)\n            this.stereo(xr, si.gr, gr, header, sfbwidth[0]);\n        \n        // reordering, alias reduction, IMDCT, overlap-add, frequency inversion\n        for (var ch = 0; ch < nch; ch++) {\n            var channel = granule.ch[ch];\n            var sample = frame.sbsample[ch].slice(18 * gr);\n            \n            var sb, l = 0, i, sblimit;\n            var output = this.output;\n            \n            if (channel.block_type === 2) {\n                this.reorder(xr[ch], channel, sfbwidth[ch]);\n\n                /*\n                 * According to ISO/IEC 11172-3, \"Alias reduction is not applied for\n                 * granules with block_type === 2 (short block).\" However, other\n                 * sources suggest alias reduction should indeed be performed on the\n                 * lower two subbands of mixed blocks. Most other implementations do\n                 * this, so by default we will too.\n                 */\n                if (channel.flags & tables.MIXED_BLOCK_FLAG)\n                    this.aliasreduce(xr[ch], 36);\n            } else {\n                this.aliasreduce(xr[ch], 576);\n            }\n            \n            // subbands 0-1\n            if (channel.block_type !== 2 || (channel.flags & tables.MIXED_BLOCK_FLAG)) {\n                var block_type = channel.block_type;\n                if (channel.flags & tables.MIXED_BLOCK_FLAG)\n                    block_type = 0;\n\n                // long blocks\n                for (var sb = 0; sb < 2; ++sb, l += 18) {\n                    this.imdct_l(xr[ch].subarray(l, l + 18), output, block_type);\n                    this.overlap(output, frame.overlap[ch][sb], sample, sb);\n                }\n            } else {\n                // short blocks\n                for (var sb = 0; sb < 2; ++sb, l += 18) {\n                    this.imdct_s(xr[ch].subarray(l, l + 18), output);\n                    this.overlap(output, frame.overlap[ch][sb], sample, sb);\n                }\n            }\n            \n            this.freqinver(sample, 1);\n\n            // (nonzero) subbands 2-31\n            var i = 576;\n            while (i > 36 && xr[ch][i - 1] === 0) {\n                --i;\n            }\n            \n            sblimit = 32 - (((576 - i) / 18) << 0);\n\n            if (channel.block_type !== 2) {\n                // long blocks\n                for (var sb = 2; sb < sblimit; ++sb, l += 18) {\n                    this.imdct_l(xr[ch].subarray(l, l + 18), output, channel.block_type);\n                    this.overlap(output, frame.overlap[ch][sb], sample, sb);\n\n                    if (sb & 1)\n                        this.freqinver(sample, sb);\n                }\n            } else {\n                // short blocks\n                for (var sb = 2; sb < sblimit; ++sb, l += 18) {\n                    this.imdct_s(xr[ch].subarray(l, l + 18), output);\n                    this.overlap(output, frame.overlap[ch][sb], sample, sb);\n\n                    if (sb & 1)\n                        this.freqinver(sample, sb);\n                }\n            }\n            \n            // remaining (zero) subbands\n            for (var sb = sblimit; sb < 32; ++sb) {\n                this.overlap_z(frame.overlap[ch][sb], sample, sb);\n\n                if (sb & 1)\n                    this.freqinver(sample, sb);\n            }\n        }\n    }\n};\n\nLayer3.prototype.scalefactors = function(stream, channel, gr0ch, scfsi) {\n    var start = stream.offset();\n    var slen1 = tables.SFLEN_TABLE[channel.scalefac_compress].slen1;\n    var slen2 = tables.SFLEN_TABLE[channel.scalefac_compress].slen2;\n    var sfbi;\n    \n    if (channel.block_type === 2) {\n        sfbi = 0;\n\n        var nsfb = (channel.flags & tables.MIXED_BLOCK_FLAG) ? 8 + 3 * 3 : 6 * 3;\n        while (nsfb--)\n            channel.scalefac[sfbi++] = stream.read(slen1);\n\n        nsfb = 6 * 3;\n        while (nsfb--)\n            channel.scalefac[sfbi++] = stream.read(slen2);\n\n        nsfb = 1 * 3;\n        while (nsfb--)\n            channel.scalefac[sfbi++] = 0;\n    } else {\n        if (scfsi & 0x8) {\n            for (var sfbi = 0; sfbi < 6; ++sfbi)\n                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];\n        } else {\n            for (var sfbi = 0; sfbi < 6; ++sfbi)\n                channel.scalefac[sfbi] = stream.read(slen1);\n        }\n\n        if (scfsi & 0x4) {\n            for (var sfbi = 6; sfbi < 11; ++sfbi)\n                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];\n        } else {\n            for (var sfbi = 6; sfbi < 11; ++sfbi)\n                channel.scalefac[sfbi] = stream.read(slen1);\n        }\n\n        if (scfsi & 0x2) {\n            for (var sfbi = 11; sfbi < 16; ++sfbi)\n                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];\n        } else {\n            for (var sfbi = 11; sfbi < 16; ++sfbi)\n                channel.scalefac[sfbi] = stream.read(slen2);\n        }\n\n        if (scfsi & 0x1) {\n            for (var sfbi = 16; sfbi < 21; ++sfbi)\n                channel.scalefac[sfbi] = gr0ch.scalefac[sfbi];\n        } else {\n            for (var sfbi = 16; sfbi < 21; ++sfbi)\n                channel.scalefac[sfbi] = stream.read(slen2);\n        }\n\n        channel.scalefac[21] = 0;\n    }\n    \n    return stream.offset() - start;\n};\n\nLayer3.prototype.scalefactors_lsf = function(stream, channel, gr1ch, mode_extension) {\n    var start = stream.offset();\n    var scalefac_compress = channel.scalefac_compress;\n    var index = channel.block_type === 2 ? (channel.flags & tables.MIXED_BLOCK_FLAG ? 2 : 1) : 0;\n    var slen = new Int32Array(4);\n    var nsfb;\n    \n    if (!((mode_extension & tables.I_STEREO) && gr1ch)) {\n        if (scalefac_compress < 400) {\n            slen[0] = (scalefac_compress >>> 4) / 5;\n            slen[1] = (scalefac_compress >>> 4) % 5;\n            slen[2] = (scalefac_compress % 16) >>> 2;\n            slen[3] =  scalefac_compress %  4;\n        \n            nsfb = tables.NSFB_TABLE[0][index];\n        } else if (scalefac_compress < 500) {\n            scalefac_compress -= 400;\n\n            slen[0] = (scalefac_compress >>> 2) / 5;\n            slen[1] = (scalefac_compress >>> 2) % 5;\n            slen[2] =  scalefac_compress % 4;\n            slen[3] = 0;\n\n            nsfb = tables.NSFB_TABLE[1][index];\n        } else {\n            scalefac_compress -= 500;\n\n            slen[0] = scalefac_compress / 3;\n            slen[1] = scalefac_compress % 3;\n            slen[2] = 0;\n            slen[3] = 0;\n\n            channel.flags |= tables.PREFLAG;\n            nsfb = tables.NSFB_TABLE[2][index];\n        }\n        \n        var n = 0;\n        for (var part = 0; part < 4; part++) {\n            for (var i = 0; i < nsfb[part]; i++) {\n                channel.scalefac[n++] = stream.read(slen[part]);\n            }\n        }\n        \n        while (n < 39) {\n            channel.scalefac[n++] = 0;\n        }\n    } else {  // (mode_extension & tables.I_STEREO) && gr1ch (i.e. ch == 1)\n        scalefac_compress >>>= 1;\n        \n        if (scalefac_compress < 180) {\n            slen[0] =  scalefac_compress / 36;\n            slen[1] = (scalefac_compress % 36) / 6;\n            slen[2] = (scalefac_compress % 36) % 6;\n            slen[3] = 0;\n\n            nsfb = tables.NSFB_TABLE[3][index];\n        } else if (scalefac_compress < 244) {\n            scalefac_compress -= 180;\n\n            slen[0] = (scalefac_compress % 64) >>> 4;\n            slen[1] = (scalefac_compress % 16) >>> 2;\n            slen[2] =  scalefac_compress %  4;\n            slen[3] = 0;\n\n            nsfb = tables.NSFB_TABLE[4][index];\n        } else {\n            scalefac_compress -= 244;\n\n            slen[0] = scalefac_compress / 3;\n            slen[1] = scalefac_compress % 3;\n            slen[2] = 0;\n            slen[3] = 0;\n\n            nsfb = tables.NSFB_TABLE[5][index];\n        }\n        \n        var n = 0;\n        for (var part = 0; part < 4; ++part) {\n            var max = (1 << slen[part]) - 1;\n            for (var i = 0; i < nsfb[part]; ++i) {\n                var is_pos = stream.read(slen[part]);\n\n                channel.scalefac[n] = is_pos;\n                gr1ch.scalefac[n++] = is_pos === max ? 1 : 0;\n            }\n        }\n        \n        while (n < 39) {\n            channel.scalefac[n] = 0;\n            gr1ch.scalefac[n++] = 0;  // apparently not illegal\n        }\n    }\n    \n    return stream.offset() - start;\n};\n\nLayer3.prototype.huffmanDecode = function(stream, xr, channel, sfbwidth, part2_length) {\n    var exponents = this._exponents;\n    var sfbwidthptr = 0;\n    \n    var bits_left = channel.part2_3_length - part2_length;    \n    if (bits_left < 0)\n        throw new Error('bad audio data length');\n    \n    this.exponents(channel, sfbwidth, exponents);\n    \n    var peek = stream.copy();\n    stream.advance(bits_left);\n    \n    /* align bit reads to byte boundaries */\n    var cachesz  = 8 - peek.bitPosition;\n    cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;\n    \n    var bitcache = peek.read(cachesz);\n    bits_left -= cachesz;\n\n    var xrptr = 0;\n    \n    // big_values\n    var region = 0;\n    var reqcache = this.reqcache;\n    \n    var sfbound = xrptr + sfbwidth[sfbwidthptr++];\n    var rcount  = channel.region0_count + 1;\n    \n    var entry = huffman.huff_pair_table[channel.table_select[region]];\n    var table     = entry.table;\n    var linbits   = entry.linbits;\n    var startbits = entry.startbits;\n    \n    if (typeof table === 'undefined')\n        throw new Error('bad Huffman table select');\n        \n    var expptr = 0;\n    var exp = exponents[expptr++];\n    var reqhits = 0;\n    var big_values = channel.big_values;\n    \n    while (big_values-- && cachesz + bits_left > 0) {\n         if (xrptr === sfbound) {\n             sfbound += sfbwidth[sfbwidthptr++];\n\n             // change table if region boundary\n             if (--rcount === 0) {\n                 if (region === 0)\n                     rcount = channel.region1_count + 1;\n                 else\n                     rcount = 0; // all remaining\n\n                 entry     = huffman.huff_pair_table[channel.table_select[++region]];\n                 table     = entry.table;\n                 linbits   = entry.linbits;\n                 startbits = entry.startbits;\n\n                 if (typeof table === 'undefined')\n                     throw new Error('bad Huffman table select');\n             }\n\n             if (exp !== exponents[expptr]) {\n                 exp = exponents[expptr];\n                 reqhits = 0;\n             }\n\n             ++expptr;\n         }\n         \n         if (cachesz < 21) {\n             var bits   = ((32 - 1 - 21) + (21 - cachesz)) & ~7;\n             bitcache   = (bitcache << bits) | peek.read(bits);\n             cachesz   += bits;\n             bits_left -= bits;\n         }\n         \n         var clumpsz = startbits;\n         var pair = table[ (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))];\n         \n         while (!pair.final) {\n             cachesz -= clumpsz;\n             clumpsz = pair.ptr.bits;\n             pair    = table[pair.ptr.offset + (((bitcache) >> ((cachesz) - (clumpsz))) & ((1 << (clumpsz)) - 1))];\n         }\n         \n         cachesz -= pair.value.hlen;\n         \n         if (linbits) {\n             var value = pair.value.x;\n             var x_final = false;\n             \n             switch (value) {\n                 case 0:\n                     xr[xrptr] = 0;\n                     break;\n\n                 case 15:\n                     if (cachesz < linbits + 2) {\n                         bitcache   = (bitcache << 16) | peek.read(16);\n                         cachesz   += 16;\n                         bits_left -= 16;\n                     }\n\n                     value += (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1));\n                     cachesz -= linbits;\n\n                     requantized = this.requantize(value, exp);\n                     x_final = true; // simulating goto, yay\n                     break;\n\n                 default:\n                     if (reqhits & (1 << value)) {\n                         requantized = reqcache[value];\n                     } else {\n                         reqhits |= (1 << value);\n                         requantized = reqcache[value] = this.requantize(value, exp);\n                     }\n                     \n                     x_final = true;\n             }\n             \n             if(x_final) {\n                 xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized;\n             }\n             \n             value = pair.value.y;\n             var y_final = false;\n             \n             switch (value) {\n                 case 0:\n                     xr[xrptr + 1] = 0;\n                     break;\n\n                 case 15:\n                     if (cachesz < linbits + 1) {\n                         bitcache   = (bitcache << 16) | peek.read(16);\n                         cachesz   += 16;\n                         bits_left -= 16;\n                     }\n\n                     value += (((bitcache) >> ((cachesz) - (linbits))) & ((1 << (linbits)) - 1));\n                     cachesz -= linbits;\n\n                     requantized = this.requantize(value, exp);\n                     y_final = true;\n                     break; // simulating goto, yayzor\n\n                 default:\n                     if (reqhits & (1 << value)) {\n                         requantized = reqcache[value];\n                     } else {\n                         reqhits |= (1 << value);\n                         reqcache[value] = this.requantize(value, exp);\n                         requantized = reqcache[value];\n                     }\n                     \n                     y_final = true;\n             }\n             \n             if(y_final) {\n                 xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized;\n             }\n             \n         } else {\n             var value = pair.value.x;\n\n             if (value === 0) {\n                 xr[xrptr] = 0;\n             } else {\n                 if (reqhits & (1 << value))\n                     requantized = reqcache[value];\n                 else {\n                     reqhits |= (1 << value);\n                     requantized = reqcache[value] = this.requantize(value, exp);\n                 }\n\n                 xr[xrptr] = ((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized;\n             }\n\n             value = pair.value.y;\n\n             if (value === 0) {\n                 xr[xrptr + 1] = 0;\n             } else {\n                 if (reqhits & (1 << value))\n                     requantized = reqcache[value];\n                 else {\n                     reqhits |= (1 << value);\n                     requantized = reqcache[value] = this.requantize(value, exp);\n                 }\n\n                 xr[xrptr + 1] = ((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized;\n             }\n         }\n\n         xrptr += 2;\n    }\n    \n    if (cachesz + bits_left < 0)\n        throw new Error('Huffman data overrun');\n    \n    // count1    \n    var table = huffman.huff_quad_table[channel.flags & tables.COUNT1TABLE_SELECT];\n    var requantized = this.requantize(1, exp);\n    \n    while (cachesz + bits_left > 0 && xrptr <= 572) {\n        if (cachesz < 10) {\n            bitcache   = (bitcache << 16) | peek.read(16);\n            cachesz   += 16;\n            bits_left -= 16;\n        }\n        \n        var quad = table[(((bitcache) >> ((cachesz) - (4))) & ((1 << (4)) - 1))];\n        \n        // quad tables guaranteed to have at most one extra lookup\n        if (!quad.final) {\n            cachesz -= 4;\n            quad = table[quad.ptr.offset + (((bitcache) >> ((cachesz) - (quad.ptr.bits))) & ((1 << (quad.ptr.bits)) - 1))];\n        }\n        \n        cachesz -= quad.value.hlen;\n\n        if (xrptr === sfbound) {\n            sfbound += sfbwidth[sfbwidthptr++];\n\n            if (exp !== exponents[expptr]) {\n                exp = exponents[expptr];\n                requantized = this.requantize(1, exp);\n            }\n\n            ++expptr;\n        }\n        \n        // v (0..1)\n        xr[xrptr] = quad.value.v ? (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;\n\n        // w (0..1)\n        xr[xrptr + 1] = quad.value.w ? (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;\n\n        xrptr += 2;\n        if (xrptr === sfbound) {\n            sfbound += sfbwidth[sfbwidthptr++];\n\n            if (exp !== exponents[expptr]) {\n                exp = exponents[expptr];\n                requantized = this.requantize(1, exp);\n            }\n\n            ++expptr;\n        }\n        \n        // x (0..1)\n        xr[xrptr] = quad.value.x ? (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;\n\n        // y (0..1)\n        xr[xrptr + 1] = quad.value.y ? (((bitcache) & (1 << ((cachesz--) - 1))) ? -requantized : requantized) : 0;\n\n        xrptr += 2;\n        \n        if (cachesz + bits_left < 0) {\n            // technically the bitstream is misformatted, but apparently\n            // some encoders are just a bit sloppy with stuffing bits\n            xrptr -= 4;\n        }\n    }\n    \n    if (-bits_left > MP3FrameHeader.BUFFER_GUARD * 8) {\n        throw new Error(\"assertion failed: (-bits_left <= MP3FrameHeader.BUFFER_GUARD * CHAR_BIT)\");\n    }\n    \n    // rzero\n    while (xrptr < 576) {\n        xr[xrptr]     = 0;\n        xr[xrptr + 1] = 0;\n        xrptr += 2;\n    }\n};\n\nLayer3.prototype.requantize = function(value, exp) {\n    // usual (x >> 0) tricks to make sure frac and exp stay integers\n    var frac = (exp % 4) >> 0;  // assumes sign(frac) === sign(exp)\n    exp = (exp / 4) >> 0;\n\n    var requantized = Math.pow(value, 4.0 / 3.0);\n    requantized *= Math.pow(2.0, (exp / 4.0));\n    \n    if (frac) {\n        requantized *= Math.pow(2.0, (frac / 4.0));\n    }\n    \n    if (exp < 0) {\n        requantized /= Math.pow(2.0, -exp * (3.0 / 4.0));\n    }\n\n    return requantized;\n};\n\nLayer3.prototype.exponents = function(channel, sfbwidth, exponents) {\n    var gain = channel.global_gain - 210;\n    var scalefac_multiplier = (channel.flags & tables.SCALEFAC_SCALE) ? 2 : 1;\n    \n    if (channel.block_type === 2) {\n        var sfbi = 0, l = 0;\n        \n        if (channel.flags & tables.MIXED_BLOCK_FLAG) {\n            var premask = (channel.flags & tables.PREFLAG) ? ~0 : 0;\n            \n            // long block subbands 0-1\n            while (l < 36) {\n                exponents[sfbi] = gain - ((channel.scalefac[sfbi] + (tables.PRETAB[sfbi] & premask)) << scalefac_multiplier);\n                l += sfbwidth[sfbi++];\n            }\n        }\n        \n        // this is probably wrong for 8000 Hz short/mixed blocks\n        var gain0 = gain - 8 * channel.subblock_gain[0];\n        var gain1 = gain - 8 * channel.subblock_gain[1];\n        var gain2 = gain - 8 * channel.subblock_gain[2];\n        \n        while (l < 576) {\n            exponents[sfbi + 0] = gain0 - (channel.scalefac[sfbi + 0] << scalefac_multiplier);\n            exponents[sfbi + 1] = gain1 - (channel.scalefac[sfbi + 1] << scalefac_multiplier);\n            exponents[sfbi + 2] = gain2 - (channel.scalefac[sfbi + 2] << scalefac_multiplier);\n            \n            l += 3 * sfbwidth[sfbi];\n            sfbi += 3;\n        }\n    } else {\n        if (channel.flags & tables.PREFLAG) {\n            for (var sfbi = 0; sfbi < 22; sfbi++) {\n                exponents[sfbi] = gain - ((channel.scalefac[sfbi] + tables.PRETAB[sfbi]) << scalefac_multiplier);\n            }\n        } else {\n            for (var sfbi = 0; sfbi < 22; sfbi++) {\n                exponents[sfbi] = gain - (channel.scalefac[sfbi] << scalefac_multiplier);\n            }\n        }\n    }\n};\n\nLayer3.prototype.stereo = function(xr, granules, gr, header, sfbwidth) {\n    var granule = granules[gr];\n    var modes = this.modes;\n    var sfbi, l, n, i;\n    \n    if (granule.ch[0].block_type !== granule.ch[1].block_type || (granule.ch[0].flags & tables.MIXED_BLOCK_FLAG) !== (granule.ch[1].flags & tables.MIXED_BLOCK_FLAG))\n        throw new Error('incompatible stereo block_type');\n        \n    for (var i = 0; i < 39; i++)\n        modes[i] = header.mode_extension;\n        \n    // intensity stereo\n    if (header.mode_extension & tables.I_STEREO) {\n        var right_ch = granule.ch[1];\n        var right_xr = xr[1];\n        \n        header.flags |= MP3FrameHeader.FLAGS.tables.I_STEREO;\n         \n        // first determine which scalefactor bands are to be processed\n        if (right_ch.block_type === 2) {\n            var lower, start, max, bound = new Uint32Array(3), w;\n\n            lower = start = max = bound[0] = bound[1] = bound[2] = 0;\n            sfbi = l = 0;\n            \n            if (right_ch.flags & tables.MIXED_BLOCK_FLAG) {\n                while (l < 36) {\n                    n = sfbwidth[sfbi++];\n\n                    for (var i = 0; i < n; ++i) {\n                        if (right_xr[i]) {\n                            lower = sfbi;\n                            break;\n                        }\n                    }\n\n                    right_xr += n;\n                    l += n;\n                }\n\n                start = sfbi;\n            }\n            \n            var w = 0;\n            while (l < 576) {\n                n = sfbwidth[sfbi++];\n\n                for (i = 0; i < n; ++i) {\n                    if (right_xr[i]) {\n                        max = bound[w] = sfbi;\n                        break;\n                    }\n                }\n\n                right_xr += n;\n                l += n;\n                w = (w + 1) % 3;\n            }\n            \n            if (max)\n                lower = start;\n\n            // long blocks\n            for (i = 0; i < lower; ++i)\n                modes[i] = header.mode_extension & ~tables.I_STEREO;\n\n            // short blocks\n            w = 0;\n            for (i = start; i < max; ++i) {\n                if (i < bound[w])\n                    modes[i] = header.mode_extension & ~tables.I_STEREO;\n\n                w = (w + 1) % 3;\n            }\n        } else {\n            var bound = 0;\n            for (sfbi = l = 0; l < 576; l += n) {\n                n = sfbwidth[sfbi++];\n\n                for (i = 0; i < n; ++i) {\n                    if (right_xr[i]) {\n                        bound = sfbi;\n                        break;\n                    }\n                }\n\n                right_xr += n;\n            }\n\n            for (i = 0; i < bound; ++i)\n                modes[i] = header.mode_extension & ~tables.I_STEREO;\n        }\n        \n        // now do the actual processing\n        if (header.flags & MP3FrameHeader.FLAGS.LSF_EXT) {\n            var illegal_pos = granules[gr + 1].ch[1].scalefac;\n\n            // intensity_scale\n            var lsf_scale = IS_Ltables.SF_TABLE[right_ch.scalefac_compress & 0x1];\n            \n            for (sfbi = l = 0; l < 576; ++sfbi, l += n) {\n                n = sfbwidth[sfbi];\n\n                if (!(modes[sfbi] & tables.I_STEREO))\n                    continue;\n\n                if (illegal_pos[sfbi]) {\n                    modes[sfbi] &= ~tables.I_STEREO;\n                    continue;\n                }\n\n                is_pos = right_ch.scalefac[sfbi];\n                \n                for (i = 0; i < n; ++i) {\n                    var left = xr[0][l + i];\n\n                    if (is_pos === 0) {\n                        xr[1][l + i] = left;\n                    } else {\n                        var opposite = left * lsf_scale[(is_pos - 1) / 2];\n\n                        if (is_pos & 1) {\n                            xr[0][l + i] = opposite;\n                            xr[1][l + i] = left;\n                        }\n                        else {\n                            xr[1][l + i] = opposite;\n                        }\n                    }\n                }\n            }\n        } else {\n            for (sfbi = l = 0; l < 576; ++sfbi, l += n) {\n                n = sfbwidth[sfbi];\n\n                if (!(modes[sfbi] & tables.I_STEREO))\n                    continue;\n\n                is_pos = right_ch.scalefac[sfbi];\n\n                if (is_pos >= 7) {  // illegal intensity position\n                    modes[sfbi] &= ~tables.I_STEREO;\n                    continue;\n                }\n\n                for (i = 0; i < n; ++i) {\n                    var left = xr[0][l + i];\n                    xr[0][l + i] = left * tables.IS_TABLE[is_pos];\n                    xr[1][l + i] = left * tables.IS_TABLE[6 - is_pos];\n                }\n            }\n        }\n    }\n    \n    // middle/side stereo\n    if (header.mode_extension & tables.MS_STEREO) {\n        header.flags |= tables.MS_STEREO;\n\n        var invsqrt2 = tables.ROOT_TABLE[3 + -2];\n\n        for (sfbi = l = 0; l < 576; ++sfbi, l += n) {\n            n = sfbwidth[sfbi];\n\n            if (modes[sfbi] !== tables.MS_STEREO)\n                continue;\n\n            for (i = 0; i < n; ++i) {\n                var m = xr[0][l + i];\n                var s = xr[1][l + i];\n\n                xr[0][l + i] = (m + s) * invsqrt2;  // l = (m + s) / sqrt(2)\n                xr[1][l + i] = (m - s) * invsqrt2;  // r = (m - s) / sqrt(2)\n            }\n        }\n    }\n};\n\nLayer3.prototype.aliasreduce = function(xr, lines) {\n    for (var xrPointer = 18; xrPointer < lines; xrPointer += 18) {\n        for (var i = 0; i < 8; ++i) {\n            var a = xr[xrPointer - i - 1];\n            var b = xr[xrPointer + i];\n\n            xr[xrPointer - i - 1] = a * tables.CS[i] - b * tables.CA[i];\n            xr[xrPointer + i] = b * tables.CS[i] + a * tables.CA[i];\n        }\n    }\n};\n\n// perform IMDCT and windowing for long blocks\nLayer3.prototype.imdct_l = function (X, z, block_type) {\n    // IMDCT\n    this.imdct.imdct36(X, z);\n\n    // windowing\n    switch (block_type) {\n        case 0:  // normal window\n            for (var i = 0; i < 36; ++i) z[i] = z[i] * tables.WINDOW_L[i];\n            break;\n\n        case 1:  // start block\n            for (var i =  0; i < 18; ++i) z[i] = z[i] * tables.WINDOW_L[i];\n            for (var i = 24; i < 30; ++i) z[i] = z[i] * tables.WINDOW_S[i - 18];\n            for (var i = 30; i < 36; ++i) z[i] = 0;\n            break;\n\n        case 3:  // stop block\n            for (var i =  0; i <  6; ++i) z[i] = 0;\n            for (var i =  6; i < 12; ++i) z[i] = z[i] * tables.WINDOW_S[i - 6];\n            for (var i = 18; i < 36; ++i) z[i] = z[i] * tables.WINDOW_L[i];\n            break;\n    }\n};\n\n/*\n * perform IMDCT and windowing for short blocks\n */\nLayer3.prototype.imdct_s = function (X, z) {\n    var yptr = 0;\n    var wptr;\n    var Xptr = 0;\n    \n    var y = new Float64Array(36);\n    var hi, lo;\n\n    // IMDCT\n    for (var w = 0; w < 3; ++w) {\n        var sptr = 0;\n\n        for (var i = 0; i < 3; ++i) {\n            lo = X[Xptr + 0] * IMDCT.S[sptr][0] +\n                 X[Xptr + 1] * IMDCT.S[sptr][1] +\n                 X[Xptr + 2] * IMDCT.S[sptr][2] +\n                 X[Xptr + 3] * IMDCT.S[sptr][3] +\n                 X[Xptr + 4] * IMDCT.S[sptr][4] +\n                 X[Xptr + 5] * IMDCT.S[sptr][5];\n\n\n            y[yptr + i + 0] = lo;\n            y[yptr + 5 - i] = -y[yptr + i + 0];\n\n            ++sptr;\n\n            lo = X[Xptr + 0] * IMDCT.S[sptr][0] +\n                 X[Xptr + 1] * IMDCT.S[sptr][1] +\n                 X[Xptr + 2] * IMDCT.S[sptr][2] +\n                 X[Xptr + 3] * IMDCT.S[sptr][3] +\n                 X[Xptr + 4] * IMDCT.S[sptr][4] +\n                 X[Xptr + 5] * IMDCT.S[sptr][5];\n\n            y[yptr +  i + 6] = lo;\n            y[yptr + 11 - i] = y[yptr + i + 6];\n\n            ++sptr;\n        }\n\n        yptr += 12;\n        Xptr += 6;\n    }\n\n    // windowing, overlapping and concatenation\n    yptr = 0;\n    var wptr = 0;\n\n    for (var i = 0; i < 6; ++i) {\n        z[i + 0] = 0;\n        z[i + 6] = y[yptr +  0 + 0] * tables.WINDOW_S[wptr + 0];\n\n        lo = y[yptr + 0 + 6] * tables.WINDOW_S[wptr + 6] +\n             y[yptr + 12 + 0] * tables.WINDOW_S[wptr + 0];\n\n        z[i + 12] = lo;\n\n        lo = y[yptr + 12 + 6] * tables.WINDOW_S[wptr + 6] +\n             y[yptr + 24 + 0] * tables.WINDOW_S[wptr + 0];\n\n        z[i + 18] = lo;\n        z[i + 24] = y[yptr + 24 + 6] * tables.WINDOW_S[wptr + 6];\n        z[i + 30] = 0;\n\n        ++yptr;\n        ++wptr;\n    }\n};\n\nLayer3.prototype.overlap = function (output, overlap, sample, sb) {\n    for (var i = 0; i < 18; ++i) {\n        sample[i][sb] = output[i] + overlap[i];\n        overlap[i]    = output[i + 18];\n    }\n};\n\nLayer3.prototype.freqinver = function (sample, sb) {\n    for (var i = 1; i < 18; i += 2)\n        sample[i][sb] = -sample[i][sb];\n};\n\nLayer3.prototype.overlap_z = function (overlap, sample, sb) {\n    for (var i = 0; i < 18; ++i) {\n        sample[i][sb] = overlap[i];\n        overlap[i]    = 0;\n    }\n};\n\nLayer3.prototype.reorder = function (xr, channel, sfbwidth) {\n    var sfbwidthPointer = 0;\n    var tmp = this.tmp;\n    var sbw = new Uint32Array(3);\n    var sw  = new Uint32Array(3);\n    \n    // this is probably wrong for 8000 Hz mixed blocks\n\n    var sb = 0;\n    if (channel.flags & tables.MIXED_BLOCK_FLAG) {\n        var sb = 2;\n\n        var l = 0;\n        while (l < 36)\n            l += sfbwidth[sfbwidthPointer++];\n    }\n\n    for (var w = 0; w < 3; ++w) {\n        sbw[w] = sb;\n        sw[w]  = 0;\n    }\n\n    f = sfbwidth[sfbwidthPointer++];\n    w = 0;\n\n    for (var l = 18 * sb; l < 576; ++l) {\n        if (f-- === 0) {\n            f = sfbwidth[sfbwidthPointer++] - 1;\n            w = (w + 1) % 3;\n        }\n        \n        tmp[sbw[w]][w][sw[w]++] = xr[l];\n\n        if (sw[w] === 6) {\n            sw[w] = 0;\n            ++sbw[w];\n        }\n    }\n\n    var tmp2 = this.tmp2;\n    var ptr = 0;\n    \n    for (var i = 0; i < 32; i++) {\n        for (var j = 0; j < 3; j++) {\n            for (var k = 0; k < 6; k++) {\n                tmp2[ptr++] = tmp[i][j][k];\n            }\n        }\n    }\n    \n    var len = (576 - 18 * sb); \n    for (var i = 0; i < len; i++) {\n        xr[18 * sb + i] = tmp2[sb + i];\n    }\n};\n\nmodule.exports = Layer3;\n",
37    "var AV = (window.AV);\nvar MP3FrameHeader = require('./header');\n\nfunction MP3Stream(stream) {\n    this.stream = stream;                     // actual bitstream\n    this.sync = false;                        // stream sync found\n    this.freerate = 0;                        // free bitrate (fixed)\n    this.this_frame = stream.stream.offset;   // start of current frame\n    this.next_frame = stream.stream.offset;   // start of next frame\n    \n    this.main_data = new Uint8Array(MP3FrameHeader.BUFFER_MDLEN); // actual audio data\n    this.md_len = 0;                               // length of main data\n    \n    // copy methods from actual stream\n    for (var key in stream) {\n        if (typeof stream[key] === 'function')\n            this[key] = stream[key].bind(stream);\n    }\n}\n\nMP3Stream.prototype.getU8 = function(offset) {\n    var stream = this.stream.stream;\n    return stream.peekUInt8(offset - stream.offset);\n};\n\nMP3Stream.prototype.nextByte = function() {\n    var stream = this.stream;\n    return stream.bitPosition === 0 ? stream.stream.offset : stream.stream.offset + 1;\n};\n\nMP3Stream.prototype.doSync = function() {\n    var stream = this.stream.stream;\n    this.align();\n    \n    while (this.available(16) && !(stream.peekUInt8(0) === 0xff && (stream.peekUInt8(1) & 0xe0) === 0xe0)) {\n        this.advance(8);\n    }\n\n    if (!this.available(MP3FrameHeader.BUFFER_GUARD))\n        return false;\n        \n    return true;\n};\n\nMP3Stream.prototype.reset = function(byteOffset) {\n    this.seek(byteOffset * 8);\n    this.next_frame = byteOffset;\n    this.sync = true;\n};\n\nmodule.exports = MP3Stream;\n",
38    "var utils = require('./utils');\n\nfunction MP3Synth() {\n    this.filter = utils.makeArray([2, 2, 2, 16, 8]); // polyphase filterbank outputs\n    this.phase = 0;\n    \n    this.pcm = {\n        samplerate: 0,\n        channels: 0,\n        length: 0,\n        samples: [new Float64Array(1152), new Float64Array(1152)]\n    };\n}\n\n/* costab[i] = cos(PI / (2 * 32) * i) */\nconst costab1  = 0.998795456;\nconst costab2  = 0.995184727;\nconst costab3  = 0.989176510;\nconst costab4  = 0.980785280;\nconst costab5  = 0.970031253;\nconst costab6  = 0.956940336;\nconst costab7  = 0.941544065;\nconst costab8  = 0.923879533;\nconst costab9  = 0.903989293;\nconst costab10 = 0.881921264;\nconst costab11 = 0.857728610;\nconst costab12 = 0.831469612;\nconst costab13 = 0.803207531;\nconst costab14 = 0.773010453;\nconst costab15 = 0.740951125;\nconst costab16 = 0.707106781;\nconst costab17 = 0.671558955;\nconst costab18 = 0.634393284;\nconst costab19 = 0.595699304;\nconst costab20 = 0.555570233;\nconst costab21 = 0.514102744;\nconst costab22 = 0.471396737;\nconst costab23 = 0.427555093;\nconst costab24 = 0.382683432;\nconst costab25 = 0.336889853;\nconst costab26 = 0.290284677;\nconst costab27 = 0.242980180;\nconst costab28 = 0.195090322;\nconst costab29 = 0.146730474;\nconst costab30 = 0.098017140;\nconst costab31 = 0.049067674;\n\n/*\n * NAME:    dct32()\n * DESCRIPTION: perform fast in[32].out[32] DCT\n */\nMP3Synth.dct32 = function (_in, slot, lo, hi) {\n    var t0,   t1,   t2,   t3,   t4,   t5,   t6,   t7;\n    var t8,   t9,   t10,  t11,  t12,  t13,  t14,  t15;\n    var t16,  t17,  t18,  t19,  t20,  t21,  t22,  t23;\n    var t24,  t25,  t26,  t27,  t28,  t29,  t30,  t31;\n    var t32,  t33,  t34,  t35,  t36,  t37,  t38,  t39;\n    var t40,  t41,  t42,  t43,  t44,  t45,  t46,  t47;\n    var t48,  t49,  t50,  t51,  t52,  t53,  t54,  t55;\n    var t56,  t57,  t58,  t59,  t60,  t61,  t62,  t63;\n    var t64,  t65,  t66,  t67,  t68,  t69,  t70,  t71;\n    var t72,  t73,  t74,  t75,  t76,  t77,  t78,  t79;\n    var t80,  t81,  t82,  t83,  t84,  t85,  t86,  t87;\n    var t88,  t89,  t90,  t91,  t92,  t93,  t94,  t95;\n    var t96,  t97,  t98,  t99,  t100, t101, t102, t103;\n    var t104, t105, t106, t107, t108, t109, t110, t111;\n    var t112, t113, t114, t115, t116, t117, t118, t119;\n    var t120, t121, t122, t123, t124, t125, t126, t127;\n    var t128, t129, t130, t131, t132, t133, t134, t135;\n    var t136, t137, t138, t139, t140, t141, t142, t143;\n    var t144, t145, t146, t147, t148, t149, t150, t151;\n    var t152, t153, t154, t155, t156, t157, t158, t159;\n    var t160, t161, t162, t163, t164, t165, t166, t167;\n    var t168, t169, t170, t171, t172, t173, t174, t175;\n    var t176;\n\n    t0   = _in[0]  + _in[31];  t16  = ((_in[0]  - _in[31]) * (costab1));\n    t1   = _in[15] + _in[16];  t17  = ((_in[15] - _in[16]) * (costab31));\n\n    t41  = t16 + t17;\n    t59  = ((t16 - t17) * (costab2));\n    t33  = t0  + t1;\n    t50  = ((t0  - t1) * ( costab2));\n\n    t2   = _in[7]  + _in[24];  t18  = ((_in[7]  - _in[24]) * (costab15));\n    t3   = _in[8]  + _in[23];  t19  = ((_in[8]  - _in[23]) * (costab17));\n\n    t42  = t18 + t19;\n    t60  = ((t18 - t19) * (costab30));\n    t34  = t2  + t3;\n    t51  = ((t2  - t3) * ( costab30));\n\n    t4   = _in[3]  + _in[28];  t20  = ((_in[3]  - _in[28]) * (costab7));\n    t5   = _in[12] + _in[19];  t21  = ((_in[12] - _in[19]) * (costab25));\n\n    t43  = t20 + t21;\n    t61  = ((t20 - t21) * (costab14));\n    t35  = t4  + t5;\n    t52  = ((t4  - t5) * ( costab14));\n\n    t6   = _in[4]  + _in[27];  t22  = ((_in[4]  - _in[27]) * (costab9));\n    t7   = _in[11] + _in[20];  t23  = ((_in[11] - _in[20]) * (costab23));\n\n    t44  = t22 + t23;\n    t62  = ((t22 - t23) * (costab18));\n    t36  = t6  + t7;\n    t53  = ((t6  - t7) * ( costab18));\n\n    t8   = _in[1]  + _in[30];  t24  = ((_in[1]  - _in[30]) * (costab3));\n    t9   = _in[14] + _in[17];  t25  = ((_in[14] - _in[17]) * (costab29));\n\n    t45  = t24 + t25;\n    t63  = ((t24 - t25) * (costab6));\n    t37  = t8  + t9;\n    t54  = ((t8  - t9) * ( costab6));\n\n    t10  = _in[6]  + _in[25];  t26  = ((_in[6]  - _in[25]) * (costab13));\n    t11  = _in[9]  + _in[22];  t27  = ((_in[9]  - _in[22]) * (costab19));\n\n    t46  = t26 + t27;\n    t64  = ((t26 - t27) * (costab26));\n    t38  = t10 + t11;\n    t55  = ((t10 - t11) * (costab26));\n\n    t12  = _in[2]  + _in[29];  t28  = ((_in[2]  - _in[29]) * (costab5));\n    t13  = _in[13] + _in[18];  t29  = ((_in[13] - _in[18]) * (costab27));\n\n    t47  = t28 + t29;\n    t65  = ((t28 - t29) * (costab10));\n    t39  = t12 + t13;\n    t56  = ((t12 - t13) * (costab10));\n\n    t14  = _in[5]  + _in[26];  t30  = ((_in[5]  - _in[26]) * (costab11));\n    t15  = _in[10] + _in[21];  t31  = ((_in[10] - _in[21]) * (costab21));\n\n    t48  = t30 + t31;\n    t66  = ((t30 - t31) * (costab22));\n    t40  = t14 + t15;\n    t57  = ((t14 - t15) * (costab22));\n\n    t69  = t33 + t34;  t89  = ((t33 - t34) * (costab4));\n    t70  = t35 + t36;  t90  = ((t35 - t36) * (costab28));\n    t71  = t37 + t38;  t91  = ((t37 - t38) * (costab12));\n    t72  = t39 + t40;  t92  = ((t39 - t40) * (costab20));\n    t73  = t41 + t42;  t94  = ((t41 - t42) * (costab4));\n    t74  = t43 + t44;  t95  = ((t43 - t44) * (costab28));\n    t75  = t45 + t46;  t96  = ((t45 - t46) * (costab12));\n    t76  = t47 + t48;  t97  = ((t47 - t48) * (costab20));\n\n    t78  = t50 + t51;  t100 = ((t50 - t51) * (costab4));\n    t79  = t52 + t53;  t101 = ((t52 - t53) * (costab28));\n    t80  = t54 + t55;  t102 = ((t54 - t55) * (costab12));\n    t81  = t56 + t57;  t103 = ((t56 - t57) * (costab20));\n\n    t83  = t59 + t60;  t106 = ((t59 - t60) * (costab4));\n    t84  = t61 + t62;  t107 = ((t61 - t62) * (costab28));\n    t85  = t63 + t64;  t108 = ((t63 - t64) * (costab12));\n    t86  = t65 + t66;  t109 = ((t65 - t66) * (costab20));\n\n    t113 = t69  + t70;\n    t114 = t71  + t72;\n\n    /*  0 */ hi[15][slot] = t113 + t114;\n    /* 16 */ lo[ 0][slot] = ((t113 - t114) * (costab16));\n\n    t115 = t73  + t74;\n    t116 = t75  + t76;\n\n    t32  = t115 + t116;\n\n    /*  1 */ hi[14][slot] = t32;\n\n    t118 = t78  + t79;\n    t119 = t80  + t81;\n\n    t58  = t118 + t119;\n\n    /*  2 */ hi[13][slot] = t58;\n\n    t121 = t83  + t84;\n    t122 = t85  + t86;\n\n    t67  = t121 + t122;\n\n    t49  = (t67 * 2) - t32;\n\n    /*  3 */ hi[12][slot] = t49;\n\n    t125 = t89  + t90;\n    t126 = t91  + t92;\n\n    t93  = t125 + t126;\n\n    /*  4 */ hi[11][slot] = t93;\n\n    t128 = t94  + t95;\n    t129 = t96  + t97;\n\n    t98  = t128 + t129;\n\n    t68  = (t98 * 2) - t49;\n\n    /*  5 */ hi[10][slot] = t68;\n\n    t132 = t100 + t101;\n    t133 = t102 + t103;\n\n    t104 = t132 + t133;\n\n    t82  = (t104 * 2) - t58;\n\n    /*  6 */ hi[ 9][slot] = t82;\n\n    t136 = t106 + t107;\n    t137 = t108 + t109;\n\n    t110 = t136 + t137;\n\n    t87  = (t110 * 2) - t67;\n\n    t77  = (t87 * 2) - t68;\n\n    /*  7 */ hi[ 8][slot] = t77;\n\n    t141 = ((t69 - t70) * (costab8));\n    t142 = ((t71 - t72) * (costab24));\n    t143 = t141 + t142;\n\n    /*  8 */ hi[ 7][slot] = t143;\n    /* 24 */ lo[ 8][slot] =\n        (((t141 - t142) * (costab16) * 2)) - t143;\n\n    t144 = ((t73 - t74) * (costab8));\n    t145 = ((t75 - t76) * (costab24));\n    t146 = t144 + t145;\n\n    t88  = (t146 * 2) - t77;\n\n    /*  9 */ hi[ 6][slot] = t88;\n\n    t148 = ((t78 - t79) * (costab8));\n    t149 = ((t80 - t81) * (costab24));\n    t150 = t148 + t149;\n\n    t105 = (t150 * 2) - t82;\n\n    /* 10 */ hi[ 5][slot] = t105;\n\n    t152 = ((t83 - t84) * (costab8));\n    t153 = ((t85 - t86) * (costab24));\n    t154 = t152 + t153;\n\n    t111 = (t154 * 2) - t87;\n\n    t99  = (t111 * 2) - t88;\n\n    /* 11 */ hi[ 4][slot] = t99;\n\n    t157 = ((t89 - t90) * (costab8));\n    t158 = ((t91 - t92) * (costab24));\n    t159 = t157 + t158;\n\n    t127 = (t159 * 2) - t93;\n\n    /* 12 */ hi[ 3][slot] = t127;\n\n    t160 = (((t125 - t126) * (costab16) * 2)) - t127;\n\n    /* 20 */ lo[ 4][slot] = t160;\n    /* 28 */ lo[12][slot] =\n        (((((t157 - t158) * (costab16) * 2) - t159) * 2)) - t160;\n\n    t161 = ((t94 - t95) * (costab8));\n    t162 = ((t96 - t97) * (costab24));\n    t163 = t161 + t162;\n\n    t130 = (t163 * 2) - t98;\n\n    t112 = (t130 * 2) - t99;\n\n    /* 13 */ hi[ 2][slot] = t112;\n\n    t164 = (((t128 - t129) * (costab16) * 2)) - t130;\n\n    t166 = ((t100 - t101) * (costab8));\n    t167 = ((t102 - t103) * (costab24));\n    t168 = t166 + t167;\n\n    t134 = (t168 * 2) - t104;\n\n    t120 = (t134 * 2) - t105;\n\n    /* 14 */ hi[ 1][slot] = t120;\n\n    t135 = (((t118 - t119) * (costab16) * 2)) - t120;\n\n    /* 18 */ lo[ 2][slot] = t135;\n\n    t169 = (((t132 - t133) * (costab16) * 2)) - t134;\n\n    t151 = (t169 * 2) - t135;\n\n    /* 22 */ lo[ 6][slot] = t151;\n\n    t170 = (((((t148 - t149) * (costab16) * 2) - t150) * 2)) - t151;\n\n    /* 26 */ lo[10][slot] = t170;\n    /* 30 */ lo[14][slot] =\n        (((((((t166 - t167) * (costab16)) * 2 -\n             t168) * 2) - t169) * 2) - t170);\n\n    t171 = ((t106 - t107) * (costab8));\n    t172 = ((t108 - t109) * (costab24));\n    t173 = t171 + t172;\n\n    t138 = (t173 * 2) - t110;\n    t123 = (t138 * 2) - t111;\n    t139 = (((t121 - t122) * (costab16) * 2)) - t123;\n    t117 = (t123 * 2) - t112;\n\n    /* 15 */ hi[ 0][slot] = t117;\n\n    t124 = (((t115 - t116) * (costab16) * 2)) - t117;\n\n    /* 17 */ lo[ 1][slot] = t124;\n\n    t131 = (t139 * 2) - t124;\n\n    /* 19 */ lo[ 3][slot] = t131;\n\n    t140 = (t164 * 2) - t131;\n\n    /* 21 */ lo[ 5][slot] = t140;\n\n    t174 = (((t136 - t137) * (costab16) * 2)) - t138;\n    t155 = (t174 * 2) - t139;\n    t147 = (t155 * 2) - t140;\n\n    /* 23 */ lo[ 7][slot] = t147;\n\n    t156 = (((((t144 - t145) * (costab16) * 2) - t146) * 2)) - t147;\n\n    /* 25 */ lo[ 9][slot] = t156;\n\n    t175 = (((((t152 - t153) * (costab16) * 2) - t154) * 2)) - t155;\n    t165 = (t175 * 2) - t156;\n\n    /* 27 */ lo[11][slot] = t165;\n\n    t176 = (((((((t161 - t162) * (costab16) * 2)) -\n               t163) * 2) - t164) * 2) - t165;\n\n    /* 29 */ lo[13][slot] = t176;\n    /* 31 */ lo[15][slot] =\n        (((((((((t171 - t172) * (costab16)) * 2 -\n               t173) * 2) - t174) * 2) - t175) * 2) - t176);\n\n    /*\n     * Totals:\n     *  80 multiplies\n     *  80 additions\n     * 119 subtractions\n     *  49 shifts (not counting SSO)\n     */\n};\n\n/*\n * These are the coefficients for the subband synthesis window. This is a\n * reordered version of Table B.3 from ISO/IEC 11172-3.\n */\nconst D = [\n    [  0.000000000,   /*  0 */\n       -0.000442505,\n       0.003250122,\n       -0.007003784,\n       0.031082153,\n       -0.078628540,\n       0.100311279,\n       -0.572036743,\n       1.144989014,\n       0.572036743,\n       0.100311279,\n       0.078628540,\n       0.031082153,\n       0.007003784,\n       0.003250122,\n       0.000442505,\n\n       0.000000000,\n       -0.000442505,\n       0.003250122,\n       -0.007003784,\n       0.031082153,\n       -0.078628540,\n       0.100311279,\n       -0.572036743,\n       1.144989014,\n       0.572036743,\n       0.100311279,\n       0.078628540,\n       0.031082153,\n       0.007003784,\n       0.003250122,\n       0.000442505 ],\n\n    [ -0.000015259,   /*  1 */\n      -0.000473022,\n      0.003326416,\n      -0.007919312,\n      0.030517578,\n      -0.084182739,\n      0.090927124,\n      -0.600219727,\n      1.144287109,\n      0.543823242,\n      0.108856201,\n      0.073059082,\n      0.031478882,\n      0.006118774,\n      0.003173828,\n      0.000396729,\n\n      -0.000015259,\n      -0.000473022,\n      0.003326416,\n      -0.007919312,\n      0.030517578,\n      -0.084182739,\n      0.090927124,\n      -0.600219727,\n      1.144287109,\n      0.543823242,\n      0.108856201,\n      0.073059082,\n      0.031478882,\n      0.006118774,\n      0.003173828,\n      0.000396729 ],\n\n    [ -0.000015259,   /*  2 */\n      -0.000534058,\n      0.003387451,\n      -0.008865356,\n      0.029785156,\n      -0.089706421,\n      0.080688477,\n      -0.628295898,\n      1.142211914,\n      0.515609741,\n      0.116577148,\n      0.067520142,\n      0.031738281,\n      0.005294800,\n      0.003082275,\n      0.000366211,\n\n      -0.000015259,\n      -0.000534058,\n      0.003387451,\n      -0.008865356,\n      0.029785156,\n      -0.089706421,\n      0.080688477,\n      -0.628295898,\n      1.142211914,\n      0.515609741,\n      0.116577148,\n      0.067520142,\n      0.031738281,\n      0.005294800,\n      0.003082275,\n      0.000366211 ],\n\n    [ -0.000015259,   /*  3 */\n      -0.000579834,\n      0.003433228,\n      -0.009841919,\n      0.028884888,\n      -0.095169067,\n      0.069595337,\n      -0.656219482,\n      1.138763428,\n      0.487472534,\n      0.123474121,\n      0.061996460,\n      0.031845093,\n      0.004486084,\n      0.002990723,\n      0.000320435,\n\n      -0.000015259,\n      -0.000579834,\n      0.003433228,\n      -0.009841919,\n      0.028884888,\n      -0.095169067,\n      0.069595337,\n      -0.656219482,\n      1.138763428,\n      0.487472534,\n      0.123474121,\n      0.061996460,\n      0.031845093,\n      0.004486084,\n      0.002990723,\n      0.000320435 ],\n\n    [ -0.000015259,   /*  4 */\n      -0.000625610,\n      0.003463745,\n      -0.010848999,\n      0.027801514,\n      -0.100540161,\n      0.057617187,\n      -0.683914185,\n      1.133926392,\n      0.459472656,\n      0.129577637,\n      0.056533813,\n      0.031814575,\n      0.003723145,\n      0.002899170,\n      0.000289917,\n\n      -0.000015259,\n      -0.000625610,\n      0.003463745,\n      -0.010848999,\n      0.027801514,\n      -0.100540161,\n      0.057617187,\n      -0.683914185,\n      1.133926392,\n      0.459472656,\n      0.129577637,\n      0.056533813,\n      0.031814575,\n      0.003723145,\n      0.002899170,\n      0.000289917 ],\n\n    [ -0.000015259,   /*  5 */\n      -0.000686646,\n      0.003479004,\n      -0.011886597,\n      0.026535034,\n      -0.105819702,\n      0.044784546,\n      -0.711318970,\n      1.127746582,\n      0.431655884,\n      0.134887695,\n      0.051132202,\n      0.031661987,\n      0.003005981,\n      0.002792358,\n      0.000259399,\n\n      -0.000015259,\n      -0.000686646,\n      0.003479004,\n      -0.011886597,\n      0.026535034,\n      -0.105819702,\n      0.044784546,\n      -0.711318970,\n      1.127746582,\n      0.431655884,\n      0.134887695,\n      0.051132202,\n      0.031661987,\n      0.003005981,\n      0.002792358,\n      0.000259399 ],\n\n    [ -0.000015259,   /*  6 */\n      -0.000747681,\n      0.003479004,\n      -0.012939453,\n      0.025085449,\n      -0.110946655,\n      0.031082153,\n      -0.738372803,\n      1.120223999,\n      0.404083252,\n      0.139450073,\n      0.045837402,\n      0.031387329,\n      0.002334595,\n      0.002685547,\n      0.000244141,\n\n      -0.000015259,\n      -0.000747681,\n      0.003479004,\n      -0.012939453,\n      0.025085449,\n      -0.110946655,\n      0.031082153,\n      -0.738372803,\n      1.120223999,\n      0.404083252,\n      0.139450073,\n      0.045837402,\n      0.031387329,\n      0.002334595,\n      0.002685547,\n      0.000244141 ],\n\n    [ -0.000030518,   /*  7 */\n      -0.000808716,\n      0.003463745,\n      -0.014022827,\n      0.023422241,\n      -0.115921021,\n      0.016510010,\n      -0.765029907,\n      1.111373901,\n      0.376800537,\n      0.143264771,\n      0.040634155,\n      0.031005859,\n      0.001693726,\n      0.002578735,\n      0.000213623,\n\n      -0.000030518,\n      -0.000808716,\n      0.003463745,\n      -0.014022827,\n      0.023422241,\n      -0.115921021,\n      0.016510010,\n      -0.765029907,\n      1.111373901,\n      0.376800537,\n      0.143264771,\n      0.040634155,\n      0.031005859,\n      0.001693726,\n      0.002578735,\n      0.000213623 ],\n\n    [ -0.000030518,   /*  8 */\n      -0.000885010,\n      0.003417969,\n      -0.015121460,\n      0.021575928,\n      -0.120697021,\n      0.001068115,\n      -0.791213989,\n      1.101211548,\n      0.349868774,\n      0.146362305,\n      0.035552979,\n      0.030532837,\n      0.001098633,\n      0.002456665,\n      0.000198364,\n\n      -0.000030518,\n      -0.000885010,\n      0.003417969,\n      -0.015121460,\n      0.021575928,\n      -0.120697021,\n      0.001068115,\n      -0.791213989,\n      1.101211548,\n      0.349868774,\n      0.146362305,\n      0.035552979,\n      0.030532837,\n      0.001098633,\n      0.002456665,\n      0.000198364 ],\n\n    [ -0.000030518,   /*  9 */\n      -0.000961304,\n      0.003372192,\n      -0.016235352,\n      0.019531250,\n      -0.125259399,\n      -0.015228271,\n      -0.816864014,\n      1.089782715,\n      0.323318481,\n      0.148773193,\n      0.030609131,\n      0.029937744,\n      0.000549316,\n      0.002349854,\n      0.000167847,\n\n      -0.000030518,\n      -0.000961304,\n      0.003372192,\n      -0.016235352,\n      0.019531250,\n      -0.125259399,\n      -0.015228271,\n      -0.816864014,\n      1.089782715,\n      0.323318481,\n      0.148773193,\n      0.030609131,\n      0.029937744,\n      0.000549316,\n      0.002349854,\n      0.000167847 ],\n\n    [ -0.000030518,   /* 10 */\n      -0.001037598,\n      0.003280640,\n      -0.017349243,\n      0.017257690,\n      -0.129562378,\n      -0.032379150,\n      -0.841949463,\n      1.077117920,\n      0.297210693,\n      0.150497437,\n      0.025817871,\n      0.029281616,\n      0.000030518,\n      0.002243042,\n      0.000152588,\n\n      -0.000030518,\n      -0.001037598,\n      0.003280640,\n      -0.017349243,\n      0.017257690,\n      -0.129562378,\n      -0.032379150,\n      -0.841949463,\n      1.077117920,\n      0.297210693,\n      0.150497437,\n      0.025817871,\n      0.029281616,\n      0.000030518,\n      0.002243042,\n      0.000152588 ],\n\n    [ -0.000045776,   /* 11 */\n      -0.001113892,\n      0.003173828,\n      -0.018463135,\n      0.014801025,\n      -0.133590698,\n      -0.050354004,\n      -0.866363525,\n      1.063217163,\n      0.271591187,\n      0.151596069,\n      0.021179199,\n      0.028533936,\n      -0.000442505,\n      0.002120972,\n      0.000137329,\n\n      -0.000045776,\n      -0.001113892,\n      0.003173828,\n      -0.018463135,\n      0.014801025,\n      -0.133590698,\n      -0.050354004,\n      -0.866363525,\n      1.063217163,\n      0.271591187,\n      0.151596069,\n      0.021179199,\n      0.028533936,\n      -0.000442505,\n      0.002120972,\n      0.000137329 ],\n\n    [ -0.000045776,   /* 12 */\n      -0.001205444,\n      0.003051758,\n      -0.019577026,\n      0.012115479,\n      -0.137298584,\n      -0.069168091,\n      -0.890090942,\n      1.048156738,\n      0.246505737,\n      0.152069092,\n      0.016708374,\n      0.027725220,\n      -0.000869751,\n      0.002014160,\n      0.000122070,\n\n      -0.000045776,\n      -0.001205444,\n      0.003051758,\n      -0.019577026,\n      0.012115479,\n      -0.137298584,\n      -0.069168091,\n      -0.890090942,\n      1.048156738,\n      0.246505737,\n      0.152069092,\n      0.016708374,\n      0.027725220,\n      -0.000869751,\n      0.002014160,\n      0.000122070 ],\n\n    [ -0.000061035,   /* 13 */\n      -0.001296997,\n      0.002883911,\n      -0.020690918,\n      0.009231567,\n      -0.140670776,\n      -0.088775635,\n      -0.913055420,\n      1.031936646,\n      0.221984863,\n      0.151962280,\n      0.012420654,\n      0.026840210,\n      -0.001266479,\n      0.001907349,\n      0.000106812,\n\n      -0.000061035,\n      -0.001296997,\n      0.002883911,\n      -0.020690918,\n      0.009231567,\n      -0.140670776,\n      -0.088775635,\n      -0.913055420,\n      1.031936646,\n      0.221984863,\n      0.151962280,\n      0.012420654,\n      0.026840210,\n      -0.001266479,\n      0.001907349,\n      0.000106812 ],\n\n    [ -0.000061035,   /* 14 */\n      -0.001388550,\n      0.002700806,\n      -0.021789551,\n      0.006134033,\n      -0.143676758,\n      -0.109161377,\n      -0.935195923,\n      1.014617920,\n      0.198059082,\n      0.151306152,\n      0.008316040,\n      0.025909424,\n      -0.001617432,\n      0.001785278,\n      0.000106812,\n\n      -0.000061035,\n      -0.001388550,\n      0.002700806,\n      -0.021789551,\n      0.006134033,\n      -0.143676758,\n      -0.109161377,\n      -0.935195923,\n      1.014617920,\n      0.198059082,\n      0.151306152,\n      0.008316040,\n      0.025909424,\n      -0.001617432,\n      0.001785278,\n      0.000106812 ],\n\n    [ -0.000076294,   /* 15 */\n      -0.001480103,\n      0.002487183,\n      -0.022857666,\n      0.002822876,\n      -0.146255493,\n      -0.130310059,\n      -0.956481934,\n      0.996246338,\n      0.174789429,\n      0.150115967,\n      0.004394531,\n      0.024932861,\n      -0.001937866,\n      0.001693726,\n      0.000091553,\n\n      -0.000076294,\n      -0.001480103,\n      0.002487183,\n      -0.022857666,\n      0.002822876,\n      -0.146255493,\n      -0.130310059,\n      -0.956481934,\n      0.996246338,\n      0.174789429,\n      0.150115967,\n      0.004394531,\n      0.024932861,\n      -0.001937866,\n      0.001693726,\n      0.000091553 ],\n\n    [ -0.000076294,   /* 16 */\n      -0.001586914,\n      0.002227783,\n      -0.023910522,\n      -0.000686646,\n      -0.148422241,\n      -0.152206421,\n      -0.976852417,\n      0.976852417,\n      0.152206421,\n      0.148422241,\n      0.000686646,\n      0.023910522,\n      -0.002227783,\n      0.001586914,\n      0.000076294,\n\n      -0.000076294,\n      -0.001586914,\n      0.002227783,\n      -0.023910522,\n      -0.000686646,\n      -0.148422241,\n      -0.152206421,\n      -0.976852417,\n      0.976852417,\n      0.152206421,\n      0.148422241,\n      0.000686646,\n      0.023910522,\n      -0.002227783,\n      0.001586914,\n      0.000076294 ]\n];\n\n/*\n * perform full frequency PCM synthesis\n */\nMP3Synth.prototype.full = function(frame, nch, ns) {\n    var Dptr, hi, lo, ptr;\n    \n    for (var ch = 0; ch < nch; ++ch) {\n        var sbsample = frame.sbsample[ch];\n        var filter  = this.filter[ch];\n        var phase   = this.phase;\n        var pcm     = this.pcm.samples[ch];\n        var pcm1Ptr = 0;\n        var pcm2Ptr = 0;\n\n        for (var s = 0; s < ns; ++s) {\n            MP3Synth.dct32(sbsample[s], phase >> 1, filter[0][phase & 1], filter[1][phase & 1]);\n\n            var pe = phase & ~1;\n            var po = ((phase - 1) & 0xf) | 1;\n\n            /* calculate 32 samples */\n            var fe = filter[0][ phase & 1];\n            var fx = filter[0][~phase & 1];\n            var fo = filter[1][~phase & 1];\n\n            var fePtr = 0;\n            var fxPtr = 0;\n            var foPtr = 0;\n            \n            Dptr = 0;\n\n            ptr = D[Dptr];\n            _fx = fx[fxPtr];\n            _fe = fe[fePtr];\n\n            lo =  _fx[0] * ptr[po +  0];\n            lo += _fx[1] * ptr[po + 14];\n            lo += _fx[2] * ptr[po + 12];\n            lo += _fx[3] * ptr[po + 10];\n            lo += _fx[4] * ptr[po +  8];\n            lo += _fx[5] * ptr[po +  6];\n            lo += _fx[6] * ptr[po +  4];\n            lo += _fx[7] * ptr[po +  2];\n            lo = -lo;                      \n            \n            lo += _fe[0] * ptr[pe +  0];\n            lo += _fe[1] * ptr[pe + 14];\n            lo += _fe[2] * ptr[pe + 12];\n            lo += _fe[3] * ptr[pe + 10];\n            lo += _fe[4] * ptr[pe +  8];\n            lo += _fe[5] * ptr[pe +  6];\n            lo += _fe[6] * ptr[pe +  4];\n            lo += _fe[7] * ptr[pe +  2];\n\n            pcm[pcm1Ptr++] = lo;\n            pcm2Ptr = pcm1Ptr + 30;\n\n            for (var sb = 1; sb < 16; ++sb) {\n                ++fePtr;\n                ++Dptr;\n\n                /* D[32 - sb][i] === -D[sb][31 - i] */\n\n                ptr = D[Dptr];\n                _fo = fo[foPtr];\n                _fe = fe[fePtr];\n\n                lo  = _fo[0] * ptr[po +  0];\n                lo += _fo[1] * ptr[po + 14];\n                lo += _fo[2] * ptr[po + 12];\n                lo += _fo[3] * ptr[po + 10];\n                lo += _fo[4] * ptr[po +  8];\n                lo += _fo[5] * ptr[po +  6];\n                lo += _fo[6] * ptr[po +  4];\n                lo += _fo[7] * ptr[po +  2];\n                lo = -lo;\n\n                lo += _fe[7] * ptr[pe + 2];\n                lo += _fe[6] * ptr[pe + 4];\n                lo += _fe[5] * ptr[pe + 6];\n                lo += _fe[4] * ptr[pe + 8];\n                lo += _fe[3] * ptr[pe + 10];\n                lo += _fe[2] * ptr[pe + 12];\n                lo += _fe[1] * ptr[pe + 14];\n                lo += _fe[0] * ptr[pe + 0];\n\n                pcm[pcm1Ptr++] = lo;\n\n                lo =  _fe[0] * ptr[-pe + 31 - 16];\n                lo += _fe[1] * ptr[-pe + 31 - 14];\n                lo += _fe[2] * ptr[-pe + 31 - 12];\n                lo += _fe[3] * ptr[-pe + 31 - 10];\n                lo += _fe[4] * ptr[-pe + 31 -  8];\n                lo += _fe[5] * ptr[-pe + 31 -  6];\n                lo += _fe[6] * ptr[-pe + 31 -  4];\n                lo += _fe[7] * ptr[-pe + 31 -  2];\n\n                lo += _fo[7] * ptr[-po + 31 -  2];\n                lo += _fo[6] * ptr[-po + 31 -  4];\n                lo += _fo[5] * ptr[-po + 31 -  6];\n                lo += _fo[4] * ptr[-po + 31 -  8];\n                lo += _fo[3] * ptr[-po + 31 - 10];\n                lo += _fo[2] * ptr[-po + 31 - 12];\n                lo += _fo[1] * ptr[-po + 31 - 14];\n                lo += _fo[0] * ptr[-po + 31 - 16];\n\n                pcm[pcm2Ptr--] = lo;\n                ++foPtr;\n            }\n\n            ++Dptr;\n\n            ptr = D[Dptr];\n            _fo = fo[foPtr];\n\n            lo  = _fo[0] * ptr[po +  0];\n            lo += _fo[1] * ptr[po + 14];\n            lo += _fo[2] * ptr[po + 12];\n            lo += _fo[3] * ptr[po + 10];\n            lo += _fo[4] * ptr[po +  8];\n            lo += _fo[5] * ptr[po +  6];\n            lo += _fo[6] * ptr[po +  4];\n            lo += _fo[7] * ptr[po +  2];\n\n            pcm[pcm1Ptr] = -lo;\n            pcm1Ptr += 16;\n            phase = (phase + 1) % 16;\n        }\n    }\n};\n\n// TODO: synth.half()\n\n/*\n * NAME:    synth.frame()\n * DESCRIPTION: perform PCM synthesis of frame subband samples\n */\nMP3Synth.prototype.frame = function (frame) {\n    var nch = frame.header.nchannels();\n    var ns  = frame.header.nbsamples();\n\n    this.pcm.samplerate = frame.header.samplerate;\n    this.pcm.channels   = nch;\n    this.pcm.length     = 32 * ns;\n\n    /*\n     if (frame.options & Mad.Option.HALFSAMPLERATE) {\n     this.pcm.samplerate /= 2;\n     this.pcm.length     /= 2;\n\n     throw new Error(\"HALFSAMPLERATE is not supported. What do you think? As if I have the time for this\");\n     }\n     */\n\n    this.full(frame, nch, ns);\n    this.phase = (this.phase + ns) % 16;\n};\n\nmodule.exports = MP3Synth;\n",
39    "/*\n * These are the scalefactor values for Layer I and Layer II.\n * The values are from Table B.1 of ISO/IEC 11172-3.\n *\n * Strictly speaking, Table B.1 has only 63 entries (0-62), thus a strict\n * interpretation of ISO/IEC 11172-3 would suggest that a scalefactor index of\n * 63 is invalid. However, for better compatibility with current practices, we\n * add a 64th entry.\n */\nexports.SF_TABLE = new Float32Array([\n    2.000000000000, 1.587401051968, 1.259921049895, 1.000000000000, \n    0.793700525984, 0.629960524947, 0.500000000000, 0.396850262992,\n    0.314980262474, 0.250000000000, 0.198425131496, 0.157490131237,\n    0.125000000000, 0.099212565748, 0.078745065618, 0.062500000000,\n    0.049606282874, 0.039372532809, 0.031250000000, 0.024803141437,\n    0.019686266405, 0.015625000000, 0.012401570719, 0.009843133202,\n    0.007812500000, 0.006200785359, 0.004921566601, 0.003906250000,\n    0.003100392680, 0.002460783301, 0.001953125000, 0.001550196340,\n    0.001230391650, 0.000976562500, 0.000775098170, 0.000615195825,\n    0.000488281250, 0.000387549085, 0.000307597913, 0.000244140625,\n    0.000193774542, 0.000153798956, 0.000122070313, 0.000096887271,\n    0.000076899478, 0.000061035156, 0.000048443636, 0.000038449739,\n    0.000030517578, 0.000024221818, 0.000019224870, 0.000015258789,\n    0.000012110909, 0.000009612435, 0.000007629395, 0.000006055454,\n    0.000004806217, 0.000003814697, 0.000003027727, 0.000002403109,\n    0.000001907349, 0.000001513864, 0.000001201554, 0.000000000000\n]);\n\n/*\n * MPEG-1 scalefactor band widths\n * derived from Table B.8 of ISO/IEC 11172-3\n */\nconst SFB_48000_LONG = new Uint8Array([\n    4,  4,  4,  4,  4,  4,  6,  6,  6,   8,  10,\n    12, 16, 18, 22, 28, 34, 40, 46, 54,  54, 192\n]);\n\nconst SFB_44100_LONG = new Uint8Array([\n    4,  4,  4,  4,  4,  4,  6,  6,  8,   8,  10,\n    12, 16, 20, 24, 28, 34, 42, 50, 54,  76, 158\n]);\n\nconst SFB_32000_LONG = new Uint8Array([\n    4,  4,  4,  4,  4,  4,  6,  6,  8,  10,  12,\n    16, 20, 24, 30, 38, 46, 56, 68, 84, 102,  26\n]);\n\nconst SFB_48000_SHORT = new Uint8Array([\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,\n    6,  6,  6,  6,  6, 10, 10, 10, 12, 12, 12, 14, 14,\n    14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66\n]);\n\nconst SFB_44100_SHORT = new Uint8Array([\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,\n    6,  6,  8,  8,  8, 10, 10, 10, 12, 12, 12, 14, 14,\n    14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56\n]);\n\nconst SFB_32000_SHORT = new Uint8Array([\n    4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  6,\n    6,  6,  8,  8,  8, 12, 12, 12, 16, 16, 16, 20, 20,\n    20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12\n]);\n\nconst SFB_48000_MIXED = new Uint8Array([\n    /* long */   4,  4,  4,  4,  4,  4,  6,  6,\n    /* short */  4,  4,  4,  6,  6,  6,  6,  6,  6, 10,\n    10, 10, 12, 12, 12, 14, 14, 14, 16, 16,\n    16, 20, 20, 20, 26, 26, 26, 66, 66, 66\n]);\n\nconst SFB_44100_MIXED = new Uint8Array([\n    /* long */   4,  4,  4,  4,  4,  4,  6,  6,\n    /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 10,\n    10, 10, 12, 12, 12, 14, 14, 14, 18, 18,\n    18, 22, 22, 22, 30, 30, 30, 56, 56, 56\n]);\n\nconst SFB_32000_MIXED = new Uint8Array([\n    /* long */   4,  4,  4,  4,  4,  4,  6,  6,\n    /* short */  4,  4,  4,  6,  6,  6,  8,  8,  8, 12,\n    12, 12, 16, 16, 16, 20, 20, 20, 26, 26,\n    26, 34, 34, 34, 42, 42, 42, 12, 12, 12\n]);\n\n/*\n * MPEG-2 scalefactor band widths\n * derived from Table B.2 of ISO/IEC 13818-3\n */\nconst SFB_24000_LONG = new Uint8Array([\n    6,  6,  6,  6,  6,  6,  8, 10, 12,  14,  16,\n   18, 22, 26, 32, 38, 46, 54, 62, 70,  76,  36\n]);\n\nconst SFB_22050_LONG = new Uint8Array([\n    6,  6,  6,  6,  6,  6,  8, 10, 12,  14,  16,\n   20, 24, 28, 32, 38, 46, 52, 60, 68,  58,  54\n]);\n\nconst SFB_16000_LONG = SFB_22050_LONG;\n\nconst SFB_24000_SHORT = new Uint8Array([\n   4,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,  8,\n   8,  8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,\n  18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12\n]);\n\nconst SFB_22050_SHORT = new Uint8Array([\n   4,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,  6,\n   6,  6,  8,  8,  8, 10, 10, 10, 14, 14, 14, 18, 18,\n  18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18\n]);\n\nconst SFB_16000_SHORT = new Uint8Array([\n   4,  4,  4,  4,  4,  4,  4,  4,  4,  6,  6,  6,  8,\n   8,  8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,\n  18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18\n]);\n\nconst SFB_24000_MIXED = new Uint8Array([\n  /* long */   6,  6,  6,  6,  6,  6,\n  /* short */  6,  6,  6,  8,  8,  8, 10, 10, 10, 12,\n              12, 12, 14, 14, 14, 18, 18, 18, 24, 24,\n              24, 32, 32, 32, 44, 44, 44, 12, 12, 12\n]);\n\nconst SFB_22050_MIXED = new Uint8Array([\n  /* long */   6,  6,  6,  6,  6,  6,\n  /* short */  6,  6,  6,  6,  6,  6,  8,  8,  8, 10,\n              10, 10, 14, 14, 14, 18, 18, 18, 26, 26,\n              26, 32, 32, 32, 42, 42, 42, 18, 18, 18\n]);\n\nconst SFB_16000_MIXED = new Uint8Array([\n  /* long */   6,  6,  6,  6,  6,  6,\n  /* short */  6,  6,  6,  8,  8,  8, 10, 10, 10, 12,\n              12, 12, 14, 14, 14, 18, 18, 18, 24, 24,\n              24, 30, 30, 30, 40, 40, 40, 18, 18, 18\n]);\n\n/*\n * MPEG 2.5 scalefactor band widths\n * derived from public sources\n */\nconst SFB_12000_LONG = SFB_16000_LONG;\nconst SFB_11025_LONG = SFB_12000_LONG;\n\nconst SFB_8000_LONG = new Uint8Array([\n  12, 12, 12, 12, 12, 12, 16, 20, 24,  28,  32,\n  40, 48, 56, 64, 76, 90,  2,  2,  2,   2,   2\n]);\n\nconst SFB_12000_SHORT = SFB_16000_SHORT;\nconst SFB_11025_SHORT = SFB_12000_SHORT;\n\nconst SFB_8000_SHORT = new Uint8Array([\n   8,  8,  8,  8,  8,  8,  8,  8,  8, 12, 12, 12, 16,\n  16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36,\n  36,  2,  2,  2,  2,  2,  2,  2,  2,  2, 26, 26, 26\n]);\n\nconst SFB_12000_MIXED = SFB_16000_MIXED;\nconst SFB_11025_MIXED = SFB_12000_MIXED;\n\n/* the 8000 Hz short block scalefactor bands do not break after\n   the first 36 frequency lines, so this is probably wrong */\nconst SFB_8000_MIXED = new Uint8Array([\n  /* long */  12, 12, 12,\n  /* short */  4,  4,  4,  8,  8,  8, 12, 12, 12, 16, 16, 16,\n              20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36,\n               2,  2,  2,  2,  2,  2,  2,  2,  2, 26, 26, 26\n]);\n\nexports.SFBWIDTH_TABLE = [\n    { l: SFB_48000_LONG, s: SFB_48000_SHORT, m: SFB_48000_MIXED },\n    { l: SFB_44100_LONG, s: SFB_44100_SHORT, m: SFB_44100_MIXED },\n    { l: SFB_32000_LONG, s: SFB_32000_SHORT, m: SFB_32000_MIXED },\n    { l: SFB_24000_LONG, s: SFB_24000_SHORT, m: SFB_24000_MIXED },\n    { l: SFB_22050_LONG, s: SFB_22050_SHORT, m: SFB_22050_MIXED },\n    { l: SFB_16000_LONG, s: SFB_16000_SHORT, m: SFB_16000_MIXED },\n    { l: SFB_12000_LONG, s: SFB_12000_SHORT, m: SFB_12000_MIXED },\n    { l: SFB_11025_LONG, s: SFB_11025_SHORT, m: SFB_11025_MIXED },\n    { l:  SFB_8000_LONG, s:  SFB_8000_SHORT, m:  SFB_8000_MIXED }\n];\n\nexports.PRETAB = new Uint8Array([\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0\n]);\n\n/*\n * fractional powers of two\n * used for requantization and joint stereo decoding\n *\n * ROOT_TABLE[3 + x] = 2^(x/4)\n */\nexports.ROOT_TABLE = new Float32Array([\n    /* 2^(-3/4) */ 0.59460355750136,\n    /* 2^(-2/4) */ 0.70710678118655,\n    /* 2^(-1/4) */ 0.84089641525371,\n    /* 2^( 0/4) */ 1.00000000000000,\n    /* 2^(+1/4) */ 1.18920711500272,\n    /* 2^(+2/4) */ 1.41421356237310,\n    /* 2^(+3/4) */ 1.68179283050743\n]);\n\nexports.CS = new Float32Array([\n    +0.857492926 , +0.881741997,\n    +0.949628649 , +0.983314592,\n    +0.995517816 , +0.999160558,\n    +0.999899195 , +0.999993155\n]);\n\nexports.CA = new Float32Array([\n    -0.514495755, -0.471731969,\n    -0.313377454, -0.181913200,\n    -0.094574193, -0.040965583,\n    -0.014198569, -0.003699975\n]);\n\nexports.COUNT1TABLE_SELECT = 0x01;\nexports.SCALEFAC_SCALE     = 0x02;\nexports.PREFLAG            = 0x04;\nexports.MIXED_BLOCK_FLAG   = 0x08;\n\nexports.I_STEREO  = 0x1;\nexports.MS_STEREO = 0x2;\n\n/*\n * windowing coefficients for long blocks\n * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3\n *\n * WINDOW_L[i] = sin((PI / 36) * (i + 1/2))\n */\nexports.WINDOW_L = new Float32Array([\n    0.043619387, 0.130526192,\n    0.216439614, 0.300705800,\n    0.382683432, 0.461748613,\n    0.537299608, 0.608761429,\n    0.675590208, 0.737277337,\n    0.793353340, 0.843391446,\n\n    0.887010833, 0.923879533,\n    0.953716951, 0.976296007,\n    0.991444861, 0.999048222,\n    0.999048222, 0.991444861,\n    0.976296007, 0.953716951,\n    0.923879533, 0.887010833,\n\n    0.843391446, 0.793353340,\n    0.737277337, 0.675590208,\n    0.608761429, 0.537299608,\n    0.461748613, 0.382683432,\n    0.300705800, 0.216439614,\n    0.130526192, 0.043619387\n]);\n\n/*\n * windowing coefficients for short blocks\n * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3\n *\n * WINDOW_S[i] = sin((PI / 12) * (i + 1/2))\n */\nexports.WINDOW_S = new Float32Array([\n    0.130526192, 0.382683432,\n    0.608761429, 0.793353340,\n    0.923879533, 0.991444861,\n    0.991444861, 0.923879533,\n    0.793353340, 0.608761429,\n    0.382683432, 0.130526192\n]);\n\n/*\n * coefficients for intensity stereo processing\n * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3\n *\n * is_ratio[i] = tan(i * (PI / 12))\n * IS_TABLE[i] = is_ratio[i] / (1 + is_ratio[i])\n */\nexports.IS_TABLE = new Float32Array([\n    0.000000000,\n    0.211324865,\n    0.366025404,\n    0.500000000,\n    0.633974596,\n    0.788675135,\n    1.000000000\n]);\n\n/*\n * coefficients for LSF intensity stereo processing\n * derived from section 2.4.3.2 of ISO/IEC 13818-3\n *\n * IS_LSF_TABLE[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)\n * IS_LSF_TABLE[1][i] = (1 /      sqrt(2)) ^(i + 1)\n */\nexports.IS_LSF_TABLE = [\n    new Float32Array([\n        0.840896415,\n        0.707106781,\n        0.594603558,\n        0.500000000,\n        0.420448208,\n        0.353553391,\n        0.297301779,\n        0.250000000,\n        0.210224104,\n        0.176776695,\n        0.148650889,\n        0.125000000,\n        0.105112052,\n        0.088388348,\n        0.074325445\n    ]), \n    new Float32Array([\n        0.707106781,\n        0.500000000,\n        0.353553391,\n        0.250000000,\n        0.176776695,\n        0.125000000,\n        0.088388348,\n        0.062500000,\n        0.044194174,\n        0.031250000,\n        0.022097087,\n        0.015625000,\n        0.011048543,\n        0.007812500,\n        0.005524272\n    ])\n];\n\n/*\n * scalefactor bit lengths\n * derived from section 2.4.2.7 of ISO/IEC 11172-3\n */\nexports.SFLEN_TABLE = [\n    { slen1: 0, slen2: 0 }, { slen1: 0, slen2: 1 }, { slen1: 0, slen2: 2 }, { slen1: 0, slen2: 3 },\n    { slen1: 3, slen2: 0 }, { slen1: 1, slen2: 1 }, { slen1: 1, slen2: 2 }, { slen1: 1, slen2: 3 },\n    { slen1: 2, slen2: 1 }, { slen1: 2, slen2: 2 }, { slen1: 2, slen2: 3 }, { slen1: 3, slen2: 1 },\n    { slen1: 3, slen2: 2 }, { slen1: 3, slen2: 3 }, { slen1: 4, slen2: 2 }, { slen1: 4, slen2: 3 }    \n];\n\n/*\n * number of LSF scalefactor band values\n * derived from section 2.4.3.2 of ISO/IEC 13818-3\n */\nexports.NSFB_TABLE = [\n    [ [  6,  5,  5, 5 ],\n      [  9,  9,  9, 9 ],\n      [  6,  9,  9, 9 ] ],\n\n    [ [  6,  5,  7, 3 ],\n      [  9,  9, 12, 6 ],\n      [  6,  9, 12, 6 ] ],\n\n    [ [ 11, 10,  0, 0 ],\n      [ 18, 18,  0, 0 ],\n      [ 15, 18,  0, 0 ] ],\n\n    [ [  7,  7,  7, 0 ],\n      [ 12, 12, 12, 0 ],\n      [  6, 15, 12, 0 ] ],\n\n    [ [  6,  6,  6, 3 ],\n      [ 12,  9,  9, 6 ],\n      [  6, 12,  9, 6 ] ],\n\n    [ [  8,  8,  5, 0 ],\n      [ 15, 12,  9, 0 ],\n      [  6, 18,  9, 0 ] ]\n];\n ",
40    "/**\n * Makes a multidimensional array\n */\nexports.makeArray = function(lengths, Type) {\n    if (!Type) Type = Float64Array;\n    \n    if (lengths.length === 1) {\n        return new Type(lengths[0]);\n    }\n    \n    var ret = [],\n        len = lengths[0];\n        \n    for (var j = 0; j < len; j++) {\n        ret[j] = exports.makeArray(lengths.slice(1), Type);\n    }\n    \n    return ret;\n};\n"
41  ],
42  "sourceRoot": ""
43}