Home | History | Annotate | Download | only in octane
      1 // Portions copyright 2012 Google, Inc.
      2 // Portions copyright 2011 Mozilla Foundation. All rights reserved.
      3 
      4 // This program is free software; you can redistribute it and/or modify
      5 // it under the terms of the GNU General Public License as published by
      6 // the Free Software Foundation; either version 2 of the License, or
      7 // (at your option) any later version.
      8 //
      9 // This program is distributed in the hope that it will be useful,
     10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 // GNU General Public License for more details.
     13 //
     14 // You should have received a copy of the GNU General Public License
     15 // along with this program; if not, write to the Free Software
     16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     17 
     18 // The PDF-JS code in this file has been written by Mozilla.
     19 // It is available in its latest version from:
     20 //
     21 //   https://github.com/mozilla/pdf.js
     22 
     23 
     24 //////// Benchmark set-up. (c) by Google. ////////
     25 
     26 var pdf_file = "test.pdf";
     27 var canvas_logs = [];
     28 
     29 var PdfJS = new BenchmarkSuite("PdfJS", 9000000, [
     30   new Benchmark("PdfJS", runPdfJS, setupPdfJS, tearDownPdfJS, 4)
     31 ]);
     32 
     33 function setupPdfJS() {
     34   // Check for Typed Arrays support, throw error if not.
     35   if (!(typeof Uint8Array != "undefined" &&
     36     typeof Float64Array != "undefined" &&
     37     typeof (new Uint8Array(0)).subarray != "undefined")) {
     38       throw "TypedArrayUnsupported";
     39     }
     40 
     41   PdfJS_window.__resources__[pdf_file] = buffer(PdfJS_window.atob(getPDF()));
     42 }
     43 
     44 function runPdfJS() {
     45   PDFJS.getDocument(pdf_file).then(function(pdf) {
     46     var canvas = PdfJS_window.document.getElementById('canvas');
     47     var context = canvas.getContext('2d');
     48     var renderContext = {canvasContext: context};
     49     canvas_logs.push(context.__log__);
     50 
     51     // Cycle through all pages.
     52     function renderPages(i, j) {
     53       if (i > j) return;
     54       context.clearRect(0, 0, canvas.width, canvas.height);
     55       pdf.getPage(i).then(function(page) {
     56         renderContext.viewport = page.getViewport(1);
     57         canvas.height = renderContext.viewport.height;
     58         canvas.width = renderContext.viewport.width;
     59         page.render(renderContext).then(renderPages.bind(null, i + 1, j));
     60       });
     61     }
     62     renderPages(1, pdf.numPages);
     63   });
     64 
     65   // Wait for everything to complete.
     66   PdfJS_window.flushTimeouts();
     67 }
     68 
     69 function tearDownPdfJS() {
     70   // Should produce 36788 939524096 for all runs.
     71   for (var i = 0; i < canvas_logs.length; ++i) {
     72     var log_length = canvas_logs[i].length;
     73     var log_hash = hash(canvas_logs[i].join(" "));
     74     var expected_length = 36788;
     75     var expected_hash = 939524096;
     76     if (log_length !== expected_length || log_hash !== expected_hash) {
     77       var message = "PdfJS produced incorrect output: " +
     78           "expected " + expected_length + " " + expected_hash + ", " +
     79           "got " + log_length + " " + log_hash;
     80       console.log(message + "\n");
     81       throw message;
     82     }
     83   }
     84   // Allow GC of global state.
     85   delete this.PDFJS;
     86   delete this.PdfJS_window;
     87 }
     88 
     89 function buffer(s) {
     90   var b = new ArrayBuffer(s.length);
     91   var a = new Uint8Array(b);
     92   for (var i = 0; i < s.length; ++i) a[i] = s.charCodeAt(i);
     93   return b;
     94 }
     95 
     96 function hash(s) {
     97   var up = Math.floor((s.length + 3) / 4);
     98   var h = 0;
     99   for (var i = 0; 4*i - 3 < s.length; i += 4) {
    100     for (var j = 0; j < 4 && i + j < s.length; ++j)
    101       h = (h + s.charCodeAt(i + j) << (8*j)) | 0;
    102   }
    103   return h;
    104 }
    105 
    106 
    107 ///////// Mocks of relevant browser functionality. (c) by Google. ////////
    108 
    109 // Every acces to window will be redirected to PdfJS_window.
    110 var PdfJS_window = Object.create(this);
    111 
    112 function PdfJS_windowInstall(name, x) {
    113   Object.defineProperty(PdfJS_window, name, {value: x});
    114 }
    115 
    116 PdfJS_windowInstall("setTimeout", function(cmd, delay) {
    117   PdfJS_window.__timeouts__.push(cmd);
    118 });
    119 
    120 PdfJS_windowInstall("flushTimeouts", function() {
    121   while (PdfJS_window.__timeouts__.length != 0) {
    122     var next = PdfJS_window.__timeouts__.pop();
    123     if (typeof next === "function")
    124       next({data: "{}"});
    125     else
    126       eval(next);
    127   }
    128 });
    129 
    130 PdfJS_windowInstall("window", PdfJS_window);
    131 
    132 PdfJS_window.__timeouts__ = [];
    133 PdfJS_window.__resources__ = {};
    134 
    135 
    136 // Base64 encoding/decoding is based on code by Grant Galitz.
    137 PdfJS_window.__to64__ = [
    138   "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
    139   "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
    140   "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
    141   "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
    142   "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/", "="
    143 ];
    144 
    145 PdfJS_windowInstall("btoa", function(data) {
    146   var result = "";
    147   if (data.length > 0) {
    148     var i = 0;
    149     while (i < data.length) {
    150       var b1 = data.charCodeAt(i++) & 0xff;
    151       var b2 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff;
    152       var b3 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff;
    153       result += PdfJS_window.__to64__[b1 >> 2];
    154       if (i === data.length + 2) {
    155         result += PdfJS_window.__to64__[(b1 & 0x3) << 4] + "==";
    156       } else {
    157         result += PdfJS_window.__to64__[((b1 & 0x3) << 4) | (b2 >> 4)];
    158         if (i === data.length + 1) {
    159           result += PdfJS_window.__to64__[(b2 & 0xF) << 2] + "=";
    160         } else {
    161           result += PdfJS_window.__to64__[((b2 & 0xF) << 2) | (b3 >> 6)] +
    162 	      PdfJS_window.__to64__[b3 & 0x3F];
    163         }
    164       }
    165     }
    166   }
    167   return result;
    168 });
    169 
    170 PdfJS_window.__from64__ =
    171   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    172 
    173 PdfJS_windowInstall("atob", function(data) {
    174   var result = "";
    175   var i = 0;
    176   while (i < data.length) {
    177     var x1 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
    178     var x2 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
    179     var x3 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
    180     var x4 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
    181     result += String.fromCharCode((x1 << 2) | (x2 >> 4));
    182     if (x3 != 0x40) {
    183        result += String.fromCharCode(((x2 & 0x0F) << 4) | (x3 >> 2));
    184        if (x4 != 0x40) {
    185          result += String.fromCharCode(((x3 & 0x03) << 6) | x4);
    186       }
    187     }
    188   }
    189   return result;
    190 });
    191 
    192 
    193 PdfJS_windowInstall("XMLHttpRequest", function() {
    194   this.open = function(type, url, some_bool) {
    195     this.url = url;
    196   }
    197   this.overrideMimeType = function() {}
    198   this.send = function() {
    199     this.response = PdfJS_window.__resources__[this.url];
    200     this.readyState = 4;
    201     this.status = 0;
    202     this.onreadystatechange();
    203   }
    204 });
    205 
    206 PdfJS_windowInstall("console", this.console ? this.console : {
    207   log: function(s) {
    208     // To verify that the test produces the right results,
    209     // uncomment this code.
    210     /*
    211     var re = new RegExp("%d", "g");
    212     var args = arguments;
    213     var i = 0;
    214     print(s.replace(re, function() { return args[++i] }));
    215     */
    216   }
    217 });
    218 
    219 PdfJS_windowInstall("location", {
    220   protocol: ""
    221 });
    222 
    223 PdfJS_windowInstall("Event", function() {
    224   this.initEvent = function(name) {
    225     this.name = name;
    226   }
    227 });
    228 
    229 PdfJS_windowInstall("Element", function(type) {
    230   this.__listeners__ = {};
    231   this.element_type = type;
    232   this.insertBefore = function() {};
    233   this.addEventListener = function(name, listener) {
    234     this.__listeners__[name] = listener;
    235   };
    236   this.removeEventListener = function(name) {
    237     delete this.__listeners__[name];
    238   };
    239   this.dispatchEvent = function(event) {
    240     this.__listeners__[event.name](event)
    241   };
    242   this.getElementsByTagName = function(name) {
    243     if (name === "head") {
    244       return [{appendChild: function() {}}]
    245     }
    246   };
    247   this.appendChild = function() {};
    248   this.setAttribute = function() {};
    249   this.sheet = {
    250     cssRules: [],
    251     insertRule: function() {}
    252   };
    253 });
    254 
    255 PdfJS_windowInstall("Context", function() {
    256   this.__log__ = [];
    257   this.save = function() {
    258     this.__log__.push("save","\n");
    259   }
    260   this.restore = function() {
    261     this.__log__.push("restore","\n");
    262   }
    263   this.transform = function(a,b,c,d,e,f) {
    264     this.__log__.push("transform",a,b,c,d,e,f,"\n");
    265   }
    266   this.translate = function(x,y) {
    267     this.__log__.push("translate",x,y,"\n");
    268   }
    269   this.scale = function(x,y) {
    270     this.__log__.push("scale",x,y,"\n");
    271   }
    272   this.rect = function(x,y,w,h) {
    273     this.__log__.push("rect",x,y,w,h,"\n");
    274   }
    275   this.clip = function() {
    276     this.__log__.push("clip","\n");
    277   }
    278   this.fill = function() {
    279     this.__log__.push("fill","\n");
    280   }
    281   this.stroke = function() {
    282     this.__log__.push("stroke","\n");
    283   }
    284   this.beginPath = function() {
    285     this.__log__.push("beginPath","\n");
    286   }
    287   this.closePath = function() {
    288     this.__log__.push("closePath","\n");
    289   }
    290   this.moveTo = function(x,y) {
    291     this.__log__.push("moveTo",x,y,"\n");
    292   }
    293   this.lineTo = function(x,y) {
    294     this.__log__.push("lineTo",x,y,"\n");
    295   }
    296   this.fillRect = function(x,y,w,h) {
    297     this.__log__.push("fillRect",x,y,w,h,"\n");
    298   }
    299   this.fillText = function(s,x,y,w) {
    300     this.__log__.push("fillText",s,x,y,"\n");
    301   }
    302   this.strokeText = function(s,x,y,w) {
    303     this.__log__.push("strokeText",s,x,y,"\n");
    304   }
    305   this.getImageData = function(x,y,w,h) {
    306     this.__log__.push("getImageData",x,y,w,h,"\n");
    307     return {data: []};
    308   }
    309   this.putImageData = function(data,x,y) {
    310     this.__log__.push("putImageData","{...}",x,y,"\n");
    311   }
    312   this.drawImage = function(image,x,y) {
    313     this.__log__.push("drawImage","<elem>",x,y,"\n");
    314   }
    315   this.getParameter = function(name) {
    316     this.__log__.push("getParameter",name,"\n");
    317     return null;
    318   }
    319   this.enable = function() {
    320     this.__log__.push("enable","\n");
    321   }
    322   this.disable = function() {
    323     this.__log__.push("disable","\n");
    324   }
    325   this.depthFunc = function(param) {
    326     this.__log__.push("depthFunc",param,"\n");
    327   }
    328   this.clearColor = function(r,g,b,a) {
    329     this.__log__.push("clearColor",r,g,b,a,"\n");
    330   }
    331   this.clear = function(m) {
    332     this.__log__.push("clear",m,"\n");
    333   }
    334   this.clearRect = function(x,y,w,h) {
    335     this.__log__.push("createRect",x,y,w,h,"\n");
    336   }
    337 });
    338 
    339 PdfJS_windowInstall("Canvas", function() {
    340   this.getContext = function() {
    341     return new PdfJS_window.Context();
    342   }
    343   this.width = 100;
    344   this.height = 100;
    345   this.style = { visibility: "visibile" };
    346 });
    347 
    348 PdfJS_windowInstall("document", {
    349   body : new PdfJS_window.Element("body"),
    350   documentElement : new PdfJS_window.Element("document"),
    351   createElement : function(element_type) {
    352     var element;
    353     if (element_type === "canvas") {
    354       element = new PdfJS_window.Canvas();
    355     } else {
    356       element = new PdfJS_window.Element(element_type);
    357     }
    358     element.parentNode = new PdfJS_window.Element("dummy_parent");
    359     return element;
    360   },
    361   getElementById : function(name) {
    362     if (name === "canvas") {
    363       return new PdfJS_window.Canvas();
    364     } else {
    365       return undefined;
    366     }
    367   },
    368   getElementsByTagName : function(element) {
    369     if (element === "script") {
    370       return new Array(new this.createElement(element));
    371     }
    372   },
    373   createEvent : function() { return new PdfJS_window.Event() }
    374 });
    375 
    376 PdfJS_window.window.addEventListener = function(name, listener) {
    377   PdfJS_window.setTimeout(listener)
    378 }
    379 
    380 PdfJS_windowInstall("Worker", undefined);
    381 
    382 
    383 ///////// The PDF we want to render, encoded in base64. ////////
    384 
    385 function getPDF() {
    386   return "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NyAzOTkuNyA1MTMuOSA3OTkuNCAyODUuNSAzNDIuNiAyODUuNSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSAyODUuNSAyODUuNSAyODUuNSA3OTkuNCA0ODUuMyA0ODUuMyA3OTkuNCA3NzAuNyA3MjcuOSA3NDIuMyA3ODUgNjk5LjQgNjcwLjggODA2LjUgNzcwLjcgMzcxIDUyOC4xIDc5OS4yIDY0Mi4zIDk0MiA3NzAuNyA3OTkuNCA2OTkuNCA3OTkuNCA3NTYuNSA1NzEgNzQyLjMgNzcwLjcgNzcwLjcgMTA1Ni4yIDc3MC43IDc3MC43IDYyOC4xIDI4NS41IDUxMy45IDI4NS41IDUxMy45IDI4NS41IDI4NS41IDUxMy45IDU3MSA0NTYuOCA1NzEgNDU3LjIgMzE0IDUxMy45IDU3MSAyODUuNSAzMTQgNTQyLjQgMjg1LjUgODU2LjUgNTcxIDUxMy45IDU3MSA1NDIuNCA0MDIgNDA1LjQgMzk5LjcgNTcxIDU0Mi40IDc0Mi4zIDU0Mi40IDU0Mi40XQplbmRvYmoKMTYgMCBvYmoKWzYzOC45XQplbmRvYmoKMTcgMCBvYmoKWzU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDMxMi41IDMxMi41IDM0Mi42IDg3NSA1MzEuMiA1MzEuMiA4NzUgODQ5LjUgNzk5LjggODEyLjUgODYyLjMgNzM4LjQgNzA3LjIgODg0LjMgODc5LjYgNDE5IDU4MSA4ODAuOCA2NzUuOSAxMDY3LjEgODc5LjYgODQ0LjkgNzY4LjUgODQ0LjkgODM5LjEgNjI1IDc4Mi40IDg2NC42IDg0OS41IDExNjIgODQ5LjUgODQ5LjUgNjg3LjUgMzEyLjUgNTgxIDMxMi41IDU2Mi41IDMxMi41IDMxMi41IDU0Ni45IDYyNSA1MDAgNjI1IDUxMy4zIDM0My43IDU2Mi41IDYyNSAzMTIuNSAzNDMuNyA1OTMuNyAzMTIuNSA5MzcuNSA2MjUgNTYyLjUgNjI1IDU5My43IDQ1OS41IDQ0My44IDQzNy41IDYyNV0KZW5kb2JqCjE4IDAgb2JqCls1ODMuMyA1NTUuNiA1NTUuNiA4MzMuMyA4MzMuMyAyNzcuOCAzMDUuNiA1MDAgNTAwIDUwMCA1MDAgNTAwIDc1MCA0NDQuNCA1MDAgNzIyLjIgNzc3LjggNTAwIDkwMi44IDEwMTMuOSA3NzcuOCAyNzcuOCAyNzcuOCA1MDAgODMzLjMgNTAwIDgzMy4zIDc3Ny44IDI3Ny44IDM4OC45IDM4OC45IDUwMCA3NzcuOCAyNzcuOCAzMzMuMyAyNzcuOCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDI3Ny44IDI3Ny44IDI3Ny44IDc3Ny44IDQ3Mi4yIDQ3Mi4yIDc3Ny44IDc1MCA3MDguMyA3MjIuMiA3NjMuOSA2ODAuNiA2NTIuOCA3ODQuNyA3NTAgMzYxLjEgNTEzLjkgNzc3LjggNjI1IDkxNi43IDc1MCA3NzcuOCA2ODAuNiA3NzcuOCA3MzYuMSA1NTUuNiA3MjIuMiA3NTAgNzUwIDEwMjcuOCA3NTAgNzUwIDYxMS4xIDI3Ny44IDUwMCAyNzcuOCA1MDAgMjc3LjggMjc3LjggNTAwIDU1NS42IDQ0NC40IDU1NS42IDQ0NC40IDMwNS42IDUwMCA1NTUuNiAyNzcuOCAzMDUuNiA1MjcuOCAyNzcuOCA4MzMuMyA1NTUuNiA1MDAgNTU1LjYgNTI3LjggMzkxLjcgMzk0LjQgMzg4LjkgNTU1LjYgNTI3LjggNzIyLjIgNTI3LjggNTI3LjggNDQ0LjRdCmVuZG9iagoxOSAwIG9iagpbODY5LjQgODE4LjEgODMwLjYgODgxLjkgNzU1LjYgNzIzLjYgOTA0LjIgOTAwIDQzNi4xIDU5NC40IDkwMS40IDY5MS43IDEwOTEuNyA5MDAgODYzLjkgNzg2LjEgODYzLjkgODYyLjUgNjM4LjkgODAwIDg4NC43IDg2OS40IDExODguOSA4NjkuNCA4NjkuNCA3MDIuOCAzMTkuNCA2MDIuOCAzMTkuNCA1NzUgMzE5LjQgMzE5LjQgNTU5IDYzOC45IDUxMS4xIDYzOC45IDUyNy4xIDM1MS40IDU3NSA2MzguOSAzMTkuNCAzNTEuNCA2MDYuOSAzMTkuNCA5NTguMyA2MzguOSA1NzUgNjM4LjkgNjA2LjkgNDczLjYgNDUzLjYgNDQ3LjJdCmVuZG9iagoyMCAwIG9iagpbMjcyIDMyNi40IDI3MiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiAyNzIgMjcyIDI3MiA3NjEuNiA0NjIuNCA0NjIuNCA3NjEuNiA3MzQgNjkzLjQgNzA3LjIgNzQ3LjggNjY2LjIgNjM5IDc2OC4zIDczNCAzNTMuMiA1MDMgNzYxLjIgNjExLjggODk3LjIgNzM0IDc2MS42IDY2Ni4yIDc2MS42IDcyMC42IDU0NCA3MDcuMiA3MzQgNzM0IDEwMDYgNzM0IDczNCA1OTguNCAyNzIgNDg5LjYgMjcyIDQ4OS42IDI3MiAyNzIgNDg5LjYgNTQ0IDQzNS4yIDU0NCA0MzUuMiAyOTkuMiA0ODkuNiA1NDQgMjcyIDI5OS4yIDUxNi44IDI3MiA4MTYgNTQ0IDQ4OS42IDU0NCA1MTYuOCAzODAuOCAzODYuMiAzODAuOCA1NDQgNTE2LjggNzA3LjIgNTE2LjggNTE2LjggNDM1LjIgNDg5LjYgOTc5LjIgNDg5LjYgNDg5LjYgNDg5LjZdCmVuZG9iagoyMSAwIG9iagpbNTAwXQplbmRvYmoKMjIgMCBvYmoKWzYwMi4xIDcyNi4zIDY5My4zIDMyNy42IDQ3MS41IDcxOS40IDU3NiA4NTAgNjkzLjMgNzE5LjggNjI4LjIgNzE5LjggNjgwLjUgNTEwLjkgNjY3LjYgNjkzLjMgNjkzLjMgOTU0LjUgNjkzLjMgNjkzLjMgNTYzLjEgMjQ5LjYgNDU4LjYgMjQ5LjYgNDU4LjYgMjQ5LjYgMjQ5LjYgNDU4LjYgNTEwLjkgNDA2LjQgNTEwLjkgNDA2LjQgMjc1LjggNDU4LjYgNTEwLjkgMjQ5LjYgMjc1LjggNDg0LjcgMjQ5LjYgNzcyLjEgNTEwLjkgNDU4LjYgNTEwLjkgNDg0LjcgMzU0LjEgMzU5LjQgMzU0LjEgNTEwLjkgNDg0LjcgNjY3LjYgNDg0LjcgNDg0LjddCmVuZG9iagoyMyAwIG9iaiA8PAovTGVuZ3RoMSAxNDc4Ci9MZW5ndGgyIDg1MTgKL0xlbmd0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v8GGxC7XToegrvebyXdbtw9p5HgLpTWptCKqTLk+yf8P4ygJngplbmRzdHJlYW0KZW5kb2JqCjQwIDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL01GTURBRitDTVRUOQovRmxhZ3MgNAovRm9udEJCb3ggWy02IC0yMzMgNTQyIDY5OF0KL0FzY2VudCA2MTEKL0NhcEhlaWdodCA2MTEKL0Rlc2NlbnQgLTIyMgovSXRhbGljQW5nbGUgMAovU3RlbVYgNzQKL1hIZWlnaHQgNDMxCi9DaGFyU2V0ICgvZi9uL28vcikKL0ZvbnRGaWxlIDM5IDAgUgo+PiBlbmRvYmoKNyAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9RWktSRE0rQ01CWDEwCi9Gb250RGVzY3JpcHRvciAyNCAwIFIKL0ZpcnN0Q2hhciA2NQovTGFzdENoYXIgMTE2Ci9XaWR0aHMgMTkgMCBSCj4+IGVuZG9iago5IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dYR0dCUStDTUJYMTIKL0ZvbnREZXNjcmlwdG9yIDI2IDAgUgovRmlyc3RDaGFyIDQ5Ci9MYXN0Q2hhciAxMTcKL1dpZHRocyAxNyAwIFIKPj4gZW5kb2JqCjggMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvUlpQTUxTK0NNUjEwCi9Gb250RGVzY3JpcHRvciAyOCAwIFIKL0ZpcnN0Q2hhciAxMQovTGFzdENoYXIgMTIyCi9XaWR0aHMgMTggMCBSCj4+IGVuZG9iago2IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1BIQlhEUStDTVIxMgovRm9udERlc2NyaXB0b3IgMzAgMCBSCi9GaXJzdENoYXIgNDQKL0xhc3RDaGFyIDEyNwovV2lkdGhzIDIwIDAgUgo+PiBlbmRvYmoKNCAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9KVFlNS04rQ01SMTcKL0ZvbnREZXNjcmlwdG9yIDMyIDAgUgovRmlyc3RDaGFyIDcwCi9MYXN0Q2hhciAxMjEKL1dpZHRocyAyMiAwIFIKPj4gZW5kb2JqCjExIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1RLSkhISStDTVI5Ci9Gb250RGVzY3JpcHRvciAzNCAwIFIKL0ZpcnN0Q2hhciAzMwovTGFzdENoYXIgMTIxCi9XaWR0aHMgMTUgMCBSCj4+IGVuZG9iago1IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1VFSVpZVytDTVNZMTAKL0ZvbnREZXNjcmlwdG9yIDM2IDAgUgovRmlyc3RDaGFyIDMKL0xhc3RDaGFyIDMKL1dpZHRocyAyMSAwIFIKPj4gZW5kb2JqCjEwIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dVT1dUSytDTVNZNgovRm9udERlc2NyaXB0b3IgMzggMCBSCi9GaXJzdENoYXIgMwovTGFzdENoYXIgMwovV2lkdGhzIDE2IDAgUgo+PiBlbmRvYmoKMTIgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvTUZNREFGK0NNVFQ5Ci9Gb250RGVzY3JpcHRvciA0MCAwIFIKL0ZpcnN0Q2hhciAxMDIKL0xhc3RDaGFyIDExNAovV2lkdGhzIDE0IDAgUgo+PiBlbmRvYmoKMTMgMCBvYmogPDwKL1R5cGUgL1BhZ2VzCi9Db3VudCAxCi9LaWRzIFsyIDAgUl0KPj4gZW5kb2JqCjQxIDAgb2JqIDw8Ci9UeXBlIC9DYXRhbG9nCi9QYWdlcyAxMyAwIFIKPj4gZW5kb2JqCjQyIDAgb2JqIDw8Ci9Qcm9kdWNlciAocGRmVGVYLTEuNDAuMTApCi9DcmVhdG9yIChUZVgpCi9DcmVhdGlvbkRhdGUgKEQ6MjAxMjA2MTExODA4NDYrMDInMDAnKQovTW9kRGF0ZSAoRDoyMDEyMDYxMTE4MDg0NiswMicwMCcpCi9UcmFwcGVkIC9GYWxzZQovUFRFWC5GdWxsYmFubmVyIChUaGlzIGlzIHBkZlRlWCwgVmVyc2lvbiAzLjE0MTU5MjYtMS40MC4xMC0yLjIgKFRlWCBMaXZlIDIwMDkvRGViaWFuKSBrcGF0aHNlYSB2ZXJzaW9uIDUuMC4wKQo+PiBlbmRvYmoKeHJlZgowIDQzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMzMxNiAwMDAwMCBuIAowMDAwMDAzMjA0IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDEwODgzNCAwMDAwMCBuIAowMDAwMTA5MTEyIDAwMDAwIG4gCjAwMDAxMDg2OTUgMDAwMDAgbiAKMDAwMDEwODI3NiAwMDAwMCBuIAowMDAwMTA4NTU2IDAwMDAwIG4gCjAwMDAxMDg0MTYgMDAwMDAgbiAKMDAwMDEwOTI0OSAwMDAwMCBuIAowMDAwMTA4OTczIDAwMDAwIG4gCjAwMDAxMDkzODYgMDAwMDAgbiAKMDAwMDEwOTUyNyAwMDAwMCBuIAowMDAwMDAzNDc0IDAwMDAwIG4gCjAwMDAwMDM1NDQgMDAwMDAgbiAKMDAwMDAwNDA3MSAwMDAwMCBuIAowMDAwMDA0MDk1IDAwMDAwIG4gCjAwMDAwMDQ1MDEgMDAwMDAgbiAKMDAwMDAwNTEyMyAwMDAwMCBuIAowMDAwMDA1NDQxIDAwMDAwIG4gCjAwMDAwMDU5MDYgMDAwMDAgbiAKMDAwMDAwNTkyOCAwMDAwMCBuIAowMDAwMDA2MjU0IDAwMDAwIG4gCjAwMDAwMTU4NzcgMDAwMDAgbiAKMDAwMDAxNjEwOCAwMDAwMCBuIAowMDAwMDI0NDIxIDAwMDAwIG4gCjAwMDAwMjQ2NjAgMDAwMDAgbiAKMDAwMDA0MzkyNSAwMDAwMCBuIAowMDAwMDQ0MzQyIDAwMDAwIG4gCjAwMDAwNTg3MzMgMDAwMDAgbiAKMDAwMDA1OTA1NiAwMDAwMCBuIAowMDAwMDY5NjY1IDAwMDAwIG4gCjAwMDAwNjk5MTcgMDAwMDAgbiAKMDAwMDA4NTU4MCAwMDAwMCBuIAowMDAwMDg1OTMxIDAwMDAwIG4gCjAwMDAwOTMwNDggMDAwMDAgbiAKMDAwMDA5MzI3OSAwMDAwMCBuIAowMDAwMTAwNDQ1IDAwMDAwIG4gCjAwMDAxMDA2NzQgMDAwMDAgbiAKMDAwMDEwODA1NSAwMDAwMCBuIAowMDAwMTA5NTg1IDAwMDAwIG4gCjAwMDAxMDk2MzYgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA0MwovUm9vdCA0MSAwIFIKL0luZm8gNDIgMCBSCi9JRCBbPEE1MTIyOERDMEI2RDhERTcwNDA5QjM4RUY1MDJDQkYwPiA8QTUxMjI4REMwQjZEOERFNzA0MDlCMzhFRjUwMkNCRjA+XSA+PgpzdGFydHhyZWYKMTA5OTAyCiUlRU9GCg=="
    387 }
    388 
    389 
    390 ///////// Rest taken from generated pdf.js. (c) by Mozilla. ////////
    391 ///////// File unchanged, except that all references to DOM- ////////
    392 ///////// specific global names have been prefixed by PdfJS_window., ////////
    393 ///////// to avoid interference with the benchmark runner script. ////////
    394 
    395 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
    396 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
    397 
    398 var PDFJS = {};
    399 
    400 (function pdfjsWrapper() {
    401   // Use strict in our context only - users might not want it
    402   'use strict';
    403 
    404   PDFJS.build = '3cc61f0';
    405 
    406   // Files are inserted below - see Makefile
    407 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
    408 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
    409 
    410 'use strict';
    411 
    412 var globalScope = (typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window;
    413 
    414 var isWorker = (typeof PdfJS_window.window == 'undefined');
    415 
    416 var ERRORS = 0, WARNINGS = 1, TODOS = 5;
    417 var verbosity = WARNINGS;
    418 
    419 // The global PDFJS object exposes the API
    420 // In production, it will be declared outside a global wrapper
    421 // In development, it will be declared here
    422 if (!globalScope.PDFJS) {
    423   globalScope.PDFJS = {};
    424 }
    425 
    426 // getPdf()
    427 // Convenience function to perform binary Ajax GET
    428 // Usage: getPdf('http://...', callback)
    429 //        getPdf({
    430 //                 url:String ,
    431 //                 [,progress:Function, error:Function]
    432 //               },
    433 //               callback)
    434 function getPdf(arg, callback) {
    435   var params = arg;
    436   if (typeof arg === 'string')
    437     params = { url: arg };
    438 
    439   var xhr = new PdfJS_window.XMLHttpRequest();
    440   xhr.open('GET', params.url);
    441   xhr.mozResponseType = xhr.responseType = 'arraybuffer';
    442   var protocol = params.url.indexOf(':') < 0 ? PdfJS_window.window.location.protocol :
    443     params.url.substring(0, params.url.indexOf(':') + 1);
    444   xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0;
    445 
    446   if ('progress' in params)
    447     xhr.onprogress = params.progress || undefined;
    448 
    449   if ('error' in params)
    450     xhr.onerror = params.error || undefined;
    451 
    452   xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
    453     if (xhr.readyState === 4) {
    454       if (xhr.status === xhr.expected) {
    455         var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
    456                     xhr.responseArrayBuffer || xhr.response);
    457         callback(data);
    458       } else if (params.error) {
    459         params.error(e);
    460       }
    461     }
    462   };
    463   xhr.send(null);
    464 }
    465 globalScope.PDFJS.getPdf = getPdf;
    466 globalScope.PDFJS.pdfBug = false;
    467 
    468 var Page = (function PageClosure() {
    469   function Page(xref, pageNumber, pageDict, ref) {
    470     this.pageNumber = pageNumber;
    471     this.pageDict = pageDict;
    472     this.xref = xref;
    473     this.ref = ref;
    474 
    475     this.displayReadyPromise = null;
    476   }
    477 
    478   Page.prototype = {
    479     getPageProp: function Page_getPageProp(key) {
    480       return this.pageDict.get(key);
    481     },
    482     inheritPageProp: function Page_inheritPageProp(key) {
    483       var dict = this.pageDict;
    484       var obj = dict.get(key);
    485       while (obj === undefined) {
    486         dict = dict.get('Parent');
    487         if (!dict)
    488           break;
    489         obj = dict.get(key);
    490       }
    491       return obj;
    492     },
    493     get content() {
    494       return shadow(this, 'content', this.getPageProp('Contents'));
    495     },
    496     get resources() {
    497       return shadow(this, 'resources', this.inheritPageProp('Resources'));
    498     },
    499     get mediaBox() {
    500       var obj = this.inheritPageProp('MediaBox');
    501       // Reset invalid media box to letter size.
    502       if (!isArray(obj) || obj.length !== 4)
    503         obj = [0, 0, 612, 792];
    504       return shadow(this, 'mediaBox', obj);
    505     },
    506     get view() {
    507       var mediaBox = this.mediaBox;
    508       var cropBox = this.inheritPageProp('CropBox');
    509       if (!isArray(cropBox) || cropBox.length !== 4)
    510         return shadow(this, 'view', mediaBox);
    511 
    512       // From the spec, 6th ed., p.963:
    513       // "The crop, bleed, trim, and art boxes should not ordinarily
    514       // extend beyond the boundaries of the media box. If they do, they are
    515       // effectively reduced to their intersection with the media box."
    516       cropBox = Util.intersect(cropBox, mediaBox);
    517       if (!cropBox)
    518         return shadow(this, 'view', mediaBox);
    519 
    520       return shadow(this, 'view', cropBox);
    521     },
    522     get annotations() {
    523       return shadow(this, 'annotations', this.inheritPageProp('Annots'));
    524     },
    525     get rotate() {
    526       var rotate = this.inheritPageProp('Rotate') || 0;
    527       // Normalize rotation so it's a multiple of 90 and between 0 and 270
    528       if (rotate % 90 != 0) {
    529         rotate = 0;
    530       } else if (rotate >= 360) {
    531         rotate = rotate % 360;
    532       } else if (rotate < 0) {
    533         // The spec doesn't cover negatives, assume its counterclockwise
    534         // rotation. The following is the other implementation of modulo.
    535         rotate = ((rotate % 360) + 360) % 360;
    536       }
    537       return shadow(this, 'rotate', rotate);
    538     },
    539 
    540     getOperatorList: function Page_getOperatorList(handler, dependency) {
    541       var xref = this.xref;
    542       var content = this.content;
    543       var resources = this.resources;
    544       if (isArray(content)) {
    545         // fetching items
    546         var streams = [];
    547         var i, n = content.length;
    548         for (i = 0; i < n; ++i)
    549           streams.push(xref.fetchIfRef(content[i]));
    550         content = new StreamsSequenceStream(streams);
    551       } else if (isStream(content)) {
    552         content.reset();
    553       } else if (!content) {
    554         // replacing non-existent page content with empty one
    555         content = new Stream(new Uint8Array(0));
    556       }
    557 
    558       var pe = this.pe = new PartialEvaluator(
    559                                 xref, handler, 'p' + this.pageNumber + '_');
    560 
    561       return pe.getOperatorList(content, resources, dependency);
    562     },
    563 
    564     getLinks: function Page_getLinks() {
    565       var links = [];
    566       var annotations = pageGetAnnotations();
    567       var i, n = annotations.length;
    568       for (i = 0; i < n; ++i) {
    569         if (annotations[i].type != 'Link')
    570           continue;
    571         links.push(annotations[i]);
    572       }
    573       return links;
    574     },
    575     getAnnotations: function Page_getAnnotations() {
    576       var xref = this.xref;
    577       function getInheritableProperty(annotation, name) {
    578         var item = annotation;
    579         while (item && !item.has(name)) {
    580           item = item.get('Parent');
    581         }
    582         if (!item)
    583           return null;
    584         return item.get(name);
    585       }
    586       function isValidUrl(url) {
    587         if (!url)
    588           return false;
    589         var colon = url.indexOf(':');
    590         if (colon < 0)
    591           return false;
    592         var protocol = url.substr(0, colon);
    593         switch (protocol) {
    594           case 'http':
    595           case 'https':
    596           case 'ftp':
    597           case 'mailto':
    598             return true;
    599           default:
    600             return false;
    601         }
    602       }
    603 
    604       var annotations = this.annotations || [];
    605       var i, n = annotations.length;
    606       var items = [];
    607       for (i = 0; i < n; ++i) {
    608         var annotationRef = annotations[i];
    609         var annotation = xref.fetch(annotationRef);
    610         if (!isDict(annotation))
    611           continue;
    612         var subtype = annotation.get('Subtype');
    613         if (!isName(subtype))
    614           continue;
    615         var rect = annotation.get('Rect');
    616 
    617         var item = {};
    618         item.type = subtype.name;
    619         item.rect = rect;
    620         switch (subtype.name) {
    621           case 'Link':
    622             var a = annotation.get('A');
    623             if (a) {
    624               switch (a.get('S').name) {
    625                 case 'URI':
    626                   var url = a.get('URI');
    627                   // TODO: pdf spec mentions urls can be relative to a Base
    628                   // entry in the dictionary.
    629                   if (!isValidUrl(url))
    630                     url = '';
    631                   item.url = url;
    632                   break;
    633                 case 'GoTo':
    634                   item.dest = a.get('D');
    635                   break;
    636                 default:
    637                   TODO('other link types');
    638               }
    639             } else if (annotation.has('Dest')) {
    640               // simple destination link
    641               var dest = annotation.get('Dest');
    642               item.dest = isName(dest) ? dest.name : dest;
    643             }
    644             break;
    645           case 'Widget':
    646             var fieldType = getInheritableProperty(annotation, 'FT');
    647             if (!isName(fieldType))
    648               break;
    649             item.fieldType = fieldType.name;
    650             // Building the full field name by collecting the field and
    651             // its ancestors 'T' properties and joining them using '.'.
    652             var fieldName = [];
    653             var namedItem = annotation, ref = annotationRef;
    654             while (namedItem) {
    655               var parent = namedItem.get('Parent');
    656               var parentRef = namedItem.getRaw('Parent');
    657               var name = namedItem.get('T');
    658               if (name) {
    659                 fieldName.unshift(stringToPDFString(name));
    660               } else {
    661                 // The field name is absent, that means more than one field
    662                 // with the same name may exist. Replacing the empty name
    663                 // with the '`' plus index in the parent's 'Kids' array.
    664                 // This is not in the PDF spec but necessary to id the
    665                 // the input controls.
    666                 var kids = parent.get('Kids');
    667                 var j, jj;
    668                 for (j = 0, jj = kids.length; j < jj; j++) {
    669                   var kidRef = kids[j];
    670                   if (kidRef.num == ref.num && kidRef.gen == ref.gen)
    671                     break;
    672                 }
    673                 fieldName.unshift('`' + j);
    674               }
    675               namedItem = parent;
    676               ref = parentRef;
    677             }
    678             item.fullName = fieldName.join('.');
    679             var alternativeText = stringToPDFString(annotation.get('TU') || '');
    680             item.alternativeText = alternativeText;
    681             var da = getInheritableProperty(annotation, 'DA') || '';
    682             var m = /([\d\.]+)\sTf/.exec(da);
    683             if (m)
    684               item.fontSize = parseFloat(m[1]);
    685             item.textAlignment = getInheritableProperty(annotation, 'Q');
    686             item.flags = getInheritableProperty(annotation, 'Ff') || 0;
    687             break;
    688           case 'Text':
    689             var content = annotation.get('Contents');
    690             var title = annotation.get('T');
    691             item.content = stringToPDFString(content || '');
    692             item.title = stringToPDFString(title || '');
    693             item.name = !annotation.has('Name') ? 'Note' :
    694               annotation.get('Name').name;
    695             break;
    696           default:
    697             TODO('unimplemented annotation type: ' + subtype.name);
    698             break;
    699         }
    700         items.push(item);
    701       }
    702       return items;
    703     }
    704   };
    705 
    706   return Page;
    707 })();
    708 
    709 /**
    710  * The `PDFDocument` holds all the data of the PDF file. Compared to the
    711  * `PDFDoc`, this one doesn't have any job management code.
    712  * Right now there exists one PDFDocument on the main thread + one object
    713  * for each worker. If there is no worker support enabled, there are two
    714  * `PDFDocument` objects on the main thread created.
    715  */
    716 var PDFDocument = (function PDFDocumentClosure() {
    717   function PDFDocument(arg, callback) {
    718     if (isStream(arg))
    719       init.call(this, arg);
    720     else if (isArrayBuffer(arg))
    721       init.call(this, new Stream(arg));
    722     else
    723       error('PDFDocument: Unknown argument type');
    724   }
    725 
    726   function init(stream) {
    727     assertWellFormed(stream.length > 0, 'stream must have data');
    728     this.stream = stream;
    729     this.setup();
    730     this.acroForm = this.catalog.catDict.get('AcroForm');
    731   }
    732 
    733   function find(stream, needle, limit, backwards) {
    734     var pos = stream.pos;
    735     var end = stream.end;
    736     var str = '';
    737     if (pos + limit > end)
    738       limit = end - pos;
    739     for (var n = 0; n < limit; ++n)
    740       str += stream.getChar();
    741     stream.pos = pos;
    742     var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
    743     if (index == -1)
    744       return false; /* not found */
    745     stream.pos += index;
    746     return true; /* found */
    747   }
    748 
    749   PDFDocument.prototype = {
    750     get linearization() {
    751       var length = this.stream.length;
    752       var linearization = false;
    753       if (length) {
    754         linearization = new Linearization(this.stream);
    755         if (linearization.length != length)
    756           linearization = false;
    757       }
    758       // shadow the prototype getter with a data property
    759       return shadow(this, 'linearization', linearization);
    760     },
    761     get startXRef() {
    762       var stream = this.stream;
    763       var startXRef = 0;
    764       var linearization = this.linearization;
    765       if (linearization) {
    766         // Find end of first obj.
    767         stream.reset();
    768         if (find(stream, 'endobj', 1024))
    769           startXRef = stream.pos + 6;
    770       } else {
    771         // Find startxref by jumping backward from the end of the file.
    772         var step = 1024;
    773         var found = false, pos = stream.end;
    774         while (!found && pos > 0) {
    775           pos -= step - 'startxref'.length;
    776           if (pos < 0)
    777             pos = 0;
    778           stream.pos = pos;
    779           found = find(stream, 'startxref', step, true);
    780         }
    781         if (found) {
    782           stream.skip(9);
    783           var ch;
    784           do {
    785             ch = stream.getChar();
    786           } while (Lexer.isSpace(ch));
    787           var str = '';
    788           while ((ch - '0') <= 9) {
    789             str += ch;
    790             ch = stream.getChar();
    791           }
    792           startXRef = parseInt(str, 10);
    793           if (isNaN(startXRef))
    794             startXRef = 0;
    795         }
    796       }
    797       // shadow the prototype getter with a data property
    798       return shadow(this, 'startXRef', startXRef);
    799     },
    800     get mainXRefEntriesOffset() {
    801       var mainXRefEntriesOffset = 0;
    802       var linearization = this.linearization;
    803       if (linearization)
    804         mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
    805       // shadow the prototype getter with a data property
    806       return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
    807     },
    808     // Find the header, remove leading garbage and setup the stream
    809     // starting from the header.
    810     checkHeader: function PDFDocument_checkHeader() {
    811       var stream = this.stream;
    812       stream.reset();
    813       if (find(stream, '%PDF-', 1024)) {
    814         // Found the header, trim off any garbage before it.
    815         stream.moveStart();
    816         return;
    817       }
    818       // May not be a PDF file, continue anyway.
    819     },
    820     setup: function PDFDocument_setup(ownerPassword, userPassword) {
    821       this.checkHeader();
    822       var xref = new XRef(this.stream,
    823                           this.startXRef,
    824                           this.mainXRefEntriesOffset);
    825       this.xref = xref;
    826       this.catalog = new Catalog(xref);
    827     },
    828     get numPages() {
    829       var linearization = this.linearization;
    830       var num = linearization ? linearization.numPages : this.catalog.numPages;
    831       // shadow the prototype getter
    832       return shadow(this, 'numPages', num);
    833     },
    834     getDocumentInfo: function PDFDocument_getDocumentInfo() {
    835       var info;
    836       if (this.xref.trailer.has('Info')) {
    837         var infoDict = this.xref.trailer.get('Info');
    838 
    839         info = {};
    840         infoDict.forEach(function(key, value) {
    841           info[key] = typeof value !== 'string' ? value :
    842             stringToPDFString(value);
    843         });
    844       }
    845 
    846       return shadow(this, 'getDocumentInfo', info);
    847     },
    848     getFingerprint: function PDFDocument_getFingerprint() {
    849       var xref = this.xref, fileID;
    850       if (xref.trailer.has('ID')) {
    851         fileID = '';
    852         var id = xref.trailer.get('ID')[0];
    853         id.split('').forEach(function(el) {
    854           fileID += Number(el.charCodeAt(0)).toString(16);
    855         });
    856       } else {
    857         // If we got no fileID, then we generate one,
    858         // from the first 100 bytes of PDF
    859         var data = this.stream.bytes.subarray(0, 100);
    860         var hash = calculateMD5(data, 0, data.length);
    861         fileID = '';
    862         for (var i = 0, length = hash.length; i < length; i++) {
    863           fileID += Number(hash[i]).toString(16);
    864         }
    865       }
    866 
    867       return shadow(this, 'getFingerprint', fileID);
    868     },
    869     getPage: function PDFDocument_getPage(n) {
    870       return this.catalog.getPage(n);
    871     }
    872   };
    873 
    874   return PDFDocument;
    875 })();
    876 
    877 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
    878 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
    879 
    880 'use strict';
    881 
    882 function log(msg) {
    883   if (PdfJS_window.console && PdfJS_window.console.log)
    884     PdfJS_window.console.log(msg);
    885   else if (print)
    886     print(msg);
    887 }
    888 
    889 function warn(msg) {
    890   if (verbosity >= WARNINGS)
    891     log('Warning: ' + msg);
    892 }
    893 
    894 function backtrace() {
    895   try {
    896     throw new Error();
    897   } catch (e) {
    898     return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
    899   }
    900 }
    901 
    902 function error(msg) {
    903   log('Error: ' + msg);
    904   log(backtrace());
    905   throw new Error(msg);
    906 }
    907 
    908 function TODO(what) {
    909   if (verbosity >= TODOS)
    910     log('TODO: ' + what);
    911 }
    912 
    913 function malformed(msg) {
    914   error('Malformed PDF: ' + msg);
    915 }
    916 
    917 function assert(cond, msg) {
    918   if (!cond)
    919     error(msg);
    920 }
    921 
    922 // In a well-formed PDF, |cond| holds.  If it doesn't, subsequent
    923 // behavior is undefined.
    924 function assertWellFormed(cond, msg) {
    925   if (!cond)
    926     malformed(msg);
    927 }
    928 
    929 function shadow(obj, prop, value) {
    930   Object.defineProperty(obj, prop, { value: value,
    931                                      enumerable: true,
    932                                      configurable: true,
    933                                      writable: false });
    934   return value;
    935 }
    936 
    937 function bytesToString(bytes) {
    938   var str = '';
    939   var length = bytes.length;
    940   for (var n = 0; n < length; ++n)
    941     str += String.fromCharCode(bytes[n]);
    942   return str;
    943 }
    944 
    945 function stringToBytes(str) {
    946   var length = str.length;
    947   var bytes = new Uint8Array(length);
    948   for (var n = 0; n < length; ++n)
    949     bytes[n] = str.charCodeAt(n) & 0xFF;
    950   return bytes;
    951 }
    952 
    953 var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
    954 
    955 var Util = PDFJS.Util = (function UtilClosure() {
    956   function Util() {}
    957 
    958   Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
    959     var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
    960     return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
    961   };
    962 
    963   Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) {
    964     c = (new DeviceCmykCS()).getRgb([c, m, y, k]);
    965     var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0;
    966     return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
    967   };
    968 
    969   // For 2d affine transforms
    970   Util.applyTransform = function Util_applyTransform(p, m) {
    971     var xt = p[0] * m[0] + p[1] * m[2] + m[4];
    972     var yt = p[0] * m[1] + p[1] * m[3] + m[5];
    973     return [xt, yt];
    974   };
    975 
    976   Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
    977     var d = m[0] * m[3] - m[1] * m[2];
    978     var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
    979     var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
    980     return [xt, yt];
    981   };
    982 
    983   Util.inverseTransform = function Util_inverseTransform(m) {
    984     var d = m[0] * m[3] - m[1] * m[2];
    985     return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
    986       (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
    987   };
    988 
    989   // Apply a generic 3d matrix M on a 3-vector v:
    990   //   | a b c |   | X |
    991   //   | d e f | x | Y |
    992   //   | g h i |   | Z |
    993   // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
    994   // with v as [X,Y,Z]
    995   Util.apply3dTransform = function Util_apply3dTransform(m, v) {
    996     return [
    997       m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
    998       m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
    999       m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
   1000     ];
   1001   }
   1002 
   1003   // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
   1004   // For coordinate systems whose origin lies in the bottom-left, this
   1005   // means normalization to (BL,TR) ordering. For systems with origin in the
   1006   // top-left, this means (TL,BR) ordering.
   1007   Util.normalizeRect = function Util_normalizeRect(rect) {
   1008     var r = rect.slice(0); // clone rect
   1009     if (rect[0] > rect[2]) {
   1010       r[0] = rect[2];
   1011       r[2] = rect[0];
   1012     }
   1013     if (rect[1] > rect[3]) {
   1014       r[1] = rect[3];
   1015       r[3] = rect[1];
   1016     }
   1017     return r;
   1018   }
   1019 
   1020   // Returns a rectangle [x1, y1, x2, y2] corresponding to the
   1021   // intersection of rect1 and rect2. If no intersection, returns 'false'
   1022   // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
   1023   Util.intersect = function Util_intersect(rect1, rect2) {
   1024     function compare(a, b) {
   1025       return a - b;
   1026     };
   1027 
   1028     // Order points along the axes
   1029     var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
   1030         orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
   1031         result = [];
   1032 
   1033     rect1 = Util.normalizeRect(rect1);
   1034     rect2 = Util.normalizeRect(rect2);
   1035 
   1036     // X: first and second points belong to different rectangles?
   1037     if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
   1038         (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
   1039       // Intersection must be between second and third points
   1040       result[0] = orderedX[1];
   1041       result[2] = orderedX[2];
   1042     } else {
   1043       return false;
   1044     }
   1045 
   1046     // Y: first and second points belong to different rectangles?
   1047     if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
   1048         (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
   1049       // Intersection must be between second and third points
   1050       result[1] = orderedY[1];
   1051       result[3] = orderedY[2];
   1052     } else {
   1053       return false;
   1054     }
   1055 
   1056     return result;
   1057   };
   1058 
   1059   Util.sign = function Util_sign(num) {
   1060     return num < 0 ? -1 : 1;
   1061   };
   1062 
   1063   return Util;
   1064 })();
   1065 
   1066 var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
   1067   function PageViewport(viewBox, scale, rotate, offsetX, offsetY) {
   1068     // creating transform to convert pdf coordinate system to the normal
   1069     // canvas like coordinates taking in account scale and rotation
   1070     var centerX = (viewBox[2] + viewBox[0]) / 2;
   1071     var centerY = (viewBox[3] + viewBox[1]) / 2;
   1072     var rotateA, rotateB, rotateC, rotateD;
   1073     switch (rotate) {
   1074       case -180:
   1075       case 180:
   1076         rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
   1077         break;
   1078       case -270:
   1079       case 90:
   1080         rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
   1081         break;
   1082       case -90:
   1083       case 270:
   1084         rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
   1085         break;
   1086       case 360:
   1087       case 0:
   1088       default:
   1089         rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
   1090         break;
   1091     }
   1092     var offsetCanvasX, offsetCanvasY;
   1093     var width, height;
   1094     if (rotateA == 0) {
   1095       offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
   1096       offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
   1097       width = Math.abs(viewBox[3] - viewBox[1]) * scale;
   1098       height = Math.abs(viewBox[2] - viewBox[0]) * scale;
   1099     } else {
   1100       offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
   1101       offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
   1102       width = Math.abs(viewBox[2] - viewBox[0]) * scale;
   1103       height = Math.abs(viewBox[3] - viewBox[1]) * scale;
   1104     }
   1105     // creating transform for the following operations:
   1106     // translate(-centerX, -centerY), rotate and flip vertically,
   1107     // scale, and translate(offsetCanvasX, offsetCanvasY)
   1108     this.transform = [
   1109       rotateA * scale,
   1110       rotateB * scale,
   1111       rotateC * scale,
   1112       rotateD * scale,
   1113       offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
   1114       offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
   1115     ];
   1116 
   1117     this.offsetX = offsetX;
   1118     this.offsetY = offsetY;
   1119     this.width = width;
   1120     this.height = height;
   1121     this.fontScale = scale;
   1122   }
   1123   PageViewport.prototype = {
   1124     convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
   1125       return Util.applyTransform([x, y], this.transform);
   1126     },
   1127     convertToViewportRectangle:
   1128       function PageViewport_convertToViewportRectangle(rect) {
   1129       var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
   1130       var br = Util.applyTransform([rect[2], rect[3]], this.transform);
   1131       return [tl[0], tl[1], br[0], br[1]];
   1132     },
   1133     convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
   1134       return Util.applyInverseTransform([x, y], this.transform);
   1135     }
   1136   };
   1137   return PageViewport;
   1138 })();
   1139 
   1140 var PDFStringTranslateTable = [
   1141   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1142   0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
   1143   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1144   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1145   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1146   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
   1147   0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
   1148   0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
   1149   0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
   1150 ];
   1151 
   1152 function stringToPDFString(str) {
   1153   var i, n = str.length, str2 = '';
   1154   if (str[0] === '\xFE' && str[1] === '\xFF') {
   1155     // UTF16BE BOM
   1156     for (i = 2; i < n; i += 2)
   1157       str2 += String.fromCharCode(
   1158         (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
   1159   } else {
   1160     for (i = 0; i < n; ++i) {
   1161       var code = PDFStringTranslateTable[str.charCodeAt(i)];
   1162       str2 += code ? String.fromCharCode(code) : str.charAt(i);
   1163     }
   1164   }
   1165   return str2;
   1166 }
   1167 
   1168 function isBool(v) {
   1169   return typeof v == 'boolean';
   1170 }
   1171 
   1172 function isInt(v) {
   1173   return typeof v == 'number' && ((v | 0) == v);
   1174 }
   1175 
   1176 function isNum(v) {
   1177   return typeof v == 'number';
   1178 }
   1179 
   1180 function isString(v) {
   1181   return typeof v == 'string';
   1182 }
   1183 
   1184 function isNull(v) {
   1185   return v === null;
   1186 }
   1187 
   1188 function isName(v) {
   1189   return v instanceof Name;
   1190 }
   1191 
   1192 function isCmd(v, cmd) {
   1193   return v instanceof Cmd && (!cmd || v.cmd == cmd);
   1194 }
   1195 
   1196 function isDict(v, type) {
   1197   return v instanceof Dict && (!type || v.get('Type').name == type);
   1198 }
   1199 
   1200 function isArray(v) {
   1201   return v instanceof Array;
   1202 }
   1203 
   1204 function isStream(v) {
   1205   return typeof v == 'object' && v != null && ('getChar' in v);
   1206 }
   1207 
   1208 function isArrayBuffer(v) {
   1209   return typeof v == 'object' && v != null && ('byteLength' in v);
   1210 }
   1211 
   1212 function isRef(v) {
   1213   return v instanceof Ref;
   1214 }
   1215 
   1216 function isPDFFunction(v) {
   1217   var fnDict;
   1218   if (typeof v != 'object')
   1219     return false;
   1220   else if (isDict(v))
   1221     fnDict = v;
   1222   else if (isStream(v))
   1223     fnDict = v.dict;
   1224   else
   1225     return false;
   1226   return fnDict.has('FunctionType');
   1227 }
   1228 
   1229 /**
   1230  * 'Promise' object.
   1231  * Each object that is stored in PDFObjects is based on a Promise object that
   1232  * contains the status of the object and the data. There migth be situations,
   1233  * where a function want to use the value of an object, but it isn't ready at
   1234  * that time. To get a notification, once the object is ready to be used, s.o.
   1235  * can add a callback using the `then` method on the promise that then calls
   1236  * the callback once the object gets resolved.
   1237  * A promise can get resolved only once and only once the data of the promise
   1238  * can be set. If any of these happens twice or the data is required before
   1239  * it was set, an exception is throw.
   1240  */
   1241 var Promise = PDFJS.Promise = (function PromiseClosure() {
   1242   var EMPTY_PROMISE = {};
   1243 
   1244   /**
   1245    * If `data` is passed in this constructor, the promise is created resolved.
   1246    * If there isn't data, it isn't resolved at the beginning.
   1247    */
   1248   function Promise(name, data) {
   1249     this.name = name;
   1250     this.isRejected = false;
   1251     this.error = null;
   1252     // If you build a promise and pass in some data it's already resolved.
   1253     if (data != null) {
   1254       this.isResolved = true;
   1255       this._data = data;
   1256       this.hasData = true;
   1257     } else {
   1258       this.isResolved = false;
   1259       this._data = EMPTY_PROMISE;
   1260     }
   1261     this.callbacks = [];
   1262     this.errbacks = [];
   1263     this.progressbacks = [];
   1264   };
   1265   /**
   1266    * Builds a promise that is resolved when all the passed in promises are
   1267    * resolved.
   1268    * @param {Promise[]} promises Array of promises to wait for.
   1269    * @return {Promise} New dependant promise.
   1270    */
   1271   Promise.all = function Promise_all(promises) {
   1272     var deferred = new Promise();
   1273     var unresolved = promises.length;
   1274     var results = [];
   1275     if (unresolved === 0) {
   1276       deferred.resolve(results);
   1277       return deferred;
   1278     }
   1279     for (var i = 0, ii = promises.length; i < ii; ++i) {
   1280       var promise = promises[i];
   1281       promise.then((function(i) {
   1282         return function(value) {
   1283           results[i] = value;
   1284           unresolved--;
   1285           if (unresolved === 0)
   1286             deferred.resolve(results);
   1287         };
   1288       })(i));
   1289     }
   1290     return deferred;
   1291   };
   1292   Promise.prototype = {
   1293     hasData: false,
   1294 
   1295     set data(value) {
   1296       if (value === undefined) {
   1297         return;
   1298       }
   1299       if (this._data !== EMPTY_PROMISE) {
   1300         error('Promise ' + this.name +
   1301               ': Cannot set the data of a promise twice');
   1302       }
   1303       this._data = value;
   1304       this.hasData = true;
   1305 
   1306       if (this.onDataCallback) {
   1307         this.onDataCallback(value);
   1308       }
   1309     },
   1310 
   1311     get data() {
   1312       if (this._data === EMPTY_PROMISE) {
   1313         error('Promise ' + this.name + ': Cannot get data that isn\'t set');
   1314       }
   1315       return this._data;
   1316     },
   1317 
   1318     onData: function Promise_onData(callback) {
   1319       if (this._data !== EMPTY_PROMISE) {
   1320         callback(this._data);
   1321       } else {
   1322         this.onDataCallback = callback;
   1323       }
   1324     },
   1325 
   1326     resolve: function Promise_resolve(data) {
   1327       if (this.isResolved) {
   1328         error('A Promise can be resolved only once ' + this.name);
   1329       }
   1330       if (this.isRejected) {
   1331         error('The Promise was already rejected ' + this.name);
   1332       }
   1333 
   1334       this.isResolved = true;
   1335       this.data = data || null;
   1336       var callbacks = this.callbacks;
   1337 
   1338       for (var i = 0, ii = callbacks.length; i < ii; i++) {
   1339         callbacks[i].call(null, data);
   1340       }
   1341     },
   1342 
   1343     progress: function Promise_progress(data) {
   1344       var callbacks = this.progressbacks;
   1345       for (var i = 0, ii = callbacks.length; i < ii; i++) {
   1346         callbacks[i].call(null, data);
   1347       }
   1348     },
   1349 
   1350     reject: function Promise_reject(reason) {
   1351       if (this.isRejected) {
   1352         error('A Promise can be rejected only once ' + this.name);
   1353       }
   1354       if (this.isResolved) {
   1355         error('The Promise was already resolved ' + this.name);
   1356       }
   1357 
   1358       this.isRejected = true;
   1359       this.error = reason || null;
   1360       var errbacks = this.errbacks;
   1361 
   1362       for (var i = 0, ii = errbacks.length; i < ii; i++) {
   1363         errbacks[i].call(null, reason);
   1364       }
   1365     },
   1366 
   1367     then: function Promise_then(callback, errback, progressback) {
   1368       if (!callback) {
   1369         error('Requiring callback' + this.name);
   1370       }
   1371 
   1372       // If the promise is already resolved, call the callback directly.
   1373       if (this.isResolved) {
   1374         var data = this.data;
   1375         callback.call(null, data);
   1376       } else if (this.isRejected && errback) {
   1377         var error = this.error;
   1378         errback.call(null, error);
   1379       } else {
   1380         this.callbacks.push(callback);
   1381         if (errback)
   1382           this.errbacks.push(errback);
   1383       }
   1384 
   1385       if (progressback)
   1386         this.progressbacks.push(progressback);
   1387     }
   1388   };
   1389 
   1390   return Promise;
   1391 })();
   1392 
   1393 var StatTimer = (function StatTimerClosure() {
   1394   function rpad(str, pad, length) {
   1395     while (str.length < length)
   1396       str += pad;
   1397     return str;
   1398   }
   1399   function StatTimer() {
   1400     this.started = {};
   1401     this.times = [];
   1402     this.enabled = true;
   1403   }
   1404   StatTimer.prototype = {
   1405     time: function StatTimer_time(name) {
   1406       if (!this.enabled)
   1407         return;
   1408       if (name in this.started)
   1409         throw 'Timer is already running for ' + name;
   1410       this.started[name] = Date.now();
   1411     },
   1412     timeEnd: function StatTimer_timeEnd(name) {
   1413       if (!this.enabled)
   1414         return;
   1415       if (!(name in this.started))
   1416         throw 'Timer has not been started for ' + name;
   1417       this.times.push({
   1418         'name': name,
   1419         'start': this.started[name],
   1420         'end': Date.now()
   1421       });
   1422       // Remove timer from started so it can be called again.
   1423       delete this.started[name];
   1424     },
   1425     toString: function StatTimer_toString() {
   1426       var times = this.times;
   1427       var out = '';
   1428       // Find the longest name for padding purposes.
   1429       var longest = 0;
   1430       for (var i = 0, ii = times.length; i < ii; ++i) {
   1431         var name = times[i]['name'];
   1432         if (name.length > longest)
   1433           longest = name.length;
   1434       }
   1435       for (var i = 0, ii = times.length; i < ii; ++i) {
   1436         var span = times[i];
   1437         var duration = span.end - span.start;
   1438         out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
   1439       }
   1440       return out;
   1441     }
   1442   };
   1443   return StatTimer;
   1444 })();
   1445 
   1446 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   1447 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   1448 
   1449 /**
   1450  * This is the main entry point for loading a PDF and interacting with it.
   1451  * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
   1452  * is used, which means it must follow the same origin rules that any XHR does
   1453  * e.g. No cross domain requests without CORS.
   1454  *
   1455  * @param {string|TypedAray} source Either a url to a PDF is located or a
   1456  * typed array already populated with data.
   1457  * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object.
   1458  */
   1459 PDFJS.getDocument = function getDocument(source) {
   1460   var promise = new PDFJS.Promise();
   1461   var transport = new WorkerTransport(promise);
   1462   if (typeof source === 'string') {
   1463     // fetch url
   1464     PDFJS.getPdf(
   1465       {
   1466         url: source,
   1467         progress: function getPDFProgress(evt) {
   1468           if (evt.lengthComputable)
   1469             promise.progress({
   1470               loaded: evt.loaded,
   1471               total: evt.total
   1472             });
   1473         },
   1474         error: function getPDFError(e) {
   1475           promise.reject('Unexpected server response of ' +
   1476             e.target.status + '.');
   1477         }
   1478       },
   1479       function getPDFLoad(data) {
   1480         transport.sendData(data);
   1481       });
   1482   } else {
   1483     // assuming the source is array, instantiating directly from it
   1484     transport.sendData(source);
   1485   }
   1486   return promise;
   1487 };
   1488 
   1489 /**
   1490  * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
   1491  * properties that can be read synchronously.
   1492  */
   1493 var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
   1494   function PDFDocumentProxy(pdfInfo, transport) {
   1495     this.pdfInfo = pdfInfo;
   1496     this.transport = transport;
   1497   }
   1498   PDFDocumentProxy.prototype = {
   1499     /**
   1500      * @return {number} Total number of pages the PDF contains.
   1501      */
   1502     get numPages() {
   1503       return this.pdfInfo.numPages;
   1504     },
   1505     /**
   1506      * @return {string} A unique ID to identify a PDF. Not guaranteed to be
   1507      * unique.
   1508      */
   1509     get fingerprint() {
   1510       return this.pdfInfo.fingerprint;
   1511     },
   1512     /**
   1513      * @param {number} The page number to get. The first page is 1.
   1514      * @return {Promise} A promise that is resolved with a {PDFPageProxy}
   1515      * object.
   1516      */
   1517     getPage: function PDFDocumentProxy_getPage(number) {
   1518       return this.transport.getPage(number);
   1519     },
   1520     /**
   1521      * @return {Promise} A promise that is resolved with a lookup table for
   1522      * mapping named destinations to reference numbers.
   1523      */
   1524     getDestinations: function PDFDocumentProxy_getDestinations() {
   1525       var promise = new PDFJS.Promise();
   1526       var destinations = this.pdfInfo.destinations;
   1527       promise.resolve(destinations);
   1528       return promise;
   1529     },
   1530     /**
   1531      * @return {Promise} A promise that is resolved with an {array} that is a
   1532      * tree outline (if it has one) of the PDF. The tree is in the format of:
   1533      * [
   1534      *  {
   1535      *   title: string,
   1536      *   bold: boolean,
   1537      *   italic: boolean,
   1538      *   color: rgb array,
   1539      *   dest: dest obj,
   1540      *   items: array of more items like this
   1541      *  },
   1542      *  ...
   1543      * ].
   1544      */
   1545     getOutline: function PDFDocumentProxy_getOutline() {
   1546       var promise = new PDFJS.Promise();
   1547       var outline = this.pdfInfo.outline;
   1548       promise.resolve(outline);
   1549       return promise;
   1550     },
   1551     /**
   1552      * @return {Promise} A promise that is resolved with an {object} that has
   1553      * info and metadata properties.  Info is an {object} filled with anything
   1554      * available in the information dictionary and similarly metadata is a
   1555      * {Metadata} object with information from the metadata section of the PDF.
   1556      */
   1557     getMetadata: function PDFDocumentProxy_getMetadata() {
   1558       var promise = new PDFJS.Promise();
   1559       var info = this.pdfInfo.info;
   1560       var metadata = this.pdfInfo.metadata;
   1561       promise.resolve({
   1562         info: info,
   1563         metadata: metadata ? new PDFJS.Metadata(metadata) : null
   1564       });
   1565       return promise;
   1566     },
   1567     destroy: function PDFDocumentProxy_destroy() {
   1568       this.transport.destroy();
   1569     }
   1570   };
   1571   return PDFDocumentProxy;
   1572 })();
   1573 
   1574 var PDFPageProxy = (function PDFPageProxyClosure() {
   1575   function PDFPageProxy(pageInfo, transport) {
   1576     this.pageInfo = pageInfo;
   1577     this.transport = transport;
   1578     this.stats = new StatTimer();
   1579     this.stats.enabled = !!globalScope.PDFJS.enableStats;
   1580     this.objs = transport.objs;
   1581     this.renderInProgress = false;
   1582   }
   1583   PDFPageProxy.prototype = {
   1584     /**
   1585      * @return {number} Page number of the page. First page is 1.
   1586      */
   1587     get pageNumber() {
   1588       return this.pageInfo.pageIndex + 1;
   1589     },
   1590     /**
   1591      * @return {number} The number of degrees the page is rotated clockwise.
   1592      */
   1593     get rotate() {
   1594       return this.pageInfo.rotate;
   1595     },
   1596     /**
   1597      * @return {object} The reference that points to this page. It has 'num' and
   1598      * 'gen' properties.
   1599      */
   1600     get ref() {
   1601       return this.pageInfo.ref;
   1602     },
   1603     /**
   1604      * @return {array} An array of the visible portion of the PDF page in the
   1605      * user space units - [x1, y1, x2, y2].
   1606      */
   1607     get view() {
   1608       return this.pageInfo.view;
   1609     },
   1610     /**
   1611      * @param {number} scale The desired scale of the viewport.
   1612      * @param {number} rotate Degrees to rotate the viewport. If omitted this
   1613      * defaults to the page rotation.
   1614      * @return {PageViewport} Contains 'width' and 'height' properties along
   1615      * with transforms required for rendering.
   1616      */
   1617     getViewport: function PDFPageProxy_getViewport(scale, rotate) {
   1618       if (arguments.length < 2)
   1619         rotate = this.rotate;
   1620       return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
   1621     },
   1622     /**
   1623      * @return {Promise} A promise that is resolved with an {array} of the
   1624      * annotation objects.
   1625      */
   1626     getAnnotations: function PDFPageProxy_getAnnotations() {
   1627       if (this.annotationsPromise)
   1628         return this.annotationsPromise;
   1629 
   1630       var promise = new PDFJS.Promise();
   1631       this.annotationsPromise = promise;
   1632       this.transport.getAnnotations(this.pageInfo.pageIndex);
   1633       return promise;
   1634     },
   1635     /**
   1636      * Begins the process of rendering a page to the desired context.
   1637      * @param {object} params A parameter object that supports:
   1638      * {
   1639      *   canvasContext(required): A 2D context of a DOM Canvas object.,
   1640      *   textLayer(optional): An object that has beginLayout, endLayout, and
   1641      *                        appendText functions.
   1642      * }.
   1643      * @return {Promise} A promise that is resolved when the page finishes
   1644      * rendering.
   1645      */
   1646     render: function PDFPageProxy_render(params) {
   1647       this.renderInProgress = true;
   1648 
   1649       var promise = new Promise();
   1650       var stats = this.stats;
   1651       stats.time('Overall');
   1652       // If there is no displayReadyPromise yet, then the operatorList was never
   1653       // requested before. Make the request and create the promise.
   1654       if (!this.displayReadyPromise) {
   1655         this.displayReadyPromise = new Promise();
   1656         this.destroyed = false;
   1657 
   1658         this.stats.time('Page Request');
   1659         this.transport.messageHandler.send('RenderPageRequest', {
   1660           pageIndex: this.pageNumber - 1
   1661         });
   1662       }
   1663 
   1664       var self = this;
   1665       function complete(error) {
   1666         self.renderInProgress = false;
   1667         if (self.destroyed) {
   1668           delete self.operatorList;
   1669           delete self.displayReadyPromise;
   1670         }
   1671 
   1672         if (error)
   1673           promise.reject(error);
   1674         else
   1675           promise.resolve();
   1676       };
   1677 
   1678       // Once the operatorList and fonts are loaded, do the actual rendering.
   1679       this.displayReadyPromise.then(
   1680         function pageDisplayReadyPromise() {
   1681           if (self.destroyed) {
   1682             complete();
   1683             return;
   1684           }
   1685 
   1686           var gfx = new CanvasGraphics(params.canvasContext,
   1687             this.objs, params.textLayer);
   1688           try {
   1689            this.display(gfx, params.viewport, complete);
   1690           } catch (e) {
   1691             complete(e);
   1692           }
   1693         }.bind(this),
   1694         function pageDisplayReadPromiseError(reason) {
   1695           complete(reason);
   1696         }
   1697       );
   1698 
   1699       return promise;
   1700     },
   1701     /**
   1702      * For internal use only.
   1703      */
   1704     startRenderingFromOperatorList:
   1705       function PDFPageProxy_startRenderingFromOperatorList(operatorList,
   1706                                                            fonts) {
   1707       var self = this;
   1708       this.operatorList = operatorList;
   1709 
   1710       var displayContinuation = function pageDisplayContinuation() {
   1711         // Always defer call to display() to work around bug in
   1712         // Firefox error reporting from XHR callbacks.
   1713         PdfJS_window.setTimeout(function pageSetTimeout() {
   1714           self.displayReadyPromise.resolve();
   1715         });
   1716       };
   1717 
   1718       this.ensureFonts(fonts,
   1719         function pageStartRenderingFromOperatorListEnsureFonts() {
   1720           displayContinuation();
   1721         }
   1722       );
   1723     },
   1724     /**
   1725      * For internal use only.
   1726      */
   1727     ensureFonts: function PDFPageProxy_ensureFonts(fonts, callback) {
   1728       this.stats.time('Font Loading');
   1729       // Convert the font names to the corresponding font obj.
   1730       for (var i = 0, ii = fonts.length; i < ii; i++) {
   1731         fonts[i] = this.objs.objs[fonts[i]].data;
   1732       }
   1733 
   1734       // Load all the fonts
   1735       FontLoader.bind(
   1736         fonts,
   1737         function pageEnsureFontsFontObjs(fontObjs) {
   1738           this.stats.timeEnd('Font Loading');
   1739 
   1740           callback.call(this);
   1741         }.bind(this)
   1742       );
   1743     },
   1744     /**
   1745      * For internal use only.
   1746      */
   1747     display: function PDFPageProxy_display(gfx, viewport, callback) {
   1748       var stats = this.stats;
   1749       stats.time('Rendering');
   1750 
   1751       gfx.beginDrawing(viewport);
   1752 
   1753       var startIdx = 0;
   1754       var length = this.operatorList.fnArray.length;
   1755       var operatorList = this.operatorList;
   1756       var stepper = null;
   1757       if (PDFJS.pdfBug && StepperManager.enabled) {
   1758         stepper = StepperManager.create(this.pageNumber - 1);
   1759         stepper.init(operatorList);
   1760         stepper.nextBreakPoint = stepper.getNextBreakPoint();
   1761       }
   1762 
   1763       var self = this;
   1764       function next() {
   1765         startIdx =
   1766           gfx.executeOperatorList(operatorList, startIdx, next, stepper);
   1767         if (startIdx == length) {
   1768           gfx.endDrawing();
   1769           stats.timeEnd('Rendering');
   1770           stats.timeEnd('Overall');
   1771           if (callback) callback();
   1772         }
   1773       }
   1774       next();
   1775     },
   1776     /**
   1777      * Stub for future feature.
   1778      */
   1779     getTextContent: function PDFPageProxy_getTextContent() {
   1780       var promise = new PDFJS.Promise();
   1781       var textContent = 'page text'; // not implemented
   1782       promise.resolve(textContent);
   1783       return promise;
   1784     },
   1785     /**
   1786      * Stub for future feature.
   1787      */
   1788     getOperationList: function PDFPageProxy_getOperationList() {
   1789       var promise = new PDFJS.Promise();
   1790       var operationList = { // not implemented
   1791         dependencyFontsID: null,
   1792         operatorList: null
   1793       };
   1794       promise.resolve(operationList);
   1795       return promise;
   1796     },
   1797     /**
   1798      * Destroys resources allocated by the page.
   1799      */
   1800     destroy: function PDFPageProxy_destroy() {
   1801       this.destroyed = true;
   1802 
   1803       if (!this.renderInProgress) {
   1804         delete this.operatorList;
   1805         delete this.displayReadyPromise;
   1806       }
   1807     }
   1808   };
   1809   return PDFPageProxy;
   1810 })();
   1811 /**
   1812  * For internal use only.
   1813  */
   1814 var WorkerTransport = (function WorkerTransportClosure() {
   1815   function WorkerTransport(promise) {
   1816     this.workerReadyPromise = promise;
   1817     this.objs = new PDFObjects();
   1818 
   1819     this.pageCache = [];
   1820     this.pagePromises = [];
   1821     this.fontsLoading = {};
   1822 
   1823     // If worker support isn't disabled explicit and the browser has worker
   1824     // support, create a new web worker and test if it/the browser fullfills
   1825     // all requirements to run parts of pdf.js in a web worker.
   1826     // Right now, the requirement is, that an Uint8Array is still an Uint8Array
   1827     // as it arrives on the worker. Chrome added this with version 15.
   1828     if (!globalScope.PDFJS.disableWorker && typeof PdfJS_window.Worker !== 'undefined') {
   1829       var workerSrc = PDFJS.workerSrc;
   1830       if (typeof workerSrc === 'undefined') {
   1831         error('No PDFJS.workerSrc specified');
   1832       }
   1833 
   1834       try {
   1835         var worker;
   1836         if (PDFJS.isFirefoxExtension) {
   1837           // The firefox extension can't load the worker from the resource://
   1838           // url so we have to inline the script and then use the blob loader.
   1839           var bb = new MozBlobBuilder();
   1840           bb.append(PdfJS_window.document.querySelector('#PDFJS_SCRIPT_TAG').textContent);
   1841           var blobUrl = PdfJS_window.window.URL.createObjectURL(bb.getBlob());
   1842           worker = new Worker(blobUrl);
   1843         } else {
   1844           // Some versions of FF can't create a worker on localhost, see:
   1845           // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
   1846           worker = new Worker(workerSrc);
   1847         }
   1848 
   1849         var messageHandler = new MessageHandler('main', worker);
   1850         this.messageHandler = messageHandler;
   1851 
   1852         messageHandler.on('test', function transportTest(supportTypedArray) {
   1853           if (supportTypedArray) {
   1854             this.worker = worker;
   1855             this.setupMessageHandler(messageHandler);
   1856           } else {
   1857             globalScope.PDFJS.disableWorker = true;
   1858             this.setupFakeWorker();
   1859           }
   1860         }.bind(this));
   1861 
   1862         var testObj = new Uint8Array(1);
   1863         // Some versions of Opera throw a DATA_CLONE_ERR on
   1864         // serializing the typed array.
   1865         messageHandler.send('test', testObj);
   1866         return;
   1867       } catch (e) {
   1868         warn('The worker has been disabled.');
   1869       }
   1870     }
   1871     // Either workers are disabled, not supported or have thrown an exception.
   1872     // Thus, we fallback to a faked worker.
   1873     globalScope.PDFJS.disableWorker = true;
   1874     this.setupFakeWorker();
   1875   }
   1876   WorkerTransport.prototype = {
   1877     destroy: function WorkerTransport_destroy() {
   1878       if (this.worker)
   1879         this.worker.terminate();
   1880 
   1881       this.pageCache = [];
   1882       this.pagePromises = [];
   1883     },
   1884     setupFakeWorker: function WorkerTransport_setupFakeWorker() {
   1885       // If we don't use a worker, just post/sendMessage to the main thread.
   1886       var fakeWorker = {
   1887         postMessage: function WorkerTransport_postMessage(obj) {
   1888           fakeWorker.onmessage({data: obj});
   1889         },
   1890         terminate: function WorkerTransport_terminate() {}
   1891       };
   1892 
   1893       var messageHandler = new MessageHandler('main', fakeWorker);
   1894       this.setupMessageHandler(messageHandler);
   1895 
   1896       // If the main thread is our worker, setup the handling for the messages
   1897       // the main thread sends to it self.
   1898       WorkerMessageHandler.setup(messageHandler);
   1899     },
   1900 
   1901     setupMessageHandler:
   1902       function WorkerTransport_setupMessageHandler(messageHandler) {
   1903       this.messageHandler = messageHandler;
   1904 
   1905       messageHandler.on('GetDoc', function transportDoc(data) {
   1906         var pdfInfo = data.pdfInfo;
   1907         var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
   1908         this.pdfDocument = pdfDocument;
   1909         this.workerReadyPromise.resolve(pdfDocument);
   1910       }, this);
   1911 
   1912       messageHandler.on('GetPage', function transportPage(data) {
   1913         var pageInfo = data.pageInfo;
   1914         var page = new PDFPageProxy(pageInfo, this);
   1915         this.pageCache[pageInfo.pageIndex] = page;
   1916         var promise = this.pagePromises[pageInfo.pageIndex];
   1917         promise.resolve(page);
   1918       }, this);
   1919 
   1920       messageHandler.on('GetAnnotations', function transportAnnotations(data) {
   1921         var annotations = data.annotations;
   1922         var promise = this.pageCache[data.pageIndex].annotationsPromise;
   1923         promise.resolve(annotations);
   1924       }, this);
   1925 
   1926       messageHandler.on('RenderPage', function transportRender(data) {
   1927         var page = this.pageCache[data.pageIndex];
   1928         var depFonts = data.depFonts;
   1929 
   1930         page.stats.timeEnd('Page Request');
   1931         page.startRenderingFromOperatorList(data.operatorList, depFonts);
   1932       }, this);
   1933 
   1934       messageHandler.on('obj', function transportObj(data) {
   1935         var id = data[0];
   1936         var type = data[1];
   1937         if (this.objs.hasData(id))
   1938           return;
   1939 
   1940         switch (type) {
   1941           case 'JpegStream':
   1942             var imageData = data[2];
   1943             loadJpegStream(id, imageData, this.objs);
   1944             break;
   1945           case 'Image':
   1946             var imageData = data[2];
   1947             this.objs.resolve(id, imageData);
   1948             break;
   1949           case 'Font':
   1950             var name = data[2];
   1951             var file = data[3];
   1952             var properties = data[4];
   1953 
   1954             if (file) {
   1955               // Rewrap the ArrayBuffer in a stream.
   1956               var fontFileDict = new Dict();
   1957               file = new Stream(file, 0, file.length, fontFileDict);
   1958             }
   1959 
   1960             // At this point, only the font object is created but the font is
   1961             // not yet attached to the DOM. This is done in `FontLoader.bind`.
   1962             var font = new Font(name, file, properties);
   1963             this.objs.resolve(id, font);
   1964             break;
   1965           default:
   1966             error('Got unkown object type ' + type);
   1967         }
   1968       }, this);
   1969 
   1970       messageHandler.on('PageError', function transportError(data) {
   1971         var page = this.pageCache[data.pageNum - 1];
   1972         if (page.displayReadyPromise)
   1973           page.displayReadyPromise.reject(data.error);
   1974         else
   1975           error(data.error);
   1976       }, this);
   1977 
   1978       messageHandler.on('JpegDecode', function(data, promise) {
   1979         var imageData = data[0];
   1980         var components = data[1];
   1981         if (components != 3 && components != 1)
   1982           error('Only 3 component or 1 component can be returned');
   1983 
   1984         var img = new Image();
   1985         img.onload = (function messageHandler_onloadClosure() {
   1986           var width = img.width;
   1987           var height = img.height;
   1988           var size = width * height;
   1989           var rgbaLength = size * 4;
   1990           var buf = new Uint8Array(size * components);
   1991           var tmpCanvas = createScratchCanvas(width, height);
   1992           var tmpCtx = tmpCanvas.getContext('2d');
   1993           tmpCtx.drawImage(img, 0, 0);
   1994           var data = tmpCtx.getImageData(0, 0, width, height).data;
   1995 
   1996           if (components == 3) {
   1997             for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
   1998               buf[j] = data[i];
   1999               buf[j + 1] = data[i + 1];
   2000               buf[j + 2] = data[i + 2];
   2001             }
   2002           } else if (components == 1) {
   2003             for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) {
   2004               buf[j] = data[i];
   2005             }
   2006           }
   2007           promise.resolve({ data: buf, width: width, height: height});
   2008         }).bind(this);
   2009         var src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
   2010         img.src = src;
   2011       });
   2012     },
   2013 
   2014     sendData: function WorkerTransport_sendData(data) {
   2015       this.messageHandler.send('GetDocRequest', data);
   2016     },
   2017 
   2018     getPage: function WorkerTransport_getPage(pageNumber, promise) {
   2019       var pageIndex = pageNumber - 1;
   2020       if (pageIndex in this.pagePromises)
   2021         return this.pagePromises[pageIndex];
   2022       var promise = new PDFJS.Promise('Page ' + pageNumber);
   2023       this.pagePromises[pageIndex] = promise;
   2024       this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex });
   2025       return promise;
   2026     },
   2027 
   2028     getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
   2029       this.messageHandler.send('GetAnnotationsRequest',
   2030         { pageIndex: pageIndex });
   2031     }
   2032   };
   2033   return WorkerTransport;
   2034 
   2035 })();
   2036 
   2037 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   2038 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   2039 
   2040 'use strict';
   2041 
   2042 // <canvas> contexts store most of the state we need natively.
   2043 // However, PDF needs a bit more state, which we store here.
   2044 
   2045 var TextRenderingMode = {
   2046   FILL: 0,
   2047   STROKE: 1,
   2048   FILL_STROKE: 2,
   2049   INVISIBLE: 3,
   2050   FILL_ADD_TO_PATH: 4,
   2051   STROKE_ADD_TO_PATH: 5,
   2052   FILL_STROKE_ADD_TO_PATH: 6,
   2053   ADD_TO_PATH: 7
   2054 };
   2055 
   2056 // Minimal font size that would be used during canvas fillText operations.
   2057 var MIN_FONT_SIZE = 1;
   2058 
   2059 function createScratchCanvas(width, height) {
   2060   var canvas = PdfJS_window.document.createElement('canvas');
   2061   canvas.width = width;
   2062   canvas.height = height;
   2063   return canvas;
   2064 }
   2065 
   2066 function addContextCurrentTransform(ctx) {
   2067   // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
   2068   if (!ctx.mozCurrentTransform) {
   2069     // Store the original context
   2070     ctx._originalSave = ctx.save;
   2071     ctx._originalRestore = ctx.restore;
   2072     ctx._originalRotate = ctx.rotate;
   2073     ctx._originalScale = ctx.scale;
   2074     ctx._originalTranslate = ctx.translate;
   2075     ctx._originalTransform = ctx.transform;
   2076 
   2077     ctx._transformMatrix = [1, 0, 0, 1, 0, 0];
   2078     ctx._transformStack = [];
   2079 
   2080     Object.defineProperty(ctx, 'mozCurrentTransform', {
   2081       get: function getCurrentTransform() {
   2082         return this._transformMatrix;
   2083       }
   2084     });
   2085 
   2086     Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
   2087       get: function getCurrentTransformInverse() {
   2088         // Calculation done using WolframAlpha:
   2089         // http://www.wolframalpha.com/input/?
   2090         //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
   2091 
   2092         var m = this._transformMatrix;
   2093         var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
   2094 
   2095         var ad_bc = a * d - b * c;
   2096         var bc_ad = b * c - a * d;
   2097 
   2098         return [
   2099           d / ad_bc,
   2100           b / bc_ad,
   2101           c / bc_ad,
   2102           a / ad_bc,
   2103           (d * e - c * f) / bc_ad,
   2104           (b * e - a * f) / ad_bc
   2105         ];
   2106       }
   2107     });
   2108 
   2109     ctx.save = function ctxSave() {
   2110       var old = this._transformMatrix;
   2111       this._transformStack.push(old);
   2112       this._transformMatrix = old.slice(0, 6);
   2113 
   2114       this._originalSave();
   2115     };
   2116 
   2117     ctx.restore = function ctxRestore() {
   2118       var prev = this._transformStack.pop();
   2119       if (prev) {
   2120         this._transformMatrix = prev;
   2121         this._originalRestore();
   2122       }
   2123     };
   2124 
   2125     ctx.translate = function ctxTranslate(x, y) {
   2126       var m = this._transformMatrix;
   2127       m[4] = m[0] * x + m[2] * y + m[4];
   2128       m[5] = m[1] * x + m[3] * y + m[5];
   2129 
   2130       this._originalTranslate(x, y);
   2131     };
   2132 
   2133     ctx.scale = function ctxScale(x, y) {
   2134       var m = this._transformMatrix;
   2135       m[0] = m[0] * x;
   2136       m[1] = m[1] * x;
   2137       m[2] = m[2] * y;
   2138       m[3] = m[3] * y;
   2139 
   2140       this._originalScale(x, y);
   2141     };
   2142 
   2143     ctx.transform = function ctxTransform(a, b, c, d, e, f) {
   2144       var m = this._transformMatrix;
   2145       this._transformMatrix = [
   2146         m[0] * a + m[2] * b,
   2147         m[1] * a + m[3] * b,
   2148         m[0] * c + m[2] * d,
   2149         m[1] * c + m[3] * d,
   2150         m[0] * e + m[2] * f + m[4],
   2151         m[1] * e + m[3] * f + m[5]
   2152       ];
   2153 
   2154       ctx._originalTransform(a, b, c, d, e, f);
   2155     };
   2156 
   2157     ctx.rotate = function ctxRotate(angle) {
   2158       var cosValue = Math.cos(angle);
   2159       var sinValue = Math.sin(angle);
   2160 
   2161       var m = this._transformMatrix;
   2162       this._transformMatrix = [
   2163         m[0] * cosValue + m[2] * sinValue,
   2164         m[1] * cosValue + m[3] * sinValue,
   2165         m[0] * (-sinValue) + m[2] * cosValue,
   2166         m[1] * (-sinValue) + m[3] * cosValue,
   2167         m[4],
   2168         m[5]
   2169       ];
   2170 
   2171       this._originalRotate(angle);
   2172     };
   2173   }
   2174 }
   2175 
   2176 var CanvasExtraState = (function CanvasExtraStateClosure() {
   2177   function CanvasExtraState(old) {
   2178     // Are soft masks and alpha values shapes or opacities?
   2179     this.alphaIsShape = false;
   2180     this.fontSize = 0;
   2181     this.fontSizeScale = 1;
   2182     this.textMatrix = IDENTITY_MATRIX;
   2183     this.fontMatrix = IDENTITY_MATRIX;
   2184     this.leading = 0;
   2185     // Current point (in user coordinates)
   2186     this.x = 0;
   2187     this.y = 0;
   2188     // Start of text line (in text coordinates)
   2189     this.lineX = 0;
   2190     this.lineY = 0;
   2191     // Character and word spacing
   2192     this.charSpacing = 0;
   2193     this.wordSpacing = 0;
   2194     this.textHScale = 1;
   2195     this.textRenderingMode = TextRenderingMode.FILL;
   2196     // Color spaces
   2197     this.fillColorSpace = new DeviceGrayCS();
   2198     this.fillColorSpaceObj = null;
   2199     this.strokeColorSpace = new DeviceGrayCS();
   2200     this.strokeColorSpaceObj = null;
   2201     this.fillColorObj = null;
   2202     this.strokeColorObj = null;
   2203     // Default fore and background colors
   2204     this.fillColor = '#000000';
   2205     this.strokeColor = '#000000';
   2206     // Note: fill alpha applies to all non-stroking operations
   2207     this.fillAlpha = 1;
   2208     this.strokeAlpha = 1;
   2209     this.lineWidth = 1;
   2210 
   2211     this.old = old;
   2212   }
   2213 
   2214   CanvasExtraState.prototype = {
   2215     clone: function CanvasExtraState_clone() {
   2216       return Object.create(this);
   2217     },
   2218     setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
   2219       this.x = x;
   2220       this.y = y;
   2221     }
   2222   };
   2223   return CanvasExtraState;
   2224 })();
   2225 
   2226 var CanvasGraphics = (function CanvasGraphicsClosure() {
   2227   // Defines the time the executeOperatorList is going to be executing
   2228   // before it stops and shedules a continue of execution.
   2229   var kExecutionTime = 15;
   2230 
   2231   function CanvasGraphics(canvasCtx, objs, textLayer) {
   2232     this.ctx = canvasCtx;
   2233     this.current = new CanvasExtraState();
   2234     this.stateStack = [];
   2235     this.pendingClip = null;
   2236     this.res = null;
   2237     this.xobjs = null;
   2238     this.objs = objs;
   2239     this.textLayer = textLayer;
   2240     if (canvasCtx) {
   2241       addContextCurrentTransform(canvasCtx);
   2242     }
   2243   }
   2244 
   2245   var LINE_CAP_STYLES = ['butt', 'round', 'square'];
   2246   var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
   2247   var NORMAL_CLIP = {};
   2248   var EO_CLIP = {};
   2249 
   2250   CanvasGraphics.prototype = {
   2251     slowCommands: {
   2252       'stroke': true,
   2253       'closeStroke': true,
   2254       'fill': true,
   2255       'eoFill': true,
   2256       'fillStroke': true,
   2257       'eoFillStroke': true,
   2258       'closeFillStroke': true,
   2259       'closeEOFillStroke': true,
   2260       'showText': true,
   2261       'showSpacedText': true,
   2262       'setStrokeColorSpace': true,
   2263       'setFillColorSpace': true,
   2264       'setStrokeColor': true,
   2265       'setStrokeColorN': true,
   2266       'setFillColor': true,
   2267       'setFillColorN': true,
   2268       'setStrokeGray': true,
   2269       'setFillGray': true,
   2270       'setStrokeRGBColor': true,
   2271       'setFillRGBColor': true,
   2272       'setStrokeCMYKColor': true,
   2273       'setFillCMYKColor': true,
   2274       'paintJpegXObject': true,
   2275       'paintImageXObject': true,
   2276       'paintImageMaskXObject': true,
   2277       'shadingFill': true
   2278     },
   2279 
   2280     beginDrawing: function CanvasGraphics_beginDrawing(viewport) {
   2281       var transform = viewport.transform;
   2282       this.ctx.save();
   2283       this.ctx.transform.apply(this.ctx, transform);
   2284 
   2285       if (this.textLayer)
   2286         this.textLayer.beginLayout();
   2287     },
   2288 
   2289     executeOperatorList: function CanvasGraphics_executeOperatorList(
   2290                                     operatorList,
   2291                                     executionStartIdx, continueCallback,
   2292                                     stepper) {
   2293       var argsArray = operatorList.argsArray;
   2294       var fnArray = operatorList.fnArray;
   2295       var i = executionStartIdx || 0;
   2296       var argsArrayLen = argsArray.length;
   2297 
   2298       // Sometimes the OperatorList to execute is empty.
   2299       if (argsArrayLen == i) {
   2300         return i;
   2301       }
   2302 
   2303       var executionEndIdx;
   2304       var endTime = Date.now() + kExecutionTime;
   2305 
   2306       var objs = this.objs;
   2307       var fnName;
   2308       var slowCommands = this.slowCommands;
   2309 
   2310       while (true) {
   2311         if (stepper && i === stepper.nextBreakPoint) {
   2312           stepper.breakIt(i, continueCallback);
   2313           return i;
   2314         }
   2315 
   2316         fnName = fnArray[i];
   2317 
   2318         if (fnName !== 'dependency') {
   2319           this[fnName].apply(this, argsArray[i]);
   2320         } else {
   2321           var deps = argsArray[i];
   2322           for (var n = 0, nn = deps.length; n < nn; n++) {
   2323             var depObjId = deps[n];
   2324 
   2325             // If the promise isn't resolved yet, add the continueCallback
   2326             // to the promise and bail out.
   2327             if (!objs.isResolved(depObjId)) {
   2328               objs.get(depObjId, continueCallback);
   2329               return i;
   2330             }
   2331           }
   2332         }
   2333 
   2334         i++;
   2335 
   2336         // If the entire operatorList was executed, stop as were done.
   2337         if (i == argsArrayLen) {
   2338           return i;
   2339         }
   2340 
   2341         // If the execution took longer then a certain amount of time, shedule
   2342         // to continue exeution after a short delay.
   2343         // However, this is only possible if a 'continueCallback' is passed in.
   2344         if (continueCallback && slowCommands[fnName] && Date.now() > endTime) {
   2345           PdfJS_window.setTimeout(continueCallback, 0);
   2346           return i;
   2347         }
   2348 
   2349         // If the operatorList isn't executed completely yet OR the execution
   2350         // time was short enough, do another execution round.
   2351       }
   2352     },
   2353 
   2354     endDrawing: function CanvasGraphics_endDrawing() {
   2355       this.ctx.restore();
   2356 
   2357       if (this.textLayer)
   2358         this.textLayer.endLayout();
   2359     },
   2360 
   2361     // Graphics state
   2362     setLineWidth: function CanvasGraphics_setLineWidth(width) {
   2363       this.current.lineWidth = width;
   2364       this.ctx.lineWidth = width;
   2365     },
   2366     setLineCap: function CanvasGraphics_setLineCap(style) {
   2367       this.ctx.lineCap = LINE_CAP_STYLES[style];
   2368     },
   2369     setLineJoin: function CanvasGraphics_setLineJoin(style) {
   2370       this.ctx.lineJoin = LINE_JOIN_STYLES[style];
   2371     },
   2372     setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
   2373       this.ctx.miterLimit = limit;
   2374     },
   2375     setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
   2376       this.ctx.mozDash = dashArray;
   2377       this.ctx.mozDashOffset = dashPhase;
   2378       this.ctx.webkitLineDash = dashArray;
   2379       this.ctx.webkitLineDashOffset = dashPhase;
   2380     },
   2381     setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
   2382       TODO('set rendering intent: ' + intent);
   2383     },
   2384     setFlatness: function CanvasGraphics_setFlatness(flatness) {
   2385       TODO('set flatness: ' + flatness);
   2386     },
   2387     setGState: function CanvasGraphics_setGState(states) {
   2388       for (var i = 0, ii = states.length; i < ii; i++) {
   2389         var state = states[i];
   2390         var key = state[0];
   2391         var value = state[1];
   2392 
   2393         switch (key) {
   2394           case 'LW':
   2395             this.setLineWidth(value);
   2396             break;
   2397           case 'LC':
   2398             this.setLineCap(value);
   2399             break;
   2400           case 'LJ':
   2401             this.setLineJoin(value);
   2402             break;
   2403           case 'ML':
   2404             this.setMiterLimit(value);
   2405             break;
   2406           case 'D':
   2407             this.setDash(value[0], value[1]);
   2408             break;
   2409           case 'RI':
   2410             this.setRenderingIntent(value);
   2411             break;
   2412           case 'FL':
   2413             this.setFlatness(value);
   2414             break;
   2415           case 'Font':
   2416             this.setFont(state[1], state[2]);
   2417             break;
   2418           case 'CA':
   2419             this.current.strokeAlpha = state[1];
   2420             break;
   2421           case 'ca':
   2422             this.current.fillAlpha = state[1];
   2423             this.ctx.globalAlpha = state[1];
   2424             break;
   2425         }
   2426       }
   2427     },
   2428     save: function CanvasGraphics_save() {
   2429       this.ctx.save();
   2430       var old = this.current;
   2431       this.stateStack.push(old);
   2432       this.current = old.clone();
   2433     },
   2434     restore: function CanvasGraphics_restore() {
   2435       var prev = this.stateStack.pop();
   2436       if (prev) {
   2437         this.current = prev;
   2438         this.ctx.restore();
   2439       }
   2440     },
   2441     transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
   2442       this.ctx.transform(a, b, c, d, e, f);
   2443     },
   2444 
   2445     // Path
   2446     moveTo: function CanvasGraphics_moveTo(x, y) {
   2447       this.ctx.moveTo(x, y);
   2448       this.current.setCurrentPoint(x, y);
   2449     },
   2450     lineTo: function CanvasGraphics_lineTo(x, y) {
   2451       this.ctx.lineTo(x, y);
   2452       this.current.setCurrentPoint(x, y);
   2453     },
   2454     curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) {
   2455       this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
   2456       this.current.setCurrentPoint(x3, y3);
   2457     },
   2458     curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) {
   2459       var current = this.current;
   2460       this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
   2461       current.setCurrentPoint(x3, y3);
   2462     },
   2463     curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
   2464       this.curveTo(x1, y1, x3, y3, x3, y3);
   2465       this.current.setCurrentPoint(x3, y3);
   2466     },
   2467     closePath: function CanvasGraphics_closePath() {
   2468       this.ctx.closePath();
   2469     },
   2470     rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
   2471       this.ctx.rect(x, y, width, height);
   2472     },
   2473     stroke: function CanvasGraphics_stroke(consumePath) {
   2474       consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
   2475       var ctx = this.ctx;
   2476       var strokeColor = this.current.strokeColor;
   2477       if (this.current.lineWidth === 0)
   2478         ctx.lineWidth = this.getSinglePixelWidth();
   2479       // For stroke we want to temporarily change the global alpha to the
   2480       // stroking alpha.
   2481       ctx.globalAlpha = this.current.strokeAlpha;
   2482       if (strokeColor && strokeColor.hasOwnProperty('type') &&
   2483           strokeColor.type === 'Pattern') {
   2484         // for patterns, we transform to pattern space, calculate
   2485         // the pattern, call stroke, and restore to user space
   2486         ctx.save();
   2487         ctx.strokeStyle = strokeColor.getPattern(ctx);
   2488         ctx.stroke();
   2489         ctx.restore();
   2490       } else {
   2491         ctx.stroke();
   2492       }
   2493       if (consumePath)
   2494         this.consumePath();
   2495       // Restore the global alpha to the fill alpha
   2496       ctx.globalAlpha = this.current.fillAlpha;
   2497     },
   2498     closeStroke: function CanvasGraphics_closeStroke() {
   2499       this.closePath();
   2500       this.stroke();
   2501     },
   2502     fill: function CanvasGraphics_fill(consumePath) {
   2503       consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
   2504       var ctx = this.ctx;
   2505       var fillColor = this.current.fillColor;
   2506 
   2507       if (fillColor && fillColor.hasOwnProperty('type') &&
   2508           fillColor.type === 'Pattern') {
   2509         ctx.save();
   2510         ctx.fillStyle = fillColor.getPattern(ctx);
   2511         ctx.fill();
   2512         ctx.restore();
   2513       } else {
   2514         ctx.fill();
   2515       }
   2516       if (consumePath)
   2517         this.consumePath();
   2518     },
   2519     eoFill: function CanvasGraphics_eoFill() {
   2520       var savedFillRule = this.setEOFillRule();
   2521       this.fill();
   2522       this.restoreFillRule(savedFillRule);
   2523     },
   2524     fillStroke: function CanvasGraphics_fillStroke() {
   2525       this.fill(false);
   2526       this.stroke(false);
   2527 
   2528       this.consumePath();
   2529     },
   2530     eoFillStroke: function CanvasGraphics_eoFillStroke() {
   2531       var savedFillRule = this.setEOFillRule();
   2532       this.fillStroke();
   2533       this.restoreFillRule(savedFillRule);
   2534     },
   2535     closeFillStroke: function CanvasGraphics_closeFillStroke() {
   2536       this.closePath();
   2537       this.fillStroke();
   2538     },
   2539     closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
   2540       var savedFillRule = this.setEOFillRule();
   2541       this.closePath();
   2542       this.fillStroke();
   2543       this.restoreFillRule(savedFillRule);
   2544     },
   2545     endPath: function CanvasGraphics_endPath() {
   2546       this.consumePath();
   2547     },
   2548 
   2549     // Clipping
   2550     clip: function CanvasGraphics_clip() {
   2551       this.pendingClip = NORMAL_CLIP;
   2552     },
   2553     eoClip: function CanvasGraphics_eoClip() {
   2554       this.pendingClip = EO_CLIP;
   2555     },
   2556 
   2557     // Text
   2558     beginText: function CanvasGraphics_beginText() {
   2559       this.current.textMatrix = IDENTITY_MATRIX;
   2560       this.current.x = this.current.lineX = 0;
   2561       this.current.y = this.current.lineY = 0;
   2562     },
   2563     endText: function CanvasGraphics_endText() {
   2564     },
   2565     setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
   2566       this.current.charSpacing = spacing;
   2567     },
   2568     setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
   2569       this.current.wordSpacing = spacing;
   2570     },
   2571     setHScale: function CanvasGraphics_setHScale(scale) {
   2572       this.current.textHScale = scale / 100;
   2573     },
   2574     setLeading: function CanvasGraphics_setLeading(leading) {
   2575       this.current.leading = -leading;
   2576     },
   2577     setFont: function CanvasGraphics_setFont(fontRefName, size) {
   2578       var fontObj = this.objs.get(fontRefName);
   2579       var current = this.current;
   2580 
   2581       if (!fontObj)
   2582         error('Can\'t find font for ' + fontRefName);
   2583 
   2584       // Slice-clone matrix so we can manipulate it without affecting original
   2585       if (fontObj.fontMatrix)
   2586         current.fontMatrix = fontObj.fontMatrix.slice(0);
   2587       else
   2588         current.fontMatrix = IDENTITY_MATRIX.slice(0);
   2589 
   2590       // A valid matrix needs all main diagonal elements to be non-zero
   2591       // This also ensures we bypass FF bugzilla bug #719844.
   2592       if (current.fontMatrix[0] === 0 ||
   2593           current.fontMatrix[3] === 0) {
   2594         warn('Invalid font matrix for font ' + fontRefName);
   2595       }
   2596 
   2597       // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
   2598       // and in some docs this can be negative (inverted x-y axes).
   2599       // We implement this condition with fontMatrix.
   2600       if (size < 0) {
   2601         size = -size;
   2602         current.fontMatrix[0] *= -1;
   2603         current.fontMatrix[3] *= -1;
   2604       }
   2605 
   2606       this.current.font = fontObj;
   2607       this.current.fontSize = size;
   2608 
   2609       if (fontObj.coded)
   2610         return; // we don't need ctx.font for Type3 fonts
   2611 
   2612       var name = fontObj.loadedName || 'sans-serif';
   2613       var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
   2614                                  (fontObj.bold ? 'bold' : 'normal');
   2615 
   2616       var italic = fontObj.italic ? 'italic' : 'normal';
   2617       var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif';
   2618       var typeface = '"' + name + '", ' + serif;
   2619 
   2620       // Some font backends cannot handle fonts below certain size.
   2621       // Keeping the font at minimal size and using the fontSizeScale to change
   2622       // the current transformation matrix before the fillText/strokeText.
   2623       // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
   2624       var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
   2625       this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
   2626                                    size / MIN_FONT_SIZE;
   2627 
   2628       var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
   2629       this.ctx.font = rule;
   2630     },
   2631     setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
   2632       if (mode >= TextRenderingMode.FILL_ADD_TO_PATH)
   2633         TODO('unsupported text rendering mode: ' + mode);
   2634       this.current.textRenderingMode = mode;
   2635     },
   2636     setTextRise: function CanvasGraphics_setTextRise(rise) {
   2637       TODO('text rise: ' + rise);
   2638     },
   2639     moveText: function CanvasGraphics_moveText(x, y) {
   2640       this.current.x = this.current.lineX += x;
   2641       this.current.y = this.current.lineY += y;
   2642     },
   2643     setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
   2644       this.setLeading(-y);
   2645       this.moveText(x, y);
   2646     },
   2647     setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
   2648       this.current.textMatrix = [a, b, c, d, e, f];
   2649 
   2650       this.current.x = this.current.lineX = 0;
   2651       this.current.y = this.current.lineY = 0;
   2652     },
   2653     nextLine: function CanvasGraphics_nextLine() {
   2654       this.moveText(0, this.current.leading);
   2655     },
   2656     applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
   2657       var ctx = this.ctx;
   2658       var current = this.current;
   2659       var textHScale = current.textHScale;
   2660       var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
   2661 
   2662       ctx.transform.apply(ctx, current.textMatrix);
   2663       ctx.scale(1, -1);
   2664       ctx.translate(current.x, -1 * current.y);
   2665       ctx.transform.apply(ctx, fontMatrix);
   2666       ctx.scale(textHScale, 1);
   2667     },
   2668     getTextGeometry: function CanvasGraphics_getTextGeometry() {
   2669       var geometry = {};
   2670       var ctx = this.ctx;
   2671       var font = this.current.font;
   2672       var ctxMatrix = ctx.mozCurrentTransform;
   2673       if (ctxMatrix) {
   2674         var bl = Util.applyTransform([0, 0], ctxMatrix);
   2675         var tr = Util.applyTransform([1, 1], ctxMatrix);
   2676         geometry.x = bl[0];
   2677         geometry.y = bl[1];
   2678         geometry.hScale = tr[0] - bl[0];
   2679         geometry.vScale = tr[1] - bl[1];
   2680       }
   2681       geometry.spaceWidth = font.spaceWidth;
   2682       return geometry;
   2683     },
   2684 
   2685     showText: function CanvasGraphics_showText(str, skipTextSelection) {
   2686       var ctx = this.ctx;
   2687       var current = this.current;
   2688       var font = current.font;
   2689       var glyphs = font.charsToGlyphs(str);
   2690       var fontSize = current.fontSize;
   2691       var fontSizeScale = current.fontSizeScale;
   2692       var charSpacing = current.charSpacing;
   2693       var wordSpacing = current.wordSpacing;
   2694       var textHScale = current.textHScale;
   2695       var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
   2696       var textHScale2 = textHScale * fontMatrix[0];
   2697       var glyphsLength = glyphs.length;
   2698       var textLayer = this.textLayer;
   2699       var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
   2700       var textSelection = textLayer && !skipTextSelection ? true : false;
   2701       var textRenderingMode = current.textRenderingMode;
   2702 
   2703       // Type3 fonts - each glyph is a "mini-PDF"
   2704       if (font.coded) {
   2705         ctx.save();
   2706         ctx.transform.apply(ctx, current.textMatrix);
   2707         ctx.translate(current.x, current.y);
   2708 
   2709         ctx.scale(textHScale, 1);
   2710 
   2711         if (textSelection) {
   2712           this.save();
   2713           ctx.scale(1, -1);
   2714           text.geom = this.getTextGeometry();
   2715           this.restore();
   2716         }
   2717         for (var i = 0; i < glyphsLength; ++i) {
   2718 
   2719           var glyph = glyphs[i];
   2720           if (glyph === null) {
   2721             // word break
   2722             this.ctx.translate(wordSpacing, 0);
   2723             continue;
   2724           }
   2725 
   2726           this.save();
   2727           ctx.scale(fontSize, fontSize);
   2728           ctx.transform.apply(ctx, fontMatrix);
   2729           this.executeOperatorList(glyph.operatorList);
   2730           this.restore();
   2731 
   2732           var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
   2733           var width = transformed[0] * fontSize +
   2734               Util.sign(current.fontMatrix[0]) * charSpacing;
   2735 
   2736           ctx.translate(width, 0);
   2737           current.x += width * textHScale;
   2738 
   2739           text.str += glyph.unicode;
   2740           text.length++;
   2741           text.canvasWidth += width;
   2742         }
   2743         ctx.restore();
   2744       } else {
   2745         ctx.save();
   2746         this.applyTextTransforms();
   2747 
   2748         var lineWidth = current.lineWidth;
   2749         var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]);
   2750         if (scale == 0 || lineWidth == 0)
   2751           lineWidth = this.getSinglePixelWidth();
   2752         else
   2753           lineWidth /= scale;
   2754 
   2755         if (textSelection)
   2756           text.geom = this.getTextGeometry();
   2757 
   2758         if (fontSizeScale != 1.0) {
   2759           ctx.scale(fontSizeScale, fontSizeScale);
   2760           lineWidth /= fontSizeScale;
   2761         }
   2762 
   2763         ctx.lineWidth = lineWidth;
   2764 
   2765         var x = 0;
   2766         for (var i = 0; i < glyphsLength; ++i) {
   2767           var glyph = glyphs[i];
   2768           if (glyph === null) {
   2769             // word break
   2770             x += Util.sign(current.fontMatrix[0]) * wordSpacing;
   2771             continue;
   2772           }
   2773 
   2774           var character = glyph.fontChar;
   2775           var charWidth = glyph.width * fontSize * 0.001 +
   2776               Util.sign(current.fontMatrix[0]) * charSpacing;
   2777 
   2778           if (!glyph.disabled) {
   2779             var scaledX = x / fontSizeScale;
   2780             switch (textRenderingMode) {
   2781               default: // other unsupported rendering modes
   2782               case TextRenderingMode.FILL:
   2783               case TextRenderingMode.FILL_ADD_TO_PATH:
   2784                 ctx.fillText(character, scaledX, 0);
   2785                 break;
   2786               case TextRenderingMode.STROKE:
   2787               case TextRenderingMode.STROKE_ADD_TO_PATH:
   2788                 ctx.strokeText(character, scaledX, 0);
   2789                 break;
   2790               case TextRenderingMode.FILL_STROKE:
   2791               case TextRenderingMode.FILL_STROKE_ADD_TO_PATH:
   2792                 ctx.fillText(character, scaledX, 0);
   2793                 ctx.strokeText(character, scaledX, 0);
   2794                 break;
   2795               case TextRenderingMode.INVISIBLE:
   2796                 break;
   2797             }
   2798           }
   2799 
   2800           x += charWidth;
   2801 
   2802           var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode;
   2803           var glyphUnicodeLength = glyphUnicode.length;
   2804           //reverse an arabic ligature
   2805           if (glyphUnicodeLength > 1 &&
   2806               isRTLRangeFor(glyphUnicode.charCodeAt(0))) {
   2807             for (var ii = glyphUnicodeLength - 1; ii >= 0; ii--)
   2808               text.str += glyphUnicode[ii];
   2809           } else
   2810             text.str += glyphUnicode;
   2811           text.length += glyphUnicodeLength;
   2812           text.canvasWidth += charWidth;
   2813         }
   2814         current.x += x * textHScale2;
   2815         ctx.restore();
   2816       }
   2817 
   2818       if (textSelection)
   2819         this.textLayer.appendText(text, font.loadedName, fontSize);
   2820 
   2821       return text;
   2822     },
   2823     showSpacedText: function CanvasGraphics_showSpacedText(arr) {
   2824       var ctx = this.ctx;
   2825       var current = this.current;
   2826       var font = current.font;
   2827       var fontSize = current.fontSize;
   2828       var textHScale = current.textHScale;
   2829       if (!font.coded)
   2830         textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0];
   2831       var arrLength = arr.length;
   2832       var textLayer = this.textLayer;
   2833       var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
   2834       var textSelection = textLayer ? true : false;
   2835 
   2836       if (textSelection) {
   2837         ctx.save();
   2838         // Type3 fonts - each glyph is a "mini-PDF" (see also showText)
   2839         if (font.coded) {
   2840           ctx.transform.apply(ctx, current.textMatrix);
   2841           ctx.scale(1, -1);
   2842           ctx.translate(current.x, -1 * current.y);
   2843           ctx.scale(textHScale, 1);
   2844         } else
   2845           this.applyTextTransforms();
   2846         text.geom = this.getTextGeometry();
   2847         ctx.restore();
   2848       }
   2849 
   2850       for (var i = 0; i < arrLength; ++i) {
   2851         var e = arr[i];
   2852         if (isNum(e)) {
   2853           var spacingLength = -e * 0.001 * fontSize * textHScale;
   2854           current.x += spacingLength;
   2855 
   2856           if (textSelection) {
   2857             // Emulate precise spacing via HTML spaces
   2858             text.canvasWidth += spacingLength;
   2859             if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero
   2860               var numFakeSpaces = Math.round(-e / text.geom.spaceWidth);
   2861               if (numFakeSpaces > 0) {
   2862                 text.str += '\u00A0';
   2863                 text.length++;
   2864               }
   2865             }
   2866           }
   2867         } else if (isString(e)) {
   2868           var shownText = this.showText(e, true);
   2869 
   2870           if (textSelection) {
   2871             if (shownText.str === ' ') {
   2872               text.str += '\u00A0';
   2873             } else {
   2874               text.str += shownText.str;
   2875             }
   2876             text.canvasWidth += shownText.canvasWidth;
   2877             text.length += shownText.length;
   2878           }
   2879         } else {
   2880           malformed('TJ array element ' + e + ' is not string or num');
   2881         }
   2882       }
   2883 
   2884       if (textSelection)
   2885         this.textLayer.appendText(text, font.loadedName, fontSize);
   2886     },
   2887     nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
   2888       this.nextLine();
   2889       this.showText(text);
   2890     },
   2891     nextLineSetSpacingShowText:
   2892       function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
   2893                                                          charSpacing,
   2894                                                          text) {
   2895       this.setWordSpacing(wordSpacing);
   2896       this.setCharSpacing(charSpacing);
   2897       this.nextLineShowText(text);
   2898     },
   2899 
   2900     // Type3 fonts
   2901     setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
   2902       // We can safely ignore this since the width should be the same
   2903       // as the width in the Widths array.
   2904     },
   2905     setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
   2906                                                                         yWidth,
   2907                                                                         llx,
   2908                                                                         lly,
   2909                                                                         urx,
   2910                                                                         ury) {
   2911       // TODO According to the spec we're also suppose to ignore any operators
   2912       // that set color or include images while processing this type3 font.
   2913       this.rectangle(llx, lly, urx - llx, ury - lly);
   2914       this.clip();
   2915       this.endPath();
   2916     },
   2917 
   2918     // Color
   2919     setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
   2920       this.current.strokeColorSpace = ColorSpace.fromIR(raw);
   2921     },
   2922     setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
   2923       this.current.fillColorSpace = ColorSpace.fromIR(raw);
   2924     },
   2925     setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) {
   2926       var cs = this.current.strokeColorSpace;
   2927       var rgbColor = cs.getRgb(arguments);
   2928       var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
   2929       this.ctx.strokeStyle = color;
   2930       this.current.strokeColor = color;
   2931     },
   2932     getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
   2933       if (IR[0] == 'TilingPattern') {
   2934         var args = IR[1];
   2935         var base = cs.base;
   2936         var color;
   2937         if (base) {
   2938           var baseComps = base.numComps;
   2939 
   2940           color = [];
   2941           for (var i = 0; i < baseComps; ++i)
   2942             color.push(args[i]);
   2943 
   2944           color = base.getRgb(color);
   2945         }
   2946         var pattern = new TilingPattern(IR, color, this.ctx, this.objs);
   2947       } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
   2948         var pattern = Pattern.shadingFromIR(IR);
   2949       } else {
   2950         error('Unkown IR type ' + IR[0]);
   2951       }
   2952       return pattern;
   2953     },
   2954     setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
   2955       var cs = this.current.strokeColorSpace;
   2956 
   2957       if (cs.name == 'Pattern') {
   2958         this.current.strokeColor = this.getColorN_Pattern(arguments, cs);
   2959       } else {
   2960         this.setStrokeColor.apply(this, arguments);
   2961       }
   2962     },
   2963     setFillColor: function CanvasGraphics_setFillColor(/*...*/) {
   2964       var cs = this.current.fillColorSpace;
   2965       var rgbColor = cs.getRgb(arguments);
   2966       var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
   2967       this.ctx.fillStyle = color;
   2968       this.current.fillColor = color;
   2969     },
   2970     setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
   2971       var cs = this.current.fillColorSpace;
   2972 
   2973       if (cs.name == 'Pattern') {
   2974         this.current.fillColor = this.getColorN_Pattern(arguments, cs);
   2975       } else {
   2976         this.setFillColor.apply(this, arguments);
   2977       }
   2978     },
   2979     setStrokeGray: function CanvasGraphics_setStrokeGray(gray) {
   2980       if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
   2981         this.current.strokeColorSpace = new DeviceGrayCS();
   2982 
   2983       var color = Util.makeCssRgb(gray, gray, gray);
   2984       this.ctx.strokeStyle = color;
   2985       this.current.strokeColor = color;
   2986     },
   2987     setFillGray: function CanvasGraphics_setFillGray(gray) {
   2988       if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
   2989         this.current.fillColorSpace = new DeviceGrayCS();
   2990 
   2991       var color = Util.makeCssRgb(gray, gray, gray);
   2992       this.ctx.fillStyle = color;
   2993       this.current.fillColor = color;
   2994     },
   2995     setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
   2996       if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
   2997         this.current.strokeColorSpace = new DeviceRgbCS();
   2998 
   2999       var color = Util.makeCssRgb(r, g, b);
   3000       this.ctx.strokeStyle = color;
   3001       this.current.strokeColor = color;
   3002     },
   3003     setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
   3004       if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
   3005         this.current.fillColorSpace = new DeviceRgbCS();
   3006 
   3007       var color = Util.makeCssRgb(r, g, b);
   3008       this.ctx.fillStyle = color;
   3009       this.current.fillColor = color;
   3010     },
   3011     setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) {
   3012       if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
   3013         this.current.strokeColorSpace = new DeviceCmykCS();
   3014 
   3015       var color = Util.makeCssCmyk(c, m, y, k);
   3016       this.ctx.strokeStyle = color;
   3017       this.current.strokeColor = color;
   3018     },
   3019     setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) {
   3020       if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
   3021         this.current.fillColorSpace = new DeviceCmykCS();
   3022 
   3023       var color = Util.makeCssCmyk(c, m, y, k);
   3024       this.ctx.fillStyle = color;
   3025       this.current.fillColor = color;
   3026     },
   3027 
   3028     shadingFill: function CanvasGraphics_shadingFill(patternIR) {
   3029       var ctx = this.ctx;
   3030 
   3031       this.save();
   3032       var pattern = Pattern.shadingFromIR(patternIR);
   3033       ctx.fillStyle = pattern.getPattern(ctx);
   3034 
   3035       var inv = ctx.mozCurrentTransformInverse;
   3036       if (inv) {
   3037         var canvas = ctx.canvas;
   3038         var width = canvas.width;
   3039         var height = canvas.height;
   3040 
   3041         var bl = Util.applyTransform([0, 0], inv);
   3042         var br = Util.applyTransform([0, height], inv);
   3043         var ul = Util.applyTransform([width, 0], inv);
   3044         var ur = Util.applyTransform([width, height], inv);
   3045 
   3046         var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
   3047         var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
   3048         var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
   3049         var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
   3050 
   3051         this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
   3052       } else {
   3053         // HACK to draw the gradient onto an infinite rectangle.
   3054         // PDF gradients are drawn across the entire image while
   3055         // Canvas only allows gradients to be drawn in a rectangle
   3056         // The following bug should allow us to remove this.
   3057         // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
   3058 
   3059         this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
   3060       }
   3061 
   3062       this.restore();
   3063     },
   3064 
   3065     // Images
   3066     beginInlineImage: function CanvasGraphics_beginInlineImage() {
   3067       error('Should not call beginInlineImage');
   3068     },
   3069     beginImageData: function CanvasGraphics_beginImageData() {
   3070       error('Should not call beginImageData');
   3071     },
   3072 
   3073     paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
   3074                                                                         bbox) {
   3075       this.save();
   3076 
   3077       if (matrix && isArray(matrix) && 6 == matrix.length)
   3078         this.transform.apply(this, matrix);
   3079 
   3080       if (bbox && isArray(bbox) && 4 == bbox.length) {
   3081         var width = bbox[2] - bbox[0];
   3082         var height = bbox[3] - bbox[1];
   3083         this.rectangle(bbox[0], bbox[1], width, height);
   3084         this.clip();
   3085         this.endPath();
   3086       }
   3087     },
   3088 
   3089     paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
   3090       this.restore();
   3091     },
   3092 
   3093     paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
   3094       var domImage = this.objs.get(objId);
   3095       if (!domImage) {
   3096         error('Dependent image isn\'t ready yet');
   3097       }
   3098 
   3099       this.save();
   3100 
   3101       var ctx = this.ctx;
   3102       // scale the image to the unit square
   3103       ctx.scale(1 / w, -1 / h);
   3104 
   3105       ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
   3106                     0, -h, w, h);
   3107 
   3108       this.restore();
   3109     },
   3110 
   3111     paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(
   3112                              imgArray, inverseDecode, width, height) {
   3113       function applyStencilMask(buffer, inverseDecode) {
   3114         var imgArrayPos = 0;
   3115         var i, j, mask, buf;
   3116         // removing making non-masked pixels transparent
   3117         var bufferPos = 3; // alpha component offset
   3118         for (i = 0; i < height; i++) {
   3119           mask = 0;
   3120           for (j = 0; j < width; j++) {
   3121             if (!mask) {
   3122               buf = imgArray[imgArrayPos++];
   3123               mask = 128;
   3124             }
   3125             if (!(buf & mask) == inverseDecode) {
   3126               buffer[bufferPos] = 0;
   3127             }
   3128             bufferPos += 4;
   3129             mask >>= 1;
   3130           }
   3131         }
   3132       }
   3133 
   3134       this.save();
   3135 
   3136       var ctx = this.ctx;
   3137       var w = width, h = height;
   3138       // scale the image to the unit square
   3139       ctx.scale(1 / w, -1 / h);
   3140 
   3141       var tmpCanvas = createScratchCanvas(w, h);
   3142       var tmpCtx = tmpCanvas.getContext('2d');
   3143 
   3144       var fillColor = this.current.fillColor;
   3145       tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
   3146                           fillColor.type === 'Pattern') ?
   3147                           fillColor.getPattern(tmpCtx) : fillColor;
   3148       tmpCtx.fillRect(0, 0, w, h);
   3149 
   3150       var imgData = tmpCtx.getImageData(0, 0, w, h);
   3151       var pixels = imgData.data;
   3152 
   3153       applyStencilMask(pixels, inverseDecode);
   3154 
   3155       tmpCtx.putImageData(imgData, 0, 0);
   3156       ctx.drawImage(tmpCanvas, 0, -h);
   3157       this.restore();
   3158     },
   3159 
   3160     paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
   3161       var imgData = this.objs.get(objId);
   3162       if (!imgData)
   3163         error('Dependent image isn\'t ready yet');
   3164 
   3165       this.save();
   3166       var ctx = this.ctx;
   3167       var w = imgData.width;
   3168       var h = imgData.height;
   3169       // scale the image to the unit square
   3170       ctx.scale(1 / w, -1 / h);
   3171 
   3172       var tmpCanvas = createScratchCanvas(w, h);
   3173       var tmpCtx = tmpCanvas.getContext('2d');
   3174       this.putBinaryImageData(tmpCtx, imgData, w, h);
   3175 
   3176       ctx.drawImage(tmpCanvas, 0, -h);
   3177       this.restore();
   3178     },
   3179 
   3180     putBinaryImageData: function CanvasGraphics_putBinaryImageData() {
   3181       //
   3182     },
   3183 
   3184     // Marked content
   3185 
   3186     markPoint: function CanvasGraphics_markPoint(tag) {
   3187       TODO('Marked content');
   3188     },
   3189     markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
   3190       TODO('Marked content');
   3191     },
   3192     beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
   3193       TODO('Marked content');
   3194     },
   3195     beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
   3196                                         tag, properties) {
   3197       TODO('Marked content');
   3198     },
   3199     endMarkedContent: function CanvasGraphics_endMarkedContent() {
   3200       TODO('Marked content');
   3201     },
   3202 
   3203     // Compatibility
   3204 
   3205     beginCompat: function CanvasGraphics_beginCompat() {
   3206       TODO('ignore undefined operators (should we do that anyway?)');
   3207     },
   3208     endCompat: function CanvasGraphics_endCompat() {
   3209       TODO('stop ignoring undefined operators');
   3210     },
   3211 
   3212     // Helper functions
   3213 
   3214     consumePath: function CanvasGraphics_consumePath() {
   3215       if (this.pendingClip) {
   3216         var savedFillRule = null;
   3217         if (this.pendingClip == EO_CLIP)
   3218           savedFillRule = this.setEOFillRule();
   3219 
   3220         this.ctx.clip();
   3221 
   3222         this.pendingClip = null;
   3223         if (savedFillRule !== null)
   3224           this.restoreFillRule(savedFillRule);
   3225       }
   3226       this.ctx.beginPath();
   3227     },
   3228     // We generally keep the canvas context set for
   3229     // nonzero-winding, and just set evenodd for the operations
   3230     // that need them.
   3231     setEOFillRule: function CanvasGraphics_setEOFillRule() {
   3232       var savedFillRule = this.ctx.mozFillRule;
   3233       this.ctx.mozFillRule = 'evenodd';
   3234       return savedFillRule;
   3235     },
   3236     restoreFillRule: function CanvasGraphics_restoreFillRule(rule) {
   3237       this.ctx.mozFillRule = rule;
   3238     },
   3239     getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
   3240       var inverse = this.ctx.mozCurrentTransformInverse;
   3241       return Math.abs(inverse[0] + inverse[2]);
   3242     }
   3243   };
   3244 
   3245   return CanvasGraphics;
   3246 })();
   3247 
   3248 if (!isWorker) {
   3249   // Feature detection if the browser can use an Uint8Array directly as imgData.
   3250   var canvas = PdfJS_window.document.createElement('canvas');
   3251   canvas.width = 1;
   3252   canvas.height = 1;
   3253   var ctx = canvas.getContext('2d');
   3254 
   3255   try {
   3256     ctx.putImageData({
   3257       width: 1,
   3258       height: 1,
   3259       data: new Uint8Array(4)
   3260     }, 0, 0);
   3261 
   3262     CanvasGraphics.prototype.putBinaryImageData =
   3263       function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) {
   3264         ctx.putImageData(imgData, 0, 0);
   3265       };
   3266   } catch (e) {
   3267     CanvasGraphics.prototype.putBinaryImageData =
   3268       function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) {
   3269         var tmpImgData = ctx.getImageData(0, 0, w, h);
   3270 
   3271         // Copy over the imageData pixel by pixel.
   3272         var tmpImgDataPixels = tmpImgData.data;
   3273         var len = tmpImgDataPixels.length;
   3274 
   3275         while (len--) {
   3276           tmpImgDataPixels[len] = imgData.data[len];
   3277         }
   3278 
   3279         ctx.putImageData(tmpImgData, 0, 0);
   3280       };
   3281   }
   3282 }
   3283 
   3284 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   3285 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   3286 
   3287 'use strict';
   3288 
   3289 var Name = (function NameClosure() {
   3290   function Name(name) {
   3291     this.name = name;
   3292   }
   3293 
   3294   Name.prototype = {};
   3295 
   3296   return Name;
   3297 })();
   3298 
   3299 var Cmd = (function CmdClosure() {
   3300   function Cmd(cmd) {
   3301     this.cmd = cmd;
   3302   }
   3303 
   3304   Cmd.prototype = {};
   3305 
   3306   var cmdCache = {};
   3307 
   3308   Cmd.get = function Cmd_get(cmd) {
   3309     var cmdValue = cmdCache[cmd];
   3310     if (cmdValue)
   3311       return cmdValue;
   3312 
   3313     return cmdCache[cmd] = new Cmd(cmd);
   3314   };
   3315 
   3316   return Cmd;
   3317 })();
   3318 
   3319 var Dict = (function DictClosure() {
   3320   // xref is optional
   3321   function Dict(xref) {
   3322     // Map should only be used internally, use functions below to access.
   3323     var map = Object.create(null);
   3324 
   3325     this.assignXref = function Dict_assignXref(newXref) {
   3326       xref = newXref;
   3327     };
   3328 
   3329     // automatically dereferences Ref objects
   3330     this.get = function Dict_get(key1, key2, key3) {
   3331       var value;
   3332       if (typeof (value = map[key1]) != 'undefined' || key1 in map ||
   3333           typeof key2 == 'undefined') {
   3334         return xref ? xref.fetchIfRef(value) : value;
   3335       }
   3336       if (typeof (value = map[key2]) != 'undefined' || key2 in map ||
   3337           typeof key3 == 'undefined') {
   3338         return xref ? xref.fetchIfRef(value) : value;
   3339       }
   3340       value = map[key3] || null;
   3341       return xref ? xref.fetchIfRef(value) : value;
   3342     };
   3343 
   3344     // no dereferencing
   3345     this.getRaw = function Dict_getRaw(key) {
   3346       return map[key];
   3347     };
   3348 
   3349     // creates new map and dereferences all Refs
   3350     this.getAll = function Dict_getAll() {
   3351       var all = {};
   3352       for (var key in map) {
   3353         var obj = this.get(key);
   3354         all[key] = obj instanceof Dict ? obj.getAll() : obj;
   3355       }
   3356       return all;
   3357     };
   3358 
   3359     this.set = function Dict_set(key, value) {
   3360       map[key] = value;
   3361     };
   3362 
   3363     this.has = function Dict_has(key) {
   3364       return key in map;
   3365     };
   3366 
   3367     this.forEach = function Dict_forEach(callback) {
   3368       for (var key in map) {
   3369         callback(key, this.get(key));
   3370       }
   3371     };
   3372   };
   3373 
   3374   return Dict;
   3375 })();
   3376 
   3377 var Ref = (function RefClosure() {
   3378   function Ref(num, gen) {
   3379     this.num = num;
   3380     this.gen = gen;
   3381   }
   3382 
   3383   Ref.prototype = {};
   3384 
   3385   return Ref;
   3386 })();
   3387 
   3388 // The reference is identified by number and generation,
   3389 // this structure stores only one instance of the reference.
   3390 var RefSet = (function RefSetClosure() {
   3391   function RefSet() {
   3392     this.dict = {};
   3393   }
   3394 
   3395   RefSet.prototype = {
   3396     has: function RefSet_has(ref) {
   3397       return !!this.dict['R' + ref.num + '.' + ref.gen];
   3398     },
   3399 
   3400     put: function RefSet_put(ref) {
   3401       this.dict['R' + ref.num + '.' + ref.gen] = ref;
   3402     }
   3403   };
   3404 
   3405   return RefSet;
   3406 })();
   3407 
   3408 var Catalog = (function CatalogClosure() {
   3409   function Catalog(xref) {
   3410     this.xref = xref;
   3411     var obj = xref.getCatalogObj();
   3412     assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
   3413     this.catDict = obj;
   3414   }
   3415 
   3416   Catalog.prototype = {
   3417     get metadata() {
   3418       var stream = this.catDict.get('Metadata');
   3419       var metadata;
   3420       if (stream && isDict(stream.dict)) {
   3421         var type = stream.dict.get('Type');
   3422         var subtype = stream.dict.get('Subtype');
   3423 
   3424         if (isName(type) && isName(subtype) &&
   3425             type.name === 'Metadata' && subtype.name === 'XML') {
   3426           metadata = stringToPDFString(bytesToString(stream.getBytes()));
   3427         }
   3428       }
   3429 
   3430       return shadow(this, 'metadata', metadata);
   3431     },
   3432     get toplevelPagesDict() {
   3433       var pagesObj = this.catDict.get('Pages');
   3434       assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary');
   3435       // shadow the prototype getter
   3436       return shadow(this, 'toplevelPagesDict', pagesObj);
   3437     },
   3438     get documentOutline() {
   3439       var xref = this.xref;
   3440       var obj = this.catDict.get('Outlines');
   3441       var root = { items: [] };
   3442       if (isDict(obj)) {
   3443         obj = obj.getRaw('First');
   3444         var processed = new RefSet();
   3445         if (isRef(obj)) {
   3446           var queue = [{obj: obj, parent: root}];
   3447           // to avoid recursion keeping track of the items
   3448           // in the processed dictionary
   3449           processed.put(obj);
   3450           while (queue.length > 0) {
   3451             var i = queue.shift();
   3452             var outlineDict = xref.fetchIfRef(i.obj);
   3453             if (outlineDict === null)
   3454               continue;
   3455             if (!outlineDict.has('Title'))
   3456               error('Invalid outline item');
   3457             var dest = outlineDict.get('A');
   3458             if (dest)
   3459               dest = dest.get('D');
   3460             else if (outlineDict.has('Dest')) {
   3461               dest = outlineDict.getRaw('Dest');
   3462               if (isName(dest))
   3463                 dest = dest.name;
   3464             }
   3465             var title = outlineDict.get('Title');
   3466             var outlineItem = {
   3467               dest: dest,
   3468               title: stringToPDFString(title),
   3469               color: outlineDict.get('C') || [0, 0, 0],
   3470               count: outlineDict.get('Count'),
   3471               bold: !!(outlineDict.get('F') & 2),
   3472               italic: !!(outlineDict.get('F') & 1),
   3473               items: []
   3474             };
   3475             i.parent.items.push(outlineItem);
   3476             obj = outlineDict.getRaw('First');
   3477             if (isRef(obj) && !processed.has(obj)) {
   3478               queue.push({obj: obj, parent: outlineItem});
   3479               processed.put(obj);
   3480             }
   3481             obj = outlineDict.getRaw('Next');
   3482             if (isRef(obj) && !processed.has(obj)) {
   3483               queue.push({obj: obj, parent: i.parent});
   3484               processed.put(obj);
   3485             }
   3486           }
   3487         }
   3488       }
   3489       obj = root.items.length > 0 ? root.items : null;
   3490       return shadow(this, 'documentOutline', obj);
   3491     },
   3492     get numPages() {
   3493       var obj = this.toplevelPagesDict.get('Count');
   3494       assertWellFormed(
   3495         isInt(obj),
   3496         'page count in top level pages object is not an integer'
   3497       );
   3498       // shadow the prototype getter
   3499       return shadow(this, 'num', obj);
   3500     },
   3501     traverseKids: function Catalog_traverseKids(pagesDict) {
   3502       var pageCache = this.pageCache;
   3503       var kids = pagesDict.get('Kids');
   3504       assertWellFormed(isArray(kids),
   3505                        'page dictionary kids object is not an array');
   3506       for (var i = 0, ii = kids.length; i < ii; ++i) {
   3507         var kid = kids[i];
   3508         assertWellFormed(isRef(kid),
   3509                         'page dictionary kid is not a reference');
   3510         var obj = this.xref.fetch(kid);
   3511         if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
   3512           pageCache.push(new Page(this.xref, pageCache.length, obj, kid));
   3513         } else { // must be a child page dictionary
   3514           assertWellFormed(
   3515             isDict(obj),
   3516             'page dictionary kid reference points to wrong type of object'
   3517           );
   3518           this.traverseKids(obj);
   3519         }
   3520       }
   3521     },
   3522     get destinations() {
   3523       function fetchDestination(dest) {
   3524         return isDict(dest) ? dest.get('D') : dest;
   3525       }
   3526 
   3527       var xref = this.xref;
   3528       var dests = {}, nameTreeRef, nameDictionaryRef;
   3529       var obj = this.catDict.get('Names');
   3530       if (obj)
   3531         nameTreeRef = obj.getRaw('Dests');
   3532       else if (this.catDict.has('Dests'))
   3533         nameDictionaryRef = this.catDict.get('Dests');
   3534 
   3535       if (nameDictionaryRef) {
   3536         // reading simple destination dictionary
   3537         obj = nameDictionaryRef;
   3538         obj.forEach(function catalogForEach(key, value) {
   3539           if (!value) return;
   3540           dests[key] = fetchDestination(value);
   3541         });
   3542       }
   3543       if (nameTreeRef) {
   3544         // reading name tree
   3545         var processed = new RefSet();
   3546         processed.put(nameTreeRef);
   3547         var queue = [nameTreeRef];
   3548         while (queue.length > 0) {
   3549           var i, n;
   3550           obj = xref.fetch(queue.shift());
   3551           if (obj.has('Kids')) {
   3552             var kids = obj.get('Kids');
   3553             for (i = 0, n = kids.length; i < n; i++) {
   3554               var kid = kids[i];
   3555               if (processed.has(kid))
   3556                 error('invalid destinations');
   3557               queue.push(kid);
   3558               processed.put(kid);
   3559             }
   3560             continue;
   3561           }
   3562           var names = obj.get('Names');
   3563           for (i = 0, n = names.length; i < n; i += 2) {
   3564             dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1]));
   3565           }
   3566         }
   3567       }
   3568       return shadow(this, 'destinations', dests);
   3569     },
   3570     getPage: function Catalog_getPage(n) {
   3571       var pageCache = this.pageCache;
   3572       if (!pageCache) {
   3573         pageCache = this.pageCache = [];
   3574         this.traverseKids(this.toplevelPagesDict);
   3575       }
   3576       return this.pageCache[n - 1];
   3577     }
   3578   };
   3579 
   3580   return Catalog;
   3581 })();
   3582 
   3583 var XRef = (function XRefClosure() {
   3584   function XRef(stream, startXRef, mainXRefEntriesOffset) {
   3585     this.stream = stream;
   3586     this.entries = [];
   3587     this.xrefstms = {};
   3588     var trailerDict = this.readXRef(startXRef);
   3589     trailerDict.assignXref(this);
   3590     this.trailer = trailerDict;
   3591     // prepare the XRef cache
   3592     this.cache = [];
   3593 
   3594     var encrypt = trailerDict.get('Encrypt');
   3595     if (encrypt) {
   3596       var fileId = trailerDict.get('ID');
   3597       this.encrypt = new CipherTransformFactory(encrypt,
   3598                                                 fileId[0] /*, password */);
   3599     }
   3600 
   3601     // get the root dictionary (catalog) object
   3602     if (!(this.root = trailerDict.get('Root')))
   3603       error('Invalid root reference');
   3604   }
   3605 
   3606   XRef.prototype = {
   3607     readXRefTable: function XRef_readXRefTable(parser) {
   3608       // Example of cross-reference table:
   3609       // xref
   3610       // 0 1                    <-- subsection header (first obj #, obj count)
   3611       // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)
   3612       // 23 2                   <-- subsection header ... and so on ...
   3613       // 0000025518 00002 n
   3614       // 0000025635 00000 n
   3615       // trailer
   3616       // ...
   3617 
   3618       // Outer loop is over subsection headers
   3619       var obj;
   3620       while (!isCmd(obj = parser.getObj(), 'trailer')) {
   3621         var first = obj,
   3622             count = parser.getObj();
   3623 
   3624         if (!isInt(first) || !isInt(count))
   3625           error('Invalid XRef table: wrong types in subsection header');
   3626 
   3627         // Inner loop is over objects themselves
   3628         for (var i = 0; i < count; i++) {
   3629           var entry = {};
   3630           entry.offset = parser.getObj();
   3631           entry.gen = parser.getObj();
   3632           var type = parser.getObj();
   3633 
   3634           if (isCmd(type, 'f'))
   3635             entry.free = true;
   3636           else if (isCmd(type, 'n'))
   3637             entry.uncompressed = true;
   3638 
   3639           // Validate entry obj
   3640           if (!isInt(entry.offset) || !isInt(entry.gen) ||
   3641               !(entry.free || entry.uncompressed)) {
   3642             error('Invalid entry in XRef subsection: ' + first + ', ' + count);
   3643           }
   3644 
   3645           if (!this.entries[i + first])
   3646             this.entries[i + first] = entry;
   3647         }
   3648       }
   3649 
   3650       // Sanity check: as per spec, first object must be free
   3651       if (this.entries[0] && !this.entries[0].free)
   3652         error('Invalid XRef table: unexpected first object');
   3653 
   3654       // Sanity check
   3655       if (!isCmd(obj, 'trailer'))
   3656         error('Invalid XRef table: could not find trailer dictionary');
   3657 
   3658       // Read trailer dictionary, e.g.
   3659       // trailer
   3660       //    << /Size 22
   3661       //      /Root 20R
   3662       //      /Info 10R
   3663       //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
   3664       //    >>
   3665       // The parser goes through the entire stream << ... >> and provides
   3666       // a getter interface for the key-value table
   3667       var dict = parser.getObj();
   3668       if (!isDict(dict))
   3669         error('Invalid XRef table: could not parse trailer dictionary');
   3670 
   3671       return dict;
   3672     },
   3673     readXRefStream: function XRef_readXRefStream(stream) {
   3674       var streamParameters = stream.parameters;
   3675       var byteWidths = streamParameters.get('W');
   3676       var range = streamParameters.get('Index');
   3677       if (!range)
   3678         range = [0, streamParameters.get('Size')];
   3679       var i, j;
   3680       while (range.length > 0) {
   3681         var first = range[0], n = range[1];
   3682         if (!isInt(first) || !isInt(n))
   3683           error('Invalid XRef range fields: ' + first + ', ' + n);
   3684         var typeFieldWidth = byteWidths[0];
   3685         var offsetFieldWidth = byteWidths[1];
   3686         var generationFieldWidth = byteWidths[2];
   3687         if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
   3688             !isInt(generationFieldWidth)) {
   3689           error('Invalid XRef entry fields length: ' + first + ', ' + n);
   3690         }
   3691         for (i = 0; i < n; ++i) {
   3692           var type = 0, offset = 0, generation = 0;
   3693           for (j = 0; j < typeFieldWidth; ++j)
   3694             type = (type << 8) | stream.getByte();
   3695           // if type field is absent, its default value = 1
   3696           if (typeFieldWidth == 0)
   3697             type = 1;
   3698           for (j = 0; j < offsetFieldWidth; ++j)
   3699             offset = (offset << 8) | stream.getByte();
   3700           for (j = 0; j < generationFieldWidth; ++j)
   3701             generation = (generation << 8) | stream.getByte();
   3702           var entry = {};
   3703           entry.offset = offset;
   3704           entry.gen = generation;
   3705           switch (type) {
   3706             case 0:
   3707               entry.free = true;
   3708               break;
   3709             case 1:
   3710               entry.uncompressed = true;
   3711               break;
   3712             case 2:
   3713               break;
   3714             default:
   3715               error('Invalid XRef entry type: ' + type);
   3716           }
   3717           if (!this.entries[first + i])
   3718             this.entries[first + i] = entry;
   3719         }
   3720         range.splice(0, 2);
   3721       }
   3722       return streamParameters;
   3723     },
   3724     indexObjects: function XRef_indexObjects() {
   3725       // Simple scan through the PDF content to find objects,
   3726       // trailers and XRef streams.
   3727       function readToken(data, offset) {
   3728         var token = '', ch = data[offset];
   3729         while (ch !== 13 && ch !== 10) {
   3730           if (++offset >= data.length)
   3731             break;
   3732           token += String.fromCharCode(ch);
   3733           ch = data[offset];
   3734         }
   3735         return token;
   3736       }
   3737       function skipUntil(data, offset, what) {
   3738         var length = what.length, dataLength = data.length;
   3739         var skipped = 0;
   3740         // finding byte sequence
   3741         while (offset < dataLength) {
   3742           var i = 0;
   3743           while (i < length && data[offset + i] == what[i])
   3744             ++i;
   3745           if (i >= length)
   3746             break; // sequence found
   3747 
   3748           offset++;
   3749           skipped++;
   3750         }
   3751         return skipped;
   3752       }
   3753       var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
   3754       var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
   3755                                           101, 102]);
   3756       var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
   3757       var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
   3758 
   3759       var stream = this.stream;
   3760       stream.pos = 0;
   3761       var buffer = stream.getBytes();
   3762       var position = stream.start, length = buffer.length;
   3763       var trailers = [], xrefStms = [];
   3764       var state = 0;
   3765       var currentToken;
   3766       while (position < length) {
   3767         var ch = buffer[position];
   3768         if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
   3769           ++position;
   3770           continue;
   3771         }
   3772         if (ch === 37) { // %-comment
   3773           do {
   3774             ++position;
   3775             ch = buffer[position];
   3776           } while (ch !== 13 && ch !== 10);
   3777           continue;
   3778         }
   3779         var token = readToken(buffer, position);
   3780         var m;
   3781         if (token === 'xref') {
   3782           position += skipUntil(buffer, position, trailerBytes);
   3783           trailers.push(position);
   3784           position += skipUntil(buffer, position, startxrefBytes);
   3785         } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
   3786           this.entries[m[1]] = {
   3787             offset: position,
   3788             gen: m[2] | 0,
   3789             uncompressed: true
   3790           };
   3791 
   3792           var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
   3793           var content = buffer.subarray(position, position + contentLength);
   3794 
   3795           // checking XRef stream suspect
   3796           // (it shall have '/XRef' and next char is not a letter)
   3797           var xrefTagOffset = skipUntil(content, 0, xrefBytes);
   3798           if (xrefTagOffset < contentLength &&
   3799               content[xrefTagOffset + 5] < 64) {
   3800             xrefStms.push(position);
   3801             this.xrefstms[position] = 1; // don't read it recursively
   3802           }
   3803 
   3804           position += contentLength;
   3805         } else
   3806           position += token.length + 1;
   3807       }
   3808       // reading XRef streams
   3809       for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
   3810           this.readXRef(xrefStms[i], true);
   3811       }
   3812       // finding main trailer
   3813       var dict;
   3814       for (var i = 0, ii = trailers.length; i < ii; ++i) {
   3815         stream.pos = trailers[i];
   3816         var parser = new Parser(new Lexer(stream), true, null);
   3817         var obj = parser.getObj();
   3818         if (!isCmd(obj, 'trailer'))
   3819           continue;
   3820         // read the trailer dictionary
   3821         if (!isDict(dict = parser.getObj()))
   3822           continue;
   3823         // taking the first one with 'ID'
   3824         if (dict.has('ID'))
   3825           return dict;
   3826       }
   3827       // no tailer with 'ID', taking last one (if exists)
   3828       if (dict)
   3829         return dict;
   3830       // nothing helps
   3831       error('Invalid PDF structure');
   3832     },
   3833     readXRef: function XRef_readXRef(startXRef, recoveryMode) {
   3834       var stream = this.stream;
   3835       stream.pos = startXRef;
   3836 
   3837       try {
   3838         var parser = new Parser(new Lexer(stream), true, null);
   3839         var obj = parser.getObj();
   3840         var dict;
   3841 
   3842         // Get dictionary
   3843         if (isCmd(obj, 'xref')) {
   3844           // Parse end-of-file XRef
   3845           dict = this.readXRefTable(parser);
   3846 
   3847           // Recursively get other XRefs 'XRefStm', if any
   3848           obj = dict.get('XRefStm');
   3849           if (isInt(obj)) {
   3850             var pos = obj;
   3851             // ignore previously loaded xref streams
   3852             // (possible infinite recursion)
   3853             if (!(pos in this.xrefstms)) {
   3854               this.xrefstms[pos] = 1;
   3855               this.readXRef(pos);
   3856             }
   3857           }
   3858         } else if (isInt(obj)) {
   3859           // Parse in-stream XRef
   3860           if (!isInt(parser.getObj()) ||
   3861               !isCmd(parser.getObj(), 'obj') ||
   3862               !isStream(obj = parser.getObj())) {
   3863             error('Invalid XRef stream');
   3864           }
   3865           dict = this.readXRefStream(obj);
   3866           if (!dict)
   3867             error('Failed to read XRef stream');
   3868         }
   3869 
   3870         // Recursively get previous dictionary, if any
   3871         obj = dict.get('Prev');
   3872         if (isInt(obj))
   3873           this.readXRef(obj, recoveryMode);
   3874         else if (isRef(obj)) {
   3875           // The spec says Prev must not be a reference, i.e. "/Prev NNN"
   3876           // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
   3877           this.readXRef(obj.num, recoveryMode);
   3878         }
   3879 
   3880         return dict;
   3881       } catch (e) {
   3882         log('(while reading XRef): ' + e);
   3883       }
   3884 
   3885       if (recoveryMode)
   3886         return;
   3887 
   3888       warn('Indexing all PDF objects');
   3889       return this.indexObjects();
   3890     },
   3891     getEntry: function XRef_getEntry(i) {
   3892       var e = this.entries[i];
   3893       if (e === null)
   3894         return null;
   3895       return e.free ? null : e; // returns null is the entry is free
   3896     },
   3897     fetchIfRef: function XRef_fetchIfRef(obj) {
   3898       if (!isRef(obj))
   3899         return obj;
   3900       return this.fetch(obj);
   3901     },
   3902     fetch: function XRef_fetch(ref, suppressEncryption) {
   3903       assertWellFormed(isRef(ref), 'ref object is not a reference');
   3904       var num = ref.num;
   3905       if (num in this.cache)
   3906         return this.cache[num];
   3907 
   3908       var e = this.getEntry(num);
   3909 
   3910       // the referenced entry can be free
   3911       if (e === null)
   3912         return (this.cache[num] = e);
   3913 
   3914       var gen = ref.gen;
   3915       var stream, parser;
   3916       if (e.uncompressed) {
   3917         if (e.gen != gen)
   3918           error('inconsistent generation in XRef');
   3919         stream = this.stream.makeSubStream(e.offset);
   3920         parser = new Parser(new Lexer(stream), true, this);
   3921         var obj1 = parser.getObj();
   3922         var obj2 = parser.getObj();
   3923         var obj3 = parser.getObj();
   3924         if (!isInt(obj1) || obj1 != num ||
   3925             !isInt(obj2) || obj2 != gen ||
   3926             !isCmd(obj3)) {
   3927           error('bad XRef entry');
   3928         }
   3929         if (!isCmd(obj3, 'obj')) {
   3930           // some bad pdfs use "obj1234" and really mean 1234
   3931           if (obj3.cmd.indexOf('obj') == 0) {
   3932             num = parseInt(obj3.cmd.substring(3), 10);
   3933             if (!isNaN(num))
   3934               return num;
   3935           }
   3936           error('bad XRef entry');
   3937         }
   3938         if (this.encrypt && !suppressEncryption) {
   3939           try {
   3940             e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
   3941           } catch (ex) {
   3942             // almost all streams must be encrypted, but sometimes
   3943             // they are not probably due to some broken generators
   3944             // re-trying without encryption
   3945             return this.fetch(ref, true);
   3946           }
   3947         } else {
   3948           e = parser.getObj();
   3949         }
   3950         // Don't cache streams since they are mutable (except images).
   3951         if (!isStream(e) || e instanceof JpegStream)
   3952           this.cache[num] = e;
   3953         return e;
   3954       }
   3955 
   3956       // compressed entry
   3957       stream = this.fetch(new Ref(e.offset, 0));
   3958       if (!isStream(stream))
   3959         error('bad ObjStm stream');
   3960       var first = stream.parameters.get('First');
   3961       var n = stream.parameters.get('N');
   3962       if (!isInt(first) || !isInt(n)) {
   3963         error('invalid first and n parameters for ObjStm stream');
   3964       }
   3965       parser = new Parser(new Lexer(stream), false, this);
   3966       var i, entries = [], nums = [];
   3967       // read the object numbers to populate cache
   3968       for (i = 0; i < n; ++i) {
   3969         num = parser.getObj();
   3970         if (!isInt(num)) {
   3971           error('invalid object number in the ObjStm stream: ' + num);
   3972         }
   3973         nums.push(num);
   3974         var offset = parser.getObj();
   3975         if (!isInt(offset)) {
   3976           error('invalid object offset in the ObjStm stream: ' + offset);
   3977         }
   3978       }
   3979       // read stream objects for cache
   3980       for (i = 0; i < n; ++i) {
   3981         entries.push(parser.getObj());
   3982         this.cache[nums[i]] = entries[i];
   3983       }
   3984       e = entries[e.gen];
   3985       if (!e) {
   3986         error('bad XRef entry for compressed object');
   3987       }
   3988       return e;
   3989     },
   3990     getCatalogObj: function XRef_getCatalogObj() {
   3991       return this.root;
   3992     }
   3993   };
   3994 
   3995   return XRef;
   3996 })();
   3997 
   3998 /**
   3999  * A PDF document and page is built of many objects. E.g. there are objects
   4000  * for fonts, images, rendering code and such. These objects might get processed
   4001  * inside of a worker. The `PDFObjects` implements some basic functions to
   4002  * manage these objects.
   4003  */
   4004 var PDFObjects = (function PDFObjectsClosure() {
   4005   function PDFObjects() {
   4006     this.objs = {};
   4007   }
   4008 
   4009   PDFObjects.prototype = {
   4010     objs: null,
   4011 
   4012     /**
   4013      * Internal function.
   4014      * Ensures there is an object defined for `objId`. Stores `data` on the
   4015      * object *if* it is created.
   4016      */
   4017     ensureObj: function PDFObjects_ensureObj(objId, data) {
   4018       if (this.objs[objId])
   4019         return this.objs[objId];
   4020       return this.objs[objId] = new Promise(objId, data);
   4021     },
   4022 
   4023     /**
   4024      * If called *without* callback, this returns the data of `objId` but the
   4025      * object needs to be resolved. If it isn't, this function throws.
   4026      *
   4027      * If called *with* a callback, the callback is called with the data of the
   4028      * object once the object is resolved. That means, if you call this
   4029      * function and the object is already resolved, the callback gets called
   4030      * right away.
   4031      */
   4032     get: function PDFObjects_get(objId, callback) {
   4033       // If there is a callback, then the get can be async and the object is
   4034       // not required to be resolved right now
   4035       if (callback) {
   4036         this.ensureObj(objId).then(callback);
   4037         return null;
   4038       }
   4039 
   4040       // If there isn't a callback, the user expects to get the resolved data
   4041       // directly.
   4042       var obj = this.objs[objId];
   4043 
   4044       // If there isn't an object yet or the object isn't resolved, then the
   4045       // data isn't ready yet!
   4046       if (!obj || !obj.isResolved)
   4047         error('Requesting object that isn\'t resolved yet ' + objId);
   4048 
   4049       return obj.data;
   4050     },
   4051 
   4052     /**
   4053      * Resolves the object `objId` with optional `data`.
   4054      */
   4055     resolve: function PDFObjects_resolve(objId, data) {
   4056       var objs = this.objs;
   4057 
   4058       // In case there is a promise already on this object, just resolve it.
   4059       if (objs[objId]) {
   4060         objs[objId].resolve(data);
   4061       } else {
   4062         this.ensureObj(objId, data);
   4063       }
   4064     },
   4065 
   4066     onData: function PDFObjects_onData(objId, callback) {
   4067       this.ensureObj(objId).onData(callback);
   4068     },
   4069 
   4070     isResolved: function PDFObjects_isResolved(objId) {
   4071       var objs = this.objs;
   4072       if (!objs[objId]) {
   4073         return false;
   4074       } else {
   4075         return objs[objId].isResolved;
   4076       }
   4077     },
   4078 
   4079     hasData: function PDFObjects_hasData(objId) {
   4080       var objs = this.objs;
   4081       if (!objs[objId]) {
   4082         return false;
   4083       } else {
   4084         return objs[objId].hasData;
   4085       }
   4086     },
   4087 
   4088     /**
   4089      * Sets the data of an object but *doesn't* resolve it.
   4090      */
   4091     setData: function PDFObjects_setData(objId, data) {
   4092       // Watchout! If you call `this.ensureObj(objId, data)` you're going to
   4093       // create a *resolved* promise which shouldn't be the case!
   4094       this.ensureObj(objId).data = data;
   4095     }
   4096   };
   4097   return PDFObjects;
   4098 })();
   4099 
   4100 
   4101 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   4102 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   4103 
   4104 'use strict';
   4105 
   4106 var PDFFunction = (function PDFFunctionClosure() {
   4107   var CONSTRUCT_SAMPLED = 0;
   4108   var CONSTRUCT_INTERPOLATED = 2;
   4109   var CONSTRUCT_STICHED = 3;
   4110   var CONSTRUCT_POSTSCRIPT = 4;
   4111 
   4112   return {
   4113     getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
   4114                                                        str) {
   4115       var length = 1;
   4116       for (var i = 0, ii = size.length; i < ii; i++)
   4117         length *= size[i];
   4118       length *= outputSize;
   4119 
   4120       var array = [];
   4121       var codeSize = 0;
   4122       var codeBuf = 0;
   4123       // 32 is a valid bps so shifting won't work
   4124       var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
   4125 
   4126       var strBytes = str.getBytes((length * bps + 7) / 8);
   4127       var strIdx = 0;
   4128       for (var i = 0; i < length; i++) {
   4129         while (codeSize < bps) {
   4130           codeBuf <<= 8;
   4131           codeBuf |= strBytes[strIdx++];
   4132           codeSize += 8;
   4133         }
   4134         codeSize -= bps;
   4135         array.push((codeBuf >> codeSize) * sampleMul);
   4136         codeBuf &= (1 << codeSize) - 1;
   4137       }
   4138       return array;
   4139     },
   4140 
   4141     getIR: function PDFFunction_getIR(xref, fn) {
   4142       var dict = fn.dict;
   4143       if (!dict)
   4144         dict = fn;
   4145 
   4146       var types = [this.constructSampled,
   4147                    null,
   4148                    this.constructInterpolated,
   4149                    this.constructStiched,
   4150                    this.constructPostScript];
   4151 
   4152       var typeNum = dict.get('FunctionType');
   4153       var typeFn = types[typeNum];
   4154       if (!typeFn)
   4155         error('Unknown type of function');
   4156 
   4157       return typeFn.call(this, fn, dict, xref);
   4158     },
   4159 
   4160     fromIR: function PDFFunction_fromIR(IR) {
   4161       var type = IR[0];
   4162       switch (type) {
   4163         case CONSTRUCT_SAMPLED:
   4164           return this.constructSampledFromIR(IR);
   4165         case CONSTRUCT_INTERPOLATED:
   4166           return this.constructInterpolatedFromIR(IR);
   4167         case CONSTRUCT_STICHED:
   4168           return this.constructStichedFromIR(IR);
   4169         case CONSTRUCT_POSTSCRIPT:
   4170         default:
   4171           return this.constructPostScriptFromIR(IR);
   4172       }
   4173     },
   4174 
   4175     parse: function PDFFunction_parse(xref, fn) {
   4176       var IR = this.getIR(xref, fn);
   4177       return this.fromIR(IR);
   4178     },
   4179 
   4180     constructSampled: function PDFFunction_constructSampled(str, dict) {
   4181       function toMultiArray(arr) {
   4182         var inputLength = arr.length;
   4183         var outputLength = arr.length / 2;
   4184         var out = [];
   4185         var index = 0;
   4186         for (var i = 0; i < inputLength; i += 2) {
   4187           out[index] = [arr[i], arr[i + 1]];
   4188           ++index;
   4189         }
   4190         return out;
   4191       }
   4192       var domain = dict.get('Domain');
   4193       var range = dict.get('Range');
   4194 
   4195       if (!domain || !range)
   4196         error('No domain or range');
   4197 
   4198       var inputSize = domain.length / 2;
   4199       var outputSize = range.length / 2;
   4200 
   4201       domain = toMultiArray(domain);
   4202       range = toMultiArray(range);
   4203 
   4204       var size = dict.get('Size');
   4205       var bps = dict.get('BitsPerSample');
   4206       var order = dict.get('Order');
   4207       if (!order)
   4208         order = 1;
   4209       if (order !== 1)
   4210         error('No support for cubic spline interpolation: ' + order);
   4211 
   4212       var encode = dict.get('Encode');
   4213       if (!encode) {
   4214         encode = [];
   4215         for (var i = 0; i < inputSize; ++i) {
   4216           encode.push(0);
   4217           encode.push(size[i] - 1);
   4218         }
   4219       }
   4220       encode = toMultiArray(encode);
   4221 
   4222       var decode = dict.get('Decode');
   4223       if (!decode)
   4224         decode = range;
   4225       else
   4226         decode = toMultiArray(decode);
   4227 
   4228       var samples = this.getSampleArray(size, outputSize, bps, str);
   4229 
   4230       return [
   4231         CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
   4232         outputSize, Math.pow(2, bps) - 1, range
   4233       ];
   4234     },
   4235 
   4236     constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
   4237       // See chapter 3, page 109 of the PDF reference
   4238       function interpolate(x, xmin, xmax, ymin, ymax) {
   4239         return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
   4240       }
   4241 
   4242       return function constructSampledFromIRResult(args) {
   4243         // See chapter 3, page 110 of the PDF reference.
   4244         var m = IR[1];
   4245         var domain = IR[2];
   4246         var encode = IR[3];
   4247         var decode = IR[4];
   4248         var samples = IR[5];
   4249         var size = IR[6];
   4250         var n = IR[7];
   4251         var mask = IR[8];
   4252         var range = IR[9];
   4253 
   4254         if (m != args.length)
   4255           error('Incorrect number of arguments: ' + inputSize + ' != ' +
   4256                 args.length);
   4257 
   4258         var x = args;
   4259 
   4260         // Building the cube vertices: its part and sample index
   4261         // http://rjwagner49.com/Mathematics/Interpolation.pdf
   4262         var cubeVertices = 1 << m;
   4263         var cubeN = new Float64Array(cubeVertices);
   4264         var cubeVertex = new Uint32Array(cubeVertices);
   4265         for (var j = 0; j < cubeVertices; j++)
   4266           cubeN[j] = 1;
   4267 
   4268         var k = n, pos = 1;
   4269         // Map x_i to y_j for 0 <= i < m using the sampled function.
   4270         for (var i = 0; i < m; ++i) {
   4271           // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
   4272           var domain_2i = domain[i][0];
   4273           var domain_2i_1 = domain[i][1];
   4274           var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
   4275 
   4276           // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
   4277           //                   Encode_2i, Encode_2i+1)
   4278           var e = interpolate(xi, domain_2i, domain_2i_1,
   4279                               encode[i][0], encode[i][1]);
   4280 
   4281           // e_i' = min(max(e_i, 0), Size_i - 1)
   4282           var size_i = size[i];
   4283           e = Math.min(Math.max(e, 0), size_i - 1);
   4284 
   4285           // Adjusting the cube: N and vertex sample index
   4286           var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
   4287           var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
   4288           var n1 = e - e0; // (e - e0) / (e1 - e0);
   4289           var offset0 = e0 * k;
   4290           var offset1 = offset0 + k; // e1 * k
   4291           for (var j = 0; j < cubeVertices; j++) {
   4292             if (j & pos) {
   4293               cubeN[j] *= n1;
   4294               cubeVertex[j] += offset1;
   4295             } else {
   4296               cubeN[j] *= n0;
   4297               cubeVertex[j] += offset0;
   4298             }
   4299           }
   4300 
   4301           k *= size_i;
   4302           pos <<= 1;
   4303         }
   4304 
   4305         var y = new Float64Array(n);
   4306         for (var j = 0; j < n; ++j) {
   4307           // Sum all cube vertices' samples portions
   4308           var rj = 0;
   4309           for (var i = 0; i < cubeVertices; i++)
   4310             rj += samples[cubeVertex[i] + j] * cubeN[i];
   4311 
   4312           // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
   4313           //                    Decode_2j, Decode_2j+1)
   4314           rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
   4315 
   4316           // y_j = min(max(r_j, range_2j), range_2j+1)
   4317           y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
   4318         }
   4319 
   4320         return y;
   4321       }
   4322     },
   4323 
   4324     constructInterpolated: function PDFFunction_constructInterpolated(str,
   4325                                                                       dict) {
   4326       var c0 = dict.get('C0') || [0];
   4327       var c1 = dict.get('C1') || [1];
   4328       var n = dict.get('N');
   4329 
   4330       if (!isArray(c0) || !isArray(c1))
   4331         error('Illegal dictionary for interpolated function');
   4332 
   4333       var length = c0.length;
   4334       var diff = [];
   4335       for (var i = 0; i < length; ++i)
   4336         diff.push(c1[i] - c0[i]);
   4337 
   4338       return [CONSTRUCT_INTERPOLATED, c0, diff, n];
   4339     },
   4340 
   4341     constructInterpolatedFromIR:
   4342       function PDFFunction_constructInterpolatedFromIR(IR) {
   4343       var c0 = IR[1];
   4344       var diff = IR[2];
   4345       var n = IR[3];
   4346 
   4347       var length = diff.length;
   4348 
   4349       return function constructInterpolatedFromIRResult(args) {
   4350         var x = n == 1 ? args[0] : Math.pow(args[0], n);
   4351 
   4352         var out = [];
   4353         for (var j = 0; j < length; ++j)
   4354           out.push(c0[j] + (x * diff[j]));
   4355 
   4356         return out;
   4357 
   4358       }
   4359     },
   4360 
   4361     constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
   4362       var domain = dict.get('Domain');
   4363 
   4364       if (!domain)
   4365         error('No domain');
   4366 
   4367       var inputSize = domain.length / 2;
   4368       if (inputSize != 1)
   4369         error('Bad domain for stiched function');
   4370 
   4371       var fnRefs = dict.get('Functions');
   4372       var fns = [];
   4373       for (var i = 0, ii = fnRefs.length; i < ii; ++i)
   4374         fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
   4375 
   4376       var bounds = dict.get('Bounds');
   4377       var encode = dict.get('Encode');
   4378 
   4379       return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
   4380     },
   4381 
   4382     constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
   4383       var domain = IR[1];
   4384       var bounds = IR[2];
   4385       var encode = IR[3];
   4386       var fnsIR = IR[4];
   4387       var fns = [];
   4388 
   4389       for (var i = 0, ii = fnsIR.length; i < ii; i++) {
   4390         fns.push(PDFFunction.fromIR(fnsIR[i]));
   4391       }
   4392 
   4393       return function constructStichedFromIRResult(args) {
   4394         var clip = function constructStichedFromIRClip(v, min, max) {
   4395           if (v > max)
   4396             v = max;
   4397           else if (v < min)
   4398             v = min;
   4399           return v;
   4400         };
   4401 
   4402         // clip to domain
   4403         var v = clip(args[0], domain[0], domain[1]);
   4404         // calulate which bound the value is in
   4405         for (var i = 0, ii = bounds.length; i < ii; ++i) {
   4406           if (v < bounds[i])
   4407             break;
   4408         }
   4409 
   4410         // encode value into domain of function
   4411         var dmin = domain[0];
   4412         if (i > 0)
   4413           dmin = bounds[i - 1];
   4414         var dmax = domain[1];
   4415         if (i < bounds.length)
   4416           dmax = bounds[i];
   4417 
   4418         var rmin = encode[2 * i];
   4419         var rmax = encode[2 * i + 1];
   4420 
   4421         var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
   4422 
   4423         // call the appropropriate function
   4424         return fns[i]([v2]);
   4425       };
   4426     },
   4427 
   4428     constructPostScript: function PDFFunction_constructPostScript(fn, dict,
   4429                                                                   xref) {
   4430       var domain = dict.get('Domain');
   4431       var range = dict.get('Range');
   4432 
   4433       if (!domain)
   4434         error('No domain.');
   4435 
   4436       if (!range)
   4437         error('No range.');
   4438 
   4439       var lexer = new PostScriptLexer(fn);
   4440       var parser = new PostScriptParser(lexer);
   4441       var code = parser.parse();
   4442 
   4443       return [CONSTRUCT_POSTSCRIPT, domain, range, code];
   4444     },
   4445 
   4446     constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
   4447                                           IR) {
   4448       var domain = IR[1];
   4449       var range = IR[2];
   4450       var code = IR[3];
   4451       var numOutputs = range.length / 2;
   4452       var evaluator = new PostScriptEvaluator(code);
   4453       // Cache the values for a big speed up, the cache size is limited though
   4454       // since the number of possible values can be huge from a PS function.
   4455       var cache = new FunctionCache();
   4456       return function constructPostScriptFromIRResult(args) {
   4457         var initialStack = [];
   4458         for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
   4459           initialStack.push(args[i]);
   4460         }
   4461 
   4462         var key = initialStack.join('_');
   4463         if (cache.has(key))
   4464           return cache.get(key);
   4465 
   4466         var stack = evaluator.execute(initialStack);
   4467         var transformed = [];
   4468         for (i = numOutputs - 1; i >= 0; --i) {
   4469           var out = stack.pop();
   4470           var rangeIndex = 2 * i;
   4471           if (out < range[rangeIndex])
   4472             out = range[rangeIndex];
   4473           else if (out > range[rangeIndex + 1])
   4474             out = range[rangeIndex + 1];
   4475           transformed[i] = out;
   4476         }
   4477         cache.set(key, transformed);
   4478         return transformed;
   4479       };
   4480     }
   4481   };
   4482 })();
   4483 
   4484 var FunctionCache = (function FunctionCacheClosure() {
   4485   // Of 10 PDF's with type4 functions the maxium number of distinct values seen
   4486   // was 256. This still may need some tweaking in the future though.
   4487   var MAX_CACHE_SIZE = 1024;
   4488   function FunctionCache() {
   4489     this.cache = {};
   4490     this.total = 0;
   4491   }
   4492   FunctionCache.prototype = {
   4493     has: function FunctionCache_has(key) {
   4494       return key in this.cache;
   4495     },
   4496     get: function FunctionCache_get(key) {
   4497       return this.cache[key];
   4498     },
   4499     set: function FunctionCache_set(key, value) {
   4500       if (this.total < MAX_CACHE_SIZE) {
   4501         this.cache[key] = value;
   4502         this.total++;
   4503       }
   4504     }
   4505   };
   4506   return FunctionCache;
   4507 })();
   4508 
   4509 var PostScriptStack = (function PostScriptStackClosure() {
   4510   var MAX_STACK_SIZE = 100;
   4511   function PostScriptStack(initialStack) {
   4512     this.stack = initialStack || [];
   4513   }
   4514 
   4515   PostScriptStack.prototype = {
   4516     push: function PostScriptStack_push(value) {
   4517       if (this.stack.length >= MAX_STACK_SIZE)
   4518         error('PostScript function stack overflow.');
   4519       this.stack.push(value);
   4520     },
   4521     pop: function PostScriptStack_pop() {
   4522       if (this.stack.length <= 0)
   4523         error('PostScript function stack underflow.');
   4524       return this.stack.pop();
   4525     },
   4526     copy: function PostScriptStack_copy(n) {
   4527       if (this.stack.length + n >= MAX_STACK_SIZE)
   4528         error('PostScript function stack overflow.');
   4529       var stack = this.stack;
   4530       for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++)
   4531         stack.push(stack[i]);
   4532     },
   4533     index: function PostScriptStack_index(n) {
   4534       this.push(this.stack[this.stack.length - n - 1]);
   4535     },
   4536     // rotate the last n stack elements p times
   4537     roll: function PostScriptStack_roll(n, p) {
   4538       var stack = this.stack;
   4539       var l = stack.length - n;
   4540       var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
   4541       for (i = l, j = r; i < j; i++, j--) {
   4542         t = stack[i]; stack[i] = stack[j]; stack[j] = t;
   4543       }
   4544       for (i = l, j = c - 1; i < j; i++, j--) {
   4545         t = stack[i]; stack[i] = stack[j]; stack[j] = t;
   4546       }
   4547       for (i = c, j = r; i < j; i++, j--) {
   4548         t = stack[i]; stack[i] = stack[j]; stack[j] = t;
   4549       }
   4550     }
   4551   };
   4552   return PostScriptStack;
   4553 })();
   4554 var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
   4555   function PostScriptEvaluator(operators, operands) {
   4556     this.operators = operators;
   4557     this.operands = operands;
   4558   }
   4559   PostScriptEvaluator.prototype = {
   4560     execute: function PostScriptEvaluator_execute(initialStack) {
   4561       var stack = new PostScriptStack(initialStack);
   4562       var counter = 0;
   4563       var operators = this.operators;
   4564       var length = operators.length;
   4565       var operator, a, b;
   4566       while (counter < length) {
   4567         operator = operators[counter++];
   4568         if (typeof operator == 'number') {
   4569           // Operator is really an operand and should be pushed to the stack.
   4570           stack.push(operator);
   4571           continue;
   4572         }
   4573         switch (operator) {
   4574           // non standard ps operators
   4575           case 'jz': // jump if false
   4576             b = stack.pop();
   4577             a = stack.pop();
   4578             if (!a)
   4579               counter = b;
   4580             break;
   4581           case 'j': // jump
   4582             a = stack.pop();
   4583             counter = a;
   4584             break;
   4585 
   4586           // all ps operators in alphabetical order (excluding if/ifelse)
   4587           case 'abs':
   4588             a = stack.pop();
   4589             stack.push(Math.abs(a));
   4590             break;
   4591           case 'add':
   4592             b = stack.pop();
   4593             a = stack.pop();
   4594             stack.push(a + b);
   4595             break;
   4596           case 'and':
   4597             b = stack.pop();
   4598             a = stack.pop();
   4599             if (isBool(a) && isBool(b))
   4600               stack.push(a && b);
   4601             else
   4602               stack.push(a & b);
   4603             break;
   4604           case 'atan':
   4605             a = stack.pop();
   4606             stack.push(Math.atan(a));
   4607             break;
   4608           case 'bitshift':
   4609             b = stack.pop();
   4610             a = stack.pop();
   4611             if (a > 0)
   4612               stack.push(a << b);
   4613             else
   4614               stack.push(a >> b);
   4615             break;
   4616           case 'ceiling':
   4617             a = stack.pop();
   4618             stack.push(Math.ceil(a));
   4619             break;
   4620           case 'copy':
   4621             a = stack.pop();
   4622             stack.copy(a);
   4623             break;
   4624           case 'cos':
   4625             a = stack.pop();
   4626             stack.push(Math.cos(a));
   4627             break;
   4628           case 'cvi':
   4629             a = stack.pop() | 0;
   4630             stack.push(a);
   4631             break;
   4632           case 'cvr':
   4633             // noop
   4634             break;
   4635           case 'div':
   4636             b = stack.pop();
   4637             a = stack.pop();
   4638             stack.push(a / b);
   4639             break;
   4640           case 'dup':
   4641             stack.copy(1);
   4642             break;
   4643           case 'eq':
   4644             b = stack.pop();
   4645             a = stack.pop();
   4646             stack.push(a == b);
   4647             break;
   4648           case 'exch':
   4649             stack.roll(2, 1);
   4650             break;
   4651           case 'exp':
   4652             b = stack.pop();
   4653             a = stack.pop();
   4654             stack.push(Math.pow(a, b));
   4655             break;
   4656           case 'false':
   4657             stack.push(false);
   4658             break;
   4659           case 'floor':
   4660             a = stack.pop();
   4661             stack.push(Math.floor(a));
   4662             break;
   4663           case 'ge':
   4664             b = stack.pop();
   4665             a = stack.pop();
   4666             stack.push(a >= b);
   4667             break;
   4668           case 'gt':
   4669             b = stack.pop();
   4670             a = stack.pop();
   4671             stack.push(a > b);
   4672             break;
   4673           case 'idiv':
   4674             b = stack.pop();
   4675             a = stack.pop();
   4676             stack.push((a / b) | 0);
   4677             break;
   4678           case 'index':
   4679             a = stack.pop();
   4680             stack.index(a);
   4681             break;
   4682           case 'le':
   4683             b = stack.pop();
   4684             a = stack.pop();
   4685             stack.push(a <= b);
   4686             break;
   4687           case 'ln':
   4688             a = stack.pop();
   4689             stack.push(Math.log(a));
   4690             break;
   4691           case 'log':
   4692             a = stack.pop();
   4693             stack.push(Math.log(a) / Math.LN10);
   4694             break;
   4695           case 'lt':
   4696             b = stack.pop();
   4697             a = stack.pop();
   4698             stack.push(a < b);
   4699             break;
   4700           case 'mod':
   4701             b = stack.pop();
   4702             a = stack.pop();
   4703             stack.push(a % b);
   4704             break;
   4705           case 'mul':
   4706             b = stack.pop();
   4707             a = stack.pop();
   4708             stack.push(a * b);
   4709             break;
   4710           case 'ne':
   4711             b = stack.pop();
   4712             a = stack.pop();
   4713             stack.push(a != b);
   4714             break;
   4715           case 'neg':
   4716             a = stack.pop();
   4717             stack.push(-b);
   4718             break;
   4719           case 'not':
   4720             a = stack.pop();
   4721             if (isBool(a) && isBool(b))
   4722               stack.push(a && b);
   4723             else
   4724               stack.push(a & b);
   4725             break;
   4726           case 'or':
   4727             b = stack.pop();
   4728             a = stack.pop();
   4729             if (isBool(a) && isBool(b))
   4730               stack.push(a || b);
   4731             else
   4732               stack.push(a | b);
   4733             break;
   4734           case 'pop':
   4735             stack.pop();
   4736             break;
   4737           case 'roll':
   4738             b = stack.pop();
   4739             a = stack.pop();
   4740             stack.roll(a, b);
   4741             break;
   4742           case 'round':
   4743             a = stack.pop();
   4744             stack.push(Math.round(a));
   4745             break;
   4746           case 'sin':
   4747             a = stack.pop();
   4748             stack.push(Math.sin(a));
   4749             break;
   4750           case 'sqrt':
   4751             a = stack.pop();
   4752             stack.push(Math.sqrt(a));
   4753             break;
   4754           case 'sub':
   4755             b = stack.pop();
   4756             a = stack.pop();
   4757             stack.push(a - b);
   4758             break;
   4759           case 'true':
   4760             stack.push(true);
   4761             break;
   4762           case 'truncate':
   4763             a = stack.pop();
   4764             a = a < 0 ? Math.ceil(a) : Math.floor(a);
   4765             stack.push(a);
   4766             break;
   4767           case 'xor':
   4768             b = stack.pop();
   4769             a = stack.pop();
   4770             if (isBool(a) && isBool(b))
   4771               stack.push(a != b);
   4772             else
   4773               stack.push(a ^ b);
   4774             break;
   4775           default:
   4776             error('Unknown operator ' + operator);
   4777             break;
   4778         }
   4779       }
   4780       return stack.stack;
   4781     }
   4782   };
   4783   return PostScriptEvaluator;
   4784 })();
   4785 
   4786 var PostScriptParser = (function PostScriptParserClosure() {
   4787   function PostScriptParser(lexer) {
   4788     this.lexer = lexer;
   4789     this.operators = [];
   4790     this.token;
   4791     this.prev;
   4792   }
   4793   PostScriptParser.prototype = {
   4794     nextToken: function PostScriptParser_nextToken() {
   4795       this.prev = this.token;
   4796       this.token = this.lexer.getToken();
   4797     },
   4798     accept: function PostScriptParser_accept(type) {
   4799       if (this.token.type == type) {
   4800         this.nextToken();
   4801         return true;
   4802       }
   4803       return false;
   4804     },
   4805     expect: function PostScriptParser_expect(type) {
   4806       if (this.accept(type))
   4807         return true;
   4808       error('Unexpected symbol: found ' + this.token.type + ' expected ' +
   4809             type + '.');
   4810     },
   4811     parse: function PostScriptParser_parse() {
   4812       this.nextToken();
   4813       this.expect(PostScriptTokenTypes.LBRACE);
   4814       this.parseBlock();
   4815       this.expect(PostScriptTokenTypes.RBRACE);
   4816       return this.operators;
   4817     },
   4818     parseBlock: function PostScriptParser_parseBlock() {
   4819       while (true) {
   4820         if (this.accept(PostScriptTokenTypes.NUMBER)) {
   4821           this.operators.push(this.prev.value);
   4822         } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
   4823           this.operators.push(this.prev.value);
   4824         } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
   4825           this.parseCondition();
   4826         } else {
   4827           return;
   4828         }
   4829       }
   4830     },
   4831     parseCondition: function PostScriptParser_parseCondition() {
   4832       // Add two place holders that will be updated later
   4833       var conditionLocation = this.operators.length;
   4834       this.operators.push(null, null);
   4835 
   4836       this.parseBlock();
   4837       this.expect(PostScriptTokenTypes.RBRACE);
   4838       if (this.accept(PostScriptTokenTypes.IF)) {
   4839         // The true block is right after the 'if' so it just falls through on
   4840         // true else it jumps and skips the true block.
   4841         this.operators[conditionLocation] = this.operators.length;
   4842         this.operators[conditionLocation + 1] = 'jz';
   4843       } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
   4844         var jumpLocation = this.operators.length;
   4845         this.operators.push(null, null);
   4846         var endOfTrue = this.operators.length;
   4847         this.parseBlock();
   4848         this.expect(PostScriptTokenTypes.RBRACE);
   4849         this.expect(PostScriptTokenTypes.IFELSE);
   4850         // The jump is added at the end of the true block to skip the false
   4851         // block.
   4852         this.operators[jumpLocation] = this.operators.length;
   4853         this.operators[jumpLocation + 1] = 'j';
   4854 
   4855         this.operators[conditionLocation] = endOfTrue;
   4856         this.operators[conditionLocation + 1] = 'jz';
   4857       } else {
   4858         error('PS Function: error parsing conditional.');
   4859       }
   4860     }
   4861   };
   4862   return PostScriptParser;
   4863 })();
   4864 
   4865 var PostScriptTokenTypes = {
   4866   LBRACE: 0,
   4867   RBRACE: 1,
   4868   NUMBER: 2,
   4869   OPERATOR: 3,
   4870   IF: 4,
   4871   IFELSE: 5
   4872 };
   4873 
   4874 var PostScriptToken = (function PostScriptTokenClosure() {
   4875   function PostScriptToken(type, value) {
   4876     this.type = type;
   4877     this.value = value;
   4878   }
   4879 
   4880   var opCache = {};
   4881 
   4882   PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
   4883     var opValue = opCache[op];
   4884     if (opValue)
   4885       return opValue;
   4886 
   4887     return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
   4888   };
   4889 
   4890   PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
   4891                                                 '{');
   4892   PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
   4893                                                 '}');
   4894   PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
   4895   PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
   4896                                                 'IFELSE');
   4897   return PostScriptToken;
   4898 })();
   4899 
   4900 var PostScriptLexer = (function PostScriptLexerClosure() {
   4901   function PostScriptLexer(stream) {
   4902     this.stream = stream;
   4903   }
   4904   PostScriptLexer.prototype = {
   4905     getToken: function PostScriptLexer_getToken() {
   4906       var s = '';
   4907       var ch;
   4908       var comment = false;
   4909       var stream = this.stream;
   4910 
   4911       // skip comments
   4912       while (true) {
   4913         if (!(ch = stream.getChar()))
   4914           return EOF;
   4915 
   4916         if (comment) {
   4917           if (ch == '\x0a' || ch == '\x0d')
   4918             comment = false;
   4919         } else if (ch == '%') {
   4920           comment = true;
   4921         } else if (!Lexer.isSpace(ch)) {
   4922           break;
   4923         }
   4924       }
   4925       switch (ch) {
   4926         case '0': case '1': case '2': case '3': case '4':
   4927         case '5': case '6': case '7': case '8': case '9':
   4928         case '+': case '-': case '.':
   4929           return new PostScriptToken(PostScriptTokenTypes.NUMBER,
   4930                                       this.getNumber(ch));
   4931         case '{':
   4932           return PostScriptToken.LBRACE;
   4933         case '}':
   4934           return PostScriptToken.RBRACE;
   4935       }
   4936       // operator
   4937       var str = ch.toLowerCase();
   4938       while (true) {
   4939         ch = stream.lookChar();
   4940         if (ch === null)
   4941           break;
   4942         ch = ch.toLowerCase();
   4943         if (ch >= 'a' && ch <= 'z')
   4944           str += ch;
   4945         else
   4946           break;
   4947         stream.skip();
   4948       }
   4949       switch (str) {
   4950         case 'if':
   4951           return PostScriptToken.IF;
   4952         case 'ifelse':
   4953           return PostScriptToken.IFELSE;
   4954         default:
   4955           return PostScriptToken.getOperator(str);
   4956       }
   4957     },
   4958     getNumber: function PostScriptLexer_getNumber(ch) {
   4959       var str = ch;
   4960       var stream = this.stream;
   4961       while (true) {
   4962         ch = stream.lookChar();
   4963         if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.')
   4964           str += ch;
   4965         else
   4966           break;
   4967         stream.skip();
   4968       }
   4969       var value = parseFloat(str);
   4970       if (isNaN(value))
   4971         error('Invalid floating point number: ' + value);
   4972       return value;
   4973     }
   4974   };
   4975   return PostScriptLexer;
   4976 })();
   4977 
   4978 
   4979 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   4980 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   4981 
   4982 'use strict';
   4983 
   4984 var ISOAdobeCharset = [
   4985   '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
   4986   'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
   4987   'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
   4988   'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
   4989   'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
   4990   'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
   4991   'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
   4992   'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
   4993   'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
   4994   'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
   4995   'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
   4996   'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
   4997   'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
   4998   'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
   4999   'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
   5000   'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
   5001   'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
   5002   'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
   5003   'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
   5004   'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
   5005   'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
   5006   'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
   5007   'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
   5008   'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
   5009   'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
   5010   'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
   5011   'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
   5012   'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
   5013   'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
   5014   'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
   5015   'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
   5016   'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
   5017   'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
   5018   'ugrave', 'yacute', 'ydieresis', 'zcaron'
   5019 ];
   5020 
   5021 var ExpertCharset = [
   5022   '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
   5023   'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
   5024   'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
   5025   'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
   5026   'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
   5027   'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
   5028   'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
   5029   'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
   5030   'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
   5031   'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
   5032   'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
   5033   'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
   5034   'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
   5035   'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
   5036   'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
   5037   'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
   5038   'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
   5039   'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
   5040   'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
   5041   'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
   5042   'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
   5043   'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
   5044   'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
   5045   'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
   5046   'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
   5047   'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
   5048   'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
   5049   'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
   5050   'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
   5051   'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
   5052   'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
   5053   'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
   5054   'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
   5055   'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
   5056   'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
   5057   'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
   5058   'Ydieresissmall'
   5059 ];
   5060 
   5061 var ExpertSubsetCharset = [
   5062   '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
   5063   'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
   5064   'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
   5065   'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
   5066   'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
   5067   'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
   5068   'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
   5069   'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
   5070   'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
   5071   'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
   5072   'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
   5073   'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
   5074   'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
   5075   'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
   5076   'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
   5077   'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
   5078   'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
   5079   'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
   5080   'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
   5081   'periodinferior', 'commainferior'
   5082 ];
   5083 
   5084 
   5085 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   5086 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   5087 
   5088 'use strict';
   5089 
   5090 var CIDToUnicodeMaps = {
   5091   'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
   5092     {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
   5093     [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
   5094     0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
   5095     [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
   5096     [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
   5097     198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
   5098     174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
   5099     {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
   5100     {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
   5101     {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
   5102     {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
   5103     {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
   5104     {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
   5105     65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
   5106     {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
   5107     [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
   5108     8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
   5109     {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
   5110     9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
   5111     8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
   5112     {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
   5113     8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
   5114     8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
   5115     {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
   5116     {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
   5117     {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
   5118     {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
   5119     21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
   5120     28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
   5121     22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
   5122     24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
   5123     20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
   5124     26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
   5125     [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
   5126     37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
   5127     39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
   5128     32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
   5129     [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
   5130     [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
   5131     28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
   5132     21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
   5133     29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
   5134     30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
   5135     22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
   5136     28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
   5137     40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
   5138     25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
   5139     [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
   5140     29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
   5141     19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
   5142     22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
   5143     [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
   5144     33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
   5145     38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
   5146     34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
   5147     22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
   5148     39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
   5149     38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
   5150     24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
   5151     39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
   5152     25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
   5153     [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
   5154     23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
   5155     28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
   5156     36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
   5157     33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
   5158     33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
   5159     24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
   5160     24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
   5161     27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
   5162     31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
   5163     35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
   5164     39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
   5165     32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
   5166     22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
   5167     26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
   5168     27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
   5169     36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
   5170     20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
   5171     31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
   5172     21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
   5173     33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
   5174     [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
   5175     31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
   5176     23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
   5177     28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
   5178     20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
   5179     23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
   5180     29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
   5181     39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
   5182     [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
   5183     [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
   5184     33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
   5185     20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
   5186     39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
   5187     20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
   5188     31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
   5189     34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
   5190     21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
   5191     24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
   5192     31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
   5193     35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
   5194     25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
   5195     [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
   5196     20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
   5197     25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
   5198     30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
   5199     36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
   5200     24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
   5201     35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
   5202     [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
   5203     31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
   5204     38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
   5205     23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
   5206     35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
   5207     20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
   5208     22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
   5209     24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
   5210     25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
   5211     28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
   5212     32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
   5213     [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
   5214     37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
   5215     21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
   5216     21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
   5217     33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
   5218     20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
   5219     26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
   5220     21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
   5221     35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
   5222     22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
   5223     29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
   5224     21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
   5225     32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
   5226     26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
   5227     21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
   5228     38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
   5229     20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
   5230     29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
   5231     27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
   5232     [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
   5233     24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
   5234     [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
   5235     32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
   5236     35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
   5237     20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
   5238     29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
   5239     [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
   5240     31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
   5241     24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
   5242     33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
   5243     29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
   5244     20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
   5245     23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
   5246     29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
   5247     21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
   5248     23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
   5249     32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
   5250     36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
   5251     24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
   5252     22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
   5253     36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
   5254     26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
   5255     37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
   5256     32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
   5257     24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
   5258     21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
   5259     [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
   5260     25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
   5261     27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
   5262     30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
   5263     33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
   5264     37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
   5265     20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
   5266     26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
   5267     22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
   5268     35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
   5269     23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
   5270     27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
   5271     [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
   5272     36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
   5273     29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
   5274     37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
   5275     28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
   5276     29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
   5277     26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
   5278     28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
   5279     25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
   5280     [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
   5281     35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
   5282     33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
   5283     31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
   5284     20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
   5285     32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
   5286     23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
   5287     26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
   5288     33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
   5289     37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
   5290     32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
   5291     29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
   5292     35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
   5293     21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
   5294     25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
   5295     29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
   5296     33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
   5297     38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
   5298     20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
   5299     20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
   5300     23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
   5301     21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
   5302     39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
   5303     25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
   5304     36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
   5305     38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
   5306     27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
   5307     21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
   5308     36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
   5309     22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
   5310     31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
   5311     24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
   5312     24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
   5313     39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
   5314     33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
   5315     27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
   5316     29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
   5317     24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
   5318     28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
   5319     36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
   5320     25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
   5321     26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
   5322     20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
   5323     22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
   5324     20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
   5325     24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
   5326     31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
   5327     [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
   5328     37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
   5329     22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
   5330     20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
   5331     22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
   5332     36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
   5333     24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
   5334     22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
   5335     26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
   5336     31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
   5337     35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
   5338     38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
   5339     31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
   5340     28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
   5341     20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
   5342     22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
   5343     37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
   5344     37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
   5345     [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
   5346     24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
   5347     22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
   5348     24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
   5349     22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
   5350     24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
   5351     32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
   5352     30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
   5353     26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
   5354     30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
   5355     31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
   5356     39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
   5357     24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
   5358     39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
   5359     38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
   5360     27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
   5361     31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
   5362     30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
   5363     25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
   5364     30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
   5365     [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
   5366     27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
   5367     [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
   5368     31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
   5369     27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
   5370     30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
   5371     25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
   5372     22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
   5373     26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
   5374     36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
   5375     33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
   5376     21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
   5377     25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
   5378     25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
   5379     19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
   5380     38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
   5381     21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
   5382     36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
   5383     37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
   5384     24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
   5385     21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
   5386     25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
   5387     33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
   5388     40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
   5389     {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
   5390     33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
   5391     [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
   5392     27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
   5393     30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
   5394     27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
   5395     [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
   5396     24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
   5397     23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
   5398     [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
   5399     40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
   5400     37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
   5401     [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
   5402     29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
   5403     [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
   5404     24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
   5405     37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
   5406     38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
   5407     21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
   5408     26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
   5409     36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
   5410     19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
   5411     25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
   5412     31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
   5413     38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
   5414     32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
   5415     37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
   5416     21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
   5417     [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
   5418     30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
   5419     [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
   5420     20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
   5421     31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
   5422     32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
   5423     40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
   5424     20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
   5425     38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
   5426     24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
   5427     21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
   5428     24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
   5429     [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
   5430     35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
   5431     20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
   5432     24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
   5433     20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
   5434     20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
   5435     20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
   5436     20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
   5437     20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
   5438     20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
   5439     20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
   5440     20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
   5441     20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
   5442     20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
   5443     20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
   5444     20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
   5445     31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
   5446     20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
   5447     {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
   5448     20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
   5449     [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
   5450     21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
   5451     21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
   5452     36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
   5453     21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
   5454     21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
   5455     21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
   5456     21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
   5457     [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
   5458     21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
   5459     21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
   5460     21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
   5461     21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
   5462     21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
   5463     {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
   5464     21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
   5465     21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
   5466     21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
   5467     21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
   5468     22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
   5469     22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
   5470     22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
   5471     22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
   5472     22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
   5473     22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
   5474     22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
   5475     {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
   5476     22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
   5477     22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
   5478     22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
   5479     {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
   5480     22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
   5481     22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
   5482     20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
   5483     23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
   5484     {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
   5485     23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
   5486     23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
   5487     {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
   5488     [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
   5489     23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
   5490     {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
   5491     [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
   5492     23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
   5493     23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
   5494     23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
   5495     23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
   5496     23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
   5497     23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
   5498     [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
   5499     {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
   5500     24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
   5501     [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
   5502     24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
   5503     24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
   5504     24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
   5505     24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
   5506     [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
   5507     24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
   5508     24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
   5509     24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
   5510     24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
   5511     24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
   5512     24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
   5513     24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
   5514     24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
   5515     {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
   5516     24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
   5517     24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
   5518     25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
   5519     25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
   5520     25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
   5521     25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
   5522     {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
   5523     25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
   5524     25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
   5525     25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
   5526     25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
   5527     25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
   5528     25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
   5529     25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
   5530     25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
   5531     25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
   5532     {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
   5533     25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
   5534     [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
   5535     25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
   5536     26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
   5537     [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
   5538     {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
   5539     26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
   5540     26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
   5541     26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
   5542     26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
   5543     26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
   5544     26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
   5545     26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
   5546     26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
   5547     26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
   5548     26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
   5549     26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
   5550     26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
   5551     26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
   5552     26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
   5553     26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
   5554     27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
   5555     27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
   5556     27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
   5557     27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
   5558     27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
   5559     27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
   5560     27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
   5561     27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
   5562     27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
   5563     27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
   5564     27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
   5565     [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
   5566     27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
   5567     27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
   5568     27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
   5569     27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
   5570     27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
   5571     27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
   5572     28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
   5573     28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
   5574     28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
   5575     28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
   5576     28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
   5577     28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
   5578     28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
   5579     28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
   5580     28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
   5581     28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
   5582     28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
   5583     28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
   5584     28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
   5585     28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
   5586     29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
   5587     29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
   5588     29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
   5589     29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
   5590     29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
   5591     29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
   5592     {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
   5593     29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
   5594     29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
   5595     29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
   5596     29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
   5597     29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
   5598     29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
   5599     29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
   5600     29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
   5601     30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
   5602     30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
   5603     30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
   5604     30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
   5605     30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
   5606     30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
   5607     {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
   5608     30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
   5609     30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
   5610     30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
   5611     {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
   5612     30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
   5613     30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
   5614     30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
   5615     30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
   5616     30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
   5617     30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
   5618     31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
   5619     31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
   5620     31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
   5621     31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
   5622     31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
   5623     31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
   5624     31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
   5625     31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
   5626     31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
   5627     31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
   5628     31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
   5629     31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
   5630     31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
   5631     31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
   5632     31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
   5633     31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
   5634     31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
   5635     31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
   5636     32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
   5637     32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
   5638     32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
   5639     32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
   5640     32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
   5641     32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
   5642     32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
   5643     32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
   5644     {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
   5645     {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
   5646     [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
   5647     32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
   5648     32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
   5649     {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
   5650     39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
   5651     32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
   5652     32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
   5653     32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
   5654     32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
   5655     33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
   5656     33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
   5657     33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
   5658     33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
   5659     33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
   5660     33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
   5661     33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
   5662     {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
   5663     33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
   5664     33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
   5665     33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
   5666     33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
   5667     33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
   5668     33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
   5669     33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
   5670     33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
   5671     33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
   5672     33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
   5673     34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
   5674     34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
   5675     34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
   5676     34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
   5677     34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
   5678     34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
   5679     34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
   5680     34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
   5681     34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
   5682     34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
   5683     34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
   5684     34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
   5685     34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
   5686     34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
   5687     34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
   5688     34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
   5689     34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
   5690     34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
   5691     35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
   5692     35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
   5693     35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
   5694     35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
   5695     35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
   5696     {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
   5697     35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
   5698     35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
   5699     35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
   5700     35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
   5701     35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
   5702     35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
   5703     35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
   5704     35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
   5705     [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
   5706     35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
   5707     {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
   5708     {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
   5709     40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
   5710     36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
   5711     {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
   5712     {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
   5713     36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
   5714     36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
   5715     36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
   5716     36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
   5717     36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
   5718     36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
   5719     36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
   5720     36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
   5721     36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
   5722     36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
   5723     36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
   5724     37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
   5725     37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
   5726     37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
   5727     37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
   5728     37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
   5729     37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
   5730     37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
   5731     37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
   5732     37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
   5733     37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
   5734     37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
   5735     37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
   5736     37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
   5737     38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
   5738     38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
   5739     38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
   5740     {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
   5741     38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
   5742     {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
   5743     38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
   5744     38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
   5745     38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
   5746     38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
   5747     38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
   5748     {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
   5749     [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
   5750     38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
   5751     39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
   5752     39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
   5753     39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
   5754     {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
   5755     39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
   5756     {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
   5757     39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
   5758     39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
   5759     39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
   5760     {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
   5761     39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
   5762     {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
   5763     39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
   5764     {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
   5765     39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
   5766     39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
   5767     39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
   5768     39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
   5769     40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
   5770     40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
   5771     {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
   5772     40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
   5773     40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
   5774     40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
   5775     {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
   5776     40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
   5777     40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
   5778     {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
   5779     40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
   5780     {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
   5781     40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
   5782     {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
   5783     13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
   5784     {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
   5785     13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
   5786     8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
   5787     0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
   5788     194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
   5789     0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
   5790     {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
   5791     64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
   5792     39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
   5793     28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
   5794     63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
   5795     {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
   5796     194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
   5797     {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
   5798     {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
   5799     {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
   5800     65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
   5801     9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
   5802     13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
   5803     13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
   5804     13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
   5805     {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
   5806     {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
   5807     12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
   5808     12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
   5809     12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
   5810     13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
   5811     8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
   5812     9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
   5813     9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
   5814     9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
   5815     9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
   5816     20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
   5817     8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
   5818     12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
   5819     37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
   5820     [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
   5821     20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
   5822     20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
   5823     21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
   5824     21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
   5825     64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
   5826     23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
   5827     23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
   5828     24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
   5829     24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
   5830     26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
   5831     26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
   5832     64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
   5833     27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
   5834     28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
   5835     28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
   5836     28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
   5837     29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
   5838     29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
   5839     30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
   5840     31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
   5841     31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
   5842     33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
   5843     64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
   5844     35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
   5845     64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
   5846     37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
   5847     37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
   5848     37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
   5849     37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
   5850     37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
   5851     38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
   5852     {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
   5853     39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
   5854     8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
   5855     298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
   5856     {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
   5857     467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
   5858     8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
   5859     331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
   5860     {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
   5861     {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
   5862     {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
   5863     12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
   5864     {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
   5865     0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
   5866     {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
   5867     13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
   5868     {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
   5869     {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
   5870     13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
   5871     {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
   5872     {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
   5873     {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
   5874     {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
   5875     {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
   5876     {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
   5877     9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
   5878     {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
   5879     8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
   5880     9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
   5881     {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
   5882     64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
   5883     64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
   5884     64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
   5885     64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
   5886     24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
   5887     64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
   5888     64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
   5889     37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
   5890     37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
   5891     11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
   5892     171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
   5893     11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
   5894     23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
   5895     29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
   5896     0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
   5897     {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
   5898     [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
   5899     131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
   5900     {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
   5901     [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
   5902     {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
   5903     194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
   5904     20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
   5905     13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
   5906     0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
   5907     63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
   5908     194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
   5909     23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
   5910     26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
   5911     {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
   5912     30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
   5913     11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
   5914     [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
   5915     34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
   5916     0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
   5917     {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
   5918     19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
   5919     20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
   5920     20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
   5921     20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
   5922     20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
   5923     20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
   5924     [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
   5925     {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
   5926     21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
   5927     21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
   5928     21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
   5929     22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
   5930     22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
   5931     22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
   5932     22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
   5933     22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
   5934     23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
   5935     23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
   5936     {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
   5937     23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
   5938     23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
   5939     24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
   5940     24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
   5941     [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
   5942     [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
   5943     24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
   5944     24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
   5945     25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
   5946     25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
   5947     25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
   5948     {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
   5949     25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
   5950     26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
   5951     26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
   5952     26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
   5953     26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
   5954     26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
   5955     27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
   5956     27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
   5957     27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
   5958     [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
   5959     27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
   5960     27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
   5961     28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
   5962     28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
   5963     28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
   5964     [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
   5965     28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
   5966     29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
   5967     29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
   5968     29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
   5969     29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
   5970     29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
   5971     29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
   5972     29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
   5973     29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
   5974     [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
   5975     30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
   5976     30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
   5977     {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
   5978     30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
   5979     30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
   5980     31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
   5981     31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
   5982     31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
   5983     31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
   5984     31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
   5985     31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
   5986     31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
   5987     32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
   5988     32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
   5989     32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
   5990     32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
   5991     32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
   5992     32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
   5993     33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
   5994     33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
   5995     33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
   5996     33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
   5997     34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
   5998     34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
   5999     34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
   6000     34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
   6001     [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
   6002     {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
   6003     35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
   6004     35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
   6005     35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
   6006     36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
   6007     36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
   6008     36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
   6009     36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
   6010     37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
   6011     37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
   6012     37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
   6013     {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
   6014     37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
   6015     37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
   6016     38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
   6017     38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
   6018     38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
   6019     38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
   6020     39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
   6021     39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
   6022     {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
   6023     39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
   6024     39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
   6025     40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
   6026     40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
   6027     40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
   6028     40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
   6029     40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
   6030     28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
   6031     20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
   6032     29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
   6033     0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
   6034     13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
   6035     {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
   6036     {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
   6037     {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
   6038     474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
   6039     351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
   6040     344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
   6041     369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
   6042     625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
   6043     626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
   6044     608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
   6045     673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
   6046     0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
   6047     820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
   6048     {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
   6049     704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
   6050     {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
   6051     {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
   6052     {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
   6053     9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
   6054     {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
   6055     {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
   6056     20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
   6057     20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
   6058     21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
   6059     22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
   6060     22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
   6061     23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
   6062     138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
   6063     24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
   6064     24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
   6065     25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
   6066     26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
   6067     26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
   6068     144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
   6069     27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
   6070     27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
   6071     27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
   6072     28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
   6073     28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
   6074     29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
   6075     29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
   6076     30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
   6077     30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
   6078     152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
   6079     31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
   6080     31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
   6081     31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
   6082     32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
   6083     {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
   6084     33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
   6085     33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
   6086     33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
   6087     34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
   6088     34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
   6089     34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
   6090     35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
   6091     36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
   6092     36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
   6093     {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
   6094     37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
   6095     37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
   6096     18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
   6097     38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
   6098     39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
   6099     39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
   6100     40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
   6101     40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
   6102     13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
   6103     20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
   6104     20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
   6105     20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
   6106     131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
   6107     131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
   6108     20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
   6109     21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
   6110     133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
   6111     133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
   6112     {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
   6113     21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
   6114     21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
   6115     13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
   6116     21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
   6117     135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
   6118     22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
   6119     22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
   6120     22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
   6121     22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
   6122     22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
   6123     136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
   6124     22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
   6125     {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
   6126     158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
   6127     22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
   6128     23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
   6129     23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
   6130     23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
   6131     {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
   6132     23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
   6133     138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
   6134     23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
   6135     23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
   6136     23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
   6137     24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
   6138     {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
   6139     24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
   6140     24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
   6141     24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
   6142     24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
   6143     141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
   6144     141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
   6145     142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
   6146     {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
   6147     25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
   6148     {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
   6149     25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
   6150     25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
   6151     25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
   6152     26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
   6153     143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
   6154     26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
   6155     144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
   6156     26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
   6157     26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
   6158     26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
   6159     26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
   6160     26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
   6161     {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
   6162     26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
   6163     27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
   6164     27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
   6165     27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
   6166     27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
   6167     145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
   6168     27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
   6169     {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
   6170     27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
   6171     27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
   6172     {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
   6173     {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
   6174     146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
   6175     28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
   6176     {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
   6177     28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
   6178     28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
   6179     15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
   6180     28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
   6181     28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
   6182     28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
   6183     29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
   6184     29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
   6185     29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
   6186     29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
   6187     29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
   6188     29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
   6189     29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
   6190     150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
   6191     29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
   6192     150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
   6193     {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
   6194     {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
   6195     30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
   6196     {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
   6197     151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
   6198     30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
   6199     151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
   6200     30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
   6201     30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
   6202     30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
   6203     30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
   6204     31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
   6205     16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
   6206     31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
   6207     31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
   6208     31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
   6209     31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
   6210     31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
   6211     31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
   6212     155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
   6213     155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
   6214     155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
   6215     32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
   6216     32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
   6217     32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
   6218     32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
   6219     {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
   6220     32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
   6221     32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
   6222     157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
   6223     17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
   6224     33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
   6225     157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
   6226     33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
   6227     158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
   6228     33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
   6229     33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
   6230     {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
   6231     33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
   6232     33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
   6233     17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
   6234     34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
   6235     {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
   6236     34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
   6237     34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
   6238     160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
   6239     {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
   6240     34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
   6241     34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
   6242     160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
   6243     34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
   6244     34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
   6245     34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
   6246     35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
   6247     35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
   6248     35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
   6249     35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
   6250     35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
   6251     162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
   6252     35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
   6253     36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
   6254     {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
   6255     36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
   6256     36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
   6257     64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
   6258     165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
   6259     37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
   6260     37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
   6261     {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
   6262     {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
   6263     37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
   6264     37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
   6265     {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
   6266     166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
   6267     37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
   6268     37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
   6269     37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
   6270     167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
   6271     167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
   6272     38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
   6273     38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
   6274     38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
   6275     169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
   6276     39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
   6277     {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
   6278     {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
   6279     39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
   6280     39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
   6281     39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
   6282     39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
   6283     39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
   6284     {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
   6285     39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
   6286     {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
   6287     171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
   6288     {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
   6289     40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
   6290     40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
   6291     40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
   6292     40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
   6293     40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
   6294     40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
   6295     40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
   6296     19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
   6297     20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
   6298     20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
   6299     {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
   6300     20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
   6301     {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
   6302     21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
   6303     21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
   6304     21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
   6305     21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
   6306     21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
   6307     21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
   6308     22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
   6309     22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
   6310     22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
   6311     22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
   6312     22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
   6313     22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
   6314     23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
   6315     23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
   6316     23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
   6317     24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
   6318     24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
   6319     24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
   6320     25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
   6321     25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
   6322     25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
   6323     {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
   6324     25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
   6325     25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
   6326     26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
   6327     26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
   6328     26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
   6329     27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
   6330     27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
   6331     27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
   6332     28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
   6333     {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
   6334     28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
   6335     29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
   6336     29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
   6337     29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
   6338     30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
   6339     30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
   6340     30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
   6341     30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
   6342     {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
   6343     30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
   6344     30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
   6345     31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
   6346     31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
   6347     31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
   6348     {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
   6349     32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
   6350     32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
   6351     32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
   6352     {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
   6353     33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
   6354     33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
   6355     33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
   6356     33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
   6357     33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
   6358     34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
   6359     34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
   6360     34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
   6361     34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
   6362     35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
   6363     35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
   6364     35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
   6365     35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
   6366     36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
   6367     36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
   6368     36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
   6369     36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
   6370     36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
   6371     36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
   6372     36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
   6373     37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
   6374     37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
   6375     {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
   6376     37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
   6377     37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
   6378     38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
   6379     38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
   6380     38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
   6381     38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
   6382     39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
   6383     39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
   6384     39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
   6385     39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
   6386     40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
   6387     40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
   6388     {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
   6389     151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
   6390     {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
   6391     {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
   6392     0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
   6393     15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
   6394     162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
   6395     63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
   6396     38315, 38741, 171581, 173594],
   6397   'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
   6398     {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
   6399     8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
   6400     {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
   6401     {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
   6402     8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
   6403     9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
   6404     {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
   6405     {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
   6406     {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
   6407     730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
   6408     9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
   6409     9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
   6410     9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
   6411     8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
   6412     13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
   6413     {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
   6414     {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
   6415     9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
   6416     9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
   6417     9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
   6418     9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
   6419     {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
   6420     {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
   6421     {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
   6422     13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
   6423     {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
   6424     8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
   6425     13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
   6426     198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
   6427     {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
   6428     {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
   6429     312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
   6430     {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
   6431     {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
   6432     1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
   6433     {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
   6434     {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
   6435     44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
   6436     44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
   6437     {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
   6438     {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
   6439     44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
   6440     44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
   6441     44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
   6442     {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
   6443     44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
   6444     {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
   6445     {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
   6446     {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
   6447     44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
   6448     44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
   6449     {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
   6450     44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
   6451     44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
   6452     {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
   6453     {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
   6454     {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
   6455     {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
   6456     {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
   6457     {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
   6458     {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
   6459     {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
   6460     45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
   6461     45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
   6462     45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
   6463     {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
   6464     {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
   6465     {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
   6466     {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
   6467     {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
   6468     {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
   6469     {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
   6470     45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
   6471     45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
   6472     45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
   6473     {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
   6474     45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
   6475     {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
   6476     {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
   6477     {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
   6478     45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
   6479     {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
   6480     {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
   6481     {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
   6482     {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
   6483     45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
   6484     {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
   6485     46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
   6486     {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
   6487     {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
   6488     46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
   6489     {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
   6490     46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
   6491     {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
   6492     {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
   6493     {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
   6494     {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
   6495     {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
   6496     46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
   6497     46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
   6498     {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
   6499     {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
   6500     46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
   6501     46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
   6502     {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
   6503     {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
   6504     {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
   6505     {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
   6506     47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
   6507     47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
   6508     {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
   6509     {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
   6510     47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
   6511     {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
   6512     {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
   6513     {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
   6514     47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
   6515     {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
   6516     {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
   6517     47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
   6518     47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
   6519     47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
   6520     47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
   6521     {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
   6522     47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
   6523     {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
   6524     47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
   6525     48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
   6526     {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
   6527     {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
   6528     {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
   6529     {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
   6530     48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
   6531     {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
   6532     48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
   6533     {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
   6534     48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
   6535     {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
   6536     {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
   6537     48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
   6538     48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
   6539     {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
   6540     {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
   6541     {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
   6542     {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
   6543     {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
   6544     {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
   6545     {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
   6546     49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
   6547     {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
   6548     49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
   6549     {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
   6550     {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
   6551     {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
   6552     {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
   6553     {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
   6554     {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
   6555     {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
   6556     49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
   6557     49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
   6558     49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
   6559     {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
   6560     {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
   6561     {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
   6562     49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
   6563     49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
   6564     49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
   6565     49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
   6566     {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
   6567     {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
   6568     50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
   6569     {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
   6570     {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
   6571     {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
   6572     50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
   6573     50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
   6574     {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
   6575     {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
   6576     {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
   6577     {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
   6578     {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
   6579     50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
   6580     {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
   6581     {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
   6582     {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
   6583     {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
   6584     {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
   6585     {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
   6586     {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
   6587     50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
   6588     {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
   6589     {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
   6590     {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
   6591     {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
   6592     50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
   6593     50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
   6594     51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
   6595     51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
   6596     {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
   6597     {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
   6598     {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
   6599     51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
   6600     {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
   6601     {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
   6602     {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
   6603     {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
   6604     51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
   6605     {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
   6606     {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
   6607     51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
   6608     51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
   6609     {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
   6610     51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
   6611     {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
   6612     {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
   6613     {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
   6614     {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
   6615     {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
   6616     {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
   6617     {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
   6618     52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
   6619     {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
   6620     {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
   6621     {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
   6622     52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
   6623     {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
   6624     {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
   6625     {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
   6626     52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
   6627     52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
   6628     52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
   6629     52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
   6630     52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
   6631     {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
   6632     52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
   6633     {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
   6634     {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
   6635     {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
   6636     53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
   6637     {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
   6638     {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
   6639     53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
   6640     53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
   6641     {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
   6642     {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
   6643     53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
   6644     {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
   6645     53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
   6646     {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
   6647     {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
   6648     53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
   6649     {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
   6650     53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
   6651     53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
   6652     {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
   6653     {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
   6654     53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
   6655     {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
   6656     {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
   6657     {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
   6658     54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
   6659     54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
   6660     {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
   6661     {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
   6662     54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
   6663     54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
   6664     54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
   6665     54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
   6666     {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
   6667     {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
   6668     {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
   6669     54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
   6670     54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
   6671     {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
   6672     54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
   6673     {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
   6674     54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
   6675     54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
   6676     {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
   6677     55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
   6678     {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
   6679     {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
   6680     55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
   6681     55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
   6682     {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
   6683     21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
   6684     29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
   6685     36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
   6686     29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
   6687     23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
   6688     30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
   6689     35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
   6690     34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
   6691     26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
   6692     {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
   6693     22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
   6694     30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
   6695     37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
   6696     24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
   6697     33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
   6698     21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
   6699     36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
   6700     24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
   6701     26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
   6702     24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
   6703     35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
   6704     [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
   6705     32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
   6706     20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
   6707     24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
   6708     28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
   6709     32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
   6710     38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
   6711     23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
   6712     31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
   6713     21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
   6714     25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
   6715     32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
   6716     35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
   6717     26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
   6718     26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
   6719     20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
   6720     25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
   6721     [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
   6722     36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
   6723     23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
   6724     35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
   6725     21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
   6726     37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
   6727     25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
   6728     21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
   6729     30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
   6730     39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
   6731     [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
   6732     24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
   6733     27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
   6734     32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
   6735     36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
   6736     [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
   6737     21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
   6738     23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
   6739     21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
   6740     36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
   6741     36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
   6742     31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
   6743     30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
   6744     26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
   6745     29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
   6746     25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
   6747     37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
   6748     30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
   6749     22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
   6750     24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
   6751     27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
   6752     30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
   6753     32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
   6754     37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
   6755     21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
   6756     [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
   6757     25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
   6758     20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
   6759     [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
   6760     25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
   6761     [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
   6762     [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
   6763     [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
   6764     [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
   6765     27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
   6766     37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
   6767     26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
   6768     35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
   6769     22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
   6770     20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
   6771     25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
   6772     24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
   6773     23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
   6774     26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
   6775     31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
   6776     37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
   6777     31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
   6778     28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
   6779     21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
   6780     31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
   6781     31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
   6782     36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
   6783     37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
   6784     [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
   6785     [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
   6786     [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
   6787     [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
   6788     [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
   6789     27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
   6790     [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
   6791     [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
   6792     [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
   6793     [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
   6794     [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
   6795     [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
   6796     [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
   6797     [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
   6798     [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
   6799     [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
   6800     [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
   6801     [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
   6802     [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
   6803     [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
   6804     [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
   6805     28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
   6806     [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
   6807     31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
   6808     [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
   6809     28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
   6810     25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
   6811     [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
   6812     [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
   6813     [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
   6814     [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
   6815     [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
   6816     [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
   6817     [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
   6818     [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
   6819     [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
   6820     [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
   6821     [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
   6822     [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
   6823     [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
   6824     [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
   6825     [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
   6826     [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
   6827     32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
   6828     [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
   6829     [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
   6830     [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
   6831     [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
   6832     [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
   6833     [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
   6834     [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
   6835     [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
   6836     [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
   6837     38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
   6838     29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
   6839     24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
   6840     24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
   6841     34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
   6842     38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
   6843     33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
   6844     27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
   6845     39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
   6846     35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
   6847     [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
   6848     26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
   6849     40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
   6850     26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
   6851     [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
   6852     27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
   6853     26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
   6854     29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
   6855     25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
   6856     32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
   6857     20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
   6858     34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
   6859     23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
   6860     [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
   6861     24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
   6862     38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
   6863     27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
   6864     36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
   6865     26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
   6866     [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
   6867     25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
   6868     20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
   6869     [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
   6870     33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
   6871     20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
   6872     32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
   6873     20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
   6874     29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
   6875     38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
   6876     27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
   6877     34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
   6878     30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
   6879     26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
   6880     20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
   6881     29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
   6882     [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
   6883     35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
   6884     22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
   6885     34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
   6886     21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
   6887     24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
   6888     [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
   6889     36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
   6890     40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
   6891     24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
   6892     36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
   6893     32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
   6894     24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
   6895     {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
   6896     32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
   6897     36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
   6898     24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
   6899     36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
   6900     20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
   6901     [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
   6902     24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
   6903     28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
   6904     32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
   6905     36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
   6906     21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
   6907     37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
   6908     26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
   6909     20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
   6910     24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
   6911     [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
   6912     36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
   6913     [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
   6914     24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
   6915     26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
   6916     34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
   6917     [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
   6918     28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
   6919     21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
   6920     29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
   6921     34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
   6922     23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
   6923     [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
   6924     36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
   6925     24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
   6926     32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
   6927     31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
   6928     24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
   6929     28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
   6930     32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
   6931     39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
   6932     23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
   6933     24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
   6934     37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
   6935     23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
   6936     25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
   6937     29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
   6938     32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
   6939     35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
   6940     {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
   6941     22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
   6942     33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
   6943     27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
   6944     34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
   6945     36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
   6946     [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
   6947     25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
   6948     [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
   6949     26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
   6950     35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
   6951     24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
   6952     36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
   6953     24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
   6954     33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
   6955     22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
   6956     28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
   6957     [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
   6958     [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
   6959     40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
   6960     [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
   6961     23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
   6962     26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
   6963     33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
   6964     27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
   6965     30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
   6966     38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
   6967     25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
   6968     33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
   6969     26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
   6970     [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
   6971     28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
   6972     25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
   6973     23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
   6974     20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
   6975     33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
   6976     32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
   6977     25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
   6978     28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
   6979     36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
   6980     28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
   6981     [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
   6982     27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
   6983     29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
   6984     20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
   6985     34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
   6986     20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
   6987     23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
   6988     28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
   6989     29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
   6990     20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
   6991     28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
   6992     23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
   6993     32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
   6994     24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
   6995     23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
   6996     23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
   6997     31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
   6998     36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
   6999     20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
   7000     28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
   7001     37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
   7002     23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
   7003     30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
   7004     36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
   7005     26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
   7006     28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
   7007     39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
   7008     23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
   7009     29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
   7010     [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
   7011     23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
   7012     33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
   7013     20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
   7014     24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
   7015     {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
   7016     30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
   7017     36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
   7018     [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
   7019     37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
   7020     24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
   7021     38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
   7022     33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
   7023     27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
   7024     35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
   7025     24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
   7026     [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
   7027     28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
   7028     21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
   7029     33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
   7030     [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
   7031     24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
   7032     33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
   7033     23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
   7034     30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
   7035     38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
   7036     33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
   7037     26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
   7038     22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
   7039     27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
   7040     33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
   7041     [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
   7042     26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
   7043     29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
   7044     25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
   7045     32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
   7046     38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
   7047     30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
   7048     [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
   7049     20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
   7050     24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
   7051     [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
   7052     35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
   7053     39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
   7054     21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
   7055     25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
   7056     24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
   7057     26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
   7058     28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
   7059     31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
   7060     37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
   7061     21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
   7062     33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
   7063     [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
   7064     25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
   7065     28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
   7066     31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
   7067     35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
   7068     26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
   7069     20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
   7070     32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
   7071     24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
   7072     21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
   7073     27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
   7074     32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
   7075     36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
   7076     20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
   7077     30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
   7078     34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
   7079     25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
   7080     21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
   7081     26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
   7082     31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
   7083     35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
   7084     21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
   7085     28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
   7086     32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
   7087     [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
   7088     23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
   7089     36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
   7090     38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
   7091     24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
   7092     25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
   7093     29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
   7094     39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
   7095     22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
   7096     21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
   7097     27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
   7098     20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
   7099     37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
   7100     20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
   7101     30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
   7102     25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
   7103     36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
   7104     28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
   7105     30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
   7106     30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
   7107     35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
   7108     36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
   7109     26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
   7110     32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
   7111     37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
   7112     26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
   7113     34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
   7114     27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
   7115     37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
   7116     30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
   7117     36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
   7118     34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
   7119     23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
   7120     40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
   7121     23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
   7122     31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
   7123     [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
   7124     23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
   7125     31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
   7126     25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
   7127     22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
   7128     37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
   7129     35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
   7130     23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
   7131     27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
   7132     25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
   7133     31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
   7134     22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
   7135     24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
   7136     32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
   7137     36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
   7138     25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
   7139     28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
   7140     31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
   7141     33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
   7142     38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
   7143     24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
   7144     33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
   7145     [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
   7146     27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
   7147     31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
   7148     [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
   7149     29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
   7150     20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
   7151     36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
   7152     24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
   7153     38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
   7154     28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
   7155     38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
   7156     26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
   7157     21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
   7158     35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
   7159     26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
   7160     38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
   7161     27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
   7162     [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
   7163     [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
   7164     34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
   7165     [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
   7166     33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
   7167     27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
   7168     34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
   7169     26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
   7170     22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
   7171     28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
   7172     29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
   7173     34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
   7174     23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
   7175     24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
   7176     21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
   7177     33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
   7178     20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
   7179     28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
   7180     29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
   7181     {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
   7182     31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
   7183     24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
   7184     28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
   7185     23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
   7186     28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
   7187     21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
   7188     21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
   7189     [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
   7190     24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
   7191     28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
   7192     33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
   7193     35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
   7194     20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
   7195     25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
   7196     35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
   7197     {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
   7198     {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
   7199     {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
   7200     8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
   7201     8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
   7202     0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
   7203     {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
   7204     {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
   7205     8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
   7206     0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
   7207     {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
   7208     9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
   7209     {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
   7210     8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
   7211     {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
   7212     8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
   7213     {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
   7214     0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
   7215     {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
   7216     {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
   7217     44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
   7218     {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
   7219     {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
   7220     {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
   7221     {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
   7222     {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
   7223     44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
   7224     {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
   7225     {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
   7226     {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
   7227     {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
   7228     44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
   7229     {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
   7230     {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
   7231     {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
   7232     {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
   7233     {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
   7234     {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
   7235     {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
   7236     {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
   7237     {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
   7238     44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
   7239     {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
   7240     {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
   7241     {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
   7242     {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
   7243     {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
   7244     {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
   7245     {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
   7246     {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
   7247     {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
   7248     {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
   7249     {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
   7250     {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
   7251     {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
   7252     {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
   7253     {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
   7254     {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
   7255     {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
   7256     {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
   7257     {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
   7258     {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
   7259     45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
   7260     {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
   7261     {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
   7262     {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
   7263     {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
   7264     {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
   7265     {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
   7266     {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
   7267     {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
   7268     {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
   7269     45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
   7270     {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
   7271     {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
   7272     {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
   7273     45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
   7274     {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
   7275     {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
   7276     {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
   7277     {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
   7278     {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
   7279     {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
   7280     {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
   7281     {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
   7282     {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
   7283     {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
   7284     46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
   7285     {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
   7286     {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
   7287     {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
   7288     46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
   7289     {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
   7290     {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
   7291     {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
   7292     {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
   7293     {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
   7294     {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
   7295     {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
   7296     {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
   7297     {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
   7298     {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
   7299     {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
   7300     {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
   7301     {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
   7302     {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
   7303     {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
   7304     {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
   7305     {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
   7306     {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
   7307     {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
   7308     {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
   7309     {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
   7310     {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
   7311     47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
   7312     {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
   7313     47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
   7314     {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
   7315     {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
   7316     {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
   7317     {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
   7318     {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
   7319     {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
   7320     47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
   7321     {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
   7322     {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
   7323     {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
   7324     {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
   7325     {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
   7326     47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
   7327     {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
   7328     {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
   7329     {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
   7330     {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
   7331     {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
   7332     {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
   7333     47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
   7334     {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
   7335     {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
   7336     {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
   7337     {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
   7338     {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
   7339     {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
   7340     {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
   7341     {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
   7342     {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
   7343     {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
   7344     {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
   7345     {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
   7346     {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
   7347     {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
   7348     {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
   7349     {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
   7350     {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
   7351     {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
   7352     {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
   7353     {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
   7354     {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
   7355     48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
   7356     {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
   7357     {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
   7358     {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
   7359     {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
   7360     {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
   7361     {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
   7362     {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
   7363     {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
   7364     {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
   7365     {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
   7366     {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
   7367     {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
   7368     {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
   7369     {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
   7370     {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
   7371     {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
   7372     {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
   7373     {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
   7374     {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
   7375     {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
   7376     {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
   7377     {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
   7378     {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
   7379     49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
   7380     49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
   7381     {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
   7382     {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
   7383     {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
   7384     {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
   7385     {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
   7386     {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
   7387     {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
   7388     {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
   7389     {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
   7390     49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
   7391     {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
   7392     {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
   7393     {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
   7394     {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
   7395     49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
   7396     {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
   7397     {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
   7398     {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
   7399     {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
   7400     {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
   7401     {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
   7402     {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
   7403     49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
   7404     {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
   7405     {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
   7406     {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
   7407     {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
   7408     {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
   7409     {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
   7410     {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
   7411     {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
   7412     {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
   7413     {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
   7414     {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
   7415     {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
   7416     50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
   7417     {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
   7418     {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
   7419     {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
   7420     {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
   7421     {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
   7422     {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
   7423     {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
   7424     50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
   7425     {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
   7426     {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
   7427     {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
   7428     {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
   7429     {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
   7430     {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
   7431     {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
   7432     {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
   7433     50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
   7434     {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
   7435     {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
   7436     {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
   7437     {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
   7438     {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
   7439     {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
   7440     {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
   7441     {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
   7442     {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
   7443     {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
   7444     51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
   7445     {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
   7446     {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
   7447     {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
   7448     {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
   7449     {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
   7450     {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
   7451     51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
   7452     {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
   7453     {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
   7454     {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
   7455     {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
   7456     {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
   7457     {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
   7458     {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
   7459     {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
   7460     {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
   7461     {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
   7462     {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
   7463     {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
   7464     {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
   7465     51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
   7466     {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
   7467     {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
   7468     {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
   7469     {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
   7470     {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
   7471     51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
   7472     {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
   7473     {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
   7474     {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
   7475     {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
   7476     {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
   7477     {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
   7478     {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
   7479     {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
   7480     {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
   7481     {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
   7482     {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
   7483     52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
   7484     {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
   7485     {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
   7486     {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
   7487     52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
   7488     {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
   7489     {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
   7490     {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
   7491     52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
   7492     {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
   7493     {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
   7494     {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
   7495     {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
   7496     {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
   7497     52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
   7498     {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
   7499     {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
   7500     {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
   7501     {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
   7502     {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
   7503     {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
   7504     {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
   7505     {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
   7506     {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
   7507     {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
   7508     {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
   7509     53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
   7510     {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
   7511     {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
   7512     {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
   7513     {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
   7514     {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
   7515     {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
   7516     {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
   7517     {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
   7518     {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
   7519     {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
   7520     {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
   7521     {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
   7522     {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
   7523     {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
   7524     {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
   7525     53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
   7526     {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
   7527     {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
   7528     {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
   7529     {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
   7530     {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
   7531     {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
   7532     {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
   7533     {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
   7534     {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
   7535     {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
   7536     54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
   7537     {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
   7538     {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
   7539     {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
   7540     {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
   7541     54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
   7542     {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
   7543     {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
   7544     {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
   7545     {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
   7546     {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
   7547     {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
   7548     {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
   7549     54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
   7550     {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
   7551     {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
   7552     {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
   7553     54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
   7554     {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
   7555     {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
   7556     {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
   7557     {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
   7558     {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
   7559     {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
   7560     {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
   7561     {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
   7562     {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
   7563     {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
   7564     {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
   7565     54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
   7566     {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
   7567     {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
   7568     55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
   7569     {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
   7570     {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
   7571     {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
   7572     {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
   7573     55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
   7574     55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
   7575     {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
   7576     {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
   7577     {f: 6, c: 55198}],
   7578   'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
   7579     8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
   7580     183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
   7581     {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
   7582     {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
   7583     {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
   7584     {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
   7585     {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
   7586     65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
   7587     9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
   7588     {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
   7589     65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
   7590     8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
   7591     8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
   7592     9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
   7593     0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
   7594     8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
   7595     {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
   7596     [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
   7597     [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
   7598     9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
   7599     9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
   7600     9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
   7601     {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
   7602     {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
   7603     {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
   7604     [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
   7605     [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
   7606     [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
   7607     [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
   7608     [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
   7609     [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
   7610     [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
   7611     [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
   7612     [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
   7613     [12057, 21353, 63192], [12059, 21430, 63193],
   7614     [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
   7615     [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
   7616     [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
   7617     [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
   7618     [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
   7619     9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
   7620     [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
   7621     [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
   7622     [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
   7623     19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
   7624     20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
   7625     [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
   7626     [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
   7627     [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
   7628     [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
   7629     [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
   7630     19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
   7631     20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
   7632     {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
   7633     20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
   7634     21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
   7635     22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
   7636     24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
   7637     [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
   7638     [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
   7639     [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
   7640     [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
   7641     [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
   7642     [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
   7643     [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
   7644     20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
   7645     {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
   7646     {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
   7647     21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
   7648     21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
   7649     21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
   7650     22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
   7651     24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
   7652     {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
   7653     {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
   7654     27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
   7655     [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
   7656     [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
   7657     [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
   7658     [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
   7659     [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
   7660     20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
   7661     {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
   7662     20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
   7663     {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
   7664     {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
   7665     21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
   7666     22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
   7667     {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
   7668     {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
   7669     24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
   7670     {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
   7671     {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
   7672     27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
   7673     27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
   7674     [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
   7675     [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
   7676     [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
   7677     {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
   7678     [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
   7679     [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
   7680     [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
   7681     20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
   7682     20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
   7683     20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
   7684     {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
   7685     {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
   7686     21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
   7687     21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
   7688     21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
   7689     22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
   7690     22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
   7691     22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
   7692     {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
   7693     24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
   7694     24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
   7695     25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
   7696     25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
   7697     25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
   7698     26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
   7699     27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
   7700     27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
   7701     27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
   7702     28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
   7703     {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
   7704     32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
   7705     33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
   7706     [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
   7707     [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
   7708     [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
   7709     24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
   7710     [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
   7711     20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
   7712     20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
   7713     20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
   7714     20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
   7715     21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
   7716     21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
   7717     21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
   7718     21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
   7719     22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
   7720     {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
   7721     22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
   7722     23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
   7723     23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
   7724     24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
   7725     {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
   7726     24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
   7727     24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
   7728     25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
   7729     25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
   7730     [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
   7731     {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
   7732     26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
   7733     26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
   7734     26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
   7735     26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
   7736     27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
   7737     27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
   7738     27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
   7739     27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
   7740     29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
   7741     29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
   7742     30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
   7743     31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
   7744     32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
   7745     33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
   7746     33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
   7747     34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
   7748     [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
   7749     38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
   7750     [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
   7751     20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
   7752     20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
   7753     20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
   7754     21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
   7755     21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
   7756     21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
   7757     22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
   7758     22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
   7759     23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
   7760     23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
   7761     24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
   7762     24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
   7763     24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
   7764     24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
   7765     25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
   7766     25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
   7767     26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
   7768     26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
   7769     26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
   7770     26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
   7771     27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
   7772     {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
   7773     27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
   7774     28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
   7775     29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
   7776     30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
   7777     {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
   7778     30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
   7779     31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
   7780     31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
   7781     32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
   7782     32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
   7783     33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
   7784     33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
   7785     33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
   7786     35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
   7787     36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
   7788     36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
   7789     {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
   7790     [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
   7791     [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
   7792     20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
   7793     20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
   7794     20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
   7795     20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
   7796     20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
   7797     21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
   7798     21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
   7799     21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
   7800     22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
   7801     23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
   7802     23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
   7803     23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
   7804     24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
   7805     24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
   7806     24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
   7807     25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
   7808     25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
   7809     26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
   7810     26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
   7811     26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
   7812     26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
   7813     27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
   7814     28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
   7815     28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
   7816     28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
   7817     29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
   7818     30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
   7819     30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
   7820     {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
   7821     30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
   7822     31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
   7823     31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
   7824     32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
   7825     32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
   7826     32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
   7827     33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
   7828     33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
   7829     33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
   7830     33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
   7831     34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
   7832     34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
   7833     35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
   7834     36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
   7835     36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
   7836     37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
   7837     38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
   7838     [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
   7839     [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
   7840     20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
   7841     20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
   7842     21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
   7843     21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
   7844     21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
   7845     21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
   7846     22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
   7847     23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
   7848     23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
   7849     {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
   7850     23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
   7851     {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
   7852     24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
   7853     24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
   7854     24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
   7855     {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
   7856     25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
   7857     25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
   7858     25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
   7859     25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
   7860     26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
   7861     26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
   7862     26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
   7863     27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
   7864     28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
   7865     28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
   7866     28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
   7867     28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
   7868     29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
   7869     29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
   7870     {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
   7871     30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
   7872     30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
   7873     31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
   7874     31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
   7875     32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
   7876     32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
   7877     33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
   7878     33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
   7879     {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
   7880     34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
   7881     34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
   7882     35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
   7883     36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
   7884     36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
   7885     36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
   7886     37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
   7887     38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
   7888     31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
   7889     [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
   7890     20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
   7891     21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
   7892     21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
   7893     21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
   7894     21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
   7895     22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
   7896     [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
   7897     23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
   7898     24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
   7899     24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
   7900     24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
   7901     24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
   7902     25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
   7903     {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
   7904     25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
   7905     26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
   7906     26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
   7907     26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
   7908     26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
   7909     {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
   7910     28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
   7911     28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
   7912     28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
   7913     {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
   7914     29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
   7915     29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
   7916     {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
   7917     30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
   7918     30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
   7919     31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
   7920     31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
   7921     32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
   7922     32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
   7923     33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
   7924     33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
   7925     33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
   7926     33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
   7927     34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
   7928     35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
   7929     35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
   7930     36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
   7931     36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
   7932     36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
   7933     37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
   7934     37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
   7935     38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
   7936     38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
   7937     38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
   7938     [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
   7939     {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
   7940     21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
   7941     21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
   7942     21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
   7943     22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
   7944     22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
   7945     23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
   7946     24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
   7947     24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
   7948     {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
   7949     25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
   7950     26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
   7951     26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
   7952     26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
   7953     27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
   7954     28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
   7955     28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
   7956     29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
   7957     29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
   7958     29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
   7959     30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
   7960     {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
   7961     30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
   7962     30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
   7963     31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
   7964     31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
   7965     32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
   7966     32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
   7967     {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
   7968     33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
   7969     33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
   7970     34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
   7971     35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
   7972     {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
   7973     35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
   7974     35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
   7975     36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
   7976     36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
   7977     36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
   7978     36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
   7979     37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
   7980     37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
   7981     {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
   7982     {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
   7983     {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
   7984     [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
   7985     20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
   7986     21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
   7987     22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
   7988     22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
   7989     22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
   7990     23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
   7991     23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
   7992     24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
   7993     24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
   7994     25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
   7995     25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
   7996     27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
   7997     27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
   7998     28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
   7999     28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
   8000     28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
   8001     29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
   8002     29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
   8003     30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
   8004     30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
   8005     31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
   8006     [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
   8007     {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
   8008     32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
   8009     32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
   8010     33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
   8011     33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
   8012     33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
   8013     34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
   8014     35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
   8015     35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
   8016     36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
   8017     36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
   8018     36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
   8019     37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
   8020     38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
   8021     38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
   8022     39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
   8023     40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
   8024     20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
   8025     {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
   8026     22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
   8027     22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
   8028     23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
   8029     {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
   8030     24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
   8031     24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
   8032     24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
   8033     25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
   8034     25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
   8035     {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
   8036     27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
   8037     27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
   8038     28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
   8039     28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
   8040     29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
   8041     30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
   8042     30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
   8043     30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
   8044     31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
   8045     31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
   8046     32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
   8047     32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
   8048     34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
   8049     34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
   8050     34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
   8051     35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
   8052     35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
   8053     35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
   8054     {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
   8055     36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
   8056     36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
   8057     36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
   8058     37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
   8059     37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
   8060     38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
   8061     39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
   8062     {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
   8063     40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
   8064     20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
   8065     22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
   8066     22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
   8067     23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
   8068     25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
   8069     25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
   8070     26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
   8071     27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
   8072     27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
   8073     28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
   8074     29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
   8075     29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
   8076     30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
   8077     31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
   8078     31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
   8079     32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
   8080     {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
   8081     {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
   8082     34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
   8083     35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
   8084     35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
   8085     35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
   8086     36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
   8087     36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
   8088     37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
   8089     37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
   8090     38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
   8091     38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
   8092     39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
   8093     39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
   8094     [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
   8095     22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
   8096     23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
   8097     24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
   8098     25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
   8099     {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
   8100     27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
   8101     28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
   8102     28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
   8103     29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
   8104     29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
   8105     30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
   8106     31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
   8107     31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
   8108     32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
   8109     32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
   8110     33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
   8111     33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
   8112     34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
   8113     34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
   8114     35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
   8115     35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
   8116     36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
   8117     36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
   8118     37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
   8119     37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
   8120     38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
   8121     39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
   8122     40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
   8123     25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
   8124     26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
   8125     27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
   8126     {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
   8127     30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
   8128     {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
   8129     31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
   8130     32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
   8131     34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
   8132     35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
   8133     36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
   8134     37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
   8135     37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
   8136     38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
   8137     38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
   8138     39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
   8139     39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
   8140     22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
   8141     25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
   8142     28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
   8143     29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
   8144     31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
   8145     32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
   8146     33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
   8147     34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
   8148     35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
   8149     36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
   8150     37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
   8151     37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
   8152     38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
   8153     39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
   8154     40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
   8155     22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
   8156     25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
   8157     29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
   8158     31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
   8159     33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
   8160     {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
   8161     35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
   8162     37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
   8163     39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
   8164     40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
   8165     25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
   8166     29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
   8167     34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
   8168     35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
   8169     37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
   8170     38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
   8171     39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
   8172     40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
   8173     23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
   8174     29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
   8175     33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
   8176     37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
   8177     39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
   8178     40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
   8179     25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
   8180     32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
   8181     37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
   8182     39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
   8183     28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
   8184     35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
   8185     38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
   8186     {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
   8187     34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
   8188     40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
   8189     36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
   8190     38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
   8191     [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
   8192     [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
   8193     20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
   8194     22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
   8195     [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
   8196     21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
   8197     23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
   8198     27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
   8199     32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
   8200     20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
   8201     21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
   8202     22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
   8203     22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
   8204     [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
   8205     25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
   8206     26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
   8207     27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
   8208     28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
   8209     [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
   8210     37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
   8211     20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
   8212     20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
   8213     21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
   8214     21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
   8215     21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
   8216     22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
   8217     22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
   8218     23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
   8219     24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
   8220     24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
   8221     24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
   8222     {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
   8223     25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
   8224     26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
   8225     {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
   8226     27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
   8227     27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
   8228     29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
   8229     {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
   8230     33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
   8231     [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
   8232     38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
   8233     20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
   8234     20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
   8235     20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
   8236     21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
   8237     21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
   8238     21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
   8239     22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
   8240     {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
   8241     22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
   8242     22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
   8243     23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
   8244     23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
   8245     24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
   8246     24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
   8247     24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
   8248     24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
   8249     25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
   8250     26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
   8251     26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
   8252     26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
   8253     26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
   8254     27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
   8255     27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
   8256     27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
   8257     27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
   8258     28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
   8259     29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
   8260     29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
   8261     30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
   8262     30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
   8263     31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
   8264     33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
   8265     33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
   8266     34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
   8267     36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
   8268     38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
   8269     20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
   8270     20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
   8271     21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
   8272     21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
   8273     21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
   8274     22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
   8275     22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
   8276     23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
   8277     23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
   8278     23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
   8279     23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
   8280     24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
   8281     24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
   8282     24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
   8283     25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
   8284     25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
   8285     25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
   8286     26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
   8287     26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
   8288     26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
   8289     26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
   8290     26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
   8291     27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
   8292     27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
   8293     27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
   8294     27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
   8295     28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
   8296     {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
   8297     29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
   8298     29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
   8299     29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
   8300     30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
   8301     30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
   8302     30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
   8303     31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
   8304     {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
   8305     {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
   8306     32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
   8307     32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
   8308     33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
   8309     33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
   8310     34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
   8311     35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
   8312     37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
   8313     38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
   8314     20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
   8315     20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
   8316     20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
   8317     {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
   8318     21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
   8319     21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
   8320     {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
   8321     22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
   8322     23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
   8323     23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
   8324     23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
   8325     24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
   8326     24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
   8327     25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
   8328     25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
   8329     25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
   8330     25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
   8331     {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
   8332     26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
   8333     26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
   8334     26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
   8335     27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
   8336     27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
   8337     28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
   8338     28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
   8339     28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
   8340     28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
   8341     28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
   8342     29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
   8343     29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
   8344     29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
   8345     30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
   8346     30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
   8347     30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
   8348     30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
   8349     31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
   8350     31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
   8351     31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
   8352     31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
   8353     32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
   8354     32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
   8355     33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
   8356     33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
   8357     33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
   8358     33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
   8359     33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
   8360     34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
   8361     34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
   8362     34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
   8363     34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
   8364     36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
   8365     36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
   8366     37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
   8367     37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
   8368     20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
   8369     20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
   8370     {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
   8371     21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
   8372     21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
   8373     21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
   8374     21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
   8375     22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
   8376     22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
   8377     22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
   8378     [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
   8379     23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
   8380     23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
   8381     23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
   8382     23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
   8383     23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
   8384     24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
   8385     {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
   8386     24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
   8387     25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
   8388     25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
   8389     25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
   8390     26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
   8391     {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
   8392     26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
   8393     26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
   8394     26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
   8395     {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
   8396     28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
   8397     28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
   8398     28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
   8399     28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
   8400     28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
   8401     28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
   8402     29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
   8403     29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
   8404     29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
   8405     30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
   8406     30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
   8407     30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
   8408     31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
   8409     31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
   8410     31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
   8411     31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
   8412     32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
   8413     {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
   8414     32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
   8415     33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
   8416     33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
   8417     33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
   8418     33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
   8419     33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
   8420     33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
   8421     34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
   8422     {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
   8423     34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
   8424     34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
   8425     35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
   8426     36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
   8427     {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
   8428     37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
   8429     37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
   8430     37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
   8431     38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
   8432     20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
   8433     20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
   8434     21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
   8435     21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
   8436     21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
   8437     22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
   8438     22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
   8439     23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
   8440     23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
   8441     23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
   8442     23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
   8443     23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
   8444     23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
   8445     24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
   8446     24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
   8447     24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
   8448     25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
   8449     25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
   8450     25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
   8451     25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
   8452     26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
   8453     26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
   8454     26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
   8455     26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
   8456     26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
   8457     {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
   8458     26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
   8459     27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
   8460     28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
   8461     28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
   8462     28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
   8463     28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
   8464     {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
   8465     28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
   8466     {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
   8467     29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
   8468     29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
   8469     29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
   8470     30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
   8471     30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
   8472     {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
   8473     30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
   8474     31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
   8475     31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
   8476     32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
   8477     32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
   8478     {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
   8479     33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
   8480     {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
   8481     [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
   8482     33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
   8483     33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
   8484     [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
   8485     33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
   8486     33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
   8487     34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
   8488     34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
   8489     34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
   8490     {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
   8491     {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
   8492     35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
   8493     36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
   8494     36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
   8495     {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
   8496     36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
   8497     37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
   8498     37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
   8499     37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
   8500     37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
   8501     38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
   8502     38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
   8503     20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
   8504     20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
   8505     {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
   8506     [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
   8507     21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
   8508     22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
   8509     22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
   8510     23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
   8511     23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
   8512     23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
   8513     24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
   8514     24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
   8515     24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
   8516     25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
   8517     25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
   8518     25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
   8519     25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
   8520     26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
   8521     26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
   8522     26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
   8523     26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
   8524     26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
   8525     26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
   8526     27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
   8527     28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
   8528     28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
   8529     28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
   8530     28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
   8531     29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
   8532     28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
   8533     29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
   8534     29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
   8535     29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
   8536     29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
   8537     30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
   8538     30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
   8539     30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
   8540     30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
   8541     30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
   8542     31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
   8543     31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
   8544     31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
   8545     32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
   8546     32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
   8547     {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
   8548     33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
   8549     33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
   8550     33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
   8551     33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
   8552     33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
   8553     33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
   8554     33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
   8555     33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
   8556     34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
   8557     35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
   8558     35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
   8559     35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
   8560     35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
   8561     {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
   8562     36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
   8563     36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
   8564     {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
   8565     37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
   8566     37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
   8567     37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
   8568     37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
   8569     37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
   8570     38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
   8571     {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
   8572     39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
   8573     20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
   8574     20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
   8575     22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
   8576     22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
   8577     22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
   8578     22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
   8579     23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
   8580     23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
   8581     23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
   8582     23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
   8583     24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
   8584     24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
   8585     24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
   8586     25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
   8587     25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
   8588     25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
   8589     26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
   8590     27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
   8591     27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
   8592     27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
   8593     27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
   8594     {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
   8595     28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
   8596     28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
   8597     28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
   8598     28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
   8599     29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
   8600     29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
   8601     29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
   8602     30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
   8603     30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
   8604     30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
   8605     {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
   8606     31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
   8607     31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
   8608     31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
   8609     32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
   8610     32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
   8611     32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
   8612     32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
   8613     33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
   8614     33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
   8615     33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
   8616     34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
   8617     33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
   8618     34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
   8619     34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
   8620     34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
   8621     35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
   8622     35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
   8623     35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
   8624     36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
   8625     {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
   8626     37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
   8627     37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
   8628     37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
   8629     37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
   8630     37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
   8631     38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
   8632     {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
   8633     39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
   8634     {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
   8635     20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
   8636     20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
   8637     22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
   8638     22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
   8639     22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
   8640     23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
   8641     23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
   8642     24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
   8643     24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
   8644     25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
   8645     25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
   8646     25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
   8647     {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
   8648     27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
   8649     27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
   8650     27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
   8651     27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
   8652     27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
   8653     28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
   8654     28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
   8655     28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
   8656     28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
   8657     29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
   8658     29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
   8659     29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
   8660     29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
   8661     30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
   8662     30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
   8663     30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
   8664     31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
   8665     31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
   8666     31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
   8667     32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
   8668     32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
   8669     33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
   8670     33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
   8671     34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
   8672     34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
   8673     34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
   8674     {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
   8675     34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
   8676     34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
   8677     34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
   8678     34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
   8679     {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
   8680     35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
   8681     35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
   8682     35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
   8683     36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
   8684     36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
   8685     36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
   8686     {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
   8687     {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
   8688     {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
   8689     37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
   8690     37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
   8691     37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
   8692     38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
   8693     38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
   8694     38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
   8695     {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
   8696     39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
   8697     39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
   8698     39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
   8699     40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
   8700     {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
   8701     22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
   8702     22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
   8703     23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
   8704     23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
   8705     23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
   8706     24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
   8707     25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
   8708     24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
   8709     25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
   8710     {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
   8711     27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
   8712     27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
   8713     27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
   8714     27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
   8715     27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
   8716     28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
   8717     28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
   8718     29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
   8719     29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
   8720     {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
   8721     29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
   8722     30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
   8723     30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
   8724     30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
   8725     {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
   8726     31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
   8727     31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
   8728     {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
   8729     32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
   8730     32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
   8731     32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
   8732     33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
   8733     34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
   8734     34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
   8735     34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
   8736     34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
   8737     34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
   8738     34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
   8739     35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
   8740     {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
   8741     35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
   8742     36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
   8743     36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
   8744     36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
   8745     37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
   8746     37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
   8747     37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
   8748     37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
   8749     37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
   8750     38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
   8751     38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
   8752     38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
   8753     39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
   8754     39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
   8755     39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
   8756     40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
   8757     40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
   8758     40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
   8759     {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
   8760     22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
   8761     23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
   8762     25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
   8763     25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
   8764     27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
   8765     27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
   8766     27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
   8767     28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
   8768     29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
   8769     29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
   8770     29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
   8771     30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
   8772     {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
   8773     31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
   8774     31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
   8775     31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
   8776     31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
   8777     32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
   8778     32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
   8779     33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
   8780     34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
   8781     34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
   8782     34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
   8783     34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
   8784     34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
   8785     34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
   8786     35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
   8787     {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
   8788     35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
   8789     35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
   8790     36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
   8791     37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
   8792     37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
   8793     37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
   8794     37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
   8795     38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
   8796     38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
   8797     38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
   8798     39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
   8799     39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
   8800     39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
   8801     39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
   8802     40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
   8803     {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
   8804     40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
   8805     [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
   8806     22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
   8807     25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
   8808     25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
   8809     26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
   8810     27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
   8811     28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
   8812     [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
   8813     29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
   8814     30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
   8815     {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
   8816     31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
   8817     31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
   8818     32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
   8819     33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
   8820     34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
   8821     34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
   8822     34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
   8823     34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
   8824     35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
   8825     35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
   8826     35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
   8827     35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
   8828     36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
   8829     {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
   8830     37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
   8831     37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
   8832     37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
   8833     38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
   8834     38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
   8835     38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
   8836     39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
   8837     39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
   8838     39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
   8839     39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
   8840     40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
   8841     40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
   8842     40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
   8843     {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
   8844     {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
   8845     25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
   8846     27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
   8847     27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
   8848     28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
   8849     29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
   8850     {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
   8851     31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
   8852     32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
   8853     32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
   8854     33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
   8855     34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
   8856     34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
   8857     34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
   8858     {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
   8859     35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
   8860     35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
   8861     {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
   8862     36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
   8863     37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
   8864     37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
   8865     37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
   8866     38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
   8867     {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
   8868     39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
   8869     39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
   8870     39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
   8871     39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
   8872     39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
   8873     {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
   8874     40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
   8875     40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
   8876     22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
   8877     {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
   8878     {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
   8879     {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
   8880     28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
   8881     29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
   8882     {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
   8883     31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
   8884     31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
   8885     33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
   8886     34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
   8887     34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
   8888     35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
   8889     36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
   8890     37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
   8891     37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
   8892     37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
   8893     38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
   8894     39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
   8895     39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
   8896     39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
   8897     39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
   8898     39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
   8899     40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
   8900     40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
   8901     40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
   8902     40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
   8903     24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
   8904     {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
   8905     29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
   8906     31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
   8907     32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
   8908     34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
   8909     34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
   8910     35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
   8911     36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
   8912     37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
   8913     38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
   8914     39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
   8915     39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
   8916     39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
   8917     40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
   8918     40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
   8919     40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
   8920     40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
   8921     24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
   8922     {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
   8923     29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
   8924     31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
   8925     {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
   8926     34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
   8927     35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
   8928     36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
   8929     {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
   8930     39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
   8931     39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
   8932     39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
   8933     40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
   8934     40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
   8935     40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
   8936     24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
   8937     {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
   8938     30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
   8939     34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
   8940     35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
   8941     37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
   8942     39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
   8943     40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
   8944     40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
   8945     40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
   8946     40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
   8947     23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
   8948     29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
   8949     33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
   8950     {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
   8951     38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
   8952     40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
   8953     40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
   8954     {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
   8955     28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
   8956     32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
   8957     35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
   8958     37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
   8959     40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
   8960     40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
   8961     38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
   8962     40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
   8963     34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
   8964     39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
   8965     25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
   8966     40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
   8967     {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
   8968     65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
   8969     [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
   8970     [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
   8971     [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
   8972     [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
   8973     [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
   8974     [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
   8975     [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
   8976     [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
   8977     [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
   8978     [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
   8979     [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
   8980     [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
   8981     [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
   8982     [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
   8983     [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
   8984     [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
   8985     [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
   8986     [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
   8987     [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
   8988     [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
   8989     [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
   8990     [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
   8991     [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
   8992     [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
   8993     [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
   8994     [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
   8995     [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
   8996     [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
   8997     [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
   8998     [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
   8999     [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
   9000     [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
   9001     [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
   9002     [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
   9003     [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
   9004     [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
   9005     [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
   9006     [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
   9007     [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
   9008     [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
   9009     [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
   9010     [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
   9011     [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
   9012     [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
   9013     [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
   9014     [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
   9015     [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
   9016     [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
   9017     [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
   9018     [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
   9019     [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
   9020     [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
   9021     [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
   9022     [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
   9023     [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
   9024     [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
   9025     [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
   9026     [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
   9027     [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
   9028     [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
   9029     [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
   9030     {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
   9031     [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
   9032     [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
   9033     9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
   9034     9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
   9035     {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
   9036     [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
   9037     [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
   9038     [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
   9039     [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
   9040     [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
   9041     [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
   9042     [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
   9043     [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
   9044     [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
   9045     [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
   9046     [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
   9047     [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
   9048     [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
   9049     [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
   9050     [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
   9051     [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
   9052     [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
   9053     [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
   9054     [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
   9055     [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
   9056     [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
   9057     [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
   9058     [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
   9059     [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
   9060     [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
   9061     [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
   9062     [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
   9063     [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
   9064     [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
   9065     [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
   9066     [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
   9067     [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
   9068     [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
   9069     [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
   9070     [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
   9071     [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
   9072     [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
   9073     [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
   9074     [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
   9075     [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
   9076     [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
   9077     [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
   9078     [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
   9079     [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
   9080     [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
   9081     [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
   9082     [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
   9083     [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
   9084     [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
   9085     [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
   9086     [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
   9087     [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
   9088     [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
   9089     [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
   9090     [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
   9091     [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
   9092     [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
   9093     [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
   9094     [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
   9095     [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
   9096     [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
   9097     [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
   9098     [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
   9099     [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
   9100     [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
   9101     [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
   9102     [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
   9103     [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
   9104     [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
   9105     [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
   9106     [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
   9107     [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
   9108     [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
   9109     [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
   9110     [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
   9111     [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
   9112     [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
   9113     [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
   9114     [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
   9115     [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
   9116     [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
   9117     [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
   9118     [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
   9119     [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
   9120     [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
   9121     [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
   9122     [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
   9123     [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
   9124     [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
   9125     [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
   9126     [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
   9127     [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
   9128     [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
   9129     [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
   9130     [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
   9131     [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
   9132     [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
   9133     [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
   9134     [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
   9135     [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
   9136     [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
   9137     [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
   9138     [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
   9139     [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
   9140     [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
   9141     [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
   9142     [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
   9143     [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
   9144     [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
   9145     [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
   9146     [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
   9147     [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
   9148     [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
   9149     [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
   9150     [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
   9151     [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
   9152     [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
   9153     [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
   9154     [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
   9155     [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
   9156     [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
   9157     [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
   9158     [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
   9159     [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
   9160     [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
   9161     [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
   9162     [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
   9163     [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
   9164     [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
   9165     [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
   9166     [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
   9167     [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
   9168     [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
   9169     [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
   9170     [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
   9171     [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
   9172     [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
   9173     [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
   9174     [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
   9175     [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
   9176     [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
   9177     [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
   9178     [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
   9179     [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
   9180     [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
   9181     [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
   9182     [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
   9183     [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
   9184     [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
   9185     [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
   9186     [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
   9187     [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
   9188     [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
   9189     [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
   9190     [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
   9191     [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
   9192     [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
   9193     [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
   9194     [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
   9195     [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
   9196     [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
   9197     [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
   9198     [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
   9199     [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
   9200     [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
   9201     [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
   9202     [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
   9203     [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
   9204     [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
   9205     [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
   9206     [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
   9207     [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
   9208     [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
   9209     [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
   9210     [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
   9211     [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
   9212     [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
   9213     [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
   9214     [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
   9215     [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
   9216     [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
   9217     [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
   9218     [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
   9219     [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
   9220     [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
   9221     [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
   9222     [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
   9223     [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
   9224     [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
   9225     [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
   9226     [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
   9227     [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
   9228     [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
   9229     [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
   9230     [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
   9231     [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
   9232     [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
   9233     [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
   9234     [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
   9235     [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
   9236     [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
   9237     [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
   9238     [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
   9239     [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
   9240     [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
   9241     [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
   9242     [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
   9243     [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
   9244     [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
   9245     [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
   9246     [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
   9247     [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
   9248     [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
   9249     [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
   9250     [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
   9251     [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
   9252     [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
   9253     [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
   9254     [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
   9255     [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
   9256     [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
   9257     [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
   9258     [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
   9259     [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
   9260     [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
   9261     [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
   9262     [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
   9263     [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
   9264     [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
   9265     [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
   9266     [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
   9267     [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
   9268     [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
   9269     [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
   9270     [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
   9271     [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
   9272     [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
   9273     [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
   9274     [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
   9275     [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
   9276     [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
   9277     [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
   9278     [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
   9279     [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
   9280     [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
   9281     [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
   9282     [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
   9283     [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
   9284     [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
   9285     [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
   9286     [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
   9287     [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
   9288     [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
   9289     [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
   9290     [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
   9291     [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
   9292     [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
   9293     [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
   9294     [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
   9295     [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
   9296     [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
   9297     [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
   9298     [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
   9299     [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
   9300     [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
   9301     [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
   9302     [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
   9303     [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
   9304     [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
   9305     [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
   9306     [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
   9307     [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
   9308     [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
   9309     [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
   9310     [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
   9311     [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
   9312     [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
   9313     [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
   9314     [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
   9315     [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
   9316     [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
   9317     [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
   9318     [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
   9319     [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
   9320     [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
   9321     [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
   9322     [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
   9323     [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
   9324     [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
   9325     [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
   9326     [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
   9327     [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
   9328     [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
   9329     [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
   9330     [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
   9331     [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
   9332     [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
   9333     [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
   9334     [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
   9335     [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
   9336     [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
   9337     [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
   9338     [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
   9339     [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
   9340     [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
   9341     [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
   9342     [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
   9343     [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
   9344     [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
   9345     [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
   9346     [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
   9347     [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
   9348     [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
   9349     [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
   9350     [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
   9351     [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
   9352     [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
   9353     [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
   9354     [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
   9355     [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
   9356     [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
   9357     [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
   9358     [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
   9359     [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
   9360     [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
   9361     [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
   9362     [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
   9363     [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
   9364     [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
   9365     [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
   9366     [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
   9367     [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
   9368     [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
   9369     [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
   9370     [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
   9371     [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
   9372     [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
   9373     [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
   9374     [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
   9375     [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
   9376     [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
   9377     [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
   9378     [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
   9379     [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
   9380     [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
   9381     [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
   9382     [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
   9383     [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
   9384     [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
   9385     [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
   9386     [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
   9387     [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
   9388     [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
   9389     [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
   9390     [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
   9391     [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
   9392     [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
   9393     [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
   9394     [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
   9395     [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
   9396     [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
   9397     [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
   9398     [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
   9399     [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
   9400     [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
   9401     [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
   9402     [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
   9403     [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
   9404     [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
   9405     [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
   9406     [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
   9407     [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
   9408     [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
   9409     [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
   9410     [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
   9411     [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
   9412     [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
   9413     [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
   9414     [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
   9415     [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
   9416     [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
   9417     [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
   9418     [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
   9419     [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
   9420     [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
   9421     [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
   9422     [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
   9423     [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
   9424     [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
   9425     [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
   9426     [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
   9427     [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
   9428     [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
   9429     [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
   9430     [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
   9431     [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
   9432     [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
   9433     [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
   9434     [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
   9435     [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
   9436     [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
   9437     [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
   9438     [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
   9439     [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
   9440     [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
   9441     [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
   9442     [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
   9443     [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
   9444     [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
   9445     [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
   9446     [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
   9447     [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
   9448     [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
   9449     [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
   9450     [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
   9451     [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
   9452     [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
   9453     [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
   9454     [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
   9455     [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
   9456     [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
   9457     [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
   9458     [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
   9459     [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
   9460     [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
   9461     [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
   9462     [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
   9463     [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
   9464     [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
   9465     [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
   9466     [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
   9467     [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
   9468     [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
   9469     [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
   9470     [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
   9471     [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
   9472     [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
   9473     [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
   9474     [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
   9475     [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
   9476     [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
   9477     [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
   9478     [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
   9479     [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
   9480     [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
   9481     [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
   9482     [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
   9483     [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
   9484     [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
   9485     [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
   9486     [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
   9487     [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
   9488     [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
   9489     [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
   9490     [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
   9491     [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
   9492     [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
   9493     [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
   9494     [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
   9495     [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
   9496     [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
   9497     [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
   9498     [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
   9499     [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
   9500     [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
   9501     [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
   9502     [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
   9503     [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
   9504     [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
   9505     [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
   9506     [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
   9507     [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
   9508     [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
   9509     [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
   9510     [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
   9511     [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
   9512     [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
   9513     [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
   9514     [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
   9515     [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
   9516     [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
   9517     [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
   9518     [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
   9519     [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
   9520     [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
   9521     [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
   9522     [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
   9523     [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
   9524     [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
   9525     [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
   9526     [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
   9527     [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
   9528     [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
   9529     [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
   9530     [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
   9531     [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
   9532     [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
   9533     [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
   9534     60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
   9535     [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
   9536     [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
   9537     [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
   9538     [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
   9539     [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
   9540     [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
   9541     [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
   9542     [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
   9543     [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
   9544     [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
   9545     60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
   9546     60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
   9547     [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
   9548     [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
   9549     [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
   9550     [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
   9551     [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
   9552     [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
   9553     [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
   9554     [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
   9555     [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
   9556     [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
   9557     [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
   9558     [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
   9559     [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
   9560     [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
   9561     [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
   9562     [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
   9563     [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
   9564     [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
   9565     [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
   9566     [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
   9567     [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
   9568     [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
   9569     [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
   9570     [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
   9571     [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
   9572     [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
   9573     [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
   9574     [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
   9575     [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
   9576     [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
   9577     [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
   9578     [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
   9579     [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
   9580     [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
   9581     [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
   9582     [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
   9583     [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
   9584     [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
   9585     [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
   9586     [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
   9587     [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
   9588     [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
   9589     [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
   9590     [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
   9591     [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
   9592     [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
   9593     [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
   9594     [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
   9595     [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
   9596     [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
   9597     [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
   9598     [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
   9599     [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
   9600     [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
   9601     [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
   9602     [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
   9603     [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
   9604     [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
   9605     [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
   9606     [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
   9607     [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
   9608     [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
   9609     [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
   9610     [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
   9611     [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
   9612     [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
   9613     [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
   9614     [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
   9615     [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
   9616     [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
   9617     [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
   9618     [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
   9619     [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
   9620     [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
   9621     [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
   9622     [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
   9623     [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
   9624     [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
   9625     [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
   9626     [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
   9627     [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
   9628     [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
   9629     [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
   9630     [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
   9631     [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
   9632     [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
   9633     [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
   9634     [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
   9635     [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
   9636     [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
   9637     [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
   9638     [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
   9639     [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
   9640     [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
   9641     [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
   9642     [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
   9643     [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
   9644     [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
   9645     [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
   9646     [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
   9647     [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
   9648     [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
   9649     [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
   9650     [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
   9651     [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
   9652     [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
   9653     [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
   9654     [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
   9655     [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
   9656     [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
   9657     [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
   9658     [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
   9659     [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
   9660     [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
   9661     [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
   9662     [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
   9663     [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
   9664     [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
   9665     [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
   9666     [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
   9667     [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
   9668     [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
   9669     [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
   9670     [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
   9671     [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
   9672     [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
   9673     [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
   9674     [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
   9675     [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
   9676     [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
   9677     [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
   9678     [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
   9679     [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
   9680     [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
   9681     [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
   9682     [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
   9683     [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
   9684     [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
   9685     [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
   9686     [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
   9687     [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
   9688     [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
   9689     [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
   9690     [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
   9691     [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
   9692     [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
   9693     [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
   9694     [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
   9695     [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
   9696     [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
   9697     [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
   9698     [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
   9699     [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
   9700     [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
   9701     [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
   9702     [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
   9703     [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
   9704     [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
   9705     [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
   9706     [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
   9707     [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
   9708     [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
   9709     [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
   9710     [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
   9711     [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
   9712     [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
   9713     [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
   9714     [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
   9715     [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
   9716     [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
   9717     [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
   9718     [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
   9719     [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
   9720     [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
   9721     [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
   9722     [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
   9723     [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
   9724     [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
   9725     [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
   9726     [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
   9727     [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
   9728     [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
   9729     [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
   9730     [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
   9731     [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
   9732     [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
   9733     [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
   9734     [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
   9735     [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
   9736     [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
   9737     [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
   9738     [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
   9739     [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
   9740     [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
   9741     [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
   9742     [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
   9743     [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
   9744     [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
   9745     [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
   9746     [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
   9747     [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
   9748     [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
   9749     [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
   9750     [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
   9751     [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
   9752     [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
   9753     [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
   9754     [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
   9755     [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
   9756     [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
   9757     [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
   9758     [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
   9759     [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
   9760     [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
   9761     [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
   9762     [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
   9763     [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
   9764     [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
   9765     [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
   9766     [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
   9767     [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
   9768     [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
   9769     [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
   9770     [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
   9771     [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
   9772     [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
   9773     [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
   9774     [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
   9775     [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
   9776     [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
   9777     [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
   9778     [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
   9779     [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
   9780     [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
   9781     [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
   9782     [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
   9783     [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
   9784     [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
   9785     [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
   9786     [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
   9787     [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
   9788     [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
   9789     [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
   9790     [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
   9791     [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
   9792     [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
   9793     [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
   9794     [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
   9795     0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
   9796     [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
   9797     [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
   9798     [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
   9799     [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
   9800     [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
   9801     [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
   9802     [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
   9803     [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
   9804     [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
   9805     [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
   9806     [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
   9807     [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
   9808     [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
   9809     [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
   9810     {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
   9811     {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
   9812     {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
   9813     {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
   9814     [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
   9815     [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
   9816     [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
   9817     [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
   9818     [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
   9819     [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
   9820     [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
   9821     [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
   9822     [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
   9823     [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
   9824     [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
   9825     [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
   9826     [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
   9827     [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
   9828     [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
   9829     [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
   9830     [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
   9831     [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
   9832     [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
   9833     [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
   9834     [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
   9835     [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
   9836     [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
   9837     [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
   9838     [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
   9839     [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
   9840     [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
   9841     [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
   9842     [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
   9843     [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
   9844     [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
   9845     [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
   9846     [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
   9847     [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
   9848     [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
   9849     [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
   9850     [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
   9851     [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
   9852     [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
   9853     [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
   9854     [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
   9855     [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
   9856     [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
   9857     [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
   9858     [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
   9859     [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
   9860     [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
   9861     [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
   9862     [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
   9863     [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
   9864     [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
   9865     [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
   9866     [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
   9867     [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
   9868     [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
   9869     [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
   9870     [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
   9871     [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
   9872     [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
   9873     [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
   9874     [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
   9875     [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
   9876     [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
   9877     [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
   9878     [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
   9879     [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
   9880     [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
   9881     [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
   9882     [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
   9883     [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
   9884     [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
   9885     [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
   9886     [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
   9887     [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
   9888     [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
   9889     [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
   9890     [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
   9891     [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
   9892     [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
   9893     [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
   9894     [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
   9895     [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
   9896     [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
   9897     [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
   9898     [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
   9899     [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
   9900     [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
   9901     [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
   9902     [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
   9903     [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
   9904     [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
   9905     [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
   9906     [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
   9907     [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
   9908     [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
   9909     [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
   9910     [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
   9911     [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
   9912     [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
   9913     [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
   9914     [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
   9915     [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
   9916     [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
   9917     [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
   9918     [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
   9919     [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
   9920     [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
   9921     [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
   9922     [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
   9923     [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
   9924     [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
   9925     [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
   9926     [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
   9927     [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
   9928     [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
   9929     [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
   9930     [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
   9931     [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
   9932     [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
   9933     [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
   9934     [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
   9935     [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
   9936     [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
   9937     [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
   9938     [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
   9939     [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
   9940     [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
   9941     [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
   9942     [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
   9943     [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
   9944     [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
   9945     [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
   9946     [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
   9947     [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
   9948     [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
   9949     [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
   9950     [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
   9951     [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
   9952     [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
   9953     [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
   9954     [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
   9955     [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
   9956     [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
   9957     [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
   9958     [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
   9959     [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
   9960     [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
   9961     [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
   9962     [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
   9963     [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
   9964     [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
   9965     [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
   9966     [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
   9967     [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
   9968     [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
   9969     [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
   9970     [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
   9971     [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
   9972     [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
   9973     [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
   9974     [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
   9975     [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
   9976     [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
   9977     [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
   9978     [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
   9979     [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
   9980     [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
   9981     [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
   9982     [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
   9983     [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
   9984     [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
   9985     [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
   9986     [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
   9987     [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
   9988     [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
   9989     [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
   9990     [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
   9991     [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
   9992     [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
   9993     [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
   9994     [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
   9995     [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
   9996     [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
   9997     [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
   9998     [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
   9999     [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
   10000     [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
   10001     [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
   10002     [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
   10003     [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
   10004     [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
   10005     [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
   10006     [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
   10007     [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
   10008     [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
   10009     [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
   10010     [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
   10011     [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
   10012     [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
   10013     [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
   10014     [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
   10015     [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
   10016     [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
   10017     [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
   10018     [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
   10019     [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
   10020     [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
   10021     [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
   10022     [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
   10023     [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
   10024     [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
   10025     [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
   10026     [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
   10027     [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
   10028     [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
   10029     [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
   10030     [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
   10031     [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
   10032     [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
   10033     [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
   10034     [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
   10035     [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
   10036     [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
   10037     [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
   10038     [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
   10039     [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
   10040     [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
   10041     [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
   10042     [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
   10043     [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
   10044     [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
   10045     [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
   10046     [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
   10047     [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
   10048     [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
   10049     [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
   10050     [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
   10051     [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
   10052     [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
   10053     [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
   10054     [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
   10055     [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
   10056     [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
   10057     [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
   10058     [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
   10059     [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
   10060     [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
   10061     [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
   10062     [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
   10063     [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
   10064     [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
   10065     [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
   10066     [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
   10067     [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
   10068     [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
   10069     [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
   10070     [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
   10071     [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
   10072     [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
   10073     [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
   10074     [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
   10075     [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
   10076     [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
   10077     [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
   10078     [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
   10079     [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
   10080     [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
   10081     [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
   10082     [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
   10083     [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
   10084     [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
   10085     [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
   10086     [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
   10087     [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
   10088     [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
   10089     [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
   10090     [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
   10091     [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
   10092     [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
   10093     [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
   10094     [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
   10095     [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
   10096     [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
   10097     [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
   10098     [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
   10099     [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
   10100     [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
   10101     [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
   10102     [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
   10103     [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
   10104     [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
   10105     [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
   10106     [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
   10107     [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
   10108     [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
   10109     [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
   10110     [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
   10111     [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
   10112     [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
   10113     [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
   10114     [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
   10115     [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
   10116     [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
   10117     36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
   10118     [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
   10119     [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
   10120     34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
   10121     [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
   10122     20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
   10123     24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
   10124     [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
   10125     [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
   10126     31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
   10127     62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
   10128     [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
   10129     34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
   10130     [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
   10131     23446, 62959, 32347],
   10132   'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
   10133     12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
   10134     {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
   10135     {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
   10136     8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
   10137     8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
   10138     8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
   10139     8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
   10140     9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
   10141     {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
   10142     {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
   10143     {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
   10144     {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
   10145     {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
   10146     {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
   10147     {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
   10148     462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
   10149     250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
   10150     {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
   10151     25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
   10152     29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
   10153     26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
   10154     22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
   10155     [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
   10156     38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
   10157     25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
   10158     25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
   10159     27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
   10160     32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
   10161     25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
   10162     21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
   10163     34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
   10164     36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
   10165     34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
   10166     24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
   10167     36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
   10168     24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
   10169     28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
   10170     30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
   10171     25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
   10172     39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
   10173     31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
   10174     36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
   10175     24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
   10176     26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
   10177     21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
   10178     25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
   10179     20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
   10180     32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
   10181     26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
   10182     24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
   10183     27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
   10184     20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
   10185     30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
   10186     23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
   10187     23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
   10188     32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
   10189     38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
   10190     25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
   10191     24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
   10192     26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
   10193     30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
   10194     32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
   10195     20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
   10196     28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
   10197     25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
   10198     [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
   10199     36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
   10200     27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
   10201     33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
   10202     21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
   10203     30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
   10204     31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
   10205     24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
   10206     38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
   10207     30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
   10208     29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
   10209     39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
   10210     25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
   10211     [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
   10212     29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
   10213     28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
   10214     38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
   10215     36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
   10216     21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
   10217     24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
   10218     [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
   10219     21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
   10220     30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
   10221     33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
   10222     25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
   10223     21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
   10224     33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
   10225     22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
   10226     38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
   10227     20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
   10228     27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
   10229     29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
   10230     36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
   10231     [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
   10232     22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
   10233     [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
   10234     36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
   10235     31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
   10236     21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
   10237     [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
   10238     32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
   10239     [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
   10240     [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
   10241     33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
   10242     20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
   10243     [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
   10244     21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
   10245     20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
   10246     [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
   10247     36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
   10248     36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
   10249     39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
   10250     38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
   10251     26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
   10252     22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
   10253     33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
   10254     38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
   10255     30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
   10256     21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
   10257     29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
   10258     33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
   10259     20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
   10260     21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
   10261     36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
   10262     24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
   10263     29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
   10264     34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
   10265     20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
   10266     27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
   10267     38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
   10268     31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
   10269     21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
   10270     21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
   10271     25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
   10272     35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
   10273     22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
   10274     31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
   10275     38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
   10276     30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
   10277     37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
   10278     39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
   10279     30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
   10280     30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
   10281     38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
   10282     21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
   10283     31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
   10284     31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
   10285     20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
   10286     [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
   10287     38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
   10288     33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
   10289     35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
   10290     31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
   10291     [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
   10292     [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
   10293     23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
   10294     25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
   10295     21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
   10296     25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
   10297     38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
   10298     21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
   10299     21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
   10300     28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
   10301     39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
   10302     32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
   10303     25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
   10304     24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
   10305     24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
   10306     20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
   10307     24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
   10308     22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
   10309     34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
   10310     35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
   10311     26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
   10312     28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
   10313     22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
   10314     29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
   10315     40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
   10316     21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
   10317     [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
   10318     38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
   10319     32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
   10320     20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
   10321     20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
   10322     29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
   10323     21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
   10324     28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
   10325     39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
   10326     31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
   10327     28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
   10328     40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
   10329     24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
   10330     32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
   10331     28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
   10332     32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
   10333     33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
   10334     39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
   10335     30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
   10336     33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
   10337     [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
   10338     29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
   10339     27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
   10340     33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
   10341     31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
   10342     23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
   10343     [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
   10344     34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
   10345     34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
   10346     33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
   10347     28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
   10348     27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
   10349     30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
   10350     27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
   10351     33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
   10352     38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
   10353     34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
   10354     23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
   10355     29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
   10356     33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
   10357     34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
   10358     34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
   10359     25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
   10360     30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
   10361     21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
   10362     36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
   10363     28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
   10364     30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
   10365     33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
   10366     20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
   10367     25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
   10368     20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
   10369     36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
   10370     22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
   10371     26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
   10372     22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
   10373     36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
   10374     36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
   10375     38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
   10376     38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
   10377     27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
   10378     38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
   10379     32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
   10380     20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
   10381     38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
   10382     39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
   10383     22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
   10384     28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
   10385     27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
   10386     30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
   10387     20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
   10388     24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
   10389     20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
   10390     33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
   10391     [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
   10392     [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
   10393     33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
   10394     21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
   10395     29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
   10396     27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
   10397     [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
   10398     21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
   10399     23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
   10400     21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
   10401     25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
   10402     [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
   10403     32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
   10404     30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
   10405     35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
   10406     20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
   10407     23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
   10408     20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
   10409     20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
   10410     25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
   10411     30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
   10412     28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
   10413     34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
   10414     25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
   10415     34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
   10416     [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
   10417     26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
   10418     32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
   10419     24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
   10420     33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
   10421     35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
   10422     30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
   10423     26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
   10424     22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
   10425     27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
   10426     22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
   10427     25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
   10428     31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
   10429     33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
   10430     30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
   10431     20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
   10432     [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
   10433     36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
   10434     20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
   10435     24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
   10436     36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
   10437     [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
   10438     35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
   10439     39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
   10440     23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
   10441     39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
   10442     23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
   10443     26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
   10444     26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
   10445     20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
   10446     39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
   10447     [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
   10448     29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
   10449     24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
   10450     26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
   10451     20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
   10452     35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
   10453     38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
   10454     29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
   10455     21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
   10456     38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
   10457     25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
   10458     38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
   10459     39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
   10460     [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
   10461     21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
   10462     38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
   10463     [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
   10464     27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
   10465     20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
   10466     33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
   10467     34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
   10468     [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
   10469     21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
   10470     31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
   10471     35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
   10472     32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
   10473     30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
   10474     [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
   10475     27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
   10476     21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
   10477     21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
   10478     30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
   10479     22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
   10480     38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
   10481     31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
   10482     20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
   10483     23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
   10484     26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
   10485     21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
   10486     38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
   10487     33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
   10488     [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
   10489     20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
   10490     24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
   10491     32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
   10492     21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
   10493     27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
   10494     36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
   10495     33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
   10496     24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
   10497     37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
   10498     20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
   10499     27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
   10500     28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
   10501     35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
   10502     21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
   10503     35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
   10504     21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
   10505     33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
   10506     23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
   10507     38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
   10508     26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
   10509     26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
   10510     26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
   10511     25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
   10512     21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
   10513     20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
   10514     27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
   10515     26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
   10516     24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
   10517     38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
   10518     21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
   10519     27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
   10520     26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
   10521     24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
   10522     37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
   10523     33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
   10524     20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
   10525     25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
   10526     31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
   10527     24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
   10528     [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
   10529     21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
   10530     35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
   10531     20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
   10532     31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
   10533     36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
   10534     38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
   10535     26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
   10536     36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
   10537     [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
   10538     32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
   10539     [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
   10540     22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
   10541     20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
   10542     19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
   10543     [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
   10544     22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
   10545     20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
   10546     21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
   10547     21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
   10548     {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
   10549     21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
   10550     20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
   10551     20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
   10552     20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
   10553     20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
   10554     20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
   10555     20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
   10556     20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
   10557     20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
   10558     [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
   10559     [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
   10560     20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
   10561     32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
   10562     20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
   10563     {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
   10564     {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
   10565     35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
   10566     35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
   10567     35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
   10568     {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
   10569     38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
   10570     38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
   10571     37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
   10572     37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
   10573     37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
   10574     37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
   10575     21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
   10576     20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
   10577     22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
   10578     {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
   10579     22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
   10580     22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
   10581     22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
   10582     22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
   10583     39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
   10584     33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
   10585     33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
   10586     33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
   10587     33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
   10588     33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
   10589     33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
   10590     33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
   10591     33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
   10592     {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
   10593     33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
   10594     33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
   10595     33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
   10596     33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
   10597     {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
   10598     33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
   10599     33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
   10600     29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
   10601     34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
   10602     34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
   10603     34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
   10604     [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
   10605     [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
   10606     25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
   10607     25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
   10608     25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
   10609     25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
   10610     25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
   10611     25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
   10612     21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
   10613     {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
   10614     21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
   10615     21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
   10616     21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
   10617     {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
   10618     21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
   10619     21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
   10620     {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
   10621     21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
   10622     21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
   10623     21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
   10624     21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
   10625     22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
   10626     22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
   10627     22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
   10628     22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
   10629     24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
   10630     23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
   10631     23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
   10632     23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
   10633     23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
   10634     23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
   10635     23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
   10636     24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
   10637     29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
   10638     29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
   10639     29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
   10640     29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
   10641     [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
   10642     {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
   10643     {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
   10644     24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
   10645     24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
   10646     24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
   10647     24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
   10648     24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
   10649     24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
   10650     24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
   10651     24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
   10652     38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
   10653     38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
   10654     {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
   10655     27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
   10656     27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
   10657     27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
   10658     27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
   10659     27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
   10660     27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
   10661     28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
   10662     28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
   10663     {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
   10664     28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
   10665     28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
   10666     28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
   10667     28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
   10668     28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
   10669     [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
   10670     23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
   10671     36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
   10672     36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
   10673     {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
   10674     36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
   10675     21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
   10676     33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
   10677     22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
   10678     22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
   10679     23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
   10680     23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
   10681     23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
   10682     23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
   10683     23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
   10684     {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
   10685     39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
   10686     32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
   10687     {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
   10688     {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
   10689     32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
   10690     {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
   10691     32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
   10692     [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
   10693     29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
   10694     29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
   10695     29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
   10696     29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
   10697     {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
   10698     29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
   10699     26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
   10700     26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
   10701     26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
   10702     26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
   10703     26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
   10704     26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
   10705     {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
   10706     26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
   10707     26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
   10708     27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
   10709     27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
   10710     27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
   10711     27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
   10712     27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
   10713     36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
   10714     {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
   10715     {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
   10716     25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
   10717     29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
   10718     26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
   10719     26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
   10720     26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
   10721     36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
   10722     36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
   10723     29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
   10724     25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
   10725     27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
   10726     27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
   10727     34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
   10728     32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
   10729     32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
   10730     33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
   10731     33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
   10732     {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
   10733     33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
   10734     27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
   10735     [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
   10736     26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
   10737     28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
   10738     28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
   10739     29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
   10740     29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
   10741     31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
   10742     31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
   10743     24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
   10744     24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
   10745     27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
   10746     26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
   10747     30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
   10748     30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
   10749     30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
   10750     31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
   10751     30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
   10752     30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
   10753     30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
   10754     30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
   10755     32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
   10756     30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
   10757     {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
   10758     38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
   10759     {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
   10760     {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
   10761     38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
   10762     {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
   10763     38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
   10764     {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
   10765     38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
   10766     {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
   10767     {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
   10768     {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
   10769     {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
   10770     31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
   10771     39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
   10772     40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
   10773     {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
   10774     {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
   10775     40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
   10776     30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
   10777     30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
   10778     30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
   10779     30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
   10780     30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
   10781     30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
   10782     31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
   10783     34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
   10784     35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
   10785     35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
   10786     [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
   10787     32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
   10788     32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
   10789     39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
   10790     {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
   10791     34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
   10792     34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
   10793     34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
   10794     34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
   10795     34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
   10796     34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
   10797     {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
   10798     34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
   10799     34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
   10800     34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
   10801     34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
   10802     {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
   10803     31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
   10804     31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
   10805     31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
   10806     31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
   10807     31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
   10808     31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
   10809     33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
   10810     33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
   10811     33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
   10812     35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
   10813     31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
   10814     {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
   10815     32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
   10816     32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
   10817     36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
   10818     37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
   10819     37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
   10820     {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
   10821     36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
   10822     36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
   10823     36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
   10824     36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
   10825     {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
   10826     36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
   10827     35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
   10828     35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
   10829     38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
   10830     {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
   10831     {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
   10832     37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
   10833     40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
   10834     {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
   10835     {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
   10836     {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
   10837     38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
   10838     39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
   10839     {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
   10840     39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
   10841     39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
   10842     {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
   10843     40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
   10844     40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
   10845     12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
   10846     25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
   10847     23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
   10848     32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
   10849     36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
   10850     25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
   10851     24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
   10852     35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
   10853     39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
   10854     [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
   10855     36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
   10856     31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
   10857     30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
   10858     24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
   10859     37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
   10860     27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
   10861     32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
   10862     38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
   10863     29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
   10864     38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
   10865     29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
   10866     36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
   10867     22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
   10868     39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
   10869     36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
   10870     23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
   10871     20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
   10872     39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
   10873     [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
   10874     22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
   10875     40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
   10876     25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
   10877     31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
   10878     36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
   10879     26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
   10880     38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
   10881     27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
   10882     25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
   10883     [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
   10884     28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
   10885     25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
   10886     31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
   10887     30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
   10888     31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
   10889     32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
   10890     27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
   10891     23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
   10892     34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
   10893     34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
   10894     21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
   10895     39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
   10896     32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
   10897     25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
   10898     29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
   10899     39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
   10900     27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
   10901     28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
   10902     24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
   10903     20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
   10904     39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
   10905     21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
   10906     35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
   10907     22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
   10908     40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
   10909     24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
   10910     22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
   10911     33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
   10912     30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
   10913     24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
   10914     [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
   10915     36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
   10916     22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
   10917     27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
   10918     31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
   10919     30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
   10920     32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
   10921     21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
   10922     36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
   10923     35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
   10924     24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
   10925     36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
   10926     36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
   10927     35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
   10928     35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
   10929     25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
   10930     30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
   10931     35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
   10932     32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
   10933     39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
   10934     [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
   10935     32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
   10936     31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
   10937     35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
   10938     23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
   10939     39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
   10940     35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
   10941     33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
   10942     38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
   10943     21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
   10944     21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
   10945     30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
   10946     27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
   10947     37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
   10948     35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
   10949     23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
   10950     31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
   10951     29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
   10952     39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
   10953     22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
   10954     38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
   10955     36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
   10956     36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
   10957     36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
   10958     36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
   10959     38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
   10960     25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
   10961     35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
   10962     36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
   10963     35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
   10964     28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
   10965     21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
   10966     21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
   10967     20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
   10968     33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
   10969     35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
   10970     35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
   10971     35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
   10972     35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
   10973     35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
   10974     38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
   10975     24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
   10976     22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
   10977     34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
   10978     34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
   10979     40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
   10980     34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
   10981     25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
   10982     22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
   10983     22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
   10984     22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
   10985     23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
   10986     24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
   10987     39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
   10988     39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
   10989     25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
   10990     24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
   10991     38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
   10992     38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
   10993     28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
   10994     28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
   10995     28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
   10996     23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
   10997     23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
   10998     39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
   10999     39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
   11000     {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
   11001     32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
   11002     32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
   11003     32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
   11004     32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
   11005     32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
   11006     32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
   11007     29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
   11008     27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
   11009     27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
   11010     27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
   11011     36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
   11012     36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
   11013     36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
   11014     36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
   11015     36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
   11016     35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
   11017     33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
   11018     36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
   11019     31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
   11020     30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
   11021     30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
   11022     37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
   11023     37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
   11024     37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
   11025     37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
   11026     37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
   11027     37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
   11028     37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
   11029     {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
   11030     37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
   11031     37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
   11032     37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
   11033     {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
   11034     37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
   11035     37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
   11036     40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
   11037     40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
   11038     40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
   11039     40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
   11040     30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
   11041     30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
   11042     32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
   11043     38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
   11044     34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
   11045     34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
   11046     31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
   11047     31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
   11048     36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
   11049     36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
   11050     40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
   11051     40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
   11052     31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
   11053     39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
   11054     39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
   11055     39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
   11056     39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
   11057     39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
   11058     40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
   11059     40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
   11060     22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
   11061     39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
   11062     [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
   11063     38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
   11064     31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
   11065     38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
   11066     8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
   11067     {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
   11068     {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
   11069     {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
   11070     13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
   11071     12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
   11072     {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
   11073     12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
   11074     {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
   11075     20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
   11076     20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
   11077     {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
   11078     {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
   11079     20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
   11080     {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
   11081     {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
   11082     20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
   11083     {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
   11084     {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
   11085     20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
   11086     20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
   11087     {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
   11088     20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
   11089     {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
   11090     20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
   11091     {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
   11092     {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
   11093     20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
   11094     20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
   11095     {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
   11096     {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
   11097     {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
   11098     {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
   11099     {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
   11100     {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
   11101     {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
   11102     {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
   11103     {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
   11104     {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
   11105     20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
   11106     {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
   11107     {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
   11108     20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
   11109     {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
   11110     {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
   11111     {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
   11112     20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
   11113     {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
   11114     {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
   11115     {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
   11116     {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
   11117     {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
   11118     {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
   11119     21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
   11120     {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
   11121     {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
   11122     {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
   11123     21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
   11124     {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
   11125     {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
   11126     {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
   11127     {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
   11128     {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
   11129     {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
   11130     {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
   11131     {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
   11132     {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
   11133     21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
   11134     {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
   11135     {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
   11136     {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
   11137     {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
   11138     {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
   11139     21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
   11140     {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
   11141     21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
   11142     21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
   11143     21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
   11144     {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
   11145     {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
   11146     {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
   11147     21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
   11148     {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
   11149     {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
   11150     21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
   11151     {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
   11152     {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
   11153     {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
   11154     {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
   11155     {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
   11156     {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
   11157     {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
   11158     21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
   11159     21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
   11160     {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
   11161     {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
   11162     {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
   11163     {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
   11164     {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
   11165     {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
   11166     22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
   11167     22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
   11168     {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
   11169     {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
   11170     22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
   11171     {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
   11172     {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
   11173     22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
   11174     {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
   11175     {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
   11176     {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
   11177     {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
   11178     {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
   11179     {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
   11180     22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
   11181     {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
   11182     22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
   11183     {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
   11184     {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
   11185     {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
   11186     {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
   11187     {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
   11188     {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
   11189     {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
   11190     {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
   11191     {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
   11192     {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
   11193     {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
   11194     {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
   11195     22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
   11196     {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
   11197     {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
   11198     {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
   11199     {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
   11200     {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
   11201     22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
   11202     22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
   11203     22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
   11204     {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
   11205     {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
   11206     {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
   11207     {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
   11208     23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
   11209     {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
   11210     {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
   11211     {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
   11212     {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
   11213     {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
   11214     {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
   11215     {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
   11216     {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
   11217     23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
   11218     {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
   11219     {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
   11220     {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
   11221     {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
   11222     {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
   11223     {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
   11224     {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
   11225     {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
   11226     {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
   11227     {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
   11228     {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
   11229     {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
   11230     23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
   11231     {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
   11232     23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
   11233     {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
   11234     {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
   11235     23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
   11236     {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
   11237     {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
   11238     {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
   11239     {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
   11240     {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
   11241     23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
   11242     {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
   11243     {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
   11244     {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
   11245     {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
   11246     {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
   11247     {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
   11248     {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
   11249     {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
   11250     23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
   11251     24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
   11252     {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
   11253     24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
   11254     {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
   11255     {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
   11256     {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
   11257     {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
   11258     {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
   11259     24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
   11260     24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
   11261     {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
   11262     24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
   11263     {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
   11264     {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
   11265     {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
   11266     {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
   11267     24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
   11268     {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
   11269     24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
   11270     24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
   11271     {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
   11272     {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
   11273     {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
   11274     {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
   11275     {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
   11276     {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
   11277     {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
   11278     {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
   11279     {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
   11280     {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
   11281     {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
   11282     {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
   11283     {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
   11284     {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
   11285     {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
   11286     {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
   11287     {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
   11288     {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
   11289     {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
   11290     {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
   11291     {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
   11292     {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
   11293     {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
   11294     {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
   11295     {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
   11296     {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
   11297     {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
   11298     {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
   11299     {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
   11300     25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
   11301     25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
   11302     {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
   11303     {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
   11304     {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
   11305     25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
   11306     {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
   11307     {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
   11308     {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
   11309     {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
   11310     {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
   11311     {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
   11312     {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
   11313     {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
   11314     {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
   11315     {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
   11316     {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
   11317     25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
   11318     25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
   11319     25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
   11320     {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
   11321     {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
   11322     {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
   11323     {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
   11324     {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
   11325     {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
   11326     {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
   11327     {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
   11328     {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
   11329     25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
   11330     {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
   11331     25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
   11332     25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
   11333     {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
   11334     {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
   11335     {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
   11336     {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
   11337     {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
   11338     25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
   11339     {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
   11340     {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
   11341     26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
   11342     {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
   11343     {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
   11344     {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
   11345     {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
   11346     {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
   11347     {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
   11348     {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
   11349     {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
   11350     {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
   11351     26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
   11352     {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
   11353     {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
   11354     {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
   11355     {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
   11356     {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
   11357     {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
   11358     {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
   11359     26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
   11360     {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
   11361     {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
   11362     {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
   11363     26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
   11364     {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
   11365     {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
   11366     26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
   11367     {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
   11368     26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
   11369     {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
   11370     26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
   11371     {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
   11372     26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
   11373     {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
   11374     26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
   11375     {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
   11376     {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
   11377     {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
   11378     {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
   11379     26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
   11380     {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
   11381     {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
   11382     {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
   11383     {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
   11384     {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
   11385     {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
   11386     {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
   11387     {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
   11388     {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
   11389     {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
   11390     27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
   11391     {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
   11392     {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
   11393     {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
   11394     {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
   11395     {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
   11396     27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
   11397     {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
   11398     {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
   11399     {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
   11400     {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
   11401     {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
   11402     27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
   11403     {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
   11404     {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
   11405     {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
   11406     {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
   11407     27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
   11408     {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
   11409     {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
   11410     27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
   11411     {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
   11412     27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
   11413     {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
   11414     {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
   11415     {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
   11416     {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
   11417     27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
   11418     {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
   11419     27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
   11420     {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
   11421     {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
   11422     27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
   11423     27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
   11424     {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
   11425     {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
   11426     {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
   11427     {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
   11428     {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
   11429     {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
   11430     {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
   11431     {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
   11432     {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
   11433     27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
   11434     {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
   11435     {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
   11436     28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
   11437     28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
   11438     {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
   11439     {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
   11440     {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
   11441     28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
   11442     {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
   11443     {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
   11444     28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
   11445     {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
   11446     {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
   11447     {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
   11448     {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
   11449     {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
   11450     28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
   11451     {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
   11452     {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
   11453     {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
   11454     {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
   11455     {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
   11456     {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
   11457     {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
   11458     {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
   11459     {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
   11460     {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
   11461     {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
   11462     {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
   11463     {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
   11464     {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
   11465     {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
   11466     {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
   11467     {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
   11468     28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
   11469     {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
   11470     {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
   11471     {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
   11472     {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
   11473     {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
   11474     28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
   11475     {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
   11476     {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
   11477     {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
   11478     28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
   11479     {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
   11480     {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
   11481     29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
   11482     29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
   11483     29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
   11484     {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
   11485     {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
   11486     29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
   11487     {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
   11488     {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
   11489     {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
   11490     29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
   11491     {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
   11492     {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
   11493     {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
   11494     29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
   11495     {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
   11496     {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
   11497     {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
   11498     29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
   11499     {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
   11500     29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
   11501     {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
   11502     {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
   11503     {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
   11504     {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
   11505     {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
   11506     {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
   11507     29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
   11508     29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
   11509     {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
   11510     29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
   11511     {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
   11512     {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
   11513     {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
   11514     29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
   11515     {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
   11516     {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
   11517     {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
   11518     {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
   11519     {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
   11520     {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
   11521     {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
   11522     {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
   11523     {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
   11524     {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
   11525     {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
   11526     {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
   11527     30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
   11528     {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
   11529     {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
   11530     {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
   11531     {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
   11532     30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
   11533     {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
   11534     {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
   11535     {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
   11536     {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
   11537     {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
   11538     {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
   11539     {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
   11540     {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
   11541     {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
   11542     30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
   11543     {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
   11544     {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
   11545     30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
   11546     {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
   11547     {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
   11548     30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
   11549     {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
   11550     {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
   11551     {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
   11552     {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
   11553     30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
   11554     {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
   11555     {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
   11556     {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
   11557     {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
   11558     {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
   11559     {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
   11560     {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
   11561     {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
   11562     {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
   11563     30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
   11564     {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
   11565     {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
   11566     {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
   11567     {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
   11568     {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
   11569     {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
   11570     {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
   11571     {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
   11572     {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
   11573     {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
   11574     {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
   11575     {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
   11576     {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
   11577     {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
   11578     {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
   11579     {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
   11580     31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
   11581     {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
   11582     {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
   11583     31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
   11584     31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
   11585     {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
   11586     31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
   11587     {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
   11588     {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
   11589     31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
   11590     31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
   11591     {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
   11592     {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
   11593     31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
   11594     {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
   11595     {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
   11596     {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
   11597     {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
   11598     {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
   11599     {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
   11600     {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
   11601     31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
   11602     {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
   11603     {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
   11604     {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
   11605     {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
   11606     {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
   11607     31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
   11608     {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
   11609     31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
   11610     {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
   11611     {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
   11612     31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
   11613     {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
   11614     {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
   11615     31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
   11616     {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
   11617     {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
   11618     31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
   11619     31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
   11620     {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
   11621     {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
   11622     32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
   11623     {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
   11624     {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
   11625     {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
   11626     {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
   11627     {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
   11628     {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
   11629     32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
   11630     32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
   11631     {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
   11632     {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
   11633     {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
   11634     {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
   11635     {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
   11636     32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
   11637     {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
   11638     32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
   11639     {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
   11640     32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
   11641     {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
   11642     {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
   11643     {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
   11644     {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
   11645     {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
   11646     {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
   11647     32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
   11648     {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
   11649     {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
   11650     {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
   11651     {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
   11652     {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
   11653     {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
   11654     {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
   11655     {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
   11656     {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
   11657     32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
   11658     {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
   11659     {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
   11660     {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
   11661     33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
   11662     33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
   11663     33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
   11664     {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
   11665     {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
   11666     {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
   11667     {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
   11668     {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
   11669     {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
   11670     {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
   11671     {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
   11672     {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
   11673     {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
   11674     {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
   11675     {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
   11676     {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
   11677     33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
   11678     33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
   11679     {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
   11680     33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
   11681     {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
   11682     33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
   11683     {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
   11684     {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
   11685     {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
   11686     {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
   11687     {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
   11688     {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
   11689     {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
   11690     {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
   11691     {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
   11692     {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
   11693     {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
   11694     {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
   11695     {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
   11696     {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
   11697     33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
   11698     {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
   11699     {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
   11700     {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
   11701     {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
   11702     {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
   11703     {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
   11704     {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
   11705     {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
   11706     {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
   11707     {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
   11708     {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
   11709     {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
   11710     34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
   11711     {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
   11712     {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
   11713     34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
   11714     {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
   11715     {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
   11716     {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
   11717     34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
   11718     {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
   11719     {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
   11720     {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
   11721     34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
   11722     {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
   11723     {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
   11724     {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
   11725     {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
   11726     {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
   11727     {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
   11728     34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
   11729     {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
   11730     {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
   11731     34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
   11732     {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
   11733     {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
   11734     {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
   11735     {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
   11736     {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
   11737     {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
   11738     34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
   11739     {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
   11740     {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
   11741     {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
   11742     {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
   11743     {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
   11744     34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
   11745     {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
   11746     {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
   11747     {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
   11748     {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
   11749     {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
   11750     35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
   11751     {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
   11752     {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
   11753     {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
   11754     {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
   11755     {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
   11756     {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
   11757     {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
   11758     {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
   11759     {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
   11760     {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
   11761     {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
   11762     {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
   11763     {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
   11764     {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
   11765     {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
   11766     {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
   11767     {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
   11768     {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
   11769     {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
   11770     {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
   11771     {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
   11772     35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
   11773     {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
   11774     {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
   11775     {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
   11776     {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
   11777     35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
   11778     {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
   11779     {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
   11780     35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
   11781     35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
   11782     {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
   11783     {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
   11784     {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
   11785     {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
   11786     {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
   11787     35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
   11788     35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
   11789     {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
   11790     {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
   11791     {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
   11792     {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
   11793     {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
   11794     {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
   11795     {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
   11796     {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
   11797     36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
   11798     {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
   11799     {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
   11800     {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
   11801     {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
   11802     {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
   11803     {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
   11804     {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
   11805     36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
   11806     {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
   11807     {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
   11808     {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
   11809     {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
   11810     36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
   11811     36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
   11812     36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
   11813     {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
   11814     {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
   11815     {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
   11816     {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
   11817     {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
   11818     {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
   11819     {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
   11820     {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
   11821     36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
   11822     {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
   11823     {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
   11824     {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
   11825     36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
   11826     {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
   11827     36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
   11828     {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
   11829     {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
   11830     36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
   11831     36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
   11832     {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
   11833     {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
   11834     37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
   11835     {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
   11836     {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
   11837     37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
   11838     {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
   11839     37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
   11840     {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
   11841     {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
   11842     {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
   11843     37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
   11844     37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
   11845     {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
   11846     {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
   11847     {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
   11848     {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
   11849     {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
   11850     {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
   11851     {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
   11852     {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
   11853     37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
   11854     {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
   11855     37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
   11856     {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
   11857     {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
   11858     {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
   11859     {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
   11860     37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
   11861     37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
   11862     {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
   11863     {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
   11864     {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
   11865     {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
   11866     {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
   11867     {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
   11868     {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
   11869     {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
   11870     37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
   11871     {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
   11872     {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
   11873     {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
   11874     {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
   11875     {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
   11876     {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
   11877     37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
   11878     {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
   11879     {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
   11880     {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
   11881     38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
   11882     38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
   11883     {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
   11884     {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
   11885     {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
   11886     {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
   11887     {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
   11888     {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
   11889     {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
   11890     {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
   11891     38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
   11892     {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
   11893     38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
   11894     38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
   11895     {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
   11896     38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
   11897     {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
   11898     {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
   11899     {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
   11900     {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
   11901     {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
   11902     38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
   11903     {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
   11904     {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
   11905     {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
   11906     {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
   11907     {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
   11908     {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
   11909     {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
   11910     {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
   11911     {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
   11912     38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
   11913     {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
   11914     {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
   11915     {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
   11916     39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
   11917     {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
   11918     39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
   11919     {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
   11920     {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
   11921     {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
   11922     {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
   11923     {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
   11924     {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
   11925     {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
   11926     {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
   11927     39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
   11928     39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
   11929     {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
   11930     {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
   11931     {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
   11932     {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
   11933     39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
   11934     {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
   11935     {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
   11936     39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
   11937     {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
   11938     {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
   11939     {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
   11940     {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
   11941     {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
   11942     {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
   11943     39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
   11944     {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
   11945     {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
   11946     {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
   11947     {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
   11948     {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
   11949     {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
   11950     {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
   11951     {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
   11952     {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
   11953     39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
   11954     {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
   11955     {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
   11956     {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
   11957     40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
   11958     {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
   11959     {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
   11960     {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
   11961     40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
   11962     {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
   11963     {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
   11964     {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
   11965     {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
   11966     {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
   11967     {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
   11968     {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
   11969     {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
   11970     40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
   11971     {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
   11972     {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
   11973     {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
   11974     {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
   11975     {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
   11976     40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
   11977     {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
   11978     {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
   11979     {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
   11980     40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
   11981     {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
   11982     {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
   11983     {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
   11984     {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
   11985     {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
   11986     {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
   11987     {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
   11988     {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
   11989     [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
   11990     11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
   11991     59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
   11992     11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
   11993     {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
   11994     18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
   11995     18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
   11996     18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
   11997     19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
   11998     {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
   11999     {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
   12000     {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
   12001     {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
   12002     {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
   12003     {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
   12004     {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
   12005     {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
   12006     {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
   12007     {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
   12008     {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
   12009     {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
   12010     {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
   12011     {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
   12012     {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
   12013     {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
   12014     {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
   12015     {f: 7, c: 19887}]
   12016 };
   12017 
   12018 
   12019 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   12020 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   12021 
   12022 'use strict';
   12023 
   12024 var ColorSpace = (function ColorSpaceClosure() {
   12025   // Constructor should define this.numComps, this.defaultColor, this.name
   12026   function ColorSpace() {
   12027     error('should not call ColorSpace constructor');
   12028   }
   12029 
   12030   ColorSpace.prototype = {
   12031     // Input: array of size numComps representing color component values
   12032     // Output: array of rgb values, each value ranging from [0.1]
   12033     getRgb: function ColorSpace_getRgb(color) {
   12034       error('Should not call ColorSpace.getRgb: ' + color);
   12035     },
   12036     // Input: Uint8Array of component values, each value scaled to [0,255]
   12037     // Output: Uint8Array of rgb values, each value scaled to [0,255]
   12038     getRgbBuffer: function ColorSpace_getRgbBuffer(input) {
   12039       error('Should not call ColorSpace.getRgbBuffer: ' + input);
   12040     }
   12041   };
   12042 
   12043   ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
   12044     var IR = ColorSpace.parseToIR(cs, xref, res);
   12045     if (IR instanceof AlternateCS)
   12046       return IR;
   12047 
   12048     return ColorSpace.fromIR(IR);
   12049   };
   12050 
   12051   ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
   12052     var name = isArray(IR) ? IR[0] : IR;
   12053 
   12054     switch (name) {
   12055       case 'DeviceGrayCS':
   12056         return new DeviceGrayCS();
   12057       case 'DeviceRgbCS':
   12058         return new DeviceRgbCS();
   12059       case 'DeviceCmykCS':
   12060         return new DeviceCmykCS();
   12061       case 'PatternCS':
   12062         var basePatternCS = IR[1];
   12063         if (basePatternCS)
   12064           basePatternCS = ColorSpace.fromIR(basePatternCS);
   12065         return new PatternCS(basePatternCS);
   12066       case 'IndexedCS':
   12067         var baseIndexedCS = IR[1];
   12068         var hiVal = IR[2];
   12069         var lookup = IR[3];
   12070         return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
   12071       case 'AlternateCS':
   12072         var numComps = IR[1];
   12073         var alt = IR[2];
   12074         var tintFnIR = IR[3];
   12075 
   12076         return new AlternateCS(numComps, ColorSpace.fromIR(alt),
   12077                                 PDFFunction.fromIR(tintFnIR));
   12078       case 'LabCS':
   12079         var whitePoint = IR[1].WhitePoint;
   12080         var blackPoint = IR[1].BlackPoint;
   12081         var range = IR[1].Range;
   12082         return new LabCS(whitePoint, blackPoint, range);
   12083       default:
   12084         error('Unkown name ' + name);
   12085     }
   12086     return null;
   12087   };
   12088 
   12089   ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
   12090     if (isName(cs)) {
   12091       var colorSpaces = res.get('ColorSpace');
   12092       if (isDict(colorSpaces)) {
   12093         var refcs = colorSpaces.get(cs.name);
   12094         if (refcs)
   12095           cs = refcs;
   12096       }
   12097     }
   12098 
   12099     cs = xref.fetchIfRef(cs);
   12100     var mode;
   12101 
   12102     if (isName(cs)) {
   12103       mode = cs.name;
   12104       this.mode = mode;
   12105 
   12106       switch (mode) {
   12107         case 'DeviceGray':
   12108         case 'G':
   12109           return 'DeviceGrayCS';
   12110         case 'DeviceRGB':
   12111         case 'RGB':
   12112           return 'DeviceRgbCS';
   12113         case 'DeviceCMYK':
   12114         case 'CMYK':
   12115           return 'DeviceCmykCS';
   12116         case 'Pattern':
   12117           return ['PatternCS', null];
   12118         default:
   12119           error('unrecognized colorspace ' + mode);
   12120       }
   12121     } else if (isArray(cs)) {
   12122       mode = cs[0].name;
   12123       this.mode = mode;
   12124 
   12125       switch (mode) {
   12126         case 'DeviceGray':
   12127         case 'G':
   12128           return 'DeviceGrayCS';
   12129         case 'DeviceRGB':
   12130         case 'RGB':
   12131           return 'DeviceRgbCS';
   12132         case 'DeviceCMYK':
   12133         case 'CMYK':
   12134           return 'DeviceCmykCS';
   12135         case 'CalGray':
   12136           return 'DeviceGrayCS';
   12137         case 'CalRGB':
   12138           return 'DeviceRgbCS';
   12139         case 'ICCBased':
   12140           var stream = xref.fetchIfRef(cs[1]);
   12141           var dict = stream.dict;
   12142           var numComps = dict.get('N');
   12143           if (numComps == 1)
   12144             return 'DeviceGrayCS';
   12145           if (numComps == 3)
   12146             return 'DeviceRgbCS';
   12147           if (numComps == 4)
   12148             return 'DeviceCmykCS';
   12149           break;
   12150         case 'Pattern':
   12151           var basePatternCS = cs[1];
   12152           if (basePatternCS)
   12153             basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
   12154           return ['PatternCS', basePatternCS];
   12155         case 'Indexed':
   12156         case 'I':
   12157           var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
   12158           var hiVal = cs[2] + 1;
   12159           var lookup = xref.fetchIfRef(cs[3]);
   12160           return ['IndexedCS', baseIndexedCS, hiVal, lookup];
   12161         case 'Separation':
   12162         case 'DeviceN':
   12163           var name = cs[1];
   12164           var numComps = 1;
   12165           if (isName(name))
   12166             numComps = 1;
   12167           else if (isArray(name))
   12168             numComps = name.length;
   12169           var alt = ColorSpace.parseToIR(cs[2], xref, res);
   12170           var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
   12171           return ['AlternateCS', numComps, alt, tintFnIR];
   12172         case 'Lab':
   12173           var params = cs[1].getAll();
   12174           return ['LabCS', params];
   12175         default:
   12176           error('unimplemented color space object "' + mode + '"');
   12177       }
   12178     } else {
   12179       error('unrecognized color space object: "' + cs + '"');
   12180     }
   12181     return null;
   12182   };
   12183   /**
   12184    * Checks if a decode map matches the default decode map for a color space.
   12185    * This handles the general decode maps where there are two values per
   12186    * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
   12187    * This does not handle Lab, Indexed, or Pattern decode maps since they are
   12188    * slightly different.
   12189    * @param {Array} decode Decode map (usually from an image).
   12190    * @param {Number} n Number of components the color space has.
   12191    */
   12192   ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
   12193     if (!decode)
   12194       return true;
   12195 
   12196     if (n * 2 !== decode.length) {
   12197       warning('The decode map is not the correct length');
   12198       return true;
   12199     }
   12200     for (var i = 0, ii = decode.length; i < ii; i += 2) {
   12201       if (decode[i] != 0 || decode[i + 1] != 1)
   12202         return false;
   12203     }
   12204     return true;
   12205   };
   12206 
   12207   return ColorSpace;
   12208 })();
   12209 
   12210 /**
   12211  * Alternate color space handles both Separation and DeviceN color spaces.  A
   12212  * Separation color space is actually just a DeviceN with one color component.
   12213  * Both color spaces use a tinting function to convert colors to a base color
   12214  * space.
   12215  */
   12216 var AlternateCS = (function AlternateCSClosure() {
   12217   function AlternateCS(numComps, base, tintFn) {
   12218     this.name = 'Alternate';
   12219     this.numComps = numComps;
   12220     this.defaultColor = [];
   12221     for (var i = 0; i < numComps; ++i)
   12222       this.defaultColor.push(1);
   12223     this.base = base;
   12224     this.tintFn = tintFn;
   12225   }
   12226 
   12227   AlternateCS.prototype = {
   12228     getRgb: function AlternateCS_getRgb(color) {
   12229       var tinted = this.tintFn(color);
   12230       return this.base.getRgb(tinted);
   12231     },
   12232     getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) {
   12233       var tintFn = this.tintFn;
   12234       var base = this.base;
   12235       var scale = 1 / ((1 << bits) - 1);
   12236       var length = input.length;
   12237       var pos = 0;
   12238       var baseNumComps = base.numComps;
   12239       var baseBuf = new Uint8Array(baseNumComps * length);
   12240       var numComps = this.numComps;
   12241       var scaled = [];
   12242 
   12243       for (var i = 0; i < length; i += numComps) {
   12244         for (var z = 0; z < numComps; ++z)
   12245           scaled[z] = input[i + z] * scale;
   12246 
   12247         var tinted = tintFn(scaled);
   12248         for (var j = 0; j < baseNumComps; ++j)
   12249           baseBuf[pos++] = 255 * tinted[j];
   12250       }
   12251       return base.getRgbBuffer(baseBuf, 8);
   12252     },
   12253     isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
   12254       return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
   12255     }
   12256   };
   12257 
   12258   return AlternateCS;
   12259 })();
   12260 
   12261 var PatternCS = (function PatternCSClosure() {
   12262   function PatternCS(baseCS) {
   12263     this.name = 'Pattern';
   12264     this.base = baseCS;
   12265   }
   12266   PatternCS.prototype = {};
   12267 
   12268   return PatternCS;
   12269 })();
   12270 
   12271 var IndexedCS = (function IndexedCSClosure() {
   12272   function IndexedCS(base, highVal, lookup) {
   12273     this.name = 'Indexed';
   12274     this.numComps = 1;
   12275     this.defaultColor = [0];
   12276     this.base = base;
   12277     this.highVal = highVal;
   12278 
   12279     var baseNumComps = base.numComps;
   12280     var length = baseNumComps * highVal;
   12281     var lookupArray = new Uint8Array(length);
   12282 
   12283     if (isStream(lookup)) {
   12284       var bytes = lookup.getBytes(length);
   12285       lookupArray.set(bytes);
   12286     } else if (isString(lookup)) {
   12287       for (var i = 0; i < length; ++i)
   12288         lookupArray[i] = lookup.charCodeAt(i);
   12289     } else {
   12290       error('Unrecognized lookup table: ' + lookup);
   12291     }
   12292     this.lookup = lookupArray;
   12293   }
   12294 
   12295   IndexedCS.prototype = {
   12296     getRgb: function IndexedCS_getRgb(color) {
   12297       var numComps = this.base.numComps;
   12298       var start = color[0] * numComps;
   12299       var c = [];
   12300 
   12301       for (var i = start, ii = start + numComps; i < ii; ++i)
   12302         c.push(this.lookup[i]);
   12303 
   12304       return this.base.getRgb(c);
   12305     },
   12306     getRgbBuffer: function IndexedCS_getRgbBuffer(input) {
   12307       var base = this.base;
   12308       var numComps = base.numComps;
   12309       var lookup = this.lookup;
   12310       var length = input.length;
   12311       var baseBuf = new Uint8Array(length * numComps);
   12312       var baseBufPos = 0;
   12313 
   12314       for (var i = 0; i < length; ++i) {
   12315         var lookupPos = input[i] * numComps;
   12316         for (var j = 0; j < numComps; ++j) {
   12317           baseBuf[baseBufPos++] = lookup[lookupPos + j];
   12318         }
   12319       }
   12320 
   12321       return base.getRgbBuffer(baseBuf, 8);
   12322     },
   12323     isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
   12324       // indexed color maps shouldn't be changed
   12325       return true;
   12326     }
   12327   };
   12328   return IndexedCS;
   12329 })();
   12330 
   12331 var DeviceGrayCS = (function DeviceGrayCSClosure() {
   12332   function DeviceGrayCS() {
   12333     this.name = 'DeviceGray';
   12334     this.numComps = 1;
   12335     this.defaultColor = [0];
   12336   }
   12337 
   12338   DeviceGrayCS.prototype = {
   12339     getRgb: function DeviceGrayCS_getRgb(color) {
   12340       var c = color[0];
   12341       return [c, c, c];
   12342     },
   12343     getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) {
   12344       var scale = 255 / ((1 << bits) - 1);
   12345       var length = input.length;
   12346       var rgbBuf = new Uint8Array(length * 3);
   12347       for (var i = 0, j = 0; i < length; ++i) {
   12348         var c = (scale * input[i]) | 0;
   12349         rgbBuf[j++] = c;
   12350         rgbBuf[j++] = c;
   12351         rgbBuf[j++] = c;
   12352       }
   12353       return rgbBuf;
   12354     },
   12355     isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
   12356       return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
   12357     }
   12358   };
   12359   return DeviceGrayCS;
   12360 })();
   12361 
   12362 var DeviceRgbCS = (function DeviceRgbCSClosure() {
   12363   function DeviceRgbCS() {
   12364     this.name = 'DeviceRGB';
   12365     this.numComps = 3;
   12366     this.defaultColor = [0, 0, 0];
   12367   }
   12368   DeviceRgbCS.prototype = {
   12369     getRgb: function DeviceRgbCS_getRgb(color) {
   12370       return color;
   12371     },
   12372     getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) {
   12373       if (bits == 8)
   12374         return input;
   12375       var scale = 255 / ((1 << bits) - 1);
   12376       var i, length = input.length;
   12377       var rgbBuf = new Uint8Array(length);
   12378       for (i = 0; i < length; ++i)
   12379         rgbBuf[i] = (scale * input[i]) | 0;
   12380       return rgbBuf;
   12381     },
   12382     isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
   12383       return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
   12384     }
   12385   };
   12386   return DeviceRgbCS;
   12387 })();
   12388 
   12389 var DeviceCmykCS = (function DeviceCmykCSClosure() {
   12390   function DeviceCmykCS() {
   12391     this.name = 'DeviceCMYK';
   12392     this.numComps = 4;
   12393     this.defaultColor = [0, 0, 0, 1];
   12394   }
   12395   DeviceCmykCS.prototype = {
   12396     getRgb: function DeviceCmykCS_getRgb(color) {
   12397       var c = color[0], m = color[1], y = color[2], k = color[3];
   12398 
   12399       // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14
   12400       c = (c * (1 - k) + k);
   12401       m = (m * (1 - k) + k);
   12402       y = (y * (1 - k) + k);
   12403 
   12404       // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12
   12405       var r = (1 - c);
   12406       var g = (1 - m);
   12407       var b = (1 - y);
   12408 
   12409       return [r, g, b];
   12410     },
   12411     getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) {
   12412       var scale = 1 / ((1 << bits) - 1);
   12413       var length = colorBuf.length / 4;
   12414       var rgbBuf = new Uint8Array(length * 3);
   12415       var rgbBufPos = 0;
   12416       var colorBufPos = 0;
   12417 
   12418       for (var i = 0; i < length; i++) {
   12419         var cmyk = [];
   12420         for (var j = 0; j < 4; ++j)
   12421           cmyk.push(scale * colorBuf[colorBufPos++]);
   12422 
   12423         var rgb = this.getRgb(cmyk);
   12424         for (var j = 0; j < 3; ++j)
   12425           rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255);
   12426       }
   12427 
   12428       return rgbBuf;
   12429     },
   12430     isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
   12431       return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
   12432     }
   12433   };
   12434 
   12435   return DeviceCmykCS;
   12436 })();
   12437 
   12438 //
   12439 // LabCS: Based on "PDF Reference, Sixth Ed", p.250
   12440 //
   12441 var LabCS = (function LabCSClosure() {
   12442   function LabCS(whitePoint, blackPoint, range) {
   12443     this.name = 'Lab';
   12444     this.numComps = 3;
   12445     this.defaultColor = [0, 0, 0];
   12446 
   12447     if (!whitePoint)
   12448       error('WhitePoint missing - required for color space Lab');
   12449     blackPoint = blackPoint || [0, 0, 0];
   12450     range = range || [-100, 100, -100, 100];
   12451 
   12452     // Translate args to spec variables
   12453     this.XW = whitePoint[0];
   12454     this.YW = whitePoint[1];
   12455     this.ZW = whitePoint[2];
   12456     this.amin = range[0];
   12457     this.amax = range[1];
   12458     this.bmin = range[2];
   12459     this.bmax = range[3];
   12460 
   12461     // These are here just for completeness - the spec doesn't offer any
   12462     // formulas that use BlackPoint in Lab
   12463     this.XB = blackPoint[0];
   12464     this.YB = blackPoint[1];
   12465     this.ZB = blackPoint[2];
   12466 
   12467     // Validate vars as per spec
   12468     if (this.XW < 0 || this.ZW < 0 || this.YW !== 1)
   12469       error('Invalid WhitePoint components, no fallback available');
   12470 
   12471     if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
   12472       warn('Invalid BlackPoint, falling back to default');
   12473       this.XB = this.YB = this.ZB = 0;
   12474     }
   12475 
   12476     if (this.amin > this.amax || this.bmin > this.bmax) {
   12477       warn('Invalid Range, falling back to defaults');
   12478       this.amin = -100;
   12479       this.amax = 100;
   12480       this.bmin = -100;
   12481       this.bmax = 100;
   12482     }
   12483   };
   12484 
   12485   // Function g(x) from spec
   12486   function g(x) {
   12487     if (x >= 6 / 29)
   12488       return x * x * x;
   12489     else
   12490       return (108 / 841) * (x - 4 / 29);
   12491   }
   12492 
   12493   LabCS.prototype = {
   12494     getRgb: function LabCS_getRgb(color) {
   12495       // Ls,as,bs <---> L*,a*,b* in the spec
   12496       var Ls = color[0], as = color[1], bs = color[2];
   12497 
   12498       // Adjust limits of 'as' and 'bs'
   12499       as = as > this.amax ? this.amax : as;
   12500       as = as < this.amin ? this.amin : as;
   12501       bs = bs > this.bmax ? this.bmax : bs;
   12502       bs = bs < this.bmin ? this.bmin : bs;
   12503 
   12504       // Computes intermediate variables X,Y,Z as per spec
   12505       var M = (Ls + 16) / 116;
   12506       var L = M + (as / 500);
   12507       var N = M - (bs / 200);
   12508       var X = this.XW * g(L);
   12509       var Y = this.YW * g(M);
   12510       var Z = this.ZW * g(N);
   12511 
   12512       // XYZ to RGB 3x3 matrix, from:
   12513       // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18
   12514       var XYZtoRGB = [3.240479, -1.537150, -0.498535,
   12515                       -0.969256, 1.875992, 0.041556,
   12516                       0.055648, -0.204043, 1.057311];
   12517 
   12518       return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]);
   12519     },
   12520     getRgbBuffer: function LabCS_getRgbBuffer(input, bits) {
   12521       if (bits == 8)
   12522         return input;
   12523       var scale = 255 / ((1 << bits) - 1);
   12524       var i, length = input.length / 3;
   12525       var rgbBuf = new Uint8Array(length);
   12526 
   12527       var j = 0;
   12528       for (i = 0; i < length; ++i) {
   12529         // Convert L*, a*, s* into RGB
   12530         var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]);
   12531         rgbBuf[j++] = rgb[0];
   12532         rgbBuf[j++] = rgb[1];
   12533         rgbBuf[j++] = rgb[2];
   12534       }
   12535 
   12536       return rgbBuf;
   12537     },
   12538     isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
   12539       // From Table 90 in Adobe's:
   12540       // "Document management - Portable document format", 1st ed, 2008
   12541       if (decodeMap[0] === 0 && decodeMap[1] === 100 &&
   12542           decodeMap[2] === this.amin && decodeMap[3] === this.amax &&
   12543           decodeMap[4] === this.bmin && decodeMap[5] === this.bmax)
   12544         return true;
   12545       else
   12546         return false;
   12547     }
   12548   };
   12549   return LabCS;
   12550 })();
   12551 
   12552 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   12553 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   12554 
   12555 'use strict';
   12556 
   12557 var ARCFourCipher = (function ARCFourCipherClosure() {
   12558   function ARCFourCipher(key) {
   12559     this.a = 0;
   12560     this.b = 0;
   12561     var s = new Uint8Array(256);
   12562     var i, j = 0, tmp, keyLength = key.length;
   12563     for (i = 0; i < 256; ++i)
   12564       s[i] = i;
   12565     for (i = 0; i < 256; ++i) {
   12566       tmp = s[i];
   12567       j = (j + tmp + key[i % keyLength]) & 0xFF;
   12568       s[i] = s[j];
   12569       s[j] = tmp;
   12570     }
   12571     this.s = s;
   12572   }
   12573 
   12574   ARCFourCipher.prototype = {
   12575     encryptBlock: function ARCFourCipher_encryptBlock(data) {
   12576       var i, n = data.length, tmp, tmp2;
   12577       var a = this.a, b = this.b, s = this.s;
   12578       var output = new Uint8Array(n);
   12579       for (i = 0; i < n; ++i) {
   12580         a = (a + 1) & 0xFF;
   12581         tmp = s[a];
   12582         b = (b + tmp) & 0xFF;
   12583         tmp2 = s[b];
   12584         s[a] = tmp2;
   12585         s[b] = tmp;
   12586         output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
   12587       }
   12588       this.a = a;
   12589       this.b = b;
   12590       return output;
   12591     }
   12592   };
   12593   ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
   12594 
   12595   return ARCFourCipher;
   12596 })();
   12597 
   12598 var calculateMD5 = (function calculateMD5Closure() {
   12599   var r = new Uint8Array([
   12600     7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
   12601     5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
   12602     4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
   12603     6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
   12604 
   12605   var k = new Int32Array([
   12606     -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
   12607     -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
   12608     1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
   12609     643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
   12610     568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
   12611     1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
   12612     -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
   12613     -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
   12614     -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
   12615     -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
   12616     -145523070, -1120210379, 718787259, -343485551]);
   12617 
   12618   function hash(data, offset, length) {
   12619     var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
   12620     // pre-processing
   12621     var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
   12622     var padded = new Uint8Array(paddedLength);
   12623     var i, j, n;
   12624     for (i = 0; i < length; ++i)
   12625       padded[i] = data[offset++];
   12626     padded[i++] = 0x80;
   12627     n = paddedLength - 8;
   12628     while (i < n)
   12629       padded[i++] = 0;
   12630     padded[i++] = (length << 3) & 0xFF;
   12631     padded[i++] = (length >> 5) & 0xFF;
   12632     padded[i++] = (length >> 13) & 0xFF;
   12633     padded[i++] = (length >> 21) & 0xFF;
   12634     padded[i++] = (length >>> 29) & 0xFF;
   12635     padded[i++] = 0;
   12636     padded[i++] = 0;
   12637     padded[i++] = 0;
   12638     // chunking
   12639     // TODO ArrayBuffer ?
   12640     var w = new Int32Array(16);
   12641     for (i = 0; i < paddedLength;) {
   12642       for (j = 0; j < 16; ++j, i += 4) {
   12643         w[j] = (padded[i] | (padded[i + 1] << 8) |
   12644                 (padded[i + 2] << 16) | (padded[i + 3] << 24));
   12645       }
   12646       var a = h0, b = h1, c = h2, d = h3, f, g;
   12647       for (j = 0; j < 64; ++j) {
   12648         if (j < 16) {
   12649           f = (b & c) | ((~b) & d);
   12650           g = j;
   12651         } else if (j < 32) {
   12652           f = (d & b) | ((~d) & c);
   12653           g = (5 * j + 1) & 15;
   12654         } else if (j < 48) {
   12655           f = b ^ c ^ d;
   12656           g = (3 * j + 5) & 15;
   12657         } else {
   12658           f = c ^ (b | (~d));
   12659           g = (7 * j) & 15;
   12660         }
   12661         var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
   12662         d = c;
   12663         c = b;
   12664         b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
   12665         a = tmp;
   12666       }
   12667       h0 = (h0 + a) | 0;
   12668       h1 = (h1 + b) | 0;
   12669       h2 = (h2 + c) | 0;
   12670       h3 = (h3 + d) | 0;
   12671     }
   12672     return new Uint8Array([
   12673         h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
   12674         h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
   12675         h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
   12676         h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
   12677     ]);
   12678   }
   12679   return hash;
   12680 })();
   12681 
   12682 var NullCipher = (function NullCipherClosure() {
   12683   function NullCipher() {
   12684   }
   12685 
   12686   NullCipher.prototype = {
   12687     decryptBlock: function NullCipher_decryptBlock(data) {
   12688       return data;
   12689     }
   12690   };
   12691 
   12692   return NullCipher;
   12693 })();
   12694 
   12695 var AES128Cipher = (function AES128CipherClosure() {
   12696   var rcon = new Uint8Array([
   12697     0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
   12698     0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
   12699     0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
   12700     0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
   12701     0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
   12702     0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
   12703     0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
   12704     0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
   12705     0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
   12706     0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
   12707     0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
   12708     0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
   12709     0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
   12710     0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
   12711     0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
   12712     0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
   12713     0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
   12714     0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
   12715     0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
   12716     0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
   12717     0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
   12718     0x74, 0xe8, 0xcb, 0x8d]);
   12719 
   12720   var s = new Uint8Array([
   12721     0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
   12722     0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
   12723     0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
   12724     0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
   12725     0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
   12726     0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
   12727     0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
   12728     0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
   12729     0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
   12730     0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
   12731     0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
   12732     0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
   12733     0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
   12734     0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
   12735     0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
   12736     0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
   12737     0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
   12738     0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
   12739     0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
   12740     0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
   12741     0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
   12742     0xb0, 0x54, 0xbb, 0x16]);
   12743 
   12744   var inv_s = new Uint8Array([
   12745     0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
   12746     0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
   12747     0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
   12748     0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
   12749     0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
   12750     0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
   12751     0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
   12752     0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
   12753     0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
   12754     0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
   12755     0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
   12756     0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
   12757     0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
   12758     0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
   12759     0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
   12760     0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
   12761     0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
   12762     0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
   12763     0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
   12764     0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
   12765     0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
   12766     0x55, 0x21, 0x0c, 0x7d]);
   12767 
   12768   var mix = new Uint32Array([
   12769     0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
   12770     0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
   12771     0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
   12772     0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
   12773     0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
   12774     0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
   12775     0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
   12776     0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
   12777     0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
   12778     0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
   12779     0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
   12780     0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
   12781     0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
   12782     0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
   12783     0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
   12784     0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
   12785     0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
   12786     0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
   12787     0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
   12788     0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
   12789     0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
   12790     0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
   12791     0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
   12792     0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
   12793     0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
   12794     0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
   12795     0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
   12796     0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
   12797     0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
   12798     0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
   12799     0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
   12800     0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
   12801     0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
   12802     0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
   12803     0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
   12804     0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
   12805     0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
   12806     0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
   12807     0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
   12808     0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
   12809     0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
   12810     0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
   12811     0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
   12812 
   12813   function expandKey128(cipherKey) {
   12814     var b = 176, result = new Uint8Array(b);
   12815     result.set(cipherKey);
   12816     for (var j = 16, i = 1; j < b; ++i) {
   12817       // RotWord
   12818       var t1 = result[j - 3], t2 = result[j - 2],
   12819           t3 = result[j - 1], t4 = result[j - 4];
   12820       // SubWord
   12821       t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
   12822       // Rcon
   12823       t1 = t1 ^ rcon[i];
   12824       for (var n = 0; n < 4; ++n) {
   12825         result[j] = (t1 ^= result[j - 16]); j++;
   12826         result[j] = (t2 ^= result[j - 16]); j++;
   12827         result[j] = (t3 ^= result[j - 16]); j++;
   12828         result[j] = (t4 ^= result[j - 16]); j++;
   12829       }
   12830     }
   12831     return result;
   12832   }
   12833 
   12834   function decrypt128(input, key) {
   12835     var state = new Uint8Array(16);
   12836     state.set(input);
   12837     var i, j, k;
   12838     var t, u, v;
   12839     // AddRoundKey
   12840     for (j = 0, k = 160; j < 16; ++j, ++k)
   12841       state[j] ^= key[k];
   12842     for (i = 9; i >= 1; --i) {
   12843       // InvShiftRows
   12844       t = state[13]; state[13] = state[9]; state[9] = state[5];
   12845       state[5] = state[1]; state[1] = t;
   12846       t = state[14]; u = state[10]; state[14] = state[6];
   12847       state[10] = state[2]; state[6] = t; state[2] = u;
   12848       t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
   12849       state[11] = t; state[7] = u; state[3] = v;
   12850       // InvSubBytes
   12851       for (j = 0; j < 16; ++j)
   12852         state[j] = inv_s[state[j]];
   12853       // AddRoundKey
   12854       for (j = 0, k = i * 16; j < 16; ++j, ++k)
   12855         state[j] ^= key[k];
   12856       // InvMixColumns
   12857       for (j = 0; j < 16; j += 4) {
   12858         var s0 = mix[state[j]], s1 = mix[state[j + 1]],
   12859             s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
   12860         t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
   12861             (s3 >>> 24) ^ (s3 << 8));
   12862         state[j] = (t >>> 24) & 0xFF;
   12863         state[j + 1] = (t >> 16) & 0xFF;
   12864         state[j + 2] = (t >> 8) & 0xFF;
   12865         state[j + 3] = t & 0xFF;
   12866       }
   12867     }
   12868     // InvShiftRows
   12869     t = state[13]; state[13] = state[9]; state[9] = state[5];
   12870     state[5] = state[1]; state[1] = t;
   12871     t = state[14]; u = state[10]; state[14] = state[6];
   12872     state[10] = state[2]; state[6] = t; state[2] = u;
   12873     t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
   12874     state[11] = t; state[7] = u; state[3] = v;
   12875     for (j = 0; j < 16; ++j) {
   12876       // InvSubBytes
   12877       state[j] = inv_s[state[j]];
   12878       // AddRoundKey
   12879       state[j] ^= key[j];
   12880     }
   12881     return state;
   12882   }
   12883 
   12884   function AES128Cipher(key) {
   12885     this.key = expandKey128(key);
   12886     this.buffer = new Uint8Array(16);
   12887     this.bufferPosition = 0;
   12888   }
   12889 
   12890   function decryptBlock2(data) {
   12891     var i, j, ii, sourceLength = data.length,
   12892         buffer = this.buffer, bufferLength = this.bufferPosition,
   12893         result = [], iv = this.iv;
   12894     for (i = 0; i < sourceLength; ++i) {
   12895       buffer[bufferLength] = data[i];
   12896       ++bufferLength;
   12897       if (bufferLength < 16)
   12898         continue;
   12899       // buffer is full, decrypting
   12900       var plain = decrypt128(buffer, this.key);
   12901       // xor-ing the IV vector to get plain text
   12902       for (j = 0; j < 16; ++j)
   12903         plain[j] ^= iv[j];
   12904       iv = buffer;
   12905       result.push(plain);
   12906       buffer = new Uint8Array(16);
   12907       bufferLength = 0;
   12908     }
   12909     // saving incomplete buffer
   12910     this.buffer = buffer;
   12911     this.bufferLength = bufferLength;
   12912     this.iv = iv;
   12913     if (result.length == 0)
   12914       return new Uint8Array([]);
   12915     if (result.length == 1)
   12916       return result[0];
   12917     // combining plain text blocks into one
   12918     var output = new Uint8Array(16 * result.length);
   12919     for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
   12920       output.set(result[i], j);
   12921     return output;
   12922   }
   12923 
   12924   AES128Cipher.prototype = {
   12925     decryptBlock: function AES128Cipher_decryptBlock(data) {
   12926       var i, sourceLength = data.length;
   12927       var buffer = this.buffer, bufferLength = this.bufferPosition;
   12928       // waiting for IV values -- they are at the start of the stream
   12929       for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength)
   12930         buffer[bufferLength] = data[i];
   12931       if (bufferLength < 16) {
   12932         // need more data
   12933         this.bufferLength = bufferLength;
   12934         return new Uint8Array([]);
   12935       }
   12936       this.iv = buffer;
   12937       this.buffer = new Uint8Array(16);
   12938       this.bufferLength = 0;
   12939       // starting decryption
   12940       this.decryptBlock = decryptBlock2;
   12941       return this.decryptBlock(data.subarray(16));
   12942     }
   12943   };
   12944 
   12945   return AES128Cipher;
   12946 })();
   12947 
   12948 var CipherTransform = (function CipherTransformClosure() {
   12949   function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
   12950     this.stringCipherConstructor = stringCipherConstructor;
   12951     this.streamCipherConstructor = streamCipherConstructor;
   12952   }
   12953   CipherTransform.prototype = {
   12954     createStream: function CipherTransform_createStream(stream) {
   12955       var cipher = new this.streamCipherConstructor();
   12956       return new DecryptStream(stream,
   12957         function cipherTransformDecryptStream(data) {
   12958           return cipher.decryptBlock(data);
   12959         }
   12960       );
   12961     },
   12962     decryptString: function CipherTransform_decryptString(s) {
   12963       var cipher = new this.stringCipherConstructor();
   12964       var data = stringToBytes(s);
   12965       data = cipher.decryptBlock(data);
   12966       return bytesToString(data);
   12967     }
   12968   };
   12969   return CipherTransform;
   12970 })();
   12971 
   12972 var CipherTransformFactory = (function CipherTransformFactoryClosure() {
   12973   function prepareKeyData(fileId, password, ownerPassword, userPassword,
   12974                           flags, revision, keyLength, encryptMetadata) {
   12975     var defaultPasswordBytes = new Uint8Array([
   12976       0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
   12977       0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
   12978       0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
   12979       0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
   12980     var hashData = new Uint8Array(100), i = 0, j, n;
   12981     if (password) {
   12982       n = Math.min(32, password.length);
   12983       for (; i < n; ++i)
   12984         hashData[i] = password[i];
   12985     }
   12986     j = 0;
   12987     while (i < 32) {
   12988       hashData[i++] = defaultPasswordBytes[j++];
   12989     }
   12990     // as now the padded password in the hashData[0..i]
   12991     for (j = 0, n = ownerPassword.length; j < n; ++j)
   12992       hashData[i++] = ownerPassword[j];
   12993     hashData[i++] = flags & 0xFF;
   12994     hashData[i++] = (flags >> 8) & 0xFF;
   12995     hashData[i++] = (flags >> 16) & 0xFF;
   12996     hashData[i++] = (flags >>> 24) & 0xFF;
   12997     for (j = 0, n = fileId.length; j < n; ++j)
   12998       hashData[i++] = fileId[j];
   12999     if (revision >= 4 && !encryptMetadata) {
   13000       hashData[i++] = 0xFF;
   13001       hashData[i++] = 0xFF;
   13002       hashData[i++] = 0xFF;
   13003       hashData[i++] = 0xFF;
   13004     }
   13005     var hash = calculateMD5(hashData, 0, i);
   13006     var keyLengthInBytes = keyLength >> 3;
   13007     if (revision >= 3) {
   13008       for (j = 0; j < 50; ++j) {
   13009          hash = calculateMD5(hash, 0, keyLengthInBytes);
   13010       }
   13011     }
   13012     var encryptionKey = hash.subarray(0, keyLengthInBytes);
   13013     var cipher, checkData;
   13014 
   13015     if (revision >= 3) {
   13016       // padded password in hashData, we can use this array for user
   13017       // password check
   13018       i = 32;
   13019       for (j = 0, n = fileId.length; j < n; ++j)
   13020         hashData[i++] = fileId[j];
   13021       cipher = new ARCFourCipher(encryptionKey);
   13022       var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
   13023       n = encryptionKey.length;
   13024       var derivedKey = new Uint8Array(n), k;
   13025       for (j = 1; j <= 19; ++j) {
   13026         for (k = 0; k < n; ++k)
   13027           derivedKey[k] = encryptionKey[k] ^ j;
   13028         cipher = new ARCFourCipher(derivedKey);
   13029         checkData = cipher.encryptBlock(checkData);
   13030       }
   13031     } else {
   13032       cipher = new ARCFourCipher(encryptionKey);
   13033       checkData = cipher.encryptBlock(hashData.subarray(0, 32));
   13034     }
   13035     for (j = 0, n = checkData.length; j < n; ++j) {
   13036       if (userPassword[j] != checkData[j])
   13037         error('incorrect password');
   13038     }
   13039     return encryptionKey;
   13040   }
   13041 
   13042   var identityName = new Name('Identity');
   13043 
   13044   function CipherTransformFactory(dict, fileId, password) {
   13045     var filter = dict.get('Filter');
   13046     if (!isName(filter) || filter.name != 'Standard')
   13047       error('unknown encryption method');
   13048     this.dict = dict;
   13049     var algorithm = dict.get('V');
   13050     if (!isInt(algorithm) ||
   13051       (algorithm != 1 && algorithm != 2 && algorithm != 4))
   13052       error('unsupported encryption algorithm');
   13053     this.algorithm = algorithm;
   13054     var keyLength = dict.get('Length') || 40;
   13055     if (!isInt(keyLength) ||
   13056       keyLength < 40 || (keyLength % 8) != 0)
   13057       error('invalid key length');
   13058     // prepare keys
   13059     var ownerPassword = stringToBytes(dict.get('O'));
   13060     var userPassword = stringToBytes(dict.get('U'));
   13061     var flags = dict.get('P');
   13062     var revision = dict.get('R');
   13063     var encryptMetadata =
   13064       dict.get('EncryptMetadata') !== false; // makes true as default value
   13065     var fileIdBytes = stringToBytes(fileId);
   13066     var passwordBytes;
   13067     if (password)
   13068       passwordBytes = stringToBytes(password);
   13069 
   13070     this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
   13071                                         ownerPassword, userPassword,
   13072                                         flags, revision,
   13073                                         keyLength, encryptMetadata);
   13074     if (algorithm == 4) {
   13075       this.cf = dict.get('CF');
   13076       this.stmf = dict.get('StmF') || identityName;
   13077       this.strf = dict.get('StrF') || identityName;
   13078       this.eff = dict.get('EFF') || this.strf;
   13079     }
   13080   }
   13081 
   13082   function buildObjectKey(num, gen, encryptionKey, isAes) {
   13083     var key = new Uint8Array(encryptionKey.length + 9), i, n;
   13084     for (i = 0, n = encryptionKey.length; i < n; ++i)
   13085       key[i] = encryptionKey[i];
   13086     key[i++] = num & 0xFF;
   13087     key[i++] = (num >> 8) & 0xFF;
   13088     key[i++] = (num >> 16) & 0xFF;
   13089     key[i++] = gen & 0xFF;
   13090     key[i++] = (gen >> 8) & 0xFF;
   13091     if (isAes) {
   13092       key[i++] = 0x73;
   13093       key[i++] = 0x41;
   13094       key[i++] = 0x6C;
   13095       key[i++] = 0x54;
   13096     }
   13097     var hash = calculateMD5(key, 0, i);
   13098     return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
   13099   }
   13100 
   13101   function buildCipherConstructor(cf, name, num, gen, key) {
   13102     var cryptFilter = cf.get(name.name);
   13103     var cfm;
   13104     if (cryptFilter != null)
   13105       cfm = cryptFilter.get('CFM');
   13106     if (!cfm || cfm.name == 'None') {
   13107       return function cipherTransformFactoryBuildCipherConstructorNone() {
   13108         return new NullCipher();
   13109       };
   13110     }
   13111     if ('V2' == cfm.name) {
   13112       return function cipherTransformFactoryBuildCipherConstructorV2() {
   13113         return new ARCFourCipher(
   13114           buildObjectKey(num, gen, key, false));
   13115       };
   13116     }
   13117     if ('AESV2' == cfm.name) {
   13118       return function cipherTransformFactoryBuildCipherConstructorAESV2() {
   13119         return new AES128Cipher(
   13120           buildObjectKey(num, gen, key, true));
   13121       };
   13122     }
   13123     error('Unknown crypto method');
   13124   }
   13125 
   13126   CipherTransformFactory.prototype = {
   13127     createCipherTransform:
   13128       function CipherTransformFactory_createCipherTransform(num, gen) {
   13129       if (this.algorithm == 4) {
   13130         return new CipherTransform(
   13131           buildCipherConstructor(this.cf, this.stmf,
   13132             num, gen, this.encryptionKey),
   13133           buildCipherConstructor(this.cf, this.strf,
   13134             num, gen, this.encryptionKey));
   13135       }
   13136       // algorithms 1 and 2
   13137       var key = buildObjectKey(num, gen, this.encryptionKey, false);
   13138       var cipherConstructor = function buildCipherCipherConstructor() {
   13139         return new ARCFourCipher(key);
   13140       };
   13141       return new CipherTransform(cipherConstructor, cipherConstructor);
   13142     }
   13143   };
   13144 
   13145   return CipherTransformFactory;
   13146 })();
   13147 
   13148 
   13149 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   13150 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   13151 
   13152 'use strict';
   13153 
   13154 var PartialEvaluator = (function PartialEvaluatorClosure() {
   13155   function PartialEvaluator(xref, handler, uniquePrefix) {
   13156     this.state = new EvalState();
   13157     this.stateStack = [];
   13158 
   13159     this.xref = xref;
   13160     this.handler = handler;
   13161     this.uniquePrefix = uniquePrefix;
   13162     this.objIdCounter = 0;
   13163   }
   13164 
   13165   var OP_MAP = {
   13166     // Graphics state
   13167     w: 'setLineWidth',
   13168     J: 'setLineCap',
   13169     j: 'setLineJoin',
   13170     M: 'setMiterLimit',
   13171     d: 'setDash',
   13172     ri: 'setRenderingIntent',
   13173     i: 'setFlatness',
   13174     gs: 'setGState',
   13175     q: 'save',
   13176     Q: 'restore',
   13177     cm: 'transform',
   13178 
   13179     // Path
   13180     m: 'moveTo',
   13181     l: 'lineTo',
   13182     c: 'curveTo',
   13183     v: 'curveTo2',
   13184     y: 'curveTo3',
   13185     h: 'closePath',
   13186     re: 'rectangle',
   13187     S: 'stroke',
   13188     s: 'closeStroke',
   13189     f: 'fill',
   13190     F: 'fill',
   13191     'f*': 'eoFill',
   13192     B: 'fillStroke',
   13193     'B*': 'eoFillStroke',
   13194     b: 'closeFillStroke',
   13195     'b*': 'closeEOFillStroke',
   13196     n: 'endPath',
   13197 
   13198     // Clipping
   13199     W: 'clip',
   13200     'W*': 'eoClip',
   13201 
   13202     // Text
   13203     BT: 'beginText',
   13204     ET: 'endText',
   13205     Tc: 'setCharSpacing',
   13206     Tw: 'setWordSpacing',
   13207     Tz: 'setHScale',
   13208     TL: 'setLeading',
   13209     Tf: 'setFont',
   13210     Tr: 'setTextRenderingMode',
   13211     Ts: 'setTextRise',
   13212     Td: 'moveText',
   13213     TD: 'setLeadingMoveText',
   13214     Tm: 'setTextMatrix',
   13215     'T*': 'nextLine',
   13216     Tj: 'showText',
   13217     TJ: 'showSpacedText',
   13218     "'": 'nextLineShowText',
   13219     '"': 'nextLineSetSpacingShowText',
   13220 
   13221     // Type3 fonts
   13222     d0: 'setCharWidth',
   13223     d1: 'setCharWidthAndBounds',
   13224 
   13225     // Color
   13226     CS: 'setStrokeColorSpace',
   13227     cs: 'setFillColorSpace',
   13228     SC: 'setStrokeColor',
   13229     SCN: 'setStrokeColorN',
   13230     sc: 'setFillColor',
   13231     scn: 'setFillColorN',
   13232     G: 'setStrokeGray',
   13233     g: 'setFillGray',
   13234     RG: 'setStrokeRGBColor',
   13235     rg: 'setFillRGBColor',
   13236     K: 'setStrokeCMYKColor',
   13237     k: 'setFillCMYKColor',
   13238 
   13239     // Shading
   13240     sh: 'shadingFill',
   13241 
   13242     // Images
   13243     BI: 'beginInlineImage',
   13244     ID: 'beginImageData',
   13245     EI: 'endInlineImage',
   13246 
   13247     // XObjects
   13248     Do: 'paintXObject',
   13249 
   13250     // Marked content
   13251     MP: 'markPoint',
   13252     DP: 'markPointProps',
   13253     BMC: 'beginMarkedContent',
   13254     BDC: 'beginMarkedContentProps',
   13255     EMC: 'endMarkedContent',
   13256 
   13257     // Compatibility
   13258     BX: 'beginCompat',
   13259     EX: 'endCompat'
   13260   };
   13261 
   13262   function splitCombinedOperations(operations) {
   13263     // Two operations can be combined together, trying to find which two
   13264     // operations were concatenated.
   13265     for (var i = operations.length - 1; i > 0; i--) {
   13266       var op1 = operations.substring(0, i), op2 = operations.substring(i);
   13267       if (op1 in OP_MAP && op2 in OP_MAP)
   13268         return [op1, op2]; // operations found
   13269     }
   13270     return null;
   13271   }
   13272 
   13273   PartialEvaluator.prototype = {
   13274     getOperatorList: function PartialEvaluator_getOperatorList(stream,
   13275                                                                resources,
   13276                                                                dependency,
   13277                                                                queue) {
   13278 
   13279       var self = this;
   13280       var xref = this.xref;
   13281       var handler = this.handler;
   13282       var uniquePrefix = this.uniquePrefix || '';
   13283 
   13284       function insertDependency(depList) {
   13285         fnArray.push('dependency');
   13286         argsArray.push(depList);
   13287         for (var i = 0, ii = depList.length; i < ii; i++) {
   13288           var dep = depList[i];
   13289           if (dependency.indexOf(dep) == -1) {
   13290             dependency.push(depList[i]);
   13291           }
   13292         }
   13293       }
   13294 
   13295       function handleSetFont(fontName, font) {
   13296         var loadedName = null;
   13297 
   13298         var fontRes = resources.get('Font');
   13299 
   13300         assert(fontRes, 'fontRes not available');
   13301 
   13302         font = xref.fetchIfRef(font) || fontRes.get(fontName);
   13303         assertWellFormed(isDict(font));
   13304         ++self.objIdCounter;
   13305         if (!font.translated) {
   13306           font.translated = self.translateFont(font, xref, resources,
   13307                                                dependency);
   13308           if (font.translated) {
   13309             // keep track of each font we translated so the caller can
   13310             // load them asynchronously before calling display on a page
   13311             loadedName = 'font_' + uniquePrefix + self.objIdCounter;
   13312             font.translated.properties.loadedName = loadedName;
   13313             font.loadedName = loadedName;
   13314 
   13315             var translated = font.translated;
   13316             // Convert the file to an ArrayBuffer which will be turned back into
   13317             // a Stream in the main thread.
   13318             if (translated.file)
   13319               translated.file = translated.file.getBytes();
   13320             if (translated.properties.file) {
   13321               translated.properties.file =
   13322                   translated.properties.file.getBytes();
   13323             }
   13324 
   13325             handler.send('obj', [
   13326                 loadedName,
   13327                 'Font',
   13328                 translated.name,
   13329                 translated.file,
   13330                 translated.properties
   13331             ]);
   13332           }
   13333         }
   13334         loadedName = loadedName || font.loadedName;
   13335 
   13336         // Ensure the font is ready before the font is set
   13337         // and later on used for drawing.
   13338         // OPTIMIZE: This should get insert to the operatorList only once per
   13339         // page.
   13340         insertDependency([loadedName]);
   13341         return loadedName;
   13342       }
   13343 
   13344       function buildPaintImageXObject(image, inline) {
   13345         var dict = image.dict;
   13346         var w = dict.get('Width', 'W');
   13347         var h = dict.get('Height', 'H');
   13348 
   13349         var imageMask = dict.get('ImageMask', 'IM') || false;
   13350         if (imageMask) {
   13351           // This depends on a tmpCanvas beeing filled with the
   13352           // current fillStyle, such that processing the pixel
   13353           // data can't be done here. Instead of creating a
   13354           // complete PDFImage, only read the information needed
   13355           // for later.
   13356 
   13357           var width = dict.get('Width', 'W');
   13358           var height = dict.get('Height', 'H');
   13359           var bitStrideLength = (width + 7) >> 3;
   13360           var imgArray = image.getBytes(bitStrideLength * height);
   13361           var decode = dict.get('Decode', 'D');
   13362           var inverseDecode = !!decode && decode[0] > 0;
   13363 
   13364           fn = 'paintImageMaskXObject';
   13365           args = [imgArray, inverseDecode, width, height];
   13366           return;
   13367         }
   13368 
   13369         // If there is no imageMask, create the PDFImage and a lot
   13370         // of image processing can be done here.
   13371         var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
   13372         insertDependency([objId]);
   13373         args = [objId, w, h];
   13374 
   13375         var softMask = dict.get('SMask', 'IM') || false;
   13376         if (!softMask && image instanceof JpegStream &&
   13377             image.isNativelySupported(xref, resources)) {
   13378           // These JPEGs don't need any more processing so we can just send it.
   13379           fn = 'paintJpegXObject';
   13380           handler.send('obj', [objId, 'JpegStream', image.getIR()]);
   13381           return;
   13382         }
   13383 
   13384         fn = 'paintImageXObject';
   13385 
   13386         PDFImage.buildImage(function(imageObj) {
   13387             var drawWidth = imageObj.drawWidth;
   13388             var drawHeight = imageObj.drawHeight;
   13389             var imgData = {
   13390               width: drawWidth,
   13391               height: drawHeight,
   13392               data: new Uint8Array(drawWidth * drawHeight * 4)
   13393             };
   13394             var pixels = imgData.data;
   13395             imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight);
   13396             handler.send('obj', [objId, 'Image', imgData]);
   13397           }, handler, xref, resources, image, inline);
   13398       }
   13399 
   13400       if (!queue)
   13401         queue = {};
   13402 
   13403       if (!queue.argsArray) {
   13404         queue.argsArray = [];
   13405       }
   13406       if (!queue.fnArray) {
   13407         queue.fnArray = [];
   13408       }
   13409 
   13410       var fnArray = queue.fnArray, argsArray = queue.argsArray;
   13411       var dependencyArray = dependency || [];
   13412 
   13413       resources = resources || new Dict();
   13414       var xobjs = resources.get('XObject') || new Dict();
   13415       var patterns = resources.get('Pattern') || new Dict();
   13416       var parser = new Parser(new Lexer(stream), false, xref);
   13417       var res = resources;
   13418       var hasNextObj = false, nextObj;
   13419       var args = [], obj;
   13420       var TILING_PATTERN = 1, SHADING_PATTERN = 2;
   13421 
   13422       while (true) {
   13423         if (hasNextObj) {
   13424           obj = nextObj;
   13425           hasNextObj = false;
   13426         } else {
   13427           obj = parser.getObj();
   13428           if (isEOF(obj))
   13429             break;
   13430         }
   13431 
   13432         if (isCmd(obj)) {
   13433           var cmd = obj.cmd;
   13434           var fn = OP_MAP[cmd];
   13435           if (!fn) {
   13436             // invalid content command, trying to recover
   13437             var cmds = splitCombinedOperations(cmd);
   13438             if (cmds) {
   13439               cmd = cmds[0];
   13440               fn = OP_MAP[cmd];
   13441               // feeding other command on the next interation
   13442               hasNextObj = true;
   13443               nextObj = Cmd.get(cmds[1]);
   13444             }
   13445           }
   13446           assertWellFormed(fn, 'Unknown command "' + cmd + '"');
   13447           // TODO figure out how to type-check vararg functions
   13448 
   13449           if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) {
   13450             // compile tiling patterns
   13451             var patternName = args[args.length - 1];
   13452             // SCN/scn applies patterns along with normal colors
   13453             if (isName(patternName)) {
   13454               var pattern = patterns.get(patternName.name);
   13455               if (pattern) {
   13456                 var dict = isStream(pattern) ? pattern.dict : pattern;
   13457                 var typeNum = dict.get('PatternType');
   13458 
   13459                 if (typeNum == TILING_PATTERN) {
   13460                   // Create an IR of the pattern code.
   13461                   var depIdx = dependencyArray.length;
   13462                   var operatorList = this.getOperatorList(pattern,
   13463                       dict.get('Resources') || resources, dependencyArray);
   13464 
   13465                   // Add the dependencies that are required to execute the
   13466                   // operatorList.
   13467                   insertDependency(dependencyArray.slice(depIdx));
   13468 
   13469                   args = TilingPattern.getIR(operatorList, dict, args);
   13470                 }
   13471                 else if (typeNum == SHADING_PATTERN) {
   13472                   var shading = dict.get('Shading');
   13473                   var matrix = dict.get('Matrix');
   13474                   var pattern = Pattern.parseShading(shading, matrix, xref,
   13475                                                      res);
   13476                   args = pattern.getIR();
   13477                 } else {
   13478                   error('Unkown PatternType ' + typeNum);
   13479                 }
   13480               }
   13481             }
   13482           } else if (cmd == 'Do' && !args[0].code) {
   13483             // eagerly compile XForm objects
   13484             var name = args[0].name;
   13485             var xobj = xobjs.get(name);
   13486             if (xobj) {
   13487               assertWellFormed(isStream(xobj), 'XObject should be a stream');
   13488 
   13489               var type = xobj.dict.get('Subtype');
   13490               assertWellFormed(
   13491                 isName(type),
   13492                 'XObject should have a Name subtype'
   13493               );
   13494 
   13495               if ('Form' == type.name) {
   13496                 var matrix = xobj.dict.get('Matrix');
   13497                 var bbox = xobj.dict.get('BBox');
   13498 
   13499                 fnArray.push('paintFormXObjectBegin');
   13500                 argsArray.push([matrix, bbox]);
   13501 
   13502                 // This adds the operatorList of the xObj to the current queue.
   13503                 var depIdx = dependencyArray.length;
   13504 
   13505                 // Pass in the current `queue` object. That means the `fnArray`
   13506                 // and the `argsArray` in this scope is reused and new commands
   13507                 // are added to them.
   13508                 this.getOperatorList(xobj,
   13509                     xobj.dict.get('Resources') || resources,
   13510                     dependencyArray, queue);
   13511 
   13512                // Add the dependencies that are required to execute the
   13513                // operatorList.
   13514                insertDependency(dependencyArray.slice(depIdx));
   13515 
   13516                 fn = 'paintFormXObjectEnd';
   13517                 args = [];
   13518               } else if ('Image' == type.name) {
   13519                 buildPaintImageXObject(xobj, false);
   13520               } else {
   13521                 error('Unhandled XObject subtype ' + type.name);
   13522               }
   13523             }
   13524           } else if (cmd == 'Tf') { // eagerly collect all fonts
   13525             args[0] = handleSetFont(args[0].name);
   13526           } else if (cmd == 'EI') {
   13527             buildPaintImageXObject(args[0], true);
   13528           }
   13529 
   13530           switch (fn) {
   13531             // Parse the ColorSpace data to a raw format.
   13532             case 'setFillColorSpace':
   13533             case 'setStrokeColorSpace':
   13534               args = [ColorSpace.parseToIR(args[0], xref, resources)];
   13535               break;
   13536             case 'shadingFill':
   13537               var shadingRes = res.get('Shading');
   13538               if (!shadingRes)
   13539                 error('No shading resource found');
   13540 
   13541               var shading = shadingRes.get(args[0].name);
   13542               if (!shading)
   13543                 error('No shading object found');
   13544 
   13545               var shadingFill = Pattern.parseShading(shading, null, xref, res);
   13546               var patternIR = shadingFill.getIR();
   13547               args = [patternIR];
   13548               fn = 'shadingFill';
   13549               break;
   13550             case 'setGState':
   13551               var dictName = args[0];
   13552               var extGState = resources.get('ExtGState');
   13553 
   13554               if (!isDict(extGState) || !extGState.has(dictName.name))
   13555                 break;
   13556 
   13557               var gsState = extGState.get(dictName.name);
   13558 
   13559               // This array holds the converted/processed state data.
   13560               var gsStateObj = [];
   13561 
   13562               gsState.forEach(
   13563                 function canvasGraphicsSetGStateForEach(key, value) {
   13564                   switch (key) {
   13565                     case 'Type':
   13566                       break;
   13567                     case 'LW':
   13568                     case 'LC':
   13569                     case 'LJ':
   13570                     case 'ML':
   13571                     case 'D':
   13572                     case 'RI':
   13573                     case 'FL':
   13574                     case 'CA':
   13575                     case 'ca':
   13576                       gsStateObj.push([key, value]);
   13577                       break;
   13578                     case 'Font':
   13579                       gsStateObj.push([
   13580                         'Font',
   13581                         handleSetFont(null, value[0]),
   13582                         value[1]
   13583                       ]);
   13584                       break;
   13585                     case 'OP':
   13586                     case 'op':
   13587                     case 'OPM':
   13588                     case 'BG':
   13589                     case 'BG2':
   13590                     case 'UCR':
   13591                     case 'UCR2':
   13592                     case 'TR':
   13593                     case 'TR2':
   13594                     case 'HT':
   13595                     case 'SM':
   13596                     case 'SA':
   13597                     case 'BM':
   13598                     case 'SMask':
   13599                     case 'AIS':
   13600                     case 'TK':
   13601                       TODO('graphic state operator ' + key);
   13602                       break;
   13603                     default:
   13604                       warn('Unknown graphic state operator ' + key);
   13605                       break;
   13606                   }
   13607                 }
   13608               );
   13609               args = [gsStateObj];
   13610               break;
   13611           } // switch
   13612 
   13613           fnArray.push(fn);
   13614           argsArray.push(args);
   13615           args = [];
   13616         } else if (obj != null) {
   13617           assertWellFormed(args.length <= 33, 'Too many arguments');
   13618           args.push(obj instanceof Dict ? obj.getAll() : obj);
   13619         }
   13620       }
   13621 
   13622       return queue;
   13623     },
   13624 
   13625     extractDataStructures: function
   13626       partialEvaluatorExtractDataStructures(dict, baseDict,
   13627                                             xref, properties) {
   13628       // 9.10.2
   13629       var toUnicode = dict.get('ToUnicode') ||
   13630         baseDict.get('ToUnicode');
   13631       if (toUnicode)
   13632         properties.toUnicode = this.readToUnicode(toUnicode, xref, properties);
   13633 
   13634       if (properties.composite) {
   13635         // CIDSystemInfo helps to match CID to glyphs
   13636         var cidSystemInfo = dict.get('CIDSystemInfo');
   13637         if (isDict(cidSystemInfo)) {
   13638           properties.cidSystemInfo = {
   13639             registry: cidSystemInfo.get('Registry'),
   13640             ordering: cidSystemInfo.get('Ordering'),
   13641             supplement: cidSystemInfo.get('Supplement')
   13642           };
   13643         }
   13644 
   13645         var cidToGidMap = dict.get('CIDToGIDMap');
   13646         if (isStream(cidToGidMap))
   13647           properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
   13648       }
   13649 
   13650       var flags = properties.flags;
   13651       var differences = [];
   13652       var baseEncoding = !!(flags & FontFlags.Symbolic) ?
   13653                          Encodings.symbolsEncoding : Encodings.StandardEncoding;
   13654       var hasEncoding = dict.has('Encoding');
   13655       if (hasEncoding) {
   13656         var encoding = dict.get('Encoding');
   13657         if (isDict(encoding)) {
   13658           var baseName = encoding.get('BaseEncoding');
   13659           if (baseName)
   13660             baseEncoding = Encodings[baseName.name];
   13661           else
   13662             hasEncoding = false; // base encoding was not provided
   13663 
   13664           // Load the differences between the base and original
   13665           if (encoding.has('Differences')) {
   13666             var diffEncoding = encoding.get('Differences');
   13667             var index = 0;
   13668             for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
   13669               var data = diffEncoding[j];
   13670               if (isNum(data))
   13671                 index = data;
   13672               else
   13673                 differences[index++] = data.name;
   13674             }
   13675           }
   13676         } else if (isName(encoding)) {
   13677           baseEncoding = Encodings[encoding.name];
   13678         } else {
   13679           error('Encoding is not a Name nor a Dict');
   13680         }
   13681       }
   13682 
   13683       properties.differences = differences;
   13684       properties.baseEncoding = baseEncoding;
   13685       properties.hasEncoding = hasEncoding;
   13686     },
   13687 
   13688     readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref,
   13689                                                            properties) {
   13690       var cmapObj = toUnicode;
   13691       var charToUnicode = [];
   13692       if (isName(cmapObj)) {
   13693         var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
   13694         if (!isIdentityMap)
   13695           error('ToUnicode file cmap translation not implemented');
   13696       } else if (isStream(cmapObj)) {
   13697         var tokens = [];
   13698         var token = '';
   13699         var beginArrayToken = {};
   13700 
   13701         var cmap = cmapObj.getBytes(cmapObj.length);
   13702         for (var i = 0, ii = cmap.length; i < ii; i++) {
   13703           var octet = cmap[i];
   13704           if (octet == 0x20 || octet == 0x0D || octet == 0x0A ||
   13705               octet == 0x3C || octet == 0x5B || octet == 0x5D) {
   13706             switch (token) {
   13707               case 'usecmap':
   13708                 error('usecmap is not implemented');
   13709                 break;
   13710 
   13711               case 'beginbfchar':
   13712               case 'beginbfrange':
   13713               case 'begincidchar':
   13714               case 'begincidrange':
   13715                 token = '';
   13716                 tokens = [];
   13717                 break;
   13718 
   13719               case 'endcidrange':
   13720               case 'endbfrange':
   13721                 for (var j = 0, jj = tokens.length; j < jj; j += 3) {
   13722                   var startRange = tokens[j];
   13723                   var endRange = tokens[j + 1];
   13724                   var code = tokens[j + 2];
   13725                   if (code == 0xFFFF) {
   13726                     // CMap is broken, assuming code == startRange
   13727                     code = startRange;
   13728                   }
   13729                   if (isArray(code)) {
   13730                     var codeindex = 0;
   13731                     while (startRange <= endRange) {
   13732                       charToUnicode[startRange] = code[codeindex++];
   13733                       ++startRange;
   13734                     }
   13735                   } else {
   13736                     while (startRange <= endRange) {
   13737                       charToUnicode[startRange] = code++;
   13738                       ++startRange;
   13739                     }
   13740                   }
   13741                 }
   13742                 break;
   13743 
   13744               case 'endcidchar':
   13745               case 'endbfchar':
   13746                 for (var j = 0, jj = tokens.length; j < jj; j += 2) {
   13747                   var index = tokens[j];
   13748                   var code = tokens[j + 1];
   13749                   charToUnicode[index] = code;
   13750                 }
   13751                 break;
   13752 
   13753               case '':
   13754                 break;
   13755 
   13756               default:
   13757                 if (token[0] >= '0' && token[0] <= '9')
   13758                   token = parseInt(token, 10); // a number
   13759                 tokens.push(token);
   13760                 token = '';
   13761             }
   13762             switch (octet) {
   13763               case 0x5B:
   13764                 // begin list parsing
   13765                 tokens.push(beginArrayToken);
   13766                 break;
   13767               case 0x5D:
   13768                 // collect array items
   13769                 var items = [], item;
   13770                 while (tokens.length &&
   13771                        (item = tokens.pop()) != beginArrayToken)
   13772                   items.unshift(item);
   13773                 tokens.push(items);
   13774                 break;
   13775             }
   13776           } else if (octet == 0x3E) {
   13777             if (token.length) {
   13778               // XXX guessing chars size by checking number size in the CMap
   13779               if (token.length <= 2 && properties.composite)
   13780                 properties.wideChars = false;
   13781 
   13782               if (token.length <= 4) {
   13783                 // parsing hex number
   13784                 tokens.push(parseInt(token, 16));
   13785                 token = '';
   13786               } else {
   13787                 // parsing hex UTF-16BE numbers
   13788                 var str = [];
   13789                 for (var k = 0, kk = token.length; k < kk; k += 4) {
   13790                   var b = parseInt(token.substr(k, 4), 16);
   13791                   if (b <= 0x10) {
   13792                     k += 4;
   13793                     b = (b << 16) | parseInt(token.substr(k, 4), 16);
   13794                     b -= 0x10000;
   13795                     str.push(0xD800 | (b >> 10));
   13796                     str.push(0xDC00 | (b & 0x3FF));
   13797                     break;
   13798                   }
   13799                   str.push(b);
   13800                 }
   13801                 tokens.push(String.fromCharCode.apply(String, str));
   13802                 token = '';
   13803               }
   13804             }
   13805           } else {
   13806             token += String.fromCharCode(octet);
   13807           }
   13808         }
   13809       }
   13810       return charToUnicode;
   13811     },
   13812     readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
   13813       // Extract the encoding from the CIDToGIDMap
   13814       var glyphsData = cidToGidStream.getBytes();
   13815 
   13816       // Set encoding 0 to later verify the font has an encoding
   13817       var result = [];
   13818       for (var j = 0, jj = glyphsData.length; j < jj; j++) {
   13819         var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
   13820         if (glyphID == 0)
   13821           continue;
   13822 
   13823         var code = j >> 1;
   13824         result[code] = glyphID;
   13825       }
   13826       return result;
   13827     },
   13828 
   13829     extractWidths: function PartialEvaluator_extractWidths(dict,
   13830                                                    xref,
   13831                                                    descriptor,
   13832                                                    properties) {
   13833       var glyphsWidths = [];
   13834       var defaultWidth = 0;
   13835       if (properties.composite) {
   13836         defaultWidth = dict.get('DW') || 1000;
   13837 
   13838         var widths = dict.get('W');
   13839         if (widths) {
   13840           var start = 0, end = 0;
   13841           for (var i = 0, ii = widths.length; i < ii; i++) {
   13842             var code = widths[i];
   13843             if (isArray(code)) {
   13844               for (var j = 0, jj = code.length; j < jj; j++)
   13845                 glyphsWidths[start++] = code[j];
   13846               start = 0;
   13847             } else if (start) {
   13848               var width = widths[++i];
   13849               for (var j = start; j <= code; j++)
   13850                 glyphsWidths[j] = width;
   13851               start = 0;
   13852             } else {
   13853               start = code;
   13854             }
   13855           }
   13856         }
   13857       } else {
   13858         var firstChar = properties.firstChar;
   13859         var widths = dict.get('Widths');
   13860         if (widths) {
   13861           var j = firstChar;
   13862           for (var i = 0, ii = widths.length; i < ii; i++)
   13863             glyphsWidths[j++] = widths[i];
   13864           defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
   13865         } else {
   13866           // Trying get the BaseFont metrics (see comment above).
   13867           var baseFontName = dict.get('BaseFont');
   13868           if (isName(baseFontName)) {
   13869             var metrics = this.getBaseFontMetrics(baseFontName.name);
   13870 
   13871             glyphsWidths = metrics.widths;
   13872             defaultWidth = metrics.defaultWidth;
   13873           }
   13874         }
   13875       }
   13876 
   13877       properties.defaultWidth = defaultWidth;
   13878       properties.widths = glyphsWidths;
   13879     },
   13880 
   13881     getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
   13882       var defaultWidth = 0, widths = [];
   13883       var glyphWidths = Metrics[stdFontMap[name] || name];
   13884       if (isNum(glyphWidths)) {
   13885         defaultWidth = glyphWidths;
   13886       } else {
   13887         widths = glyphWidths;
   13888       }
   13889 
   13890       return {
   13891         defaultWidth: defaultWidth,
   13892         widths: widths
   13893       };
   13894     },
   13895 
   13896     translateFont: function PartialEvaluator_translateFont(dict,
   13897                                                            xref,
   13898                                                            resources,
   13899                                                            dependency) {
   13900       var baseDict = dict;
   13901       var type = dict.get('Subtype');
   13902       assertWellFormed(isName(type), 'invalid font Subtype');
   13903 
   13904       var composite = false;
   13905       if (type.name == 'Type0') {
   13906         // If font is a composite
   13907         //  - get the descendant font
   13908         //  - set the type according to the descendant font
   13909         //  - get the FontDescriptor from the descendant font
   13910         var df = dict.get('DescendantFonts');
   13911         if (!df)
   13912           return null;
   13913 
   13914         dict = isArray(df) ? xref.fetchIfRef(df[0]) : df;
   13915 
   13916         type = dict.get('Subtype');
   13917         assertWellFormed(isName(type), 'invalid font Subtype');
   13918         composite = true;
   13919       }
   13920       var maxCharIndex = composite ? 0xFFFF : 0xFF;
   13921 
   13922       var descriptor = dict.get('FontDescriptor');
   13923       if (!descriptor) {
   13924         if (type.name == 'Type3') {
   13925           // FontDescriptor is only required for Type3 fonts when the document
   13926           // is a tagged pdf. Create a barbebones one to get by.
   13927           descriptor = new Dict();
   13928           descriptor.set('FontName', new Name(type.name));
   13929         } else {
   13930           // Before PDF 1.5 if the font was one of the base 14 fonts, having a
   13931           // FontDescriptor was not required.
   13932           // This case is here for compatibility.
   13933           var baseFontName = dict.get('BaseFont');
   13934           if (!isName(baseFontName))
   13935             return null;
   13936 
   13937           // Using base font name as a font name.
   13938           baseFontName = baseFontName.name.replace(/[,_]/g, '-');
   13939           var metrics = this.getBaseFontMetrics(baseFontName);
   13940 
   13941           // Simulating descriptor flags attribute
   13942           var fontNameWoStyle = baseFontName.split('-')[0];
   13943           var flags = (serifFonts[fontNameWoStyle] ||
   13944             (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) |
   13945             (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
   13946             FontFlags.Nonsymbolic);
   13947 
   13948           var properties = {
   13949             type: type.name,
   13950             widths: metrics.widths,
   13951             defaultWidth: metrics.defaultWidth,
   13952             flags: flags,
   13953             firstChar: 0,
   13954             lastChar: maxCharIndex
   13955           };
   13956           this.extractDataStructures(dict, dict, xref, properties);
   13957 
   13958           return {
   13959             name: baseFontName,
   13960             dict: baseDict,
   13961             properties: properties
   13962           };
   13963         }
   13964       }
   13965 
   13966       // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
   13967       // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
   13968       // to ignore this rule when a variant of a standart font is used.
   13969       // TODO Fill the width array depending on which of the base font this is
   13970       // a variant.
   13971       var firstChar = dict.get('FirstChar') || 0;
   13972       var lastChar = dict.get('LastChar') || maxCharIndex;
   13973       var fontName = descriptor.get('FontName');
   13974       // Some bad pdf's have a string as the font name.
   13975       if (isString(fontName))
   13976         fontName = new Name(fontName);
   13977       assertWellFormed(isName(fontName), 'invalid font name');
   13978 
   13979       var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
   13980       if (fontFile) {
   13981         if (fontFile.dict) {
   13982           var subtype = fontFile.dict.get('Subtype');
   13983           if (subtype)
   13984             subtype = subtype.name;
   13985 
   13986           var length1 = fontFile.dict.get('Length1');
   13987 
   13988           var length2 = fontFile.dict.get('Length2');
   13989         }
   13990       }
   13991 
   13992       var properties = {
   13993         type: type.name,
   13994         subtype: subtype,
   13995         file: fontFile,
   13996         length1: length1,
   13997         length2: length2,
   13998         composite: composite,
   13999         wideChars: composite,
   14000         fixedPitch: false,
   14001         fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX,
   14002         firstChar: firstChar || 0,
   14003         lastChar: lastChar || maxCharIndex,
   14004         bbox: descriptor.get('FontBBox'),
   14005         ascent: descriptor.get('Ascent'),
   14006         descent: descriptor.get('Descent'),
   14007         xHeight: descriptor.get('XHeight'),
   14008         capHeight: descriptor.get('CapHeight'),
   14009         flags: descriptor.get('Flags'),
   14010         italicAngle: descriptor.get('ItalicAngle'),
   14011         coded: false
   14012       };
   14013       this.extractWidths(dict, xref, descriptor, properties);
   14014       this.extractDataStructures(dict, baseDict, xref, properties);
   14015 
   14016       if (type.name === 'Type3') {
   14017         properties.coded = true;
   14018         var charProcs = dict.get('CharProcs').getAll();
   14019         var fontResources = dict.get('Resources') || resources;
   14020         properties.charProcOperatorList = {};
   14021         for (var key in charProcs) {
   14022           var glyphStream = charProcs[key];
   14023           properties.charProcOperatorList[key] =
   14024             this.getOperatorList(glyphStream, fontResources, dependency);
   14025         }
   14026       }
   14027 
   14028       return {
   14029         name: fontName.name,
   14030         dict: baseDict,
   14031         file: fontFile,
   14032         properties: properties
   14033       };
   14034     }
   14035   };
   14036 
   14037   return PartialEvaluator;
   14038 })();
   14039 
   14040 var EvalState = (function EvalStateClosure() {
   14041   function EvalState() {
   14042     // Are soft masks and alpha values shapes or opacities?
   14043     this.alphaIsShape = false;
   14044     this.fontSize = 0;
   14045     this.textMatrix = IDENTITY_MATRIX;
   14046     this.leading = 0;
   14047     // Start of text line (in text coordinates)
   14048     this.lineX = 0;
   14049     this.lineY = 0;
   14050     // Character and word spacing
   14051     this.charSpacing = 0;
   14052     this.wordSpacing = 0;
   14053     this.textHScale = 1;
   14054     // Color spaces
   14055     this.fillColorSpace = null;
   14056     this.strokeColorSpace = null;
   14057   }
   14058   EvalState.prototype = {
   14059   };
   14060   return EvalState;
   14061 })();
   14062 
   14063 
   14064 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   14065 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   14066 
   14067 'use strict';
   14068 
   14069 /**
   14070  * Maximum time to wait for a font to be loaded by font-face rules.
   14071  */
   14072 var kMaxWaitForFontFace = 1000;
   14073 
   14074 // Unicode Private Use Area
   14075 var kCmapGlyphOffset = 0xE000;
   14076 var kSizeOfGlyphArea = 0x1900;
   14077 var kSymbolicFontGlyphOffset = 0xF000;
   14078 
   14079 // PDF Glyph Space Units are one Thousandth of a TextSpace Unit
   14080 // except for Type 3 fonts
   14081 var kPDFGlyphSpaceUnits = 1000;
   14082 
   14083 // Until hinting is fully supported this constant can be used
   14084 var kHintingEnabled = false;
   14085 
   14086 var FontFlags = {
   14087   FixedPitch: 1,
   14088   Serif: 2,
   14089   Symbolic: 4,
   14090   Script: 8,
   14091   Nonsymbolic: 32,
   14092   Italic: 64,
   14093   AllCap: 65536,
   14094   SmallCap: 131072,
   14095   ForceBold: 262144
   14096 };
   14097 
   14098 var Encodings = {
   14099   ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14100     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14101     'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
   14102     'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
   14103     'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
   14104     'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
   14105     'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
   14106     'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
   14107     'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
   14108     'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
   14109     'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
   14110     'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
   14111     '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
   14112     'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
   14113     'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
   14114     'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
   14115     'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
   14116     'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
   14117     'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
   14118     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14119     '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
   14120     '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
   14121     'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
   14122     'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
   14123     'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
   14124     'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
   14125     'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
   14126     'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
   14127     'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
   14128     'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
   14129     'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
   14130     'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
   14131     'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
   14132     'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
   14133     'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
   14134     'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
   14135     'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
   14136     'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
   14137     'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
   14138     'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
   14139     'Ydieresissmall'],
   14140   MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14141     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14142     'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
   14143     'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
   14144     'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
   14145     'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
   14146     'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
   14147     'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
   14148     'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
   14149     'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
   14150     'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
   14151     'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
   14152     'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
   14153     'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
   14154     'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
   14155     'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
   14156     'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
   14157     'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
   14158     'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
   14159     'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
   14160     'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
   14161     'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
   14162     'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
   14163     'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
   14164     'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
   14165     'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
   14166     'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
   14167     'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
   14168     'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
   14169     'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
   14170     'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
   14171     'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
   14172     '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
   14173     'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
   14174     'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
   14175     'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
   14176     'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
   14177     '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
   14178     'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
   14179     'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
   14180   MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14181     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14182     'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
   14183     'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
   14184     'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
   14185     'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
   14186     'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
   14187     'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
   14188     'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
   14189     'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
   14190     'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
   14191     'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
   14192     'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
   14193     'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
   14194     'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
   14195     'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
   14196     'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
   14197     'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
   14198     'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
   14199     'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
   14200     'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
   14201     'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
   14202     'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
   14203     'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
   14204     'guillemotright', 'ellipsis', '', 'Agrave', 'Atilde', 'Otilde', 'OE',
   14205     'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
   14206     'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
   14207     'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
   14208     'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
   14209     'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
   14210     'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
   14211     'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
   14212     'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
   14213     'ogonek', 'caron'],
   14214   StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14215     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14216     'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
   14217     'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
   14218     'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
   14219     'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
   14220     'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
   14221     'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
   14222     'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
   14223     'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',
   14224     'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
   14225     'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
   14226     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14227     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
   14228     'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
   14229     'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
   14230     'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
   14231     'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
   14232     'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
   14233     'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
   14234     'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
   14235     '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
   14236     '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
   14237     '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
   14238     '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
   14239   WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14240     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14241     'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
   14242     'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
   14243     'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
   14244     'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
   14245     'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
   14246     'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
   14247     'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
   14248     'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
   14249     'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
   14250     'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
   14251     'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
   14252     'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
   14253     'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
   14254     'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
   14255     'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
   14256     'zcaron', 'Ydieresis', '', 'exclamdown', 'cent', 'sterling',
   14257     'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
   14258     'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
   14259     'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
   14260     'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
   14261     'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
   14262     'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
   14263     'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
   14264     'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
   14265     'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
   14266     'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
   14267     'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
   14268     'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
   14269     'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
   14270     'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
   14271     'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
   14272     'ydieresis'],
   14273   symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14274     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14275     'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
   14276     'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
   14277     'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
   14278     'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
   14279     'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
   14280     'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
   14281     'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
   14282     'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
   14283     'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
   14284     'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
   14285     'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
   14286     'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
   14287     'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
   14288     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14289     '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
   14290     'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
   14291     'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
   14292     'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
   14293     'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
   14294     'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
   14295     'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
   14296     'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
   14297     'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
   14298     'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
   14299     'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
   14300     'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
   14301     'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
   14302     'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
   14303     'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
   14304     'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
   14305     '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
   14306     'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
   14307     'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
   14308     'bracerightbt'],
   14309   zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14310     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14311     'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
   14312     'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
   14313     'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
   14314     'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
   14315     'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
   14316     'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
   14317     'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
   14318     'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
   14319     'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
   14320     'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14321     '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
   14322     '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112',
   14323     'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125',
   14324     'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134',
   14325     'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143',
   14326     'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152',
   14327     'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161',
   14328     'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169',
   14329     'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177',
   14330     'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201',
   14331     'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187',
   14332     'a188', 'a189', 'a190', 'a191']
   14333 };
   14334 
   14335 /**
   14336  * Hold a map of decoded fonts and of the standard fourteen Type1
   14337  * fonts and their acronyms.
   14338  */
   14339 var stdFontMap = {
   14340   'ArialNarrow': 'Helvetica',
   14341   'ArialNarrow-Bold': 'Helvetica-Bold',
   14342   'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
   14343   'ArialNarrow-Italic': 'Helvetica-Oblique',
   14344   'ArialBlack': 'Helvetica',
   14345   'ArialBlack-Bold': 'Helvetica-Bold',
   14346   'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
   14347   'ArialBlack-Italic': 'Helvetica-Oblique',
   14348   'Arial': 'Helvetica',
   14349   'Arial-Bold': 'Helvetica-Bold',
   14350   'Arial-BoldItalic': 'Helvetica-BoldOblique',
   14351   'Arial-Italic': 'Helvetica-Oblique',
   14352   'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
   14353   'Arial-BoldMT': 'Helvetica-Bold',
   14354   'Arial-ItalicMT': 'Helvetica-Oblique',
   14355   'ArialMT': 'Helvetica',
   14356   'Courier-Bold': 'Courier-Bold',
   14357   'Courier-BoldItalic': 'Courier-BoldOblique',
   14358   'Courier-Italic': 'Courier-Oblique',
   14359   'CourierNew': 'Courier',
   14360   'CourierNew-Bold': 'Courier-Bold',
   14361   'CourierNew-BoldItalic': 'Courier-BoldOblique',
   14362   'CourierNew-Italic': 'Courier-Oblique',
   14363   'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
   14364   'CourierNewPS-BoldMT': 'Courier-Bold',
   14365   'CourierNewPS-ItalicMT': 'Courier-Oblique',
   14366   'CourierNewPSMT': 'Courier',
   14367   'Helvetica-Bold': 'Helvetica-Bold',
   14368   'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
   14369   'Helvetica-Italic': 'Helvetica-Oblique',
   14370   'Symbol-Bold': 'Symbol',
   14371   'Symbol-BoldItalic': 'Symbol',
   14372   'Symbol-Italic': 'Symbol',
   14373   'TimesNewRoman': 'Times-Roman',
   14374   'TimesNewRoman-Bold': 'Times-Bold',
   14375   'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
   14376   'TimesNewRoman-Italic': 'Times-Italic',
   14377   'TimesNewRomanPS': 'Times-Roman',
   14378   'TimesNewRomanPS-Bold': 'Times-Bold',
   14379   'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
   14380   'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
   14381   'TimesNewRomanPS-BoldMT': 'Times-Bold',
   14382   'TimesNewRomanPS-Italic': 'Times-Italic',
   14383   'TimesNewRomanPS-ItalicMT': 'Times-Italic',
   14384   'TimesNewRomanPSMT': 'Times-Roman',
   14385   'TimesNewRomanPSMT-Bold': 'Times-Bold',
   14386   'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
   14387   'TimesNewRomanPSMT-Italic': 'Times-Italic'
   14388 };
   14389 
   14390 /**
   14391  * Holds the map of the non-standard fonts that might be included as a standard
   14392  * fonts without glyph data.
   14393  */
   14394 var nonStdFontMap = {
   14395   'ComicSansMS': 'Comic Sans MS',
   14396   'ComicSansMS-Bold': 'Comic Sans MS-Bold',
   14397   'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
   14398   'ComicSansMS-Italic': 'Comic Sans MS-Italic',
   14399   'LucidaConsole': 'Courier',
   14400   'LucidaConsole-Bold': 'Courier-Bold',
   14401   'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
   14402   'LucidaConsole-Italic': 'Courier-Oblique'
   14403 };
   14404 
   14405 var serifFonts = {
   14406   'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
   14407   'Aldus': true, 'Alexandria': true, 'Algerian': true,
   14408   'American Typewriter': true, 'Antiqua': true, 'Apex': true,
   14409   'Arno': true, 'Aster': true, 'Aurora': true,
   14410   'Baskerville': true, 'Bell': true, 'Bembo': true,
   14411   'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
   14412   'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
   14413   'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
   14414   'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
   14415   'Calvert': true, 'Capitals': true, 'Cambria': true,
   14416   'Cartier': true, 'Caslon': true, 'Catull': true,
   14417   'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
   14418   'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
   14419   'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
   14420   'Cochin': true, 'Colonna': true, 'Computer Modern': true,
   14421   'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
   14422   'Corona': true, 'Ecotype': true, 'Egyptienne': true,
   14423   'Elephant': true, 'Excelsior': true, 'Fairfield': true,
   14424   'FF Scala': true, 'Folkard': true, 'Footlight': true,
   14425   'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
   14426   'Gentium': true, 'Georgia': true, 'Gloucester': true,
   14427   'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
   14428   'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
   14429   'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
   14430   'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
   14431   'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
   14432   'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
   14433   'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
   14434   'Lucida Bright': true, 'Melior': true, 'Memphis': true,
   14435   'Miller': true, 'Minion': true, 'Modern': true,
   14436   'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
   14437   'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
   14438   'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
   14439   'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
   14440   'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
   14441   'Requiem': true, 'Rockwell': true, 'Roman': true,
   14442   'Rotis Serif': true, 'Sabon': true, 'Scala': true,
   14443   'Seagull': true, 'Sistina': true, 'Souvenir': true,
   14444   'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
   14445   'Sylfaen': true, 'Times': true, 'Trajan': true,
   14446   'Trinit': true, 'Trump Mediaeval': true, 'Utopia': true,
   14447   'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
   14448   'Versailles': true, 'Wanted': true, 'Weiss': true,
   14449   'Wide Latin': true, 'Windsor': true, 'XITS': true
   14450 };
   14451 
   14452 var symbolsFonts = {
   14453   'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
   14454 };
   14455 
   14456 // Some characters, e.g. copyrightserif, mapped to the private use area and
   14457 // might not be displayed using standard fonts. Mapping/hacking well-known chars
   14458 // to the similar equivalents in the normal characters range.
   14459 function mapPrivateUseChars(code) {
   14460   switch (code) {
   14461     case 0xF8E9: // copyrightsans
   14462     case 0xF6D9: // copyrightserif
   14463       return 0x00A9; // copyright
   14464     default:
   14465       return code;
   14466   }
   14467 }
   14468 
   14469 var FontLoader = {
   14470   listeningForFontLoad: false,
   14471 
   14472   bind: function fontLoaderBind(fonts, callback) {
   14473     function checkFontsLoaded() {
   14474       for (var i = 0, ii = fonts.length; i < ii; i++) {
   14475         var fontObj = fonts[i];
   14476         if (fontObj.loading) {
   14477           return false;
   14478         }
   14479       }
   14480 
   14481       PdfJS_window.document.documentElement.removeEventListener(
   14482         'pdfjsFontLoad', checkFontsLoaded, false);
   14483 
   14484       callback();
   14485       return true;
   14486     }
   14487 
   14488     var rules = [], names = [], fontsToLoad = [];
   14489     var fontCreateTimer = 0;
   14490 
   14491     for (var i = 0, ii = fonts.length; i < ii; i++) {
   14492       var font = fonts[i];
   14493 
   14494       // Add the font to the DOM only once or skip if the font
   14495       // is already loaded.
   14496       if (font.attached || font.loading == false) {
   14497         continue;
   14498       }
   14499       font.attached = true;
   14500 
   14501       fontsToLoad.push(font);
   14502 
   14503       var str = '';
   14504       var data = font.data;
   14505       if (data) {
   14506         var length = data.length;
   14507         for (var j = 0; j < length; j++)
   14508           str += String.fromCharCode(data[j]);
   14509 
   14510         var rule = font.bindDOM(str);
   14511         if (rule) {
   14512           rules.push(rule);
   14513           names.push(font.loadedName);
   14514         }
   14515       }
   14516     }
   14517 
   14518     this.listeningForFontLoad = false;
   14519     if (!isWorker && rules.length) {
   14520       FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad);
   14521     }
   14522 
   14523     if (!checkFontsLoaded()) {
   14524       PdfJS_window.document.documentElement.addEventListener(
   14525         'pdfjsFontLoad', checkFontsLoaded, false);
   14526     }
   14527   },
   14528   // Set things up so that at least one pdfjsFontLoad event is
   14529   // dispatched when all the @font-face |rules| for |names| have been
   14530   // loaded in a subdocument.  It's expected that the load of |rules|
   14531   // has already started in this (outer) document, so that they should
   14532   // be ordered before the load in the subdocument.
   14533   prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names,
   14534                                                                 fonts) {
   14535       /** Hack begin */
   14536       // There's no event when a font has finished downloading so the
   14537       // following code is a dirty hack to 'guess' when a font is
   14538       // ready.  This code will be obsoleted by Mozilla bug 471915.
   14539       //
   14540       // The only reliable way to know if a font is loaded in Gecko
   14541       // (at the moment) is document.onload in a document with
   14542       // a @font-face rule defined in a "static" stylesheet.  We use a
   14543       // subdocument in an <iframe>, set up properly, to know when
   14544       // our @font-face rule was loaded.  However, the subdocument and
   14545       // outer document can't share CSS rules, so the inner document
   14546       // is only part of the puzzle.  The second piece is an invisible
   14547       // div created in order to force loading of the @font-face in
   14548       // the *outer* document.  (The font still needs to be loaded for
   14549       // its metrics, for reflow).  We create the div first for the
   14550       // outer document, then create the iframe.  Unless something
   14551       // goes really wonkily, we expect the @font-face for the outer
   14552       // document to be processed before the inner.  That's still
   14553       // fragile, but seems to work in practice.
   14554       //
   14555       // The postMessage() hackery was added to work around chrome bug
   14556       // 82402.
   14557 
   14558       // Validate the names parameter -- the values can used to construct HTML.
   14559       if (!/^\w+$/.test(names.join(''))) {
   14560         error('Invalid font name(s): ' + names.join());
   14561 
   14562         // Normally the error-function throws. But if a malicious code
   14563         // intercepts the function call then the return is needed.
   14564         return;
   14565       }
   14566 
   14567       var div = PdfJS_window.document.createElement('div');
   14568       div.setAttribute('style',
   14569                        'visibility: hidden;' +
   14570                        'width: 10px; height: 10px;' +
   14571                        'position: absolute; top: 0px; left: 0px;');
   14572       var html = '';
   14573       for (var i = 0, ii = names.length; i < ii; ++i) {
   14574         html += '<span style="font-family:' + names[i] + '">Hi</span>';
   14575       }
   14576       div.innerHTML = html;
   14577       PdfJS_window.document.body.appendChild(div);
   14578 
   14579       if (!this.listeningForFontLoad) {
   14580         PdfJS_window.window.addEventListener(
   14581           'message',
   14582           function fontLoaderMessage(e) {
   14583             var fontNames = JSON.parse(e.data);
   14584             for (var i = 0, ii = fonts.length; i < ii; ++i) {
   14585               var font = fonts[i];
   14586               font.loading = false;
   14587             }
   14588             var evt = PdfJS_window.document.createEvent('Events');
   14589             evt.initEvent('pdfjsFontLoad', true, false);
   14590             PdfJS_window.document.documentElement.dispatchEvent(evt);
   14591           },
   14592           false);
   14593         this.listeningForFontLoad = true;
   14594       }
   14595 
   14596       // XXX we should have a time-out here too, and maybe fire
   14597       // pdfjsFontLoadFailed?
   14598       var src = '<!DOCTYPE HTML><html><head>';
   14599       src += '<style type="text/css">';
   14600       for (var i = 0, ii = rules.length; i < ii; ++i) {
   14601         src += rules[i];
   14602       }
   14603       src += '</style>';
   14604       src += '<script type="application/javascript">';
   14605       var fontNamesArray = '';
   14606       for (var i = 0, ii = names.length; i < ii; ++i) {
   14607         fontNamesArray += '"' + names[i] + '", ';
   14608       }
   14609       src += '  var fontNames=[' + fontNamesArray + '];\n';
   14610       src += '  PdfJS_window.window.onload = function fontLoaderOnload() {\n';
   14611       src += '    parent.postMessage(JSON.stringify(fontNames), "*");\n';
   14612       src += '  }';
   14613       // Hack so the end script tag isn't counted if this is inline JS.
   14614       src += '</scr' + 'ipt></head><body>';
   14615       for (var i = 0, ii = names.length; i < ii; ++i) {
   14616         src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
   14617       }
   14618       src += '</body></html>';
   14619       var frame = PdfJS_window.document.createElement('iframe');
   14620       frame.src = 'data:text/html,' + src;
   14621       frame.setAttribute('style',
   14622                          'visibility: hidden;' +
   14623                          'width: 10px; height: 10px;' +
   14624                          'position: absolute; top: 0px; left: 0px;');
   14625       PdfJS_window.document.body.appendChild(frame);
   14626       /** Hack end */
   14627   }
   14628 };
   14629 
   14630 var UnicodeRanges = [
   14631   { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
   14632   { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
   14633   { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
   14634   { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
   14635   { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
   14636   { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
   14637   { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
   14638   { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
   14639   { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
   14640   { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
   14641   { 'begin': 0x0530, 'end': 0x058F }, // Armenian
   14642   { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
   14643   { 'begin': 0xA500, 'end': 0xA63F }, // Vai
   14644   { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
   14645   { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
   14646   { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
   14647   { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
   14648   { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
   14649   { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
   14650   { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
   14651   { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
   14652   { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
   14653   { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
   14654   { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
   14655   { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
   14656   { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
   14657   { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
   14658   { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
   14659   { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
   14660   { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
   14661   { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
   14662   { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
   14663   { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
   14664   { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
   14665   { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
   14666   { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
   14667   { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
   14668   { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
   14669   { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
   14670   { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
   14671   { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
   14672   { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
   14673   { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
   14674   { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
   14675   { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
   14676   { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
   14677   { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
   14678   { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
   14679   { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
   14680   { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
   14681   { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
   14682   { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
   14683   { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
   14684   { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
   14685   { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
   14686   { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
   14687   { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
   14688   { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
   14689   { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
   14690   { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
   14691   { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
   14692   { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
   14693   { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
   14694   { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
   14695   { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
   14696   { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
   14697   { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
   14698   { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
   14699   { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
   14700   { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
   14701   { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
   14702   { 'begin': 0x0700, 'end': 0x074F }, // Syriac
   14703   { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
   14704   { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
   14705   { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
   14706   { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
   14707   { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
   14708   { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
   14709   { 'begin': 0x1680, 'end': 0x169F }, // Ogham
   14710   { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
   14711   { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
   14712   { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
   14713   { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
   14714   { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
   14715   { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
   14716   { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
   14717   { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
   14718   { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
   14719   { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
   14720   { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
   14721   { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
   14722   { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
   14723   { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
   14724   { 'begin': 0x1900, 'end': 0x194F }, // Limbu
   14725   { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
   14726   { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
   14727   { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
   14728   { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
   14729   { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
   14730   { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
   14731   { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
   14732   { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
   14733   { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
   14734   { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
   14735   { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
   14736   { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
   14737   { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
   14738   { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
   14739   { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
   14740   { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
   14741   { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
   14742   { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
   14743   { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
   14744   { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
   14745   { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
   14746   { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
   14747   { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
   14748   { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
   14749   { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
   14750   { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
   14751   { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
   14752   { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
   14753   { 'begin': 0x1F030, 'end': 0x1F09F }  // Domino Tiles
   14754 ];
   14755 
   14756 var MacStandardGlyphOrdering = [
   14757   '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
   14758   'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
   14759   'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
   14760   'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
   14761   'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
   14762   'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
   14763   'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
   14764   'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
   14765   'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
   14766   'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
   14767   'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
   14768   'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
   14769   'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
   14770   'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
   14771   'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
   14772   'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
   14773   'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
   14774   'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
   14775   'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
   14776   'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
   14777   'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
   14778   'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
   14779   'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
   14780   'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
   14781   'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
   14782   'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
   14783   'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
   14784   'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
   14785   'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
   14786   'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
   14787   'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
   14788   'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
   14789   'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
   14790   'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
   14791   'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
   14792   'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
   14793 
   14794 function getUnicodeRangeFor(value) {
   14795   for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
   14796     var range = UnicodeRanges[i];
   14797     if (value >= range.begin && value < range.end)
   14798       return i;
   14799   }
   14800   return -1;
   14801 }
   14802 
   14803 function isRTLRangeFor(value) {
   14804   var range = UnicodeRanges[13];
   14805   if (value >= range.begin && value < range.end)
   14806     return true;
   14807   range = UnicodeRanges[11];
   14808   if (value >= range.begin && value < range.end)
   14809     return true;
   14810   return false;
   14811 }
   14812 
   14813 function isSpecialUnicode(unicode) {
   14814   return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ||
   14815     (unicode >= kCmapGlyphOffset &&
   14816     unicode < kCmapGlyphOffset + kSizeOfGlyphArea);
   14817 }
   14818 
   14819 /**
   14820  * 'Font' is the class the outside world should use, it encapsulate all the font
   14821  * decoding logics whatever type it is (assuming the font type is supported).
   14822  *
   14823  * For example to read a Type1 font and to attach it to the document:
   14824  *   var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
   14825  *   type1Font.bind();
   14826  */
   14827 var Font = (function FontClosure() {
   14828   function Font(name, file, properties) {
   14829     this.name = name;
   14830     this.coded = properties.coded;
   14831     this.charProcOperatorList = properties.charProcOperatorList;
   14832     this.sizes = [];
   14833 
   14834     var names = name.split('+');
   14835     names = names.length > 1 ? names[1] : names[0];
   14836     names = names.split(/[-,_]/g)[0];
   14837     this.isSerifFont = !!(properties.flags & FontFlags.Serif);
   14838     this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
   14839 
   14840     var type = properties.type;
   14841     this.type = type;
   14842 
   14843     // If the font is to be ignored, register it like an already loaded font
   14844     // to avoid the cost of waiting for it be be loaded by the platform.
   14845     if (properties.ignore) {
   14846       this.loadedName = this.isSerifFont ? 'serif' : 'sans-serif';
   14847       this.loading = false;
   14848       return;
   14849     }
   14850 
   14851     this.differences = properties.differences;
   14852     this.widths = properties.widths;
   14853     this.defaultWidth = properties.defaultWidth;
   14854     this.composite = properties.composite;
   14855     this.wideChars = properties.wideChars;
   14856     this.hasEncoding = properties.hasEncoding;
   14857 
   14858     this.fontMatrix = properties.fontMatrix;
   14859     this.widthMultiplier = 1.0;
   14860     if (properties.type == 'Type3') {
   14861       this.encoding = properties.baseEncoding;
   14862       return;
   14863     }
   14864 
   14865     // Trying to fix encoding using glyph CIDSystemInfo.
   14866     this.loadCidToUnicode(properties);
   14867 
   14868     if (properties.toUnicode)
   14869       this.toUnicode = properties.toUnicode;
   14870     else
   14871       this.rebuildToUnicode(properties);
   14872 
   14873     this.toFontChar = this.buildToFontChar(this.toUnicode);
   14874 
   14875     if (!file) {
   14876       // The file data is not specified. Trying to fix the font name
   14877       // to be used with the canvas.font.
   14878       var fontName = name.replace(/[,_]/g, '-');
   14879       fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
   14880 
   14881       this.bold = (fontName.search(/bold/gi) != -1);
   14882       this.italic = (fontName.search(/oblique/gi) != -1) ||
   14883                     (fontName.search(/italic/gi) != -1);
   14884 
   14885       // Use 'name' instead of 'fontName' here because the original
   14886       // name ArialBlack for example will be replaced by Helvetica.
   14887       this.black = (name.search(/Black/g) != -1);
   14888 
   14889       this.encoding = properties.baseEncoding;
   14890       this.noUnicodeAdaptation = true;
   14891       this.loadedName = fontName.split('-')[0];
   14892       this.loading = false;
   14893       return;
   14894     }
   14895 
   14896     var data;
   14897     switch (type) {
   14898       case 'Type1':
   14899       case 'CIDFontType0':
   14900         this.mimetype = 'font/opentype';
   14901 
   14902         var subtype = properties.subtype;
   14903         var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
   14904           new CFFFont(file, properties) : new Type1Font(name, file, properties);
   14905 
   14906         // Wrap the CFF data inside an OTF font file
   14907         data = this.convert(name, cff, properties);
   14908         break;
   14909 
   14910       case 'TrueType':
   14911       case 'CIDFontType2':
   14912         this.mimetype = 'font/opentype';
   14913 
   14914         // Repair the TrueType file. It is can be damaged in the point of
   14915         // view of the sanitizer
   14916         data = this.checkAndRepair(name, file, properties);
   14917         break;
   14918 
   14919       default:
   14920         warn('Font ' + properties.type + ' is not supported');
   14921         break;
   14922     }
   14923 
   14924     this.data = data;
   14925     this.fontMatrix = properties.fontMatrix;
   14926     this.widthMultiplier = !properties.fontMatrix ? 1.0 :
   14927       1.0 / properties.fontMatrix[0];
   14928     this.encoding = properties.baseEncoding;
   14929     this.loadedName = properties.loadedName;
   14930     this.loading = true;
   14931   };
   14932 
   14933   var numFonts = 0;
   14934   function getUniqueName() {
   14935     return 'pdfFont' + numFonts++;
   14936   }
   14937 
   14938   function stringToArray(str) {
   14939     var array = [];
   14940     for (var i = 0, ii = str.length; i < ii; ++i)
   14941       array[i] = str.charCodeAt(i);
   14942 
   14943     return array;
   14944   };
   14945 
   14946   function arrayToString(arr) {
   14947     var str = '';
   14948     for (var i = 0, ii = arr.length; i < ii; ++i)
   14949       str += String.fromCharCode(arr[i]);
   14950 
   14951     return str;
   14952   };
   14953 
   14954   function int16(bytes) {
   14955     return (bytes[0] << 8) + (bytes[1] & 0xff);
   14956   };
   14957 
   14958   function int32(bytes) {
   14959     return (bytes[0] << 24) + (bytes[1] << 16) +
   14960            (bytes[2] << 8) + (bytes[3] & 0xff);
   14961   };
   14962 
   14963   function getMaxPower2(number) {
   14964     var maxPower = 0;
   14965     var value = number;
   14966     while (value >= 2) {
   14967       value /= 2;
   14968       maxPower++;
   14969     }
   14970 
   14971     value = 2;
   14972     for (var i = 1; i < maxPower; i++)
   14973       value *= 2;
   14974     return value;
   14975   };
   14976 
   14977   function string16(value) {
   14978     return String.fromCharCode((value >> 8) & 0xff) +
   14979            String.fromCharCode(value & 0xff);
   14980   };
   14981 
   14982   function safeString16(value) {
   14983     // clamp value to the 16-bit int range
   14984     value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;
   14985     return String.fromCharCode((value >> 8) & 0xff) +
   14986            String.fromCharCode(value & 0xff);
   14987   };
   14988 
   14989   function string32(value) {
   14990     return String.fromCharCode((value >> 24) & 0xff) +
   14991            String.fromCharCode((value >> 16) & 0xff) +
   14992            String.fromCharCode((value >> 8) & 0xff) +
   14993            String.fromCharCode(value & 0xff);
   14994   };
   14995 
   14996   function createOpenTypeHeader(sfnt, file, numTables) {
   14997     // Windows hates the Mac TrueType sfnt version number
   14998     if (sfnt == 'true')
   14999       sfnt = string32(0x00010000);
   15000 
   15001     // sfnt version (4 bytes)
   15002     var header = sfnt;
   15003 
   15004     // numTables (2 bytes)
   15005     header += string16(numTables);
   15006 
   15007     // searchRange (2 bytes)
   15008     var tablesMaxPower2 = getMaxPower2(numTables);
   15009     var searchRange = tablesMaxPower2 * 16;
   15010     header += string16(searchRange);
   15011 
   15012     // entrySelector (2 bytes)
   15013     header += string16(Math.log(tablesMaxPower2) / Math.log(2));
   15014 
   15015     // rangeShift (2 bytes)
   15016     header += string16(numTables * 16 - searchRange);
   15017 
   15018     file.file += header;
   15019     file.virtualOffset += header.length;
   15020   };
   15021 
   15022   function createTableEntry(file, tag, data) {
   15023     // offset
   15024     var offset = file.virtualOffset;
   15025 
   15026     // length
   15027     var length = data.length;
   15028 
   15029     // Per spec tables must be 4-bytes align so add padding as needed
   15030     while (data.length & 3)
   15031       data.push(0x00);
   15032 
   15033     while (file.virtualOffset & 3)
   15034       file.virtualOffset++;
   15035 
   15036     // checksum
   15037     var checksum = 0, n = data.length;
   15038     for (var i = 0; i < n; i += 4)
   15039       checksum = (checksum + int32([data[i], data[i + 1], data[i + 2],
   15040                                     data[i + 3]])) | 0;
   15041 
   15042     var tableEntry = (tag + string32(checksum) +
   15043                       string32(offset) + string32(length));
   15044     file.file += tableEntry;
   15045     file.virtualOffset += data.length;
   15046   };
   15047 
   15048   function getRanges(glyphs) {
   15049     // Array.sort() sorts by characters, not numerically, so convert to an
   15050     // array of characters.
   15051     var codes = [];
   15052     var length = glyphs.length;
   15053     for (var n = 0; n < length; ++n)
   15054       codes.push({ unicode: glyphs[n].unicode, code: n });
   15055     codes.sort(function fontGetRangesSort(a, b) {
   15056       return a.unicode - b.unicode;
   15057     });
   15058 
   15059     // Split the sorted codes into ranges.
   15060     var ranges = [];
   15061     for (var n = 0; n < length; ) {
   15062       var start = codes[n].unicode;
   15063       var codeIndices = [codes[n].code];
   15064       ++n;
   15065       var end = start;
   15066       while (n < length && end + 1 == codes[n].unicode) {
   15067         codeIndices.push(codes[n].code);
   15068         ++end;
   15069         ++n;
   15070       }
   15071       ranges.push([start, end, codeIndices]);
   15072     }
   15073 
   15074     return ranges;
   15075   };
   15076 
   15077   function createCMapTable(glyphs, deltas) {
   15078     var ranges = getRanges(glyphs);
   15079 
   15080     var numTables = 1;
   15081     var cmap = '\x00\x00' + // version
   15082                string16(numTables) +  // numTables
   15083                '\x00\x03' + // platformID
   15084                '\x00\x01' + // encodingID
   15085                string32(4 + numTables * 8); // start of the table record
   15086 
   15087     var segCount = ranges.length + 1;
   15088     var segCount2 = segCount * 2;
   15089     var searchRange = getMaxPower2(segCount) * 2;
   15090     var searchEntry = Math.log(segCount) / Math.log(2);
   15091     var rangeShift = 2 * segCount - searchRange;
   15092 
   15093     // Fill up the 4 parallel arrays describing the segments.
   15094     var startCount = '';
   15095     var endCount = '';
   15096     var idDeltas = '';
   15097     var idRangeOffsets = '';
   15098     var glyphsIds = '';
   15099     var bias = 0;
   15100 
   15101     if (deltas) {
   15102       for (var i = 0; i < segCount - 1; i++) {
   15103         var range = ranges[i];
   15104         var start = range[0];
   15105         var end = range[1];
   15106         var offset = (segCount - i) * 2 + bias * 2;
   15107         bias += (end - start + 1);
   15108 
   15109         startCount += string16(start);
   15110         endCount += string16(end);
   15111         idDeltas += string16(0);
   15112         idRangeOffsets += string16(offset);
   15113 
   15114         var codes = range[2];
   15115         for (var j = 0, jj = codes.length; j < jj; ++j)
   15116           glyphsIds += string16(deltas[codes[j]]);
   15117       }
   15118     } else {
   15119       for (var i = 0; i < segCount - 1; i++) {
   15120         var range = ranges[i];
   15121         var start = range[0];
   15122         var end = range[1];
   15123         var startCode = range[2][0];
   15124 
   15125         startCount += string16(start);
   15126         endCount += string16(end);
   15127         idDeltas += string16((startCode - start + 1) & 0xFFFF);
   15128         idRangeOffsets += string16(0);
   15129       }
   15130     }
   15131 
   15132     endCount += '\xFF\xFF';
   15133     startCount += '\xFF\xFF';
   15134     idDeltas += '\x00\x01';
   15135     idRangeOffsets += '\x00\x00';
   15136 
   15137     var format314 = '\x00\x00' + // language
   15138                     string16(segCount2) +
   15139                     string16(searchRange) +
   15140                     string16(searchEntry) +
   15141                     string16(rangeShift) +
   15142                     endCount + '\x00\x00' + startCount +
   15143                     idDeltas + idRangeOffsets + glyphsIds;
   15144 
   15145     return stringToArray(cmap +
   15146                          '\x00\x04' + // format
   15147                          string16(format314.length + 4) + // length
   15148                          format314);
   15149   };
   15150 
   15151   function createOS2Table(properties, charstrings, override) {
   15152     override = override || {
   15153       unitsPerEm: 0,
   15154       yMax: 0,
   15155       yMin: 0,
   15156       ascent: 0,
   15157       descent: 0
   15158     };
   15159 
   15160     var ulUnicodeRange1 = 0;
   15161     var ulUnicodeRange2 = 0;
   15162     var ulUnicodeRange3 = 0;
   15163     var ulUnicodeRange4 = 0;
   15164 
   15165     var firstCharIndex = null;
   15166     var lastCharIndex = 0;
   15167 
   15168     if (charstrings) {
   15169       for (var i = 0; i < charstrings.length; ++i) {
   15170         var code = charstrings[i].unicode;
   15171         if (firstCharIndex > code || !firstCharIndex)
   15172           firstCharIndex = code;
   15173         if (lastCharIndex < code)
   15174           lastCharIndex = code;
   15175 
   15176         var position = getUnicodeRangeFor(code);
   15177         if (position < 32) {
   15178           ulUnicodeRange1 |= 1 << position;
   15179         } else if (position < 64) {
   15180           ulUnicodeRange2 |= 1 << position - 32;
   15181         } else if (position < 96) {
   15182           ulUnicodeRange3 |= 1 << position - 64;
   15183         } else if (position < 123) {
   15184           ulUnicodeRange4 |= 1 << position - 96;
   15185         } else {
   15186           error('Unicode ranges Bits > 123 are reserved for internal usage');
   15187         }
   15188       }
   15189     } else {
   15190       // TODO
   15191       firstCharIndex = 0;
   15192       lastCharIndex = 255;
   15193     }
   15194 
   15195     var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits;
   15196     var typoAscent = override.ascent || properties.ascent;
   15197     var typoDescent = override.descent || properties.descent;
   15198     var winAscent = override.yMax || typoAscent;
   15199     var winDescent = -override.yMin || -typoDescent;
   15200 
   15201     // if there is a units per em value but no other override
   15202     // then scale the calculated ascent
   15203     if (unitsPerEm != kPDFGlyphSpaceUnits &&
   15204         'undefined' == typeof(override.ascent)) {
   15205       // if the font units differ to the PDF glyph space units
   15206       // then scale up the values
   15207       typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits);
   15208       typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits);
   15209       winAscent = typoAscent;
   15210       winDescent = -typoDescent;
   15211     }
   15212 
   15213     return '\x00\x03' + // version
   15214            '\x02\x24' + // xAvgCharWidth
   15215            '\x01\xF4' + // usWeightClass
   15216            '\x00\x05' + // usWidthClass
   15217            '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
   15218            '\x02\x8A' + // ySubscriptXSize
   15219            '\x02\xBB' + // ySubscriptYSize
   15220            '\x00\x00' + // ySubscriptXOffset
   15221            '\x00\x8C' + // ySubscriptYOffset
   15222            '\x02\x8A' + // ySuperScriptXSize
   15223            '\x02\xBB' + // ySuperScriptYSize
   15224            '\x00\x00' + // ySuperScriptXOffset
   15225            '\x01\xDF' + // ySuperScriptYOffset
   15226            '\x00\x31' + // yStrikeOutSize
   15227            '\x01\x02' + // yStrikeOutPosition
   15228            '\x00\x00' + // sFamilyClass
   15229            '\x00\x00\x06' +
   15230            String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
   15231            '\x00\x00\x00\x00\x00\x00' + // Panose
   15232            string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
   15233            string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
   15234            string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
   15235            string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
   15236            '\x2A\x32\x31\x2A' + // achVendID
   15237            string16(properties.italicAngle ? 1 : 0) + // fsSelection
   15238            string16(firstCharIndex ||
   15239                     properties.firstChar) + // usFirstCharIndex
   15240            string16(lastCharIndex || properties.lastChar) +  // usLastCharIndex
   15241            string16(typoAscent) + // sTypoAscender
   15242            string16(typoDescent) + // sTypoDescender
   15243            '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
   15244            string16(winAscent) + // usWinAscent
   15245            string16(winDescent) + // usWinDescent
   15246            '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
   15247            '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
   15248            string16(properties.xHeight) + // sxHeight
   15249            string16(properties.capHeight) + // sCapHeight
   15250            string16(0) + // usDefaultChar
   15251            string16(firstCharIndex || properties.firstChar) + // usBreakChar
   15252            '\x00\x03';  // usMaxContext
   15253   };
   15254 
   15255   function createPostTable(properties) {
   15256     var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
   15257     return '\x00\x03\x00\x00' + // Version number
   15258            string32(angle) + // italicAngle
   15259            '\x00\x00' + // underlinePosition
   15260            '\x00\x00' + // underlineThickness
   15261            string32(properties.fixedPitch) + // isFixedPitch
   15262            '\x00\x00\x00\x00' + // minMemType42
   15263            '\x00\x00\x00\x00' + // maxMemType42
   15264            '\x00\x00\x00\x00' + // minMemType1
   15265            '\x00\x00\x00\x00';  // maxMemType1
   15266   };
   15267 
   15268   function createNameTable(name) {
   15269     var strings = [
   15270       'Original licence',  // 0.Copyright
   15271       name,                // 1.Font family
   15272       'Unknown',           // 2.Font subfamily (font weight)
   15273       'uniqueID',          // 3.Unique ID
   15274       name,                // 4.Full font name
   15275       'Version 0.11',      // 5.Version
   15276       '',                  // 6.Postscript name
   15277       'Unknown',           // 7.Trademark
   15278       'Unknown',           // 8.Manufacturer
   15279       'Unknown'            // 9.Designer
   15280     ];
   15281 
   15282     // Mac want 1-byte per character strings while Windows want
   15283     // 2-bytes per character, so duplicate the names table
   15284     var stringsUnicode = [];
   15285     for (var i = 0, ii = strings.length; i < ii; i++) {
   15286       var str = strings[i];
   15287 
   15288       var strUnicode = '';
   15289       for (var j = 0, jj = str.length; j < jj; j++)
   15290         strUnicode += string16(str.charCodeAt(j));
   15291       stringsUnicode.push(strUnicode);
   15292     }
   15293 
   15294     var names = [strings, stringsUnicode];
   15295     var platforms = ['\x00\x01', '\x00\x03'];
   15296     var encodings = ['\x00\x00', '\x00\x01'];
   15297     var languages = ['\x00\x00', '\x04\x09'];
   15298 
   15299     var namesRecordCount = strings.length * platforms.length;
   15300     var nameTable =
   15301       '\x00\x00' +                           // format
   15302       string16(namesRecordCount) +           // Number of names Record
   15303       string16(namesRecordCount * 12 + 6);   // Storage
   15304 
   15305     // Build the name records field
   15306     var strOffset = 0;
   15307     for (var i = 0, ii = platforms.length; i < ii; i++) {
   15308       var strs = names[i];
   15309       for (var j = 0, jj = strs.length; j < jj; j++) {
   15310         var str = strs[j];
   15311         var nameRecord =
   15312           platforms[i] + // platform ID
   15313           encodings[i] + // encoding ID
   15314           languages[i] + // language ID
   15315           string16(j) + // name ID
   15316           string16(str.length) +
   15317           string16(strOffset);
   15318         nameTable += nameRecord;
   15319         strOffset += str.length;
   15320       }
   15321     }
   15322 
   15323     nameTable += strings.join('') + stringsUnicode.join('');
   15324     return nameTable;
   15325   }
   15326 
   15327   Font.prototype = {
   15328     name: null,
   15329     font: null,
   15330     mimetype: null,
   15331     encoding: null,
   15332 
   15333     checkAndRepair: function Font_checkAndRepair(name, font, properties) {
   15334       function readTableEntry(file) {
   15335         var tag = file.getBytes(4);
   15336         tag = String.fromCharCode(tag[0]) +
   15337               String.fromCharCode(tag[1]) +
   15338               String.fromCharCode(tag[2]) +
   15339               String.fromCharCode(tag[3]);
   15340 
   15341         var checksum = int32(file.getBytes(4));
   15342         var offset = int32(file.getBytes(4));
   15343         var length = int32(file.getBytes(4));
   15344 
   15345         // Read the table associated data
   15346         var previousPosition = file.pos;
   15347         file.pos = file.start ? file.start : 0;
   15348         file.skip(offset);
   15349         var data = file.getBytes(length);
   15350         file.pos = previousPosition;
   15351 
   15352         if (tag == 'head') {
   15353           // clearing checksum adjustment
   15354           data[8] = data[9] = data[10] = data[11] = 0;
   15355           data[17] |= 0x20; //Set font optimized for cleartype flag
   15356         }
   15357 
   15358         return {
   15359           tag: tag,
   15360           checksum: checksum,
   15361           length: length,
   15362           offset: offset,
   15363           data: data
   15364         };
   15365       };
   15366 
   15367       function readOpenTypeHeader(ttf) {
   15368         return {
   15369           version: arrayToString(ttf.getBytes(4)),
   15370           numTables: int16(ttf.getBytes(2)),
   15371           searchRange: int16(ttf.getBytes(2)),
   15372           entrySelector: int16(ttf.getBytes(2)),
   15373           rangeShift: int16(ttf.getBytes(2))
   15374         };
   15375       };
   15376 
   15377       function createGlyphNameMap(glyphs, ids, properties) {
   15378         var glyphNames = properties.glyphNames;
   15379         if (!glyphNames) {
   15380           properties.glyphNameMap = {};
   15381           return;
   15382         }
   15383         var glyphsLength = glyphs.length;
   15384         var glyphNameMap = {};
   15385         var encoding = [];
   15386         for (var i = 0; i < glyphsLength; ++i) {
   15387           var glyphName = glyphNames[ids[i]];
   15388           if (!glyphName)
   15389             continue;
   15390           var unicode = glyphs[i].unicode;
   15391           glyphNameMap[glyphName] = unicode;
   15392           var code = glyphs[i].code;
   15393           encoding[code] = glyphName;
   15394         }
   15395         properties.glyphNameMap = glyphNameMap;
   15396         if (!properties.hasEncoding)
   15397           properties.baseEncoding = encoding;
   15398       }
   15399 
   15400       function readCMapTable(cmap, font) {
   15401         var start = (font.start ? font.start : 0) + cmap.offset;
   15402         font.pos = start;
   15403 
   15404         var version = int16(font.getBytes(2));
   15405         var numRecords = int16(font.getBytes(2));
   15406 
   15407         var records = [];
   15408         for (var i = 0; i < numRecords; i++) {
   15409           records.push({
   15410             platformID: int16(font.getBytes(2)),
   15411             encodingID: int16(font.getBytes(2)),
   15412             offset: int32(font.getBytes(4))
   15413           });
   15414         }
   15415 
   15416         // Check that table are sorted by platformID then encodingID,
   15417         records.sort(function fontReadCMapTableSort(a, b) {
   15418           return ((a.platformID << 16) + a.encodingID) -
   15419                  ((b.platformID << 16) + b.encodingID);
   15420         });
   15421 
   15422         var tables = [records[0]];
   15423         for (var i = 1; i < numRecords; i++) {
   15424           // The sanitizer will drop the font if 2 tables have the same
   15425           // platformID and the same encodingID, this will be correct for
   15426           // most cases but if the font has been made for Mac it could
   15427           // exist a few platformID: 1, encodingID: 0 but with a different
   15428           // language field and that's correct. But the sanitizer does not
   15429           // seem to support this case.
   15430           var current = records[i];
   15431           var previous = records[i - 1];
   15432           if (((current.platformID << 16) + current.encodingID) <=
   15433              ((previous.platformID << 16) + previous.encodingID))
   15434                 continue;
   15435           tables.push(current);
   15436         }
   15437 
   15438         var missing = numRecords - tables.length;
   15439         if (missing) {
   15440           numRecords = tables.length;
   15441           var data = string16(version) + string16(numRecords);
   15442 
   15443           for (var i = 0; i < numRecords; i++) {
   15444             var table = tables[i];
   15445             data += string16(table.platformID) +
   15446                     string16(table.encodingID) +
   15447                     string32(table.offset);
   15448           }
   15449 
   15450           for (var i = 0, ii = data.length; i < ii; i++)
   15451             cmap.data[i] = data.charCodeAt(i);
   15452         }
   15453 
   15454         for (var i = 0; i < numRecords; i++) {
   15455           var table = tables[i];
   15456           font.pos = start + table.offset;
   15457 
   15458           var format = int16(font.getBytes(2));
   15459           var length = int16(font.getBytes(2));
   15460           var language = int16(font.getBytes(2));
   15461 
   15462           if (format == 0) {
   15463             // Characters below 0x20 are controls characters that are hardcoded
   15464             // into the platform so if some characters in the font are assigned
   15465             // under this limit they will not be displayed so let's rewrite the
   15466             // CMap.
   15467             var glyphs = [];
   15468             var ids = [];
   15469             for (var j = 0; j < 256; j++) {
   15470               var index = font.getByte();
   15471               if (index) {
   15472                 glyphs.push({ unicode: j, code: j });
   15473                 ids.push(index);
   15474               }
   15475             }
   15476             return {
   15477               glyphs: glyphs,
   15478               ids: ids,
   15479               hasShortCmap: true
   15480             };
   15481           } else if (format == 4) {
   15482             // re-creating the table in format 4 since the encoding
   15483             // might be changed
   15484             var segCount = (int16(font.getBytes(2)) >> 1);
   15485             font.getBytes(6); // skipping range fields
   15486             var segIndex, segments = [];
   15487             for (segIndex = 0; segIndex < segCount; segIndex++) {
   15488               segments.push({ end: int16(font.getBytes(2)) });
   15489             }
   15490             font.getBytes(2);
   15491             for (segIndex = 0; segIndex < segCount; segIndex++) {
   15492               segments[segIndex].start = int16(font.getBytes(2));
   15493             }
   15494 
   15495             for (segIndex = 0; segIndex < segCount; segIndex++) {
   15496               segments[segIndex].delta = int16(font.getBytes(2));
   15497             }
   15498 
   15499             var offsetsCount = 0;
   15500             for (segIndex = 0; segIndex < segCount; segIndex++) {
   15501               var segment = segments[segIndex];
   15502               var rangeOffset = int16(font.getBytes(2));
   15503               if (!rangeOffset) {
   15504                 segment.offsetIndex = -1;
   15505                 continue;
   15506               }
   15507 
   15508               var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
   15509               segment.offsetIndex = offsetIndex;
   15510               offsetsCount = Math.max(offsetsCount, offsetIndex +
   15511                 segment.end - segment.start + 1);
   15512             }
   15513 
   15514             var offsets = [];
   15515             for (var j = 0; j < offsetsCount; j++)
   15516               offsets.push(int16(font.getBytes(2)));
   15517 
   15518             var glyphs = [], ids = [];
   15519 
   15520             for (segIndex = 0; segIndex < segCount; segIndex++) {
   15521               var segment = segments[segIndex];
   15522               var start = segment.start, end = segment.end;
   15523               var delta = segment.delta, offsetIndex = segment.offsetIndex;
   15524 
   15525               for (var j = start; j <= end; j++) {
   15526                 if (j == 0xFFFF)
   15527                   continue;
   15528 
   15529                 var glyphCode = offsetIndex < 0 ? j :
   15530                   offsets[offsetIndex + j - start];
   15531                 glyphCode = (glyphCode + delta) & 0xFFFF;
   15532                 if (glyphCode == 0)
   15533                   continue;
   15534 
   15535                 glyphs.push({ unicode: j, code: j });
   15536                 ids.push(glyphCode);
   15537               }
   15538             }
   15539 
   15540             return {
   15541               glyphs: glyphs,
   15542               ids: ids
   15543             };
   15544           } else if (format == 6) {
   15545             // Format 6 is a 2-bytes dense mapping, which means the font data
   15546             // lives glue together even if they are pretty far in the unicode
   15547             // table. (This looks weird, so I can have missed something), this
   15548             // works on Linux but seems to fails on Mac so let's rewrite the
   15549             // cmap table to a 3-1-4 style
   15550             var firstCode = int16(font.getBytes(2));
   15551             var entryCount = int16(font.getBytes(2));
   15552 
   15553             var glyphs = [];
   15554             var ids = [];
   15555             for (var j = 0; j < entryCount; j++) {
   15556               var glyphCode = int16(font.getBytes(2));
   15557               var code = firstCode + j;
   15558 
   15559               glyphs.push({ unicode: code, code: code });
   15560               ids.push(glyphCode);
   15561             }
   15562 
   15563             return {
   15564               glyphs: glyphs,
   15565               ids: ids
   15566             };
   15567           }
   15568         }
   15569         error('Unsupported cmap table format');
   15570       };
   15571 
   15572       function sanitizeMetrics(font, header, metrics, numGlyphs) {
   15573         if (!header && !metrics)
   15574           return;
   15575 
   15576         // The vhea/vmtx tables are not required, so it happens that
   15577         // some fonts embed a vmtx table without a vhea table. In this
   15578         // situation the sanitizer assume numOfLongVerMetrics = 1. As
   15579         // a result it tries to read numGlyphs - 1 SHORT from the vmtx
   15580         // table, and if it is not possible, the font is rejected.
   15581         // So remove the vmtx table if there is no vhea table.
   15582         if (!header && metrics) {
   15583           metrics.data = null;
   15584           return;
   15585         }
   15586 
   15587         font.pos = (font.start ? font.start : 0) + header.offset;
   15588         font.pos += header.length - 2;
   15589         var numOfMetrics = int16(font.getBytes(2));
   15590 
   15591         var numOfSidebearings = numGlyphs - numOfMetrics;
   15592         var numMissing = numOfSidebearings -
   15593           ((hmtx.length - numOfMetrics * 4) >> 1);
   15594         if (numMissing > 0) {
   15595           font.pos = (font.start ? font.start : 0) + metrics.offset;
   15596           var entries = '';
   15597           for (var i = 0, ii = hmtx.length; i < ii; i++)
   15598             entries += String.fromCharCode(font.getByte());
   15599           for (var i = 0; i < numMissing; i++)
   15600             entries += '\x00\x00';
   15601           metrics.data = stringToArray(entries);
   15602         }
   15603       };
   15604 
   15605       function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) {
   15606         if (sourceEnd - sourceStart <= 12) {
   15607           // glyph with data less than 12 is invalid one
   15608           return 0;
   15609         }
   15610         var glyf = source.subarray(sourceStart, sourceEnd);
   15611         var contoursCount = (glyf[0] << 8) | glyf[1];
   15612         if (contoursCount & 0x8000) {
   15613           // complex glyph, writing as is
   15614           dest.set(glyf, destStart);
   15615           return glyf.length;
   15616         }
   15617 
   15618         var j = 10, flagsCount = 0;
   15619         for (var i = 0; i < contoursCount; i++) {
   15620           var endPoint = (glyf[j] << 8) | glyf[j + 1];
   15621           flagsCount = endPoint + 1;
   15622           j += 2;
   15623         }
   15624         // skipping instructions
   15625         var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
   15626         j += 2 + instructionsLength;
   15627         // validating flags
   15628         var coordinatesLength = 0;
   15629         for (var i = 0; i < flagsCount; i++) {
   15630           var flag = glyf[j++];
   15631           if (flag & 0xC0) {
   15632             // reserved flags must be zero, rejecting
   15633             return 0;
   15634           }
   15635           var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
   15636                          ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
   15637           coordinatesLength += xyLength;
   15638           if (flag & 8) {
   15639             var repeat = glyf[j++];
   15640             i += repeat;
   15641             coordinatesLength += repeat * xyLength;
   15642           }
   15643         }
   15644         var glyphDataLength = j + coordinatesLength;
   15645         if (glyphDataLength > glyf.length) {
   15646           // not enough data for coordinates
   15647           return 0;
   15648         }
   15649         if (glyf.length - glyphDataLength > 3) {
   15650           // truncating and aligning to 4 bytes the long glyph data
   15651           glyphDataLength = (glyphDataLength + 3) & ~3;
   15652           dest.set(glyf.subarray(0, glyphDataLength), destStart);
   15653           return glyphDataLength;
   15654         }
   15655         // glyph data is fine
   15656         dest.set(glyf, destStart);
   15657         return glyf.length;
   15658       }
   15659 
   15660       function sanitizeGlyphLocations(loca, glyf, numGlyphs,
   15661                                       isGlyphLocationsLong) {
   15662         var itemSize, itemDecode, itemEncode;
   15663         if (isGlyphLocationsLong) {
   15664           itemSize = 4;
   15665           itemDecode = function fontItemDecodeLong(data, offset) {
   15666             return (data[offset] << 24) | (data[offset + 1] << 16) |
   15667                    (data[offset + 2] << 8) | data[offset + 3];
   15668           };
   15669           itemEncode = function fontItemEncodeLong(data, offset, value) {
   15670             data[offset] = (value >>> 24) & 0xFF;
   15671             data[offset + 1] = (value >> 16) & 0xFF;
   15672             data[offset + 2] = (value >> 8) & 0xFF;
   15673             data[offset + 3] = value & 0xFF;
   15674           };
   15675         } else {
   15676           itemSize = 2;
   15677           itemDecode = function fontItemDecode(data, offset) {
   15678             return (data[offset] << 9) | (data[offset + 1] << 1);
   15679           };
   15680           itemEncode = function fontItemEncode(data, offset, value) {
   15681             data[offset] = (value >> 9) & 0xFF;
   15682             data[offset + 1] = (value >> 1) & 0xFF;
   15683           };
   15684         }
   15685         var locaData = loca.data;
   15686         // removing the invalid glyphs
   15687         var oldGlyfData = glyf.data;
   15688         var oldGlyfDataLength = oldGlyfData.length;
   15689         var newGlyfData = new Uint8Array(oldGlyfDataLength);
   15690         var startOffset = itemDecode(locaData, 0);
   15691         var writeOffset = 0;
   15692         itemEncode(locaData, 0, writeOffset);
   15693         for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
   15694           var endOffset = itemDecode(locaData, j);
   15695           if (endOffset > oldGlyfDataLength) {
   15696             // glyph end offset points outside glyf data, rejecting the glyph
   15697             itemEncode(locaData, j, writeOffset);
   15698             startOffset = endOffset;
   15699             continue;
   15700           }
   15701 
   15702           var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
   15703                                         newGlyfData, writeOffset);
   15704           writeOffset += newLength;
   15705           itemEncode(locaData, j, writeOffset);
   15706           startOffset = endOffset;
   15707         }
   15708 
   15709         if (writeOffset == 0) {
   15710           // glyf table cannot be empty -- redoing the glyf and loca tables
   15711           // to have single glyph with one point
   15712           var simpleGlyph = new Uint8Array(
   15713             [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
   15714           for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize)
   15715             itemEncode(locaData, j, simpleGlyph.length);
   15716           glyf.data = simpleGlyph;
   15717           return;
   15718         }
   15719 
   15720         glyf.data = newGlyfData.subarray(0, writeOffset);
   15721       }
   15722 
   15723       function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) {
   15724         var itemSize, itemDecode;
   15725         if (isGlyphLocationsLong) {
   15726           itemSize = 4;
   15727           itemDecode = function fontItemDecodeLong(data, offset) {
   15728             return (data[offset] << 24) | (data[offset + 1] << 16) |
   15729                    (data[offset + 2] << 8) | data[offset + 3];
   15730           };
   15731         } else {
   15732           itemSize = 2;
   15733           itemDecode = function fontItemDecode(data, offset) {
   15734             return (data[offset] << 9) | (data[offset + 1] << 1);
   15735           };
   15736         }
   15737         var data = locaTable.data, length = data.length;
   15738         var lastOffset = itemDecode(data, 0);
   15739         for (var i = itemSize, j = 0; i < length; i += itemSize, j++) {
   15740           var offset = itemDecode(data, i);
   15741           if (offset == lastOffset)
   15742             emptyGlyphIds[j] = true;
   15743           lastOffset = offset;
   15744         }
   15745       }
   15746 
   15747       function readGlyphNameMap(post, properties) {
   15748         var start = (font.start ? font.start : 0) + post.offset;
   15749         font.pos = start;
   15750 
   15751         var length = post.length, end = start + length;
   15752         var version = int32(font.getBytes(4));
   15753         // skip rest to the tables
   15754         font.getBytes(28);
   15755 
   15756         var glyphNames;
   15757         switch (version) {
   15758           case 0x00010000:
   15759             glyphNames = MacStandardGlyphOrdering;
   15760             break;
   15761           case 0x00020000:
   15762             var numGlyphs = int16(font.getBytes(2));
   15763             var glyphNameIndexes = [];
   15764             for (var i = 0; i < numGlyphs; ++i)
   15765               glyphNameIndexes.push(int16(font.getBytes(2)));
   15766             var customNames = [];
   15767             while (font.pos < end) {
   15768               var stringLength = font.getByte();
   15769               var string = '';
   15770               for (var i = 0; i < stringLength; ++i)
   15771                 string += font.getChar();
   15772               customNames.push(string);
   15773             }
   15774             glyphNames = [];
   15775             for (var i = 0; i < numGlyphs; ++i) {
   15776               var j = glyphNameIndexes[i];
   15777               if (j < 258) {
   15778                 glyphNames.push(MacStandardGlyphOrdering[j]);
   15779                 continue;
   15780               }
   15781               glyphNames.push(customNames[j - 258]);
   15782             }
   15783             break;
   15784           case 0x00030000:
   15785             break;
   15786           default:
   15787             warn('Unknown/unsupported post table version ' + version);
   15788             break;
   15789         }
   15790         properties.glyphNames = glyphNames;
   15791       }
   15792 
   15793       function isOS2Valid(os2Table) {
   15794         var data = os2Table.data;
   15795         // usWinAscent == 0 makes font unreadable by windows
   15796         var usWinAscent = (data[74] << 8) | data[75];
   15797         if (usWinAscent == 0)
   15798           return false;
   15799 
   15800         return true;
   15801       }
   15802 
   15803       // Check that required tables are present
   15804       var requiredTables = ['OS/2', 'cmap', 'head', 'hhea',
   15805                              'hmtx', 'maxp', 'name', 'post'];
   15806 
   15807       var header = readOpenTypeHeader(font);
   15808       var numTables = header.numTables;
   15809 
   15810       var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf, os2;
   15811       var tables = [];
   15812       for (var i = 0; i < numTables; i++) {
   15813         var table = readTableEntry(font);
   15814         var index = requiredTables.indexOf(table.tag);
   15815         if (index != -1) {
   15816           if (table.tag == 'cmap')
   15817             cmap = table;
   15818           else if (table.tag == 'post')
   15819             post = table;
   15820           else if (table.tag == 'maxp')
   15821             maxp = table;
   15822           else if (table.tag == 'hhea')
   15823             hhea = table;
   15824           else if (table.tag == 'hmtx')
   15825             hmtx = table;
   15826           else if (table.tag == 'head')
   15827             head = table;
   15828           else if (table.tag == 'OS/2')
   15829             os2 = table;
   15830 
   15831           requiredTables.splice(index, 1);
   15832         } else {
   15833           if (table.tag == 'vmtx')
   15834             vmtx = table;
   15835           else if (table.tag == 'vhea')
   15836             vhea = table;
   15837           else if (table.tag == 'loca')
   15838             loca = table;
   15839           else if (table.tag == 'glyf')
   15840             glyf = table;
   15841         }
   15842         tables.push(table);
   15843       }
   15844 
   15845       var numTables = tables.length + requiredTables.length;
   15846 
   15847       // header and new offsets. Table entry information is appended to the
   15848       // end of file. The virtualOffset represents where to put the actual
   15849       // data of a particular table;
   15850       var ttf = {
   15851         file: '',
   15852         virtualOffset: numTables * (4 * 4)
   15853       };
   15854 
   15855       // The new numbers of tables will be the last one plus the num
   15856       // of missing tables
   15857       createOpenTypeHeader(header.version, ttf, numTables);
   15858 
   15859       // Invalid OS/2 can break the font for the Windows
   15860       if (os2 && !isOS2Valid(os2)) {
   15861         tables.splice(tables.indexOf(os2), 1);
   15862         os2 = null;
   15863       }
   15864 
   15865       // Ensure the [h/v]mtx tables contains the advance width and
   15866       // sidebearings information for numGlyphs in the maxp table
   15867       font.pos = (font.start || 0) + maxp.offset;
   15868       var version = int16(font.getBytes(4));
   15869       var numGlyphs = int16(font.getBytes(2));
   15870 
   15871       sanitizeMetrics(font, hhea, hmtx, numGlyphs);
   15872       sanitizeMetrics(font, vhea, vmtx, numGlyphs);
   15873 
   15874       var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
   15875       if (head && loca && glyf) {
   15876         sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
   15877       }
   15878 
   15879       var emptyGlyphIds = [];
   15880       if (glyf)
   15881         findEmptyGlyphs(loca, isGlyphLocationsLong, emptyGlyphIds);
   15882 
   15883       // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
   15884       // Sometimes it's 0. That needs to be fixed
   15885       if (hhea.data[10] == 0 && hhea.data[11] == 0) {
   15886         hhea.data[10] = 0xFF;
   15887         hhea.data[11] = 0xFF;
   15888       }
   15889 
   15890       // The 'post' table has glyphs names.
   15891       if (post) {
   15892         readGlyphNameMap(post, properties);
   15893       }
   15894 
   15895       var glyphs, ids;
   15896       if (properties.type == 'CIDFontType2') {
   15897         // Replace the old CMAP table with a shiny new one
   15898         // Type2 composite fonts map characters directly to glyphs so the cmap
   15899         // table must be replaced.
   15900         // canvas fillText will reencode some characters even if the font has a
   15901         // glyph at that position - e.g. newline is converted to a space and
   15902         // U+00AD (soft hyphen) is not drawn.
   15903         // So, offset all the glyphs by 0xFF to avoid these cases and use
   15904         // the encoding to map incoming characters to the new glyph positions
   15905         if (!cmap) {
   15906           cmap = {
   15907             tag: 'cmap',
   15908             data: null
   15909           };
   15910           tables.push(cmap);
   15911         }
   15912 
   15913         var cidToGidMap = properties.cidToGidMap || [];
   15914         var gidToCidMap = [0];
   15915         if (cidToGidMap.length > 0) {
   15916           for (var j = cidToGidMap.length - 1; j >= 0; j--) {
   15917             var gid = cidToGidMap[j];
   15918             if (gid)
   15919               gidToCidMap[gid] = j;
   15920           }
   15921           // filling the gaps using CID above the CIDs currently used in font
   15922           var nextCid = cidToGidMap.length;
   15923           for (var i = 1; i < numGlyphs; i++) {
   15924             if (!gidToCidMap[i])
   15925               gidToCidMap[i] = nextCid++;
   15926           }
   15927         }
   15928 
   15929         glyphs = [];
   15930         ids = [];
   15931 
   15932         var usedUnicodes = [];
   15933         var unassignedUnicodeItems = [];
   15934         for (var i = 1; i < numGlyphs; i++) {
   15935           var cid = gidToCidMap[i] || i;
   15936           var unicode = this.toFontChar[cid];
   15937           if (!unicode || typeof unicode !== 'number' ||
   15938               isSpecialUnicode(unicode) || unicode in usedUnicodes) {
   15939             unassignedUnicodeItems.push(i);
   15940             continue;
   15941           }
   15942           usedUnicodes[unicode] = true;
   15943           glyphs.push({ unicode: unicode, code: cid });
   15944           ids.push(i);
   15945         }
   15946         // trying to fit as many unassigned symbols as we can
   15947         // in the range allocated for the user defined symbols
   15948         var unusedUnicode = kCmapGlyphOffset;
   15949         for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
   15950           var i = unassignedUnicodeItems[j];
   15951           var cid = gidToCidMap[i] || i;
   15952           while (unusedUnicode in usedUnicodes)
   15953             unusedUnicode++;
   15954           if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea)
   15955             break;
   15956           var unicode = unusedUnicode++;
   15957           this.toFontChar[cid] = unicode;
   15958           usedUnicodes[unicode] = true;
   15959           glyphs.push({ unicode: unicode, code: cid });
   15960           ids.push(i);
   15961         }
   15962       } else {
   15963         var cmapTable = readCMapTable(cmap, font);
   15964 
   15965         glyphs = cmapTable.glyphs;
   15966         ids = cmapTable.ids;
   15967 
   15968         var hasShortCmap = !!cmapTable.hasShortCmap;
   15969         var toFontChar = this.toFontChar;
   15970 
   15971         if (hasShortCmap && ids.length == numGlyphs) {
   15972           // Fixes the short cmap tables -- some generators use incorrect
   15973           // glyph id.
   15974           for (var i = 0, ii = ids.length; i < ii; i++)
   15975             ids[i] = i;
   15976         }
   15977 
   15978         var unusedUnicode = kCmapGlyphOffset;
   15979         var glyphNames = properties.glyphNames || [];
   15980         var encoding = properties.baseEncoding;
   15981         var differences = properties.differences;
   15982         if (toFontChar && toFontChar.length > 0) {
   15983           // checking if cmap is just identity map
   15984           var isIdentity = true;
   15985           for (var i = 0, ii = glyphs.length; i < ii; i++) {
   15986             if (glyphs[i].unicode != i + 1) {
   15987               isIdentity = false;
   15988               break;
   15989             }
   15990           }
   15991           // if it is, replacing with meaningful toUnicode values
   15992           if (isIdentity && !this.isSymbolicFont) {
   15993             var usedUnicodes = [], unassignedUnicodeItems = [];
   15994             for (var i = 0, ii = glyphs.length; i < ii; i++) {
   15995               var unicode = toFontChar[i + 1];
   15996               if (!unicode || typeof unicode !== 'number' ||
   15997                   unicode in usedUnicodes) {
   15998                 unassignedUnicodeItems.push(i);
   15999                 continue;
   16000               }
   16001               glyphs[i].unicode = unicode;
   16002               usedUnicodes[unicode] = true;
   16003             }
   16004             for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
   16005               var i = unassignedUnicodeItems[j];
   16006               while (unusedUnicode in usedUnicodes)
   16007                 unusedUnicode++;
   16008               var cid = i + 1;
   16009               // override only if unicode mapping is not specified
   16010               if (!(cid in toFontChar))
   16011                 toFontChar[cid] = unusedUnicode;
   16012               glyphs[i].unicode = unusedUnicode++;
   16013             }
   16014             this.useToFontChar = true;
   16015           }
   16016         }
   16017 
   16018         // remove glyph references outside range of avaialable glyphs or empty
   16019         var glyphsRemoved = 0;
   16020         for (var i = ids.length - 1; i >= 0; i--) {
   16021           if (ids[i] < numGlyphs &&
   16022               (!emptyGlyphIds[ids[i]] || this.isSymbolicFont))
   16023             continue;
   16024           ids.splice(i, 1);
   16025           glyphs.splice(i, 1);
   16026           glyphsRemoved++;
   16027         }
   16028 
   16029         // checking if it's a "true" symbolic font
   16030         if (this.isSymbolicFont) {
   16031           var minUnicode = 0xFFFF, maxUnicode = 0;
   16032           for (var i = 0, ii = glyphs.length; i < ii; i++) {
   16033             var unicode = glyphs[i].unicode;
   16034             minUnicode = Math.min(minUnicode, unicode);
   16035             maxUnicode = Math.max(maxUnicode, unicode);
   16036           }
   16037           // high byte must be the same for min and max unicodes
   16038           if ((maxUnicode & 0xFF00) != (minUnicode & 0xFF00))
   16039             this.isSymbolicFont = false;
   16040         }
   16041 
   16042         // heuristics: if removed more than 2 glyphs encoding WinAnsiEncoding
   16043         // does not set properly
   16044         if (glyphsRemoved > 2) {
   16045           warn('Switching TrueType encoding to MacRomanEncoding for ' +
   16046                this.name + ' font');
   16047           encoding = Encodings.MacRomanEncoding;
   16048         }
   16049 
   16050         if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) {
   16051           // Re-encode short map encoding to unicode -- that simplifies the
   16052           // resolution of MacRoman encoded glyphs logic for TrueType fonts:
   16053           // copying all characters to private use area, all mapping all known
   16054           // glyphs to the unicodes. The glyphs and ids arrays will grow.
   16055           var usedUnicodes = [];
   16056           for (var i = 0, ii = glyphs.length; i < ii; i++) {
   16057             var code = glyphs[i].unicode;
   16058             var gid = ids[i];
   16059             glyphs[i].unicode += kCmapGlyphOffset;
   16060             toFontChar[code] = glyphs[i].unicode;
   16061 
   16062             var glyphName = glyphNames[gid] || encoding[code];
   16063             if (glyphName in GlyphsUnicode) {
   16064               var unicode = GlyphsUnicode[glyphName];
   16065               if (unicode in usedUnicodes)
   16066                 continue;
   16067 
   16068               usedUnicodes[unicode] = true;
   16069               glyphs.push({
   16070                 unicode: unicode,
   16071                 code: glyphs[i].code
   16072               });
   16073               ids.push(gid);
   16074               toFontChar[code] = unicode;
   16075             }
   16076           }
   16077           this.useToFontChar = true;
   16078         } else if (!this.isSymbolicFont && (this.hasEncoding ||
   16079                     properties.glyphNames || differences.length > 0)) {
   16080           // Re-encode cmap encoding to unicode, based on the 'post' table data
   16081           // diffrence array or base encoding
   16082           var reverseMap = [];
   16083           for (var i = 0, ii = glyphs.length; i < ii; i++)
   16084             reverseMap[glyphs[i].unicode] = i;
   16085 
   16086           var newGlyphUnicodes = [];
   16087           for (var i = 0, ii = glyphs.length; i < ii; i++) {
   16088             var code = glyphs[i].unicode;
   16089             var changeCode = false;
   16090             var gid = ids[i];
   16091 
   16092             var glyphName = glyphNames[gid];
   16093             if (!glyphName) {
   16094               glyphName = differences[code] || encoding[code];
   16095               changeCode = true;
   16096             }
   16097             if (glyphName in GlyphsUnicode) {
   16098               var unicode = GlyphsUnicode[glyphName];
   16099               if (!unicode || reverseMap[unicode] === i)
   16100                 continue; // unknown glyph name or in its own place
   16101 
   16102               newGlyphUnicodes[i] = unicode;
   16103               if (changeCode)
   16104                 toFontChar[code] = unicode;
   16105               delete reverseMap[code];
   16106             }
   16107           }
   16108           for (var index in newGlyphUnicodes) {
   16109             var unicode = newGlyphUnicodes[index];
   16110             if (reverseMap[unicode]) {
   16111               // avoiding assigning to the same unicode
   16112               glyphs[index].unicode = unusedUnicode++;
   16113               continue;
   16114             }
   16115             glyphs[index].unicode = unicode;
   16116             reverseMap[unicode] = index;
   16117           }
   16118           this.useToFontChar = true;
   16119         }
   16120 
   16121         // Moving all symbolic font glyphs into 0xF000 - 0xF0FF range.
   16122         if (this.isSymbolicFont) {
   16123           for (var i = 0, ii = glyphs.length; i < ii; i++) {
   16124             var code = glyphs[i].unicode & 0xFF;
   16125             var fontCharCode = kSymbolicFontGlyphOffset | code;
   16126             glyphs[i].unicode = toFontChar[code] = fontCharCode;
   16127           }
   16128           this.useToFontChar = true;
   16129         }
   16130 
   16131         createGlyphNameMap(glyphs, ids, properties);
   16132         this.glyphNameMap = properties.glyphNameMap;
   16133       }
   16134 
   16135       // Converting glyphs and ids into font's cmap table
   16136       cmap.data = createCMapTable(glyphs, ids);
   16137       var unicodeIsEnabled = [];
   16138       for (var i = 0, ii = glyphs.length; i < ii; i++) {
   16139         unicodeIsEnabled[glyphs[i].unicode] = true;
   16140       }
   16141       this.unicodeIsEnabled = unicodeIsEnabled;
   16142 
   16143       if (!os2) {
   16144         // extract some more font properties from the OpenType head and
   16145         // hhea tables; yMin and descent value are always negative
   16146         var override = {
   16147           unitsPerEm: int16([head.data[18], head.data[19]]),
   16148           yMax: int16([head.data[42], head.data[43]]),
   16149           yMin: int16([head.data[38], head.data[39]]) - 0x10000,
   16150           ascent: int16([hhea.data[4], hhea.data[5]]),
   16151           descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000
   16152         };
   16153 
   16154         tables.push({
   16155           tag: 'OS/2',
   16156           data: stringToArray(createOS2Table(properties, glyphs, override))
   16157         });
   16158       }
   16159 
   16160       // Rewrite the 'post' table if needed
   16161       if (requiredTables.indexOf('post') != -1) {
   16162         tables.push({
   16163           tag: 'post',
   16164           data: stringToArray(createPostTable(properties))
   16165         });
   16166       }
   16167 
   16168       // Rewrite the 'name' table if needed
   16169       if (requiredTables.indexOf('name') != -1) {
   16170         tables.push({
   16171           tag: 'name',
   16172           data: stringToArray(createNameTable(this.name))
   16173         });
   16174       }
   16175 
   16176       // Tables needs to be written by ascendant alphabetic order
   16177       tables.sort(function tables_sort(a, b) {
   16178         return (a.tag > b.tag) - (a.tag < b.tag);
   16179       });
   16180 
   16181       // rewrite the tables but tweak offsets
   16182       for (var i = 0, ii = tables.length; i < ii; i++) {
   16183         var table = tables[i];
   16184         var data = [];
   16185 
   16186         var tableData = table.data;
   16187         for (var j = 0, jj = tableData.length; j < jj; j++)
   16188           data.push(tableData[j]);
   16189         createTableEntry(ttf, table.tag, data);
   16190       }
   16191 
   16192       // Add the table datas
   16193       for (var i = 0, ii = tables.length; i < ii; i++) {
   16194         var table = tables[i];
   16195         var tableData = table.data;
   16196         ttf.file += arrayToString(tableData);
   16197 
   16198         // 4-byte aligned data
   16199         while (ttf.file.length & 3)
   16200           ttf.file += String.fromCharCode(0);
   16201       }
   16202 
   16203       return stringToArray(ttf.file);
   16204     },
   16205 
   16206     convert: function Font_convert(fontName, font, properties) {
   16207       function isFixedPitch(glyphs) {
   16208         for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
   16209           if (glyphs[i] != glyphs[i + 1])
   16210             return false;
   16211         }
   16212         return true;
   16213       }
   16214 
   16215       // The offsets object holds at the same time a representation of where
   16216       // to write the table entry information about a table and another offset
   16217       // representing the offset where to draw the actual data of a particular
   16218       // table
   16219       var kRequiredTablesCount = 9;
   16220 
   16221       var otf = {
   16222         file: '',
   16223         virtualOffset: 9 * (4 * 4)
   16224       };
   16225 
   16226       createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
   16227 
   16228       var charstrings = font.charstrings;
   16229       properties.fixedPitch = isFixedPitch(charstrings);
   16230 
   16231       var glyphNameMap = {};
   16232       for (var i = 0; i < charstrings.length; ++i) {
   16233         var charstring = charstrings[i];
   16234         glyphNameMap[charstring.glyph] = charstring.unicode;
   16235       }
   16236       this.glyphNameMap = glyphNameMap;
   16237 
   16238       if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
   16239           properties.subtype == 'CIDFontType0C')) {
   16240         var encoding = [];
   16241         for (var i = 0; i < charstrings.length; ++i) {
   16242           var charstring = charstrings[i];
   16243           encoding[charstring.code] = charstring.glyph;
   16244         }
   16245         properties.baseEncoding = encoding;
   16246       }
   16247       if (properties.subtype == 'CIDFontType0C') {
   16248         var toFontChar = [];
   16249         for (var i = 0; i < charstrings.length; ++i) {
   16250           var charstring = charstrings[i];
   16251           toFontChar[charstring.code] = charstring.unicode;
   16252         }
   16253         this.toFontChar = toFontChar;
   16254       }
   16255 
   16256       var fields = {
   16257         // PostScript Font Program
   16258         'CFF ': font.data,
   16259 
   16260         // OS/2 and Windows Specific metrics
   16261         'OS/2': stringToArray(createOS2Table(properties, charstrings)),
   16262 
   16263         // Character to glyphs mapping
   16264         'cmap': createCMapTable(charstrings.slice(),
   16265                                 ('glyphIds' in font) ? font.glyphIds : null),
   16266 
   16267         // Font header
   16268         'head': (function fontFieldsHead() {
   16269           return stringToArray(
   16270               '\x00\x01\x00\x00' + // Version number
   16271               '\x00\x00\x10\x00' + // fontRevision
   16272               '\x00\x00\x00\x00' + // checksumAdjustement
   16273               '\x5F\x0F\x3C\xF5' + // magicNumber
   16274               '\x00\x00' + // Flags
   16275               '\x03\xE8' + // unitsPerEM (defaulting to 1000)
   16276               '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
   16277               '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
   16278               '\x00\x00' + // xMin
   16279               safeString16(properties.descent) + // yMin
   16280               '\x0F\xFF' + // xMax
   16281               safeString16(properties.ascent) + // yMax
   16282               string16(properties.italicAngle ? 2 : 0) + // macStyle
   16283               '\x00\x11' + // lowestRecPPEM
   16284               '\x00\x00' + // fontDirectionHint
   16285               '\x00\x00' + // indexToLocFormat
   16286               '\x00\x00');  // glyphDataFormat
   16287         })(),
   16288 
   16289         // Horizontal header
   16290         'hhea': (function fontFieldsHhea() {
   16291           return stringToArray(
   16292               '\x00\x01\x00\x00' + // Version number
   16293               safeString16(properties.ascent) + // Typographic Ascent
   16294               safeString16(properties.descent) + // Typographic Descent
   16295               '\x00\x00' + // Line Gap
   16296               '\xFF\xFF' + // advanceWidthMax
   16297               '\x00\x00' + // minLeftSidebearing
   16298               '\x00\x00' + // minRightSidebearing
   16299               '\x00\x00' + // xMaxExtent
   16300               safeString16(properties.capHeight) + // caretSlopeRise
   16301               safeString16(Math.tan(properties.italicAngle) *
   16302                        properties.xHeight) + // caretSlopeRun
   16303               '\x00\x00' + // caretOffset
   16304               '\x00\x00' + // -reserved-
   16305               '\x00\x00' + // -reserved-
   16306               '\x00\x00' + // -reserved-
   16307               '\x00\x00' + // -reserved-
   16308               '\x00\x00' + // metricDataFormat
   16309               string16(charstrings.length + 1)); // Number of HMetrics
   16310         })(),
   16311 
   16312         // Horizontal metrics
   16313         'hmtx': (function fontFieldsHmtx() {
   16314           var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
   16315           for (var i = 0, ii = charstrings.length; i < ii; i++) {
   16316             var charstring = charstrings[i];
   16317             var width = 'width' in charstring ? charstring.width : 0;
   16318             hmtx += string16(width) + string16(0);
   16319           }
   16320           return stringToArray(hmtx);
   16321         })(),
   16322 
   16323         // Maximum profile
   16324         'maxp': (function fontFieldsMaxp() {
   16325           return stringToArray(
   16326               '\x00\x00\x50\x00' + // Version number
   16327              string16(charstrings.length + 1)); // Num of glyphs
   16328         })(),
   16329 
   16330         // Naming tables
   16331         'name': stringToArray(createNameTable(fontName)),
   16332 
   16333         // PostScript informations
   16334         'post': stringToArray(createPostTable(properties))
   16335       };
   16336 
   16337       for (var field in fields)
   16338         createTableEntry(otf, field, fields[field]);
   16339 
   16340       for (var field in fields) {
   16341         var table = fields[field];
   16342         otf.file += arrayToString(table);
   16343       }
   16344 
   16345       return stringToArray(otf.file);
   16346     },
   16347 
   16348     buildToFontChar: function Font_buildToFontChar(toUnicode) {
   16349       var result = [];
   16350       var unusedUnicode = kCmapGlyphOffset;
   16351       for (var i = 0, ii = toUnicode.length; i < ii; i++) {
   16352         var unicode = toUnicode[i];
   16353         var fontCharCode = typeof unicode === 'object' ? unusedUnicode++ :
   16354           unicode;
   16355         if (typeof unicode !== 'undefined')
   16356           result[i] = fontCharCode;
   16357       }
   16358       return result;
   16359     },
   16360 
   16361     rebuildToUnicode: function Font_rebuildToUnicode(properties) {
   16362       var firstChar = properties.firstChar, lastChar = properties.lastChar;
   16363       var map = [];
   16364       if (properties.composite) {
   16365         var isIdentityMap = this.cidToUnicode.length == 0;
   16366         for (var i = firstChar, ii = lastChar; i <= ii; i++) {
   16367           // TODO missing map the character according font's CMap
   16368           var cid = i;
   16369           map[i] = isIdentityMap ? cid : this.cidToUnicode[cid];
   16370         }
   16371       } else {
   16372         for (var i = firstChar, ii = lastChar; i <= ii; i++) {
   16373           var glyph = properties.differences[i];
   16374           if (!glyph)
   16375             glyph = properties.baseEncoding[i];
   16376           if (!!glyph && (glyph in GlyphsUnicode))
   16377             map[i] = GlyphsUnicode[glyph];
   16378         }
   16379       }
   16380       this.toUnicode = map;
   16381     },
   16382 
   16383     loadCidToUnicode: function Font_loadCidToUnicode(properties) {
   16384       if (!properties.cidSystemInfo)
   16385         return;
   16386 
   16387       var cidToUnicodeMap = [], unicodeToCIDMap = [];
   16388       this.cidToUnicode = cidToUnicodeMap;
   16389       this.unicodeToCID = unicodeToCIDMap;
   16390 
   16391       var cidSystemInfo = properties.cidSystemInfo;
   16392       var cidToUnicode;
   16393       if (cidSystemInfo) {
   16394         cidToUnicode = CIDToUnicodeMaps[
   16395           cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
   16396       }
   16397 
   16398       if (!cidToUnicode)
   16399         return; // identity encoding
   16400 
   16401       var cid = 1, i, j, k, ii;
   16402       for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
   16403         var unicode = cidToUnicode[i];
   16404         if (isArray(unicode)) {
   16405           var length = unicode.length;
   16406           for (j = 0; j < length; j++) {
   16407             cidToUnicodeMap[cid] = unicode[j];
   16408             unicodeToCIDMap[unicode[j]] = cid;
   16409           }
   16410           cid++;
   16411         } else if (typeof unicode === 'object') {
   16412           var fillLength = unicode.f;
   16413           if (fillLength) {
   16414             k = unicode.c;
   16415             for (j = 0; j < fillLength; ++j) {
   16416               cidToUnicodeMap[cid] = k;
   16417               unicodeToCIDMap[k] = cid;
   16418               cid++;
   16419               k++;
   16420             }
   16421           } else
   16422             cid += unicode.s;
   16423         } else if (unicode) {
   16424           cidToUnicodeMap[cid] = unicode;
   16425           unicodeToCIDMap[unicode] = cid;
   16426           cid++;
   16427         } else
   16428           cid++;
   16429       }
   16430     },
   16431 
   16432     bindDOM: function Font_bindDOM(data) {
   16433       var fontName = this.loadedName;
   16434 
   16435       // Add the font-face rule to the document
   16436       var url = ('url(data:' + this.mimetype + ';base64,' +
   16437                  PdfJS_window.window.btoa(data) + ');');
   16438       var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
   16439 
   16440       var styleElement = PdfJS_window.document.createElement('style');
   16441       PdfJS_window.document.documentElement.getElementsByTagName('head')[0].appendChild(
   16442         styleElement);
   16443 
   16444       var styleSheet = styleElement.sheet;
   16445       styleSheet.insertRule(rule, styleSheet.cssRules.length);
   16446 
   16447       if (PDFJS.pdfBug && FontInspector.enabled)
   16448         FontInspector.fontAdded(this, url);
   16449 
   16450       return rule;
   16451     },
   16452 
   16453     get spaceWidth() {
   16454       // trying to estimate space character width
   16455       var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
   16456       var width;
   16457       for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
   16458         var glyphName = possibleSpaceReplacements[i];
   16459         // if possible, getting width by glyph name
   16460         if (glyphName in this.widths) {
   16461           width = this.widths[glyphName];
   16462           break;
   16463         }
   16464         var glyphUnicode = GlyphsUnicode[glyphName];
   16465         // finding the charcode via unicodeToCID map
   16466         var charcode = 0;
   16467         if (this.composite)
   16468           charcode = this.unicodeToCID[glyphUnicode];
   16469         // ... via toUnicode map
   16470         if (!charcode && 'toUnicode' in this)
   16471           charcode = this.toUnicode.indexOf(glyphUnicode);
   16472         // setting it to unicode if negative or undefined
   16473         if (!(charcode > 0))
   16474           charcode = glyphUnicode;
   16475         // trying to get width via charcode
   16476         width = this.widths[charcode];
   16477         if (width)
   16478           break; // the non-zero width found
   16479       }
   16480       width = (width || this.defaultWidth) * this.widthMultiplier;
   16481       return shadow(this, 'spaceWidth', width);
   16482     },
   16483 
   16484     charToGlyph: function Font_charToGlyph(charcode) {
   16485       var fontCharCode, width, operatorList, disabled;
   16486 
   16487       var width = this.widths[charcode];
   16488 
   16489       switch (this.type) {
   16490         case 'CIDFontType0':
   16491           if (this.noUnicodeAdaptation) {
   16492             width = this.widths[this.unicodeToCID[charcode] || charcode];
   16493             fontCharCode = mapPrivateUseChars(charcode);
   16494             break;
   16495           }
   16496           fontCharCode = this.toFontChar[charcode] || charcode;
   16497           break;
   16498         case 'CIDFontType2':
   16499           if (this.noUnicodeAdaptation) {
   16500             width = this.widths[this.unicodeToCID[charcode] || charcode];
   16501             fontCharCode = mapPrivateUseChars(charcode);
   16502             break;
   16503           }
   16504           fontCharCode = this.toFontChar[charcode] || charcode;
   16505           break;
   16506         case 'Type1':
   16507           var glyphName = this.differences[charcode] || this.encoding[charcode];
   16508           if (!isNum(width))
   16509             width = this.widths[glyphName];
   16510           if (this.noUnicodeAdaptation) {
   16511             fontCharCode = mapPrivateUseChars(GlyphsUnicode[glyphName] ||
   16512               charcode);
   16513             break;
   16514           }
   16515           fontCharCode = this.glyphNameMap[glyphName] ||
   16516             GlyphsUnicode[glyphName] || charcode;
   16517           break;
   16518         case 'Type3':
   16519           var glyphName = this.differences[charcode] || this.encoding[charcode];
   16520           operatorList = this.charProcOperatorList[glyphName];
   16521           fontCharCode = charcode;
   16522           break;
   16523         case 'TrueType':
   16524           if (this.useToFontChar) {
   16525             fontCharCode = this.toFontChar[charcode] || charcode;
   16526             break;
   16527           }
   16528           var glyphName = this.differences[charcode] || this.encoding[charcode];
   16529           if (!glyphName)
   16530             glyphName = Encodings.StandardEncoding[charcode];
   16531           if (!isNum(width))
   16532             width = this.widths[glyphName];
   16533           if (this.noUnicodeAdaptation) {
   16534             fontCharCode = GlyphsUnicode[glyphName] || charcode;
   16535             break;
   16536           }
   16537           if (!this.hasEncoding || this.isSymbolicFont) {
   16538             fontCharCode = this.useToFontChar ? this.toFontChar[charcode] :
   16539               charcode;
   16540             break;
   16541           }
   16542 
   16543           // MacRoman encoding address by re-encoding the cmap table
   16544           fontCharCode = glyphName in this.glyphNameMap ?
   16545             this.glyphNameMap[glyphName] : GlyphsUnicode[glyphName];
   16546           break;
   16547         default:
   16548           warn('Unsupported font type: ' + this.type);
   16549           break;
   16550       }
   16551 
   16552       var unicodeChars = !('toUnicode' in this) ? charcode :
   16553         this.toUnicode[charcode] || charcode;
   16554       if (typeof unicodeChars === 'number')
   16555         unicodeChars = String.fromCharCode(unicodeChars);
   16556 
   16557       width = (isNum(width) ? width : this.defaultWidth) * this.widthMultiplier;
   16558       disabled = this.unicodeIsEnabled ?
   16559         !this.unicodeIsEnabled[fontCharCode] : false;
   16560 
   16561       return {
   16562         fontChar: String.fromCharCode(fontCharCode),
   16563         unicode: unicodeChars,
   16564         width: width,
   16565         disabled: disabled,
   16566         operatorList: operatorList
   16567       };
   16568     },
   16569 
   16570     charsToGlyphs: function Font_charsToGlyphs(chars) {
   16571       var charsCache = this.charsCache;
   16572       var glyphs;
   16573 
   16574       // if we translated this string before, just grab it from the cache
   16575       if (charsCache) {
   16576         glyphs = charsCache[chars];
   16577         if (glyphs)
   16578           return glyphs;
   16579       }
   16580 
   16581       // lazily create the translation cache
   16582       if (!charsCache)
   16583         charsCache = this.charsCache = Object.create(null);
   16584 
   16585       glyphs = [];
   16586 
   16587       if (this.wideChars) {
   16588         // composite fonts have multi-byte strings convert the string from
   16589         // single-byte to multi-byte
   16590         // XXX assuming CIDFonts are two-byte - later need to extract the
   16591         // correct byte encoding according to the PDF spec
   16592         var length = chars.length - 1; // looping over two bytes at a time so
   16593                                        // loop should never end on the last byte
   16594         for (var i = 0; i < length; i++) {
   16595           var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
   16596           var glyph = this.charToGlyph(charcode);
   16597           glyphs.push(glyph);
   16598           // placing null after each word break charcode (ASCII SPACE)
   16599           if (charcode == 0x20)
   16600             glyphs.push(null);
   16601         }
   16602       }
   16603       else {
   16604         for (var i = 0, ii = chars.length; i < ii; ++i) {
   16605           var charcode = chars.charCodeAt(i);
   16606           var glyph = this.charToGlyph(charcode);
   16607           glyphs.push(glyph);
   16608           if (charcode == 0x20)
   16609             glyphs.push(null);
   16610         }
   16611       }
   16612 
   16613       // Enter the translated string into the cache
   16614       return (charsCache[chars] = glyphs);
   16615     }
   16616   };
   16617 
   16618   return Font;
   16619 })();
   16620 
   16621 /*
   16622  * Type1Parser encapsulate the needed code for parsing a Type1 font
   16623  * program. Some of its logic depends on the Type2 charstrings
   16624  * structure.
   16625  */
   16626 var Type1Parser = function type1Parser() {
   16627   /*
   16628    * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
   16629    * of Plaintext Bytes. The function took a key as a parameter which can be
   16630    * for decrypting the eexec block of for decoding charStrings.
   16631    */
   16632   var kEexecEncryptionKey = 55665;
   16633   var kCharStringsEncryptionKey = 4330;
   16634 
   16635   function decrypt(stream, key, discardNumber) {
   16636     var r = key, c1 = 52845, c2 = 22719;
   16637     var decryptedString = [];
   16638 
   16639     var value = '';
   16640     var count = stream.length;
   16641     for (var i = 0; i < count; i++) {
   16642       value = stream[i];
   16643       decryptedString[i] = value ^ (r >> 8);
   16644       r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
   16645     }
   16646     return decryptedString.slice(discardNumber);
   16647   }
   16648 
   16649   /*
   16650    * CharStrings are encoded following the the CharString Encoding sequence
   16651    * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
   16652    * The value in a byte indicates a command, a number, or subsequent bytes
   16653    * that are to be interpreted in a special way.
   16654    *
   16655    * CharString Number Encoding:
   16656    *  A CharString byte containing the values from 32 through 255 inclusive
   16657    *  indicate an integer. These values are decoded in four ranges.
   16658    *
   16659    * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
   16660    * indicate the integer v - 139. Thus, the integer values from -107 through
   16661    * 107 inclusive may be encoded in single byte.
   16662    *
   16663    * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
   16664    * indicates an integer involving the next byte, w, according to the formula:
   16665    * [(v - 247) x 256] + w + 108
   16666    *
   16667    * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
   16668    * indicates an integer involving the next byte, w, according to the formula:
   16669    * -[(v - 251) * 256] - w - 108
   16670    *
   16671    * 4. A CharString containing the value 255 indicates that the next 4 bytes
   16672    * are a two complement signed integer. The first of these bytes contains the
   16673    * highest order bits, the second byte contains the next higher order bits
   16674    * and the fourth byte contain the lowest order bits.
   16675    *
   16676    *
   16677    * CharString Command Encoding:
   16678    *  CharStrings commands are encoded in 1 or 2 bytes.
   16679    *
   16680    *  Single byte commands are encoded in 1 byte that contains a value between
   16681    *  0 and 31 inclusive.
   16682    *  If a command byte contains the value 12, then the value in the next byte
   16683    *  indicates a command. This "escape" mechanism allows many extra commands
   16684    * to be encoded and this encoding technique helps to minimize the length of
   16685    * the charStrings.
   16686    */
   16687   var charStringDictionary = {
   16688     '1': 'hstem',
   16689     '3': 'vstem',
   16690     '4': 'vmoveto',
   16691     '5': 'rlineto',
   16692     '6': 'hlineto',
   16693     '7': 'vlineto',
   16694     '8': 'rrcurveto',
   16695 
   16696     // closepath is a Type1 command that do not take argument and is useless
   16697     // in Type2 and it can simply be ignored.
   16698     '9': null, // closepath
   16699 
   16700     '10': 'callsubr',
   16701 
   16702     // return is normally used inside sub-routines to tells to the execution
   16703     // flow that it can be back to normal.
   16704     // During the translation process Type1 charstrings will be flattened and
   16705     // sub-routines will be embedded directly into the charstring directly, so
   16706     // this can be ignored safely.
   16707     '11': 'return',
   16708 
   16709     '12': {
   16710       // dotsection is a Type1 command to specify some hinting feature for dots
   16711       // that do not take a parameter and it can safely be ignored for Type2.
   16712       '0': null, // dotsection
   16713 
   16714       // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple
   16715       // parameters, so instead of returning [vh]stem3 take a shortcut and
   16716       // return [vhstem] instead.
   16717       '1': 'vstem',
   16718       '2': 'hstem',
   16719 
   16720       // Type1 only command with command not (yet) built-in ,throw an error
   16721       '6': -1, // seac
   16722       '7': -1, // sbw
   16723 
   16724       '11': 'sub',
   16725       '12': 'div',
   16726 
   16727       // callothersubr is a mechanism to make calls on the postscript
   16728       // interpreter, this is not supported by Type2 charstring but hopefully
   16729       // most of the default commands can be ignored safely.
   16730       '16': 'callothersubr',
   16731 
   16732       '17': 'pop',
   16733 
   16734       // setcurrentpoint sets the current point to x, y without performing a
   16735       // moveto (this is a one shot positionning command). This is used only
   16736       // with the return of an OtherSubrs call.
   16737       // TODO Implement the OtherSubrs charstring embedding and replace this
   16738       // call by a no-op, like 2 'pop' commands for example.
   16739       '33': null // setcurrentpoint
   16740     },
   16741     '13': 'hsbw',
   16742     '14': 'endchar',
   16743     '21': 'rmoveto',
   16744     '22': 'hmoveto',
   16745     '30': 'vhcurveto',
   16746     '31': 'hvcurveto'
   16747   };
   16748 
   16749   var kEscapeCommand = 12;
   16750 
   16751   function decodeCharString(array) {
   16752     var charstring = [];
   16753     var lsb = 0;
   16754     var width = 0;
   16755     var flexState = 0;
   16756 
   16757     var value = '';
   16758     var count = array.length;
   16759     for (var i = 0; i < count; i++) {
   16760       value = array[i];
   16761 
   16762       if (value < 32) {
   16763         var command = null;
   16764         if (value == kEscapeCommand) {
   16765           var escape = array[++i];
   16766 
   16767           // TODO Clean this code
   16768           if (escape == 16) {
   16769             var index = charstring.pop();
   16770             var argc = charstring.pop();
   16771             for (var j = 0; j < argc; j++)
   16772               charstring.push('drop');
   16773 
   16774             // If the flex mechanism is not used in a font program, Adobe
   16775             // states that entries 0, 1 and 2 can simply be replaced by
   16776             // {}, which means that we can simply ignore them.
   16777             if (index < 3) {
   16778               continue;
   16779             }
   16780 
   16781             // This is the same things about hint replacement, if it is not used
   16782             // entry 3 can be replaced by {3}
   16783             // TODO support hint replacment
   16784             if (index == 3) {
   16785               charstring.push(3);
   16786               i++;
   16787               continue;
   16788             }
   16789           } else if (escape == 17 || escape == 33) {
   16790             // pop or setcurrentpoint commands can be ignored
   16791             // since we are not doing callothersubr
   16792             continue;
   16793           } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
   16794             charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
   16795             continue;
   16796           }
   16797 
   16798           command = charStringDictionary['12'][escape];
   16799         } else {
   16800           // TODO Clean this code
   16801           if (value == 13) { // hsbw
   16802             if (charstring.length == 2) {
   16803               lsb = charstring[0];
   16804               width = charstring[1];
   16805               charstring.splice(0, 1);
   16806             } else if (charstring.length == 4 && charstring[3] == 'div') {
   16807               lsb = charstring[0];
   16808               width = charstring[1] / charstring[2];
   16809               charstring.splice(0, 1);
   16810             } else if (charstring.length == 4 && charstring[2] == 'div') {
   16811               lsb = charstring[0] / charstring[1];
   16812               width = charstring[3];
   16813               charstring.splice(0, 3);
   16814             } else {
   16815               error('Unsupported hsbw format: ' + charstring);
   16816             }
   16817 
   16818             charstring.push(lsb, 'hmoveto');
   16819             continue;
   16820           } else if (value == 10) { // callsubr
   16821             if (charstring[charstring.length - 1] < 3) { // subr #0..2
   16822               var subrNumber = charstring.pop();
   16823               switch (subrNumber) {
   16824                 case 1:
   16825                   flexState = 1; // prepare for flex coordinates
   16826                   break;
   16827                 case 2:
   16828                   flexState = 2; // flex in progress
   16829                   break;
   16830                 case 0:
   16831                   // type2 flex command does not need final coords
   16832                   charstring.push('exch', 'drop', 'exch', 'drop');
   16833                   charstring.push('flex');
   16834                   flexState = 0;
   16835                   break;
   16836               }
   16837               continue;
   16838             }
   16839           } else if (value == 21 && flexState > 0) {
   16840             if (flexState > 1)
   16841               continue; // ignoring rmoveto
   16842             value = 5; // first segment replacing with rlineto
   16843           } else if (!kHintingEnabled && (value == 1 || value == 3)) {
   16844             charstring.push('drop', 'drop');
   16845             continue;
   16846           }
   16847           command = charStringDictionary[value];
   16848         }
   16849 
   16850         // Some charstring commands are meaningless in Type2 and will return
   16851         // a null, let's just ignored them
   16852         if (!command && i < count) {
   16853           continue;
   16854         } else if (!command) {
   16855           break;
   16856         } else if (command == -1) {
   16857           warn('Support for Type1 command ' + value +
   16858                 ' (' + escape + ') is not implemented in charstring: ' +
   16859                 charstring);
   16860           if (value == 12) {
   16861             // we know how to ignore only some the Type1 commands
   16862             switch (escape) {
   16863               case 7:
   16864                 charstring.push('drop', 'drop', 'drop', 'drop');
   16865                 continue;
   16866               case 8:
   16867                 charstring.push('drop');
   16868                 continue;
   16869             }
   16870           }
   16871         }
   16872 
   16873         value = command;
   16874       } else if (value <= 246) {
   16875         value = value - 139;
   16876       } else if (value <= 250) {
   16877         value = ((value - 247) * 256) + array[++i] + 108;
   16878       } else if (value <= 254) {
   16879         value = -((value - 251) * 256) - array[++i] - 108;
   16880       } else {
   16881         value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
   16882                 (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
   16883       }
   16884 
   16885       charstring.push(value);
   16886     }
   16887 
   16888     return { charstring: charstring, width: width, lsb: lsb };
   16889   }
   16890 
   16891   /*
   16892    * Returns an object containing a Subrs array and a CharStrings
   16893    * array extracted from and eexec encrypted block of data
   16894    */
   16895   function readNumberArray(str, index) {
   16896     var start = index;
   16897     while (str[index++] != '[')
   16898       start++;
   16899     start++;
   16900 
   16901     var count = 0;
   16902     while (str[index++] != ']')
   16903       count++;
   16904 
   16905     str = str.substr(start, count);
   16906 
   16907     str = str.trim();
   16908     // Remove adjacent spaces
   16909     str = str.replace(/\s+/g, ' ');
   16910 
   16911     var array = str.split(' ');
   16912     for (var i = 0, ii = array.length; i < ii; i++)
   16913       array[i] = parseFloat(array[i] || 0);
   16914     return array;
   16915   }
   16916 
   16917   function readNumber(str, index) {
   16918     while (str[index] == ' ')
   16919       index++;
   16920 
   16921     var start = index;
   16922 
   16923     var count = 0;
   16924     while (str[index++] != ' ')
   16925       count++;
   16926 
   16927     return parseFloat(str.substr(start, count) || 0);
   16928   }
   16929 
   16930   function isSeparator(c) {
   16931     return c == ' ' || c == '\n' || c == '\x0d';
   16932   }
   16933 
   16934   this.extractFontProgram = function Type1Parser_extractFontProgram(stream) {
   16935     var eexec = decrypt(stream, kEexecEncryptionKey, 4);
   16936     var eexecStr = '';
   16937     for (var i = 0, ii = eexec.length; i < ii; i++)
   16938       eexecStr += String.fromCharCode(eexec[i]);
   16939 
   16940     var glyphsSection = false, subrsSection = false;
   16941     var program = {
   16942       subrs: [],
   16943       charstrings: [],
   16944       properties: {
   16945         'privateData': {
   16946           'lenIV': 4
   16947         }
   16948       }
   16949     };
   16950 
   16951     var glyph = '';
   16952     var token = '';
   16953     var length = 0;
   16954 
   16955     var c = '';
   16956     var count = eexecStr.length;
   16957     for (var i = 0; i < count; i++) {
   16958       var getToken = function getToken() {
   16959         while (i < count && isSeparator(eexecStr[i]))
   16960           ++i;
   16961 
   16962         var token = '';
   16963         while (i < count && !isSeparator(eexecStr[i]))
   16964           token += eexecStr[i++];
   16965 
   16966         return token;
   16967       };
   16968       var c = eexecStr[i];
   16969 
   16970       if ((glyphsSection || subrsSection) &&
   16971           (token == 'RD' || token == '-|')) {
   16972         i++;
   16973         var data = eexec.slice(i, i + length);
   16974         var lenIV = program.properties.privateData['lenIV'];
   16975         var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
   16976         var str = decodeCharString(encoded);
   16977 
   16978         if (glyphsSection) {
   16979           program.charstrings.push({
   16980             glyph: glyph,
   16981             data: str.charstring,
   16982             lsb: str.lsb,
   16983             width: str.width
   16984           });
   16985         } else {
   16986           program.subrs.push(str.charstring);
   16987         }
   16988         i += length;
   16989         token = '';
   16990       } else if (isSeparator(c)) {
   16991         length = parseInt(token, 10);
   16992         token = '';
   16993       } else {
   16994         token += c;
   16995         if (!glyphsSection) {
   16996           switch (token) {
   16997             case '/CharString':
   16998               glyphsSection = true;
   16999               break;
   17000             case '/Subrs':
   17001               ++i;
   17002               var num = parseInt(getToken(), 10);
   17003               getToken(); // read in 'array'
   17004               for (var j = 0; j < num; ++j) {
   17005                 var t = getToken(); // read in 'dup'
   17006                 if (t == 'ND' || t == '|-' || t == 'noaccess')
   17007                   break;
   17008                 var index = parseInt(getToken(), 10);
   17009                 if (index > j)
   17010                   j = index;
   17011                 var length = parseInt(getToken(), 10);
   17012                 getToken(); // read in 'RD'
   17013                 var data = eexec.slice(i + 1, i + 1 + length);
   17014                 var lenIV = program.properties.privateData['lenIV'];
   17015                 var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
   17016                 var str = decodeCharString(encoded);
   17017                 i = i + 1 + length;
   17018                 t = getToken(); // read in 'NP'
   17019                 if (t == 'noaccess')
   17020                   getToken(); // read in 'put'
   17021                 program.subrs[index] = str.charstring;
   17022               }
   17023               break;
   17024             case '/BlueValues':
   17025             case '/OtherBlues':
   17026             case '/FamilyBlues':
   17027             case '/FamilyOtherBlues':
   17028             case '/StemSnapH':
   17029             case '/StemSnapV':
   17030               program.properties.privateData[token.substring(1)] =
   17031                 readNumberArray(eexecStr, i + 1);
   17032               break;
   17033             case '/StdHW':
   17034             case '/StdVW':
   17035               program.properties.privateData[token.substring(1)] =
   17036                 readNumberArray(eexecStr, i + 2)[0];
   17037               break;
   17038             case '/BlueShift':
   17039             case '/lenIV':
   17040             case '/BlueFuzz':
   17041             case '/BlueScale':
   17042             case '/LanguageGroup':
   17043             case '/ExpansionFactor':
   17044               program.properties.privateData[token.substring(1)] =
   17045                 readNumber(eexecStr, i + 1);
   17046               break;
   17047           }
   17048         } else if (c == '/') {
   17049           token = glyph = '';
   17050           while ((c = eexecStr[++i]) != ' ')
   17051             glyph += c;
   17052         }
   17053       }
   17054     }
   17055 
   17056     return program;
   17057   };
   17058 
   17059   this.extractFontHeader = function Type1Parser_extractFontHeader(stream,
   17060                                                                   properties) {
   17061     var headerString = '';
   17062     for (var i = 0, ii = stream.length; i < ii; i++)
   17063       headerString += String.fromCharCode(stream[i]);
   17064 
   17065     var token = '';
   17066     var count = headerString.length;
   17067     for (var i = 0; i < count; i++) {
   17068       var getToken = function getToken() {
   17069         var character = headerString[i];
   17070         while (i < count && (isSeparator(character) || character == '/'))
   17071           character = headerString[++i];
   17072 
   17073         var token = '';
   17074         while (i < count && !(isSeparator(character) || character == '/')) {
   17075           token += character;
   17076           character = headerString[++i];
   17077         }
   17078 
   17079         return token;
   17080       };
   17081 
   17082       var c = headerString[i];
   17083       if (isSeparator(c)) {
   17084         switch (token) {
   17085           case '/FontMatrix':
   17086             var matrix = readNumberArray(headerString, i + 1);
   17087 
   17088             // The FontMatrix is in unitPerEm, so make it pixels
   17089             for (var j = 0, jj = matrix.length; j < jj; j++)
   17090               matrix[j] *= 1000;
   17091 
   17092             // Make the angle into the right direction
   17093             matrix[2] *= -1;
   17094 
   17095             properties.fontMatrix = matrix;
   17096             break;
   17097           case '/Encoding':
   17098             var encodingArg = getToken();
   17099             var encoding;
   17100             if (!/^\d+$/.test(encodingArg)) {
   17101               // encoding name is specified
   17102               encoding = Encodings[encodingArg];
   17103             } else {
   17104               encoding = [];
   17105               var size = parseInt(encodingArg, 10);
   17106               getToken(); // read in 'array'
   17107 
   17108               for (var j = 0; j < size; j++) {
   17109                 var token = getToken();
   17110                 if (token == 'dup') {
   17111                   var index = parseInt(getToken(), 10);
   17112                   var glyph = getToken();
   17113                   encoding[index] = glyph;
   17114                   getToken(); // read the in 'put'
   17115                 }
   17116               }
   17117             }
   17118             if (!properties.hasEncoding && encoding) {
   17119               properties.baseEncoding = encoding;
   17120               break;
   17121             }
   17122             break;
   17123         }
   17124         token = '';
   17125       } else {
   17126         token += c;
   17127       }
   17128     }
   17129   };
   17130 };
   17131 
   17132 /**
   17133  * The CFF class takes a Type1 file and wrap it into a
   17134  * 'Compact Font Format' which itself embed Type2 charstrings.
   17135  */
   17136 var CFFStandardStrings = [
   17137   '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
   17138   'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
   17139   'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
   17140   'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
   17141   'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
   17142   'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
   17143   'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
   17144   'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
   17145   'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
   17146   'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
   17147   'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
   17148   'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
   17149   'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
   17150   'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
   17151   'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
   17152   'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
   17153   'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
   17154   'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
   17155   'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
   17156   'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
   17157   'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
   17158   'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
   17159   'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
   17160   'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
   17161   'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
   17162   'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
   17163   'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
   17164   'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
   17165   'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
   17166   'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
   17167   'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
   17168   'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
   17169   'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
   17170   'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff',
   17171   'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
   17172   'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
   17173   'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
   17174   'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
   17175   'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
   17176   'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
   17177   'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
   17178   'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
   17179   'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
   17180   'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
   17181   'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
   17182   'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
   17183   'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
   17184   'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
   17185   'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
   17186   'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
   17187   'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
   17188   'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
   17189   'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
   17190   'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
   17191   'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
   17192   'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
   17193   'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
   17194   'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
   17195   'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
   17196   'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
   17197   'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
   17198   'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
   17199   'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
   17200   'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
   17201   'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
   17202 ];
   17203 
   17204 var type1Parser = new Type1Parser();
   17205 
   17206 // Type1Font is also a CIDFontType0.
   17207 var Type1Font = function Type1Font(name, file, properties) {
   17208   // Get the data block containing glyphs and subrs informations
   17209   var headerBlock = file.getBytes(properties.length1);
   17210   type1Parser.extractFontHeader(headerBlock, properties);
   17211 
   17212   // Decrypt the data blocks and retrieve it's content
   17213   var eexecBlock = file.getBytes(properties.length2);
   17214   var data = type1Parser.extractFontProgram(eexecBlock);
   17215   for (var info in data.properties)
   17216     properties[info] = data.properties[info];
   17217 
   17218   var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
   17219   var type2Charstrings = this.getType2Charstrings(charstrings);
   17220   var subrs = this.getType2Subrs(data.subrs);
   17221 
   17222   this.charstrings = charstrings;
   17223   this.data = this.wrap(name, type2Charstrings, this.charstrings,
   17224                         subrs, properties);
   17225 };
   17226 
   17227 Type1Font.prototype = {
   17228   createCFFIndexHeader: function Type1Font_createCFFIndexHeader(objects,
   17229                                                                 isByte) {
   17230     // First 2 bytes contains the number of objects contained into this index
   17231     var count = objects.length;
   17232 
   17233     // If there is no object, just create an array saying that with another
   17234     // offset byte.
   17235     if (count == 0)
   17236       return '\x00\x00\x00';
   17237 
   17238     var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
   17239 
   17240     // Next byte contains the offset size use to reference object in the file
   17241     // Actually we're using 0x04 to be sure to be able to store everything
   17242     // without thinking of it while coding.
   17243     data += '\x04';
   17244 
   17245     // Add another offset after this one because we need a new offset
   17246     var relativeOffset = 1;
   17247     for (var i = 0; i < count + 1; i++) {
   17248       data += String.fromCharCode((relativeOffset >>> 24) & 0xFF,
   17249                                   (relativeOffset >> 16) & 0xFF,
   17250                                   (relativeOffset >> 8) & 0xFF,
   17251                                   relativeOffset & 0xFF);
   17252 
   17253       if (objects[i])
   17254         relativeOffset += objects[i].length;
   17255     }
   17256 
   17257     for (var i = 0; i < count; i++) {
   17258       for (var j = 0, jj = objects[i].length; j < jj; j++)
   17259         data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
   17260                 objects[i][j];
   17261     }
   17262     return data;
   17263   },
   17264 
   17265   encodeNumber: function Type1Font_encodeNumber(value) {
   17266     // some of the fonts has ouf-of-range values
   17267     // they are just arithmetic overflows
   17268     // make sanitizer happy
   17269     value |= 0;
   17270     if (value >= -32768 && value <= 32767) {
   17271       return '\x1c' +
   17272              String.fromCharCode((value >> 8) & 0xFF) +
   17273              String.fromCharCode(value & 0xFF);
   17274     } else {
   17275       return '\x1d' +
   17276              String.fromCharCode((value >> 24) & 0xFF) +
   17277              String.fromCharCode((value >> 16) & 0xFF) +
   17278              String.fromCharCode((value >> 8) & 0xFF) +
   17279              String.fromCharCode(value & 0xFF);
   17280     }
   17281   },
   17282 
   17283   getOrderedCharStrings: function Type1Font_getOrderedCharStrings(glyphs,
   17284                                                             properties) {
   17285     var charstrings = [];
   17286     var i, length, glyphName;
   17287     var unusedUnicode = kCmapGlyphOffset;
   17288     for (i = 0, length = glyphs.length; i < length; i++) {
   17289       var item = glyphs[i];
   17290       var glyphName = item.glyph;
   17291       var unicode = glyphName in GlyphsUnicode ?
   17292         GlyphsUnicode[glyphName] : unusedUnicode++;
   17293       charstrings.push({
   17294         glyph: glyphName,
   17295         unicode: unicode,
   17296         gid: i,
   17297         charstring: item.data,
   17298         width: item.width,
   17299         lsb: item.lsb
   17300       });
   17301     }
   17302 
   17303     charstrings.sort(function charstrings_sort(a, b) {
   17304       return a.unicode - b.unicode;
   17305     });
   17306     return charstrings;
   17307   },
   17308 
   17309   getType2Charstrings: function Type1Font_getType2Charstrings(
   17310                                   type1Charstrings) {
   17311     var type2Charstrings = [];
   17312     var count = type1Charstrings.length;
   17313     for (var i = 0; i < count; i++) {
   17314       var charstring = type1Charstrings[i].charstring;
   17315       type2Charstrings.push(this.flattenCharstring(charstring.slice(),
   17316                                                    this.commandsMap));
   17317     }
   17318     return type2Charstrings;
   17319   },
   17320 
   17321   getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
   17322     var bias = 0;
   17323     var count = type1Subrs.length;
   17324     if (count < 1240)
   17325       bias = 107;
   17326     else if (count < 33900)
   17327       bias = 1131;
   17328     else
   17329       bias = 32768;
   17330 
   17331     // Add a bunch of empty subrs to deal with the Type2 bias
   17332     var type2Subrs = [];
   17333     for (var i = 0; i < bias; i++)
   17334       type2Subrs.push([0x0B]);
   17335 
   17336     for (var i = 0; i < count; i++) {
   17337       var subr = type1Subrs[i];
   17338       if (!subr)
   17339         subr = [0x0B];
   17340 
   17341       type2Subrs.push(this.flattenCharstring(subr, this.commandsMap));
   17342     }
   17343 
   17344     return type2Subrs;
   17345   },
   17346 
   17347   /*
   17348    * Flatten the commands by interpreting the postscript code and replacing
   17349    * every 'callsubr', 'callothersubr' by the real commands.
   17350    */
   17351   commandsMap: {
   17352     'hstem': 1,
   17353     'vstem': 3,
   17354     'vmoveto': 4,
   17355     'rlineto': 5,
   17356     'hlineto': 6,
   17357     'vlineto': 7,
   17358     'rrcurveto': 8,
   17359     'callsubr': 10,
   17360     'return': 11,
   17361     'sub': [12, 11],
   17362     'div': [12, 12],
   17363     'exch': [12, 28],
   17364     'flex': [12, 35],
   17365     'drop' : [12, 18],
   17366     'endchar': 14,
   17367     'rmoveto': 21,
   17368     'hmoveto': 22,
   17369     'vhcurveto': 30,
   17370     'hvcurveto': 31
   17371   },
   17372 
   17373   flattenCharstring: function Type1Font_flattenCharstring(charstring, map) {
   17374     // charstring changes size - can't cache .length in loop
   17375     for (var i = 0; i < charstring.length; i++) {
   17376       var command = charstring[i];
   17377       if (command.charAt) {
   17378         var cmd = map[command];
   17379         assert(cmd, 'Unknow command: ' + command);
   17380 
   17381         if (isArray(cmd))
   17382           charstring.splice(i++, 1, cmd[0], cmd[1]);
   17383         else
   17384           charstring[i] = cmd;
   17385       } else {
   17386         // Type1 charstring use a division for number above 32000
   17387         if (command > 32000) {
   17388           var divisor = charstring[i + 1];
   17389           command /= divisor;
   17390           charstring.splice(i, 3, 28, command >> 8, command & 0xff);
   17391         } else {
   17392           charstring.splice(i, 1, 28, command >> 8, command & 0xff);
   17393         }
   17394         i += 2;
   17395       }
   17396     }
   17397     return charstring;
   17398   },
   17399 
   17400   wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
   17401     var fields = {
   17402       // major version, minor version, header size, offset size
   17403       'header': '\x01\x00\x04\x04',
   17404 
   17405       'names': this.createCFFIndexHeader([name]),
   17406 
   17407       'topDict': (function topDict(self) {
   17408         return function cffWrapTopDict() {
   17409           var header = '\x00\x01\x01\x01';
   17410           var dict =
   17411               '\xf8\x1b\x00' + // version
   17412               '\xf8\x1c\x01' + // Notice
   17413               '\xf8\x1d\x02' + // FullName
   17414               '\xf8\x1e\x03' + // FamilyName
   17415               '\xf8\x1f\x04' +  // Weight
   17416               '\x1c\x00\x00\x10'; // Encoding
   17417 
   17418           var boundingBox = properties.bbox;
   17419           for (var i = 0, ii = boundingBox.length; i < ii; i++)
   17420             dict += self.encodeNumber(boundingBox[i]);
   17421           dict += '\x05'; // FontBBox;
   17422 
   17423           var offset = fields.header.length +
   17424                        fields.names.length +
   17425                        (header.length + 1) +
   17426                        (dict.length + (4 + 4)) +
   17427                        fields.strings.length +
   17428                        fields.globalSubrs.length;
   17429 
   17430           // If the offset if over 32767, encodeNumber is going to return
   17431           // 5 bytes to encode the position instead of 3.
   17432           if ((offset + fields.charstrings.length) > 32767) {
   17433             offset += 9;
   17434           } else {
   17435             offset += 7;
   17436           }
   17437 
   17438           dict += self.encodeNumber(offset) + '\x0f'; // Charset
   17439 
   17440           offset = offset + (glyphs.length * 2) + 1;
   17441           dict += self.encodeNumber(offset) + '\x11'; // Charstrings
   17442 
   17443           offset = offset + fields.charstrings.length;
   17444           dict += self.encodeNumber(fields.privateData.length);
   17445           dict += self.encodeNumber(offset) + '\x12'; // Private
   17446 
   17447           return header + String.fromCharCode(dict.length + 1) + dict;
   17448         };
   17449       })(this),
   17450 
   17451       'strings': (function strings(self) {
   17452         var strings = [
   17453           'Version 0.11',         // Version
   17454           'See original notice',  // Notice
   17455           name,                   // FullName
   17456           name,                   // FamilyName
   17457           'Medium'                // Weight
   17458         ];
   17459         return self.createCFFIndexHeader(strings);
   17460       })(this),
   17461 
   17462       'globalSubrs': this.createCFFIndexHeader([]),
   17463 
   17464       'charset': (function charset(self) {
   17465         var charsetString = '\x00'; // Encoding
   17466 
   17467         var count = glyphs.length;
   17468         for (var i = 0; i < count; i++) {
   17469           var index = CFFStandardStrings.indexOf(charstrings[i].glyph);
   17470           // Some characters like asterikmath && circlecopyrt are
   17471           // missing from the original strings, for the moment let's
   17472           // map them to .notdef and see later if it cause any
   17473           // problems
   17474           if (index == -1)
   17475             index = 0;
   17476 
   17477           charsetString += String.fromCharCode(index >> 8, index & 0xff);
   17478         }
   17479         return charsetString;
   17480       })(this),
   17481 
   17482       'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
   17483                                                true),
   17484 
   17485       'privateData': (function cffWrapPrivate(self) {
   17486         var data =
   17487             '\x8b\x14' + // defaultWidth
   17488             '\x8b\x15';  // nominalWidth
   17489         var fieldMap = {
   17490           BlueValues: '\x06',
   17491           OtherBlues: '\x07',
   17492           FamilyBlues: '\x08',
   17493           FamilyOtherBlues: '\x09',
   17494           StemSnapH: '\x0c\x0c',
   17495           StemSnapV: '\x0c\x0d',
   17496           BlueShift: '\x0c\x0a',
   17497           BlueFuzz: '\x0c\x0b',
   17498           BlueScale: '\x0c\x09',
   17499           LanguageGroup: '\x0c\x11',
   17500           ExpansionFactor: '\x0c\x18'
   17501         };
   17502         for (var field in fieldMap) {
   17503           if (!properties.privateData.hasOwnProperty(field))
   17504             continue;
   17505           var value = properties.privateData[field];
   17506 
   17507           if (isArray(value)) {
   17508             data += self.encodeNumber(value[0]);
   17509             for (var i = 1, ii = value.length; i < ii; i++)
   17510               data += self.encodeNumber(value[i] - value[i - 1]);
   17511           } else {
   17512             data += self.encodeNumber(value);
   17513           }
   17514           data += fieldMap[field];
   17515         }
   17516 
   17517         data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
   17518 
   17519         return data;
   17520       })(this),
   17521 
   17522       'localSubrs': this.createCFFIndexHeader(subrs, true)
   17523     };
   17524     fields.topDict = fields.topDict();
   17525 
   17526 
   17527     var cff = [];
   17528     for (var index in fields) {
   17529       var field = fields[index];
   17530       for (var i = 0, ii = field.length; i < ii; i++)
   17531         cff.push(field.charCodeAt(i));
   17532     }
   17533 
   17534     return cff;
   17535   }
   17536 };
   17537 
   17538 var CFFFont = (function CFFFontClosure() {
   17539   function CFFFont(file, properties) {
   17540     this.properties = properties;
   17541 
   17542     var parser = new CFFParser(file, properties);
   17543     var cff = parser.parse();
   17544     var compiler = new CFFCompiler(cff);
   17545     this.readExtra(cff);
   17546     try {
   17547       this.data = compiler.compile();
   17548     } catch (e) {
   17549       warn('Failed to compile font ' + properties.loadedName);
   17550       // There may have just been an issue with the compiler, set the data
   17551       // anyway and hope the font loaded.
   17552       this.data = file;
   17553     }
   17554   }
   17555 
   17556   CFFFont.prototype = {
   17557     readExtra: function CFFFont_readExtra(cff) {
   17558       // charstrings contains info about glyphs (one element per glyph
   17559       // containing mappings for {unicode, width})
   17560       var charset = cff.charset.charset;
   17561       var encoding = cff.encoding ? cff.encoding.encoding : null;
   17562       var charstrings = this.getCharStrings(charset, encoding);
   17563 
   17564       // create the mapping between charstring and glyph id
   17565       var glyphIds = [];
   17566       for (var i = 0, ii = charstrings.length; i < ii; i++)
   17567         glyphIds.push(charstrings[i].gid);
   17568 
   17569       this.charstrings = charstrings;
   17570       this.glyphIds = glyphIds;
   17571     },
   17572     getCharStrings: function CFFFont_getCharStrings(charsets, encoding) {
   17573       var charstrings = [];
   17574       var unicodeUsed = [];
   17575       var unassignedUnicodeItems = [];
   17576       var inverseEncoding = [];
   17577       // CID fonts don't have an encoding.
   17578       if (encoding !== null)
   17579         for (var charcode in encoding)
   17580           inverseEncoding[encoding[charcode]] = charcode | 0;
   17581       else
   17582         inverseEncoding = charsets;
   17583       for (var i = 0, ii = charsets.length; i < ii; i++) {
   17584         var glyph = charsets[i];
   17585         if (glyph == '.notdef')
   17586           continue;
   17587 
   17588         var code = inverseEncoding[i];
   17589         if (!code || isSpecialUnicode(code)) {
   17590           unassignedUnicodeItems.push(i);
   17591           continue;
   17592         }
   17593         charstrings.push({
   17594           unicode: code,
   17595           code: code,
   17596           gid: i,
   17597           glyph: glyph
   17598         });
   17599         unicodeUsed[code] = true;
   17600       }
   17601 
   17602       var nextUnusedUnicode = kCmapGlyphOffset;
   17603       for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) {
   17604         var i = unassignedUnicodeItems[j];
   17605         // giving unicode value anyway
   17606         while (nextUnusedUnicode in unicodeUsed)
   17607           nextUnusedUnicode++;
   17608         var unicode = nextUnusedUnicode++;
   17609         charstrings.push({
   17610           unicode: unicode,
   17611           code: inverseEncoding[i] || 0,
   17612           gid: i,
   17613           glyph: charsets[i]
   17614         });
   17615       }
   17616 
   17617       // sort the array by the unicode value (again)
   17618       charstrings.sort(function getCharStringsSort(a, b) {
   17619         return a.unicode - b.unicode;
   17620       });
   17621       return charstrings;
   17622     }
   17623   };
   17624 
   17625   return CFFFont;
   17626 })();
   17627 
   17628 var CFFParser = (function CFFParserClosure() {
   17629   function CFFParser(file, properties) {
   17630     this.bytes = file.getBytes();
   17631     this.properties = properties;
   17632   }
   17633   CFFParser.prototype = {
   17634     parse: function CFFParser_parse() {
   17635       var properties = this.properties;
   17636       var cff = new CFF();
   17637       this.cff = cff;
   17638 
   17639       // The first five sections must be in order, all the others are reached
   17640       // via offsets contained in one of the below.
   17641       var header = this.parseHeader();
   17642       var nameIndex = this.parseIndex(header.endPos);
   17643       var topDictIndex = this.parseIndex(nameIndex.endPos);
   17644       var stringIndex = this.parseIndex(topDictIndex.endPos);
   17645       var globalSubrIndex = this.parseIndex(stringIndex.endPos);
   17646 
   17647       var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
   17648       var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
   17649 
   17650       cff.header = header.obj;
   17651       cff.names = this.parseNameIndex(nameIndex.obj);
   17652       cff.strings = this.parseStringIndex(stringIndex.obj);
   17653       cff.topDict = topDict;
   17654       cff.globalSubrIndex = globalSubrIndex.obj;
   17655 
   17656       this.parsePrivateDict(cff.topDict);
   17657 
   17658       cff.isCIDFont = topDict.hasName('ROS');
   17659 
   17660       var charStringOffset = topDict.getByName('CharStrings');
   17661       cff.charStrings = this.parseCharStrings(charStringOffset);
   17662 
   17663       var charset, encoding;
   17664       if (cff.isCIDFont) {
   17665         var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
   17666         for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
   17667           var dictRaw = fdArrayIndex.get(i);
   17668           var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
   17669                                          cff.strings);
   17670           this.parsePrivateDict(fontDict);
   17671           cff.fdArray.push(fontDict);
   17672         }
   17673         // cid fonts don't have an encoding
   17674         encoding = null;
   17675         charset = this.parseCharsets(topDict.getByName('charset'),
   17676                                      cff.charStrings.count, cff.strings, true);
   17677         cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
   17678                                              cff.charStrings.count);
   17679       } else {
   17680         charset = this.parseCharsets(topDict.getByName('charset'),
   17681                                      cff.charStrings.count, cff.strings, false);
   17682         encoding = this.parseEncoding(topDict.getByName('Encoding'),
   17683                                       properties,
   17684                                       cff.strings, charset.charset);
   17685       }
   17686       cff.charset = charset;
   17687       cff.encoding = encoding;
   17688 
   17689       return cff;
   17690     },
   17691     parseHeader: function CFFParser_parseHeader() {
   17692       var bytes = this.bytes;
   17693       var offset = 0;
   17694 
   17695       while (bytes[offset] != 1)
   17696         ++offset;
   17697 
   17698       if (offset != 0) {
   17699         warn('cff data is shifted');
   17700         bytes = bytes.subarray(offset);
   17701         this.bytes = bytes;
   17702       }
   17703       var major = bytes[0];
   17704       var minor = bytes[1];
   17705       var hdrSize = bytes[2];
   17706       var offSize = bytes[3];
   17707       var header = new CFFHeader(major, minor, hdrSize, offSize);
   17708       return {obj: header, endPos: hdrSize};
   17709     },
   17710     parseDict: function CFFParser_parseDict(dict) {
   17711       var pos = 0;
   17712 
   17713       function parseOperand() {
   17714         var value = dict[pos++];
   17715         if (value === 30) {
   17716           return parseFloatOperand(pos);
   17717         } else if (value === 28) {
   17718           value = dict[pos++];
   17719           value = (value << 8) | dict[pos++];
   17720           return value;
   17721         } else if (value === 29) {
   17722           value = dict[pos++];
   17723           value = (value << 8) | dict[pos++];
   17724           value = (value << 8) | dict[pos++];
   17725           value = (value << 8) | dict[pos++];
   17726           return value;
   17727         } else if (value >= 32 && value <= 246) {
   17728           return value - 139;
   17729         } else if (value >= 247 && value <= 250) {
   17730           return ((value - 247) * 256) + dict[pos++] + 108;
   17731         } else if (value >= 251 && value <= 254) {
   17732           return -((value - 251) * 256) - dict[pos++] - 108;
   17733         } else {
   17734           error('255 is not a valid DICT command');
   17735         }
   17736         return -1;
   17737       }
   17738 
   17739       function parseFloatOperand() {
   17740         var str = '';
   17741         var eof = 15;
   17742         var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
   17743             '9', '.', 'E', 'E-', null, '-'];
   17744         var length = dict.length;
   17745         while (pos < length) {
   17746           var b = dict[pos++];
   17747           var b1 = b >> 4;
   17748           var b2 = b & 15;
   17749 
   17750           if (b1 == eof)
   17751             break;
   17752           str += lookup[b1];
   17753 
   17754           if (b2 == eof)
   17755             break;
   17756           str += lookup[b2];
   17757         }
   17758         return parseFloat(str);
   17759       }
   17760 
   17761       var operands = [];
   17762       var entries = [];
   17763 
   17764       var pos = 0;
   17765       var end = dict.length;
   17766       while (pos < end) {
   17767         var b = dict[pos];
   17768         if (b <= 21) {
   17769           if (b === 12)
   17770             b = (b << 8) | dict[++pos];
   17771           entries.push([b, operands]);
   17772           operands = [];
   17773           ++pos;
   17774         } else {
   17775           operands.push(parseOperand());
   17776         }
   17777       }
   17778       return entries;
   17779     },
   17780     parseIndex: function CFFParser_parseIndex(pos) {
   17781       var cffIndex = new CFFIndex();
   17782       var bytes = this.bytes;
   17783       var count = (bytes[pos++] << 8) | bytes[pos++];
   17784       var offsets = [];
   17785       var start = pos;
   17786       var end = pos;
   17787 
   17788       if (count != 0) {
   17789         var offsetSize = bytes[pos++];
   17790         // add 1 for offset to determine size of last object
   17791         var startPos = pos + ((count + 1) * offsetSize) - 1;
   17792 
   17793         for (var i = 0, ii = count + 1; i < ii; ++i) {
   17794           var offset = 0;
   17795           for (var j = 0; j < offsetSize; ++j) {
   17796             offset <<= 8;
   17797             offset += bytes[pos++];
   17798           }
   17799           offsets.push(startPos + offset);
   17800         }
   17801         end = offsets[count];
   17802       }
   17803       for (var i = 0, ii = offsets.length - 1; i < ii; ++i) {
   17804         var offsetStart = offsets[i];
   17805         var offsetEnd = offsets[i + 1];
   17806         cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
   17807       }
   17808       return {obj: cffIndex, endPos: end};
   17809     },
   17810     parseNameIndex: function CFFParser_parseNameIndex(index) {
   17811       var names = [];
   17812       for (var i = 0, ii = index.count; i < ii; ++i) {
   17813         var name = index.get(i);
   17814         // OTS doesn't allow names to be over 127 characters.
   17815         var length = Math.min(name.length, 127);
   17816         var data = [];
   17817         // OTS also only permits certain characters in the name.
   17818         for (var j = 0; j < length; ++j) {
   17819           var c = name[j];
   17820           if (j === 0 && c === 0) {
   17821             data[j] = c;
   17822             continue;
   17823           }
   17824           if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
   17825               c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
   17826               c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
   17827               c === 47 /* / */ || c === 37 /* % */) {
   17828             data[j] = 95;
   17829             continue;
   17830           }
   17831           data[j] = c;
   17832         }
   17833         names.push(String.fromCharCode.apply(null, data));
   17834       }
   17835       return names;
   17836     },
   17837     parseStringIndex: function CFFParser_parseStringIndex(index) {
   17838       var strings = new CFFStrings();
   17839       for (var i = 0, ii = index.count; i < ii; ++i) {
   17840         var data = index.get(i);
   17841         strings.add(String.fromCharCode.apply(null, data));
   17842       }
   17843       return strings;
   17844     },
   17845     createDict: function CFFParser_createDict(type, dict, strings) {
   17846       var cffDict = new type(strings);
   17847       var types = cffDict.types;
   17848 
   17849       for (var i = 0, ii = dict.length; i < ii; ++i) {
   17850         var pair = dict[i];
   17851         var key = pair[0];
   17852         var value = pair[1];
   17853         cffDict.setByKey(key, value);
   17854       }
   17855       return cffDict;
   17856     },
   17857     parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
   17858       var charStrings = this.parseIndex(charStringOffset).obj;
   17859       // The CFF specification state that the 'dotsection' command
   17860       // (12, 0) is deprecated and treated as a no-op, but all Type2
   17861       // charstrings processors should support them. Unfortunately
   17862       // the font sanitizer don't. As a workaround the sequence (12, 0)
   17863       // is replaced by a useless (0, hmoveto).
   17864       var count = charStrings.count;
   17865       for (var i = 0; i < count; i++) {
   17866         var charstring = charStrings.get(i);
   17867 
   17868         var data = charstring;
   17869         var length = data.length;
   17870         for (var j = 0; j <= length; j) {
   17871           var value = data[j++];
   17872           if (value == 12 && data[j++] == 0) {
   17873               data[j - 2] = 139;
   17874               data[j - 1] = 22;
   17875           } else if (value === 28) {
   17876             j += 2;
   17877           } else if (value >= 247 && value <= 254) {
   17878             j++;
   17879           } else if (value == 255) {
   17880             j += 4;
   17881           }
   17882         }
   17883       }
   17884       return charStrings;
   17885     },
   17886     parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
   17887       // no private dict, do nothing
   17888       if (!parentDict.hasName('Private'))
   17889         return;
   17890       var privateOffset = parentDict.getByName('Private');
   17891       // make sure the params are formatted correctly
   17892       if (!isArray(privateOffset) || privateOffset.length !== 2) {
   17893         parentDict.removeByName('Private');
   17894         return;
   17895       }
   17896       var size = privateOffset[0];
   17897       var offset = privateOffset[1];
   17898       // remove empty dicts or ones that refer to invalid location
   17899       if (size === 0 || offset >= this.bytes.length) {
   17900         parentDict.removeByName('Private');
   17901         return;
   17902       }
   17903 
   17904       var privateDictEnd = offset + size;
   17905       var dictData = this.bytes.subarray(offset, privateDictEnd);
   17906       var dict = this.parseDict(dictData);
   17907       var privateDict = this.createDict(CFFPrivateDict, dict,
   17908                                         parentDict.strings);
   17909       parentDict.privateDict = privateDict;
   17910 
   17911       // Parse the Subrs index also since it's relative to the private dict.
   17912       if (!privateDict.getByName('Subrs'))
   17913         return;
   17914       var subrsOffset = privateDict.getByName('Subrs');
   17915       var relativeOffset = offset + subrsOffset;
   17916       // Validate the offset.
   17917       if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
   17918         privateDict.removeByName('Subrs');
   17919         return;
   17920       }
   17921       var subrsIndex = this.parseIndex(relativeOffset);
   17922       privateDict.subrsIndex = subrsIndex.obj;
   17923     },
   17924     parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
   17925       if (pos == 0) {
   17926         return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
   17927                               ISOAdobeCharset);
   17928       } else if (pos == 1) {
   17929         return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
   17930                               ExpertCharset);
   17931       } else if (pos == 2) {
   17932         return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
   17933                               ExpertSubsetCharset);
   17934       }
   17935 
   17936       var bytes = this.bytes;
   17937       var start = pos;
   17938       var format = bytes[pos++];
   17939       var charset = ['.notdef'];
   17940 
   17941       // subtract 1 for the .notdef glyph
   17942       length -= 1;
   17943 
   17944       switch (format) {
   17945         case 0:
   17946           for (var i = 0; i < length; i++) {
   17947             var id = (bytes[pos++] << 8) | bytes[pos++];
   17948             charset.push(cid ? id : strings.get(id));
   17949           }
   17950           break;
   17951         case 1:
   17952           while (charset.length <= length) {
   17953             var id = (bytes[pos++] << 8) | bytes[pos++];
   17954             var count = bytes[pos++];
   17955             for (var i = 0; i <= count; i++)
   17956               charset.push(cid ? id++ : strings.get(id++));
   17957           }
   17958           break;
   17959         case 2:
   17960           while (charset.length <= length) {
   17961             var id = (bytes[pos++] << 8) | bytes[pos++];
   17962             var count = (bytes[pos++] << 8) | bytes[pos++];
   17963             for (var i = 0; i <= count; i++)
   17964               charset.push(cid ? id++ : strings.get(id++));
   17965           }
   17966           break;
   17967         default:
   17968           error('Unknown charset format');
   17969       }
   17970       // Raw won't be needed if we actually compile the charset.
   17971       var end = pos;
   17972       var raw = bytes.subarray(start, end);
   17973 
   17974       return new CFFCharset(false, format, charset, raw);
   17975     },
   17976     parseEncoding: function CFFParser_parseEncoding(pos,
   17977                                                     properties,
   17978                                                     strings,
   17979                                                     charset) {
   17980       var encoding = {};
   17981       var bytes = this.bytes;
   17982       var predefined = false;
   17983       var hasSupplement = false;
   17984       var format;
   17985       var raw = null;
   17986 
   17987       function readSupplement() {
   17988         var supplementsCount = bytes[pos++];
   17989         for (var i = 0; i < supplementsCount; i++) {
   17990           var code = bytes[pos++];
   17991           var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
   17992           encoding[code] = properties.differences.indexOf(strings.get(sid));
   17993         }
   17994       }
   17995 
   17996       if (pos == 0 || pos == 1) {
   17997         predefined = true;
   17998         format = pos;
   17999         var gid = 1;
   18000         var baseEncoding = pos ? Encodings.ExpertEncoding :
   18001                                  Encodings.StandardEncoding;
   18002         for (var i = 0, ii = charset.length; i < ii; i++) {
   18003           var index = baseEncoding.indexOf(charset[i]);
   18004           if (index != -1)
   18005             encoding[index] = gid++;
   18006         }
   18007       } else {
   18008         var dataStart = pos;
   18009         var format = bytes[pos++];
   18010         switch (format & 0x7f) {
   18011           case 0:
   18012             var glyphsCount = bytes[pos++];
   18013             for (var i = 1; i <= glyphsCount; i++)
   18014               encoding[bytes[pos++]] = i;
   18015             break;
   18016 
   18017           case 1:
   18018             var rangesCount = bytes[pos++];
   18019             var gid = 1;
   18020             for (var i = 0; i < rangesCount; i++) {
   18021               var start = bytes[pos++];
   18022               var left = bytes[pos++];
   18023               for (var j = start; j <= start + left; j++)
   18024                 encoding[j] = gid++;
   18025             }
   18026             break;
   18027 
   18028           default:
   18029             error('Unknow encoding format: ' + format + ' in CFF');
   18030             break;
   18031         }
   18032         var dataEnd = pos;
   18033         if (format & 0x80) {
   18034           // The font sanitizer does not support CFF encoding with a
   18035           // supplement, since the encoding is not really used to map
   18036           // between gid to glyph, let's overwrite what is declared in
   18037           // the top dictionary to let the sanitizer think the font use
   18038           // StandardEncoding, that's a lie but that's ok.
   18039           bytes[dataStart] &= 0x7f;
   18040           readSupplement();
   18041           hasSupplement = true;
   18042         }
   18043         raw = bytes.subarray(dataStart, dataEnd);
   18044       }
   18045       format = format & 0x7f;
   18046       return new CFFEncoding(predefined, format, encoding, raw);
   18047     },
   18048     parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
   18049       var start = pos;
   18050       var bytes = this.bytes;
   18051       var format = bytes[pos++];
   18052       var fdSelect = [];
   18053       switch (format) {
   18054         case 0:
   18055           for (var i = 0; i < length; ++i) {
   18056             var id = bytes[pos++];
   18057             fdSelect.push(id);
   18058           }
   18059           break;
   18060         case 3:
   18061           var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
   18062           for (var i = 0; i < rangesCount; ++i) {
   18063             var first = (bytes[pos++] << 8) | bytes[pos++];
   18064             var fdIndex = bytes[pos++];
   18065             var next = (bytes[pos] << 8) | bytes[pos + 1];
   18066             for (var j = first; j < next; ++j)
   18067               fdSelect.push(fdIndex);
   18068           }
   18069           // Advance past the sentinel(next).
   18070           pos += 2;
   18071           break;
   18072         default:
   18073           error('Unknown fdselect format ' + format);
   18074           break;
   18075       }
   18076       var end = pos;
   18077       return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
   18078     }
   18079   };
   18080   return CFFParser;
   18081 })();
   18082 
   18083 // Compact Font Format
   18084 var CFF = (function CFFClosure() {
   18085   function CFF() {
   18086     this.header = null;
   18087     this.names = [];
   18088     this.topDict = null;
   18089     this.strings = new CFFStrings();
   18090     this.globalSubrIndex = null;
   18091 
   18092     // The following could really be per font, but since we only have one font
   18093     // store them here.
   18094     this.encoding = null;
   18095     this.charset = null;
   18096     this.charStrings = null;
   18097     this.fdArray = [];
   18098     this.fdSelect = null;
   18099 
   18100     this.isCIDFont = false;
   18101   }
   18102   return CFF;
   18103 })();
   18104 
   18105 var CFFHeader = (function CFFHeaderClosure() {
   18106   function CFFHeader(major, minor, hdrSize, offSize) {
   18107     this.major = major;
   18108     this.minor = minor;
   18109     this.hdrSize = hdrSize;
   18110     this.offSize = offSize;
   18111   }
   18112   return CFFHeader;
   18113 })();
   18114 
   18115 var CFFStrings = (function CFFStringsClosure() {
   18116   function CFFStrings() {
   18117     this.strings = [];
   18118   }
   18119   CFFStrings.prototype = {
   18120     get: function CFFStrings_get(index) {
   18121       if (index >= 0 && index <= 390)
   18122         return CFFStandardStrings[index];
   18123       if (index - 391 <= this.strings.length)
   18124         return this.strings[index - 391];
   18125       return CFFStandardStrings[0];
   18126     },
   18127     add: function CFFStrings_add(value) {
   18128       this.strings.push(value);
   18129     },
   18130     get count() {
   18131       return this.strings.length;
   18132     }
   18133   };
   18134   return CFFStrings;
   18135 })();
   18136 
   18137 var CFFIndex = (function CFFIndexClosure() {
   18138   function CFFIndex() {
   18139     this.objects = [];
   18140     this.length = 0;
   18141   }
   18142   CFFIndex.prototype = {
   18143     add: function CFFIndex_add(data) {
   18144       this.length += data.length;
   18145       this.objects.push(data);
   18146     },
   18147     get: function CFFIndex_get(index) {
   18148       return this.objects[index];
   18149     },
   18150     get count() {
   18151       return this.objects.length;
   18152     }
   18153   };
   18154   return CFFIndex;
   18155 })();
   18156 
   18157 var CFFDict = (function CFFDictClosure() {
   18158   function CFFDict(tables, strings) {
   18159     this.keyToNameMap = tables.keyToNameMap;
   18160     this.nameToKeyMap = tables.nameToKeyMap;
   18161     this.defaults = tables.defaults;
   18162     this.types = tables.types;
   18163     this.opcodes = tables.opcodes;
   18164     this.order = tables.order;
   18165     this.strings = strings;
   18166     this.values = {};
   18167   }
   18168   CFFDict.prototype = {
   18169     // value should always be an array
   18170     setByKey: function CFFDict_setByKey(key, value) {
   18171       if (!(key in this.keyToNameMap))
   18172         return false;
   18173       // ignore empty values
   18174       if (value.length === 0)
   18175         return true;
   18176       var type = this.types[key];
   18177       // remove the array wrapping these types of values
   18178       if (type === 'num' || type === 'sid' || type === 'offset')
   18179         value = value[0];
   18180       this.values[key] = value;
   18181       return true;
   18182     },
   18183     hasName: function CFFDict_hasName(name) {
   18184       return this.nameToKeyMap[name] in this.values;
   18185     },
   18186     getByName: function CFFDict_getByName(name) {
   18187       if (!(name in this.nameToKeyMap))
   18188         error('Invalid dictionary name "' + name + '"');
   18189       var key = this.nameToKeyMap[name];
   18190       if (!(key in this.values))
   18191         return this.defaults[key];
   18192       return this.values[key];
   18193     },
   18194     removeByName: function CFFDict_removeByName(name) {
   18195       delete this.values[this.nameToKeyMap[name]];
   18196     }
   18197   };
   18198   CFFDict.createTables = function CFFDict_createTables(layout) {
   18199     var tables = {
   18200       keyToNameMap: {},
   18201       nameToKeyMap: {},
   18202       defaults: {},
   18203       types: {},
   18204       opcodes: {},
   18205       order: []
   18206     };
   18207     for (var i = 0, ii = layout.length; i < ii; ++i) {
   18208       var entry = layout[i];
   18209       var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
   18210       tables.keyToNameMap[key] = entry[1];
   18211       tables.nameToKeyMap[entry[1]] = key;
   18212       tables.types[key] = entry[2];
   18213       tables.defaults[key] = entry[3];
   18214       tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
   18215       tables.order.push(key);
   18216     }
   18217     return tables;
   18218   };
   18219   return CFFDict;
   18220 })();
   18221 
   18222 var CFFTopDict = (function CFFTopDictClosure() {
   18223   var layout = [
   18224     [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
   18225     [[12, 20], 'SyntheticBase', 'num', null],
   18226     [0, 'version', 'sid', null],
   18227     [1, 'Notice', 'sid', null],
   18228     [[12, 0], 'Copyright', 'sid', null],
   18229     [2, 'FullName', 'sid', null],
   18230     [3, 'FamilyName', 'sid', null],
   18231     [4, 'Weight', 'sid', null],
   18232     [[12, 1], 'isFixedPitch', 'num', 0],
   18233     [[12, 2], 'ItalicAngle', 'num', 0],
   18234     [[12, 3], 'UnderlinePosition', 'num', -100],
   18235     [[12, 4], 'UnderlineThickness', 'num', 50],
   18236     [[12, 5], 'PaintType', 'num', 0],
   18237     [[12, 6], 'CharstringType', 'num', 2],
   18238     [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
   18239                             [.001, 0, 0, .001, 0, 0]],
   18240     [13, 'UniqueID', 'num', null],
   18241     [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
   18242     [[12, 8], 'StrokeWidth', 'num', 0],
   18243     [14, 'XUID', 'array', null],
   18244     [15, 'charset', 'offset', 0],
   18245     [16, 'Encoding', 'offset', 0],
   18246     [17, 'CharStrings', 'offset', 0],
   18247     [18, 'Private', ['offset', 'offset'], null],
   18248     [[12, 21], 'PostScript', 'sid', null],
   18249     [[12, 22], 'BaseFontName', 'sid', null],
   18250     [[12, 23], 'BaseFontBlend', 'delta', null],
   18251     [[12, 31], 'CIDFontVersion', 'num', 0],
   18252     [[12, 32], 'CIDFontRevision', 'num', 0],
   18253     [[12, 33], 'CIDFontType', 'num', 0],
   18254     [[12, 34], 'CIDCount', 'num', 8720],
   18255     [[12, 35], 'UIDBase', 'num', null],
   18256     [[12, 36], 'FDArray', 'offset', null],
   18257     [[12, 37], 'FDSelect', 'offset', null],
   18258     [[12, 38], 'FontName', 'sid', null]];
   18259   var tables = null;
   18260   function CFFTopDict(strings) {
   18261     if (tables === null)
   18262       tables = CFFDict.createTables(layout);
   18263     CFFDict.call(this, tables, strings);
   18264     this.privateDict = null;
   18265   }
   18266   CFFTopDict.prototype = Object.create(CFFDict.prototype);
   18267   return CFFTopDict;
   18268 })();
   18269 
   18270 var CFFPrivateDict = (function CFFPrivateDictClosure() {
   18271   var layout = [
   18272     [6, 'BlueValues', 'delta', null],
   18273     [7, 'OtherBlues', 'delta', null],
   18274     [8, 'FamilyBlues', 'delta', null],
   18275     [9, 'FamilyOtherBlues', 'delta', null],
   18276     [[12, 9], 'BlueScale', 'num', 0.039625],
   18277     [[12, 10], 'BlueShift', 'num', 7],
   18278     [[12, 11], 'BlueFuzz', 'num', 1],
   18279     [10, 'StdHW', 'num', null],
   18280     [11, 'StdVW', 'num', null],
   18281     [[12, 12], 'StemSnapH', 'delta', null],
   18282     [[12, 13], 'StemSnapV', 'delta', null],
   18283     [[12, 14], 'ForceBold', 'num', 0],
   18284     [[12, 17], 'LanguageGroup', 'num', 0],
   18285     [[12, 18], 'ExpansionFactor', 'num', 0.06],
   18286     [[12, 19], 'initialRandomSeed', 'num', 0],
   18287     [19, 'Subrs', 'offset', null],
   18288     [20, 'defaultWidthX', 'num', 0],
   18289     [21, 'nominalWidthX', 'num', 0]
   18290   ];
   18291   var tables = null;
   18292   function CFFPrivateDict(strings) {
   18293     if (tables === null)
   18294       tables = CFFDict.createTables(layout);
   18295     CFFDict.call(this, tables, strings);
   18296     this.subrsIndex = null;
   18297   }
   18298   CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
   18299   return CFFPrivateDict;
   18300 })();
   18301 
   18302 var CFFCharsetPredefinedTypes = {
   18303   ISO_ADOBE: 0,
   18304   EXPERT: 1,
   18305   EXPERT_SUBSET: 2
   18306 };
   18307 var CFFCharsetEmbeddedTypes = {
   18308   FORMAT0: 0,
   18309   FORMAT1: 1,
   18310   FORMAT2: 2
   18311 };
   18312 var CFFCharset = (function CFFCharsetClosure() {
   18313   function CFFCharset(predefined, format, charset, raw) {
   18314     this.predefined = predefined;
   18315     this.format = format;
   18316     this.charset = charset;
   18317     this.raw = raw;
   18318   }
   18319   return CFFCharset;
   18320 })();
   18321 
   18322 var CFFEncodingPredefinedTypes = {
   18323   STANDARD: 0,
   18324   EXPERT: 1
   18325 };
   18326 var CFFCharsetEmbeddedTypes = {
   18327   FORMAT0: 0,
   18328   FORMAT1: 1
   18329 };
   18330 var CFFEncoding = (function CFFEncodingClosure() {
   18331   function CFFEncoding(predefined, format, encoding, raw) {
   18332     this.predefined = predefined;
   18333     this.format = format;
   18334     this.encoding = encoding;
   18335     this.raw = raw;
   18336   }
   18337   return CFFEncoding;
   18338 })();
   18339 
   18340 var CFFFDSelect = (function CFFFDSelectClosure() {
   18341   function CFFFDSelect(fdSelect, raw) {
   18342     this.fdSelect = fdSelect;
   18343     this.raw = raw;
   18344   }
   18345   return CFFFDSelect;
   18346 })();
   18347 
   18348 // Helper class to keep track of where an offset is within the data and helps
   18349 // filling in that offset once it's known.
   18350 var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
   18351   function CFFOffsetTracker() {
   18352     this.offsets = {};
   18353   }
   18354   CFFOffsetTracker.prototype = {
   18355     isTracking: function CFFOffsetTracker_isTracking(key) {
   18356       return key in this.offsets;
   18357     },
   18358     track: function CFFOffsetTracker_track(key, location) {
   18359       if (key in this.offsets)
   18360         error('Already tracking location of ' + key);
   18361       this.offsets[key] = location;
   18362     },
   18363     offset: function CFFOffsetTracker_offset(value) {
   18364       for (var key in this.offsets) {
   18365         this.offsets[key] += value;
   18366       }
   18367     },
   18368     setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
   18369                                                                  values,
   18370                                                                  output) {
   18371       if (!(key in this.offsets))
   18372         error('Not tracking location of ' + key);
   18373       var data = output.data;
   18374       var dataOffset = this.offsets[key];
   18375       var size = 5;
   18376       for (var i = 0, ii = values.length; i < ii; ++i) {
   18377         var offset0 = i * size + dataOffset;
   18378         var offset1 = offset0 + 1;
   18379         var offset2 = offset0 + 2;
   18380         var offset3 = offset0 + 3;
   18381         var offset4 = offset0 + 4;
   18382         // It's easy to screw up offsets so perform this sanity check.
   18383         if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
   18384             data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0)
   18385           error('writing to an offset that is not empty');
   18386         var value = values[i];
   18387         data[offset0] = 0x1d;
   18388         data[offset1] = (value >> 24) & 0xFF;
   18389         data[offset2] = (value >> 16) & 0xFF;
   18390         data[offset3] = (value >> 8) & 0xFF;
   18391         data[offset4] = value & 0xFF;
   18392       }
   18393     }
   18394   };
   18395   return CFFOffsetTracker;
   18396 })();
   18397 
   18398 // Takes a CFF and converts it to the binary representation.
   18399 var CFFCompiler = (function CFFCompilerClosure() {
   18400   function stringToArray(str) {
   18401     var array = [];
   18402     for (var i = 0, ii = str.length; i < ii; ++i)
   18403       array[i] = str.charCodeAt(i);
   18404 
   18405     return array;
   18406   };
   18407   function CFFCompiler(cff) {
   18408     this.cff = cff;
   18409   }
   18410   CFFCompiler.prototype = {
   18411     compile: function CFFCompiler_compile() {
   18412       var cff = this.cff;
   18413       var output = {
   18414         data: [],
   18415         length: 0,
   18416         add: function CFFCompiler_add(data) {
   18417           this.data = this.data.concat(data);
   18418           this.length = this.data.length;
   18419         }
   18420       };
   18421 
   18422       // Compile the five entries that must be in order.
   18423       var header = this.compileHeader(cff.header);
   18424       output.add(header);
   18425 
   18426       var nameIndex = this.compileNameIndex(cff.names);
   18427       output.add(nameIndex);
   18428 
   18429       var compiled = this.compileTopDicts([cff.topDict], output.length);
   18430       output.add(compiled.output);
   18431       var topDictTracker = compiled.trackers[0];
   18432 
   18433       var stringIndex = this.compileStringIndex(cff.strings.strings);
   18434       output.add(stringIndex);
   18435 
   18436       var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
   18437       output.add(globalSubrIndex);
   18438 
   18439       // Now start on the other entries that have no specfic order.
   18440       if (cff.encoding && cff.topDict.hasName('Encoding')) {
   18441         if (cff.encoding.predefined) {
   18442           topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
   18443                                           output);
   18444         } else {
   18445           var encoding = this.compileEncoding(cff.encoding);
   18446           topDictTracker.setEntryLocation('Encoding', [output.length], output);
   18447           output.add(encoding);
   18448         }
   18449       }
   18450 
   18451       if (cff.charset && cff.topDict.hasName('charset')) {
   18452         if (cff.charset.predefined) {
   18453           topDictTracker.setEntryLocation('charset', [cff.charset.format],
   18454                                           output);
   18455         } else {
   18456           var charset = this.compileCharset(cff.charset);
   18457           topDictTracker.setEntryLocation('charset', [output.length], output);
   18458           output.add(charset);
   18459         }
   18460       }
   18461 
   18462       var charStrings = this.compileCharStrings(cff.charStrings);
   18463       topDictTracker.setEntryLocation('CharStrings', [output.length], output);
   18464       output.add(charStrings);
   18465 
   18466       if (cff.isCIDFont) {
   18467         // For some reason FDSelect must be in front of FDArray on windows. OSX
   18468         // and linux don't seem to care.
   18469         topDictTracker.setEntryLocation('FDSelect', [output.length], output);
   18470         var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
   18471         output.add(fdSelect);
   18472 
   18473         var compiled = this.compileTopDicts(cff.fdArray, output.length);
   18474         topDictTracker.setEntryLocation('FDArray', [output.length], output);
   18475         output.add(compiled.output);
   18476         var fontDictTrackers = compiled.trackers;
   18477 
   18478         this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
   18479       }
   18480 
   18481       this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
   18482 
   18483       return output.data;
   18484     },
   18485     encodeNumber: function CFFCompiler_encodeNumber(value) {
   18486       if (parseFloat(value) == parseInt(value) && !isNaN(value)) // isInt
   18487         return this.encodeInteger(value);
   18488       else
   18489         return this.encodeFloat(value);
   18490     },
   18491     encodeFloat: function CFFCompiler_encodeFloat(value) {
   18492       value = value.toString();
   18493       // Strip off the any leading zeros.
   18494       if (value.substr(0, 2) === '0.')
   18495         value = value.substr(1);
   18496       else if (value.substr(0, 3) === '-0.')
   18497         value = '-' + value.substr(2);
   18498       var nibbles = [];
   18499       for (var i = 0, ii = value.length; i < ii; ++i) {
   18500         var a = value.charAt(i), b = value.charAt(i + 1);
   18501         var nibble;
   18502         if (a === 'e' && b === '-') {
   18503           nibble = 0xc;
   18504           ++i;
   18505         } else if (a === '.') {
   18506           nibble = 0xa;
   18507         } else if (a === 'E') {
   18508           nibble = 0xb;
   18509         } else if (a === '-') {
   18510           nibble = 0xe;
   18511         } else {
   18512           nibble = a;
   18513         }
   18514         nibbles.push(nibble);
   18515       }
   18516       nibbles.push(0xf);
   18517       if (nibbles.length % 2)
   18518         nibbles.push(0xf);
   18519       var out = [30];
   18520       for (var i = 0, ii = nibbles.length; i < ii; i += 2)
   18521         out.push(nibbles[i] << 4 | nibbles[i + 1]);
   18522       return out;
   18523     },
   18524     encodeInteger: function CFFCompiler_encodeInteger(value) {
   18525       var code;
   18526       if (value >= -107 && value <= 107) {
   18527         code = [value + 139];
   18528       } else if (value >= 108 && value <= 1131) {
   18529         value = [value - 108];
   18530         code = [(value >> 8) + 247, value & 0xFF];
   18531       } else if (value >= -1131 && value <= -108) {
   18532         value = -value - 108;
   18533         code = [(value >> 8) + 251, value & 0xFF];
   18534       } else if (value >= -32768 && value <= 32767) {
   18535         code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
   18536       } else {
   18537         code = [0x1d,
   18538                 (value >> 24) & 0xFF,
   18539                 (value >> 16) & 0xFF,
   18540                 (value >> 8) & 0xFF,
   18541                  value & 0xFF];
   18542       }
   18543       return code;
   18544     },
   18545     compileHeader: function CFFCompiler_compileHeader(header) {
   18546       return [
   18547         header.major,
   18548         header.minor,
   18549         header.hdrSize,
   18550         header.offSize
   18551       ];
   18552     },
   18553     compileNameIndex: function CFFCompiler_compileNameIndex(names) {
   18554       var nameIndex = new CFFIndex();
   18555       for (var i = 0, ii = names.length; i < ii; ++i)
   18556         nameIndex.add(stringToArray(names[i]));
   18557       return this.compileIndex(nameIndex);
   18558     },
   18559     compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length) {
   18560       var fontDictTrackers = [];
   18561       var fdArrayIndex = new CFFIndex();
   18562       for (var i = 0, ii = dicts.length; i < ii; ++i) {
   18563         var fontDict = dicts[i];
   18564         var fontDictTracker = new CFFOffsetTracker();
   18565         var fontDictData = this.compileDict(fontDict, fontDictTracker);
   18566         fontDictTrackers.push(fontDictTracker);
   18567         fdArrayIndex.add(fontDictData);
   18568         fontDictTracker.offset(length);
   18569       }
   18570       fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
   18571       return {
   18572         trackers: fontDictTrackers,
   18573         output: fdArrayIndex
   18574       };
   18575     },
   18576     compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
   18577                                                                   trackers,
   18578                                                                   output) {
   18579       for (var i = 0, ii = dicts.length; i < ii; ++i) {
   18580         var fontDict = dicts[i];
   18581         if (!fontDict.privateDict || !fontDict.hasName('Private'))
   18582           continue;
   18583         var privateDict = fontDict.privateDict;
   18584         var privateDictTracker = new CFFOffsetTracker();
   18585         var privateDictData = this.compileDict(privateDict, privateDictTracker);
   18586 
   18587         privateDictTracker.offset(output.length);
   18588         trackers[i].setEntryLocation('Private',
   18589                                      [privateDictData.length, output.length],
   18590                                      output);
   18591         output.add(privateDictData);
   18592 
   18593         if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
   18594           var subrs = this.compileIndex(privateDict.subrsIndex);
   18595           privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
   18596                                               output);
   18597           output.add(subrs);
   18598         }
   18599       }
   18600     },
   18601     compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
   18602       var out = [];
   18603       // The dictionary keys must be in a certain order.
   18604       var order = dict.order;
   18605       for (var i = 0; i < order.length; ++i) {
   18606         var key = order[i];
   18607         if (!(key in dict.values))
   18608           continue;
   18609         var values = dict.values[key];
   18610         var types = dict.types[key];
   18611         if (!isArray(types)) types = [types];
   18612         if (!isArray(values)) values = [values];
   18613 
   18614         // Remove any empty dict values.
   18615         if (values.length === 0)
   18616           continue;
   18617 
   18618         for (var j = 0, jj = types.length; j < jj; ++j) {
   18619           var type = types[j];
   18620           var value = values[j];
   18621           switch (type) {
   18622             case 'num':
   18623             case 'sid':
   18624               out = out.concat(this.encodeNumber(value));
   18625               break;
   18626             case 'offset':
   18627               // For offsets we just insert a 32bit integer so we don't have to
   18628               // deal with figuring out the length of the offset when it gets
   18629               // replaced later on by the compiler.
   18630               var name = dict.keyToNameMap[key];
   18631               // Some offsets have the offset and the length, so just record the
   18632               // position of the first one.
   18633               if (!offsetTracker.isTracking(name))
   18634                 offsetTracker.track(name, out.length);
   18635               out = out.concat([0x1d, 0, 0, 0, 0]);
   18636               break;
   18637             case 'array':
   18638             case 'delta':
   18639               out = out.concat(this.encodeNumber(value));
   18640               for (var k = 1, kk = values.length; k < kk; ++k)
   18641                 out = out.concat(this.encodeNumber(values[k]));
   18642               break;
   18643             default:
   18644               error('Unknown data type of ' + type);
   18645               break;
   18646           }
   18647         }
   18648         out = out.concat(dict.opcodes[key]);
   18649       }
   18650       return out;
   18651     },
   18652     compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
   18653       var stringIndex = new CFFIndex();
   18654       for (var i = 0, ii = strings.length; i < ii; ++i)
   18655         stringIndex.add(stringToArray(strings[i]));
   18656       return this.compileIndex(stringIndex);
   18657     },
   18658     compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
   18659       var globalSubrIndex = this.cff.globalSubrIndex;
   18660       this.out.writeByteArray(this.compileIndex(globalSubrIndex));
   18661     },
   18662     compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
   18663       return this.compileIndex(charStrings);
   18664     },
   18665     compileCharset: function CFFCompiler_compileCharset(charset) {
   18666       return this.compileTypedArray(charset.raw);
   18667     },
   18668     compileEncoding: function CFFCompiler_compileEncoding(encoding) {
   18669       return this.compileTypedArray(encoding.raw);
   18670     },
   18671     compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
   18672       return this.compileTypedArray(fdSelect);
   18673     },
   18674     compileTypedArray: function CFFCompiler_compileTypedArray(data) {
   18675       var out = [];
   18676       for (var i = 0, ii = data.length; i < ii; ++i)
   18677         out[i] = data[i];
   18678       return out;
   18679     },
   18680     compileIndex: function CFFCompiler_compileIndex(index, trackers) {
   18681       trackers = trackers || [];
   18682       var objects = index.objects;
   18683       // First 2 bytes contains the number of objects contained into this index
   18684       var count = objects.length;
   18685 
   18686       // If there is no object, just create an index. This technically
   18687       // should just be [0, 0] but OTS has an issue with that.
   18688       if (count == 0)
   18689         return [0, 0, 0];
   18690 
   18691       var data = [(count >> 8) & 0xFF, count & 0xff];
   18692 
   18693       var lastOffset = 1;
   18694       for (var i = 0; i < count; ++i)
   18695         lastOffset += objects[i].length;
   18696 
   18697       var offsetSize;
   18698       if (lastOffset < 0x100)
   18699         offsetSize = 1;
   18700       else if (lastOffset < 0x10000)
   18701         offsetSize = 2;
   18702       else if (lastOffset < 0x1000000)
   18703         offsetSize = 3;
   18704       else
   18705         offsetSize = 4;
   18706 
   18707       // Next byte contains the offset size use to reference object in the file
   18708       data.push(offsetSize);
   18709 
   18710       // Add another offset after this one because we need a new offset
   18711       var relativeOffset = 1;
   18712       for (var i = 0; i < count + 1; i++) {
   18713         if (offsetSize === 1) {
   18714           data.push(relativeOffset & 0xFF);
   18715         } else if (offsetSize === 2) {
   18716           data.push((relativeOffset >> 8) & 0xFF,
   18717                      relativeOffset & 0xFF);
   18718         } else if (offsetSize === 3) {
   18719           data.push((relativeOffset >> 16) & 0xFF,
   18720                     (relativeOffset >> 8) & 0xFF,
   18721                      relativeOffset & 0xFF);
   18722         } else {
   18723           data.push((relativeOffset >>> 24) & 0xFF,
   18724                     (relativeOffset >> 16) & 0xFF,
   18725                     (relativeOffset >> 8) & 0xFF,
   18726                      relativeOffset & 0xFF);
   18727         }
   18728 
   18729         if (objects[i])
   18730           relativeOffset += objects[i].length;
   18731       }
   18732       var offset = data.length;
   18733 
   18734       for (var i = 0; i < count; i++) {
   18735         // Notify the tracker where the object will be offset in the data.
   18736         if (trackers[i])
   18737           trackers[i].offset(data.length);
   18738         for (var j = 0, jj = objects[i].length; j < jj; j++)
   18739           data.push(objects[i][j]);
   18740       }
   18741       return data;
   18742     }
   18743   };
   18744   return CFFCompiler;
   18745 })();
   18746 
   18747 
   18748 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   18749 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   18750 
   18751 'use strict';
   18752 
   18753 var GlyphsUnicode = {
   18754   A: 0x0041,
   18755   AE: 0x00C6,
   18756   AEacute: 0x01FC,
   18757   AEmacron: 0x01E2,
   18758   AEsmall: 0xF7E6,
   18759   Aacute: 0x00C1,
   18760   Aacutesmall: 0xF7E1,
   18761   Abreve: 0x0102,
   18762   Abreveacute: 0x1EAE,
   18763   Abrevecyrillic: 0x04D0,
   18764   Abrevedotbelow: 0x1EB6,
   18765   Abrevegrave: 0x1EB0,
   18766   Abrevehookabove: 0x1EB2,
   18767   Abrevetilde: 0x1EB4,
   18768   Acaron: 0x01CD,
   18769   Acircle: 0x24B6,
   18770   Acircumflex: 0x00C2,
   18771   Acircumflexacute: 0x1EA4,
   18772   Acircumflexdotbelow: 0x1EAC,
   18773   Acircumflexgrave: 0x1EA6,
   18774   Acircumflexhookabove: 0x1EA8,
   18775   Acircumflexsmall: 0xF7E2,
   18776   Acircumflextilde: 0x1EAA,
   18777   Acute: 0xF6C9,
   18778   Acutesmall: 0xF7B4,
   18779   Acyrillic: 0x0410,
   18780   Adblgrave: 0x0200,
   18781   Adieresis: 0x00C4,
   18782   Adieresiscyrillic: 0x04D2,
   18783   Adieresismacron: 0x01DE,
   18784   Adieresissmall: 0xF7E4,
   18785   Adotbelow: 0x1EA0,
   18786   Adotmacron: 0x01E0,
   18787   Agrave: 0x00C0,
   18788   Agravesmall: 0xF7E0,
   18789   Ahookabove: 0x1EA2,
   18790   Aiecyrillic: 0x04D4,
   18791   Ainvertedbreve: 0x0202,
   18792   Alpha: 0x0391,
   18793   Alphatonos: 0x0386,
   18794   Amacron: 0x0100,
   18795   Amonospace: 0xFF21,
   18796   Aogonek: 0x0104,
   18797   Aring: 0x00C5,
   18798   Aringacute: 0x01FA,
   18799   Aringbelow: 0x1E00,
   18800   Aringsmall: 0xF7E5,
   18801   Asmall: 0xF761,
   18802   Atilde: 0x00C3,
   18803   Atildesmall: 0xF7E3,
   18804   Aybarmenian: 0x0531,
   18805   B: 0x0042,
   18806   Bcircle: 0x24B7,
   18807   Bdotaccent: 0x1E02,
   18808   Bdotbelow: 0x1E04,
   18809   Becyrillic: 0x0411,
   18810   Benarmenian: 0x0532,
   18811   Beta: 0x0392,
   18812   Bhook: 0x0181,
   18813   Blinebelow: 0x1E06,
   18814   Bmonospace: 0xFF22,
   18815   Brevesmall: 0xF6F4,
   18816   Bsmall: 0xF762,
   18817   Btopbar: 0x0182,
   18818   C: 0x0043,
   18819   Caarmenian: 0x053E,
   18820   Cacute: 0x0106,
   18821   Caron: 0xF6CA,
   18822   Caronsmall: 0xF6F5,
   18823   Ccaron: 0x010C,
   18824   Ccedilla: 0x00C7,
   18825   Ccedillaacute: 0x1E08,
   18826   Ccedillasmall: 0xF7E7,
   18827   Ccircle: 0x24B8,
   18828   Ccircumflex: 0x0108,
   18829   Cdot: 0x010A,
   18830   Cdotaccent: 0x010A,
   18831   Cedillasmall: 0xF7B8,
   18832   Chaarmenian: 0x0549,
   18833   Cheabkhasiancyrillic: 0x04BC,
   18834   Checyrillic: 0x0427,
   18835   Chedescenderabkhasiancyrillic: 0x04BE,
   18836   Chedescendercyrillic: 0x04B6,
   18837   Chedieresiscyrillic: 0x04F4,
   18838   Cheharmenian: 0x0543,
   18839   Chekhakassiancyrillic: 0x04CB,
   18840   Cheverticalstrokecyrillic: 0x04B8,
   18841   Chi: 0x03A7,
   18842   Chook: 0x0187,
   18843   Circumflexsmall: 0xF6F6,
   18844   Cmonospace: 0xFF23,
   18845   Coarmenian: 0x0551,
   18846   Csmall: 0xF763,
   18847   D: 0x0044,
   18848   DZ: 0x01F1,
   18849   DZcaron: 0x01C4,
   18850   Daarmenian: 0x0534,
   18851   Dafrican: 0x0189,
   18852   Dcaron: 0x010E,
   18853   Dcedilla: 0x1E10,
   18854   Dcircle: 0x24B9,
   18855   Dcircumflexbelow: 0x1E12,
   18856   Dcroat: 0x0110,
   18857   Ddotaccent: 0x1E0A,
   18858   Ddotbelow: 0x1E0C,
   18859   Decyrillic: 0x0414,
   18860   Deicoptic: 0x03EE,
   18861   Delta: 0x2206,
   18862   Deltagreek: 0x0394,
   18863   Dhook: 0x018A,
   18864   Dieresis: 0xF6CB,
   18865   DieresisAcute: 0xF6CC,
   18866   DieresisGrave: 0xF6CD,
   18867   Dieresissmall: 0xF7A8,
   18868   Digammagreek: 0x03DC,
   18869   Djecyrillic: 0x0402,
   18870   Dlinebelow: 0x1E0E,
   18871   Dmonospace: 0xFF24,
   18872   Dotaccentsmall: 0xF6F7,
   18873   Dslash: 0x0110,
   18874   Dsmall: 0xF764,
   18875   Dtopbar: 0x018B,
   18876   Dz: 0x01F2,
   18877   Dzcaron: 0x01C5,
   18878   Dzeabkhasiancyrillic: 0x04E0,
   18879   Dzecyrillic: 0x0405,
   18880   Dzhecyrillic: 0x040F,
   18881   E: 0x0045,
   18882   Eacute: 0x00C9,
   18883   Eacutesmall: 0xF7E9,
   18884   Ebreve: 0x0114,
   18885   Ecaron: 0x011A,
   18886   Ecedillabreve: 0x1E1C,
   18887   Echarmenian: 0x0535,
   18888   Ecircle: 0x24BA,
   18889   Ecircumflex: 0x00CA,
   18890   Ecircumflexacute: 0x1EBE,
   18891   Ecircumflexbelow: 0x1E18,
   18892   Ecircumflexdotbelow: 0x1EC6,
   18893   Ecircumflexgrave: 0x1EC0,
   18894   Ecircumflexhookabove: 0x1EC2,
   18895   Ecircumflexsmall: 0xF7EA,
   18896   Ecircumflextilde: 0x1EC4,
   18897   Ecyrillic: 0x0404,
   18898   Edblgrave: 0x0204,
   18899   Edieresis: 0x00CB,
   18900   Edieresissmall: 0xF7EB,
   18901   Edot: 0x0116,
   18902   Edotaccent: 0x0116,
   18903   Edotbelow: 0x1EB8,
   18904   Efcyrillic: 0x0424,
   18905   Egrave: 0x00C8,
   18906   Egravesmall: 0xF7E8,
   18907   Eharmenian: 0x0537,
   18908   Ehookabove: 0x1EBA,
   18909   Eightroman: 0x2167,
   18910   Einvertedbreve: 0x0206,
   18911   Eiotifiedcyrillic: 0x0464,
   18912   Elcyrillic: 0x041B,
   18913   Elevenroman: 0x216A,
   18914   Emacron: 0x0112,
   18915   Emacronacute: 0x1E16,
   18916   Emacrongrave: 0x1E14,
   18917   Emcyrillic: 0x041C,
   18918   Emonospace: 0xFF25,
   18919   Encyrillic: 0x041D,
   18920   Endescendercyrillic: 0x04A2,
   18921   Eng: 0x014A,
   18922   Enghecyrillic: 0x04A4,
   18923   Enhookcyrillic: 0x04C7,
   18924   Eogonek: 0x0118,
   18925   Eopen: 0x0190,
   18926   Epsilon: 0x0395,
   18927   Epsilontonos: 0x0388,
   18928   Ercyrillic: 0x0420,
   18929   Ereversed: 0x018E,
   18930   Ereversedcyrillic: 0x042D,
   18931   Escyrillic: 0x0421,
   18932   Esdescendercyrillic: 0x04AA,
   18933   Esh: 0x01A9,
   18934   Esmall: 0xF765,
   18935   Eta: 0x0397,
   18936   Etarmenian: 0x0538,
   18937   Etatonos: 0x0389,
   18938   Eth: 0x00D0,
   18939   Ethsmall: 0xF7F0,
   18940   Etilde: 0x1EBC,
   18941   Etildebelow: 0x1E1A,
   18942   Euro: 0x20AC,
   18943   Ezh: 0x01B7,
   18944   Ezhcaron: 0x01EE,
   18945   Ezhreversed: 0x01B8,
   18946   F: 0x0046,
   18947   Fcircle: 0x24BB,
   18948   Fdotaccent: 0x1E1E,
   18949   Feharmenian: 0x0556,
   18950   Feicoptic: 0x03E4,
   18951   Fhook: 0x0191,
   18952   Fitacyrillic: 0x0472,
   18953   Fiveroman: 0x2164,
   18954   Fmonospace: 0xFF26,
   18955   Fourroman: 0x2163,
   18956   Fsmall: 0xF766,
   18957   G: 0x0047,
   18958   GBsquare: 0x3387,
   18959   Gacute: 0x01F4,
   18960   Gamma: 0x0393,
   18961   Gammaafrican: 0x0194,
   18962   Gangiacoptic: 0x03EA,
   18963   Gbreve: 0x011E,
   18964   Gcaron: 0x01E6,
   18965   Gcedilla: 0x0122,
   18966   Gcircle: 0x24BC,
   18967   Gcircumflex: 0x011C,
   18968   Gcommaaccent: 0x0122,
   18969   Gdot: 0x0120,
   18970   Gdotaccent: 0x0120,
   18971   Gecyrillic: 0x0413,
   18972   Ghadarmenian: 0x0542,
   18973   Ghemiddlehookcyrillic: 0x0494,
   18974   Ghestrokecyrillic: 0x0492,
   18975   Gheupturncyrillic: 0x0490,
   18976   Ghook: 0x0193,
   18977   Gimarmenian: 0x0533,
   18978   Gjecyrillic: 0x0403,
   18979   Gmacron: 0x1E20,
   18980   Gmonospace: 0xFF27,
   18981   Grave: 0xF6CE,
   18982   Gravesmall: 0xF760,
   18983   Gsmall: 0xF767,
   18984   Gsmallhook: 0x029B,
   18985   Gstroke: 0x01E4,
   18986   H: 0x0048,
   18987   H18533: 0x25CF,
   18988   H18543: 0x25AA,
   18989   H18551: 0x25AB,
   18990   H22073: 0x25A1,
   18991   HPsquare: 0x33CB,
   18992   Haabkhasiancyrillic: 0x04A8,
   18993   Hadescendercyrillic: 0x04B2,
   18994   Hardsigncyrillic: 0x042A,
   18995   Hbar: 0x0126,
   18996   Hbrevebelow: 0x1E2A,
   18997   Hcedilla: 0x1E28,
   18998   Hcircle: 0x24BD,
   18999   Hcircumflex: 0x0124,
   19000   Hdieresis: 0x1E26,
   19001   Hdotaccent: 0x1E22,
   19002   Hdotbelow: 0x1E24,
   19003   Hmonospace: 0xFF28,
   19004   Hoarmenian: 0x0540,
   19005   Horicoptic: 0x03E8,
   19006   Hsmall: 0xF768,
   19007   Hungarumlaut: 0xF6CF,
   19008   Hungarumlautsmall: 0xF6F8,
   19009   Hzsquare: 0x3390,
   19010   I: 0x0049,
   19011   IAcyrillic: 0x042F,
   19012   IJ: 0x0132,
   19013   IUcyrillic: 0x042E,
   19014   Iacute: 0x00CD,
   19015   Iacutesmall: 0xF7ED,
   19016   Ibreve: 0x012C,
   19017   Icaron: 0x01CF,
   19018   Icircle: 0x24BE,
   19019   Icircumflex: 0x00CE,
   19020   Icircumflexsmall: 0xF7EE,
   19021   Icyrillic: 0x0406,
   19022   Idblgrave: 0x0208,
   19023   Idieresis: 0x00CF,
   19024   Idieresisacute: 0x1E2E,
   19025   Idieresiscyrillic: 0x04E4,
   19026   Idieresissmall: 0xF7EF,
   19027   Idot: 0x0130,
   19028   Idotaccent: 0x0130,
   19029   Idotbelow: 0x1ECA,
   19030   Iebrevecyrillic: 0x04D6,
   19031   Iecyrillic: 0x0415,
   19032   Ifraktur: 0x2111,
   19033   Igrave: 0x00CC,
   19034   Igravesmall: 0xF7EC,
   19035   Ihookabove: 0x1EC8,
   19036   Iicyrillic: 0x0418,
   19037   Iinvertedbreve: 0x020A,
   19038   Iishortcyrillic: 0x0419,
   19039   Imacron: 0x012A,
   19040   Imacroncyrillic: 0x04E2,
   19041   Imonospace: 0xFF29,
   19042   Iniarmenian: 0x053B,
   19043   Iocyrillic: 0x0401,
   19044   Iogonek: 0x012E,
   19045   Iota: 0x0399,
   19046   Iotaafrican: 0x0196,
   19047   Iotadieresis: 0x03AA,
   19048   Iotatonos: 0x038A,
   19049   Ismall: 0xF769,
   19050   Istroke: 0x0197,
   19051   Itilde: 0x0128,
   19052   Itildebelow: 0x1E2C,
   19053   Izhitsacyrillic: 0x0474,
   19054   Izhitsadblgravecyrillic: 0x0476,
   19055   J: 0x004A,
   19056   Jaarmenian: 0x0541,
   19057   Jcircle: 0x24BF,
   19058   Jcircumflex: 0x0134,
   19059   Jecyrillic: 0x0408,
   19060   Jheharmenian: 0x054B,
   19061   Jmonospace: 0xFF2A,
   19062   Jsmall: 0xF76A,
   19063   K: 0x004B,
   19064   KBsquare: 0x3385,
   19065   KKsquare: 0x33CD,
   19066   Kabashkircyrillic: 0x04A0,
   19067   Kacute: 0x1E30,
   19068   Kacyrillic: 0x041A,
   19069   Kadescendercyrillic: 0x049A,
   19070   Kahookcyrillic: 0x04C3,
   19071   Kappa: 0x039A,
   19072   Kastrokecyrillic: 0x049E,
   19073   Kaverticalstrokecyrillic: 0x049C,
   19074   Kcaron: 0x01E8,
   19075   Kcedilla: 0x0136,
   19076   Kcircle: 0x24C0,
   19077   Kcommaaccent: 0x0136,
   19078   Kdotbelow: 0x1E32,
   19079   Keharmenian: 0x0554,
   19080   Kenarmenian: 0x053F,
   19081   Khacyrillic: 0x0425,
   19082   Kheicoptic: 0x03E6,
   19083   Khook: 0x0198,
   19084   Kjecyrillic: 0x040C,
   19085   Klinebelow: 0x1E34,
   19086   Kmonospace: 0xFF2B,
   19087   Koppacyrillic: 0x0480,
   19088   Koppagreek: 0x03DE,
   19089   Ksicyrillic: 0x046E,
   19090   Ksmall: 0xF76B,
   19091   L: 0x004C,
   19092   LJ: 0x01C7,
   19093   LL: 0xF6BF,
   19094   Lacute: 0x0139,
   19095   Lambda: 0x039B,
   19096   Lcaron: 0x013D,
   19097   Lcedilla: 0x013B,
   19098   Lcircle: 0x24C1,
   19099   Lcircumflexbelow: 0x1E3C,
   19100   Lcommaaccent: 0x013B,
   19101   Ldot: 0x013F,
   19102   Ldotaccent: 0x013F,
   19103   Ldotbelow: 0x1E36,
   19104   Ldotbelowmacron: 0x1E38,
   19105   Liwnarmenian: 0x053C,
   19106   Lj: 0x01C8,
   19107   Ljecyrillic: 0x0409,
   19108   Llinebelow: 0x1E3A,
   19109   Lmonospace: 0xFF2C,
   19110   Lslash: 0x0141,
   19111   Lslashsmall: 0xF6F9,
   19112   Lsmall: 0xF76C,
   19113   M: 0x004D,
   19114   MBsquare: 0x3386,
   19115   Macron: 0xF6D0,
   19116   Macronsmall: 0xF7AF,
   19117   Macute: 0x1E3E,
   19118   Mcircle: 0x24C2,
   19119   Mdotaccent: 0x1E40,
   19120   Mdotbelow: 0x1E42,
   19121   Menarmenian: 0x0544,
   19122   Mmonospace: 0xFF2D,
   19123   Msmall: 0xF76D,
   19124   Mturned: 0x019C,
   19125   Mu: 0x039C,
   19126   N: 0x004E,
   19127   NJ: 0x01CA,
   19128   Nacute: 0x0143,
   19129   Ncaron: 0x0147,
   19130   Ncedilla: 0x0145,
   19131   Ncircle: 0x24C3,
   19132   Ncircumflexbelow: 0x1E4A,
   19133   Ncommaaccent: 0x0145,
   19134   Ndotaccent: 0x1E44,
   19135   Ndotbelow: 0x1E46,
   19136   Nhookleft: 0x019D,
   19137   Nineroman: 0x2168,
   19138   Nj: 0x01CB,
   19139   Njecyrillic: 0x040A,
   19140   Nlinebelow: 0x1E48,
   19141   Nmonospace: 0xFF2E,
   19142   Nowarmenian: 0x0546,
   19143   Nsmall: 0xF76E,
   19144   Ntilde: 0x00D1,
   19145   Ntildesmall: 0xF7F1,
   19146   Nu: 0x039D,
   19147   O: 0x004F,
   19148   OE: 0x0152,
   19149   OEsmall: 0xF6FA,
   19150   Oacute: 0x00D3,
   19151   Oacutesmall: 0xF7F3,
   19152   Obarredcyrillic: 0x04E8,
   19153   Obarreddieresiscyrillic: 0x04EA,
   19154   Obreve: 0x014E,
   19155   Ocaron: 0x01D1,
   19156   Ocenteredtilde: 0x019F,
   19157   Ocircle: 0x24C4,
   19158   Ocircumflex: 0x00D4,
   19159   Ocircumflexacute: 0x1ED0,
   19160   Ocircumflexdotbelow: 0x1ED8,
   19161   Ocircumflexgrave: 0x1ED2,
   19162   Ocircumflexhookabove: 0x1ED4,
   19163   Ocircumflexsmall: 0xF7F4,
   19164   Ocircumflextilde: 0x1ED6,
   19165   Ocyrillic: 0x041E,
   19166   Odblacute: 0x0150,
   19167   Odblgrave: 0x020C,
   19168   Odieresis: 0x00D6,
   19169   Odieresiscyrillic: 0x04E6,
   19170   Odieresissmall: 0xF7F6,
   19171   Odotbelow: 0x1ECC,
   19172   Ogoneksmall: 0xF6FB,
   19173   Ograve: 0x00D2,
   19174   Ogravesmall: 0xF7F2,
   19175   Oharmenian: 0x0555,
   19176   Ohm: 0x2126,
   19177   Ohookabove: 0x1ECE,
   19178   Ohorn: 0x01A0,
   19179   Ohornacute: 0x1EDA,
   19180   Ohorndotbelow: 0x1EE2,
   19181   Ohorngrave: 0x1EDC,
   19182   Ohornhookabove: 0x1EDE,
   19183   Ohorntilde: 0x1EE0,
   19184   Ohungarumlaut: 0x0150,
   19185   Oi: 0x01A2,
   19186   Oinvertedbreve: 0x020E,
   19187   Omacron: 0x014C,
   19188   Omacronacute: 0x1E52,
   19189   Omacrongrave: 0x1E50,
   19190   Omega: 0x2126,
   19191   Omegacyrillic: 0x0460,
   19192   Omegagreek: 0x03A9,
   19193   Omegaroundcyrillic: 0x047A,
   19194   Omegatitlocyrillic: 0x047C,
   19195   Omegatonos: 0x038F,
   19196   Omicron: 0x039F,
   19197   Omicrontonos: 0x038C,
   19198   Omonospace: 0xFF2F,
   19199   Oneroman: 0x2160,
   19200   Oogonek: 0x01EA,
   19201   Oogonekmacron: 0x01EC,
   19202   Oopen: 0x0186,
   19203   Oslash: 0x00D8,
   19204   Oslashacute: 0x01FE,
   19205   Oslashsmall: 0xF7F8,
   19206   Osmall: 0xF76F,
   19207   Ostrokeacute: 0x01FE,
   19208   Otcyrillic: 0x047E,
   19209   Otilde: 0x00D5,
   19210   Otildeacute: 0x1E4C,
   19211   Otildedieresis: 0x1E4E,
   19212   Otildesmall: 0xF7F5,
   19213   P: 0x0050,
   19214   Pacute: 0x1E54,
   19215   Pcircle: 0x24C5,
   19216   Pdotaccent: 0x1E56,
   19217   Pecyrillic: 0x041F,
   19218   Peharmenian: 0x054A,
   19219   Pemiddlehookcyrillic: 0x04A6,
   19220   Phi: 0x03A6,
   19221   Phook: 0x01A4,
   19222   Pi: 0x03A0,
   19223   Piwrarmenian: 0x0553,
   19224   Pmonospace: 0xFF30,
   19225   Psi: 0x03A8,
   19226   Psicyrillic: 0x0470,
   19227   Psmall: 0xF770,
   19228   Q: 0x0051,
   19229   Qcircle: 0x24C6,
   19230   Qmonospace: 0xFF31,
   19231   Qsmall: 0xF771,
   19232   R: 0x0052,
   19233   Raarmenian: 0x054C,
   19234   Racute: 0x0154,
   19235   Rcaron: 0x0158,
   19236   Rcedilla: 0x0156,
   19237   Rcircle: 0x24C7,
   19238   Rcommaaccent: 0x0156,
   19239   Rdblgrave: 0x0210,
   19240   Rdotaccent: 0x1E58,
   19241   Rdotbelow: 0x1E5A,
   19242   Rdotbelowmacron: 0x1E5C,
   19243   Reharmenian: 0x0550,
   19244   Rfraktur: 0x211C,
   19245   Rho: 0x03A1,
   19246   Ringsmall: 0xF6FC,
   19247   Rinvertedbreve: 0x0212,
   19248   Rlinebelow: 0x1E5E,
   19249   Rmonospace: 0xFF32,
   19250   Rsmall: 0xF772,
   19251   Rsmallinverted: 0x0281,
   19252   Rsmallinvertedsuperior: 0x02B6,
   19253   S: 0x0053,
   19254   SF010000: 0x250C,
   19255   SF020000: 0x2514,
   19256   SF030000: 0x2510,
   19257   SF040000: 0x2518,
   19258   SF050000: 0x253C,
   19259   SF060000: 0x252C,
   19260   SF070000: 0x2534,
   19261   SF080000: 0x251C,
   19262   SF090000: 0x2524,
   19263   SF100000: 0x2500,
   19264   SF110000: 0x2502,
   19265   SF190000: 0x2561,
   19266   SF200000: 0x2562,
   19267   SF210000: 0x2556,
   19268   SF220000: 0x2555,
   19269   SF230000: 0x2563,
   19270   SF240000: 0x2551,
   19271   SF250000: 0x2557,
   19272   SF260000: 0x255D,
   19273   SF270000: 0x255C,
   19274   SF280000: 0x255B,
   19275   SF360000: 0x255E,
   19276   SF370000: 0x255F,
   19277   SF380000: 0x255A,
   19278   SF390000: 0x2554,
   19279   SF400000: 0x2569,
   19280   SF410000: 0x2566,
   19281   SF420000: 0x2560,
   19282   SF430000: 0x2550,
   19283   SF440000: 0x256C,
   19284   SF450000: 0x2567,
   19285   SF460000: 0x2568,
   19286   SF470000: 0x2564,
   19287   SF480000: 0x2565,
   19288   SF490000: 0x2559,
   19289   SF500000: 0x2558,
   19290   SF510000: 0x2552,
   19291   SF520000: 0x2553,
   19292   SF530000: 0x256B,
   19293   SF540000: 0x256A,
   19294   Sacute: 0x015A,
   19295   Sacutedotaccent: 0x1E64,
   19296   Sampigreek: 0x03E0,
   19297   Scaron: 0x0160,
   19298   Scarondotaccent: 0x1E66,
   19299   Scaronsmall: 0xF6FD,
   19300   Scedilla: 0x015E,
   19301   Schwa: 0x018F,
   19302   Schwacyrillic: 0x04D8,
   19303   Schwadieresiscyrillic: 0x04DA,
   19304   Scircle: 0x24C8,
   19305   Scircumflex: 0x015C,
   19306   Scommaaccent: 0x0218,
   19307   Sdotaccent: 0x1E60,
   19308   Sdotbelow: 0x1E62,
   19309   Sdotbelowdotaccent: 0x1E68,
   19310   Seharmenian: 0x054D,
   19311   Sevenroman: 0x2166,
   19312   Shaarmenian: 0x0547,
   19313   Shacyrillic: 0x0428,
   19314   Shchacyrillic: 0x0429,
   19315   Sheicoptic: 0x03E2,
   19316   Shhacyrillic: 0x04BA,
   19317   Shimacoptic: 0x03EC,
   19318   Sigma: 0x03A3,
   19319   Sixroman: 0x2165,
   19320   Smonospace: 0xFF33,
   19321   Softsigncyrillic: 0x042C,
   19322   Ssmall: 0xF773,
   19323   Stigmagreek: 0x03DA,
   19324   T: 0x0054,
   19325   Tau: 0x03A4,
   19326   Tbar: 0x0166,
   19327   Tcaron: 0x0164,
   19328   Tcedilla: 0x0162,
   19329   Tcircle: 0x24C9,
   19330   Tcircumflexbelow: 0x1E70,
   19331   Tcommaaccent: 0x0162,
   19332   Tdotaccent: 0x1E6A,
   19333   Tdotbelow: 0x1E6C,
   19334   Tecyrillic: 0x0422,
   19335   Tedescendercyrillic: 0x04AC,
   19336   Tenroman: 0x2169,
   19337   Tetsecyrillic: 0x04B4,
   19338   Theta: 0x0398,
   19339   Thook: 0x01AC,
   19340   Thorn: 0x00DE,
   19341   Thornsmall: 0xF7FE,
   19342   Threeroman: 0x2162,
   19343   Tildesmall: 0xF6FE,
   19344   Tiwnarmenian: 0x054F,
   19345   Tlinebelow: 0x1E6E,
   19346   Tmonospace: 0xFF34,
   19347   Toarmenian: 0x0539,
   19348   Tonefive: 0x01BC,
   19349   Tonesix: 0x0184,
   19350   Tonetwo: 0x01A7,
   19351   Tretroflexhook: 0x01AE,
   19352   Tsecyrillic: 0x0426,
   19353   Tshecyrillic: 0x040B,
   19354   Tsmall: 0xF774,
   19355   Twelveroman: 0x216B,
   19356   Tworoman: 0x2161,
   19357   U: 0x0055,
   19358   Uacute: 0x00DA,
   19359   Uacutesmall: 0xF7FA,
   19360   Ubreve: 0x016C,
   19361   Ucaron: 0x01D3,
   19362   Ucircle: 0x24CA,
   19363   Ucircumflex: 0x00DB,
   19364   Ucircumflexbelow: 0x1E76,
   19365   Ucircumflexsmall: 0xF7FB,
   19366   Ucyrillic: 0x0423,
   19367   Udblacute: 0x0170,
   19368   Udblgrave: 0x0214,
   19369   Udieresis: 0x00DC,
   19370   Udieresisacute: 0x01D7,
   19371   Udieresisbelow: 0x1E72,
   19372   Udieresiscaron: 0x01D9,
   19373   Udieresiscyrillic: 0x04F0,
   19374   Udieresisgrave: 0x01DB,
   19375   Udieresismacron: 0x01D5,
   19376   Udieresissmall: 0xF7FC,
   19377   Udotbelow: 0x1EE4,
   19378   Ugrave: 0x00D9,
   19379   Ugravesmall: 0xF7F9,
   19380   Uhookabove: 0x1EE6,
   19381   Uhorn: 0x01AF,
   19382   Uhornacute: 0x1EE8,
   19383   Uhorndotbelow: 0x1EF0,
   19384   Uhorngrave: 0x1EEA,
   19385   Uhornhookabove: 0x1EEC,
   19386   Uhorntilde: 0x1EEE,
   19387   Uhungarumlaut: 0x0170,
   19388   Uhungarumlautcyrillic: 0x04F2,
   19389   Uinvertedbreve: 0x0216,
   19390   Ukcyrillic: 0x0478,
   19391   Umacron: 0x016A,
   19392   Umacroncyrillic: 0x04EE,
   19393   Umacrondieresis: 0x1E7A,
   19394   Umonospace: 0xFF35,
   19395   Uogonek: 0x0172,
   19396   Upsilon: 0x03A5,
   19397   Upsilon1: 0x03D2,
   19398   Upsilonacutehooksymbolgreek: 0x03D3,
   19399   Upsilonafrican: 0x01B1,
   19400   Upsilondieresis: 0x03AB,
   19401   Upsilondieresishooksymbolgreek: 0x03D4,
   19402   Upsilonhooksymbol: 0x03D2,
   19403   Upsilontonos: 0x038E,
   19404   Uring: 0x016E,
   19405   Ushortcyrillic: 0x040E,
   19406   Usmall: 0xF775,
   19407   Ustraightcyrillic: 0x04AE,
   19408   Ustraightstrokecyrillic: 0x04B0,
   19409   Utilde: 0x0168,
   19410   Utildeacute: 0x1E78,
   19411   Utildebelow: 0x1E74,
   19412   V: 0x0056,
   19413   Vcircle: 0x24CB,
   19414   Vdotbelow: 0x1E7E,
   19415   Vecyrillic: 0x0412,
   19416   Vewarmenian: 0x054E,
   19417   Vhook: 0x01B2,
   19418   Vmonospace: 0xFF36,
   19419   Voarmenian: 0x0548,
   19420   Vsmall: 0xF776,
   19421   Vtilde: 0x1E7C,
   19422   W: 0x0057,
   19423   Wacute: 0x1E82,
   19424   Wcircle: 0x24CC,
   19425   Wcircumflex: 0x0174,
   19426   Wdieresis: 0x1E84,
   19427   Wdotaccent: 0x1E86,
   19428   Wdotbelow: 0x1E88,
   19429   Wgrave: 0x1E80,
   19430   Wmonospace: 0xFF37,
   19431   Wsmall: 0xF777,
   19432   X: 0x0058,
   19433   Xcircle: 0x24CD,
   19434   Xdieresis: 0x1E8C,
   19435   Xdotaccent: 0x1E8A,
   19436   Xeharmenian: 0x053D,
   19437   Xi: 0x039E,
   19438   Xmonospace: 0xFF38,
   19439   Xsmall: 0xF778,
   19440   Y: 0x0059,
   19441   Yacute: 0x00DD,
   19442   Yacutesmall: 0xF7FD,
   19443   Yatcyrillic: 0x0462,
   19444   Ycircle: 0x24CE,
   19445   Ycircumflex: 0x0176,
   19446   Ydieresis: 0x0178,
   19447   Ydieresissmall: 0xF7FF,
   19448   Ydotaccent: 0x1E8E,
   19449   Ydotbelow: 0x1EF4,
   19450   Yericyrillic: 0x042B,
   19451   Yerudieresiscyrillic: 0x04F8,
   19452   Ygrave: 0x1EF2,
   19453   Yhook: 0x01B3,
   19454   Yhookabove: 0x1EF6,
   19455   Yiarmenian: 0x0545,
   19456   Yicyrillic: 0x0407,
   19457   Yiwnarmenian: 0x0552,
   19458   Ymonospace: 0xFF39,
   19459   Ysmall: 0xF779,
   19460   Ytilde: 0x1EF8,
   19461   Yusbigcyrillic: 0x046A,
   19462   Yusbigiotifiedcyrillic: 0x046C,
   19463   Yuslittlecyrillic: 0x0466,
   19464   Yuslittleiotifiedcyrillic: 0x0468,
   19465   Z: 0x005A,
   19466   Zaarmenian: 0x0536,
   19467   Zacute: 0x0179,
   19468   Zcaron: 0x017D,
   19469   Zcaronsmall: 0xF6FF,
   19470   Zcircle: 0x24CF,
   19471   Zcircumflex: 0x1E90,
   19472   Zdot: 0x017B,
   19473   Zdotaccent: 0x017B,
   19474   Zdotbelow: 0x1E92,
   19475   Zecyrillic: 0x0417,
   19476   Zedescendercyrillic: 0x0498,
   19477   Zedieresiscyrillic: 0x04DE,
   19478   Zeta: 0x0396,
   19479   Zhearmenian: 0x053A,
   19480   Zhebrevecyrillic: 0x04C1,
   19481   Zhecyrillic: 0x0416,
   19482   Zhedescendercyrillic: 0x0496,
   19483   Zhedieresiscyrillic: 0x04DC,
   19484   Zlinebelow: 0x1E94,
   19485   Zmonospace: 0xFF3A,
   19486   Zsmall: 0xF77A,
   19487   Zstroke: 0x01B5,
   19488   a: 0x0061,
   19489   aabengali: 0x0986,
   19490   aacute: 0x00E1,
   19491   aadeva: 0x0906,
   19492   aagujarati: 0x0A86,
   19493   aagurmukhi: 0x0A06,
   19494   aamatragurmukhi: 0x0A3E,
   19495   aarusquare: 0x3303,
   19496   aavowelsignbengali: 0x09BE,
   19497   aavowelsigndeva: 0x093E,
   19498   aavowelsigngujarati: 0x0ABE,
   19499   abbreviationmarkarmenian: 0x055F,
   19500   abbreviationsigndeva: 0x0970,
   19501   abengali: 0x0985,
   19502   abopomofo: 0x311A,
   19503   abreve: 0x0103,
   19504   abreveacute: 0x1EAF,
   19505   abrevecyrillic: 0x04D1,
   19506   abrevedotbelow: 0x1EB7,
   19507   abrevegrave: 0x1EB1,
   19508   abrevehookabove: 0x1EB3,
   19509   abrevetilde: 0x1EB5,
   19510   acaron: 0x01CE,
   19511   acircle: 0x24D0,
   19512   acircumflex: 0x00E2,
   19513   acircumflexacute: 0x1EA5,
   19514   acircumflexdotbelow: 0x1EAD,
   19515   acircumflexgrave: 0x1EA7,
   19516   acircumflexhookabove: 0x1EA9,
   19517   acircumflextilde: 0x1EAB,
   19518   acute: 0x00B4,
   19519   acutebelowcmb: 0x0317,
   19520   acutecmb: 0x0301,
   19521   acutecomb: 0x0301,
   19522   acutedeva: 0x0954,
   19523   acutelowmod: 0x02CF,
   19524   acutetonecmb: 0x0341,
   19525   acyrillic: 0x0430,
   19526   adblgrave: 0x0201,
   19527   addakgurmukhi: 0x0A71,
   19528   adeva: 0x0905,
   19529   adieresis: 0x00E4,
   19530   adieresiscyrillic: 0x04D3,
   19531   adieresismacron: 0x01DF,
   19532   adotbelow: 0x1EA1,
   19533   adotmacron: 0x01E1,
   19534   ae: 0x00E6,
   19535   aeacute: 0x01FD,
   19536   aekorean: 0x3150,
   19537   aemacron: 0x01E3,
   19538   afii00208: 0x2015,
   19539   afii08941: 0x20A4,
   19540   afii10017: 0x0410,
   19541   afii10018: 0x0411,
   19542   afii10019: 0x0412,
   19543   afii10020: 0x0413,
   19544   afii10021: 0x0414,
   19545   afii10022: 0x0415,
   19546   afii10023: 0x0401,
   19547   afii10024: 0x0416,
   19548   afii10025: 0x0417,
   19549   afii10026: 0x0418,
   19550   afii10027: 0x0419,
   19551   afii10028: 0x041A,
   19552   afii10029: 0x041B,
   19553   afii10030: 0x041C,
   19554   afii10031: 0x041D,
   19555   afii10032: 0x041E,
   19556   afii10033: 0x041F,
   19557   afii10034: 0x0420,
   19558   afii10035: 0x0421,
   19559   afii10036: 0x0422,
   19560   afii10037: 0x0423,
   19561   afii10038: 0x0424,
   19562   afii10039: 0x0425,
   19563   afii10040: 0x0426,
   19564   afii10041: 0x0427,
   19565   afii10042: 0x0428,
   19566   afii10043: 0x0429,
   19567   afii10044: 0x042A,
   19568   afii10045: 0x042B,
   19569   afii10046: 0x042C,
   19570   afii10047: 0x042D,
   19571   afii10048: 0x042E,
   19572   afii10049: 0x042F,
   19573   afii10050: 0x0490,
   19574   afii10051: 0x0402,
   19575   afii10052: 0x0403,
   19576   afii10053: 0x0404,
   19577   afii10054: 0x0405,
   19578   afii10055: 0x0406,
   19579   afii10056: 0x0407,
   19580   afii10057: 0x0408,
   19581   afii10058: 0x0409,
   19582   afii10059: 0x040A,
   19583   afii10060: 0x040B,
   19584   afii10061: 0x040C,
   19585   afii10062: 0x040E,
   19586   afii10063: 0xF6C4,
   19587   afii10064: 0xF6C5,
   19588   afii10065: 0x0430,
   19589   afii10066: 0x0431,
   19590   afii10067: 0x0432,
   19591   afii10068: 0x0433,
   19592   afii10069: 0x0434,
   19593   afii10070: 0x0435,
   19594   afii10071: 0x0451,
   19595   afii10072: 0x0436,
   19596   afii10073: 0x0437,
   19597   afii10074: 0x0438,
   19598   afii10075: 0x0439,
   19599   afii10076: 0x043A,
   19600   afii10077: 0x043B,
   19601   afii10078: 0x043C,
   19602   afii10079: 0x043D,
   19603   afii10080: 0x043E,
   19604   afii10081: 0x043F,
   19605   afii10082: 0x0440,
   19606   afii10083: 0x0441,
   19607   afii10084: 0x0442,
   19608   afii10085: 0x0443,
   19609   afii10086: 0x0444,
   19610   afii10087: 0x0445,
   19611   afii10088: 0x0446,
   19612   afii10089: 0x0447,
   19613   afii10090: 0x0448,
   19614   afii10091: 0x0449,
   19615   afii10092: 0x044A,
   19616   afii10093: 0x044B,
   19617   afii10094: 0x044C,
   19618   afii10095: 0x044D,
   19619   afii10096: 0x044E,
   19620   afii10097: 0x044F,
   19621   afii10098: 0x0491,
   19622   afii10099: 0x0452,
   19623   afii10100: 0x0453,
   19624   afii10101: 0x0454,
   19625   afii10102: 0x0455,
   19626   afii10103: 0x0456,
   19627   afii10104: 0x0457,
   19628   afii10105: 0x0458,
   19629   afii10106: 0x0459,
   19630   afii10107: 0x045A,
   19631   afii10108: 0x045B,
   19632   afii10109: 0x045C,
   19633   afii10110: 0x045E,
   19634   afii10145: 0x040F,
   19635   afii10146: 0x0462,
   19636   afii10147: 0x0472,
   19637   afii10148: 0x0474,
   19638   afii10192: 0xF6C6,
   19639   afii10193: 0x045F,
   19640   afii10194: 0x0463,
   19641   afii10195: 0x0473,
   19642   afii10196: 0x0475,
   19643   afii10831: 0xF6C7,
   19644   afii10832: 0xF6C8,
   19645   afii10846: 0x04D9,
   19646   afii299: 0x200E,
   19647   afii300: 0x200F,
   19648   afii301: 0x200D,
   19649   afii57381: 0x066A,
   19650   afii57388: 0x060C,
   19651   afii57392: 0x0660,
   19652   afii57393: 0x0661,
   19653   afii57394: 0x0662,
   19654   afii57395: 0x0663,
   19655   afii57396: 0x0664,
   19656   afii57397: 0x0665,
   19657   afii57398: 0x0666,
   19658   afii57399: 0x0667,
   19659   afii57400: 0x0668,
   19660   afii57401: 0x0669,
   19661   afii57403: 0x061B,
   19662   afii57407: 0x061F,
   19663   afii57409: 0x0621,
   19664   afii57410: 0x0622,
   19665   afii57411: 0x0623,
   19666   afii57412: 0x0624,
   19667   afii57413: 0x0625,
   19668   afii57414: 0x0626,
   19669   afii57415: 0x0627,
   19670   afii57416: 0x0628,
   19671   afii57417: 0x0629,
   19672   afii57418: 0x062A,
   19673   afii57419: 0x062B,
   19674   afii57420: 0x062C,
   19675   afii57421: 0x062D,
   19676   afii57422: 0x062E,
   19677   afii57423: 0x062F,
   19678   afii57424: 0x0630,
   19679   afii57425: 0x0631,
   19680   afii57426: 0x0632,
   19681   afii57427: 0x0633,
   19682   afii57428: 0x0634,
   19683   afii57429: 0x0635,
   19684   afii57430: 0x0636,
   19685   afii57431: 0x0637,
   19686   afii57432: 0x0638,
   19687   afii57433: 0x0639,
   19688   afii57434: 0x063A,
   19689   afii57440: 0x0640,
   19690   afii57441: 0x0641,
   19691   afii57442: 0x0642,
   19692   afii57443: 0x0643,
   19693   afii57444: 0x0644,
   19694   afii57445: 0x0645,
   19695   afii57446: 0x0646,
   19696   afii57448: 0x0648,
   19697   afii57449: 0x0649,
   19698   afii57450: 0x064A,
   19699   afii57451: 0x064B,
   19700   afii57452: 0x064C,
   19701   afii57453: 0x064D,
   19702   afii57454: 0x064E,
   19703   afii57455: 0x064F,
   19704   afii57456: 0x0650,
   19705   afii57457: 0x0651,
   19706   afii57458: 0x0652,
   19707   afii57470: 0x0647,
   19708   afii57505: 0x06A4,
   19709   afii57506: 0x067E,
   19710   afii57507: 0x0686,
   19711   afii57508: 0x0698,
   19712   afii57509: 0x06AF,
   19713   afii57511: 0x0679,
   19714   afii57512: 0x0688,
   19715   afii57513: 0x0691,
   19716   afii57514: 0x06BA,
   19717   afii57519: 0x06D2,
   19718   afii57534: 0x06D5,
   19719   afii57636: 0x20AA,
   19720   afii57645: 0x05BE,
   19721   afii57658: 0x05C3,
   19722   afii57664: 0x05D0,
   19723   afii57665: 0x05D1,
   19724   afii57666: 0x05D2,
   19725   afii57667: 0x05D3,
   19726   afii57668: 0x05D4,
   19727   afii57669: 0x05D5,
   19728   afii57670: 0x05D6,
   19729   afii57671: 0x05D7,
   19730   afii57672: 0x05D8,
   19731   afii57673: 0x05D9,
   19732   afii57674: 0x05DA,
   19733   afii57675: 0x05DB,
   19734   afii57676: 0x05DC,
   19735   afii57677: 0x05DD,
   19736   afii57678: 0x05DE,
   19737   afii57679: 0x05DF,
   19738   afii57680: 0x05E0,
   19739   afii57681: 0x05E1,
   19740   afii57682: 0x05E2,
   19741   afii57683: 0x05E3,
   19742   afii57684: 0x05E4,
   19743   afii57685: 0x05E5,
   19744   afii57686: 0x05E6,
   19745   afii57687: 0x05E7,
   19746   afii57688: 0x05E8,
   19747   afii57689: 0x05E9,
   19748   afii57690: 0x05EA,
   19749   afii57694: 0xFB2A,
   19750   afii57695: 0xFB2B,
   19751   afii57700: 0xFB4B,
   19752   afii57705: 0xFB1F,
   19753   afii57716: 0x05F0,
   19754   afii57717: 0x05F1,
   19755   afii57718: 0x05F2,
   19756   afii57723: 0xFB35,
   19757   afii57793: 0x05B4,
   19758   afii57794: 0x05B5,
   19759   afii57795: 0x05B6,
   19760   afii57796: 0x05BB,
   19761   afii57797: 0x05B8,
   19762   afii57798: 0x05B7,
   19763   afii57799: 0x05B0,
   19764   afii57800: 0x05B2,
   19765   afii57801: 0x05B1,
   19766   afii57802: 0x05B3,
   19767   afii57803: 0x05C2,
   19768   afii57804: 0x05C1,
   19769   afii57806: 0x05B9,
   19770   afii57807: 0x05BC,
   19771   afii57839: 0x05BD,
   19772   afii57841: 0x05BF,
   19773   afii57842: 0x05C0,
   19774   afii57929: 0x02BC,
   19775   afii61248: 0x2105,
   19776   afii61289: 0x2113,
   19777   afii61352: 0x2116,
   19778   afii61573: 0x202C,
   19779   afii61574: 0x202D,
   19780   afii61575: 0x202E,
   19781   afii61664: 0x200C,
   19782   afii63167: 0x066D,
   19783   afii64937: 0x02BD,
   19784   agrave: 0x00E0,
   19785   agujarati: 0x0A85,
   19786   agurmukhi: 0x0A05,
   19787   ahiragana: 0x3042,
   19788   ahookabove: 0x1EA3,
   19789   aibengali: 0x0990,
   19790   aibopomofo: 0x311E,
   19791   aideva: 0x0910,
   19792   aiecyrillic: 0x04D5,
   19793   aigujarati: 0x0A90,
   19794   aigurmukhi: 0x0A10,
   19795   aimatragurmukhi: 0x0A48,
   19796   ainarabic: 0x0639,
   19797   ainfinalarabic: 0xFECA,
   19798   aininitialarabic: 0xFECB,
   19799   ainmedialarabic: 0xFECC,
   19800   ainvertedbreve: 0x0203,
   19801   aivowelsignbengali: 0x09C8,
   19802   aivowelsigndeva: 0x0948,
   19803   aivowelsigngujarati: 0x0AC8,
   19804   akatakana: 0x30A2,
   19805   akatakanahalfwidth: 0xFF71,
   19806   akorean: 0x314F,
   19807   alef: 0x05D0,
   19808   alefarabic: 0x0627,
   19809   alefdageshhebrew: 0xFB30,
   19810   aleffinalarabic: 0xFE8E,
   19811   alefhamzaabovearabic: 0x0623,
   19812   alefhamzaabovefinalarabic: 0xFE84,
   19813   alefhamzabelowarabic: 0x0625,
   19814   alefhamzabelowfinalarabic: 0xFE88,
   19815   alefhebrew: 0x05D0,
   19816   aleflamedhebrew: 0xFB4F,
   19817   alefmaddaabovearabic: 0x0622,
   19818   alefmaddaabovefinalarabic: 0xFE82,
   19819   alefmaksuraarabic: 0x0649,
   19820   alefmaksurafinalarabic: 0xFEF0,
   19821   alefmaksurainitialarabic: 0xFEF3,
   19822   alefmaksuramedialarabic: 0xFEF4,
   19823   alefpatahhebrew: 0xFB2E,
   19824   alefqamatshebrew: 0xFB2F,
   19825   aleph: 0x2135,
   19826   allequal: 0x224C,
   19827   alpha: 0x03B1,
   19828   alphatonos: 0x03AC,
   19829   amacron: 0x0101,
   19830   amonospace: 0xFF41,
   19831   ampersand: 0x0026,
   19832   ampersandmonospace: 0xFF06,
   19833   ampersandsmall: 0xF726,
   19834   amsquare: 0x33C2,
   19835   anbopomofo: 0x3122,
   19836   angbopomofo: 0x3124,
   19837   angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
   19838   angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
   19839   angkhankhuthai: 0x0E5A,
   19840   angle: 0x2220,
   19841   anglebracketleft: 0x3008,
   19842   anglebracketleftvertical: 0xFE3F,
   19843   anglebracketright: 0x3009,
   19844   anglebracketrightvertical: 0xFE40,
   19845   angleleft: 0x2329,
   19846   angleright: 0x232A,
   19847   angstrom: 0x212B,
   19848   anoteleia: 0x0387,
   19849   anudattadeva: 0x0952,
   19850   anusvarabengali: 0x0982,
   19851   anusvaradeva: 0x0902,
   19852   anusvaragujarati: 0x0A82,
   19853   aogonek: 0x0105,
   19854   apaatosquare: 0x3300,
   19855   aparen: 0x249C,
   19856   apostrophearmenian: 0x055A,
   19857   apostrophemod: 0x02BC,
   19858   apple: 0xF8FF,
   19859   approaches: 0x2250,
   19860   approxequal: 0x2248,
   19861   approxequalorimage: 0x2252,
   19862   approximatelyequal: 0x2245,
   19863   araeaekorean: 0x318E,
   19864   araeakorean: 0x318D,
   19865   arc: 0x2312,
   19866   arighthalfring: 0x1E9A,
   19867   aring: 0x00E5,
   19868   aringacute: 0x01FB,
   19869   aringbelow: 0x1E01,
   19870   arrowboth: 0x2194,
   19871   arrowdashdown: 0x21E3,
   19872   arrowdashleft: 0x21E0,
   19873   arrowdashright: 0x21E2,
   19874   arrowdashup: 0x21E1,
   19875   arrowdblboth: 0x21D4,
   19876   arrowdbldown: 0x21D3,
   19877   arrowdblleft: 0x21D0,
   19878   arrowdblright: 0x21D2,
   19879   arrowdblup: 0x21D1,
   19880   arrowdown: 0x2193,
   19881   arrowdownleft: 0x2199,
   19882   arrowdownright: 0x2198,
   19883   arrowdownwhite: 0x21E9,
   19884   arrowheaddownmod: 0x02C5,
   19885   arrowheadleftmod: 0x02C2,
   19886   arrowheadrightmod: 0x02C3,
   19887   arrowheadupmod: 0x02C4,
   19888   arrowhorizex: 0xF8E7,
   19889   arrowleft: 0x2190,
   19890   arrowleftdbl: 0x21D0,
   19891   arrowleftdblstroke: 0x21CD,
   19892   arrowleftoverright: 0x21C6,
   19893   arrowleftwhite: 0x21E6,
   19894   arrowright: 0x2192,
   19895   arrowrightdblstroke: 0x21CF,
   19896   arrowrightheavy: 0x279E,
   19897   arrowrightoverleft: 0x21C4,
   19898   arrowrightwhite: 0x21E8,
   19899   arrowtableft: 0x21E4,
   19900   arrowtabright: 0x21E5,
   19901   arrowup: 0x2191,
   19902   arrowupdn: 0x2195,
   19903   arrowupdnbse: 0x21A8,
   19904   arrowupdownbase: 0x21A8,
   19905   arrowupleft: 0x2196,
   19906   arrowupleftofdown: 0x21C5,
   19907   arrowupright: 0x2197,
   19908   arrowupwhite: 0x21E7,
   19909   arrowvertex: 0xF8E6,
   19910   asciicircum: 0x005E,
   19911   asciicircummonospace: 0xFF3E,
   19912   asciitilde: 0x007E,
   19913   asciitildemonospace: 0xFF5E,
   19914   ascript: 0x0251,
   19915   ascriptturned: 0x0252,
   19916   asmallhiragana: 0x3041,
   19917   asmallkatakana: 0x30A1,
   19918   asmallkatakanahalfwidth: 0xFF67,
   19919   asterisk: 0x002A,
   19920   asteriskaltonearabic: 0x066D,
   19921   asteriskarabic: 0x066D,
   19922   asteriskmath: 0x2217,
   19923   asteriskmonospace: 0xFF0A,
   19924   asterisksmall: 0xFE61,
   19925   asterism: 0x2042,
   19926   asuperior: 0xF6E9,
   19927   asymptoticallyequal: 0x2243,
   19928   at: 0x0040,
   19929   atilde: 0x00E3,
   19930   atmonospace: 0xFF20,
   19931   atsmall: 0xFE6B,
   19932   aturned: 0x0250,
   19933   aubengali: 0x0994,
   19934   aubopomofo: 0x3120,
   19935   audeva: 0x0914,
   19936   augujarati: 0x0A94,
   19937   augurmukhi: 0x0A14,
   19938   aulengthmarkbengali: 0x09D7,
   19939   aumatragurmukhi: 0x0A4C,
   19940   auvowelsignbengali: 0x09CC,
   19941   auvowelsigndeva: 0x094C,
   19942   auvowelsigngujarati: 0x0ACC,
   19943   avagrahadeva: 0x093D,
   19944   aybarmenian: 0x0561,
   19945   ayin: 0x05E2,
   19946   ayinaltonehebrew: 0xFB20,
   19947   ayinhebrew: 0x05E2,
   19948   b: 0x0062,
   19949   babengali: 0x09AC,
   19950   backslash: 0x005C,
   19951   backslashmonospace: 0xFF3C,
   19952   badeva: 0x092C,
   19953   bagujarati: 0x0AAC,
   19954   bagurmukhi: 0x0A2C,
   19955   bahiragana: 0x3070,
   19956   bahtthai: 0x0E3F,
   19957   bakatakana: 0x30D0,
   19958   bar: 0x007C,
   19959   barmonospace: 0xFF5C,
   19960   bbopomofo: 0x3105,
   19961   bcircle: 0x24D1,
   19962   bdotaccent: 0x1E03,
   19963   bdotbelow: 0x1E05,
   19964   beamedsixteenthnotes: 0x266C,
   19965   because: 0x2235,
   19966   becyrillic: 0x0431,
   19967   beharabic: 0x0628,
   19968   behfinalarabic: 0xFE90,
   19969   behinitialarabic: 0xFE91,
   19970   behiragana: 0x3079,
   19971   behmedialarabic: 0xFE92,
   19972   behmeeminitialarabic: 0xFC9F,
   19973   behmeemisolatedarabic: 0xFC08,
   19974   behnoonfinalarabic: 0xFC6D,
   19975   bekatakana: 0x30D9,
   19976   benarmenian: 0x0562,
   19977   bet: 0x05D1,
   19978   beta: 0x03B2,
   19979   betasymbolgreek: 0x03D0,
   19980   betdagesh: 0xFB31,
   19981   betdageshhebrew: 0xFB31,
   19982   bethebrew: 0x05D1,
   19983   betrafehebrew: 0xFB4C,
   19984   bhabengali: 0x09AD,
   19985   bhadeva: 0x092D,
   19986   bhagujarati: 0x0AAD,
   19987   bhagurmukhi: 0x0A2D,
   19988   bhook: 0x0253,
   19989   bihiragana: 0x3073,
   19990   bikatakana: 0x30D3,
   19991   bilabialclick: 0x0298,
   19992   bindigurmukhi: 0x0A02,
   19993   birusquare: 0x3331,
   19994   blackcircle: 0x25CF,
   19995   blackdiamond: 0x25C6,
   19996   blackdownpointingtriangle: 0x25BC,
   19997   blackleftpointingpointer: 0x25C4,
   19998   blackleftpointingtriangle: 0x25C0,
   19999   blacklenticularbracketleft: 0x3010,
   20000   blacklenticularbracketleftvertical: 0xFE3B,
   20001   blacklenticularbracketright: 0x3011,
   20002   blacklenticularbracketrightvertical: 0xFE3C,
   20003   blacklowerlefttriangle: 0x25E3,
   20004   blacklowerrighttriangle: 0x25E2,
   20005   blackrectangle: 0x25AC,
   20006   blackrightpointingpointer: 0x25BA,
   20007   blackrightpointingtriangle: 0x25B6,
   20008   blacksmallsquare: 0x25AA,
   20009   blacksmilingface: 0x263B,
   20010   blacksquare: 0x25A0,
   20011   blackstar: 0x2605,
   20012   blackupperlefttriangle: 0x25E4,
   20013   blackupperrighttriangle: 0x25E5,
   20014   blackuppointingsmalltriangle: 0x25B4,
   20015   blackuppointingtriangle: 0x25B2,
   20016   blank: 0x2423,
   20017   blinebelow: 0x1E07,
   20018   block: 0x2588,
   20019   bmonospace: 0xFF42,
   20020   bobaimaithai: 0x0E1A,
   20021   bohiragana: 0x307C,
   20022   bokatakana: 0x30DC,
   20023   bparen: 0x249D,
   20024   bqsquare: 0x33C3,
   20025   braceex: 0xF8F4,
   20026   braceleft: 0x007B,
   20027   braceleftbt: 0xF8F3,
   20028   braceleftmid: 0xF8F2,
   20029   braceleftmonospace: 0xFF5B,
   20030   braceleftsmall: 0xFE5B,
   20031   bracelefttp: 0xF8F1,
   20032   braceleftvertical: 0xFE37,
   20033   braceright: 0x007D,
   20034   bracerightbt: 0xF8FE,
   20035   bracerightmid: 0xF8FD,
   20036   bracerightmonospace: 0xFF5D,
   20037   bracerightsmall: 0xFE5C,
   20038   bracerighttp: 0xF8FC,
   20039   bracerightvertical: 0xFE38,
   20040   bracketleft: 0x005B,
   20041   bracketleftbt: 0xF8F0,
   20042   bracketleftex: 0xF8EF,
   20043   bracketleftmonospace: 0xFF3B,
   20044   bracketlefttp: 0xF8EE,
   20045   bracketright: 0x005D,
   20046   bracketrightbt: 0xF8FB,
   20047   bracketrightex: 0xF8FA,
   20048   bracketrightmonospace: 0xFF3D,
   20049   bracketrighttp: 0xF8F9,
   20050   breve: 0x02D8,
   20051   brevebelowcmb: 0x032E,
   20052   brevecmb: 0x0306,
   20053   breveinvertedbelowcmb: 0x032F,
   20054   breveinvertedcmb: 0x0311,
   20055   breveinverteddoublecmb: 0x0361,
   20056   bridgebelowcmb: 0x032A,
   20057   bridgeinvertedbelowcmb: 0x033A,
   20058   brokenbar: 0x00A6,
   20059   bstroke: 0x0180,
   20060   bsuperior: 0xF6EA,
   20061   btopbar: 0x0183,
   20062   buhiragana: 0x3076,
   20063   bukatakana: 0x30D6,
   20064   bullet: 0x2022,
   20065   bulletinverse: 0x25D8,
   20066   bulletoperator: 0x2219,
   20067   bullseye: 0x25CE,
   20068   c: 0x0063,
   20069   caarmenian: 0x056E,
   20070   cabengali: 0x099A,
   20071   cacute: 0x0107,
   20072   cadeva: 0x091A,
   20073   cagujarati: 0x0A9A,
   20074   cagurmukhi: 0x0A1A,
   20075   calsquare: 0x3388,
   20076   candrabindubengali: 0x0981,
   20077   candrabinducmb: 0x0310,
   20078   candrabindudeva: 0x0901,
   20079   candrabindugujarati: 0x0A81,
   20080   capslock: 0x21EA,
   20081   careof: 0x2105,
   20082   caron: 0x02C7,
   20083   caronbelowcmb: 0x032C,
   20084   caroncmb: 0x030C,
   20085   carriagereturn: 0x21B5,
   20086   cbopomofo: 0x3118,
   20087   ccaron: 0x010D,
   20088   ccedilla: 0x00E7,
   20089   ccedillaacute: 0x1E09,
   20090   ccircle: 0x24D2,
   20091   ccircumflex: 0x0109,
   20092   ccurl: 0x0255,
   20093   cdot: 0x010B,
   20094   cdotaccent: 0x010B,
   20095   cdsquare: 0x33C5,
   20096   cedilla: 0x00B8,
   20097   cedillacmb: 0x0327,
   20098   cent: 0x00A2,
   20099   centigrade: 0x2103,
   20100   centinferior: 0xF6DF,
   20101   centmonospace: 0xFFE0,
   20102   centoldstyle: 0xF7A2,
   20103   centsuperior: 0xF6E0,
   20104   chaarmenian: 0x0579,
   20105   chabengali: 0x099B,
   20106   chadeva: 0x091B,
   20107   chagujarati: 0x0A9B,
   20108   chagurmukhi: 0x0A1B,
   20109   chbopomofo: 0x3114,
   20110   cheabkhasiancyrillic: 0x04BD,
   20111   checkmark: 0x2713,
   20112   checyrillic: 0x0447,
   20113   chedescenderabkhasiancyrillic: 0x04BF,
   20114   chedescendercyrillic: 0x04B7,
   20115   chedieresiscyrillic: 0x04F5,
   20116   cheharmenian: 0x0573,
   20117   chekhakassiancyrillic: 0x04CC,
   20118   cheverticalstrokecyrillic: 0x04B9,
   20119   chi: 0x03C7,
   20120   chieuchacirclekorean: 0x3277,
   20121   chieuchaparenkorean: 0x3217,
   20122   chieuchcirclekorean: 0x3269,
   20123   chieuchkorean: 0x314A,
   20124   chieuchparenkorean: 0x3209,
   20125   chochangthai: 0x0E0A,
   20126   chochanthai: 0x0E08,
   20127   chochingthai: 0x0E09,
   20128   chochoethai: 0x0E0C,
   20129   chook: 0x0188,
   20130   cieucacirclekorean: 0x3276,
   20131   cieucaparenkorean: 0x3216,
   20132   cieuccirclekorean: 0x3268,
   20133   cieuckorean: 0x3148,
   20134   cieucparenkorean: 0x3208,
   20135   cieucuparenkorean: 0x321C,
   20136   circle: 0x25CB,
   20137   circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
   20138   circlemultiply: 0x2297,
   20139   circleot: 0x2299,
   20140   circleplus: 0x2295,
   20141   circlepostalmark: 0x3036,
   20142   circlewithlefthalfblack: 0x25D0,
   20143   circlewithrighthalfblack: 0x25D1,
   20144   circumflex: 0x02C6,
   20145   circumflexbelowcmb: 0x032D,
   20146   circumflexcmb: 0x0302,
   20147   clear: 0x2327,
   20148   clickalveolar: 0x01C2,
   20149   clickdental: 0x01C0,
   20150   clicklateral: 0x01C1,
   20151   clickretroflex: 0x01C3,
   20152   club: 0x2663,
   20153   clubsuitblack: 0x2663,
   20154   clubsuitwhite: 0x2667,
   20155   cmcubedsquare: 0x33A4,
   20156   cmonospace: 0xFF43,
   20157   cmsquaredsquare: 0x33A0,
   20158   coarmenian: 0x0581,
   20159   colon: 0x003A,
   20160   colonmonetary: 0x20A1,
   20161   colonmonospace: 0xFF1A,
   20162   colonsign: 0x20A1,
   20163   colonsmall: 0xFE55,
   20164   colontriangularhalfmod: 0x02D1,
   20165   colontriangularmod: 0x02D0,
   20166   comma: 0x002C,
   20167   commaabovecmb: 0x0313,
   20168   commaaboverightcmb: 0x0315,
   20169   commaaccent: 0xF6C3,
   20170   commaarabic: 0x060C,
   20171   commaarmenian: 0x055D,
   20172   commainferior: 0xF6E1,
   20173   commamonospace: 0xFF0C,
   20174   commareversedabovecmb: 0x0314,
   20175   commareversedmod: 0x02BD,
   20176   commasmall: 0xFE50,
   20177   commasuperior: 0xF6E2,
   20178   commaturnedabovecmb: 0x0312,
   20179   commaturnedmod: 0x02BB,
   20180   compass: 0x263C,
   20181   congruent: 0x2245,
   20182   contourintegral: 0x222E,
   20183   control: 0x2303,
   20184   controlACK: 0x0006,
   20185   controlBEL: 0x0007,
   20186   controlBS: 0x0008,
   20187   controlCAN: 0x0018,
   20188   controlCR: 0x000D,
   20189   controlDC1: 0x0011,
   20190   controlDC2: 0x0012,
   20191   controlDC3: 0x0013,
   20192   controlDC4: 0x0014,
   20193   controlDEL: 0x007F,
   20194   controlDLE: 0x0010,
   20195   controlEM: 0x0019,
   20196   controlENQ: 0x0005,
   20197   controlEOT: 0x0004,
   20198   controlESC: 0x001B,
   20199   controlETB: 0x0017,
   20200   controlETX: 0x0003,
   20201   controlFF: 0x000C,
   20202   controlFS: 0x001C,
   20203   controlGS: 0x001D,
   20204   controlHT: 0x0009,
   20205   controlLF: 0x000A,
   20206   controlNAK: 0x0015,
   20207   controlRS: 0x001E,
   20208   controlSI: 0x000F,
   20209   controlSO: 0x000E,
   20210   controlSOT: 0x0002,
   20211   controlSTX: 0x0001,
   20212   controlSUB: 0x001A,
   20213   controlSYN: 0x0016,
   20214   controlUS: 0x001F,
   20215   controlVT: 0x000B,
   20216   copyright: 0x00A9,
   20217   copyrightsans: 0xF8E9,
   20218   copyrightserif: 0xF6D9,
   20219   cornerbracketleft: 0x300C,
   20220   cornerbracketlefthalfwidth: 0xFF62,
   20221   cornerbracketleftvertical: 0xFE41,
   20222   cornerbracketright: 0x300D,
   20223   cornerbracketrighthalfwidth: 0xFF63,
   20224   cornerbracketrightvertical: 0xFE42,
   20225   corporationsquare: 0x337F,
   20226   cosquare: 0x33C7,
   20227   coverkgsquare: 0x33C6,
   20228   cparen: 0x249E,
   20229   cruzeiro: 0x20A2,
   20230   cstretched: 0x0297,
   20231   curlyand: 0x22CF,
   20232   curlyor: 0x22CE,
   20233   currency: 0x00A4,
   20234   cyrBreve: 0xF6D1,
   20235   cyrFlex: 0xF6D2,
   20236   cyrbreve: 0xF6D4,
   20237   cyrflex: 0xF6D5,
   20238   d: 0x0064,
   20239   daarmenian: 0x0564,
   20240   dabengali: 0x09A6,
   20241   dadarabic: 0x0636,
   20242   dadeva: 0x0926,
   20243   dadfinalarabic: 0xFEBE,
   20244   dadinitialarabic: 0xFEBF,
   20245   dadmedialarabic: 0xFEC0,
   20246   dagesh: 0x05BC,
   20247   dageshhebrew: 0x05BC,
   20248   dagger: 0x2020,
   20249   daggerdbl: 0x2021,
   20250   dagujarati: 0x0AA6,
   20251   dagurmukhi: 0x0A26,
   20252   dahiragana: 0x3060,
   20253   dakatakana: 0x30C0,
   20254   dalarabic: 0x062F,
   20255   dalet: 0x05D3,
   20256   daletdagesh: 0xFB33,
   20257   daletdageshhebrew: 0xFB33,
   20258   dalethebrew: 0x05D3,
   20259   dalfinalarabic: 0xFEAA,
   20260   dammaarabic: 0x064F,
   20261   dammalowarabic: 0x064F,
   20262   dammatanaltonearabic: 0x064C,
   20263   dammatanarabic: 0x064C,
   20264   danda: 0x0964,
   20265   dargahebrew: 0x05A7,
   20266   dargalefthebrew: 0x05A7,
   20267   dasiapneumatacyrilliccmb: 0x0485,
   20268   dblGrave: 0xF6D3,
   20269   dblanglebracketleft: 0x300A,
   20270   dblanglebracketleftvertical: 0xFE3D,
   20271   dblanglebracketright: 0x300B,
   20272   dblanglebracketrightvertical: 0xFE3E,
   20273   dblarchinvertedbelowcmb: 0x032B,
   20274   dblarrowleft: 0x21D4,
   20275   dblarrowright: 0x21D2,
   20276   dbldanda: 0x0965,
   20277   dblgrave: 0xF6D6,
   20278   dblgravecmb: 0x030F,
   20279   dblintegral: 0x222C,
   20280   dbllowline: 0x2017,
   20281   dbllowlinecmb: 0x0333,
   20282   dbloverlinecmb: 0x033F,
   20283   dblprimemod: 0x02BA,
   20284   dblverticalbar: 0x2016,
   20285   dblverticallineabovecmb: 0x030E,
   20286   dbopomofo: 0x3109,
   20287   dbsquare: 0x33C8,
   20288   dcaron: 0x010F,
   20289   dcedilla: 0x1E11,
   20290   dcircle: 0x24D3,
   20291   dcircumflexbelow: 0x1E13,
   20292   dcroat: 0x0111,
   20293   ddabengali: 0x09A1,
   20294   ddadeva: 0x0921,
   20295   ddagujarati: 0x0AA1,
   20296   ddagurmukhi: 0x0A21,
   20297   ddalarabic: 0x0688,
   20298   ddalfinalarabic: 0xFB89,
   20299   dddhadeva: 0x095C,
   20300   ddhabengali: 0x09A2,
   20301   ddhadeva: 0x0922,
   20302   ddhagujarati: 0x0AA2,
   20303   ddhagurmukhi: 0x0A22,
   20304   ddotaccent: 0x1E0B,
   20305   ddotbelow: 0x1E0D,
   20306   decimalseparatorarabic: 0x066B,
   20307   decimalseparatorpersian: 0x066B,
   20308   decyrillic: 0x0434,
   20309   degree: 0x00B0,
   20310   dehihebrew: 0x05AD,
   20311   dehiragana: 0x3067,
   20312   deicoptic: 0x03EF,
   20313   dekatakana: 0x30C7,
   20314   deleteleft: 0x232B,
   20315   deleteright: 0x2326,
   20316   delta: 0x03B4,
   20317   deltaturned: 0x018D,
   20318   denominatorminusonenumeratorbengali: 0x09F8,
   20319   dezh: 0x02A4,
   20320   dhabengali: 0x09A7,
   20321   dhadeva: 0x0927,
   20322   dhagujarati: 0x0AA7,
   20323   dhagurmukhi: 0x0A27,
   20324   dhook: 0x0257,
   20325   dialytikatonos: 0x0385,
   20326   dialytikatonoscmb: 0x0344,
   20327   diamond: 0x2666,
   20328   diamondsuitwhite: 0x2662,
   20329   dieresis: 0x00A8,
   20330   dieresisacute: 0xF6D7,
   20331   dieresisbelowcmb: 0x0324,
   20332   dieresiscmb: 0x0308,
   20333   dieresisgrave: 0xF6D8,
   20334   dieresistonos: 0x0385,
   20335   dihiragana: 0x3062,
   20336   dikatakana: 0x30C2,
   20337   dittomark: 0x3003,
   20338   divide: 0x00F7,
   20339   divides: 0x2223,
   20340   divisionslash: 0x2215,
   20341   djecyrillic: 0x0452,
   20342   dkshade: 0x2593,
   20343   dlinebelow: 0x1E0F,
   20344   dlsquare: 0x3397,
   20345   dmacron: 0x0111,
   20346   dmonospace: 0xFF44,
   20347   dnblock: 0x2584,
   20348   dochadathai: 0x0E0E,
   20349   dodekthai: 0x0E14,
   20350   dohiragana: 0x3069,
   20351   dokatakana: 0x30C9,
   20352   dollar: 0x0024,
   20353   dollarinferior: 0xF6E3,
   20354   dollarmonospace: 0xFF04,
   20355   dollaroldstyle: 0xF724,
   20356   dollarsmall: 0xFE69,
   20357   dollarsuperior: 0xF6E4,
   20358   dong: 0x20AB,
   20359   dorusquare: 0x3326,
   20360   dotaccent: 0x02D9,
   20361   dotaccentcmb: 0x0307,
   20362   dotbelowcmb: 0x0323,
   20363   dotbelowcomb: 0x0323,
   20364   dotkatakana: 0x30FB,
   20365   dotlessi: 0x0131,
   20366   dotlessj: 0xF6BE,
   20367   dotlessjstrokehook: 0x0284,
   20368   dotmath: 0x22C5,
   20369   dottedcircle: 0x25CC,
   20370   doubleyodpatah: 0xFB1F,
   20371   doubleyodpatahhebrew: 0xFB1F,
   20372   downtackbelowcmb: 0x031E,
   20373   downtackmod: 0x02D5,
   20374   dparen: 0x249F,
   20375   dsuperior: 0xF6EB,
   20376   dtail: 0x0256,
   20377   dtopbar: 0x018C,
   20378   duhiragana: 0x3065,
   20379   dukatakana: 0x30C5,
   20380   dz: 0x01F3,
   20381   dzaltone: 0x02A3,
   20382   dzcaron: 0x01C6,
   20383   dzcurl: 0x02A5,
   20384   dzeabkhasiancyrillic: 0x04E1,
   20385   dzecyrillic: 0x0455,
   20386   dzhecyrillic: 0x045F,
   20387   e: 0x0065,
   20388   eacute: 0x00E9,
   20389   earth: 0x2641,
   20390   ebengali: 0x098F,
   20391   ebopomofo: 0x311C,
   20392   ebreve: 0x0115,
   20393   ecandradeva: 0x090D,
   20394   ecandragujarati: 0x0A8D,
   20395   ecandravowelsigndeva: 0x0945,
   20396   ecandravowelsigngujarati: 0x0AC5,
   20397   ecaron: 0x011B,
   20398   ecedillabreve: 0x1E1D,
   20399   echarmenian: 0x0565,
   20400   echyiwnarmenian: 0x0587,
   20401   ecircle: 0x24D4,
   20402   ecircumflex: 0x00EA,
   20403   ecircumflexacute: 0x1EBF,
   20404   ecircumflexbelow: 0x1E19,
   20405   ecircumflexdotbelow: 0x1EC7,
   20406   ecircumflexgrave: 0x1EC1,
   20407   ecircumflexhookabove: 0x1EC3,
   20408   ecircumflextilde: 0x1EC5,
   20409   ecyrillic: 0x0454,
   20410   edblgrave: 0x0205,
   20411   edeva: 0x090F,
   20412   edieresis: 0x00EB,
   20413   edot: 0x0117,
   20414   edotaccent: 0x0117,
   20415   edotbelow: 0x1EB9,
   20416   eegurmukhi: 0x0A0F,
   20417   eematragurmukhi: 0x0A47,
   20418   efcyrillic: 0x0444,
   20419   egrave: 0x00E8,
   20420   egujarati: 0x0A8F,
   20421   eharmenian: 0x0567,
   20422   ehbopomofo: 0x311D,
   20423   ehiragana: 0x3048,
   20424   ehookabove: 0x1EBB,
   20425   eibopomofo: 0x311F,
   20426   eight: 0x0038,
   20427   eightarabic: 0x0668,
   20428   eightbengali: 0x09EE,
   20429   eightcircle: 0x2467,
   20430   eightcircleinversesansserif: 0x2791,
   20431   eightdeva: 0x096E,
   20432   eighteencircle: 0x2471,
   20433   eighteenparen: 0x2485,
   20434   eighteenperiod: 0x2499,
   20435   eightgujarati: 0x0AEE,
   20436   eightgurmukhi: 0x0A6E,
   20437   eighthackarabic: 0x0668,
   20438   eighthangzhou: 0x3028,
   20439   eighthnotebeamed: 0x266B,
   20440   eightideographicparen: 0x3227,
   20441   eightinferior: 0x2088,
   20442   eightmonospace: 0xFF18,
   20443   eightoldstyle: 0xF738,
   20444   eightparen: 0x247B,
   20445   eightperiod: 0x248F,
   20446   eightpersian: 0x06F8,
   20447   eightroman: 0x2177,
   20448   eightsuperior: 0x2078,
   20449   eightthai: 0x0E58,
   20450   einvertedbreve: 0x0207,
   20451   eiotifiedcyrillic: 0x0465,
   20452   ekatakana: 0x30A8,
   20453   ekatakanahalfwidth: 0xFF74,
   20454   ekonkargurmukhi: 0x0A74,
   20455   ekorean: 0x3154,
   20456   elcyrillic: 0x043B,
   20457   element: 0x2208,
   20458   elevencircle: 0x246A,
   20459   elevenparen: 0x247E,
   20460   elevenperiod: 0x2492,
   20461   elevenroman: 0x217A,
   20462   ellipsis: 0x2026,
   20463   ellipsisvertical: 0x22EE,
   20464   emacron: 0x0113,
   20465   emacronacute: 0x1E17,
   20466   emacrongrave: 0x1E15,
   20467   emcyrillic: 0x043C,
   20468   emdash: 0x2014,
   20469   emdashvertical: 0xFE31,
   20470   emonospace: 0xFF45,
   20471   emphasismarkarmenian: 0x055B,
   20472   emptyset: 0x2205,
   20473   enbopomofo: 0x3123,
   20474   encyrillic: 0x043D,
   20475   endash: 0x2013,
   20476   endashvertical: 0xFE32,
   20477   endescendercyrillic: 0x04A3,
   20478   eng: 0x014B,
   20479   engbopomofo: 0x3125,
   20480   enghecyrillic: 0x04A5,
   20481   enhookcyrillic: 0x04C8,
   20482   enspace: 0x2002,
   20483   eogonek: 0x0119,
   20484   eokorean: 0x3153,
   20485   eopen: 0x025B,
   20486   eopenclosed: 0x029A,
   20487   eopenreversed: 0x025C,
   20488   eopenreversedclosed: 0x025E,
   20489   eopenreversedhook: 0x025D,
   20490   eparen: 0x24A0,
   20491   epsilon: 0x03B5,
   20492   epsilontonos: 0x03AD,
   20493   equal: 0x003D,
   20494   equalmonospace: 0xFF1D,
   20495   equalsmall: 0xFE66,
   20496   equalsuperior: 0x207C,
   20497   equivalence: 0x2261,
   20498   erbopomofo: 0x3126,
   20499   ercyrillic: 0x0440,
   20500   ereversed: 0x0258,
   20501   ereversedcyrillic: 0x044D,
   20502   escyrillic: 0x0441,
   20503   esdescendercyrillic: 0x04AB,
   20504   esh: 0x0283,
   20505   eshcurl: 0x0286,
   20506   eshortdeva: 0x090E,
   20507   eshortvowelsigndeva: 0x0946,
   20508   eshreversedloop: 0x01AA,
   20509   eshsquatreversed: 0x0285,
   20510   esmallhiragana: 0x3047,
   20511   esmallkatakana: 0x30A7,
   20512   esmallkatakanahalfwidth: 0xFF6A,
   20513   estimated: 0x212E,
   20514   esuperior: 0xF6EC,
   20515   eta: 0x03B7,
   20516   etarmenian: 0x0568,
   20517   etatonos: 0x03AE,
   20518   eth: 0x00F0,
   20519   etilde: 0x1EBD,
   20520   etildebelow: 0x1E1B,
   20521   etnahtafoukhhebrew: 0x0591,
   20522   etnahtafoukhlefthebrew: 0x0591,
   20523   etnahtahebrew: 0x0591,
   20524   etnahtalefthebrew: 0x0591,
   20525   eturned: 0x01DD,
   20526   eukorean: 0x3161,
   20527   euro: 0x20AC,
   20528   evowelsignbengali: 0x09C7,
   20529   evowelsigndeva: 0x0947,
   20530   evowelsigngujarati: 0x0AC7,
   20531   exclam: 0x0021,
   20532   exclamarmenian: 0x055C,
   20533   exclamdbl: 0x203C,
   20534   exclamdown: 0x00A1,
   20535   exclamdownsmall: 0xF7A1,
   20536   exclammonospace: 0xFF01,
   20537   exclamsmall: 0xF721,
   20538   existential: 0x2203,
   20539   ezh: 0x0292,
   20540   ezhcaron: 0x01EF,
   20541   ezhcurl: 0x0293,
   20542   ezhreversed: 0x01B9,
   20543   ezhtail: 0x01BA,
   20544   f: 0x0066,
   20545   fadeva: 0x095E,
   20546   fagurmukhi: 0x0A5E,
   20547   fahrenheit: 0x2109,
   20548   fathaarabic: 0x064E,
   20549   fathalowarabic: 0x064E,
   20550   fathatanarabic: 0x064B,
   20551   fbopomofo: 0x3108,
   20552   fcircle: 0x24D5,
   20553   fdotaccent: 0x1E1F,
   20554   feharabic: 0x0641,
   20555   feharmenian: 0x0586,
   20556   fehfinalarabic: 0xFED2,
   20557   fehinitialarabic: 0xFED3,
   20558   fehmedialarabic: 0xFED4,
   20559   feicoptic: 0x03E5,
   20560   female: 0x2640,
   20561   ff: 0xFB00,
   20562   ffi: 0xFB03,
   20563   ffl: 0xFB04,
   20564   fi: 0xFB01,
   20565   fifteencircle: 0x246E,
   20566   fifteenparen: 0x2482,
   20567   fifteenperiod: 0x2496,
   20568   figuredash: 0x2012,
   20569   filledbox: 0x25A0,
   20570   filledrect: 0x25AC,
   20571   finalkaf: 0x05DA,
   20572   finalkafdagesh: 0xFB3A,
   20573   finalkafdageshhebrew: 0xFB3A,
   20574   finalkafhebrew: 0x05DA,
   20575   finalmem: 0x05DD,
   20576   finalmemhebrew: 0x05DD,
   20577   finalnun: 0x05DF,
   20578   finalnunhebrew: 0x05DF,
   20579   finalpe: 0x05E3,
   20580   finalpehebrew: 0x05E3,
   20581   finaltsadi: 0x05E5,
   20582   finaltsadihebrew: 0x05E5,
   20583   firsttonechinese: 0x02C9,
   20584   fisheye: 0x25C9,
   20585   fitacyrillic: 0x0473,
   20586   five: 0x0035,
   20587   fivearabic: 0x0665,
   20588   fivebengali: 0x09EB,
   20589   fivecircle: 0x2464,
   20590   fivecircleinversesansserif: 0x278E,
   20591   fivedeva: 0x096B,
   20592   fiveeighths: 0x215D,
   20593   fivegujarati: 0x0AEB,
   20594   fivegurmukhi: 0x0A6B,
   20595   fivehackarabic: 0x0665,
   20596   fivehangzhou: 0x3025,
   20597   fiveideographicparen: 0x3224,
   20598   fiveinferior: 0x2085,
   20599   fivemonospace: 0xFF15,
   20600   fiveoldstyle: 0xF735,
   20601   fiveparen: 0x2478,
   20602   fiveperiod: 0x248C,
   20603   fivepersian: 0x06F5,
   20604   fiveroman: 0x2174,
   20605   fivesuperior: 0x2075,
   20606   fivethai: 0x0E55,
   20607   fl: 0xFB02,
   20608   florin: 0x0192,
   20609   fmonospace: 0xFF46,
   20610   fmsquare: 0x3399,
   20611   fofanthai: 0x0E1F,
   20612   fofathai: 0x0E1D,
   20613   fongmanthai: 0x0E4F,
   20614   forall: 0x2200,
   20615   four: 0x0034,
   20616   fourarabic: 0x0664,
   20617   fourbengali: 0x09EA,
   20618   fourcircle: 0x2463,
   20619   fourcircleinversesansserif: 0x278D,
   20620   fourdeva: 0x096A,
   20621   fourgujarati: 0x0AEA,
   20622   fourgurmukhi: 0x0A6A,
   20623   fourhackarabic: 0x0664,
   20624   fourhangzhou: 0x3024,
   20625   fourideographicparen: 0x3223,
   20626   fourinferior: 0x2084,
   20627   fourmonospace: 0xFF14,
   20628   fournumeratorbengali: 0x09F7,
   20629   fouroldstyle: 0xF734,
   20630   fourparen: 0x2477,
   20631   fourperiod: 0x248B,
   20632   fourpersian: 0x06F4,
   20633   fourroman: 0x2173,
   20634   foursuperior: 0x2074,
   20635   fourteencircle: 0x246D,
   20636   fourteenparen: 0x2481,
   20637   fourteenperiod: 0x2495,
   20638   fourthai: 0x0E54,
   20639   fourthtonechinese: 0x02CB,
   20640   fparen: 0x24A1,
   20641   fraction: 0x2044,
   20642   franc: 0x20A3,
   20643   g: 0x0067,
   20644   gabengali: 0x0997,
   20645   gacute: 0x01F5,
   20646   gadeva: 0x0917,
   20647   gafarabic: 0x06AF,
   20648   gaffinalarabic: 0xFB93,
   20649   gafinitialarabic: 0xFB94,
   20650   gafmedialarabic: 0xFB95,
   20651   gagujarati: 0x0A97,
   20652   gagurmukhi: 0x0A17,
   20653   gahiragana: 0x304C,
   20654   gakatakana: 0x30AC,
   20655   gamma: 0x03B3,
   20656   gammalatinsmall: 0x0263,
   20657   gammasuperior: 0x02E0,
   20658   gangiacoptic: 0x03EB,
   20659   gbopomofo: 0x310D,
   20660   gbreve: 0x011F,
   20661   gcaron: 0x01E7,
   20662   gcedilla: 0x0123,
   20663   gcircle: 0x24D6,
   20664   gcircumflex: 0x011D,
   20665   gcommaaccent: 0x0123,
   20666   gdot: 0x0121,
   20667   gdotaccent: 0x0121,
   20668   gecyrillic: 0x0433,
   20669   gehiragana: 0x3052,
   20670   gekatakana: 0x30B2,
   20671   geometricallyequal: 0x2251,
   20672   gereshaccenthebrew: 0x059C,
   20673   gereshhebrew: 0x05F3,
   20674   gereshmuqdamhebrew: 0x059D,
   20675   germandbls: 0x00DF,
   20676   gershayimaccenthebrew: 0x059E,
   20677   gershayimhebrew: 0x05F4,
   20678   getamark: 0x3013,
   20679   ghabengali: 0x0998,
   20680   ghadarmenian: 0x0572,
   20681   ghadeva: 0x0918,
   20682   ghagujarati: 0x0A98,
   20683   ghagurmukhi: 0x0A18,
   20684   ghainarabic: 0x063A,
   20685   ghainfinalarabic: 0xFECE,
   20686   ghaininitialarabic: 0xFECF,
   20687   ghainmedialarabic: 0xFED0,
   20688   ghemiddlehookcyrillic: 0x0495,
   20689   ghestrokecyrillic: 0x0493,
   20690   gheupturncyrillic: 0x0491,
   20691   ghhadeva: 0x095A,
   20692   ghhagurmukhi: 0x0A5A,
   20693   ghook: 0x0260,
   20694   ghzsquare: 0x3393,
   20695   gihiragana: 0x304E,
   20696   gikatakana: 0x30AE,
   20697   gimarmenian: 0x0563,
   20698   gimel: 0x05D2,
   20699   gimeldagesh: 0xFB32,
   20700   gimeldageshhebrew: 0xFB32,
   20701   gimelhebrew: 0x05D2,
   20702   gjecyrillic: 0x0453,
   20703   glottalinvertedstroke: 0x01BE,
   20704   glottalstop: 0x0294,
   20705   glottalstopinverted: 0x0296,
   20706   glottalstopmod: 0x02C0,
   20707   glottalstopreversed: 0x0295,
   20708   glottalstopreversedmod: 0x02C1,
   20709   glottalstopreversedsuperior: 0x02E4,
   20710   glottalstopstroke: 0x02A1,
   20711   glottalstopstrokereversed: 0x02A2,
   20712   gmacron: 0x1E21,
   20713   gmonospace: 0xFF47,
   20714   gohiragana: 0x3054,
   20715   gokatakana: 0x30B4,
   20716   gparen: 0x24A2,
   20717   gpasquare: 0x33AC,
   20718   gradient: 0x2207,
   20719   grave: 0x0060,
   20720   gravebelowcmb: 0x0316,
   20721   gravecmb: 0x0300,
   20722   gravecomb: 0x0300,
   20723   gravedeva: 0x0953,
   20724   gravelowmod: 0x02CE,
   20725   gravemonospace: 0xFF40,
   20726   gravetonecmb: 0x0340,
   20727   greater: 0x003E,
   20728   greaterequal: 0x2265,
   20729   greaterequalorless: 0x22DB,
   20730   greatermonospace: 0xFF1E,
   20731   greaterorequivalent: 0x2273,
   20732   greaterorless: 0x2277,
   20733   greateroverequal: 0x2267,
   20734   greatersmall: 0xFE65,
   20735   gscript: 0x0261,
   20736   gstroke: 0x01E5,
   20737   guhiragana: 0x3050,
   20738   guillemotleft: 0x00AB,
   20739   guillemotright: 0x00BB,
   20740   guilsinglleft: 0x2039,
   20741   guilsinglright: 0x203A,
   20742   gukatakana: 0x30B0,
   20743   guramusquare: 0x3318,
   20744   gysquare: 0x33C9,
   20745   h: 0x0068,
   20746   haabkhasiancyrillic: 0x04A9,
   20747   haaltonearabic: 0x06C1,
   20748   habengali: 0x09B9,
   20749   hadescendercyrillic: 0x04B3,
   20750   hadeva: 0x0939,
   20751   hagujarati: 0x0AB9,
   20752   hagurmukhi: 0x0A39,
   20753   haharabic: 0x062D,
   20754   hahfinalarabic: 0xFEA2,
   20755   hahinitialarabic: 0xFEA3,
   20756   hahiragana: 0x306F,
   20757   hahmedialarabic: 0xFEA4,
   20758   haitusquare: 0x332A,
   20759   hakatakana: 0x30CF,
   20760   hakatakanahalfwidth: 0xFF8A,
   20761   halantgurmukhi: 0x0A4D,
   20762   hamzaarabic: 0x0621,
   20763   hamzalowarabic: 0x0621,
   20764   hangulfiller: 0x3164,
   20765   hardsigncyrillic: 0x044A,
   20766   harpoonleftbarbup: 0x21BC,
   20767   harpoonrightbarbup: 0x21C0,
   20768   hasquare: 0x33CA,
   20769   hatafpatah: 0x05B2,
   20770   hatafpatah16: 0x05B2,
   20771   hatafpatah23: 0x05B2,
   20772   hatafpatah2f: 0x05B2,
   20773   hatafpatahhebrew: 0x05B2,
   20774   hatafpatahnarrowhebrew: 0x05B2,
   20775   hatafpatahquarterhebrew: 0x05B2,
   20776   hatafpatahwidehebrew: 0x05B2,
   20777   hatafqamats: 0x05B3,
   20778   hatafqamats1b: 0x05B3,
   20779   hatafqamats28: 0x05B3,
   20780   hatafqamats34: 0x05B3,
   20781   hatafqamatshebrew: 0x05B3,
   20782   hatafqamatsnarrowhebrew: 0x05B3,
   20783   hatafqamatsquarterhebrew: 0x05B3,
   20784   hatafqamatswidehebrew: 0x05B3,
   20785   hatafsegol: 0x05B1,
   20786   hatafsegol17: 0x05B1,
   20787   hatafsegol24: 0x05B1,
   20788   hatafsegol30: 0x05B1,
   20789   hatafsegolhebrew: 0x05B1,
   20790   hatafsegolnarrowhebrew: 0x05B1,
   20791   hatafsegolquarterhebrew: 0x05B1,
   20792   hatafsegolwidehebrew: 0x05B1,
   20793   hbar: 0x0127,
   20794   hbopomofo: 0x310F,
   20795   hbrevebelow: 0x1E2B,
   20796   hcedilla: 0x1E29,
   20797   hcircle: 0x24D7,
   20798   hcircumflex: 0x0125,
   20799   hdieresis: 0x1E27,
   20800   hdotaccent: 0x1E23,
   20801   hdotbelow: 0x1E25,
   20802   he: 0x05D4,
   20803   heart: 0x2665,
   20804   heartsuitblack: 0x2665,
   20805   heartsuitwhite: 0x2661,
   20806   hedagesh: 0xFB34,
   20807   hedageshhebrew: 0xFB34,
   20808   hehaltonearabic: 0x06C1,
   20809   heharabic: 0x0647,
   20810   hehebrew: 0x05D4,
   20811   hehfinalaltonearabic: 0xFBA7,
   20812   hehfinalalttwoarabic: 0xFEEA,
   20813   hehfinalarabic: 0xFEEA,
   20814   hehhamzaabovefinalarabic: 0xFBA5,
   20815   hehhamzaaboveisolatedarabic: 0xFBA4,
   20816   hehinitialaltonearabic: 0xFBA8,
   20817   hehinitialarabic: 0xFEEB,
   20818   hehiragana: 0x3078,
   20819   hehmedialaltonearabic: 0xFBA9,
   20820   hehmedialarabic: 0xFEEC,
   20821   heiseierasquare: 0x337B,
   20822   hekatakana: 0x30D8,
   20823   hekatakanahalfwidth: 0xFF8D,
   20824   hekutaarusquare: 0x3336,
   20825   henghook: 0x0267,
   20826   herutusquare: 0x3339,
   20827   het: 0x05D7,
   20828   hethebrew: 0x05D7,
   20829   hhook: 0x0266,
   20830   hhooksuperior: 0x02B1,
   20831   hieuhacirclekorean: 0x327B,
   20832   hieuhaparenkorean: 0x321B,
   20833   hieuhcirclekorean: 0x326D,
   20834   hieuhkorean: 0x314E,
   20835   hieuhparenkorean: 0x320D,
   20836   hihiragana: 0x3072,
   20837   hikatakana: 0x30D2,
   20838   hikatakanahalfwidth: 0xFF8B,
   20839   hiriq: 0x05B4,
   20840   hiriq14: 0x05B4,
   20841   hiriq21: 0x05B4,
   20842   hiriq2d: 0x05B4,
   20843   hiriqhebrew: 0x05B4,
   20844   hiriqnarrowhebrew: 0x05B4,
   20845   hiriqquarterhebrew: 0x05B4,
   20846   hiriqwidehebrew: 0x05B4,
   20847   hlinebelow: 0x1E96,
   20848   hmonospace: 0xFF48,
   20849   hoarmenian: 0x0570,
   20850   hohipthai: 0x0E2B,
   20851   hohiragana: 0x307B,
   20852   hokatakana: 0x30DB,
   20853   hokatakanahalfwidth: 0xFF8E,
   20854   holam: 0x05B9,
   20855   holam19: 0x05B9,
   20856   holam26: 0x05B9,
   20857   holam32: 0x05B9,
   20858   holamhebrew: 0x05B9,
   20859   holamnarrowhebrew: 0x05B9,
   20860   holamquarterhebrew: 0x05B9,
   20861   holamwidehebrew: 0x05B9,
   20862   honokhukthai: 0x0E2E,
   20863   hookabovecomb: 0x0309,
   20864   hookcmb: 0x0309,
   20865   hookpalatalizedbelowcmb: 0x0321,
   20866   hookretroflexbelowcmb: 0x0322,
   20867   hoonsquare: 0x3342,
   20868   horicoptic: 0x03E9,
   20869   horizontalbar: 0x2015,
   20870   horncmb: 0x031B,
   20871   hotsprings: 0x2668,
   20872   house: 0x2302,
   20873   hparen: 0x24A3,
   20874   hsuperior: 0x02B0,
   20875   hturned: 0x0265,
   20876   huhiragana: 0x3075,
   20877   huiitosquare: 0x3333,
   20878   hukatakana: 0x30D5,
   20879   hukatakanahalfwidth: 0xFF8C,
   20880   hungarumlaut: 0x02DD,
   20881   hungarumlautcmb: 0x030B,
   20882   hv: 0x0195,
   20883   hyphen: 0x002D,
   20884   hypheninferior: 0xF6E5,
   20885   hyphenmonospace: 0xFF0D,
   20886   hyphensmall: 0xFE63,
   20887   hyphensuperior: 0xF6E6,
   20888   hyphentwo: 0x2010,
   20889   i: 0x0069,
   20890   iacute: 0x00ED,
   20891   iacyrillic: 0x044F,
   20892   ibengali: 0x0987,
   20893   ibopomofo: 0x3127,
   20894   ibreve: 0x012D,
   20895   icaron: 0x01D0,
   20896   icircle: 0x24D8,
   20897   icircumflex: 0x00EE,
   20898   icyrillic: 0x0456,
   20899   idblgrave: 0x0209,
   20900   ideographearthcircle: 0x328F,
   20901   ideographfirecircle: 0x328B,
   20902   ideographicallianceparen: 0x323F,
   20903   ideographiccallparen: 0x323A,
   20904   ideographiccentrecircle: 0x32A5,
   20905   ideographicclose: 0x3006,
   20906   ideographiccomma: 0x3001,
   20907   ideographiccommaleft: 0xFF64,
   20908   ideographiccongratulationparen: 0x3237,
   20909   ideographiccorrectcircle: 0x32A3,
   20910   ideographicearthparen: 0x322F,
   20911   ideographicenterpriseparen: 0x323D,
   20912   ideographicexcellentcircle: 0x329D,
   20913   ideographicfestivalparen: 0x3240,
   20914   ideographicfinancialcircle: 0x3296,
   20915   ideographicfinancialparen: 0x3236,
   20916   ideographicfireparen: 0x322B,
   20917   ideographichaveparen: 0x3232,
   20918   ideographichighcircle: 0x32A4,
   20919   ideographiciterationmark: 0x3005,
   20920   ideographiclaborcircle: 0x3298,
   20921   ideographiclaborparen: 0x3238,
   20922   ideographicleftcircle: 0x32A7,
   20923   ideographiclowcircle: 0x32A6,
   20924   ideographicmedicinecircle: 0x32A9,
   20925   ideographicmetalparen: 0x322E,
   20926   ideographicmoonparen: 0x322A,
   20927   ideographicnameparen: 0x3234,
   20928   ideographicperiod: 0x3002,
   20929   ideographicprintcircle: 0x329E,
   20930   ideographicreachparen: 0x3243,
   20931   ideographicrepresentparen: 0x3239,
   20932   ideographicresourceparen: 0x323E,
   20933   ideographicrightcircle: 0x32A8,
   20934   ideographicsecretcircle: 0x3299,
   20935   ideographicselfparen: 0x3242,
   20936   ideographicsocietyparen: 0x3233,
   20937   ideographicspace: 0x3000,
   20938   ideographicspecialparen: 0x3235,
   20939   ideographicstockparen: 0x3231,
   20940   ideographicstudyparen: 0x323B,
   20941   ideographicsunparen: 0x3230,
   20942   ideographicsuperviseparen: 0x323C,
   20943   ideographicwaterparen: 0x322C,
   20944   ideographicwoodparen: 0x322D,
   20945   ideographiczero: 0x3007,
   20946   ideographmetalcircle: 0x328E,
   20947   ideographmooncircle: 0x328A,
   20948   ideographnamecircle: 0x3294,
   20949   ideographsuncircle: 0x3290,
   20950   ideographwatercircle: 0x328C,
   20951   ideographwoodcircle: 0x328D,
   20952   ideva: 0x0907,
   20953   idieresis: 0x00EF,
   20954   idieresisacute: 0x1E2F,
   20955   idieresiscyrillic: 0x04E5,
   20956   idotbelow: 0x1ECB,
   20957   iebrevecyrillic: 0x04D7,
   20958   iecyrillic: 0x0435,
   20959   ieungacirclekorean: 0x3275,
   20960   ieungaparenkorean: 0x3215,
   20961   ieungcirclekorean: 0x3267,
   20962   ieungkorean: 0x3147,
   20963   ieungparenkorean: 0x3207,
   20964   igrave: 0x00EC,
   20965   igujarati: 0x0A87,
   20966   igurmukhi: 0x0A07,
   20967   ihiragana: 0x3044,
   20968   ihookabove: 0x1EC9,
   20969   iibengali: 0x0988,
   20970   iicyrillic: 0x0438,
   20971   iideva: 0x0908,
   20972   iigujarati: 0x0A88,
   20973   iigurmukhi: 0x0A08,
   20974   iimatragurmukhi: 0x0A40,
   20975   iinvertedbreve: 0x020B,
   20976   iishortcyrillic: 0x0439,
   20977   iivowelsignbengali: 0x09C0,
   20978   iivowelsigndeva: 0x0940,
   20979   iivowelsigngujarati: 0x0AC0,
   20980   ij: 0x0133,
   20981   ikatakana: 0x30A4,
   20982   ikatakanahalfwidth: 0xFF72,
   20983   ikorean: 0x3163,
   20984   ilde: 0x02DC,
   20985   iluyhebrew: 0x05AC,
   20986   imacron: 0x012B,
   20987   imacroncyrillic: 0x04E3,
   20988   imageorapproximatelyequal: 0x2253,
   20989   imatragurmukhi: 0x0A3F,
   20990   imonospace: 0xFF49,
   20991   increment: 0x2206,
   20992   infinity: 0x221E,
   20993   iniarmenian: 0x056B,
   20994   integral: 0x222B,
   20995   integralbottom: 0x2321,
   20996   integralbt: 0x2321,
   20997   integralex: 0xF8F5,
   20998   integraltop: 0x2320,
   20999   integraltp: 0x2320,
   21000   intersection: 0x2229,
   21001   intisquare: 0x3305,
   21002   invbullet: 0x25D8,
   21003   invcircle: 0x25D9,
   21004   invsmileface: 0x263B,
   21005   iocyrillic: 0x0451,
   21006   iogonek: 0x012F,
   21007   iota: 0x03B9,
   21008   iotadieresis: 0x03CA,
   21009   iotadieresistonos: 0x0390,
   21010   iotalatin: 0x0269,
   21011   iotatonos: 0x03AF,
   21012   iparen: 0x24A4,
   21013   irigurmukhi: 0x0A72,
   21014   ismallhiragana: 0x3043,
   21015   ismallkatakana: 0x30A3,
   21016   ismallkatakanahalfwidth: 0xFF68,
   21017   issharbengali: 0x09FA,
   21018   istroke: 0x0268,
   21019   isuperior: 0xF6ED,
   21020   iterationhiragana: 0x309D,
   21021   iterationkatakana: 0x30FD,
   21022   itilde: 0x0129,
   21023   itildebelow: 0x1E2D,
   21024   iubopomofo: 0x3129,
   21025   iucyrillic: 0x044E,
   21026   ivowelsignbengali: 0x09BF,
   21027   ivowelsigndeva: 0x093F,
   21028   ivowelsigngujarati: 0x0ABF,
   21029   izhitsacyrillic: 0x0475,
   21030   izhitsadblgravecyrillic: 0x0477,
   21031   j: 0x006A,
   21032   jaarmenian: 0x0571,
   21033   jabengali: 0x099C,
   21034   jadeva: 0x091C,
   21035   jagujarati: 0x0A9C,
   21036   jagurmukhi: 0x0A1C,
   21037   jbopomofo: 0x3110,
   21038   jcaron: 0x01F0,
   21039   jcircle: 0x24D9,
   21040   jcircumflex: 0x0135,
   21041   jcrossedtail: 0x029D,
   21042   jdotlessstroke: 0x025F,
   21043   jecyrillic: 0x0458,
   21044   jeemarabic: 0x062C,
   21045   jeemfinalarabic: 0xFE9E,
   21046   jeeminitialarabic: 0xFE9F,
   21047   jeemmedialarabic: 0xFEA0,
   21048   jeharabic: 0x0698,
   21049   jehfinalarabic: 0xFB8B,
   21050   jhabengali: 0x099D,
   21051   jhadeva: 0x091D,
   21052   jhagujarati: 0x0A9D,
   21053   jhagurmukhi: 0x0A1D,
   21054   jheharmenian: 0x057B,
   21055   jis: 0x3004,
   21056   jmonospace: 0xFF4A,
   21057   jparen: 0x24A5,
   21058   jsuperior: 0x02B2,
   21059   k: 0x006B,
   21060   kabashkircyrillic: 0x04A1,
   21061   kabengali: 0x0995,
   21062   kacute: 0x1E31,
   21063   kacyrillic: 0x043A,
   21064   kadescendercyrillic: 0x049B,
   21065   kadeva: 0x0915,
   21066   kaf: 0x05DB,
   21067   kafarabic: 0x0643,
   21068   kafdagesh: 0xFB3B,
   21069   kafdageshhebrew: 0xFB3B,
   21070   kaffinalarabic: 0xFEDA,
   21071   kafhebrew: 0x05DB,
   21072   kafinitialarabic: 0xFEDB,
   21073   kafmedialarabic: 0xFEDC,
   21074   kafrafehebrew: 0xFB4D,
   21075   kagujarati: 0x0A95,
   21076   kagurmukhi: 0x0A15,
   21077   kahiragana: 0x304B,
   21078   kahookcyrillic: 0x04C4,
   21079   kakatakana: 0x30AB,
   21080   kakatakanahalfwidth: 0xFF76,
   21081   kappa: 0x03BA,
   21082   kappasymbolgreek: 0x03F0,
   21083   kapyeounmieumkorean: 0x3171,
   21084   kapyeounphieuphkorean: 0x3184,
   21085   kapyeounpieupkorean: 0x3178,
   21086   kapyeounssangpieupkorean: 0x3179,
   21087   karoriisquare: 0x330D,
   21088   kashidaautoarabic: 0x0640,
   21089   kashidaautonosidebearingarabic: 0x0640,
   21090   kasmallkatakana: 0x30F5,
   21091   kasquare: 0x3384,
   21092   kasraarabic: 0x0650,
   21093   kasratanarabic: 0x064D,
   21094   kastrokecyrillic: 0x049F,
   21095   katahiraprolongmarkhalfwidth: 0xFF70,
   21096   kaverticalstrokecyrillic: 0x049D,
   21097   kbopomofo: 0x310E,
   21098   kcalsquare: 0x3389,
   21099   kcaron: 0x01E9,
   21100   kcedilla: 0x0137,
   21101   kcircle: 0x24DA,
   21102   kcommaaccent: 0x0137,
   21103   kdotbelow: 0x1E33,
   21104   keharmenian: 0x0584,
   21105   kehiragana: 0x3051,
   21106   kekatakana: 0x30B1,
   21107   kekatakanahalfwidth: 0xFF79,
   21108   kenarmenian: 0x056F,
   21109   kesmallkatakana: 0x30F6,
   21110   kgreenlandic: 0x0138,
   21111   khabengali: 0x0996,
   21112   khacyrillic: 0x0445,
   21113   khadeva: 0x0916,
   21114   khagujarati: 0x0A96,
   21115   khagurmukhi: 0x0A16,
   21116   khaharabic: 0x062E,
   21117   khahfinalarabic: 0xFEA6,
   21118   khahinitialarabic: 0xFEA7,
   21119   khahmedialarabic: 0xFEA8,
   21120   kheicoptic: 0x03E7,
   21121   khhadeva: 0x0959,
   21122   khhagurmukhi: 0x0A59,
   21123   khieukhacirclekorean: 0x3278,
   21124   khieukhaparenkorean: 0x3218,
   21125   khieukhcirclekorean: 0x326A,
   21126   khieukhkorean: 0x314B,
   21127   khieukhparenkorean: 0x320A,
   21128   khokhaithai: 0x0E02,
   21129   khokhonthai: 0x0E05,
   21130   khokhuatthai: 0x0E03,
   21131   khokhwaithai: 0x0E04,
   21132   khomutthai: 0x0E5B,
   21133   khook: 0x0199,
   21134   khorakhangthai: 0x0E06,
   21135   khzsquare: 0x3391,
   21136   kihiragana: 0x304D,
   21137   kikatakana: 0x30AD,
   21138   kikatakanahalfwidth: 0xFF77,
   21139   kiroguramusquare: 0x3315,
   21140   kiromeetorusquare: 0x3316,
   21141   kirosquare: 0x3314,
   21142   kiyeokacirclekorean: 0x326E,
   21143   kiyeokaparenkorean: 0x320E,
   21144   kiyeokcirclekorean: 0x3260,
   21145   kiyeokkorean: 0x3131,
   21146   kiyeokparenkorean: 0x3200,
   21147   kiyeoksioskorean: 0x3133,
   21148   kjecyrillic: 0x045C,
   21149   klinebelow: 0x1E35,
   21150   klsquare: 0x3398,
   21151   kmcubedsquare: 0x33A6,
   21152   kmonospace: 0xFF4B,
   21153   kmsquaredsquare: 0x33A2,
   21154   kohiragana: 0x3053,
   21155   kohmsquare: 0x33C0,
   21156   kokaithai: 0x0E01,
   21157   kokatakana: 0x30B3,
   21158   kokatakanahalfwidth: 0xFF7A,
   21159   kooposquare: 0x331E,
   21160   koppacyrillic: 0x0481,
   21161   koreanstandardsymbol: 0x327F,
   21162   koroniscmb: 0x0343,
   21163   kparen: 0x24A6,
   21164   kpasquare: 0x33AA,
   21165   ksicyrillic: 0x046F,
   21166   ktsquare: 0x33CF,
   21167   kturned: 0x029E,
   21168   kuhiragana: 0x304F,
   21169   kukatakana: 0x30AF,
   21170   kukatakanahalfwidth: 0xFF78,
   21171   kvsquare: 0x33B8,
   21172   kwsquare: 0x33BE,
   21173   l: 0x006C,
   21174   labengali: 0x09B2,
   21175   lacute: 0x013A,
   21176   ladeva: 0x0932,
   21177   lagujarati: 0x0AB2,
   21178   lagurmukhi: 0x0A32,
   21179   lakkhangyaothai: 0x0E45,
   21180   lamaleffinalarabic: 0xFEFC,
   21181   lamalefhamzaabovefinalarabic: 0xFEF8,
   21182   lamalefhamzaaboveisolatedarabic: 0xFEF7,
   21183   lamalefhamzabelowfinalarabic: 0xFEFA,
   21184   lamalefhamzabelowisolatedarabic: 0xFEF9,
   21185   lamalefisolatedarabic: 0xFEFB,
   21186   lamalefmaddaabovefinalarabic: 0xFEF6,
   21187   lamalefmaddaaboveisolatedarabic: 0xFEF5,
   21188   lamarabic: 0x0644,
   21189   lambda: 0x03BB,
   21190   lambdastroke: 0x019B,
   21191   lamed: 0x05DC,
   21192   lameddagesh: 0xFB3C,
   21193   lameddageshhebrew: 0xFB3C,
   21194   lamedhebrew: 0x05DC,
   21195   lamfinalarabic: 0xFEDE,
   21196   lamhahinitialarabic: 0xFCCA,
   21197   laminitialarabic: 0xFEDF,
   21198   lamjeeminitialarabic: 0xFCC9,
   21199   lamkhahinitialarabic: 0xFCCB,
   21200   lamlamhehisolatedarabic: 0xFDF2,
   21201   lammedialarabic: 0xFEE0,
   21202   lammeemhahinitialarabic: 0xFD88,
   21203   lammeeminitialarabic: 0xFCCC,
   21204   largecircle: 0x25EF,
   21205   lbar: 0x019A,
   21206   lbelt: 0x026C,
   21207   lbopomofo: 0x310C,
   21208   lcaron: 0x013E,
   21209   lcedilla: 0x013C,
   21210   lcircle: 0x24DB,
   21211   lcircumflexbelow: 0x1E3D,
   21212   lcommaaccent: 0x013C,
   21213   ldot: 0x0140,
   21214   ldotaccent: 0x0140,
   21215   ldotbelow: 0x1E37,
   21216   ldotbelowmacron: 0x1E39,
   21217   leftangleabovecmb: 0x031A,
   21218   lefttackbelowcmb: 0x0318,
   21219   less: 0x003C,
   21220   lessequal: 0x2264,
   21221   lessequalorgreater: 0x22DA,
   21222   lessmonospace: 0xFF1C,
   21223   lessorequivalent: 0x2272,
   21224   lessorgreater: 0x2276,
   21225   lessoverequal: 0x2266,
   21226   lesssmall: 0xFE64,
   21227   lezh: 0x026E,
   21228   lfblock: 0x258C,
   21229   lhookretroflex: 0x026D,
   21230   lira: 0x20A4,
   21231   liwnarmenian: 0x056C,
   21232   lj: 0x01C9,
   21233   ljecyrillic: 0x0459,
   21234   ll: 0xF6C0,
   21235   lladeva: 0x0933,
   21236   llagujarati: 0x0AB3,
   21237   llinebelow: 0x1E3B,
   21238   llladeva: 0x0934,
   21239   llvocalicbengali: 0x09E1,
   21240   llvocalicdeva: 0x0961,
   21241   llvocalicvowelsignbengali: 0x09E3,
   21242   llvocalicvowelsigndeva: 0x0963,
   21243   lmiddletilde: 0x026B,
   21244   lmonospace: 0xFF4C,
   21245   lmsquare: 0x33D0,
   21246   lochulathai: 0x0E2C,
   21247   logicaland: 0x2227,
   21248   logicalnot: 0x00AC,
   21249   logicalnotreversed: 0x2310,
   21250   logicalor: 0x2228,
   21251   lolingthai: 0x0E25,
   21252   longs: 0x017F,
   21253   lowlinecenterline: 0xFE4E,
   21254   lowlinecmb: 0x0332,
   21255   lowlinedashed: 0xFE4D,
   21256   lozenge: 0x25CA,
   21257   lparen: 0x24A7,
   21258   lslash: 0x0142,
   21259   lsquare: 0x2113,
   21260   lsuperior: 0xF6EE,
   21261   ltshade: 0x2591,
   21262   luthai: 0x0E26,
   21263   lvocalicbengali: 0x098C,
   21264   lvocalicdeva: 0x090C,
   21265   lvocalicvowelsignbengali: 0x09E2,
   21266   lvocalicvowelsigndeva: 0x0962,
   21267   lxsquare: 0x33D3,
   21268   m: 0x006D,
   21269   mabengali: 0x09AE,
   21270   macron: 0x00AF,
   21271   macronbelowcmb: 0x0331,
   21272   macroncmb: 0x0304,
   21273   macronlowmod: 0x02CD,
   21274   macronmonospace: 0xFFE3,
   21275   macute: 0x1E3F,
   21276   madeva: 0x092E,
   21277   magujarati: 0x0AAE,
   21278   magurmukhi: 0x0A2E,
   21279   mahapakhhebrew: 0x05A4,
   21280   mahapakhlefthebrew: 0x05A4,
   21281   mahiragana: 0x307E,
   21282   maichattawalowleftthai: 0xF895,
   21283   maichattawalowrightthai: 0xF894,
   21284   maichattawathai: 0x0E4B,
   21285   maichattawaupperleftthai: 0xF893,
   21286   maieklowleftthai: 0xF88C,
   21287   maieklowrightthai: 0xF88B,
   21288   maiekthai: 0x0E48,
   21289   maiekupperleftthai: 0xF88A,
   21290   maihanakatleftthai: 0xF884,
   21291   maihanakatthai: 0x0E31,
   21292   maitaikhuleftthai: 0xF889,
   21293   maitaikhuthai: 0x0E47,
   21294   maitholowleftthai: 0xF88F,
   21295   maitholowrightthai: 0xF88E,
   21296   maithothai: 0x0E49,
   21297   maithoupperleftthai: 0xF88D,
   21298   maitrilowleftthai: 0xF892,
   21299   maitrilowrightthai: 0xF891,
   21300   maitrithai: 0x0E4A,
   21301   maitriupperleftthai: 0xF890,
   21302   maiyamokthai: 0x0E46,
   21303   makatakana: 0x30DE,
   21304   makatakanahalfwidth: 0xFF8F,
   21305   male: 0x2642,
   21306   mansyonsquare: 0x3347,
   21307   maqafhebrew: 0x05BE,
   21308   mars: 0x2642,
   21309   masoracirclehebrew: 0x05AF,
   21310   masquare: 0x3383,
   21311   mbopomofo: 0x3107,
   21312   mbsquare: 0x33D4,
   21313   mcircle: 0x24DC,
   21314   mcubedsquare: 0x33A5,
   21315   mdotaccent: 0x1E41,
   21316   mdotbelow: 0x1E43,
   21317   meemarabic: 0x0645,
   21318   meemfinalarabic: 0xFEE2,
   21319   meeminitialarabic: 0xFEE3,
   21320   meemmedialarabic: 0xFEE4,
   21321   meemmeeminitialarabic: 0xFCD1,
   21322   meemmeemisolatedarabic: 0xFC48,
   21323   meetorusquare: 0x334D,
   21324   mehiragana: 0x3081,
   21325   meizierasquare: 0x337E,
   21326   mekatakana: 0x30E1,
   21327   mekatakanahalfwidth: 0xFF92,
   21328   mem: 0x05DE,
   21329   memdagesh: 0xFB3E,
   21330   memdageshhebrew: 0xFB3E,
   21331   memhebrew: 0x05DE,
   21332   menarmenian: 0x0574,
   21333   merkhahebrew: 0x05A5,
   21334   merkhakefulahebrew: 0x05A6,
   21335   merkhakefulalefthebrew: 0x05A6,
   21336   merkhalefthebrew: 0x05A5,
   21337   mhook: 0x0271,
   21338   mhzsquare: 0x3392,
   21339   middledotkatakanahalfwidth: 0xFF65,
   21340   middot: 0x00B7,
   21341   mieumacirclekorean: 0x3272,
   21342   mieumaparenkorean: 0x3212,
   21343   mieumcirclekorean: 0x3264,
   21344   mieumkorean: 0x3141,
   21345   mieumpansioskorean: 0x3170,
   21346   mieumparenkorean: 0x3204,
   21347   mieumpieupkorean: 0x316E,
   21348   mieumsioskorean: 0x316F,
   21349   mihiragana: 0x307F,
   21350   mikatakana: 0x30DF,
   21351   mikatakanahalfwidth: 0xFF90,
   21352   minus: 0x2212,
   21353   minusbelowcmb: 0x0320,
   21354   minuscircle: 0x2296,
   21355   minusmod: 0x02D7,
   21356   minusplus: 0x2213,
   21357   minute: 0x2032,
   21358   miribaarusquare: 0x334A,
   21359   mirisquare: 0x3349,
   21360   mlonglegturned: 0x0270,
   21361   mlsquare: 0x3396,
   21362   mmcubedsquare: 0x33A3,
   21363   mmonospace: 0xFF4D,
   21364   mmsquaredsquare: 0x339F,
   21365   mohiragana: 0x3082,
   21366   mohmsquare: 0x33C1,
   21367   mokatakana: 0x30E2,
   21368   mokatakanahalfwidth: 0xFF93,
   21369   molsquare: 0x33D6,
   21370   momathai: 0x0E21,
   21371   moverssquare: 0x33A7,
   21372   moverssquaredsquare: 0x33A8,
   21373   mparen: 0x24A8,
   21374   mpasquare: 0x33AB,
   21375   mssquare: 0x33B3,
   21376   msuperior: 0xF6EF,
   21377   mturned: 0x026F,
   21378   mu: 0x00B5,
   21379   mu1: 0x00B5,
   21380   muasquare: 0x3382,
   21381   muchgreater: 0x226B,
   21382   muchless: 0x226A,
   21383   mufsquare: 0x338C,
   21384   mugreek: 0x03BC,
   21385   mugsquare: 0x338D,
   21386   muhiragana: 0x3080,
   21387   mukatakana: 0x30E0,
   21388   mukatakanahalfwidth: 0xFF91,
   21389   mulsquare: 0x3395,
   21390   multiply: 0x00D7,
   21391   mumsquare: 0x339B,
   21392   munahhebrew: 0x05A3,
   21393   munahlefthebrew: 0x05A3,
   21394   musicalnote: 0x266A,
   21395   musicalnotedbl: 0x266B,
   21396   musicflatsign: 0x266D,
   21397   musicsharpsign: 0x266F,
   21398   mussquare: 0x33B2,
   21399   muvsquare: 0x33B6,
   21400   muwsquare: 0x33BC,
   21401   mvmegasquare: 0x33B9,
   21402   mvsquare: 0x33B7,
   21403   mwmegasquare: 0x33BF,
   21404   mwsquare: 0x33BD,
   21405   n: 0x006E,
   21406   nabengali: 0x09A8,
   21407   nabla: 0x2207,
   21408   nacute: 0x0144,
   21409   nadeva: 0x0928,
   21410   nagujarati: 0x0AA8,
   21411   nagurmukhi: 0x0A28,
   21412   nahiragana: 0x306A,
   21413   nakatakana: 0x30CA,
   21414   nakatakanahalfwidth: 0xFF85,
   21415   napostrophe: 0x0149,
   21416   nasquare: 0x3381,
   21417   nbopomofo: 0x310B,
   21418   nbspace: 0x00A0,
   21419   ncaron: 0x0148,
   21420   ncedilla: 0x0146,
   21421   ncircle: 0x24DD,
   21422   ncircumflexbelow: 0x1E4B,
   21423   ncommaaccent: 0x0146,
   21424   ndotaccent: 0x1E45,
   21425   ndotbelow: 0x1E47,
   21426   nehiragana: 0x306D,
   21427   nekatakana: 0x30CD,
   21428   nekatakanahalfwidth: 0xFF88,
   21429   newsheqelsign: 0x20AA,
   21430   nfsquare: 0x338B,
   21431   ngabengali: 0x0999,
   21432   ngadeva: 0x0919,
   21433   ngagujarati: 0x0A99,
   21434   ngagurmukhi: 0x0A19,
   21435   ngonguthai: 0x0E07,
   21436   nhiragana: 0x3093,
   21437   nhookleft: 0x0272,
   21438   nhookretroflex: 0x0273,
   21439   nieunacirclekorean: 0x326F,
   21440   nieunaparenkorean: 0x320F,
   21441   nieuncieuckorean: 0x3135,
   21442   nieuncirclekorean: 0x3261,
   21443   nieunhieuhkorean: 0x3136,
   21444   nieunkorean: 0x3134,
   21445   nieunpansioskorean: 0x3168,
   21446   nieunparenkorean: 0x3201,
   21447   nieunsioskorean: 0x3167,
   21448   nieuntikeutkorean: 0x3166,
   21449   nihiragana: 0x306B,
   21450   nikatakana: 0x30CB,
   21451   nikatakanahalfwidth: 0xFF86,
   21452   nikhahitleftthai: 0xF899,
   21453   nikhahitthai: 0x0E4D,
   21454   nine: 0x0039,
   21455   ninearabic: 0x0669,
   21456   ninebengali: 0x09EF,
   21457   ninecircle: 0x2468,
   21458   ninecircleinversesansserif: 0x2792,
   21459   ninedeva: 0x096F,
   21460   ninegujarati: 0x0AEF,
   21461   ninegurmukhi: 0x0A6F,
   21462   ninehackarabic: 0x0669,
   21463   ninehangzhou: 0x3029,
   21464   nineideographicparen: 0x3228,
   21465   nineinferior: 0x2089,
   21466   ninemonospace: 0xFF19,
   21467   nineoldstyle: 0xF739,
   21468   nineparen: 0x247C,
   21469   nineperiod: 0x2490,
   21470   ninepersian: 0x06F9,
   21471   nineroman: 0x2178,
   21472   ninesuperior: 0x2079,
   21473   nineteencircle: 0x2472,
   21474   nineteenparen: 0x2486,
   21475   nineteenperiod: 0x249A,
   21476   ninethai: 0x0E59,
   21477   nj: 0x01CC,
   21478   njecyrillic: 0x045A,
   21479   nkatakana: 0x30F3,
   21480   nkatakanahalfwidth: 0xFF9D,
   21481   nlegrightlong: 0x019E,
   21482   nlinebelow: 0x1E49,
   21483   nmonospace: 0xFF4E,
   21484   nmsquare: 0x339A,
   21485   nnabengali: 0x09A3,
   21486   nnadeva: 0x0923,
   21487   nnagujarati: 0x0AA3,
   21488   nnagurmukhi: 0x0A23,
   21489   nnnadeva: 0x0929,
   21490   nohiragana: 0x306E,
   21491   nokatakana: 0x30CE,
   21492   nokatakanahalfwidth: 0xFF89,
   21493   nonbreakingspace: 0x00A0,
   21494   nonenthai: 0x0E13,
   21495   nonuthai: 0x0E19,
   21496   noonarabic: 0x0646,
   21497   noonfinalarabic: 0xFEE6,
   21498   noonghunnaarabic: 0x06BA,
   21499   noonghunnafinalarabic: 0xFB9F,
   21500   nooninitialarabic: 0xFEE7,
   21501   noonjeeminitialarabic: 0xFCD2,
   21502   noonjeemisolatedarabic: 0xFC4B,
   21503   noonmedialarabic: 0xFEE8,
   21504   noonmeeminitialarabic: 0xFCD5,
   21505   noonmeemisolatedarabic: 0xFC4E,
   21506   noonnoonfinalarabic: 0xFC8D,
   21507   notcontains: 0x220C,
   21508   notelement: 0x2209,
   21509   notelementof: 0x2209,
   21510   notequal: 0x2260,
   21511   notgreater: 0x226F,
   21512   notgreaternorequal: 0x2271,
   21513   notgreaternorless: 0x2279,
   21514   notidentical: 0x2262,
   21515   notless: 0x226E,
   21516   notlessnorequal: 0x2270,
   21517   notparallel: 0x2226,
   21518   notprecedes: 0x2280,
   21519   notsubset: 0x2284,
   21520   notsucceeds: 0x2281,
   21521   notsuperset: 0x2285,
   21522   nowarmenian: 0x0576,
   21523   nparen: 0x24A9,
   21524   nssquare: 0x33B1,
   21525   nsuperior: 0x207F,
   21526   ntilde: 0x00F1,
   21527   nu: 0x03BD,
   21528   nuhiragana: 0x306C,
   21529   nukatakana: 0x30CC,
   21530   nukatakanahalfwidth: 0xFF87,
   21531   nuktabengali: 0x09BC,
   21532   nuktadeva: 0x093C,
   21533   nuktagujarati: 0x0ABC,
   21534   nuktagurmukhi: 0x0A3C,
   21535   numbersign: 0x0023,
   21536   numbersignmonospace: 0xFF03,
   21537   numbersignsmall: 0xFE5F,
   21538   numeralsigngreek: 0x0374,
   21539   numeralsignlowergreek: 0x0375,
   21540   numero: 0x2116,
   21541   nun: 0x05E0,
   21542   nundagesh: 0xFB40,
   21543   nundageshhebrew: 0xFB40,
   21544   nunhebrew: 0x05E0,
   21545   nvsquare: 0x33B5,
   21546   nwsquare: 0x33BB,
   21547   nyabengali: 0x099E,
   21548   nyadeva: 0x091E,
   21549   nyagujarati: 0x0A9E,
   21550   nyagurmukhi: 0x0A1E,
   21551   o: 0x006F,
   21552   oacute: 0x00F3,
   21553   oangthai: 0x0E2D,
   21554   obarred: 0x0275,
   21555   obarredcyrillic: 0x04E9,
   21556   obarreddieresiscyrillic: 0x04EB,
   21557   obengali: 0x0993,
   21558   obopomofo: 0x311B,
   21559   obreve: 0x014F,
   21560   ocandradeva: 0x0911,
   21561   ocandragujarati: 0x0A91,
   21562   ocandravowelsigndeva: 0x0949,
   21563   ocandravowelsigngujarati: 0x0AC9,
   21564   ocaron: 0x01D2,
   21565   ocircle: 0x24DE,
   21566   ocircumflex: 0x00F4,
   21567   ocircumflexacute: 0x1ED1,
   21568   ocircumflexdotbelow: 0x1ED9,
   21569   ocircumflexgrave: 0x1ED3,
   21570   ocircumflexhookabove: 0x1ED5,
   21571   ocircumflextilde: 0x1ED7,
   21572   ocyrillic: 0x043E,
   21573   odblacute: 0x0151,
   21574   odblgrave: 0x020D,
   21575   odeva: 0x0913,
   21576   odieresis: 0x00F6,
   21577   odieresiscyrillic: 0x04E7,
   21578   odotbelow: 0x1ECD,
   21579   oe: 0x0153,
   21580   oekorean: 0x315A,
   21581   ogonek: 0x02DB,
   21582   ogonekcmb: 0x0328,
   21583   ograve: 0x00F2,
   21584   ogujarati: 0x0A93,
   21585   oharmenian: 0x0585,
   21586   ohiragana: 0x304A,
   21587   ohookabove: 0x1ECF,
   21588   ohorn: 0x01A1,
   21589   ohornacute: 0x1EDB,
   21590   ohorndotbelow: 0x1EE3,
   21591   ohorngrave: 0x1EDD,
   21592   ohornhookabove: 0x1EDF,
   21593   ohorntilde: 0x1EE1,
   21594   ohungarumlaut: 0x0151,
   21595   oi: 0x01A3,
   21596   oinvertedbreve: 0x020F,
   21597   okatakana: 0x30AA,
   21598   okatakanahalfwidth: 0xFF75,
   21599   okorean: 0x3157,
   21600   olehebrew: 0x05AB,
   21601   omacron: 0x014D,
   21602   omacronacute: 0x1E53,
   21603   omacrongrave: 0x1E51,
   21604   omdeva: 0x0950,
   21605   omega: 0x03C9,
   21606   omega1: 0x03D6,
   21607   omegacyrillic: 0x0461,
   21608   omegalatinclosed: 0x0277,
   21609   omegaroundcyrillic: 0x047B,
   21610   omegatitlocyrillic: 0x047D,
   21611   omegatonos: 0x03CE,
   21612   omgujarati: 0x0AD0,
   21613   omicron: 0x03BF,
   21614   omicrontonos: 0x03CC,
   21615   omonospace: 0xFF4F,
   21616   one: 0x0031,
   21617   onearabic: 0x0661,
   21618   onebengali: 0x09E7,
   21619   onecircle: 0x2460,
   21620   onecircleinversesansserif: 0x278A,
   21621   onedeva: 0x0967,
   21622   onedotenleader: 0x2024,
   21623   oneeighth: 0x215B,
   21624   onefitted: 0xF6DC,
   21625   onegujarati: 0x0AE7,
   21626   onegurmukhi: 0x0A67,
   21627   onehackarabic: 0x0661,
   21628   onehalf: 0x00BD,
   21629   onehangzhou: 0x3021,
   21630   oneideographicparen: 0x3220,
   21631   oneinferior: 0x2081,
   21632   onemonospace: 0xFF11,
   21633   onenumeratorbengali: 0x09F4,
   21634   oneoldstyle: 0xF731,
   21635   oneparen: 0x2474,
   21636   oneperiod: 0x2488,
   21637   onepersian: 0x06F1,
   21638   onequarter: 0x00BC,
   21639   oneroman: 0x2170,
   21640   onesuperior: 0x00B9,
   21641   onethai: 0x0E51,
   21642   onethird: 0x2153,
   21643   oogonek: 0x01EB,
   21644   oogonekmacron: 0x01ED,
   21645   oogurmukhi: 0x0A13,
   21646   oomatragurmukhi: 0x0A4B,
   21647   oopen: 0x0254,
   21648   oparen: 0x24AA,
   21649   openbullet: 0x25E6,
   21650   option: 0x2325,
   21651   ordfeminine: 0x00AA,
   21652   ordmasculine: 0x00BA,
   21653   orthogonal: 0x221F,
   21654   oshortdeva: 0x0912,
   21655   oshortvowelsigndeva: 0x094A,
   21656   oslash: 0x00F8,
   21657   oslashacute: 0x01FF,
   21658   osmallhiragana: 0x3049,
   21659   osmallkatakana: 0x30A9,
   21660   osmallkatakanahalfwidth: 0xFF6B,
   21661   ostrokeacute: 0x01FF,
   21662   osuperior: 0xF6F0,
   21663   otcyrillic: 0x047F,
   21664   otilde: 0x00F5,
   21665   otildeacute: 0x1E4D,
   21666   otildedieresis: 0x1E4F,
   21667   oubopomofo: 0x3121,
   21668   overline: 0x203E,
   21669   overlinecenterline: 0xFE4A,
   21670   overlinecmb: 0x0305,
   21671   overlinedashed: 0xFE49,
   21672   overlinedblwavy: 0xFE4C,
   21673   overlinewavy: 0xFE4B,
   21674   overscore: 0x00AF,
   21675   ovowelsignbengali: 0x09CB,
   21676   ovowelsigndeva: 0x094B,
   21677   ovowelsigngujarati: 0x0ACB,
   21678   p: 0x0070,
   21679   paampssquare: 0x3380,
   21680   paasentosquare: 0x332B,
   21681   pabengali: 0x09AA,
   21682   pacute: 0x1E55,
   21683   padeva: 0x092A,
   21684   pagedown: 0x21DF,
   21685   pageup: 0x21DE,
   21686   pagujarati: 0x0AAA,
   21687   pagurmukhi: 0x0A2A,
   21688   pahiragana: 0x3071,
   21689   paiyannoithai: 0x0E2F,
   21690   pakatakana: 0x30D1,
   21691   palatalizationcyrilliccmb: 0x0484,
   21692   palochkacyrillic: 0x04C0,
   21693   pansioskorean: 0x317F,
   21694   paragraph: 0x00B6,
   21695   parallel: 0x2225,
   21696   parenleft: 0x0028,
   21697   parenleftaltonearabic: 0xFD3E,
   21698   parenleftbt: 0xF8ED,
   21699   parenleftex: 0xF8EC,
   21700   parenleftinferior: 0x208D,
   21701   parenleftmonospace: 0xFF08,
   21702   parenleftsmall: 0xFE59,
   21703   parenleftsuperior: 0x207D,
   21704   parenlefttp: 0xF8EB,
   21705   parenleftvertical: 0xFE35,
   21706   parenright: 0x0029,
   21707   parenrightaltonearabic: 0xFD3F,
   21708   parenrightbt: 0xF8F8,
   21709   parenrightex: 0xF8F7,
   21710   parenrightinferior: 0x208E,
   21711   parenrightmonospace: 0xFF09,
   21712   parenrightsmall: 0xFE5A,
   21713   parenrightsuperior: 0x207E,
   21714   parenrighttp: 0xF8F6,
   21715   parenrightvertical: 0xFE36,
   21716   partialdiff: 0x2202,
   21717   paseqhebrew: 0x05C0,
   21718   pashtahebrew: 0x0599,
   21719   pasquare: 0x33A9,
   21720   patah: 0x05B7,
   21721   patah11: 0x05B7,
   21722   patah1d: 0x05B7,
   21723   patah2a: 0x05B7,
   21724   patahhebrew: 0x05B7,
   21725   patahnarrowhebrew: 0x05B7,
   21726   patahquarterhebrew: 0x05B7,
   21727   patahwidehebrew: 0x05B7,
   21728   pazerhebrew: 0x05A1,
   21729   pbopomofo: 0x3106,
   21730   pcircle: 0x24DF,
   21731   pdotaccent: 0x1E57,
   21732   pe: 0x05E4,
   21733   pecyrillic: 0x043F,
   21734   pedagesh: 0xFB44,
   21735   pedageshhebrew: 0xFB44,
   21736   peezisquare: 0x333B,
   21737   pefinaldageshhebrew: 0xFB43,
   21738   peharabic: 0x067E,
   21739   peharmenian: 0x057A,
   21740   pehebrew: 0x05E4,
   21741   pehfinalarabic: 0xFB57,
   21742   pehinitialarabic: 0xFB58,
   21743   pehiragana: 0x307A,
   21744   pehmedialarabic: 0xFB59,
   21745   pekatakana: 0x30DA,
   21746   pemiddlehookcyrillic: 0x04A7,
   21747   perafehebrew: 0xFB4E,
   21748   percent: 0x0025,
   21749   percentarabic: 0x066A,
   21750   percentmonospace: 0xFF05,
   21751   percentsmall: 0xFE6A,
   21752   period: 0x002E,
   21753   periodarmenian: 0x0589,
   21754   periodcentered: 0x00B7,
   21755   periodhalfwidth: 0xFF61,
   21756   periodinferior: 0xF6E7,
   21757   periodmonospace: 0xFF0E,
   21758   periodsmall: 0xFE52,
   21759   periodsuperior: 0xF6E8,
   21760   perispomenigreekcmb: 0x0342,
   21761   perpendicular: 0x22A5,
   21762   perthousand: 0x2030,
   21763   peseta: 0x20A7,
   21764   pfsquare: 0x338A,
   21765   phabengali: 0x09AB,
   21766   phadeva: 0x092B,
   21767   phagujarati: 0x0AAB,
   21768   phagurmukhi: 0x0A2B,
   21769   phi: 0x03C6,
   21770   phi1: 0x03D5,
   21771   phieuphacirclekorean: 0x327A,
   21772   phieuphaparenkorean: 0x321A,
   21773   phieuphcirclekorean: 0x326C,
   21774   phieuphkorean: 0x314D,
   21775   phieuphparenkorean: 0x320C,
   21776   philatin: 0x0278,
   21777   phinthuthai: 0x0E3A,
   21778   phisymbolgreek: 0x03D5,
   21779   phook: 0x01A5,
   21780   phophanthai: 0x0E1E,
   21781   phophungthai: 0x0E1C,
   21782   phosamphaothai: 0x0E20,
   21783   pi: 0x03C0,
   21784   pieupacirclekorean: 0x3273,
   21785   pieupaparenkorean: 0x3213,
   21786   pieupcieuckorean: 0x3176,
   21787   pieupcirclekorean: 0x3265,
   21788   pieupkiyeokkorean: 0x3172,
   21789   pieupkorean: 0x3142,
   21790   pieupparenkorean: 0x3205,
   21791   pieupsioskiyeokkorean: 0x3174,
   21792   pieupsioskorean: 0x3144,
   21793   pieupsiostikeutkorean: 0x3175,
   21794   pieupthieuthkorean: 0x3177,
   21795   pieuptikeutkorean: 0x3173,
   21796   pihiragana: 0x3074,
   21797   pikatakana: 0x30D4,
   21798   pisymbolgreek: 0x03D6,
   21799   piwrarmenian: 0x0583,
   21800   plus: 0x002B,
   21801   plusbelowcmb: 0x031F,
   21802   pluscircle: 0x2295,
   21803   plusminus: 0x00B1,
   21804   plusmod: 0x02D6,
   21805   plusmonospace: 0xFF0B,
   21806   plussmall: 0xFE62,
   21807   plussuperior: 0x207A,
   21808   pmonospace: 0xFF50,
   21809   pmsquare: 0x33D8,
   21810   pohiragana: 0x307D,
   21811   pointingindexdownwhite: 0x261F,
   21812   pointingindexleftwhite: 0x261C,
   21813   pointingindexrightwhite: 0x261E,
   21814   pointingindexupwhite: 0x261D,
   21815   pokatakana: 0x30DD,
   21816   poplathai: 0x0E1B,
   21817   postalmark: 0x3012,
   21818   postalmarkface: 0x3020,
   21819   pparen: 0x24AB,
   21820   precedes: 0x227A,
   21821   prescription: 0x211E,
   21822   primemod: 0x02B9,
   21823   primereversed: 0x2035,
   21824   product: 0x220F,
   21825   projective: 0x2305,
   21826   prolongedkana: 0x30FC,
   21827   propellor: 0x2318,
   21828   propersubset: 0x2282,
   21829   propersuperset: 0x2283,
   21830   proportion: 0x2237,
   21831   proportional: 0x221D,
   21832   psi: 0x03C8,
   21833   psicyrillic: 0x0471,
   21834   psilipneumatacyrilliccmb: 0x0486,
   21835   pssquare: 0x33B0,
   21836   puhiragana: 0x3077,
   21837   pukatakana: 0x30D7,
   21838   pvsquare: 0x33B4,
   21839   pwsquare: 0x33BA,
   21840   q: 0x0071,
   21841   qadeva: 0x0958,
   21842   qadmahebrew: 0x05A8,
   21843   qafarabic: 0x0642,
   21844   qaffinalarabic: 0xFED6,
   21845   qafinitialarabic: 0xFED7,
   21846   qafmedialarabic: 0xFED8,
   21847   qamats: 0x05B8,
   21848   qamats10: 0x05B8,
   21849   qamats1a: 0x05B8,
   21850   qamats1c: 0x05B8,
   21851   qamats27: 0x05B8,
   21852   qamats29: 0x05B8,
   21853   qamats33: 0x05B8,
   21854   qamatsde: 0x05B8,
   21855   qamatshebrew: 0x05B8,
   21856   qamatsnarrowhebrew: 0x05B8,
   21857   qamatsqatanhebrew: 0x05B8,
   21858   qamatsqatannarrowhebrew: 0x05B8,
   21859   qamatsqatanquarterhebrew: 0x05B8,
   21860   qamatsqatanwidehebrew: 0x05B8,
   21861   qamatsquarterhebrew: 0x05B8,
   21862   qamatswidehebrew: 0x05B8,
   21863   qarneyparahebrew: 0x059F,
   21864   qbopomofo: 0x3111,
   21865   qcircle: 0x24E0,
   21866   qhook: 0x02A0,
   21867   qmonospace: 0xFF51,
   21868   qof: 0x05E7,
   21869   qofdagesh: 0xFB47,
   21870   qofdageshhebrew: 0xFB47,
   21871   qofhebrew: 0x05E7,
   21872   qparen: 0x24AC,
   21873   quarternote: 0x2669,
   21874   qubuts: 0x05BB,
   21875   qubuts18: 0x05BB,
   21876   qubuts25: 0x05BB,
   21877   qubuts31: 0x05BB,
   21878   qubutshebrew: 0x05BB,
   21879   qubutsnarrowhebrew: 0x05BB,
   21880   qubutsquarterhebrew: 0x05BB,
   21881   qubutswidehebrew: 0x05BB,
   21882   question: 0x003F,
   21883   questionarabic: 0x061F,
   21884   questionarmenian: 0x055E,
   21885   questiondown: 0x00BF,
   21886   questiondownsmall: 0xF7BF,
   21887   questiongreek: 0x037E,
   21888   questionmonospace: 0xFF1F,
   21889   questionsmall: 0xF73F,
   21890   quotedbl: 0x0022,
   21891   quotedblbase: 0x201E,
   21892   quotedblleft: 0x201C,
   21893   quotedblmonospace: 0xFF02,
   21894   quotedblprime: 0x301E,
   21895   quotedblprimereversed: 0x301D,
   21896   quotedblright: 0x201D,
   21897   quoteleft: 0x2018,
   21898   quoteleftreversed: 0x201B,
   21899   quotereversed: 0x201B,
   21900   quoteright: 0x2019,
   21901   quoterightn: 0x0149,
   21902   quotesinglbase: 0x201A,
   21903   quotesingle: 0x0027,
   21904   quotesinglemonospace: 0xFF07,
   21905   r: 0x0072,
   21906   raarmenian: 0x057C,
   21907   rabengali: 0x09B0,
   21908   racute: 0x0155,
   21909   radeva: 0x0930,
   21910   radical: 0x221A,
   21911   radicalex: 0xF8E5,
   21912   radoverssquare: 0x33AE,
   21913   radoverssquaredsquare: 0x33AF,
   21914   radsquare: 0x33AD,
   21915   rafe: 0x05BF,
   21916   rafehebrew: 0x05BF,
   21917   ragujarati: 0x0AB0,
   21918   ragurmukhi: 0x0A30,
   21919   rahiragana: 0x3089,
   21920   rakatakana: 0x30E9,
   21921   rakatakanahalfwidth: 0xFF97,
   21922   ralowerdiagonalbengali: 0x09F1,
   21923   ramiddlediagonalbengali: 0x09F0,
   21924   ramshorn: 0x0264,
   21925   ratio: 0x2236,
   21926   rbopomofo: 0x3116,
   21927   rcaron: 0x0159,
   21928   rcedilla: 0x0157,
   21929   rcircle: 0x24E1,
   21930   rcommaaccent: 0x0157,
   21931   rdblgrave: 0x0211,
   21932   rdotaccent: 0x1E59,
   21933   rdotbelow: 0x1E5B,
   21934   rdotbelowmacron: 0x1E5D,
   21935   referencemark: 0x203B,
   21936   reflexsubset: 0x2286,
   21937   reflexsuperset: 0x2287,
   21938   registered: 0x00AE,
   21939   registersans: 0xF8E8,
   21940   registerserif: 0xF6DA,
   21941   reharabic: 0x0631,
   21942   reharmenian: 0x0580,
   21943   rehfinalarabic: 0xFEAE,
   21944   rehiragana: 0x308C,
   21945   rekatakana: 0x30EC,
   21946   rekatakanahalfwidth: 0xFF9A,
   21947   resh: 0x05E8,
   21948   reshdageshhebrew: 0xFB48,
   21949   reshhebrew: 0x05E8,
   21950   reversedtilde: 0x223D,
   21951   reviahebrew: 0x0597,
   21952   reviamugrashhebrew: 0x0597,
   21953   revlogicalnot: 0x2310,
   21954   rfishhook: 0x027E,
   21955   rfishhookreversed: 0x027F,
   21956   rhabengali: 0x09DD,
   21957   rhadeva: 0x095D,
   21958   rho: 0x03C1,
   21959   rhook: 0x027D,
   21960   rhookturned: 0x027B,
   21961   rhookturnedsuperior: 0x02B5,
   21962   rhosymbolgreek: 0x03F1,
   21963   rhotichookmod: 0x02DE,
   21964   rieulacirclekorean: 0x3271,
   21965   rieulaparenkorean: 0x3211,
   21966   rieulcirclekorean: 0x3263,
   21967   rieulhieuhkorean: 0x3140,
   21968   rieulkiyeokkorean: 0x313A,
   21969   rieulkiyeoksioskorean: 0x3169,
   21970   rieulkorean: 0x3139,
   21971   rieulmieumkorean: 0x313B,
   21972   rieulpansioskorean: 0x316C,
   21973   rieulparenkorean: 0x3203,
   21974   rieulphieuphkorean: 0x313F,
   21975   rieulpieupkorean: 0x313C,
   21976   rieulpieupsioskorean: 0x316B,
   21977   rieulsioskorean: 0x313D,
   21978   rieulthieuthkorean: 0x313E,
   21979   rieultikeutkorean: 0x316A,
   21980   rieulyeorinhieuhkorean: 0x316D,
   21981   rightangle: 0x221F,
   21982   righttackbelowcmb: 0x0319,
   21983   righttriangle: 0x22BF,
   21984   rihiragana: 0x308A,
   21985   rikatakana: 0x30EA,
   21986   rikatakanahalfwidth: 0xFF98,
   21987   ring: 0x02DA,
   21988   ringbelowcmb: 0x0325,
   21989   ringcmb: 0x030A,
   21990   ringhalfleft: 0x02BF,
   21991   ringhalfleftarmenian: 0x0559,
   21992   ringhalfleftbelowcmb: 0x031C,
   21993   ringhalfleftcentered: 0x02D3,
   21994   ringhalfright: 0x02BE,
   21995   ringhalfrightbelowcmb: 0x0339,
   21996   ringhalfrightcentered: 0x02D2,
   21997   rinvertedbreve: 0x0213,
   21998   rittorusquare: 0x3351,
   21999   rlinebelow: 0x1E5F,
   22000   rlongleg: 0x027C,
   22001   rlonglegturned: 0x027A,
   22002   rmonospace: 0xFF52,
   22003   rohiragana: 0x308D,
   22004   rokatakana: 0x30ED,
   22005   rokatakanahalfwidth: 0xFF9B,
   22006   roruathai: 0x0E23,
   22007   rparen: 0x24AD,
   22008   rrabengali: 0x09DC,
   22009   rradeva: 0x0931,
   22010   rragurmukhi: 0x0A5C,
   22011   rreharabic: 0x0691,
   22012   rrehfinalarabic: 0xFB8D,
   22013   rrvocalicbengali: 0x09E0,
   22014   rrvocalicdeva: 0x0960,
   22015   rrvocalicgujarati: 0x0AE0,
   22016   rrvocalicvowelsignbengali: 0x09C4,
   22017   rrvocalicvowelsigndeva: 0x0944,
   22018   rrvocalicvowelsigngujarati: 0x0AC4,
   22019   rsuperior: 0xF6F1,
   22020   rtblock: 0x2590,
   22021   rturned: 0x0279,
   22022   rturnedsuperior: 0x02B4,
   22023   ruhiragana: 0x308B,
   22024   rukatakana: 0x30EB,
   22025   rukatakanahalfwidth: 0xFF99,
   22026   rupeemarkbengali: 0x09F2,
   22027   rupeesignbengali: 0x09F3,
   22028   rupiah: 0xF6DD,
   22029   ruthai: 0x0E24,
   22030   rvocalicbengali: 0x098B,
   22031   rvocalicdeva: 0x090B,
   22032   rvocalicgujarati: 0x0A8B,
   22033   rvocalicvowelsignbengali: 0x09C3,
   22034   rvocalicvowelsigndeva: 0x0943,
   22035   rvocalicvowelsigngujarati: 0x0AC3,
   22036   s: 0x0073,
   22037   sabengali: 0x09B8,
   22038   sacute: 0x015B,
   22039   sacutedotaccent: 0x1E65,
   22040   sadarabic: 0x0635,
   22041   sadeva: 0x0938,
   22042   sadfinalarabic: 0xFEBA,
   22043   sadinitialarabic: 0xFEBB,
   22044   sadmedialarabic: 0xFEBC,
   22045   sagujarati: 0x0AB8,
   22046   sagurmukhi: 0x0A38,
   22047   sahiragana: 0x3055,
   22048   sakatakana: 0x30B5,
   22049   sakatakanahalfwidth: 0xFF7B,
   22050   sallallahoualayhewasallamarabic: 0xFDFA,
   22051   samekh: 0x05E1,
   22052   samekhdagesh: 0xFB41,
   22053   samekhdageshhebrew: 0xFB41,
   22054   samekhhebrew: 0x05E1,
   22055   saraaathai: 0x0E32,
   22056   saraaethai: 0x0E41,
   22057   saraaimaimalaithai: 0x0E44,
   22058   saraaimaimuanthai: 0x0E43,
   22059   saraamthai: 0x0E33,
   22060   saraathai: 0x0E30,
   22061   saraethai: 0x0E40,
   22062   saraiileftthai: 0xF886,
   22063   saraiithai: 0x0E35,
   22064   saraileftthai: 0xF885,
   22065   saraithai: 0x0E34,
   22066   saraothai: 0x0E42,
   22067   saraueeleftthai: 0xF888,
   22068   saraueethai: 0x0E37,
   22069   saraueleftthai: 0xF887,
   22070   sarauethai: 0x0E36,
   22071   sarauthai: 0x0E38,
   22072   sarauuthai: 0x0E39,
   22073   sbopomofo: 0x3119,
   22074   scaron: 0x0161,
   22075   scarondotaccent: 0x1E67,
   22076   scedilla: 0x015F,
   22077   schwa: 0x0259,
   22078   schwacyrillic: 0x04D9,
   22079   schwadieresiscyrillic: 0x04DB,
   22080   schwahook: 0x025A,
   22081   scircle: 0x24E2,
   22082   scircumflex: 0x015D,
   22083   scommaaccent: 0x0219,
   22084   sdotaccent: 0x1E61,
   22085   sdotbelow: 0x1E63,
   22086   sdotbelowdotaccent: 0x1E69,
   22087   seagullbelowcmb: 0x033C,
   22088   second: 0x2033,
   22089   secondtonechinese: 0x02CA,
   22090   section: 0x00A7,
   22091   seenarabic: 0x0633,
   22092   seenfinalarabic: 0xFEB2,
   22093   seeninitialarabic: 0xFEB3,
   22094   seenmedialarabic: 0xFEB4,
   22095   segol: 0x05B6,
   22096   segol13: 0x05B6,
   22097   segol1f: 0x05B6,
   22098   segol2c: 0x05B6,
   22099   segolhebrew: 0x05B6,
   22100   segolnarrowhebrew: 0x05B6,
   22101   segolquarterhebrew: 0x05B6,
   22102   segoltahebrew: 0x0592,
   22103   segolwidehebrew: 0x05B6,
   22104   seharmenian: 0x057D,
   22105   sehiragana: 0x305B,
   22106   sekatakana: 0x30BB,
   22107   sekatakanahalfwidth: 0xFF7E,
   22108   semicolon: 0x003B,
   22109   semicolonarabic: 0x061B,
   22110   semicolonmonospace: 0xFF1B,
   22111   semicolonsmall: 0xFE54,
   22112   semivoicedmarkkana: 0x309C,
   22113   semivoicedmarkkanahalfwidth: 0xFF9F,
   22114   sentisquare: 0x3322,
   22115   sentosquare: 0x3323,
   22116   seven: 0x0037,
   22117   sevenarabic: 0x0667,
   22118   sevenbengali: 0x09ED,
   22119   sevencircle: 0x2466,
   22120   sevencircleinversesansserif: 0x2790,
   22121   sevendeva: 0x096D,
   22122   seveneighths: 0x215E,
   22123   sevengujarati: 0x0AED,
   22124   sevengurmukhi: 0x0A6D,
   22125   sevenhackarabic: 0x0667,
   22126   sevenhangzhou: 0x3027,
   22127   sevenideographicparen: 0x3226,
   22128   seveninferior: 0x2087,
   22129   sevenmonospace: 0xFF17,
   22130   sevenoldstyle: 0xF737,
   22131   sevenparen: 0x247A,
   22132   sevenperiod: 0x248E,
   22133   sevenpersian: 0x06F7,
   22134   sevenroman: 0x2176,
   22135   sevensuperior: 0x2077,
   22136   seventeencircle: 0x2470,
   22137   seventeenparen: 0x2484,
   22138   seventeenperiod: 0x2498,
   22139   seventhai: 0x0E57,
   22140   sfthyphen: 0x00AD,
   22141   shaarmenian: 0x0577,
   22142   shabengali: 0x09B6,
   22143   shacyrillic: 0x0448,
   22144   shaddaarabic: 0x0651,
   22145   shaddadammaarabic: 0xFC61,
   22146   shaddadammatanarabic: 0xFC5E,
   22147   shaddafathaarabic: 0xFC60,
   22148   shaddakasraarabic: 0xFC62,
   22149   shaddakasratanarabic: 0xFC5F,
   22150   shade: 0x2592,
   22151   shadedark: 0x2593,
   22152   shadelight: 0x2591,
   22153   shademedium: 0x2592,
   22154   shadeva: 0x0936,
   22155   shagujarati: 0x0AB6,
   22156   shagurmukhi: 0x0A36,
   22157   shalshelethebrew: 0x0593,
   22158   shbopomofo: 0x3115,
   22159   shchacyrillic: 0x0449,
   22160   sheenarabic: 0x0634,
   22161   sheenfinalarabic: 0xFEB6,
   22162   sheeninitialarabic: 0xFEB7,
   22163   sheenmedialarabic: 0xFEB8,
   22164   sheicoptic: 0x03E3,
   22165   sheqel: 0x20AA,
   22166   sheqelhebrew: 0x20AA,
   22167   sheva: 0x05B0,
   22168   sheva115: 0x05B0,
   22169   sheva15: 0x05B0,
   22170   sheva22: 0x05B0,
   22171   sheva2e: 0x05B0,
   22172   shevahebrew: 0x05B0,
   22173   shevanarrowhebrew: 0x05B0,
   22174   shevaquarterhebrew: 0x05B0,
   22175   shevawidehebrew: 0x05B0,
   22176   shhacyrillic: 0x04BB,
   22177   shimacoptic: 0x03ED,
   22178   shin: 0x05E9,
   22179   shindagesh: 0xFB49,
   22180   shindageshhebrew: 0xFB49,
   22181   shindageshshindot: 0xFB2C,
   22182   shindageshshindothebrew: 0xFB2C,
   22183   shindageshsindot: 0xFB2D,
   22184   shindageshsindothebrew: 0xFB2D,
   22185   shindothebrew: 0x05C1,
   22186   shinhebrew: 0x05E9,
   22187   shinshindot: 0xFB2A,
   22188   shinshindothebrew: 0xFB2A,
   22189   shinsindot: 0xFB2B,
   22190   shinsindothebrew: 0xFB2B,
   22191   shook: 0x0282,
   22192   sigma: 0x03C3,
   22193   sigma1: 0x03C2,
   22194   sigmafinal: 0x03C2,
   22195   sigmalunatesymbolgreek: 0x03F2,
   22196   sihiragana: 0x3057,
   22197   sikatakana: 0x30B7,
   22198   sikatakanahalfwidth: 0xFF7C,
   22199   siluqhebrew: 0x05BD,
   22200   siluqlefthebrew: 0x05BD,
   22201   similar: 0x223C,
   22202   sindothebrew: 0x05C2,
   22203   siosacirclekorean: 0x3274,
   22204   siosaparenkorean: 0x3214,
   22205   sioscieuckorean: 0x317E,
   22206   sioscirclekorean: 0x3266,
   22207   sioskiyeokkorean: 0x317A,
   22208   sioskorean: 0x3145,
   22209   siosnieunkorean: 0x317B,
   22210   siosparenkorean: 0x3206,
   22211   siospieupkorean: 0x317D,
   22212   siostikeutkorean: 0x317C,
   22213   six: 0x0036,
   22214   sixarabic: 0x0666,
   22215   sixbengali: 0x09EC,
   22216   sixcircle: 0x2465,
   22217   sixcircleinversesansserif: 0x278F,
   22218   sixdeva: 0x096C,
   22219   sixgujarati: 0x0AEC,
   22220   sixgurmukhi: 0x0A6C,
   22221   sixhackarabic: 0x0666,
   22222   sixhangzhou: 0x3026,
   22223   sixideographicparen: 0x3225,
   22224   sixinferior: 0x2086,
   22225   sixmonospace: 0xFF16,
   22226   sixoldstyle: 0xF736,
   22227   sixparen: 0x2479,
   22228   sixperiod: 0x248D,
   22229   sixpersian: 0x06F6,
   22230   sixroman: 0x2175,
   22231   sixsuperior: 0x2076,
   22232   sixteencircle: 0x246F,
   22233   sixteencurrencydenominatorbengali: 0x09F9,
   22234   sixteenparen: 0x2483,
   22235   sixteenperiod: 0x2497,
   22236   sixthai: 0x0E56,
   22237   slash: 0x002F,
   22238   slashmonospace: 0xFF0F,
   22239   slong: 0x017F,
   22240   slongdotaccent: 0x1E9B,
   22241   smileface: 0x263A,
   22242   smonospace: 0xFF53,
   22243   sofpasuqhebrew: 0x05C3,
   22244   softhyphen: 0x00AD,
   22245   softsigncyrillic: 0x044C,
   22246   sohiragana: 0x305D,
   22247   sokatakana: 0x30BD,
   22248   sokatakanahalfwidth: 0xFF7F,
   22249   soliduslongoverlaycmb: 0x0338,
   22250   solidusshortoverlaycmb: 0x0337,
   22251   sorusithai: 0x0E29,
   22252   sosalathai: 0x0E28,
   22253   sosothai: 0x0E0B,
   22254   sosuathai: 0x0E2A,
   22255   space: 0x0020,
   22256   spacehackarabic: 0x0020,
   22257   spade: 0x2660,
   22258   spadesuitblack: 0x2660,
   22259   spadesuitwhite: 0x2664,
   22260   sparen: 0x24AE,
   22261   squarebelowcmb: 0x033B,
   22262   squarecc: 0x33C4,
   22263   squarecm: 0x339D,
   22264   squarediagonalcrosshatchfill: 0x25A9,
   22265   squarehorizontalfill: 0x25A4,
   22266   squarekg: 0x338F,
   22267   squarekm: 0x339E,
   22268   squarekmcapital: 0x33CE,
   22269   squareln: 0x33D1,
   22270   squarelog: 0x33D2,
   22271   squaremg: 0x338E,
   22272   squaremil: 0x33D5,
   22273   squaremm: 0x339C,
   22274   squaremsquared: 0x33A1,
   22275   squareorthogonalcrosshatchfill: 0x25A6,
   22276   squareupperlefttolowerrightfill: 0x25A7,
   22277   squareupperrighttolowerleftfill: 0x25A8,
   22278   squareverticalfill: 0x25A5,
   22279   squarewhitewithsmallblack: 0x25A3,
   22280   srsquare: 0x33DB,
   22281   ssabengali: 0x09B7,
   22282   ssadeva: 0x0937,
   22283   ssagujarati: 0x0AB7,
   22284   ssangcieuckorean: 0x3149,
   22285   ssanghieuhkorean: 0x3185,
   22286   ssangieungkorean: 0x3180,
   22287   ssangkiyeokkorean: 0x3132,
   22288   ssangnieunkorean: 0x3165,
   22289   ssangpieupkorean: 0x3143,
   22290   ssangsioskorean: 0x3146,
   22291   ssangtikeutkorean: 0x3138,
   22292   ssuperior: 0xF6F2,
   22293   sterling: 0x00A3,
   22294   sterlingmonospace: 0xFFE1,
   22295   strokelongoverlaycmb: 0x0336,
   22296   strokeshortoverlaycmb: 0x0335,
   22297   subset: 0x2282,
   22298   subsetnotequal: 0x228A,
   22299   subsetorequal: 0x2286,
   22300   succeeds: 0x227B,
   22301   suchthat: 0x220B,
   22302   suhiragana: 0x3059,
   22303   sukatakana: 0x30B9,
   22304   sukatakanahalfwidth: 0xFF7D,
   22305   sukunarabic: 0x0652,
   22306   summation: 0x2211,
   22307   sun: 0x263C,
   22308   superset: 0x2283,
   22309   supersetnotequal: 0x228B,
   22310   supersetorequal: 0x2287,
   22311   svsquare: 0x33DC,
   22312   syouwaerasquare: 0x337C,
   22313   t: 0x0074,
   22314   tabengali: 0x09A4,
   22315   tackdown: 0x22A4,
   22316   tackleft: 0x22A3,
   22317   tadeva: 0x0924,
   22318   tagujarati: 0x0AA4,
   22319   tagurmukhi: 0x0A24,
   22320   taharabic: 0x0637,
   22321   tahfinalarabic: 0xFEC2,
   22322   tahinitialarabic: 0xFEC3,
   22323   tahiragana: 0x305F,
   22324   tahmedialarabic: 0xFEC4,
   22325   taisyouerasquare: 0x337D,
   22326   takatakana: 0x30BF,
   22327   takatakanahalfwidth: 0xFF80,
   22328   tatweelarabic: 0x0640,
   22329   tau: 0x03C4,
   22330   tav: 0x05EA,
   22331   tavdages: 0xFB4A,
   22332   tavdagesh: 0xFB4A,
   22333   tavdageshhebrew: 0xFB4A,
   22334   tavhebrew: 0x05EA,
   22335   tbar: 0x0167,
   22336   tbopomofo: 0x310A,
   22337   tcaron: 0x0165,
   22338   tccurl: 0x02A8,
   22339   tcedilla: 0x0163,
   22340   tcheharabic: 0x0686,
   22341   tchehfinalarabic: 0xFB7B,
   22342   tchehinitialarabic: 0xFB7C,
   22343   tchehmedialarabic: 0xFB7D,
   22344   tcircle: 0x24E3,
   22345   tcircumflexbelow: 0x1E71,
   22346   tcommaaccent: 0x0163,
   22347   tdieresis: 0x1E97,
   22348   tdotaccent: 0x1E6B,
   22349   tdotbelow: 0x1E6D,
   22350   tecyrillic: 0x0442,
   22351   tedescendercyrillic: 0x04AD,
   22352   teharabic: 0x062A,
   22353   tehfinalarabic: 0xFE96,
   22354   tehhahinitialarabic: 0xFCA2,
   22355   tehhahisolatedarabic: 0xFC0C,
   22356   tehinitialarabic: 0xFE97,
   22357   tehiragana: 0x3066,
   22358   tehjeeminitialarabic: 0xFCA1,
   22359   tehjeemisolatedarabic: 0xFC0B,
   22360   tehmarbutaarabic: 0x0629,
   22361   tehmarbutafinalarabic: 0xFE94,
   22362   tehmedialarabic: 0xFE98,
   22363   tehmeeminitialarabic: 0xFCA4,
   22364   tehmeemisolatedarabic: 0xFC0E,
   22365   tehnoonfinalarabic: 0xFC73,
   22366   tekatakana: 0x30C6,
   22367   tekatakanahalfwidth: 0xFF83,
   22368   telephone: 0x2121,
   22369   telephoneblack: 0x260E,
   22370   telishagedolahebrew: 0x05A0,
   22371   telishaqetanahebrew: 0x05A9,
   22372   tencircle: 0x2469,
   22373   tenideographicparen: 0x3229,
   22374   tenparen: 0x247D,
   22375   tenperiod: 0x2491,
   22376   tenroman: 0x2179,
   22377   tesh: 0x02A7,
   22378   tet: 0x05D8,
   22379   tetdagesh: 0xFB38,
   22380   tetdageshhebrew: 0xFB38,
   22381   tethebrew: 0x05D8,
   22382   tetsecyrillic: 0x04B5,
   22383   tevirhebrew: 0x059B,
   22384   tevirlefthebrew: 0x059B,
   22385   thabengali: 0x09A5,
   22386   thadeva: 0x0925,
   22387   thagujarati: 0x0AA5,
   22388   thagurmukhi: 0x0A25,
   22389   thalarabic: 0x0630,
   22390   thalfinalarabic: 0xFEAC,
   22391   thanthakhatlowleftthai: 0xF898,
   22392   thanthakhatlowrightthai: 0xF897,
   22393   thanthakhatthai: 0x0E4C,
   22394   thanthakhatupperleftthai: 0xF896,
   22395   theharabic: 0x062B,
   22396   thehfinalarabic: 0xFE9A,
   22397   thehinitialarabic: 0xFE9B,
   22398   thehmedialarabic: 0xFE9C,
   22399   thereexists: 0x2203,
   22400   therefore: 0x2234,
   22401   theta: 0x03B8,
   22402   theta1: 0x03D1,
   22403   thetasymbolgreek: 0x03D1,
   22404   thieuthacirclekorean: 0x3279,
   22405   thieuthaparenkorean: 0x3219,
   22406   thieuthcirclekorean: 0x326B,
   22407   thieuthkorean: 0x314C,
   22408   thieuthparenkorean: 0x320B,
   22409   thirteencircle: 0x246C,
   22410   thirteenparen: 0x2480,
   22411   thirteenperiod: 0x2494,
   22412   thonangmonthothai: 0x0E11,
   22413   thook: 0x01AD,
   22414   thophuthaothai: 0x0E12,
   22415   thorn: 0x00FE,
   22416   thothahanthai: 0x0E17,
   22417   thothanthai: 0x0E10,
   22418   thothongthai: 0x0E18,
   22419   thothungthai: 0x0E16,
   22420   thousandcyrillic: 0x0482,
   22421   thousandsseparatorarabic: 0x066C,
   22422   thousandsseparatorpersian: 0x066C,
   22423   three: 0x0033,
   22424   threearabic: 0x0663,
   22425   threebengali: 0x09E9,
   22426   threecircle: 0x2462,
   22427   threecircleinversesansserif: 0x278C,
   22428   threedeva: 0x0969,
   22429   threeeighths: 0x215C,
   22430   threegujarati: 0x0AE9,
   22431   threegurmukhi: 0x0A69,
   22432   threehackarabic: 0x0663,
   22433   threehangzhou: 0x3023,
   22434   threeideographicparen: 0x3222,
   22435   threeinferior: 0x2083,
   22436   threemonospace: 0xFF13,
   22437   threenumeratorbengali: 0x09F6,
   22438   threeoldstyle: 0xF733,
   22439   threeparen: 0x2476,
   22440   threeperiod: 0x248A,
   22441   threepersian: 0x06F3,
   22442   threequarters: 0x00BE,
   22443   threequartersemdash: 0xF6DE,
   22444   threeroman: 0x2172,
   22445   threesuperior: 0x00B3,
   22446   threethai: 0x0E53,
   22447   thzsquare: 0x3394,
   22448   tihiragana: 0x3061,
   22449   tikatakana: 0x30C1,
   22450   tikatakanahalfwidth: 0xFF81,
   22451   tikeutacirclekorean: 0x3270,
   22452   tikeutaparenkorean: 0x3210,
   22453   tikeutcirclekorean: 0x3262,
   22454   tikeutkorean: 0x3137,
   22455   tikeutparenkorean: 0x3202,
   22456   tilde: 0x02DC,
   22457   tildebelowcmb: 0x0330,
   22458   tildecmb: 0x0303,
   22459   tildecomb: 0x0303,
   22460   tildedoublecmb: 0x0360,
   22461   tildeoperator: 0x223C,
   22462   tildeoverlaycmb: 0x0334,
   22463   tildeverticalcmb: 0x033E,
   22464   timescircle: 0x2297,
   22465   tipehahebrew: 0x0596,
   22466   tipehalefthebrew: 0x0596,
   22467   tippigurmukhi: 0x0A70,
   22468   titlocyrilliccmb: 0x0483,
   22469   tiwnarmenian: 0x057F,
   22470   tlinebelow: 0x1E6F,
   22471   tmonospace: 0xFF54,
   22472   toarmenian: 0x0569,
   22473   tohiragana: 0x3068,
   22474   tokatakana: 0x30C8,
   22475   tokatakanahalfwidth: 0xFF84,
   22476   tonebarextrahighmod: 0x02E5,
   22477   tonebarextralowmod: 0x02E9,
   22478   tonebarhighmod: 0x02E6,
   22479   tonebarlowmod: 0x02E8,
   22480   tonebarmidmod: 0x02E7,
   22481   tonefive: 0x01BD,
   22482   tonesix: 0x0185,
   22483   tonetwo: 0x01A8,
   22484   tonos: 0x0384,
   22485   tonsquare: 0x3327,
   22486   topatakthai: 0x0E0F,
   22487   tortoiseshellbracketleft: 0x3014,
   22488   tortoiseshellbracketleftsmall: 0xFE5D,
   22489   tortoiseshellbracketleftvertical: 0xFE39,
   22490   tortoiseshellbracketright: 0x3015,
   22491   tortoiseshellbracketrightsmall: 0xFE5E,
   22492   tortoiseshellbracketrightvertical: 0xFE3A,
   22493   totaothai: 0x0E15,
   22494   tpalatalhook: 0x01AB,
   22495   tparen: 0x24AF,
   22496   trademark: 0x2122,
   22497   trademarksans: 0xF8EA,
   22498   trademarkserif: 0xF6DB,
   22499   tretroflexhook: 0x0288,
   22500   triagdn: 0x25BC,
   22501   triaglf: 0x25C4,
   22502   triagrt: 0x25BA,
   22503   triagup: 0x25B2,
   22504   ts: 0x02A6,
   22505   tsadi: 0x05E6,
   22506   tsadidagesh: 0xFB46,
   22507   tsadidageshhebrew: 0xFB46,
   22508   tsadihebrew: 0x05E6,
   22509   tsecyrillic: 0x0446,
   22510   tsere: 0x05B5,
   22511   tsere12: 0x05B5,
   22512   tsere1e: 0x05B5,
   22513   tsere2b: 0x05B5,
   22514   tserehebrew: 0x05B5,
   22515   tserenarrowhebrew: 0x05B5,
   22516   tserequarterhebrew: 0x05B5,
   22517   tserewidehebrew: 0x05B5,
   22518   tshecyrillic: 0x045B,
   22519   tsuperior: 0xF6F3,
   22520   ttabengali: 0x099F,
   22521   ttadeva: 0x091F,
   22522   ttagujarati: 0x0A9F,
   22523   ttagurmukhi: 0x0A1F,
   22524   tteharabic: 0x0679,
   22525   ttehfinalarabic: 0xFB67,
   22526   ttehinitialarabic: 0xFB68,
   22527   ttehmedialarabic: 0xFB69,
   22528   tthabengali: 0x09A0,
   22529   tthadeva: 0x0920,
   22530   tthagujarati: 0x0AA0,
   22531   tthagurmukhi: 0x0A20,
   22532   tturned: 0x0287,
   22533   tuhiragana: 0x3064,
   22534   tukatakana: 0x30C4,
   22535   tukatakanahalfwidth: 0xFF82,
   22536   tusmallhiragana: 0x3063,
   22537   tusmallkatakana: 0x30C3,
   22538   tusmallkatakanahalfwidth: 0xFF6F,
   22539   twelvecircle: 0x246B,
   22540   twelveparen: 0x247F,
   22541   twelveperiod: 0x2493,
   22542   twelveroman: 0x217B,
   22543   twentycircle: 0x2473,
   22544   twentyhangzhou: 0x5344,
   22545   twentyparen: 0x2487,
   22546   twentyperiod: 0x249B,
   22547   two: 0x0032,
   22548   twoarabic: 0x0662,
   22549   twobengali: 0x09E8,
   22550   twocircle: 0x2461,
   22551   twocircleinversesansserif: 0x278B,
   22552   twodeva: 0x0968,
   22553   twodotenleader: 0x2025,
   22554   twodotleader: 0x2025,
   22555   twodotleadervertical: 0xFE30,
   22556   twogujarati: 0x0AE8,
   22557   twogurmukhi: 0x0A68,
   22558   twohackarabic: 0x0662,
   22559   twohangzhou: 0x3022,
   22560   twoideographicparen: 0x3221,
   22561   twoinferior: 0x2082,
   22562   twomonospace: 0xFF12,
   22563   twonumeratorbengali: 0x09F5,
   22564   twooldstyle: 0xF732,
   22565   twoparen: 0x2475,
   22566   twoperiod: 0x2489,
   22567   twopersian: 0x06F2,
   22568   tworoman: 0x2171,
   22569   twostroke: 0x01BB,
   22570   twosuperior: 0x00B2,
   22571   twothai: 0x0E52,
   22572   twothirds: 0x2154,
   22573   u: 0x0075,
   22574   uacute: 0x00FA,
   22575   ubar: 0x0289,
   22576   ubengali: 0x0989,
   22577   ubopomofo: 0x3128,
   22578   ubreve: 0x016D,
   22579   ucaron: 0x01D4,
   22580   ucircle: 0x24E4,
   22581   ucircumflex: 0x00FB,
   22582   ucircumflexbelow: 0x1E77,
   22583   ucyrillic: 0x0443,
   22584   udattadeva: 0x0951,
   22585   udblacute: 0x0171,
   22586   udblgrave: 0x0215,
   22587   udeva: 0x0909,
   22588   udieresis: 0x00FC,
   22589   udieresisacute: 0x01D8,
   22590   udieresisbelow: 0x1E73,
   22591   udieresiscaron: 0x01DA,
   22592   udieresiscyrillic: 0x04F1,
   22593   udieresisgrave: 0x01DC,
   22594   udieresismacron: 0x01D6,
   22595   udotbelow: 0x1EE5,
   22596   ugrave: 0x00F9,
   22597   ugujarati: 0x0A89,
   22598   ugurmukhi: 0x0A09,
   22599   uhiragana: 0x3046,
   22600   uhookabove: 0x1EE7,
   22601   uhorn: 0x01B0,
   22602   uhornacute: 0x1EE9,
   22603   uhorndotbelow: 0x1EF1,
   22604   uhorngrave: 0x1EEB,
   22605   uhornhookabove: 0x1EED,
   22606   uhorntilde: 0x1EEF,
   22607   uhungarumlaut: 0x0171,
   22608   uhungarumlautcyrillic: 0x04F3,
   22609   uinvertedbreve: 0x0217,
   22610   ukatakana: 0x30A6,
   22611   ukatakanahalfwidth: 0xFF73,
   22612   ukcyrillic: 0x0479,
   22613   ukorean: 0x315C,
   22614   umacron: 0x016B,
   22615   umacroncyrillic: 0x04EF,
   22616   umacrondieresis: 0x1E7B,
   22617   umatragurmukhi: 0x0A41,
   22618   umonospace: 0xFF55,
   22619   underscore: 0x005F,
   22620   underscoredbl: 0x2017,
   22621   underscoremonospace: 0xFF3F,
   22622   underscorevertical: 0xFE33,
   22623   underscorewavy: 0xFE4F,
   22624   union: 0x222A,
   22625   universal: 0x2200,
   22626   uogonek: 0x0173,
   22627   uparen: 0x24B0,
   22628   upblock: 0x2580,
   22629   upperdothebrew: 0x05C4,
   22630   upsilon: 0x03C5,
   22631   upsilondieresis: 0x03CB,
   22632   upsilondieresistonos: 0x03B0,
   22633   upsilonlatin: 0x028A,
   22634   upsilontonos: 0x03CD,
   22635   uptackbelowcmb: 0x031D,
   22636   uptackmod: 0x02D4,
   22637   uragurmukhi: 0x0A73,
   22638   uring: 0x016F,
   22639   ushortcyrillic: 0x045E,
   22640   usmallhiragana: 0x3045,
   22641   usmallkatakana: 0x30A5,
   22642   usmallkatakanahalfwidth: 0xFF69,
   22643   ustraightcyrillic: 0x04AF,
   22644   ustraightstrokecyrillic: 0x04B1,
   22645   utilde: 0x0169,
   22646   utildeacute: 0x1E79,
   22647   utildebelow: 0x1E75,
   22648   uubengali: 0x098A,
   22649   uudeva: 0x090A,
   22650   uugujarati: 0x0A8A,
   22651   uugurmukhi: 0x0A0A,
   22652   uumatragurmukhi: 0x0A42,
   22653   uuvowelsignbengali: 0x09C2,
   22654   uuvowelsigndeva: 0x0942,
   22655   uuvowelsigngujarati: 0x0AC2,
   22656   uvowelsignbengali: 0x09C1,
   22657   uvowelsigndeva: 0x0941,
   22658   uvowelsigngujarati: 0x0AC1,
   22659   v: 0x0076,
   22660   vadeva: 0x0935,
   22661   vagujarati: 0x0AB5,
   22662   vagurmukhi: 0x0A35,
   22663   vakatakana: 0x30F7,
   22664   vav: 0x05D5,
   22665   vavdagesh: 0xFB35,
   22666   vavdagesh65: 0xFB35,
   22667   vavdageshhebrew: 0xFB35,
   22668   vavhebrew: 0x05D5,
   22669   vavholam: 0xFB4B,
   22670   vavholamhebrew: 0xFB4B,
   22671   vavvavhebrew: 0x05F0,
   22672   vavyodhebrew: 0x05F1,
   22673   vcircle: 0x24E5,
   22674   vdotbelow: 0x1E7F,
   22675   vecyrillic: 0x0432,
   22676   veharabic: 0x06A4,
   22677   vehfinalarabic: 0xFB6B,
   22678   vehinitialarabic: 0xFB6C,
   22679   vehmedialarabic: 0xFB6D,
   22680   vekatakana: 0x30F9,
   22681   venus: 0x2640,
   22682   verticalbar: 0x007C,
   22683   verticallineabovecmb: 0x030D,
   22684   verticallinebelowcmb: 0x0329,
   22685   verticallinelowmod: 0x02CC,
   22686   verticallinemod: 0x02C8,
   22687   vewarmenian: 0x057E,
   22688   vhook: 0x028B,
   22689   vikatakana: 0x30F8,
   22690   viramabengali: 0x09CD,
   22691   viramadeva: 0x094D,
   22692   viramagujarati: 0x0ACD,
   22693   visargabengali: 0x0983,
   22694   visargadeva: 0x0903,
   22695   visargagujarati: 0x0A83,
   22696   vmonospace: 0xFF56,
   22697   voarmenian: 0x0578,
   22698   voicediterationhiragana: 0x309E,
   22699   voicediterationkatakana: 0x30FE,
   22700   voicedmarkkana: 0x309B,
   22701   voicedmarkkanahalfwidth: 0xFF9E,
   22702   vokatakana: 0x30FA,
   22703   vparen: 0x24B1,
   22704   vtilde: 0x1E7D,
   22705   vturned: 0x028C,
   22706   vuhiragana: 0x3094,
   22707   vukatakana: 0x30F4,
   22708   w: 0x0077,
   22709   wacute: 0x1E83,
   22710   waekorean: 0x3159,
   22711   wahiragana: 0x308F,
   22712   wakatakana: 0x30EF,
   22713   wakatakanahalfwidth: 0xFF9C,
   22714   wakorean: 0x3158,
   22715   wasmallhiragana: 0x308E,
   22716   wasmallkatakana: 0x30EE,
   22717   wattosquare: 0x3357,
   22718   wavedash: 0x301C,
   22719   wavyunderscorevertical: 0xFE34,
   22720   wawarabic: 0x0648,
   22721   wawfinalarabic: 0xFEEE,
   22722   wawhamzaabovearabic: 0x0624,
   22723   wawhamzaabovefinalarabic: 0xFE86,
   22724   wbsquare: 0x33DD,
   22725   wcircle: 0x24E6,
   22726   wcircumflex: 0x0175,
   22727   wdieresis: 0x1E85,
   22728   wdotaccent: 0x1E87,
   22729   wdotbelow: 0x1E89,
   22730   wehiragana: 0x3091,
   22731   weierstrass: 0x2118,
   22732   wekatakana: 0x30F1,
   22733   wekorean: 0x315E,
   22734   weokorean: 0x315D,
   22735   wgrave: 0x1E81,
   22736   whitebullet: 0x25E6,
   22737   whitecircle: 0x25CB,
   22738   whitecircleinverse: 0x25D9,
   22739   whitecornerbracketleft: 0x300E,
   22740   whitecornerbracketleftvertical: 0xFE43,
   22741   whitecornerbracketright: 0x300F,
   22742   whitecornerbracketrightvertical: 0xFE44,
   22743   whitediamond: 0x25C7,
   22744   whitediamondcontainingblacksmalldiamond: 0x25C8,
   22745   whitedownpointingsmalltriangle: 0x25BF,
   22746   whitedownpointingtriangle: 0x25BD,
   22747   whiteleftpointingsmalltriangle: 0x25C3,
   22748   whiteleftpointingtriangle: 0x25C1,
   22749   whitelenticularbracketleft: 0x3016,
   22750   whitelenticularbracketright: 0x3017,
   22751   whiterightpointingsmalltriangle: 0x25B9,
   22752   whiterightpointingtriangle: 0x25B7,
   22753   whitesmallsquare: 0x25AB,
   22754   whitesmilingface: 0x263A,
   22755   whitesquare: 0x25A1,
   22756   whitestar: 0x2606,
   22757   whitetelephone: 0x260F,
   22758   whitetortoiseshellbracketleft: 0x3018,
   22759   whitetortoiseshellbracketright: 0x3019,
   22760   whiteuppointingsmalltriangle: 0x25B5,
   22761   whiteuppointingtriangle: 0x25B3,
   22762   wihiragana: 0x3090,
   22763   wikatakana: 0x30F0,
   22764   wikorean: 0x315F,
   22765   wmonospace: 0xFF57,
   22766   wohiragana: 0x3092,
   22767   wokatakana: 0x30F2,
   22768   wokatakanahalfwidth: 0xFF66,
   22769   won: 0x20A9,
   22770   wonmonospace: 0xFFE6,
   22771   wowaenthai: 0x0E27,
   22772   wparen: 0x24B2,
   22773   wring: 0x1E98,
   22774   wsuperior: 0x02B7,
   22775   wturned: 0x028D,
   22776   wynn: 0x01BF,
   22777   x: 0x0078,
   22778   xabovecmb: 0x033D,
   22779   xbopomofo: 0x3112,
   22780   xcircle: 0x24E7,
   22781   xdieresis: 0x1E8D,
   22782   xdotaccent: 0x1E8B,
   22783   xeharmenian: 0x056D,
   22784   xi: 0x03BE,
   22785   xmonospace: 0xFF58,
   22786   xparen: 0x24B3,
   22787   xsuperior: 0x02E3,
   22788   y: 0x0079,
   22789   yaadosquare: 0x334E,
   22790   yabengali: 0x09AF,
   22791   yacute: 0x00FD,
   22792   yadeva: 0x092F,
   22793   yaekorean: 0x3152,
   22794   yagujarati: 0x0AAF,
   22795   yagurmukhi: 0x0A2F,
   22796   yahiragana: 0x3084,
   22797   yakatakana: 0x30E4,
   22798   yakatakanahalfwidth: 0xFF94,
   22799   yakorean: 0x3151,
   22800   yamakkanthai: 0x0E4E,
   22801   yasmallhiragana: 0x3083,
   22802   yasmallkatakana: 0x30E3,
   22803   yasmallkatakanahalfwidth: 0xFF6C,
   22804   yatcyrillic: 0x0463,
   22805   ycircle: 0x24E8,
   22806   ycircumflex: 0x0177,
   22807   ydieresis: 0x00FF,
   22808   ydotaccent: 0x1E8F,
   22809   ydotbelow: 0x1EF5,
   22810   yeharabic: 0x064A,
   22811   yehbarreearabic: 0x06D2,
   22812   yehbarreefinalarabic: 0xFBAF,
   22813   yehfinalarabic: 0xFEF2,
   22814   yehhamzaabovearabic: 0x0626,
   22815   yehhamzaabovefinalarabic: 0xFE8A,
   22816   yehhamzaaboveinitialarabic: 0xFE8B,
   22817   yehhamzaabovemedialarabic: 0xFE8C,
   22818   yehinitialarabic: 0xFEF3,
   22819   yehmedialarabic: 0xFEF4,
   22820   yehmeeminitialarabic: 0xFCDD,
   22821   yehmeemisolatedarabic: 0xFC58,
   22822   yehnoonfinalarabic: 0xFC94,
   22823   yehthreedotsbelowarabic: 0x06D1,
   22824   yekorean: 0x3156,
   22825   yen: 0x00A5,
   22826   yenmonospace: 0xFFE5,
   22827   yeokorean: 0x3155,
   22828   yeorinhieuhkorean: 0x3186,
   22829   yerahbenyomohebrew: 0x05AA,
   22830   yerahbenyomolefthebrew: 0x05AA,
   22831   yericyrillic: 0x044B,
   22832   yerudieresiscyrillic: 0x04F9,
   22833   yesieungkorean: 0x3181,
   22834   yesieungpansioskorean: 0x3183,
   22835   yesieungsioskorean: 0x3182,
   22836   yetivhebrew: 0x059A,
   22837   ygrave: 0x1EF3,
   22838   yhook: 0x01B4,
   22839   yhookabove: 0x1EF7,
   22840   yiarmenian: 0x0575,
   22841   yicyrillic: 0x0457,
   22842   yikorean: 0x3162,
   22843   yinyang: 0x262F,
   22844   yiwnarmenian: 0x0582,
   22845   ymonospace: 0xFF59,
   22846   yod: 0x05D9,
   22847   yoddagesh: 0xFB39,
   22848   yoddageshhebrew: 0xFB39,
   22849   yodhebrew: 0x05D9,
   22850   yodyodhebrew: 0x05F2,
   22851   yodyodpatahhebrew: 0xFB1F,
   22852   yohiragana: 0x3088,
   22853   yoikorean: 0x3189,
   22854   yokatakana: 0x30E8,
   22855   yokatakanahalfwidth: 0xFF96,
   22856   yokorean: 0x315B,
   22857   yosmallhiragana: 0x3087,
   22858   yosmallkatakana: 0x30E7,
   22859   yosmallkatakanahalfwidth: 0xFF6E,
   22860   yotgreek: 0x03F3,
   22861   yoyaekorean: 0x3188,
   22862   yoyakorean: 0x3187,
   22863   yoyakthai: 0x0E22,
   22864   yoyingthai: 0x0E0D,
   22865   yparen: 0x24B4,
   22866   ypogegrammeni: 0x037A,
   22867   ypogegrammenigreekcmb: 0x0345,
   22868   yr: 0x01A6,
   22869   yring: 0x1E99,
   22870   ysuperior: 0x02B8,
   22871   ytilde: 0x1EF9,
   22872   yturned: 0x028E,
   22873   yuhiragana: 0x3086,
   22874   yuikorean: 0x318C,
   22875   yukatakana: 0x30E6,
   22876   yukatakanahalfwidth: 0xFF95,
   22877   yukorean: 0x3160,
   22878   yusbigcyrillic: 0x046B,
   22879   yusbigiotifiedcyrillic: 0x046D,
   22880   yuslittlecyrillic: 0x0467,
   22881   yuslittleiotifiedcyrillic: 0x0469,
   22882   yusmallhiragana: 0x3085,
   22883   yusmallkatakana: 0x30E5,
   22884   yusmallkatakanahalfwidth: 0xFF6D,
   22885   yuyekorean: 0x318B,
   22886   yuyeokorean: 0x318A,
   22887   yyabengali: 0x09DF,
   22888   yyadeva: 0x095F,
   22889   z: 0x007A,
   22890   zaarmenian: 0x0566,
   22891   zacute: 0x017A,
   22892   zadeva: 0x095B,
   22893   zagurmukhi: 0x0A5B,
   22894   zaharabic: 0x0638,
   22895   zahfinalarabic: 0xFEC6,
   22896   zahinitialarabic: 0xFEC7,
   22897   zahiragana: 0x3056,
   22898   zahmedialarabic: 0xFEC8,
   22899   zainarabic: 0x0632,
   22900   zainfinalarabic: 0xFEB0,
   22901   zakatakana: 0x30B6,
   22902   zaqefgadolhebrew: 0x0595,
   22903   zaqefqatanhebrew: 0x0594,
   22904   zarqahebrew: 0x0598,
   22905   zayin: 0x05D6,
   22906   zayindagesh: 0xFB36,
   22907   zayindageshhebrew: 0xFB36,
   22908   zayinhebrew: 0x05D6,
   22909   zbopomofo: 0x3117,
   22910   zcaron: 0x017E,
   22911   zcircle: 0x24E9,
   22912   zcircumflex: 0x1E91,
   22913   zcurl: 0x0291,
   22914   zdot: 0x017C,
   22915   zdotaccent: 0x017C,
   22916   zdotbelow: 0x1E93,
   22917   zecyrillic: 0x0437,
   22918   zedescendercyrillic: 0x0499,
   22919   zedieresiscyrillic: 0x04DF,
   22920   zehiragana: 0x305C,
   22921   zekatakana: 0x30BC,
   22922   zero: 0x0030,
   22923   zeroarabic: 0x0660,
   22924   zerobengali: 0x09E6,
   22925   zerodeva: 0x0966,
   22926   zerogujarati: 0x0AE6,
   22927   zerogurmukhi: 0x0A66,
   22928   zerohackarabic: 0x0660,
   22929   zeroinferior: 0x2080,
   22930   zeromonospace: 0xFF10,
   22931   zerooldstyle: 0xF730,
   22932   zeropersian: 0x06F0,
   22933   zerosuperior: 0x2070,
   22934   zerothai: 0x0E50,
   22935   zerowidthjoiner: 0xFEFF,
   22936   zerowidthnonjoiner: 0x200C,
   22937   zerowidthspace: 0x200B,
   22938   zeta: 0x03B6,
   22939   zhbopomofo: 0x3113,
   22940   zhearmenian: 0x056A,
   22941   zhebrevecyrillic: 0x04C2,
   22942   zhecyrillic: 0x0436,
   22943   zhedescendercyrillic: 0x0497,
   22944   zhedieresiscyrillic: 0x04DD,
   22945   zihiragana: 0x3058,
   22946   zikatakana: 0x30B8,
   22947   zinorhebrew: 0x05AE,
   22948   zlinebelow: 0x1E95,
   22949   zmonospace: 0xFF5A,
   22950   zohiragana: 0x305E,
   22951   zokatakana: 0x30BE,
   22952   zparen: 0x24B5,
   22953   zretroflexhook: 0x0290,
   22954   zstroke: 0x01B6,
   22955   zuhiragana: 0x305A,
   22956   zukatakana: 0x30BA,
   22957   '.notdef': 0x0000
   22958 };
   22959 
   22960 
   22961 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   22962 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   22963 
   22964 'use strict';
   22965 
   22966 var PDFImage = (function PDFImageClosure() {
   22967   /**
   22968    * Decode the image in the main thread if it supported. Resovles the promise
   22969    * when the image data is ready.
   22970    */
   22971   function handleImageData(handler, xref, res, image, promise) {
   22972     if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
   22973       // For natively supported jpegs send them to the main thread for decoding.
   22974       var dict = image.dict;
   22975       var colorSpace = dict.get('ColorSpace', 'CS');
   22976       colorSpace = ColorSpace.parse(colorSpace, xref, res);
   22977       var numComps = colorSpace.numComps;
   22978       handler.send('JpegDecode', [image.getIR(), numComps], function(message) {
   22979         var data = message.data;
   22980         var stream = new Stream(data, 0, data.length, image.dict);
   22981         promise.resolve(stream);
   22982       });
   22983     } else {
   22984       promise.resolve(image);
   22985     }
   22986   }
   22987   /**
   22988    * Decode and clamp a value. The formula is different from the spec because we
   22989    * don't decode to float range [0,1], we decode it in the [0,max] range.
   22990    */
   22991   function decodeAndClamp(value, addend, coefficient, max) {
   22992     value = addend + value * coefficient;
   22993     // Clamp the value to the range
   22994     return value < 0 ? 0 : value > max ? max : value;
   22995   }
   22996   function PDFImage(xref, res, image, inline, smask) {
   22997     this.image = image;
   22998     if (image.getParams) {
   22999       // JPX/JPEG2000 streams directly contain bits per component
   23000       // and color space mode information.
   23001       TODO('get params from actual stream');
   23002       // var bits = ...
   23003       // var colorspace = ...
   23004     }
   23005     // TODO cache rendered images?
   23006 
   23007     var dict = image.dict;
   23008     this.width = dict.get('Width', 'W');
   23009     this.height = dict.get('Height', 'H');
   23010 
   23011     if (this.width < 1 || this.height < 1)
   23012       error('Invalid image width: ' + this.width + ' or height: ' +
   23013             this.height);
   23014 
   23015     this.interpolate = dict.get('Interpolate', 'I') || false;
   23016     this.imageMask = dict.get('ImageMask', 'IM') || false;
   23017 
   23018     var bitsPerComponent = image.bitsPerComponent;
   23019     if (!bitsPerComponent) {
   23020       bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
   23021       if (!bitsPerComponent) {
   23022         if (this.imageMask)
   23023           bitsPerComponent = 1;
   23024         else
   23025           error('Bits per component missing in image: ' + this.imageMask);
   23026       }
   23027     }
   23028     this.bpc = bitsPerComponent;
   23029 
   23030     if (!this.imageMask) {
   23031       var colorSpace = dict.get('ColorSpace', 'CS');
   23032       if (!colorSpace) {
   23033         TODO('JPX images (which don"t require color spaces');
   23034         colorSpace = new Name('DeviceRGB');
   23035       }
   23036       this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
   23037       this.numComps = this.colorSpace.numComps;
   23038     }
   23039 
   23040     this.decode = dict.get('Decode', 'D');
   23041     this.needsDecode = false;
   23042     if (this.decode && this.colorSpace &&
   23043         !this.colorSpace.isDefaultDecode(this.decode)) {
   23044       this.needsDecode = true;
   23045       // Do some preprocessing to avoid more math.
   23046       var max = (1 << bitsPerComponent) - 1;
   23047       this.decodeCoefficients = [];
   23048       this.decodeAddends = [];
   23049       for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
   23050         var dmin = this.decode[i];
   23051         var dmax = this.decode[i + 1];
   23052         this.decodeCoefficients[j] = dmax - dmin;
   23053         this.decodeAddends[j] = max * dmin;
   23054       }
   23055     }
   23056 
   23057     var mask = dict.get('Mask');
   23058 
   23059     if (mask) {
   23060       TODO('masked images');
   23061     } else if (smask) {
   23062       this.smask = new PDFImage(xref, res, smask, false);
   23063     }
   23064   }
   23065   /**
   23066    * Handles processing of image data and calls the callback with an argument
   23067    * of a PDFImage when the image is ready to be used.
   23068    */
   23069   PDFImage.buildImage = function PDFImage_buildImage(callback, handler, xref,
   23070                                                      res, image, inline) {
   23071     var imageDataPromise = new Promise();
   23072     var smaskPromise = new Promise();
   23073     // The image data and smask data may not be ready yet, wait till both are
   23074     // resolved.
   23075     Promise.all([imageDataPromise, smaskPromise]).then(function(results) {
   23076       var imageData = results[0], smaskData = results[1];
   23077       var image = new PDFImage(xref, res, imageData, inline, smaskData);
   23078       callback(image);
   23079     });
   23080 
   23081     handleImageData(handler, xref, res, image, imageDataPromise);
   23082 
   23083     var smask = image.dict.get('SMask');
   23084     if (smask)
   23085       handleImageData(handler, xref, res, smask, smaskPromise);
   23086     else
   23087       smaskPromise.resolve(null);
   23088   };
   23089 
   23090   /**
   23091    * Resize an image using the nearest neighbor algorithm.  Currently only
   23092    * supports one and three component images.
   23093    * @param {TypedArray} pixels The original image with one component.
   23094    * @param {Number} bpc Number of bits per component.
   23095    * @param {Number} components Number of color components, 1 or 3 is supported.
   23096    * @param {Number} w1 Original width.
   23097    * @param {Number} h1 Original height.
   23098    * @param {Number} w2 New width.
   23099    * @param {Number} h2 New height.
   23100    * @return {TypedArray} Resized image data.
   23101    */
   23102   PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
   23103                                              w1, h1, w2, h2) {
   23104     var length = w2 * h2 * components;
   23105     var temp = bpc <= 8 ? new Uint8Array(length) :
   23106         bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
   23107     var xRatio = w1 / w2;
   23108     var yRatio = h1 / h2;
   23109     var px, py, newIndex, oldIndex;
   23110     for (var i = 0; i < h2; i++) {
   23111       for (var j = 0; j < w2; j++) {
   23112         px = Math.floor(j * xRatio);
   23113         py = Math.floor(i * yRatio);
   23114         newIndex = (i * w2) + j;
   23115         oldIndex = ((py * w1) + px);
   23116         if (components === 1) {
   23117           temp[newIndex] = pixels[oldIndex];
   23118         } else if (components === 3) {
   23119           newIndex *= 3;
   23120           oldIndex *= 3;
   23121           temp[newIndex] = pixels[oldIndex];
   23122           temp[newIndex + 1] = pixels[oldIndex + 1];
   23123           temp[newIndex + 2] = pixels[oldIndex + 2];
   23124         }
   23125       }
   23126     }
   23127     return temp;
   23128   };
   23129 
   23130   PDFImage.prototype = {
   23131     get drawWidth() {
   23132       if (!this.smask)
   23133         return this.width;
   23134       return Math.max(this.width, this.smask.width);
   23135     },
   23136     get drawHeight() {
   23137       if (!this.smask)
   23138         return this.height;
   23139       return Math.max(this.height, this.smask.height);
   23140     },
   23141     getComponents: function PDFImage_getComponents(buffer) {
   23142       var bpc = this.bpc;
   23143       var needsDecode = this.needsDecode;
   23144       var decodeMap = this.decode;
   23145 
   23146       // This image doesn't require any extra work.
   23147       if (bpc == 8 && !needsDecode)
   23148         return buffer;
   23149 
   23150       var bufferLength = buffer.length;
   23151       var width = this.width;
   23152       var height = this.height;
   23153       var numComps = this.numComps;
   23154 
   23155       var length = width * height * numComps;
   23156       var bufferPos = 0;
   23157       var output = bpc <= 8 ? new Uint8Array(length) :
   23158         bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
   23159       var rowComps = width * numComps;
   23160       var decodeAddends, decodeCoefficients;
   23161       if (needsDecode) {
   23162         decodeAddends = this.decodeAddends;
   23163         decodeCoefficients = this.decodeCoefficients;
   23164       }
   23165       var max = (1 << bpc) - 1;
   23166 
   23167       if (bpc == 8) {
   23168         // Optimization for reading 8 bpc images that have a decode.
   23169         for (var i = 0, ii = length; i < ii; ++i) {
   23170           var compIndex = i % numComps;
   23171           var value = buffer[i];
   23172           value = decodeAndClamp(value, decodeAddends[compIndex],
   23173                           decodeCoefficients[compIndex], max);
   23174           output[i] = value;
   23175         }
   23176       } else if (bpc == 1) {
   23177         // Optimization for reading 1 bpc images.
   23178         var valueZero = 0, valueOne = 1;
   23179         if (decodeMap) {
   23180           valueZero = decodeMap[0] ? 1 : 0;
   23181           valueOne = decodeMap[1] ? 1 : 0;
   23182         }
   23183         var mask = 0;
   23184         var buf = 0;
   23185 
   23186         for (var i = 0, ii = length; i < ii; ++i) {
   23187           if (i % rowComps == 0) {
   23188             mask = 0;
   23189             buf = 0;
   23190           } else {
   23191             mask >>= 1;
   23192           }
   23193 
   23194           if (mask <= 0) {
   23195             buf = buffer[bufferPos++];
   23196             mask = 128;
   23197           }
   23198 
   23199           output[i] = !(buf & mask) ? valueZero : valueOne;
   23200         }
   23201       } else {
   23202         // The general case that handles all other bpc values.
   23203         var bits = 0, buf = 0;
   23204         for (var i = 0, ii = length; i < ii; ++i) {
   23205           if (i % rowComps == 0) {
   23206             buf = 0;
   23207             bits = 0;
   23208           }
   23209 
   23210           while (bits < bpc) {
   23211             buf = (buf << 8) | buffer[bufferPos++];
   23212             bits += 8;
   23213           }
   23214 
   23215           var remainingBits = bits - bpc;
   23216           var value = buf >> remainingBits;
   23217           if (needsDecode) {
   23218             var compIndex = i % numComps;
   23219             value = decodeAndClamp(value, decodeAddends[compIndex],
   23220                             decodeCoefficients[compIndex], max);
   23221           }
   23222           output[i] = value;
   23223           buf = buf & ((1 << remainingBits) - 1);
   23224           bits = remainingBits;
   23225         }
   23226       }
   23227       return output;
   23228     },
   23229     getOpacity: function PDFImage_getOpacity(width, height) {
   23230       var smask = this.smask;
   23231       var originalWidth = this.width;
   23232       var originalHeight = this.height;
   23233       var buf;
   23234 
   23235       if (smask) {
   23236         var sw = smask.width;
   23237         var sh = smask.height;
   23238         buf = new Uint8Array(sw * sh);
   23239         smask.fillGrayBuffer(buf);
   23240         if (sw != width || sh != height)
   23241           buf = PDFImage.resize(buf, smask.bps, 1, sw, sh, width, height);
   23242       } else {
   23243         buf = new Uint8Array(width * height);
   23244         for (var i = 0, ii = width * height; i < ii; ++i)
   23245           buf[i] = 255;
   23246       }
   23247       return buf;
   23248     },
   23249     applyStencilMask: function PDFImage_applyStencilMask(buffer,
   23250                                                          inverseDecode) {
   23251       var width = this.width, height = this.height;
   23252       var bitStrideLength = (width + 7) >> 3;
   23253       var imgArray = this.getImageBytes(bitStrideLength * height);
   23254       var imgArrayPos = 0;
   23255       var i, j, mask, buf;
   23256       // removing making non-masked pixels transparent
   23257       var bufferPos = 3; // alpha component offset
   23258       for (i = 0; i < height; i++) {
   23259         mask = 0;
   23260         for (j = 0; j < width; j++) {
   23261           if (!mask) {
   23262             buf = imgArray[imgArrayPos++];
   23263             mask = 128;
   23264           }
   23265           if (!(buf & mask) == inverseDecode) {
   23266             buffer[bufferPos] = 0;
   23267           }
   23268           bufferPos += 4;
   23269           mask >>= 1;
   23270         }
   23271       }
   23272     },
   23273     fillRgbaBuffer: function PDFImage_fillRgbaBuffer(buffer, width, height) {
   23274       var numComps = this.numComps;
   23275       var originalWidth = this.width;
   23276       var originalHeight = this.height;
   23277       var bpc = this.bpc;
   23278 
   23279       // rows start at byte boundary;
   23280       var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
   23281       var imgArray = this.getImageBytes(originalHeight * rowBytes);
   23282 
   23283       var comps = this.colorSpace.getRgbBuffer(
   23284         this.getComponents(imgArray), bpc);
   23285       if (originalWidth != width || originalHeight != height)
   23286         comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
   23287                                 originalHeight, width, height);
   23288       var compsPos = 0;
   23289       var opacity = this.getOpacity(width, height);
   23290       var opacityPos = 0;
   23291       var length = width * height * 4;
   23292 
   23293       for (var i = 0; i < length; i += 4) {
   23294         buffer[i] = comps[compsPos++];
   23295         buffer[i + 1] = comps[compsPos++];
   23296         buffer[i + 2] = comps[compsPos++];
   23297         buffer[i + 3] = opacity[opacityPos++];
   23298       }
   23299     },
   23300     fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
   23301       var numComps = this.numComps;
   23302       if (numComps != 1)
   23303         error('Reading gray scale from a color image: ' + numComps);
   23304 
   23305       var width = this.width;
   23306       var height = this.height;
   23307       var bpc = this.bpc;
   23308 
   23309       // rows start at byte boundary;
   23310       var rowBytes = (width * numComps * bpc + 7) >> 3;
   23311       var imgArray = this.getImageBytes(height * rowBytes);
   23312 
   23313       var comps = this.getComponents(imgArray);
   23314       var length = width * height;
   23315       // we aren't using a colorspace so we need to scale the value
   23316       var scale = 255 / ((1 << bpc) - 1);
   23317       for (var i = 0; i < length; ++i)
   23318         buffer[i] = (scale * comps[i]) | 0;
   23319     },
   23320     getImageBytes: function PDFImage_getImageBytes(length) {
   23321       this.image.reset();
   23322       return this.image.getBytes(length);
   23323     }
   23324   };
   23325   return PDFImage;
   23326 })();
   23327 
   23328 function loadJpegStream(id, imageData, objs) {
   23329   var img = new Image();
   23330   img.onload = (function loadJpegStream_onloadClosure() {
   23331     objs.resolve(id, img);
   23332   });
   23333   img.src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
   23334 }
   23335 
   23336 
   23337 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   23338 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   23339 
   23340 'use strict';
   23341 
   23342 // The Metrics object contains glyph widths (in glyph space units).
   23343 // As per PDF spec, for most fonts (Type 3 being an exception) a glyph
   23344 // space unit corresponds to 1/1000th of text space unit.
   23345 var Metrics = {
   23346   'Courier': 600,
   23347   'Courier-Bold': 600,
   23348   'Courier-BoldOblique': 600,
   23349   'Courier-Oblique': 600,
   23350   'Helvetica' : {
   23351     'space': 278,
   23352     'exclam': 278,
   23353     'quotedbl': 355,
   23354     'numbersign': 556,
   23355     'dollar': 556,
   23356     'percent': 889,
   23357     'ampersand': 667,
   23358     'quoteright': 222,
   23359     'parenleft': 333,
   23360     'parenright': 333,
   23361     'asterisk': 389,
   23362     'plus': 584,
   23363     'comma': 278,
   23364     'hyphen': 333,
   23365     'period': 278,
   23366     'slash': 278,
   23367     'zero': 556,
   23368     'one': 556,
   23369     'two': 556,
   23370     'three': 556,
   23371     'four': 556,
   23372     'five': 556,
   23373     'six': 556,
   23374     'seven': 556,
   23375     'eight': 556,
   23376     'nine': 556,
   23377     'colon': 278,
   23378     'semicolon': 278,
   23379     'less': 584,
   23380     'equal': 584,
   23381     'greater': 584,
   23382     'question': 556,
   23383     'at': 1015,
   23384     'A': 667,
   23385     'B': 667,
   23386     'C': 722,
   23387     'D': 722,
   23388     'E': 667,
   23389     'F': 611,
   23390     'G': 778,
   23391     'H': 722,
   23392     'I': 278,
   23393     'J': 500,
   23394     'K': 667,
   23395     'L': 556,
   23396     'M': 833,
   23397     'N': 722,
   23398     'O': 778,
   23399     'P': 667,
   23400     'Q': 778,
   23401     'R': 722,
   23402     'S': 667,
   23403     'T': 611,
   23404     'U': 722,
   23405     'V': 667,
   23406     'W': 944,
   23407     'X': 667,
   23408     'Y': 667,
   23409     'Z': 611,
   23410     'bracketleft': 278,
   23411     'backslash': 278,
   23412     'bracketright': 278,
   23413     'asciicircum': 469,
   23414     'underscore': 556,
   23415     'quoteleft': 222,
   23416     'a': 556,
   23417     'b': 556,
   23418     'c': 500,
   23419     'd': 556,
   23420     'e': 556,
   23421     'f': 278,
   23422     'g': 556,
   23423     'h': 556,
   23424     'i': 222,
   23425     'j': 222,
   23426     'k': 500,
   23427     'l': 222,
   23428     'm': 833,
   23429     'n': 556,
   23430     'o': 556,
   23431     'p': 556,
   23432     'q': 556,
   23433     'r': 333,
   23434     's': 500,
   23435     't': 278,
   23436     'u': 556,
   23437     'v': 500,
   23438     'w': 722,
   23439     'x': 500,
   23440     'y': 500,
   23441     'z': 500,
   23442     'braceleft': 334,
   23443     'bar': 260,
   23444     'braceright': 334,
   23445     'asciitilde': 584,
   23446     'exclamdown': 333,
   23447     'cent': 556,
   23448     'sterling': 556,
   23449     'fraction': 167,
   23450     'yen': 556,
   23451     'florin': 556,
   23452     'section': 556,
   23453     'currency': 556,
   23454     'quotesingle': 191,
   23455     'quotedblleft': 333,
   23456     'guillemotleft': 556,
   23457     'guilsinglleft': 333,
   23458     'guilsinglright': 333,
   23459     'fi': 500,
   23460     'fl': 500,
   23461     'endash': 556,
   23462     'dagger': 556,
   23463     'daggerdbl': 556,
   23464     'periodcentered': 278,
   23465     'paragraph': 537,
   23466     'bullet': 350,
   23467     'quotesinglbase': 222,
   23468     'quotedblbase': 333,
   23469     'quotedblright': 333,
   23470     'guillemotright': 556,
   23471     'ellipsis': 1000,
   23472     'perthousand': 1000,
   23473     'questiondown': 611,
   23474     'grave': 333,
   23475     'acute': 333,
   23476     'circumflex': 333,
   23477     'tilde': 333,
   23478     'macron': 333,
   23479     'breve': 333,
   23480     'dotaccent': 333,
   23481     'dieresis': 333,
   23482     'ring': 333,
   23483     'cedilla': 333,
   23484     'hungarumlaut': 333,
   23485     'ogonek': 333,
   23486     'caron': 333,
   23487     'emdash': 1000,
   23488     'AE': 1000,
   23489     'ordfeminine': 370,
   23490     'Lslash': 556,
   23491     'Oslash': 778,
   23492     'OE': 1000,
   23493     'ordmasculine': 365,
   23494     'ae': 889,
   23495     'dotlessi': 278,
   23496     'lslash': 222,
   23497     'oslash': 611,
   23498     'oe': 944,
   23499     'germandbls': 611,
   23500     'Idieresis': 278,
   23501     'eacute': 556,
   23502     'abreve': 556,
   23503     'uhungarumlaut': 556,
   23504     'ecaron': 556,
   23505     'Ydieresis': 667,
   23506     'divide': 584,
   23507     'Yacute': 667,
   23508     'Acircumflex': 667,
   23509     'aacute': 556,
   23510     'Ucircumflex': 722,
   23511     'yacute': 500,
   23512     'scommaaccent': 500,
   23513     'ecircumflex': 556,
   23514     'Uring': 722,
   23515     'Udieresis': 722,
   23516     'aogonek': 556,
   23517     'Uacute': 722,
   23518     'uogonek': 556,
   23519     'Edieresis': 667,
   23520     'Dcroat': 722,
   23521     'commaaccent': 250,
   23522     'copyright': 737,
   23523     'Emacron': 667,
   23524     'ccaron': 500,
   23525     'aring': 556,
   23526     'Ncommaaccent': 722,
   23527     'lacute': 222,
   23528     'agrave': 556,
   23529     'Tcommaaccent': 611,
   23530     'Cacute': 722,
   23531     'atilde': 556,
   23532     'Edotaccent': 667,
   23533     'scaron': 500,
   23534     'scedilla': 500,
   23535     'iacute': 278,
   23536     'lozenge': 471,
   23537     'Rcaron': 722,
   23538     'Gcommaaccent': 778,
   23539     'ucircumflex': 556,
   23540     'acircumflex': 556,
   23541     'Amacron': 667,
   23542     'rcaron': 333,
   23543     'ccedilla': 500,
   23544     'Zdotaccent': 611,
   23545     'Thorn': 667,
   23546     'Omacron': 778,
   23547     'Racute': 722,
   23548     'Sacute': 667,
   23549     'dcaron': 643,
   23550     'Umacron': 722,
   23551     'uring': 556,
   23552     'threesuperior': 333,
   23553     'Ograve': 778,
   23554     'Agrave': 667,
   23555     'Abreve': 667,
   23556     'multiply': 584,
   23557     'uacute': 556,
   23558     'Tcaron': 611,
   23559     'partialdiff': 476,
   23560     'ydieresis': 500,
   23561     'Nacute': 722,
   23562     'icircumflex': 278,
   23563     'Ecircumflex': 667,
   23564     'adieresis': 556,
   23565     'edieresis': 556,
   23566     'cacute': 500,
   23567     'nacute': 556,
   23568     'umacron': 556,
   23569     'Ncaron': 722,
   23570     'Iacute': 278,
   23571     'plusminus': 584,
   23572     'brokenbar': 260,
   23573     'registered': 737,
   23574     'Gbreve': 778,
   23575     'Idotaccent': 278,
   23576     'summation': 600,
   23577     'Egrave': 667,
   23578     'racute': 333,
   23579     'omacron': 556,
   23580     'Zacute': 611,
   23581     'Zcaron': 611,
   23582     'greaterequal': 549,
   23583     'Eth': 722,
   23584     'Ccedilla': 722,
   23585     'lcommaaccent': 222,
   23586     'tcaron': 317,
   23587     'eogonek': 556,
   23588     'Uogonek': 722,
   23589     'Aacute': 667,
   23590     'Adieresis': 667,
   23591     'egrave': 556,
   23592     'zacute': 500,
   23593     'iogonek': 222,
   23594     'Oacute': 778,
   23595     'oacute': 556,
   23596     'amacron': 556,
   23597     'sacute': 500,
   23598     'idieresis': 278,
   23599     'Ocircumflex': 778,
   23600     'Ugrave': 722,
   23601     'Delta': 612,
   23602     'thorn': 556,
   23603     'twosuperior': 333,
   23604     'Odieresis': 778,
   23605     'mu': 556,
   23606     'igrave': 278,
   23607     'ohungarumlaut': 556,
   23608     'Eogonek': 667,
   23609     'dcroat': 556,
   23610     'threequarters': 834,
   23611     'Scedilla': 667,
   23612     'lcaron': 299,
   23613     'Kcommaaccent': 667,
   23614     'Lacute': 556,
   23615     'trademark': 1000,
   23616     'edotaccent': 556,
   23617     'Igrave': 278,
   23618     'Imacron': 278,
   23619     'Lcaron': 556,
   23620     'onehalf': 834,
   23621     'lessequal': 549,
   23622     'ocircumflex': 556,
   23623     'ntilde': 556,
   23624     'Uhungarumlaut': 722,
   23625     'Eacute': 667,
   23626     'emacron': 556,
   23627     'gbreve': 556,
   23628     'onequarter': 834,
   23629     'Scaron': 667,
   23630     'Scommaaccent': 667,
   23631     'Ohungarumlaut': 778,
   23632     'degree': 400,
   23633     'ograve': 556,
   23634     'Ccaron': 722,
   23635     'ugrave': 556,
   23636     'radical': 453,
   23637     'Dcaron': 722,
   23638     'rcommaaccent': 333,
   23639     'Ntilde': 722,
   23640     'otilde': 556,
   23641     'Rcommaaccent': 722,
   23642     'Lcommaaccent': 556,
   23643     'Atilde': 667,
   23644     'Aogonek': 667,
   23645     'Aring': 667,
   23646     'Otilde': 778,
   23647     'zdotaccent': 500,
   23648     'Ecaron': 667,
   23649     'Iogonek': 278,
   23650     'kcommaaccent': 500,
   23651     'minus': 584,
   23652     'Icircumflex': 278,
   23653     'ncaron': 556,
   23654     'tcommaaccent': 278,
   23655     'logicalnot': 584,
   23656     'odieresis': 556,
   23657     'udieresis': 556,
   23658     'notequal': 549,
   23659     'gcommaaccent': 556,
   23660     'eth': 556,
   23661     'zcaron': 500,
   23662     'ncommaaccent': 556,
   23663     'onesuperior': 333,
   23664     'imacron': 278,
   23665     'Euro': 556
   23666   },
   23667   'Helvetica-Bold': {
   23668     'space': 278,
   23669     'exclam': 333,
   23670     'quotedbl': 474,
   23671     'numbersign': 556,
   23672     'dollar': 556,
   23673     'percent': 889,
   23674     'ampersand': 722,
   23675     'quoteright': 278,
   23676     'parenleft': 333,
   23677     'parenright': 333,
   23678     'asterisk': 389,
   23679     'plus': 584,
   23680     'comma': 278,
   23681     'hyphen': 333,
   23682     'period': 278,
   23683     'slash': 278,
   23684     'zero': 556,
   23685     'one': 556,
   23686     'two': 556,
   23687     'three': 556,
   23688     'four': 556,
   23689     'five': 556,
   23690     'six': 556,
   23691     'seven': 556,
   23692     'eight': 556,
   23693     'nine': 556,
   23694     'colon': 333,
   23695     'semicolon': 333,
   23696     'less': 584,
   23697     'equal': 584,
   23698     'greater': 584,
   23699     'question': 611,
   23700     'at': 975,
   23701     'A': 722,
   23702     'B': 722,
   23703     'C': 722,
   23704     'D': 722,
   23705     'E': 667,
   23706     'F': 611,
   23707     'G': 778,
   23708     'H': 722,
   23709     'I': 278,
   23710     'J': 556,
   23711     'K': 722,
   23712     'L': 611,
   23713     'M': 833,
   23714     'N': 722,
   23715     'O': 778,
   23716     'P': 667,
   23717     'Q': 778,
   23718     'R': 722,
   23719     'S': 667,
   23720     'T': 611,
   23721     'U': 722,
   23722     'V': 667,
   23723     'W': 944,
   23724     'X': 667,
   23725     'Y': 667,
   23726     'Z': 611,
   23727     'bracketleft': 333,
   23728     'backslash': 278,
   23729     'bracketright': 333,
   23730     'asciicircum': 584,
   23731     'underscore': 556,
   23732     'quoteleft': 278,
   23733     'a': 556,
   23734     'b': 611,
   23735     'c': 556,
   23736     'd': 611,
   23737     'e': 556,
   23738     'f': 333,
   23739     'g': 611,
   23740     'h': 611,
   23741     'i': 278,
   23742     'j': 278,
   23743     'k': 556,
   23744     'l': 278,
   23745     'm': 889,
   23746     'n': 611,
   23747     'o': 611,
   23748     'p': 611,
   23749     'q': 611,
   23750     'r': 389,
   23751     's': 556,
   23752     't': 333,
   23753     'u': 611,
   23754     'v': 556,
   23755     'w': 778,
   23756     'x': 556,
   23757     'y': 556,
   23758     'z': 500,
   23759     'braceleft': 389,
   23760     'bar': 280,
   23761     'braceright': 389,
   23762     'asciitilde': 584,
   23763     'exclamdown': 333,
   23764     'cent': 556,
   23765     'sterling': 556,
   23766     'fraction': 167,
   23767     'yen': 556,
   23768     'florin': 556,
   23769     'section': 556,
   23770     'currency': 556,
   23771     'quotesingle': 238,
   23772     'quotedblleft': 500,
   23773     'guillemotleft': 556,
   23774     'guilsinglleft': 333,
   23775     'guilsinglright': 333,
   23776     'fi': 611,
   23777     'fl': 611,
   23778     'endash': 556,
   23779     'dagger': 556,
   23780     'daggerdbl': 556,
   23781     'periodcentered': 278,
   23782     'paragraph': 556,
   23783     'bullet': 350,
   23784     'quotesinglbase': 278,
   23785     'quotedblbase': 500,
   23786     'quotedblright': 500,
   23787     'guillemotright': 556,
   23788     'ellipsis': 1000,
   23789     'perthousand': 1000,
   23790     'questiondown': 611,
   23791     'grave': 333,
   23792     'acute': 333,
   23793     'circumflex': 333,
   23794     'tilde': 333,
   23795     'macron': 333,
   23796     'breve': 333,
   23797     'dotaccent': 333,
   23798     'dieresis': 333,
   23799     'ring': 333,
   23800     'cedilla': 333,
   23801     'hungarumlaut': 333,
   23802     'ogonek': 333,
   23803     'caron': 333,
   23804     'emdash': 1000,
   23805     'AE': 1000,
   23806     'ordfeminine': 370,
   23807     'Lslash': 611,
   23808     'Oslash': 778,
   23809     'OE': 1000,
   23810     'ordmasculine': 365,
   23811     'ae': 889,
   23812     'dotlessi': 278,
   23813     'lslash': 278,
   23814     'oslash': 611,
   23815     'oe': 944,
   23816     'germandbls': 611,
   23817     'Idieresis': 278,
   23818     'eacute': 556,
   23819     'abreve': 556,
   23820     'uhungarumlaut': 611,
   23821     'ecaron': 556,
   23822     'Ydieresis': 667,
   23823     'divide': 584,
   23824     'Yacute': 667,
   23825     'Acircumflex': 722,
   23826     'aacute': 556,
   23827     'Ucircumflex': 722,
   23828     'yacute': 556,
   23829     'scommaaccent': 556,
   23830     'ecircumflex': 556,
   23831     'Uring': 722,
   23832     'Udieresis': 722,
   23833     'aogonek': 556,
   23834     'Uacute': 722,
   23835     'uogonek': 611,
   23836     'Edieresis': 667,
   23837     'Dcroat': 722,
   23838     'commaaccent': 250,
   23839     'copyright': 737,
   23840     'Emacron': 667,
   23841     'ccaron': 556,
   23842     'aring': 556,
   23843     'Ncommaaccent': 722,
   23844     'lacute': 278,
   23845     'agrave': 556,
   23846     'Tcommaaccent': 611,
   23847     'Cacute': 722,
   23848     'atilde': 556,
   23849     'Edotaccent': 667,
   23850     'scaron': 556,
   23851     'scedilla': 556,
   23852     'iacute': 278,
   23853     'lozenge': 494,
   23854     'Rcaron': 722,
   23855     'Gcommaaccent': 778,
   23856     'ucircumflex': 611,
   23857     'acircumflex': 556,
   23858     'Amacron': 722,
   23859     'rcaron': 389,
   23860     'ccedilla': 556,
   23861     'Zdotaccent': 611,
   23862     'Thorn': 667,
   23863     'Omacron': 778,
   23864     'Racute': 722,
   23865     'Sacute': 667,
   23866     'dcaron': 743,
   23867     'Umacron': 722,
   23868     'uring': 611,
   23869     'threesuperior': 333,
   23870     'Ograve': 778,
   23871     'Agrave': 722,
   23872     'Abreve': 722,
   23873     'multiply': 584,
   23874     'uacute': 611,
   23875     'Tcaron': 611,
   23876     'partialdiff': 494,
   23877     'ydieresis': 556,
   23878     'Nacute': 722,
   23879     'icircumflex': 278,
   23880     'Ecircumflex': 667,
   23881     'adieresis': 556,
   23882     'edieresis': 556,
   23883     'cacute': 556,
   23884     'nacute': 611,
   23885     'umacron': 611,
   23886     'Ncaron': 722,
   23887     'Iacute': 278,
   23888     'plusminus': 584,
   23889     'brokenbar': 280,
   23890     'registered': 737,
   23891     'Gbreve': 778,
   23892     'Idotaccent': 278,
   23893     'summation': 600,
   23894     'Egrave': 667,
   23895     'racute': 389,
   23896     'omacron': 611,
   23897     'Zacute': 611,
   23898     'Zcaron': 611,
   23899     'greaterequal': 549,
   23900     'Eth': 722,
   23901     'Ccedilla': 722,
   23902     'lcommaaccent': 278,
   23903     'tcaron': 389,
   23904     'eogonek': 556,
   23905     'Uogonek': 722,
   23906     'Aacute': 722,
   23907     'Adieresis': 722,
   23908     'egrave': 556,
   23909     'zacute': 500,
   23910     'iogonek': 278,
   23911     'Oacute': 778,
   23912     'oacute': 611,
   23913     'amacron': 556,
   23914     'sacute': 556,
   23915     'idieresis': 278,
   23916     'Ocircumflex': 778,
   23917     'Ugrave': 722,
   23918     'Delta': 612,
   23919     'thorn': 611,
   23920     'twosuperior': 333,
   23921     'Odieresis': 778,
   23922     'mu': 611,
   23923     'igrave': 278,
   23924     'ohungarumlaut': 611,
   23925     'Eogonek': 667,
   23926     'dcroat': 611,
   23927     'threequarters': 834,
   23928     'Scedilla': 667,
   23929     'lcaron': 400,
   23930     'Kcommaaccent': 722,
   23931     'Lacute': 611,
   23932     'trademark': 1000,
   23933     'edotaccent': 556,
   23934     'Igrave': 278,
   23935     'Imacron': 278,
   23936     'Lcaron': 611,
   23937     'onehalf': 834,
   23938     'lessequal': 549,
   23939     'ocircumflex': 611,
   23940     'ntilde': 611,
   23941     'Uhungarumlaut': 722,
   23942     'Eacute': 667,
   23943     'emacron': 556,
   23944     'gbreve': 611,
   23945     'onequarter': 834,
   23946     'Scaron': 667,
   23947     'Scommaaccent': 667,
   23948     'Ohungarumlaut': 778,
   23949     'degree': 400,
   23950     'ograve': 611,
   23951     'Ccaron': 722,
   23952     'ugrave': 611,
   23953     'radical': 549,
   23954     'Dcaron': 722,
   23955     'rcommaaccent': 389,
   23956     'Ntilde': 722,
   23957     'otilde': 611,
   23958     'Rcommaaccent': 722,
   23959     'Lcommaaccent': 611,
   23960     'Atilde': 722,
   23961     'Aogonek': 722,
   23962     'Aring': 722,
   23963     'Otilde': 778,
   23964     'zdotaccent': 500,
   23965     'Ecaron': 667,
   23966     'Iogonek': 278,
   23967     'kcommaaccent': 556,
   23968     'minus': 584,
   23969     'Icircumflex': 278,
   23970     'ncaron': 611,
   23971     'tcommaaccent': 333,
   23972     'logicalnot': 584,
   23973     'odieresis': 611,
   23974     'udieresis': 611,
   23975     'notequal': 549,
   23976     'gcommaaccent': 611,
   23977     'eth': 611,
   23978     'zcaron': 500,
   23979     'ncommaaccent': 611,
   23980     'onesuperior': 333,
   23981     'imacron': 278,
   23982     'Euro': 556
   23983   },
   23984   'Helvetica-BoldOblique': {
   23985     'space': 278,
   23986     'exclam': 333,
   23987     'quotedbl': 474,
   23988     'numbersign': 556,
   23989     'dollar': 556,
   23990     'percent': 889,
   23991     'ampersand': 722,
   23992     'quoteright': 278,
   23993     'parenleft': 333,
   23994     'parenright': 333,
   23995     'asterisk': 389,
   23996     'plus': 584,
   23997     'comma': 278,
   23998     'hyphen': 333,
   23999     'period': 278,
   24000     'slash': 278,
   24001     'zero': 556,
   24002     'one': 556,
   24003     'two': 556,
   24004     'three': 556,
   24005     'four': 556,
   24006     'five': 556,
   24007     'six': 556,
   24008     'seven': 556,
   24009     'eight': 556,
   24010     'nine': 556,
   24011     'colon': 333,
   24012     'semicolon': 333,
   24013     'less': 584,
   24014     'equal': 584,
   24015     'greater': 584,
   24016     'question': 611,
   24017     'at': 975,
   24018     'A': 722,
   24019     'B': 722,
   24020     'C': 722,
   24021     'D': 722,
   24022     'E': 667,
   24023     'F': 611,
   24024     'G': 778,
   24025     'H': 722,
   24026     'I': 278,
   24027     'J': 556,
   24028     'K': 722,
   24029     'L': 611,
   24030     'M': 833,
   24031     'N': 722,
   24032     'O': 778,
   24033     'P': 667,
   24034     'Q': 778,
   24035     'R': 722,
   24036     'S': 667,
   24037     'T': 611,
   24038     'U': 722,
   24039     'V': 667,
   24040     'W': 944,
   24041     'X': 667,
   24042     'Y': 667,
   24043     'Z': 611,
   24044     'bracketleft': 333,
   24045     'backslash': 278,
   24046     'bracketright': 333,
   24047     'asciicircum': 584,
   24048     'underscore': 556,
   24049     'quoteleft': 278,
   24050     'a': 556,
   24051     'b': 611,
   24052     'c': 556,
   24053     'd': 611,
   24054     'e': 556,
   24055     'f': 333,
   24056     'g': 611,
   24057     'h': 611,
   24058     'i': 278,
   24059     'j': 278,
   24060     'k': 556,
   24061     'l': 278,
   24062     'm': 889,
   24063     'n': 611,
   24064     'o': 611,
   24065     'p': 611,
   24066     'q': 611,
   24067     'r': 389,
   24068     's': 556,
   24069     't': 333,
   24070     'u': 611,
   24071     'v': 556,
   24072     'w': 778,
   24073     'x': 556,
   24074     'y': 556,
   24075     'z': 500,
   24076     'braceleft': 389,
   24077     'bar': 280,
   24078     'braceright': 389,
   24079     'asciitilde': 584,
   24080     'exclamdown': 333,
   24081     'cent': 556,
   24082     'sterling': 556,
   24083     'fraction': 167,
   24084     'yen': 556,
   24085     'florin': 556,
   24086     'section': 556,
   24087     'currency': 556,
   24088     'quotesingle': 238,
   24089     'quotedblleft': 500,
   24090     'guillemotleft': 556,
   24091     'guilsinglleft': 333,
   24092     'guilsinglright': 333,
   24093     'fi': 611,
   24094     'fl': 611,
   24095     'endash': 556,
   24096     'dagger': 556,
   24097     'daggerdbl': 556,
   24098     'periodcentered': 278,
   24099     'paragraph': 556,
   24100     'bullet': 350,
   24101     'quotesinglbase': 278,
   24102     'quotedblbase': 500,
   24103     'quotedblright': 500,
   24104     'guillemotright': 556,
   24105     'ellipsis': 1000,
   24106     'perthousand': 1000,
   24107     'questiondown': 611,
   24108     'grave': 333,
   24109     'acute': 333,
   24110     'circumflex': 333,
   24111     'tilde': 333,
   24112     'macron': 333,
   24113     'breve': 333,
   24114     'dotaccent': 333,
   24115     'dieresis': 333,
   24116     'ring': 333,
   24117     'cedilla': 333,
   24118     'hungarumlaut': 333,
   24119     'ogonek': 333,
   24120     'caron': 333,
   24121     'emdash': 1000,
   24122     'AE': 1000,
   24123     'ordfeminine': 370,
   24124     'Lslash': 611,
   24125     'Oslash': 778,
   24126     'OE': 1000,
   24127     'ordmasculine': 365,
   24128     'ae': 889,
   24129     'dotlessi': 278,
   24130     'lslash': 278,
   24131     'oslash': 611,
   24132     'oe': 944,
   24133     'germandbls': 611,
   24134     'Idieresis': 278,
   24135     'eacute': 556,
   24136     'abreve': 556,
   24137     'uhungarumlaut': 611,
   24138     'ecaron': 556,
   24139     'Ydieresis': 667,
   24140     'divide': 584,
   24141     'Yacute': 667,
   24142     'Acircumflex': 722,
   24143     'aacute': 556,
   24144     'Ucircumflex': 722,
   24145     'yacute': 556,
   24146     'scommaaccent': 556,
   24147     'ecircumflex': 556,
   24148     'Uring': 722,
   24149     'Udieresis': 722,
   24150     'aogonek': 556,
   24151     'Uacute': 722,
   24152     'uogonek': 611,
   24153     'Edieresis': 667,
   24154     'Dcroat': 722,
   24155     'commaaccent': 250,
   24156     'copyright': 737,
   24157     'Emacron': 667,
   24158     'ccaron': 556,
   24159     'aring': 556,
   24160     'Ncommaaccent': 722,
   24161     'lacute': 278,
   24162     'agrave': 556,
   24163     'Tcommaaccent': 611,
   24164     'Cacute': 722,
   24165     'atilde': 556,
   24166     'Edotaccent': 667,
   24167     'scaron': 556,
   24168     'scedilla': 556,
   24169     'iacute': 278,
   24170     'lozenge': 494,
   24171     'Rcaron': 722,
   24172     'Gcommaaccent': 778,
   24173     'ucircumflex': 611,
   24174     'acircumflex': 556,
   24175     'Amacron': 722,
   24176     'rcaron': 389,
   24177     'ccedilla': 556,
   24178     'Zdotaccent': 611,
   24179     'Thorn': 667,
   24180     'Omacron': 778,
   24181     'Racute': 722,
   24182     'Sacute': 667,
   24183     'dcaron': 743,
   24184     'Umacron': 722,
   24185     'uring': 611,
   24186     'threesuperior': 333,
   24187     'Ograve': 778,
   24188     'Agrave': 722,
   24189     'Abreve': 722,
   24190     'multiply': 584,
   24191     'uacute': 611,
   24192     'Tcaron': 611,
   24193     'partialdiff': 494,
   24194     'ydieresis': 556,
   24195     'Nacute': 722,
   24196     'icircumflex': 278,
   24197     'Ecircumflex': 667,
   24198     'adieresis': 556,
   24199     'edieresis': 556,
   24200     'cacute': 556,
   24201     'nacute': 611,
   24202     'umacron': 611,
   24203     'Ncaron': 722,
   24204     'Iacute': 278,
   24205     'plusminus': 584,
   24206     'brokenbar': 280,
   24207     'registered': 737,
   24208     'Gbreve': 778,
   24209     'Idotaccent': 278,
   24210     'summation': 600,
   24211     'Egrave': 667,
   24212     'racute': 389,
   24213     'omacron': 611,
   24214     'Zacute': 611,
   24215     'Zcaron': 611,
   24216     'greaterequal': 549,
   24217     'Eth': 722,
   24218     'Ccedilla': 722,
   24219     'lcommaaccent': 278,
   24220     'tcaron': 389,
   24221     'eogonek': 556,
   24222     'Uogonek': 722,
   24223     'Aacute': 722,
   24224     'Adieresis': 722,
   24225     'egrave': 556,
   24226     'zacute': 500,
   24227     'iogonek': 278,
   24228     'Oacute': 778,
   24229     'oacute': 611,
   24230     'amacron': 556,
   24231     'sacute': 556,
   24232     'idieresis': 278,
   24233     'Ocircumflex': 778,
   24234     'Ugrave': 722,
   24235     'Delta': 612,
   24236     'thorn': 611,
   24237     'twosuperior': 333,
   24238     'Odieresis': 778,
   24239     'mu': 611,
   24240     'igrave': 278,
   24241     'ohungarumlaut': 611,
   24242     'Eogonek': 667,
   24243     'dcroat': 611,
   24244     'threequarters': 834,
   24245     'Scedilla': 667,
   24246     'lcaron': 400,
   24247     'Kcommaaccent': 722,
   24248     'Lacute': 611,
   24249     'trademark': 1000,
   24250     'edotaccent': 556,
   24251     'Igrave': 278,
   24252     'Imacron': 278,
   24253     'Lcaron': 611,
   24254     'onehalf': 834,
   24255     'lessequal': 549,
   24256     'ocircumflex': 611,
   24257     'ntilde': 611,
   24258     'Uhungarumlaut': 722,
   24259     'Eacute': 667,
   24260     'emacron': 556,
   24261     'gbreve': 611,
   24262     'onequarter': 834,
   24263     'Scaron': 667,
   24264     'Scommaaccent': 667,
   24265     'Ohungarumlaut': 778,
   24266     'degree': 400,
   24267     'ograve': 611,
   24268     'Ccaron': 722,
   24269     'ugrave': 611,
   24270     'radical': 549,
   24271     'Dcaron': 722,
   24272     'rcommaaccent': 389,
   24273     'Ntilde': 722,
   24274     'otilde': 611,
   24275     'Rcommaaccent': 722,
   24276     'Lcommaaccent': 611,
   24277     'Atilde': 722,
   24278     'Aogonek': 722,
   24279     'Aring': 722,
   24280     'Otilde': 778,
   24281     'zdotaccent': 500,
   24282     'Ecaron': 667,
   24283     'Iogonek': 278,
   24284     'kcommaaccent': 556,
   24285     'minus': 584,
   24286     'Icircumflex': 278,
   24287     'ncaron': 611,
   24288     'tcommaaccent': 333,
   24289     'logicalnot': 584,
   24290     'odieresis': 611,
   24291     'udieresis': 611,
   24292     'notequal': 549,
   24293     'gcommaaccent': 611,
   24294     'eth': 611,
   24295     'zcaron': 500,
   24296     'ncommaaccent': 611,
   24297     'onesuperior': 333,
   24298     'imacron': 278,
   24299     'Euro': 556
   24300   },
   24301   'Helvetica-Oblique' : {
   24302     'space': 278,
   24303     'exclam': 278,
   24304     'quotedbl': 355,
   24305     'numbersign': 556,
   24306     'dollar': 556,
   24307     'percent': 889,
   24308     'ampersand': 667,
   24309     'quoteright': 222,
   24310     'parenleft': 333,
   24311     'parenright': 333,
   24312     'asterisk': 389,
   24313     'plus': 584,
   24314     'comma': 278,
   24315     'hyphen': 333,
   24316     'period': 278,
   24317     'slash': 278,
   24318     'zero': 556,
   24319     'one': 556,
   24320     'two': 556,
   24321     'three': 556,
   24322     'four': 556,
   24323     'five': 556,
   24324     'six': 556,
   24325     'seven': 556,
   24326     'eight': 556,
   24327     'nine': 556,
   24328     'colon': 278,
   24329     'semicolon': 278,
   24330     'less': 584,
   24331     'equal': 584,
   24332     'greater': 584,
   24333     'question': 556,
   24334     'at': 1015,
   24335     'A': 667,
   24336     'B': 667,
   24337     'C': 722,
   24338     'D': 722,
   24339     'E': 667,
   24340     'F': 611,
   24341     'G': 778,
   24342     'H': 722,
   24343     'I': 278,
   24344     'J': 500,
   24345     'K': 667,
   24346     'L': 556,
   24347     'M': 833,
   24348     'N': 722,
   24349     'O': 778,
   24350     'P': 667,
   24351     'Q': 778,
   24352     'R': 722,
   24353     'S': 667,
   24354     'T': 611,
   24355     'U': 722,
   24356     'V': 667,
   24357     'W': 944,
   24358     'X': 667,
   24359     'Y': 667,
   24360     'Z': 611,
   24361     'bracketleft': 278,
   24362     'backslash': 278,
   24363     'bracketright': 278,
   24364     'asciicircum': 469,
   24365     'underscore': 556,
   24366     'quoteleft': 222,
   24367     'a': 556,
   24368     'b': 556,
   24369     'c': 500,
   24370     'd': 556,
   24371     'e': 556,
   24372     'f': 278,
   24373     'g': 556,
   24374     'h': 556,
   24375     'i': 222,
   24376     'j': 222,
   24377     'k': 500,
   24378     'l': 222,
   24379     'm': 833,
   24380     'n': 556,
   24381     'o': 556,
   24382     'p': 556,
   24383     'q': 556,
   24384     'r': 333,
   24385     's': 500,
   24386     't': 278,
   24387     'u': 556,
   24388     'v': 500,
   24389     'w': 722,
   24390     'x': 500,
   24391     'y': 500,
   24392     'z': 500,
   24393     'braceleft': 334,
   24394     'bar': 260,
   24395     'braceright': 334,
   24396     'asciitilde': 584,
   24397     'exclamdown': 333,
   24398     'cent': 556,
   24399     'sterling': 556,
   24400     'fraction': 167,
   24401     'yen': 556,
   24402     'florin': 556,
   24403     'section': 556,
   24404     'currency': 556,
   24405     'quotesingle': 191,
   24406     'quotedblleft': 333,
   24407     'guillemotleft': 556,
   24408     'guilsinglleft': 333,
   24409     'guilsinglright': 333,
   24410     'fi': 500,
   24411     'fl': 500,
   24412     'endash': 556,
   24413     'dagger': 556,
   24414     'daggerdbl': 556,
   24415     'periodcentered': 278,
   24416     'paragraph': 537,
   24417     'bullet': 350,
   24418     'quotesinglbase': 222,
   24419     'quotedblbase': 333,
   24420     'quotedblright': 333,
   24421     'guillemotright': 556,
   24422     'ellipsis': 1000,
   24423     'perthousand': 1000,
   24424     'questiondown': 611,
   24425     'grave': 333,
   24426     'acute': 333,
   24427     'circumflex': 333,
   24428     'tilde': 333,
   24429     'macron': 333,
   24430     'breve': 333,
   24431     'dotaccent': 333,
   24432     'dieresis': 333,
   24433     'ring': 333,
   24434     'cedilla': 333,
   24435     'hungarumlaut': 333,
   24436     'ogonek': 333,
   24437     'caron': 333,
   24438     'emdash': 1000,
   24439     'AE': 1000,
   24440     'ordfeminine': 370,
   24441     'Lslash': 556,
   24442     'Oslash': 778,
   24443     'OE': 1000,
   24444     'ordmasculine': 365,
   24445     'ae': 889,
   24446     'dotlessi': 278,
   24447     'lslash': 222,
   24448     'oslash': 611,
   24449     'oe': 944,
   24450     'germandbls': 611,
   24451     'Idieresis': 278,
   24452     'eacute': 556,
   24453     'abreve': 556,
   24454     'uhungarumlaut': 556,
   24455     'ecaron': 556,
   24456     'Ydieresis': 667,
   24457     'divide': 584,
   24458     'Yacute': 667,
   24459     'Acircumflex': 667,
   24460     'aacute': 556,
   24461     'Ucircumflex': 722,
   24462     'yacute': 500,
   24463     'scommaaccent': 500,
   24464     'ecircumflex': 556,
   24465     'Uring': 722,
   24466     'Udieresis': 722,
   24467     'aogonek': 556,
   24468     'Uacute': 722,
   24469     'uogonek': 556,
   24470     'Edieresis': 667,
   24471     'Dcroat': 722,
   24472     'commaaccent': 250,
   24473     'copyright': 737,
   24474     'Emacron': 667,
   24475     'ccaron': 500,
   24476     'aring': 556,
   24477     'Ncommaaccent': 722,
   24478     'lacute': 222,
   24479     'agrave': 556,
   24480     'Tcommaaccent': 611,
   24481     'Cacute': 722,
   24482     'atilde': 556,
   24483     'Edotaccent': 667,
   24484     'scaron': 500,
   24485     'scedilla': 500,
   24486     'iacute': 278,
   24487     'lozenge': 471,
   24488     'Rcaron': 722,
   24489     'Gcommaaccent': 778,
   24490     'ucircumflex': 556,
   24491     'acircumflex': 556,
   24492     'Amacron': 667,
   24493     'rcaron': 333,
   24494     'ccedilla': 500,
   24495     'Zdotaccent': 611,
   24496     'Thorn': 667,
   24497     'Omacron': 778,
   24498     'Racute': 722,
   24499     'Sacute': 667,
   24500     'dcaron': 643,
   24501     'Umacron': 722,
   24502     'uring': 556,
   24503     'threesuperior': 333,
   24504     'Ograve': 778,
   24505     'Agrave': 667,
   24506     'Abreve': 667,
   24507     'multiply': 584,
   24508     'uacute': 556,
   24509     'Tcaron': 611,
   24510     'partialdiff': 476,
   24511     'ydieresis': 500,
   24512     'Nacute': 722,
   24513     'icircumflex': 278,
   24514     'Ecircumflex': 667,
   24515     'adieresis': 556,
   24516     'edieresis': 556,
   24517     'cacute': 500,
   24518     'nacute': 556,
   24519     'umacron': 556,
   24520     'Ncaron': 722,
   24521     'Iacute': 278,
   24522     'plusminus': 584,
   24523     'brokenbar': 260,
   24524     'registered': 737,
   24525     'Gbreve': 778,
   24526     'Idotaccent': 278,
   24527     'summation': 600,
   24528     'Egrave': 667,
   24529     'racute': 333,
   24530     'omacron': 556,
   24531     'Zacute': 611,
   24532     'Zcaron': 611,
   24533     'greaterequal': 549,
   24534     'Eth': 722,
   24535     'Ccedilla': 722,
   24536     'lcommaaccent': 222,
   24537     'tcaron': 317,
   24538     'eogonek': 556,
   24539     'Uogonek': 722,
   24540     'Aacute': 667,
   24541     'Adieresis': 667,
   24542     'egrave': 556,
   24543     'zacute': 500,
   24544     'iogonek': 222,
   24545     'Oacute': 778,
   24546     'oacute': 556,
   24547     'amacron': 556,
   24548     'sacute': 500,
   24549     'idieresis': 278,
   24550     'Ocircumflex': 778,
   24551     'Ugrave': 722,
   24552     'Delta': 612,
   24553     'thorn': 556,
   24554     'twosuperior': 333,
   24555     'Odieresis': 778,
   24556     'mu': 556,
   24557     'igrave': 278,
   24558     'ohungarumlaut': 556,
   24559     'Eogonek': 667,
   24560     'dcroat': 556,
   24561     'threequarters': 834,
   24562     'Scedilla': 667,
   24563     'lcaron': 299,
   24564     'Kcommaaccent': 667,
   24565     'Lacute': 556,
   24566     'trademark': 1000,
   24567     'edotaccent': 556,
   24568     'Igrave': 278,
   24569     'Imacron': 278,
   24570     'Lcaron': 556,
   24571     'onehalf': 834,
   24572     'lessequal': 549,
   24573     'ocircumflex': 556,
   24574     'ntilde': 556,
   24575     'Uhungarumlaut': 722,
   24576     'Eacute': 667,
   24577     'emacron': 556,
   24578     'gbreve': 556,
   24579     'onequarter': 834,
   24580     'Scaron': 667,
   24581     'Scommaaccent': 667,
   24582     'Ohungarumlaut': 778,
   24583     'degree': 400,
   24584     'ograve': 556,
   24585     'Ccaron': 722,
   24586     'ugrave': 556,
   24587     'radical': 453,
   24588     'Dcaron': 722,
   24589     'rcommaaccent': 333,
   24590     'Ntilde': 722,
   24591     'otilde': 556,
   24592     'Rcommaaccent': 722,
   24593     'Lcommaaccent': 556,
   24594     'Atilde': 667,
   24595     'Aogonek': 667,
   24596     'Aring': 667,
   24597     'Otilde': 778,
   24598     'zdotaccent': 500,
   24599     'Ecaron': 667,
   24600     'Iogonek': 278,
   24601     'kcommaaccent': 500,
   24602     'minus': 584,
   24603     'Icircumflex': 278,
   24604     'ncaron': 556,
   24605     'tcommaaccent': 278,
   24606     'logicalnot': 584,
   24607     'odieresis': 556,
   24608     'udieresis': 556,
   24609     'notequal': 549,
   24610     'gcommaaccent': 556,
   24611     'eth': 556,
   24612     'zcaron': 500,
   24613     'ncommaaccent': 556,
   24614     'onesuperior': 333,
   24615     'imacron': 278,
   24616     'Euro': 556
   24617   },
   24618   'Symbol': {
   24619     'space': 250,
   24620     'exclam': 333,
   24621     'universal': 713,
   24622     'numbersign': 500,
   24623     'existential': 549,
   24624     'percent': 833,
   24625     'ampersand': 778,
   24626     'suchthat': 439,
   24627     'parenleft': 333,
   24628     'parenright': 333,
   24629     'asteriskmath': 500,
   24630     'plus': 549,
   24631     'comma': 250,
   24632     'minus': 549,
   24633     'period': 250,
   24634     'slash': 278,
   24635     'zero': 500,
   24636     'one': 500,
   24637     'two': 500,
   24638     'three': 500,
   24639     'four': 500,
   24640     'five': 500,
   24641     'six': 500,
   24642     'seven': 500,
   24643     'eight': 500,
   24644     'nine': 500,
   24645     'colon': 278,
   24646     'semicolon': 278,
   24647     'less': 549,
   24648     'equal': 549,
   24649     'greater': 549,
   24650     'question': 444,
   24651     'congruent': 549,
   24652     'Alpha': 722,
   24653     'Beta': 667,
   24654     'Chi': 722,
   24655     'Delta': 612,
   24656     'Epsilon': 611,
   24657     'Phi': 763,
   24658     'Gamma': 603,
   24659     'Eta': 722,
   24660     'Iota': 333,
   24661     'theta1': 631,
   24662     'Kappa': 722,
   24663     'Lambda': 686,
   24664     'Mu': 889,
   24665     'Nu': 722,
   24666     'Omicron': 722,
   24667     'Pi': 768,
   24668     'Theta': 741,
   24669     'Rho': 556,
   24670     'Sigma': 592,
   24671     'Tau': 611,
   24672     'Upsilon': 690,
   24673     'sigma1': 439,
   24674     'Omega': 768,
   24675     'Xi': 645,
   24676     'Psi': 795,
   24677     'Zeta': 611,
   24678     'bracketleft': 333,
   24679     'therefore': 863,
   24680     'bracketright': 333,
   24681     'perpendicular': 658,
   24682     'underscore': 500,
   24683     'radicalex': 500,
   24684     'alpha': 631,
   24685     'beta': 549,
   24686     'chi': 549,
   24687     'delta': 494,
   24688     'epsilon': 439,
   24689     'phi': 521,
   24690     'gamma': 411,
   24691     'eta': 603,
   24692     'iota': 329,
   24693     'phi1': 603,
   24694     'kappa': 549,
   24695     'lambda': 549,
   24696     'mu': 576,
   24697     'nu': 521,
   24698     'omicron': 549,
   24699     'pi': 549,
   24700     'theta': 521,
   24701     'rho': 549,
   24702     'sigma': 603,
   24703     'tau': 439,
   24704     'upsilon': 576,
   24705     'omega1': 713,
   24706     'omega': 686,
   24707     'xi': 493,
   24708     'psi': 686,
   24709     'zeta': 494,
   24710     'braceleft': 480,
   24711     'bar': 200,
   24712     'braceright': 480,
   24713     'similar': 549,
   24714     'Euro': 750,
   24715     'Upsilon1': 620,
   24716     'minute': 247,
   24717     'lessequal': 549,
   24718     'fraction': 167,
   24719     'infinity': 713,
   24720     'florin': 500,
   24721     'club': 753,
   24722     'diamond': 753,
   24723     'heart': 753,
   24724     'spade': 753,
   24725     'arrowboth': 1042,
   24726     'arrowleft': 987,
   24727     'arrowup': 603,
   24728     'arrowright': 987,
   24729     'arrowdown': 603,
   24730     'degree': 400,
   24731     'plusminus': 549,
   24732     'second': 411,
   24733     'greaterequal': 549,
   24734     'multiply': 549,
   24735     'proportional': 713,
   24736     'partialdiff': 494,
   24737     'bullet': 460,
   24738     'divide': 549,
   24739     'notequal': 549,
   24740     'equivalence': 549,
   24741     'approxequal': 549,
   24742     'ellipsis': 1000,
   24743     'arrowvertex': 603,
   24744     'arrowhorizex': 1000,
   24745     'carriagereturn': 658,
   24746     'aleph': 823,
   24747     'Ifraktur': 686,
   24748     'Rfraktur': 795,
   24749     'weierstrass': 987,
   24750     'circlemultiply': 768,
   24751     'circleplus': 768,
   24752     'emptyset': 823,
   24753     'intersection': 768,
   24754     'union': 768,
   24755     'propersuperset': 713,
   24756     'reflexsuperset': 713,
   24757     'notsubset': 713,
   24758     'propersubset': 713,
   24759     'reflexsubset': 713,
   24760     'element': 713,
   24761     'notelement': 713,
   24762     'angle': 768,
   24763     'gradient': 713,
   24764     'registerserif': 790,
   24765     'copyrightserif': 790,
   24766     'trademarkserif': 890,
   24767     'product': 823,
   24768     'radical': 549,
   24769     'dotmath': 250,
   24770     'logicalnot': 713,
   24771     'logicaland': 603,
   24772     'logicalor': 603,
   24773     'arrowdblboth': 1042,
   24774     'arrowdblleft': 987,
   24775     'arrowdblup': 603,
   24776     'arrowdblright': 987,
   24777     'arrowdbldown': 603,
   24778     'lozenge': 494,
   24779     'angleleft': 329,
   24780     'registersans': 790,
   24781     'copyrightsans': 790,
   24782     'trademarksans': 786,
   24783     'summation': 713,
   24784     'parenlefttp': 384,
   24785     'parenleftex': 384,
   24786     'parenleftbt': 384,
   24787     'bracketlefttp': 384,
   24788     'bracketleftex': 384,
   24789     'bracketleftbt': 384,
   24790     'bracelefttp': 494,
   24791     'braceleftmid': 494,
   24792     'braceleftbt': 494,
   24793     'braceex': 494,
   24794     'angleright': 329,
   24795     'integral': 274,
   24796     'integraltp': 686,
   24797     'integralex': 686,
   24798     'integralbt': 686,
   24799     'parenrighttp': 384,
   24800     'parenrightex': 384,
   24801     'parenrightbt': 384,
   24802     'bracketrighttp': 384,
   24803     'bracketrightex': 384,
   24804     'bracketrightbt': 384,
   24805     'bracerighttp': 494,
   24806     'bracerightmid': 494,
   24807     'bracerightbt': 494,
   24808     'apple': 790
   24809   },
   24810   'Times-Roman': {
   24811     'space': 250,
   24812     'exclam': 333,
   24813     'quotedbl': 408,
   24814     'numbersign': 500,
   24815     'dollar': 500,
   24816     'percent': 833,
   24817     'ampersand': 778,
   24818     'quoteright': 333,
   24819     'parenleft': 333,
   24820     'parenright': 333,
   24821     'asterisk': 500,
   24822     'plus': 564,
   24823     'comma': 250,
   24824     'hyphen': 333,
   24825     'period': 250,
   24826     'slash': 278,
   24827     'zero': 500,
   24828     'one': 500,
   24829     'two': 500,
   24830     'three': 500,
   24831     'four': 500,
   24832     'five': 500,
   24833     'six': 500,
   24834     'seven': 500,
   24835     'eight': 500,
   24836     'nine': 500,
   24837     'colon': 278,
   24838     'semicolon': 278,
   24839     'less': 564,
   24840     'equal': 564,
   24841     'greater': 564,
   24842     'question': 444,
   24843     'at': 921,
   24844     'A': 722,
   24845     'B': 667,
   24846     'C': 667,
   24847     'D': 722,
   24848     'E': 611,
   24849     'F': 556,
   24850     'G': 722,
   24851     'H': 722,
   24852     'I': 333,
   24853     'J': 389,
   24854     'K': 722,
   24855     'L': 611,
   24856     'M': 889,
   24857     'N': 722,
   24858     'O': 722,
   24859     'P': 556,
   24860     'Q': 722,
   24861     'R': 667,
   24862     'S': 556,
   24863     'T': 611,
   24864     'U': 722,
   24865     'V': 722,
   24866     'W': 944,
   24867     'X': 722,
   24868     'Y': 722,
   24869     'Z': 611,
   24870     'bracketleft': 333,
   24871     'backslash': 278,
   24872     'bracketright': 333,
   24873     'asciicircum': 469,
   24874     'underscore': 500,
   24875     'quoteleft': 333,
   24876     'a': 444,
   24877     'b': 500,
   24878     'c': 444,
   24879     'd': 500,
   24880     'e': 444,
   24881     'f': 333,
   24882     'g': 500,
   24883     'h': 500,
   24884     'i': 278,
   24885     'j': 278,
   24886     'k': 500,
   24887     'l': 278,
   24888     'm': 778,
   24889     'n': 500,
   24890     'o': 500,
   24891     'p': 500,
   24892     'q': 500,
   24893     'r': 333,
   24894     's': 389,
   24895     't': 278,
   24896     'u': 500,
   24897     'v': 500,
   24898     'w': 722,
   24899     'x': 500,
   24900     'y': 500,
   24901     'z': 444,
   24902     'braceleft': 480,
   24903     'bar': 200,
   24904     'braceright': 480,
   24905     'asciitilde': 541,
   24906     'exclamdown': 333,
   24907     'cent': 500,
   24908     'sterling': 500,
   24909     'fraction': 167,
   24910     'yen': 500,
   24911     'florin': 500,
   24912     'section': 500,
   24913     'currency': 500,
   24914     'quotesingle': 180,
   24915     'quotedblleft': 444,
   24916     'guillemotleft': 500,
   24917     'guilsinglleft': 333,
   24918     'guilsinglright': 333,
   24919     'fi': 556,
   24920     'fl': 556,
   24921     'endash': 500,
   24922     'dagger': 500,
   24923     'daggerdbl': 500,
   24924     'periodcentered': 250,
   24925     'paragraph': 453,
   24926     'bullet': 350,
   24927     'quotesinglbase': 333,
   24928     'quotedblbase': 444,
   24929     'quotedblright': 444,
   24930     'guillemotright': 500,
   24931     'ellipsis': 1000,
   24932     'perthousand': 1000,
   24933     'questiondown': 444,
   24934     'grave': 333,
   24935     'acute': 333,
   24936     'circumflex': 333,
   24937     'tilde': 333,
   24938     'macron': 333,
   24939     'breve': 333,
   24940     'dotaccent': 333,
   24941     'dieresis': 333,
   24942     'ring': 333,
   24943     'cedilla': 333,
   24944     'hungarumlaut': 333,
   24945     'ogonek': 333,
   24946     'caron': 333,
   24947     'emdash': 1000,
   24948     'AE': 889,
   24949     'ordfeminine': 276,
   24950     'Lslash': 611,
   24951     'Oslash': 722,
   24952     'OE': 889,
   24953     'ordmasculine': 310,
   24954     'ae': 667,
   24955     'dotlessi': 278,
   24956     'lslash': 278,
   24957     'oslash': 500,
   24958     'oe': 722,
   24959     'germandbls': 500,
   24960     'Idieresis': 333,
   24961     'eacute': 444,
   24962     'abreve': 444,
   24963     'uhungarumlaut': 500,
   24964     'ecaron': 444,
   24965     'Ydieresis': 722,
   24966     'divide': 564,
   24967     'Yacute': 722,
   24968     'Acircumflex': 722,
   24969     'aacute': 444,
   24970     'Ucircumflex': 722,
   24971     'yacute': 500,
   24972     'scommaaccent': 389,
   24973     'ecircumflex': 444,
   24974     'Uring': 722,
   24975     'Udieresis': 722,
   24976     'aogonek': 444,
   24977     'Uacute': 722,
   24978     'uogonek': 500,
   24979     'Edieresis': 611,
   24980     'Dcroat': 722,
   24981     'commaaccent': 250,
   24982     'copyright': 760,
   24983     'Emacron': 611,
   24984     'ccaron': 444,
   24985     'aring': 444,
   24986     'Ncommaaccent': 722,
   24987     'lacute': 278,
   24988     'agrave': 444,
   24989     'Tcommaaccent': 611,
   24990     'Cacute': 667,
   24991     'atilde': 444,
   24992     'Edotaccent': 611,
   24993     'scaron': 389,
   24994     'scedilla': 389,
   24995     'iacute': 278,
   24996     'lozenge': 471,
   24997     'Rcaron': 667,
   24998     'Gcommaaccent': 722,
   24999     'ucircumflex': 500,
   25000     'acircumflex': 444,
   25001     'Amacron': 722,
   25002     'rcaron': 333,
   25003     'ccedilla': 444,
   25004     'Zdotaccent': 611,
   25005     'Thorn': 556,
   25006     'Omacron': 722,
   25007     'Racute': 667,
   25008     'Sacute': 556,
   25009     'dcaron': 588,
   25010     'Umacron': 722,
   25011     'uring': 500,
   25012     'threesuperior': 300,
   25013     'Ograve': 722,
   25014     'Agrave': 722,
   25015     'Abreve': 722,
   25016     'multiply': 564,
   25017     'uacute': 500,
   25018     'Tcaron': 611,
   25019     'partialdiff': 476,
   25020     'ydieresis': 500,
   25021     'Nacute': 722,
   25022     'icircumflex': 278,
   25023     'Ecircumflex': 611,
   25024     'adieresis': 444,
   25025     'edieresis': 444,
   25026     'cacute': 444,
   25027     'nacute': 500,
   25028     'umacron': 500,
   25029     'Ncaron': 722,
   25030     'Iacute': 333,
   25031     'plusminus': 564,
   25032     'brokenbar': 200,
   25033     'registered': 760,
   25034     'Gbreve': 722,
   25035     'Idotaccent': 333,
   25036     'summation': 600,
   25037     'Egrave': 611,
   25038     'racute': 333,
   25039     'omacron': 500,
   25040     'Zacute': 611,
   25041     'Zcaron': 611,
   25042     'greaterequal': 549,
   25043     'Eth': 722,
   25044     'Ccedilla': 667,
   25045     'lcommaaccent': 278,
   25046     'tcaron': 326,
   25047     'eogonek': 444,
   25048     'Uogonek': 722,
   25049     'Aacute': 722,
   25050     'Adieresis': 722,
   25051     'egrave': 444,
   25052     'zacute': 444,
   25053     'iogonek': 278,
   25054     'Oacute': 722,
   25055     'oacute': 500,
   25056     'amacron': 444,
   25057     'sacute': 389,
   25058     'idieresis': 278,
   25059     'Ocircumflex': 722,
   25060     'Ugrave': 722,
   25061     'Delta': 612,
   25062     'thorn': 500,
   25063     'twosuperior': 300,
   25064     'Odieresis': 722,
   25065     'mu': 500,
   25066     'igrave': 278,
   25067     'ohungarumlaut': 500,
   25068     'Eogonek': 611,
   25069     'dcroat': 500,
   25070     'threequarters': 750,
   25071     'Scedilla': 556,
   25072     'lcaron': 344,
   25073     'Kcommaaccent': 722,
   25074     'Lacute': 611,
   25075     'trademark': 980,
   25076     'edotaccent': 444,
   25077     'Igrave': 333,
   25078     'Imacron': 333,
   25079     'Lcaron': 611,
   25080     'onehalf': 750,
   25081     'lessequal': 549,
   25082     'ocircumflex': 500,
   25083     'ntilde': 500,
   25084     'Uhungarumlaut': 722,
   25085     'Eacute': 611,
   25086     'emacron': 444,
   25087     'gbreve': 500,
   25088     'onequarter': 750,
   25089     'Scaron': 556,
   25090     'Scommaaccent': 556,
   25091     'Ohungarumlaut': 722,
   25092     'degree': 400,
   25093     'ograve': 500,
   25094     'Ccaron': 667,
   25095     'ugrave': 500,
   25096     'radical': 453,
   25097     'Dcaron': 722,
   25098     'rcommaaccent': 333,
   25099     'Ntilde': 722,
   25100     'otilde': 500,
   25101     'Rcommaaccent': 667,
   25102     'Lcommaaccent': 611,
   25103     'Atilde': 722,
   25104     'Aogonek': 722,
   25105     'Aring': 722,
   25106     'Otilde': 722,
   25107     'zdotaccent': 444,
   25108     'Ecaron': 611,
   25109     'Iogonek': 333,
   25110     'kcommaaccent': 500,
   25111     'minus': 564,
   25112     'Icircumflex': 333,
   25113     'ncaron': 500,
   25114     'tcommaaccent': 278,
   25115     'logicalnot': 564,
   25116     'odieresis': 500,
   25117     'udieresis': 500,
   25118     'notequal': 549,
   25119     'gcommaaccent': 500,
   25120     'eth': 500,
   25121     'zcaron': 444,
   25122     'ncommaaccent': 500,
   25123     'onesuperior': 300,
   25124     'imacron': 278,
   25125     'Euro': 500
   25126   },
   25127   'Times-Bold': {
   25128     'space': 250,
   25129     'exclam': 333,
   25130     'quotedbl': 555,
   25131     'numbersign': 500,
   25132     'dollar': 500,
   25133     'percent': 1000,
   25134     'ampersand': 833,
   25135     'quoteright': 333,
   25136     'parenleft': 333,
   25137     'parenright': 333,
   25138     'asterisk': 500,
   25139     'plus': 570,
   25140     'comma': 250,
   25141     'hyphen': 333,
   25142     'period': 250,
   25143     'slash': 278,
   25144     'zero': 500,
   25145     'one': 500,
   25146     'two': 500,
   25147     'three': 500,
   25148     'four': 500,
   25149     'five': 500,
   25150     'six': 500,
   25151     'seven': 500,
   25152     'eight': 500,
   25153     'nine': 500,
   25154     'colon': 333,
   25155     'semicolon': 333,
   25156     'less': 570,
   25157     'equal': 570,
   25158     'greater': 570,
   25159     'question': 500,
   25160     'at': 930,
   25161     'A': 722,
   25162     'B': 667,
   25163     'C': 722,
   25164     'D': 722,
   25165     'E': 667,
   25166     'F': 611,
   25167     'G': 778,
   25168     'H': 778,
   25169     'I': 389,
   25170     'J': 500,
   25171     'K': 778,
   25172     'L': 667,
   25173     'M': 944,
   25174     'N': 722,
   25175     'O': 778,
   25176     'P': 611,
   25177     'Q': 778,
   25178     'R': 722,
   25179     'S': 556,
   25180     'T': 667,
   25181     'U': 722,
   25182     'V': 722,
   25183     'W': 1000,
   25184     'X': 722,
   25185     'Y': 722,
   25186     'Z': 667,
   25187     'bracketleft': 333,
   25188     'backslash': 278,
   25189     'bracketright': 333,
   25190     'asciicircum': 581,
   25191     'underscore': 500,
   25192     'quoteleft': 333,
   25193     'a': 500,
   25194     'b': 556,
   25195     'c': 444,
   25196     'd': 556,
   25197     'e': 444,
   25198     'f': 333,
   25199     'g': 500,
   25200     'h': 556,
   25201     'i': 278,
   25202     'j': 333,
   25203     'k': 556,
   25204     'l': 278,
   25205     'm': 833,
   25206     'n': 556,
   25207     'o': 500,
   25208     'p': 556,
   25209     'q': 556,
   25210     'r': 444,
   25211     's': 389,
   25212     't': 333,
   25213     'u': 556,
   25214     'v': 500,
   25215     'w': 722,
   25216     'x': 500,
   25217     'y': 500,
   25218     'z': 444,
   25219     'braceleft': 394,
   25220     'bar': 220,
   25221     'braceright': 394,
   25222     'asciitilde': 520,
   25223     'exclamdown': 333,
   25224     'cent': 500,
   25225     'sterling': 500,
   25226     'fraction': 167,
   25227     'yen': 500,
   25228     'florin': 500,
   25229     'section': 500,
   25230     'currency': 500,
   25231     'quotesingle': 278,
   25232     'quotedblleft': 500,
   25233     'guillemotleft': 500,
   25234     'guilsinglleft': 333,
   25235     'guilsinglright': 333,
   25236     'fi': 556,
   25237     'fl': 556,
   25238     'endash': 500,
   25239     'dagger': 500,
   25240     'daggerdbl': 500,
   25241     'periodcentered': 250,
   25242     'paragraph': 540,
   25243     'bullet': 350,
   25244     'quotesinglbase': 333,
   25245     'quotedblbase': 500,
   25246     'quotedblright': 500,
   25247     'guillemotright': 500,
   25248     'ellipsis': 1000,
   25249     'perthousand': 1000,
   25250     'questiondown': 500,
   25251     'grave': 333,
   25252     'acute': 333,
   25253     'circumflex': 333,
   25254     'tilde': 333,
   25255     'macron': 333,
   25256     'breve': 333,
   25257     'dotaccent': 333,
   25258     'dieresis': 333,
   25259     'ring': 333,
   25260     'cedilla': 333,
   25261     'hungarumlaut': 333,
   25262     'ogonek': 333,
   25263     'caron': 333,
   25264     'emdash': 1000,
   25265     'AE': 1000,
   25266     'ordfeminine': 300,
   25267     'Lslash': 667,
   25268     'Oslash': 778,
   25269     'OE': 1000,
   25270     'ordmasculine': 330,
   25271     'ae': 722,
   25272     'dotlessi': 278,
   25273     'lslash': 278,
   25274     'oslash': 500,
   25275     'oe': 722,
   25276     'germandbls': 556,
   25277     'Idieresis': 389,
   25278     'eacute': 444,
   25279     'abreve': 500,
   25280     'uhungarumlaut': 556,
   25281     'ecaron': 444,
   25282     'Ydieresis': 722,
   25283     'divide': 570,
   25284     'Yacute': 722,
   25285     'Acircumflex': 722,
   25286     'aacute': 500,
   25287     'Ucircumflex': 722,
   25288     'yacute': 500,
   25289     'scommaaccent': 389,
   25290     'ecircumflex': 444,
   25291     'Uring': 722,
   25292     'Udieresis': 722,
   25293     'aogonek': 500,
   25294     'Uacute': 722,
   25295     'uogonek': 556,
   25296     'Edieresis': 667,
   25297     'Dcroat': 722,
   25298     'commaaccent': 250,
   25299     'copyright': 747,
   25300     'Emacron': 667,
   25301     'ccaron': 444,
   25302     'aring': 500,
   25303     'Ncommaaccent': 722,
   25304     'lacute': 278,
   25305     'agrave': 500,
   25306     'Tcommaaccent': 667,
   25307     'Cacute': 722,
   25308     'atilde': 500,
   25309     'Edotaccent': 667,
   25310     'scaron': 389,
   25311     'scedilla': 389,
   25312     'iacute': 278,
   25313     'lozenge': 494,
   25314     'Rcaron': 722,
   25315     'Gcommaaccent': 778,
   25316     'ucircumflex': 556,
   25317     'acircumflex': 500,
   25318     'Amacron': 722,
   25319     'rcaron': 444,
   25320     'ccedilla': 444,
   25321     'Zdotaccent': 667,
   25322     'Thorn': 611,
   25323     'Omacron': 778,
   25324     'Racute': 722,
   25325     'Sacute': 556,
   25326     'dcaron': 672,
   25327     'Umacron': 722,
   25328     'uring': 556,
   25329     'threesuperior': 300,
   25330     'Ograve': 778,
   25331     'Agrave': 722,
   25332     'Abreve': 722,
   25333     'multiply': 570,
   25334     'uacute': 556,
   25335     'Tcaron': 667,
   25336     'partialdiff': 494,
   25337     'ydieresis': 500,
   25338     'Nacute': 722,
   25339     'icircumflex': 278,
   25340     'Ecircumflex': 667,
   25341     'adieresis': 500,
   25342     'edieresis': 444,
   25343     'cacute': 444,
   25344     'nacute': 556,
   25345     'umacron': 556,
   25346     'Ncaron': 722,
   25347     'Iacute': 389,
   25348     'plusminus': 570,
   25349     'brokenbar': 220,
   25350     'registered': 747,
   25351     'Gbreve': 778,
   25352     'Idotaccent': 389,
   25353     'summation': 600,
   25354     'Egrave': 667,
   25355     'racute': 444,
   25356     'omacron': 500,
   25357     'Zacute': 667,
   25358     'Zcaron': 667,
   25359     'greaterequal': 549,
   25360     'Eth': 722,
   25361     'Ccedilla': 722,
   25362     'lcommaaccent': 278,
   25363     'tcaron': 416,
   25364     'eogonek': 444,
   25365     'Uogonek': 722,
   25366     'Aacute': 722,
   25367     'Adieresis': 722,
   25368     'egrave': 444,
   25369     'zacute': 444,
   25370     'iogonek': 278,
   25371     'Oacute': 778,
   25372     'oacute': 500,
   25373     'amacron': 500,
   25374     'sacute': 389,
   25375     'idieresis': 278,
   25376     'Ocircumflex': 778,
   25377     'Ugrave': 722,
   25378     'Delta': 612,
   25379     'thorn': 556,
   25380     'twosuperior': 300,
   25381     'Odieresis': 778,
   25382     'mu': 556,
   25383     'igrave': 278,
   25384     'ohungarumlaut': 500,
   25385     'Eogonek': 667,
   25386     'dcroat': 556,
   25387     'threequarters': 750,
   25388     'Scedilla': 556,
   25389     'lcaron': 394,
   25390     'Kcommaaccent': 778,
   25391     'Lacute': 667,
   25392     'trademark': 1000,
   25393     'edotaccent': 444,
   25394     'Igrave': 389,
   25395     'Imacron': 389,
   25396     'Lcaron': 667,
   25397     'onehalf': 750,
   25398     'lessequal': 549,
   25399     'ocircumflex': 500,
   25400     'ntilde': 556,
   25401     'Uhungarumlaut': 722,
   25402     'Eacute': 667,
   25403     'emacron': 444,
   25404     'gbreve': 500,
   25405     'onequarter': 750,
   25406     'Scaron': 556,
   25407     'Scommaaccent': 556,
   25408     'Ohungarumlaut': 778,
   25409     'degree': 400,
   25410     'ograve': 500,
   25411     'Ccaron': 722,
   25412     'ugrave': 556,
   25413     'radical': 549,
   25414     'Dcaron': 722,
   25415     'rcommaaccent': 444,
   25416     'Ntilde': 722,
   25417     'otilde': 500,
   25418     'Rcommaaccent': 722,
   25419     'Lcommaaccent': 667,
   25420     'Atilde': 722,
   25421     'Aogonek': 722,
   25422     'Aring': 722,
   25423     'Otilde': 778,
   25424     'zdotaccent': 444,
   25425     'Ecaron': 667,
   25426     'Iogonek': 389,
   25427     'kcommaaccent': 556,
   25428     'minus': 570,
   25429     'Icircumflex': 389,
   25430     'ncaron': 556,
   25431     'tcommaaccent': 333,
   25432     'logicalnot': 570,
   25433     'odieresis': 500,
   25434     'udieresis': 556,
   25435     'notequal': 549,
   25436     'gcommaaccent': 500,
   25437     'eth': 500,
   25438     'zcaron': 444,
   25439     'ncommaaccent': 556,
   25440     'onesuperior': 300,
   25441     'imacron': 278,
   25442     'Euro': 500
   25443   },
   25444   'Times-BoldItalic': {
   25445     'space': 250,
   25446     'exclam': 389,
   25447     'quotedbl': 555,
   25448     'numbersign': 500,
   25449     'dollar': 500,
   25450     'percent': 833,
   25451     'ampersand': 778,
   25452     'quoteright': 333,
   25453     'parenleft': 333,
   25454     'parenright': 333,
   25455     'asterisk': 500,
   25456     'plus': 570,
   25457     'comma': 250,
   25458     'hyphen': 333,
   25459     'period': 250,
   25460     'slash': 278,
   25461     'zero': 500,
   25462     'one': 500,
   25463     'two': 500,
   25464     'three': 500,
   25465     'four': 500,
   25466     'five': 500,
   25467     'six': 500,
   25468     'seven': 500,
   25469     'eight': 500,
   25470     'nine': 500,
   25471     'colon': 333,
   25472     'semicolon': 333,
   25473     'less': 570,
   25474     'equal': 570,
   25475     'greater': 570,
   25476     'question': 500,
   25477     'at': 832,
   25478     'A': 667,
   25479     'B': 667,
   25480     'C': 667,
   25481     'D': 722,
   25482     'E': 667,
   25483     'F': 667,
   25484     'G': 722,
   25485     'H': 778,
   25486     'I': 389,
   25487     'J': 500,
   25488     'K': 667,
   25489     'L': 611,
   25490     'M': 889,
   25491     'N': 722,
   25492     'O': 722,
   25493     'P': 611,
   25494     'Q': 722,
   25495     'R': 667,
   25496     'S': 556,
   25497     'T': 611,
   25498     'U': 722,
   25499     'V': 667,
   25500     'W': 889,
   25501     'X': 667,
   25502     'Y': 611,
   25503     'Z': 611,
   25504     'bracketleft': 333,
   25505     'backslash': 278,
   25506     'bracketright': 333,
   25507     'asciicircum': 570,
   25508     'underscore': 500,
   25509     'quoteleft': 333,
   25510     'a': 500,
   25511     'b': 500,
   25512     'c': 444,
   25513     'd': 500,
   25514     'e': 444,
   25515     'f': 333,
   25516     'g': 500,
   25517     'h': 556,
   25518     'i': 278,
   25519     'j': 278,
   25520     'k': 500,
   25521     'l': 278,
   25522     'm': 778,
   25523     'n': 556,
   25524     'o': 500,
   25525     'p': 500,
   25526     'q': 500,
   25527     'r': 389,
   25528     's': 389,
   25529     't': 278,
   25530     'u': 556,
   25531     'v': 444,
   25532     'w': 667,
   25533     'x': 500,
   25534     'y': 444,
   25535     'z': 389,
   25536     'braceleft': 348,
   25537     'bar': 220,
   25538     'braceright': 348,
   25539     'asciitilde': 570,
   25540     'exclamdown': 389,
   25541     'cent': 500,
   25542     'sterling': 500,
   25543     'fraction': 167,
   25544     'yen': 500,
   25545     'florin': 500,
   25546     'section': 500,
   25547     'currency': 500,
   25548     'quotesingle': 278,
   25549     'quotedblleft': 500,
   25550     'guillemotleft': 500,
   25551     'guilsinglleft': 333,
   25552     'guilsinglright': 333,
   25553     'fi': 556,
   25554     'fl': 556,
   25555     'endash': 500,
   25556     'dagger': 500,
   25557     'daggerdbl': 500,
   25558     'periodcentered': 250,
   25559     'paragraph': 500,
   25560     'bullet': 350,
   25561     'quotesinglbase': 333,
   25562     'quotedblbase': 500,
   25563     'quotedblright': 500,
   25564     'guillemotright': 500,
   25565     'ellipsis': 1000,
   25566     'perthousand': 1000,
   25567     'questiondown': 500,
   25568     'grave': 333,
   25569     'acute': 333,
   25570     'circumflex': 333,
   25571     'tilde': 333,
   25572     'macron': 333,
   25573     'breve': 333,
   25574     'dotaccent': 333,
   25575     'dieresis': 333,
   25576     'ring': 333,
   25577     'cedilla': 333,
   25578     'hungarumlaut': 333,
   25579     'ogonek': 333,
   25580     'caron': 333,
   25581     'emdash': 1000,
   25582     'AE': 944,
   25583     'ordfeminine': 266,
   25584     'Lslash': 611,
   25585     'Oslash': 722,
   25586     'OE': 944,
   25587     'ordmasculine': 300,
   25588     'ae': 722,
   25589     'dotlessi': 278,
   25590     'lslash': 278,
   25591     'oslash': 500,
   25592     'oe': 722,
   25593     'germandbls': 500,
   25594     'Idieresis': 389,
   25595     'eacute': 444,
   25596     'abreve': 500,
   25597     'uhungarumlaut': 556,
   25598     'ecaron': 444,
   25599     'Ydieresis': 611,
   25600     'divide': 570,
   25601     'Yacute': 611,
   25602     'Acircumflex': 667,
   25603     'aacute': 500,
   25604     'Ucircumflex': 722,
   25605     'yacute': 444,
   25606     'scommaaccent': 389,
   25607     'ecircumflex': 444,
   25608     'Uring': 722,
   25609     'Udieresis': 722,
   25610     'aogonek': 500,
   25611     'Uacute': 722,
   25612     'uogonek': 556,
   25613     'Edieresis': 667,
   25614     'Dcroat': 722,
   25615     'commaaccent': 250,
   25616     'copyright': 747,
   25617     'Emacron': 667,
   25618     'ccaron': 444,
   25619     'aring': 500,
   25620     'Ncommaaccent': 722,
   25621     'lacute': 278,
   25622     'agrave': 500,
   25623     'Tcommaaccent': 611,
   25624     'Cacute': 667,
   25625     'atilde': 500,
   25626     'Edotaccent': 667,
   25627     'scaron': 389,
   25628     'scedilla': 389,
   25629     'iacute': 278,
   25630     'lozenge': 494,
   25631     'Rcaron': 667,
   25632     'Gcommaaccent': 722,
   25633     'ucircumflex': 556,
   25634     'acircumflex': 500,
   25635     'Amacron': 667,
   25636     'rcaron': 389,
   25637     'ccedilla': 444,
   25638     'Zdotaccent': 611,
   25639     'Thorn': 611,
   25640     'Omacron': 722,
   25641     'Racute': 667,
   25642     'Sacute': 556,
   25643     'dcaron': 608,
   25644     'Umacron': 722,
   25645     'uring': 556,
   25646     'threesuperior': 300,
   25647     'Ograve': 722,
   25648     'Agrave': 667,
   25649     'Abreve': 667,
   25650     'multiply': 570,
   25651     'uacute': 556,
   25652     'Tcaron': 611,
   25653     'partialdiff': 494,
   25654     'ydieresis': 444,
   25655     'Nacute': 722,
   25656     'icircumflex': 278,
   25657     'Ecircumflex': 667,
   25658     'adieresis': 500,
   25659     'edieresis': 444,
   25660     'cacute': 444,
   25661     'nacute': 556,
   25662     'umacron': 556,
   25663     'Ncaron': 722,
   25664     'Iacute': 389,
   25665     'plusminus': 570,
   25666     'brokenbar': 220,
   25667     'registered': 747,
   25668     'Gbreve': 722,
   25669     'Idotaccent': 389,
   25670     'summation': 600,
   25671     'Egrave': 667,
   25672     'racute': 389,
   25673     'omacron': 500,
   25674     'Zacute': 611,
   25675     'Zcaron': 611,
   25676     'greaterequal': 549,
   25677     'Eth': 722,
   25678     'Ccedilla': 667,
   25679     'lcommaaccent': 278,
   25680     'tcaron': 366,
   25681     'eogonek': 444,
   25682     'Uogonek': 722,
   25683     'Aacute': 667,
   25684     'Adieresis': 667,
   25685     'egrave': 444,
   25686     'zacute': 389,
   25687     'iogonek': 278,
   25688     'Oacute': 722,
   25689     'oacute': 500,
   25690     'amacron': 500,
   25691     'sacute': 389,
   25692     'idieresis': 278,
   25693     'Ocircumflex': 722,
   25694     'Ugrave': 722,
   25695     'Delta': 612,
   25696     'thorn': 500,
   25697     'twosuperior': 300,
   25698     'Odieresis': 722,
   25699     'mu': 576,
   25700     'igrave': 278,
   25701     'ohungarumlaut': 500,
   25702     'Eogonek': 667,
   25703     'dcroat': 500,
   25704     'threequarters': 750,
   25705     'Scedilla': 556,
   25706     'lcaron': 382,
   25707     'Kcommaaccent': 667,
   25708     'Lacute': 611,
   25709     'trademark': 1000,
   25710     'edotaccent': 444,
   25711     'Igrave': 389,
   25712     'Imacron': 389,
   25713     'Lcaron': 611,
   25714     'onehalf': 750,
   25715     'lessequal': 549,
   25716     'ocircumflex': 500,
   25717     'ntilde': 556,
   25718     'Uhungarumlaut': 722,
   25719     'Eacute': 667,
   25720     'emacron': 444,
   25721     'gbreve': 500,
   25722     'onequarter': 750,
   25723     'Scaron': 556,
   25724     'Scommaaccent': 556,
   25725     'Ohungarumlaut': 722,
   25726     'degree': 400,
   25727     'ograve': 500,
   25728     'Ccaron': 667,
   25729     'ugrave': 556,
   25730     'radical': 549,
   25731     'Dcaron': 722,
   25732     'rcommaaccent': 389,
   25733     'Ntilde': 722,
   25734     'otilde': 500,
   25735     'Rcommaaccent': 667,
   25736     'Lcommaaccent': 611,
   25737     'Atilde': 667,
   25738     'Aogonek': 667,
   25739     'Aring': 667,
   25740     'Otilde': 722,
   25741     'zdotaccent': 389,
   25742     'Ecaron': 667,
   25743     'Iogonek': 389,
   25744     'kcommaaccent': 500,
   25745     'minus': 606,
   25746     'Icircumflex': 389,
   25747     'ncaron': 556,
   25748     'tcommaaccent': 278,
   25749     'logicalnot': 606,
   25750     'odieresis': 500,
   25751     'udieresis': 556,
   25752     'notequal': 549,
   25753     'gcommaaccent': 500,
   25754     'eth': 500,
   25755     'zcaron': 389,
   25756     'ncommaaccent': 556,
   25757     'onesuperior': 300,
   25758     'imacron': 278,
   25759     'Euro': 500
   25760   },
   25761   'Times-Italic': {
   25762     'space': 250,
   25763     'exclam': 333,
   25764     'quotedbl': 420,
   25765     'numbersign': 500,
   25766     'dollar': 500,
   25767     'percent': 833,
   25768     'ampersand': 778,
   25769     'quoteright': 333,
   25770     'parenleft': 333,
   25771     'parenright': 333,
   25772     'asterisk': 500,
   25773     'plus': 675,
   25774     'comma': 250,
   25775     'hyphen': 333,
   25776     'period': 250,
   25777     'slash': 278,
   25778     'zero': 500,
   25779     'one': 500,
   25780     'two': 500,
   25781     'three': 500,
   25782     'four': 500,
   25783     'five': 500,
   25784     'six': 500,
   25785     'seven': 500,
   25786     'eight': 500,
   25787     'nine': 500,
   25788     'colon': 333,
   25789     'semicolon': 333,
   25790     'less': 675,
   25791     'equal': 675,
   25792     'greater': 675,
   25793     'question': 500,
   25794     'at': 920,
   25795     'A': 611,
   25796     'B': 611,
   25797     'C': 667,
   25798     'D': 722,
   25799     'E': 611,
   25800     'F': 611,
   25801     'G': 722,
   25802     'H': 722,
   25803     'I': 333,
   25804     'J': 444,
   25805     'K': 667,
   25806     'L': 556,
   25807     'M': 833,
   25808     'N': 667,
   25809     'O': 722,
   25810     'P': 611,
   25811     'Q': 722,
   25812     'R': 611,
   25813     'S': 500,
   25814     'T': 556,
   25815     'U': 722,
   25816     'V': 611,
   25817     'W': 833,
   25818     'X': 611,
   25819     'Y': 556,
   25820     'Z': 556,
   25821     'bracketleft': 389,
   25822     'backslash': 278,
   25823     'bracketright': 389,
   25824     'asciicircum': 422,
   25825     'underscore': 500,
   25826     'quoteleft': 333,
   25827     'a': 500,
   25828     'b': 500,
   25829     'c': 444,
   25830     'd': 500,
   25831     'e': 444,
   25832     'f': 278,
   25833     'g': 500,
   25834     'h': 500,
   25835     'i': 278,
   25836     'j': 278,
   25837     'k': 444,
   25838     'l': 278,
   25839     'm': 722,
   25840     'n': 500,
   25841     'o': 500,
   25842     'p': 500,
   25843     'q': 500,
   25844     'r': 389,
   25845     's': 389,
   25846     't': 278,
   25847     'u': 500,
   25848     'v': 444,
   25849     'w': 667,
   25850     'x': 444,
   25851     'y': 444,
   25852     'z': 389,
   25853     'braceleft': 400,
   25854     'bar': 275,
   25855     'braceright': 400,
   25856     'asciitilde': 541,
   25857     'exclamdown': 389,
   25858     'cent': 500,
   25859     'sterling': 500,
   25860     'fraction': 167,
   25861     'yen': 500,
   25862     'florin': 500,
   25863     'section': 500,
   25864     'currency': 500,
   25865     'quotesingle': 214,
   25866     'quotedblleft': 556,
   25867     'guillemotleft': 500,
   25868     'guilsinglleft': 333,
   25869     'guilsinglright': 333,
   25870     'fi': 500,
   25871     'fl': 500,
   25872     'endash': 500,
   25873     'dagger': 500,
   25874     'daggerdbl': 500,
   25875     'periodcentered': 250,
   25876     'paragraph': 523,
   25877     'bullet': 350,
   25878     'quotesinglbase': 333,
   25879     'quotedblbase': 556,
   25880     'quotedblright': 556,
   25881     'guillemotright': 500,
   25882     'ellipsis': 889,
   25883     'perthousand': 1000,
   25884     'questiondown': 500,
   25885     'grave': 333,
   25886     'acute': 333,
   25887     'circumflex': 333,
   25888     'tilde': 333,
   25889     'macron': 333,
   25890     'breve': 333,
   25891     'dotaccent': 333,
   25892     'dieresis': 333,
   25893     'ring': 333,
   25894     'cedilla': 333,
   25895     'hungarumlaut': 333,
   25896     'ogonek': 333,
   25897     'caron': 333,
   25898     'emdash': 889,
   25899     'AE': 889,
   25900     'ordfeminine': 276,
   25901     'Lslash': 556,
   25902     'Oslash': 722,
   25903     'OE': 944,
   25904     'ordmasculine': 310,
   25905     'ae': 667,
   25906     'dotlessi': 278,
   25907     'lslash': 278,
   25908     'oslash': 500,
   25909     'oe': 667,
   25910     'germandbls': 500,
   25911     'Idieresis': 333,
   25912     'eacute': 444,
   25913     'abreve': 500,
   25914     'uhungarumlaut': 500,
   25915     'ecaron': 444,
   25916     'Ydieresis': 556,
   25917     'divide': 675,
   25918     'Yacute': 556,
   25919     'Acircumflex': 611,
   25920     'aacute': 500,
   25921     'Ucircumflex': 722,
   25922     'yacute': 444,
   25923     'scommaaccent': 389,
   25924     'ecircumflex': 444,
   25925     'Uring': 722,
   25926     'Udieresis': 722,
   25927     'aogonek': 500,
   25928     'Uacute': 722,
   25929     'uogonek': 500,
   25930     'Edieresis': 611,
   25931     'Dcroat': 722,
   25932     'commaaccent': 250,
   25933     'copyright': 760,
   25934     'Emacron': 611,
   25935     'ccaron': 444,
   25936     'aring': 500,
   25937     'Ncommaaccent': 667,
   25938     'lacute': 278,
   25939     'agrave': 500,
   25940     'Tcommaaccent': 556,
   25941     'Cacute': 667,
   25942     'atilde': 500,
   25943     'Edotaccent': 611,
   25944     'scaron': 389,
   25945     'scedilla': 389,
   25946     'iacute': 278,
   25947     'lozenge': 471,
   25948     'Rcaron': 611,
   25949     'Gcommaaccent': 722,
   25950     'ucircumflex': 500,
   25951     'acircumflex': 500,
   25952     'Amacron': 611,
   25953     'rcaron': 389,
   25954     'ccedilla': 444,
   25955     'Zdotaccent': 556,
   25956     'Thorn': 611,
   25957     'Omacron': 722,
   25958     'Racute': 611,
   25959     'Sacute': 500,
   25960     'dcaron': 544,
   25961     'Umacron': 722,
   25962     'uring': 500,
   25963     'threesuperior': 300,
   25964     'Ograve': 722,
   25965     'Agrave': 611,
   25966     'Abreve': 611,
   25967     'multiply': 675,
   25968     'uacute': 500,
   25969     'Tcaron': 556,
   25970     'partialdiff': 476,
   25971     'ydieresis': 444,
   25972     'Nacute': 667,
   25973     'icircumflex': 278,
   25974     'Ecircumflex': 611,
   25975     'adieresis': 500,
   25976     'edieresis': 444,
   25977     'cacute': 444,
   25978     'nacute': 500,
   25979     'umacron': 500,
   25980     'Ncaron': 667,
   25981     'Iacute': 333,
   25982     'plusminus': 675,
   25983     'brokenbar': 275,
   25984     'registered': 760,
   25985     'Gbreve': 722,
   25986     'Idotaccent': 333,
   25987     'summation': 600,
   25988     'Egrave': 611,
   25989     'racute': 389,
   25990     'omacron': 500,
   25991     'Zacute': 556,
   25992     'Zcaron': 556,
   25993     'greaterequal': 549,
   25994     'Eth': 722,
   25995     'Ccedilla': 667,
   25996     'lcommaaccent': 278,
   25997     'tcaron': 300,
   25998     'eogonek': 444,
   25999     'Uogonek': 722,
   26000     'Aacute': 611,
   26001     'Adieresis': 611,
   26002     'egrave': 444,
   26003     'zacute': 389,
   26004     'iogonek': 278,
   26005     'Oacute': 722,
   26006     'oacute': 500,
   26007     'amacron': 500,
   26008     'sacute': 389,
   26009     'idieresis': 278,
   26010     'Ocircumflex': 722,
   26011     'Ugrave': 722,
   26012     'Delta': 612,
   26013     'thorn': 500,
   26014     'twosuperior': 300,
   26015     'Odieresis': 722,
   26016     'mu': 500,
   26017     'igrave': 278,
   26018     'ohungarumlaut': 500,
   26019     'Eogonek': 611,
   26020     'dcroat': 500,
   26021     'threequarters': 750,
   26022     'Scedilla': 500,
   26023     'lcaron': 300,
   26024     'Kcommaaccent': 667,
   26025     'Lacute': 556,
   26026     'trademark': 980,
   26027     'edotaccent': 444,
   26028     'Igrave': 333,
   26029     'Imacron': 333,
   26030     'Lcaron': 611,
   26031     'onehalf': 750,
   26032     'lessequal': 549,
   26033     'ocircumflex': 500,
   26034     'ntilde': 500,
   26035     'Uhungarumlaut': 722,
   26036     'Eacute': 611,
   26037     'emacron': 444,
   26038     'gbreve': 500,
   26039     'onequarter': 750,
   26040     'Scaron': 500,
   26041     'Scommaaccent': 500,
   26042     'Ohungarumlaut': 722,
   26043     'degree': 400,
   26044     'ograve': 500,
   26045     'Ccaron': 667,
   26046     'ugrave': 500,
   26047     'radical': 453,
   26048     'Dcaron': 722,
   26049     'rcommaaccent': 389,
   26050     'Ntilde': 667,
   26051     'otilde': 500,
   26052     'Rcommaaccent': 611,
   26053     'Lcommaaccent': 556,
   26054     'Atilde': 611,
   26055     'Aogonek': 611,
   26056     'Aring': 611,
   26057     'Otilde': 722,
   26058     'zdotaccent': 389,
   26059     'Ecaron': 611,
   26060     'Iogonek': 333,
   26061     'kcommaaccent': 444,
   26062     'minus': 675,
   26063     'Icircumflex': 333,
   26064     'ncaron': 500,
   26065     'tcommaaccent': 278,
   26066     'logicalnot': 675,
   26067     'odieresis': 500,
   26068     'udieresis': 500,
   26069     'notequal': 549,
   26070     'gcommaaccent': 500,
   26071     'eth': 500,
   26072     'zcaron': 389,
   26073     'ncommaaccent': 500,
   26074     'onesuperior': 300,
   26075     'imacron': 278,
   26076     'Euro': 500
   26077   },
   26078   'ZapfDingbats': {
   26079     'space': 278,
   26080     'a1': 974,
   26081     'a2': 961,
   26082     'a202': 974,
   26083     'a3': 980,
   26084     'a4': 719,
   26085     'a5': 789,
   26086     'a119': 790,
   26087     'a118': 791,
   26088     'a117': 690,
   26089     'a11': 960,
   26090     'a12': 939,
   26091     'a13': 549,
   26092     'a14': 855,
   26093     'a15': 911,
   26094     'a16': 933,
   26095     'a105': 911,
   26096     'a17': 945,
   26097     'a18': 974,
   26098     'a19': 755,
   26099     'a20': 846,
   26100     'a21': 762,
   26101     'a22': 761,
   26102     'a23': 571,
   26103     'a24': 677,
   26104     'a25': 763,
   26105     'a26': 760,
   26106     'a27': 759,
   26107     'a28': 754,
   26108     'a6': 494,
   26109     'a7': 552,
   26110     'a8': 537,
   26111     'a9': 577,
   26112     'a10': 692,
   26113     'a29': 786,
   26114     'a30': 788,
   26115     'a31': 788,
   26116     'a32': 790,
   26117     'a33': 793,
   26118     'a34': 794,
   26119     'a35': 816,
   26120     'a36': 823,
   26121     'a37': 789,
   26122     'a38': 841,
   26123     'a39': 823,
   26124     'a40': 833,
   26125     'a41': 816,
   26126     'a42': 831,
   26127     'a43': 923,
   26128     'a44': 744,
   26129     'a45': 723,
   26130     'a46': 749,
   26131     'a47': 790,
   26132     'a48': 792,
   26133     'a49': 695,
   26134     'a50': 776,
   26135     'a51': 768,
   26136     'a52': 792,
   26137     'a53': 759,
   26138     'a54': 707,
   26139     'a55': 708,
   26140     'a56': 682,
   26141     'a57': 701,
   26142     'a58': 826,
   26143     'a59': 815,
   26144     'a60': 789,
   26145     'a61': 789,
   26146     'a62': 707,
   26147     'a63': 687,
   26148     'a64': 696,
   26149     'a65': 689,
   26150     'a66': 786,
   26151     'a67': 787,
   26152     'a68': 713,
   26153     'a69': 791,
   26154     'a70': 785,
   26155     'a71': 791,
   26156     'a72': 873,
   26157     'a73': 761,
   26158     'a74': 762,
   26159     'a203': 762,
   26160     'a75': 759,
   26161     'a204': 759,
   26162     'a76': 892,
   26163     'a77': 892,
   26164     'a78': 788,
   26165     'a79': 784,
   26166     'a81': 438,
   26167     'a82': 138,
   26168     'a83': 277,
   26169     'a84': 415,
   26170     'a97': 392,
   26171     'a98': 392,
   26172     'a99': 668,
   26173     'a100': 668,
   26174     'a89': 390,
   26175     'a90': 390,
   26176     'a93': 317,
   26177     'a94': 317,
   26178     'a91': 276,
   26179     'a92': 276,
   26180     'a205': 509,
   26181     'a85': 509,
   26182     'a206': 410,
   26183     'a86': 410,
   26184     'a87': 234,
   26185     'a88': 234,
   26186     'a95': 334,
   26187     'a96': 334,
   26188     'a101': 732,
   26189     'a102': 544,
   26190     'a103': 544,
   26191     'a104': 910,
   26192     'a106': 667,
   26193     'a107': 760,
   26194     'a108': 760,
   26195     'a112': 776,
   26196     'a111': 595,
   26197     'a110': 694,
   26198     'a109': 626,
   26199     'a120': 788,
   26200     'a121': 788,
   26201     'a122': 788,
   26202     'a123': 788,
   26203     'a124': 788,
   26204     'a125': 788,
   26205     'a126': 788,
   26206     'a127': 788,
   26207     'a128': 788,
   26208     'a129': 788,
   26209     'a130': 788,
   26210     'a131': 788,
   26211     'a132': 788,
   26212     'a133': 788,
   26213     'a134': 788,
   26214     'a135': 788,
   26215     'a136': 788,
   26216     'a137': 788,
   26217     'a138': 788,
   26218     'a139': 788,
   26219     'a140': 788,
   26220     'a141': 788,
   26221     'a142': 788,
   26222     'a143': 788,
   26223     'a144': 788,
   26224     'a145': 788,
   26225     'a146': 788,
   26226     'a147': 788,
   26227     'a148': 788,
   26228     'a149': 788,
   26229     'a150': 788,
   26230     'a151': 788,
   26231     'a152': 788,
   26232     'a153': 788,
   26233     'a154': 788,
   26234     'a155': 788,
   26235     'a156': 788,
   26236     'a157': 788,
   26237     'a158': 788,
   26238     'a159': 788,
   26239     'a160': 894,
   26240     'a161': 838,
   26241     'a163': 1016,
   26242     'a164': 458,
   26243     'a196': 748,
   26244     'a165': 924,
   26245     'a192': 748,
   26246     'a166': 918,
   26247     'a167': 927,
   26248     'a168': 928,
   26249     'a169': 928,
   26250     'a170': 834,
   26251     'a171': 873,
   26252     'a172': 828,
   26253     'a173': 924,
   26254     'a162': 924,
   26255     'a174': 917,
   26256     'a175': 930,
   26257     'a176': 931,
   26258     'a177': 463,
   26259     'a178': 883,
   26260     'a179': 836,
   26261     'a193': 836,
   26262     'a180': 867,
   26263     'a199': 867,
   26264     'a181': 696,
   26265     'a200': 696,
   26266     'a182': 874,
   26267     'a201': 874,
   26268     'a183': 760,
   26269     'a184': 946,
   26270     'a197': 771,
   26271     'a185': 865,
   26272     'a194': 771,
   26273     'a198': 888,
   26274     'a186': 967,
   26275     'a195': 888,
   26276     'a187': 831,
   26277     'a188': 873,
   26278     'a189': 927,
   26279     'a190': 970,
   26280     'a191': 918
   26281   }
   26282 };
   26283 
   26284 
   26285 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   26286 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   26287 
   26288 'use strict';
   26289 
   26290 var EOF = {};
   26291 
   26292 function isEOF(v) {
   26293   return v == EOF;
   26294 }
   26295 
   26296 var Parser = (function ParserClosure() {
   26297   function Parser(lexer, allowStreams, xref) {
   26298     this.lexer = lexer;
   26299     this.allowStreams = allowStreams;
   26300     this.xref = xref;
   26301     this.inlineImg = 0;
   26302     this.refill();
   26303   }
   26304 
   26305   Parser.prototype = {
   26306     refill: function Parser_refill() {
   26307       this.buf1 = this.lexer.getObj();
   26308       this.buf2 = this.lexer.getObj();
   26309     },
   26310     shift: function Parser_shift() {
   26311       if (isCmd(this.buf2, 'ID')) {
   26312         this.buf1 = this.buf2;
   26313         this.buf2 = null;
   26314         // skip byte after ID
   26315         this.lexer.skip();
   26316       } else {
   26317         this.buf1 = this.buf2;
   26318         this.buf2 = this.lexer.getObj();
   26319       }
   26320     },
   26321     getObj: function Parser_getObj(cipherTransform) {
   26322       if (isCmd(this.buf1, 'BI')) { // inline image
   26323         this.shift();
   26324         return this.makeInlineImage(cipherTransform);
   26325       }
   26326       if (isCmd(this.buf1, '[')) { // array
   26327         this.shift();
   26328         var array = [];
   26329         while (!isCmd(this.buf1, ']') && !isEOF(this.buf1))
   26330           array.push(this.getObj());
   26331         if (isEOF(this.buf1))
   26332           error('End of file inside array');
   26333         this.shift();
   26334         return array;
   26335       }
   26336       if (isCmd(this.buf1, '<<')) { // dictionary or stream
   26337         this.shift();
   26338         var dict = new Dict(this.xref);
   26339         while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
   26340           if (!isName(this.buf1))
   26341             error('Dictionary key must be a name object');
   26342 
   26343           var key = this.buf1.name;
   26344           this.shift();
   26345           if (isEOF(this.buf1))
   26346             break;
   26347           dict.set(key, this.getObj(cipherTransform));
   26348         }
   26349         if (isEOF(this.buf1))
   26350           error('End of file inside dictionary');
   26351 
   26352         // stream objects are not allowed inside content streams or
   26353         // object streams
   26354         if (isCmd(this.buf2, 'stream')) {
   26355           return this.allowStreams ?
   26356             this.makeStream(dict, cipherTransform) : dict;
   26357         }
   26358         this.shift();
   26359         return dict;
   26360       }
   26361       if (isInt(this.buf1)) { // indirect reference or integer
   26362         var num = this.buf1;
   26363         this.shift();
   26364         if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
   26365           var ref = new Ref(num, this.buf1);
   26366           this.shift();
   26367           this.shift();
   26368           return ref;
   26369         }
   26370         return num;
   26371       }
   26372       if (isString(this.buf1)) { // string
   26373         var str = this.buf1;
   26374         this.shift();
   26375         if (cipherTransform)
   26376           str = cipherTransform.decryptString(str);
   26377         return str;
   26378       }
   26379 
   26380       // simple object
   26381       var obj = this.buf1;
   26382       this.shift();
   26383       return obj;
   26384     },
   26385     makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
   26386       var lexer = this.lexer;
   26387       var stream = lexer.stream;
   26388 
   26389       // parse dictionary
   26390       var dict = new Dict();
   26391       while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
   26392         if (!isName(this.buf1))
   26393           error('Dictionary key must be a name object');
   26394 
   26395         var key = this.buf1.name;
   26396         this.shift();
   26397         if (isEOF(this.buf1))
   26398           break;
   26399         dict.set(key, this.getObj(cipherTransform));
   26400       }
   26401 
   26402       // parse image stream
   26403       var startPos = stream.pos;
   26404 
   26405       // searching for the /EI\s/
   26406       var state = 0, ch;
   26407       while (state != 4 && (ch = stream.getByte()) != null) {
   26408         switch (ch) {
   26409           case 0x20:
   26410           case 0x0D:
   26411           case 0x0A:
   26412             state = state === 3 ? 4 : 0;
   26413             break;
   26414           case 0x45:
   26415             state = 2;
   26416             break;
   26417           case 0x49:
   26418             state = state === 2 ? 3 : 0;
   26419             break;
   26420           default:
   26421             state = 0;
   26422             break;
   26423         }
   26424       }
   26425 
   26426       // TODO improve the small images performance to remove the limit
   26427       var inlineImgLimit = 500;
   26428       if (++this.inlineImg >= inlineImgLimit) {
   26429         if (this.inlineImg === inlineImgLimit)
   26430           warn('Too many inline images');
   26431         this.shift();
   26432         return null;
   26433       }
   26434 
   26435       var length = (stream.pos - 4) - startPos;
   26436       var imageStream = stream.makeSubStream(startPos, length, dict);
   26437       if (cipherTransform)
   26438         imageStream = cipherTransform.createStream(imageStream);
   26439       imageStream = this.filter(imageStream, dict, length);
   26440       imageStream.parameters = dict;
   26441 
   26442       this.buf2 = Cmd.get('EI');
   26443       this.shift();
   26444 
   26445       return imageStream;
   26446     },
   26447     fetchIfRef: function Parser_fetchIfRef(obj) {
   26448       // not relying on the xref.fetchIfRef -- xref might not be set
   26449       return isRef(obj) ? this.xref.fetch(obj) : obj;
   26450     },
   26451     makeStream: function Parser_makeStream(dict, cipherTransform) {
   26452       var lexer = this.lexer;
   26453       var stream = lexer.stream;
   26454 
   26455       // get stream start position
   26456       lexer.skipToNextLine();
   26457       var pos = stream.pos;
   26458 
   26459       // get length
   26460       var length = this.fetchIfRef(dict.get('Length'));
   26461       if (!isInt(length))
   26462         error('Bad ' + length + ' attribute in stream');
   26463 
   26464       // skip over the stream data
   26465       stream.pos = pos + length;
   26466       this.shift(); // '>>'
   26467       this.shift(); // 'stream'
   26468       if (!isCmd(this.buf1, 'endstream'))
   26469         error('Missing endstream');
   26470       this.shift();
   26471 
   26472       stream = stream.makeSubStream(pos, length, dict);
   26473       if (cipherTransform)
   26474         stream = cipherTransform.createStream(stream);
   26475       stream = this.filter(stream, dict, length);
   26476       stream.parameters = dict;
   26477       return stream;
   26478     },
   26479     filter: function Parser_filter(stream, dict, length) {
   26480       var filter = this.fetchIfRef(dict.get('Filter', 'F'));
   26481       var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
   26482       if (isName(filter))
   26483         return this.makeFilter(stream, filter.name, length, params);
   26484       if (isArray(filter)) {
   26485         var filterArray = filter;
   26486         var paramsArray = params;
   26487         for (var i = 0, ii = filterArray.length; i < ii; ++i) {
   26488           filter = filterArray[i];
   26489           if (!isName(filter))
   26490             error('Bad filter name: ' + filter);
   26491 
   26492           params = null;
   26493           if (isArray(paramsArray) && (i in paramsArray))
   26494             params = paramsArray[i];
   26495           stream = this.makeFilter(stream, filter.name, length, params);
   26496           // after the first stream the length variable is invalid
   26497           length = null;
   26498         }
   26499       }
   26500       return stream;
   26501     },
   26502     makeFilter: function Parser_makeFilter(stream, name, length, params) {
   26503       if (name == 'FlateDecode' || name == 'Fl') {
   26504         if (params) {
   26505           return new PredictorStream(new FlateStream(stream), params);
   26506         }
   26507         return new FlateStream(stream);
   26508       }
   26509       if (name == 'LZWDecode' || name == 'LZW') {
   26510         var earlyChange = 1;
   26511         if (params) {
   26512           if (params.has('EarlyChange'))
   26513             earlyChange = params.get('EarlyChange');
   26514           return new PredictorStream(
   26515             new LZWStream(stream, earlyChange), params);
   26516         }
   26517         return new LZWStream(stream, earlyChange);
   26518       }
   26519       if (name == 'DCTDecode' || name == 'DCT') {
   26520         var bytes = stream.getBytes(length);
   26521         return new JpegStream(bytes, stream.dict, this.xref);
   26522       }
   26523       if (name == 'JPXDecode' || name == 'JPX') {
   26524         var bytes = stream.getBytes(length);
   26525         return new JpxStream(bytes, stream.dict);
   26526       }
   26527       if (name == 'ASCII85Decode' || name == 'A85') {
   26528         return new Ascii85Stream(stream);
   26529       }
   26530       if (name == 'ASCIIHexDecode' || name == 'AHx') {
   26531         return new AsciiHexStream(stream);
   26532       }
   26533       if (name == 'CCITTFaxDecode' || name == 'CCF') {
   26534         return new CCITTFaxStream(stream, params);
   26535       }
   26536       if (name == 'RunLengthDecode' || name == 'RL') {
   26537         return new RunLengthStream(stream);
   26538       }
   26539       if (name == 'JBIG2Decode') {
   26540         error('JBIG2 image format is not currently supprted.');
   26541       }
   26542       warn('filter "' + name + '" not supported yet');
   26543       return stream;
   26544     }
   26545   };
   26546 
   26547   return Parser;
   26548 })();
   26549 
   26550 var Lexer = (function LexerClosure() {
   26551   function Lexer(stream) {
   26552     this.stream = stream;
   26553   }
   26554 
   26555   Lexer.isSpace = function Lexer_isSpace(ch) {
   26556     return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
   26557   };
   26558 
   26559   // A '1' in this array means the character is white space.  A '1' or
   26560   // '2' means the character ends a name or command.
   26561   var specialChars = [
   26562     1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,   // 0x
   26563     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 1x
   26564     1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2,   // 2x
   26565     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,   // 3x
   26566     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 4x
   26567     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 5x
   26568     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 6x
   26569     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 7x
   26570     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 8x
   26571     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 9x
   26572     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ax
   26573     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // bx
   26574     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // cx
   26575     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // dx
   26576     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ex
   26577     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    // fx
   26578   ];
   26579 
   26580   function toHexDigit(ch) {
   26581     if (ch >= '0' && ch <= '9')
   26582       return ch.charCodeAt(0) - 48;
   26583     ch = ch.toUpperCase();
   26584     if (ch >= 'A' && ch <= 'F')
   26585       return ch.charCodeAt(0) - 55;
   26586     return -1;
   26587   }
   26588 
   26589   Lexer.prototype = {
   26590     getNumber: function Lexer_getNumber(ch) {
   26591       var floating = false;
   26592       var str = ch;
   26593       var stream = this.stream;
   26594       for (;;) {
   26595         ch = stream.lookChar();
   26596         if (ch == '.' && !floating) {
   26597           str += ch;
   26598           floating = true;
   26599         } else if (ch == '-') {
   26600           // ignore minus signs in the middle of numbers to match
   26601           // Adobe's behavior
   26602           warn('Badly formated number');
   26603         } else if (ch >= '0' && ch <= '9') {
   26604           str += ch;
   26605         } else if (ch == 'e' || ch == 'E') {
   26606           floating = true;
   26607         } else {
   26608           // the last character doesn't belong to us
   26609           break;
   26610         }
   26611         stream.skip();
   26612       }
   26613       var value = parseFloat(str);
   26614       if (isNaN(value))
   26615         error('Invalid floating point number: ' + value);
   26616       return value;
   26617     },
   26618     getString: function Lexer_getString() {
   26619       var numParen = 1;
   26620       var done = false;
   26621       var str = '';
   26622       var stream = this.stream;
   26623       var ch;
   26624       do {
   26625         ch = stream.getChar();
   26626         switch (ch) {
   26627           case undefined:
   26628             warn('Unterminated string');
   26629             done = true;
   26630             break;
   26631           case '(':
   26632             ++numParen;
   26633             str += ch;
   26634             break;
   26635           case ')':
   26636             if (--numParen == 0) {
   26637               done = true;
   26638             } else {
   26639               str += ch;
   26640             }
   26641             break;
   26642           case '\\':
   26643             ch = stream.getChar();
   26644             switch (ch) {
   26645               case undefined:
   26646                 warn('Unterminated string');
   26647                 done = true;
   26648                 break;
   26649               case 'n':
   26650                 str += '\n';
   26651                 break;
   26652               case 'r':
   26653                 str += '\r';
   26654                 break;
   26655               case 't':
   26656                 str += '\t';
   26657                 break;
   26658               case 'b':
   26659                 str += '\b';
   26660                 break;
   26661               case 'f':
   26662                 str += '\f';
   26663                 break;
   26664               case '\\':
   26665               case '(':
   26666               case ')':
   26667                 str += ch;
   26668                 break;
   26669               case '0': case '1': case '2': case '3':
   26670               case '4': case '5': case '6': case '7':
   26671                 var x = ch - '0';
   26672                 ch = stream.lookChar();
   26673                 if (ch >= '0' && ch <= '7') {
   26674                   stream.skip();
   26675                   x = (x << 3) + (ch - '0');
   26676                   ch = stream.lookChar();
   26677                   if (ch >= '0' && ch <= '7') {
   26678                     stream.skip();
   26679                     x = (x << 3) + (ch - '0');
   26680                   }
   26681                 }
   26682 
   26683                 str += String.fromCharCode(x);
   26684                 break;
   26685               case '\r':
   26686                 ch = stream.lookChar();
   26687                 if (ch == '\n')
   26688                   stream.skip();
   26689                 break;
   26690               case '\n':
   26691                 break;
   26692               default:
   26693                 str += ch;
   26694             }
   26695             break;
   26696           default:
   26697             str += ch;
   26698         }
   26699       } while (!done);
   26700       return str;
   26701     },
   26702     getName: function Lexer_getName(ch) {
   26703       var str = '';
   26704       var stream = this.stream;
   26705       while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
   26706         stream.skip();
   26707         if (ch == '#') {
   26708           ch = stream.lookChar();
   26709           var x = toHexDigit(ch);
   26710           if (x != -1) {
   26711             stream.skip();
   26712             var x2 = toHexDigit(stream.getChar());
   26713             if (x2 == -1)
   26714               error('Illegal digit in hex char in name: ' + x2);
   26715             str += String.fromCharCode((x << 4) | x2);
   26716           } else {
   26717             str += '#';
   26718             str += ch;
   26719           }
   26720         } else {
   26721           str += ch;
   26722         }
   26723       }
   26724       if (str.length > 128)
   26725         error('Warning: name token is longer than allowed by the spec: ' +
   26726               str.length);
   26727       return new Name(str);
   26728     },
   26729     getHexString: function Lexer_getHexString(ch) {
   26730       var str = '';
   26731       var stream = this.stream;
   26732       for (;;) {
   26733         ch = stream.getChar();
   26734         if (ch == '>') {
   26735           break;
   26736         }
   26737         if (!ch) {
   26738           warn('Unterminated hex string');
   26739           break;
   26740         }
   26741         if (specialChars[ch.charCodeAt(0)] != 1) {
   26742           var x, x2;
   26743           if ((x = toHexDigit(ch)) == -1)
   26744             error('Illegal character in hex string: ' + ch);
   26745 
   26746           ch = stream.getChar();
   26747           while (specialChars[ch.charCodeAt(0)] == 1)
   26748             ch = stream.getChar();
   26749 
   26750           if ((x2 = toHexDigit(ch)) == -1)
   26751             error('Illegal character in hex string: ' + ch);
   26752 
   26753           str += String.fromCharCode((x << 4) | x2);
   26754         }
   26755       }
   26756       return str;
   26757     },
   26758     getObj: function Lexer_getObj() {
   26759       // skip whitespace and comments
   26760       var comment = false;
   26761       var stream = this.stream;
   26762       var ch;
   26763       while (true) {
   26764         if (!(ch = stream.getChar()))
   26765           return EOF;
   26766         if (comment) {
   26767           if (ch == '\r' || ch == '\n')
   26768             comment = false;
   26769         } else if (ch == '%') {
   26770           comment = true;
   26771         } else if (specialChars[ch.charCodeAt(0)] != 1) {
   26772           break;
   26773         }
   26774       }
   26775 
   26776       // start reading token
   26777       switch (ch) {
   26778         case '0': case '1': case '2': case '3': case '4':
   26779         case '5': case '6': case '7': case '8': case '9':
   26780         case '+': case '-': case '.':
   26781           return this.getNumber(ch);
   26782         case '(':
   26783           return this.getString();
   26784         case '/':
   26785           return this.getName(ch);
   26786         // array punctuation
   26787         case '[':
   26788         case ']':
   26789           return Cmd.get(ch);
   26790         // hex string or dict punctuation
   26791         case '<':
   26792           ch = stream.lookChar();
   26793           if (ch == '<') {
   26794             // dict punctuation
   26795             stream.skip();
   26796             return Cmd.get('<<');
   26797           }
   26798           return this.getHexString(ch);
   26799         // dict punctuation
   26800         case '>':
   26801           ch = stream.lookChar();
   26802           if (ch == '>') {
   26803             stream.skip();
   26804             return Cmd.get('>>');
   26805           }
   26806         case '{':
   26807         case '}':
   26808           return Cmd.get(ch);
   26809         // fall through
   26810         case ')':
   26811           error('Illegal character: ' + ch);
   26812       }
   26813 
   26814       // command
   26815       var str = ch;
   26816       while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
   26817         stream.skip();
   26818         if (str.length == 128)
   26819           error('Command token too long: ' + str.length);
   26820 
   26821         str += ch;
   26822       }
   26823       if (str == 'true')
   26824         return true;
   26825       if (str == 'false')
   26826         return false;
   26827       if (str == 'null')
   26828         return null;
   26829       return Cmd.get(str);
   26830     },
   26831     skipToNextLine: function Lexer_skipToNextLine() {
   26832       var stream = this.stream;
   26833       while (true) {
   26834         var ch = stream.getChar();
   26835         if (!ch || ch == '\n')
   26836           return;
   26837         if (ch == '\r') {
   26838           if ((ch = stream.lookChar()) == '\n')
   26839             stream.skip();
   26840           return;
   26841         }
   26842       }
   26843     },
   26844     skip: function Lexer_skip() {
   26845       this.stream.skip();
   26846     }
   26847   };
   26848 
   26849   return Lexer;
   26850 })();
   26851 
   26852 var Linearization = (function LinearizationClosure() {
   26853   function Linearization(stream) {
   26854     this.parser = new Parser(new Lexer(stream), false, null);
   26855     var obj1 = this.parser.getObj();
   26856     var obj2 = this.parser.getObj();
   26857     var obj3 = this.parser.getObj();
   26858     this.linDict = this.parser.getObj();
   26859     if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
   26860         isDict(this.linDict)) {
   26861       var obj = this.linDict.get('Linearized');
   26862       if (!(isNum(obj) && obj > 0))
   26863         this.linDict = null;
   26864     }
   26865   }
   26866 
   26867   Linearization.prototype = {
   26868     getInt: function Linearization_getInt(name) {
   26869       var linDict = this.linDict;
   26870       var obj;
   26871       if (isDict(linDict) &&
   26872           isInt(obj = linDict.get(name)) &&
   26873           obj > 0) {
   26874         return obj;
   26875       }
   26876       error('"' + name + '" field in linearization table is invalid');
   26877     },
   26878     getHint: function Linearization_getHint(index) {
   26879       var linDict = this.linDict;
   26880       var obj1, obj2;
   26881       if (isDict(linDict) &&
   26882           isArray(obj1 = linDict.get('H')) &&
   26883           obj1.length >= 2 &&
   26884           isInt(obj2 = obj1[index]) &&
   26885           obj2 > 0) {
   26886         return obj2;
   26887       }
   26888       error('Hints table in linearization table is invalid: ' + index);
   26889     },
   26890     get length() {
   26891       if (!isDict(this.linDict))
   26892         return 0;
   26893       return this.getInt('L');
   26894     },
   26895     get hintsOffset() {
   26896       return this.getHint(0);
   26897     },
   26898     get hintsLength() {
   26899       return this.getHint(1);
   26900     },
   26901     get hintsOffset2() {
   26902       return this.getHint(2);
   26903     },
   26904     get hintsLenth2() {
   26905       return this.getHint(3);
   26906     },
   26907     get objectNumberFirst() {
   26908       return this.getInt('O');
   26909     },
   26910     get endFirst() {
   26911       return this.getInt('E');
   26912     },
   26913     get numPages() {
   26914       return this.getInt('N');
   26915     },
   26916     get mainXRefEntriesOffset() {
   26917       return this.getInt('T');
   26918     },
   26919     get pageFirst() {
   26920       return this.getInt('P');
   26921     }
   26922   };
   26923 
   26924   return Linearization;
   26925 })();
   26926 
   26927 
   26928 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   26929 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   26930 
   26931 'use strict';
   26932 
   26933 var PatternType = {
   26934   AXIAL: 2,
   26935   RADIAL: 3
   26936 };
   26937 
   26938 var Pattern = (function PatternClosure() {
   26939   // Constructor should define this.getPattern
   26940   function Pattern() {
   26941     error('should not call Pattern constructor');
   26942   }
   26943 
   26944   Pattern.prototype = {
   26945     // Input: current Canvas context
   26946     // Output: the appropriate fillStyle or strokeStyle
   26947     getPattern: function Pattern_getPattern(ctx) {
   26948       error('Should not call Pattern.getStyle: ' + ctx);
   26949     }
   26950   };
   26951 
   26952   Pattern.shadingFromIR = function Pattern_shadingFromIR(raw) {
   26953     return Shadings[raw[0]].fromIR(raw);
   26954   };
   26955 
   26956   Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
   26957                                                        res) {
   26958 
   26959     var dict = isStream(shading) ? shading.dict : shading;
   26960     var type = dict.get('ShadingType');
   26961 
   26962     switch (type) {
   26963       case PatternType.AXIAL:
   26964       case PatternType.RADIAL:
   26965         // Both radial and axial shadings are handled by RadialAxial shading.
   26966         return new Shadings.RadialAxial(dict, matrix, xref, res);
   26967       default:
   26968         return new Shadings.Dummy();
   26969     }
   26970   };
   26971   return Pattern;
   26972 })();
   26973 
   26974 var Shadings = {};
   26975 
   26976 // Radial and axial shading have very similar implementations
   26977 // If needed, the implementations can be broken into two classes
   26978 Shadings.RadialAxial = (function RadialAxialClosure() {
   26979   function RadialAxial(dict, matrix, xref, res, ctx) {
   26980     this.matrix = matrix;
   26981     this.coordsArr = dict.get('Coords');
   26982     this.shadingType = dict.get('ShadingType');
   26983     this.type = 'Pattern';
   26984 
   26985     this.ctx = ctx;
   26986     var cs = dict.get('ColorSpace', 'CS');
   26987     cs = ColorSpace.parse(cs, xref, res);
   26988     this.cs = cs;
   26989 
   26990     var t0 = 0.0, t1 = 1.0;
   26991     if (dict.has('Domain')) {
   26992       var domainArr = dict.get('Domain');
   26993       t0 = domainArr[0];
   26994       t1 = domainArr[1];
   26995     }
   26996 
   26997     var extendStart = false, extendEnd = false;
   26998     if (dict.has('Extend')) {
   26999       var extendArr = dict.get('Extend');
   27000       extendStart = extendArr[0];
   27001       extendEnd = extendArr[1];
   27002       TODO('Support extend');
   27003     }
   27004 
   27005     this.extendStart = extendStart;
   27006     this.extendEnd = extendEnd;
   27007 
   27008     var fnObj = dict.get('Function');
   27009     if (isArray(fnObj))
   27010       error('No support for array of functions');
   27011     if (!isPDFFunction(fnObj))
   27012       error('Invalid function');
   27013     var fn = PDFFunction.parse(xref, fnObj);
   27014 
   27015     // 10 samples seems good enough for now, but probably won't work
   27016     // if there are sharp color changes. Ideally, we would implement
   27017     // the spec faithfully and add lossless optimizations.
   27018     var step = (t1 - t0) / 10;
   27019     var diff = t1 - t0;
   27020 
   27021     var colorStops = [];
   27022     for (var i = t0; i <= t1; i += step) {
   27023       var rgbColor = cs.getRgb(fn([i]));
   27024       var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
   27025       colorStops.push([(i - t0) / diff, cssColor]);
   27026     }
   27027 
   27028     this.colorStops = colorStops;
   27029   }
   27030 
   27031   RadialAxial.fromIR = function RadialAxial_fromIR(raw) {
   27032     var type = raw[1];
   27033     var colorStops = raw[2];
   27034     var p0 = raw[3];
   27035     var p1 = raw[4];
   27036     var r0 = raw[5];
   27037     var r1 = raw[6];
   27038     return {
   27039       type: 'Pattern',
   27040       getPattern: function RadialAxial_getPattern(ctx) {
   27041         var curMatrix = ctx.mozCurrentTransform;
   27042         if (curMatrix) {
   27043           var userMatrix = ctx.mozCurrentTransformInverse;
   27044 
   27045           p0 = Util.applyTransform(p0, curMatrix);
   27046           p0 = Util.applyTransform(p0, userMatrix);
   27047 
   27048           p1 = Util.applyTransform(p1, curMatrix);
   27049           p1 = Util.applyTransform(p1, userMatrix);
   27050         }
   27051 
   27052         var grad;
   27053         if (type == PatternType.AXIAL)
   27054           grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
   27055         else if (type == PatternType.RADIAL)
   27056           grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
   27057 
   27058         for (var i = 0, ii = colorStops.length; i < ii; ++i) {
   27059           var c = colorStops[i];
   27060           grad.addColorStop(c[0], c[1]);
   27061         }
   27062         return grad;
   27063       }
   27064     };
   27065   };
   27066 
   27067   RadialAxial.prototype = {
   27068     getIR: function RadialAxial_getIR() {
   27069       var coordsArr = this.coordsArr;
   27070       var type = this.shadingType;
   27071       if (type == PatternType.AXIAL) {
   27072         var p0 = [coordsArr[0], coordsArr[1]];
   27073         var p1 = [coordsArr[2], coordsArr[3]];
   27074         var r0 = null;
   27075         var r1 = null;
   27076       } else if (type == PatternType.RADIAL) {
   27077         var p0 = [coordsArr[0], coordsArr[1]];
   27078         var p1 = [coordsArr[3], coordsArr[4]];
   27079         var r0 = coordsArr[2];
   27080         var r1 = coordsArr[5];
   27081       } else {
   27082         error('getPattern type unknown: ' + type);
   27083       }
   27084 
   27085       var matrix = this.matrix;
   27086       if (matrix) {
   27087         p0 = Util.applyTransform(p0, matrix);
   27088         p1 = Util.applyTransform(p1, matrix);
   27089       }
   27090 
   27091       return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
   27092     }
   27093   };
   27094 
   27095   return RadialAxial;
   27096 })();
   27097 
   27098 Shadings.Dummy = (function DummyClosure() {
   27099   function Dummy() {
   27100     this.type = 'Pattern';
   27101   }
   27102 
   27103   Dummy.fromIR = function Dummy_fromIR() {
   27104     return 'hotpink';
   27105   };
   27106 
   27107   Dummy.prototype = {
   27108     getIR: function Dummy_getIR() {
   27109       return ['Dummy'];
   27110     }
   27111   };
   27112   return Dummy;
   27113 })();
   27114 
   27115 var TilingPattern = (function TilingPatternClosure() {
   27116   var PaintType = {
   27117     COLORED: 1,
   27118     UNCOLORED: 2
   27119   };
   27120   var MAX_PATTERN_SIZE = 512;
   27121 
   27122   function TilingPattern(IR, color, ctx, objs) {
   27123     var operatorList = IR[2];
   27124     this.matrix = IR[3];
   27125     var bbox = IR[4];
   27126     var xstep = IR[5];
   27127     var ystep = IR[6];
   27128     var paintType = IR[7];
   27129 
   27130     TODO('TilingType');
   27131 
   27132     this.curMatrix = ctx.mozCurrentTransform;
   27133     this.invMatrix = ctx.mozCurrentTransformInverse;
   27134     this.ctx = ctx;
   27135     this.type = 'Pattern';
   27136 
   27137     var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
   27138 
   27139     var topLeft = [x0, y0];
   27140     // we want the canvas to be as large as the step size
   27141     var botRight = [x0 + xstep, y0 + ystep];
   27142 
   27143     var width = botRight[0] - topLeft[0];
   27144     var height = botRight[1] - topLeft[1];
   27145 
   27146     // TODO: hack to avoid OOM, we would ideally compute the tiling
   27147     // pattern to be only as large as the acual size in device space
   27148     // This could be computed with .mozCurrentTransform, but still
   27149     // needs to be implemented
   27150     while (Math.abs(width) > MAX_PATTERN_SIZE ||
   27151            Math.abs(height) > MAX_PATTERN_SIZE) {
   27152       width = height = MAX_PATTERN_SIZE;
   27153     }
   27154 
   27155     var tmpCanvas = createScratchCanvas(width, height);
   27156 
   27157     // set the new canvas element context as the graphics context
   27158     var tmpCtx = tmpCanvas.getContext('2d');
   27159     var graphics = new CanvasGraphics(tmpCtx, objs);
   27160 
   27161     switch (paintType) {
   27162       case PaintType.COLORED:
   27163         tmpCtx.fillStyle = ctx.fillStyle;
   27164         tmpCtx.strokeStyle = ctx.strokeStyle;
   27165         break;
   27166       case PaintType.UNCOLORED:
   27167         var cssColor = Util.makeCssRgb(this, color[0], color[1], color[2]);
   27168         tmpCtx.fillStyle = cssColor;
   27169         tmpCtx.strokeStyle = cssColor;
   27170         break;
   27171       default:
   27172         error('Unsupported paint type: ' + paintType);
   27173     }
   27174 
   27175     var scale = [width / xstep, height / ystep];
   27176     this.scale = scale;
   27177 
   27178     // transform coordinates to pattern space
   27179     var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
   27180     var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
   27181     graphics.transform.apply(graphics, tmpScale);
   27182     graphics.transform.apply(graphics, tmpTranslate);
   27183 
   27184     if (bbox && isArray(bbox) && 4 == bbox.length) {
   27185       var bboxWidth = x1 - x0;
   27186       var bboxHeight = y1 - y0;
   27187       graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
   27188       graphics.clip();
   27189       graphics.endPath();
   27190     }
   27191 
   27192     graphics.executeOperatorList(operatorList);
   27193 
   27194     this.canvas = tmpCanvas;
   27195   }
   27196 
   27197   TilingPattern.getIR = function TilingPattern_getIR(operatorList, dict, args) {
   27198     var matrix = dict.get('Matrix');
   27199     var bbox = dict.get('BBox');
   27200     var xstep = dict.get('XStep');
   27201     var ystep = dict.get('YStep');
   27202     var paintType = dict.get('PaintType');
   27203 
   27204     return [
   27205       'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType
   27206     ];
   27207   };
   27208 
   27209   TilingPattern.prototype = {
   27210     getPattern: function TilingPattern_getPattern() {
   27211       var matrix = this.matrix;
   27212       var curMatrix = this.curMatrix;
   27213       var ctx = this.ctx;
   27214 
   27215       if (curMatrix)
   27216         ctx.setTransform.apply(ctx, curMatrix);
   27217 
   27218       if (matrix)
   27219         ctx.transform.apply(ctx, matrix);
   27220 
   27221       var scale = this.scale;
   27222       ctx.scale(1 / scale[0], 1 / scale[1]);
   27223 
   27224       return ctx.createPattern(this.canvas, 'repeat');
   27225     }
   27226   };
   27227 
   27228   return TilingPattern;
   27229 })();
   27230 
   27231 
   27232 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   27233 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   27234 
   27235 'use strict';
   27236 
   27237 var Stream = (function StreamClosure() {
   27238   function Stream(arrayBuffer, start, length, dict) {
   27239     this.bytes = new Uint8Array(arrayBuffer);
   27240     this.start = start || 0;
   27241     this.pos = this.start;
   27242     this.end = (start + length) || this.bytes.length;
   27243     this.dict = dict;
   27244   }
   27245 
   27246   // required methods for a stream. if a particular stream does not
   27247   // implement these, an error should be thrown
   27248   Stream.prototype = {
   27249     get length() {
   27250       return this.end - this.start;
   27251     },
   27252     getByte: function Stream_getByte() {
   27253       if (this.pos >= this.end)
   27254         return null;
   27255       return this.bytes[this.pos++];
   27256     },
   27257     // returns subarray of original buffer
   27258     // should only be read
   27259     getBytes: function Stream_getBytes(length) {
   27260       var bytes = this.bytes;
   27261       var pos = this.pos;
   27262       var strEnd = this.end;
   27263 
   27264       if (!length)
   27265         return bytes.subarray(pos, strEnd);
   27266 
   27267       var end = pos + length;
   27268       if (end > strEnd)
   27269         end = strEnd;
   27270 
   27271       this.pos = end;
   27272       return bytes.subarray(pos, end);
   27273     },
   27274     lookChar: function Stream_lookChar() {
   27275       if (this.pos >= this.end)
   27276         return null;
   27277       return String.fromCharCode(this.bytes[this.pos]);
   27278     },
   27279     getChar: function Stream_getChar() {
   27280       if (this.pos >= this.end)
   27281         return null;
   27282       return String.fromCharCode(this.bytes[this.pos++]);
   27283     },
   27284     skip: function Stream_skip(n) {
   27285       if (!n)
   27286         n = 1;
   27287       this.pos += n;
   27288     },
   27289     reset: function Stream_reset() {
   27290       this.pos = this.start;
   27291     },
   27292     moveStart: function Stream_moveStart() {
   27293       this.start = this.pos;
   27294     },
   27295     makeSubStream: function Stream_makeSubStream(start, length, dict) {
   27296       return new Stream(this.bytes.buffer, start, length, dict);
   27297     },
   27298     isStream: true
   27299   };
   27300 
   27301   return Stream;
   27302 })();
   27303 
   27304 var StringStream = (function StringStreamClosure() {
   27305   function StringStream(str) {
   27306     var length = str.length;
   27307     var bytes = new Uint8Array(length);
   27308     for (var n = 0; n < length; ++n)
   27309       bytes[n] = str.charCodeAt(n);
   27310     Stream.call(this, bytes);
   27311   }
   27312 
   27313   StringStream.prototype = Stream.prototype;
   27314 
   27315   return StringStream;
   27316 })();
   27317 
   27318 // super class for the decoding streams
   27319 var DecodeStream = (function DecodeStreamClosure() {
   27320   function DecodeStream() {
   27321     this.pos = 0;
   27322     this.bufferLength = 0;
   27323     this.eof = false;
   27324     this.buffer = null;
   27325   }
   27326 
   27327   DecodeStream.prototype = {
   27328     ensureBuffer: function DecodeStream_ensureBuffer(requested) {
   27329       var buffer = this.buffer;
   27330       var current = buffer ? buffer.byteLength : 0;
   27331       if (requested < current)
   27332         return buffer;
   27333       var size = 512;
   27334       while (size < requested)
   27335         size <<= 1;
   27336       var buffer2 = new Uint8Array(size);
   27337       for (var i = 0; i < current; ++i)
   27338         buffer2[i] = buffer[i];
   27339       return (this.buffer = buffer2);
   27340     },
   27341     getByte: function DecodeStream_getByte() {
   27342       var pos = this.pos;
   27343       while (this.bufferLength <= pos) {
   27344         if (this.eof)
   27345           return null;
   27346         this.readBlock();
   27347       }
   27348       return this.buffer[this.pos++];
   27349     },
   27350     getBytes: function DecodeStream_getBytes(length) {
   27351       var end, pos = this.pos;
   27352 
   27353       if (length) {
   27354         this.ensureBuffer(pos + length);
   27355         end = pos + length;
   27356 
   27357         while (!this.eof && this.bufferLength < end)
   27358           this.readBlock();
   27359 
   27360         var bufEnd = this.bufferLength;
   27361         if (end > bufEnd)
   27362           end = bufEnd;
   27363       } else {
   27364         while (!this.eof)
   27365           this.readBlock();
   27366 
   27367         end = this.bufferLength;
   27368 
   27369         // checking if bufferLength is still 0 then
   27370         // the buffer has to be initialized
   27371         if (!end)
   27372           this.buffer = new Uint8Array(0);
   27373       }
   27374 
   27375       this.pos = end;
   27376       return this.buffer.subarray(pos, end);
   27377     },
   27378     lookChar: function DecodeStream_lookChar() {
   27379       var pos = this.pos;
   27380       while (this.bufferLength <= pos) {
   27381         if (this.eof)
   27382           return null;
   27383         this.readBlock();
   27384       }
   27385       return String.fromCharCode(this.buffer[this.pos]);
   27386     },
   27387     getChar: function DecodeStream_getChar() {
   27388       var pos = this.pos;
   27389       while (this.bufferLength <= pos) {
   27390         if (this.eof)
   27391           return null;
   27392         this.readBlock();
   27393       }
   27394       return String.fromCharCode(this.buffer[this.pos++]);
   27395     },
   27396     makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
   27397       var end = start + length;
   27398       while (this.bufferLength <= end && !this.eof)
   27399         this.readBlock();
   27400       return new Stream(this.buffer, start, length, dict);
   27401     },
   27402     skip: function DecodeStream_skip(n) {
   27403       if (!n)
   27404         n = 1;
   27405       this.pos += n;
   27406     },
   27407     reset: function DecodeStream_reset() {
   27408       this.pos = 0;
   27409     }
   27410   };
   27411 
   27412   return DecodeStream;
   27413 })();
   27414 
   27415 var FakeStream = (function FakeStreamClosure() {
   27416   function FakeStream(stream) {
   27417     this.dict = stream.dict;
   27418     DecodeStream.call(this);
   27419   }
   27420 
   27421   FakeStream.prototype = Object.create(DecodeStream.prototype);
   27422   FakeStream.prototype.readBlock = function FakeStream_readBlock() {
   27423     var bufferLength = this.bufferLength;
   27424     bufferLength += 1024;
   27425     var buffer = this.ensureBuffer(bufferLength);
   27426     this.bufferLength = bufferLength;
   27427   };
   27428 
   27429   FakeStream.prototype.getBytes = function FakeStream_getBytes(length) {
   27430     var end, pos = this.pos;
   27431 
   27432     if (length) {
   27433       this.ensureBuffer(pos + length);
   27434       end = pos + length;
   27435 
   27436       while (!this.eof && this.bufferLength < end)
   27437         this.readBlock();
   27438 
   27439       var bufEnd = this.bufferLength;
   27440       if (end > bufEnd)
   27441         end = bufEnd;
   27442     } else {
   27443       this.eof = true;
   27444       end = this.bufferLength;
   27445     }
   27446 
   27447     this.pos = end;
   27448     return this.buffer.subarray(pos, end);
   27449   };
   27450 
   27451   return FakeStream;
   27452 })();
   27453 
   27454 var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
   27455   function StreamsSequenceStream(streams) {
   27456     this.streams = streams;
   27457     DecodeStream.call(this);
   27458   }
   27459 
   27460   StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
   27461 
   27462   StreamsSequenceStream.prototype.readBlock =
   27463     function streamSequenceStreamReadBlock() {
   27464 
   27465     var streams = this.streams;
   27466     if (streams.length == 0) {
   27467       this.eof = true;
   27468       return;
   27469     }
   27470     var stream = streams.shift();
   27471     var chunk = stream.getBytes();
   27472     var bufferLength = this.bufferLength;
   27473     var newLength = bufferLength + chunk.length;
   27474     var buffer = this.ensureBuffer(newLength);
   27475     buffer.set(chunk, bufferLength);
   27476     this.bufferLength = newLength;
   27477   };
   27478 
   27479   return StreamsSequenceStream;
   27480 })();
   27481 
   27482 var FlateStream = (function FlateStreamClosure() {
   27483   var codeLenCodeMap = new Uint32Array([
   27484     16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
   27485   ]);
   27486 
   27487   var lengthDecode = new Uint32Array([
   27488     0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
   27489     0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
   27490     0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
   27491     0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
   27492   ]);
   27493 
   27494   var distDecode = new Uint32Array([
   27495     0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
   27496     0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
   27497     0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
   27498     0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
   27499   ]);
   27500 
   27501   var fixedLitCodeTab = [new Uint32Array([
   27502     0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
   27503     0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
   27504     0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
   27505     0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
   27506     0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
   27507     0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
   27508     0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
   27509     0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
   27510     0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
   27511     0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
   27512     0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
   27513     0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
   27514     0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
   27515     0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
   27516     0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
   27517     0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
   27518     0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
   27519     0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
   27520     0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
   27521     0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
   27522     0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
   27523     0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
   27524     0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
   27525     0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
   27526     0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
   27527     0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
   27528     0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
   27529     0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
   27530     0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
   27531     0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
   27532     0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
   27533     0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
   27534     0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
   27535     0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
   27536     0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
   27537     0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
   27538     0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
   27539     0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
   27540     0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
   27541     0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
   27542     0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
   27543     0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
   27544     0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
   27545     0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
   27546     0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
   27547     0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
   27548     0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
   27549     0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
   27550     0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
   27551     0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
   27552     0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
   27553     0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
   27554     0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
   27555     0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
   27556     0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
   27557     0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
   27558     0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
   27559     0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
   27560     0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
   27561     0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
   27562     0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
   27563     0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
   27564     0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
   27565     0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
   27566   ]), 9];
   27567 
   27568   var fixedDistCodeTab = [new Uint32Array([
   27569     0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
   27570     0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
   27571     0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
   27572     0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
   27573   ]), 5];
   27574 
   27575   function FlateStream(stream) {
   27576     var bytes = stream.getBytes();
   27577     var bytesPos = 0;
   27578 
   27579     this.dict = stream.dict;
   27580     var cmf = bytes[bytesPos++];
   27581     var flg = bytes[bytesPos++];
   27582     if (cmf == -1 || flg == -1)
   27583       error('Invalid header in flate stream: ' + cmf + ', ' + flg);
   27584     if ((cmf & 0x0f) != 0x08)
   27585       error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
   27586     if ((((cmf << 8) + flg) % 31) != 0)
   27587       error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
   27588     if (flg & 0x20)
   27589       error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
   27590 
   27591     this.bytes = bytes;
   27592     this.bytesPos = bytesPos;
   27593 
   27594     this.codeSize = 0;
   27595     this.codeBuf = 0;
   27596 
   27597     DecodeStream.call(this);
   27598   }
   27599 
   27600   FlateStream.prototype = Object.create(DecodeStream.prototype);
   27601 
   27602   FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
   27603     var codeSize = this.codeSize;
   27604     var codeBuf = this.codeBuf;
   27605     var bytes = this.bytes;
   27606     var bytesPos = this.bytesPos;
   27607 
   27608     var b;
   27609     while (codeSize < bits) {
   27610       if (typeof (b = bytes[bytesPos++]) == 'undefined')
   27611         error('Bad encoding in flate stream');
   27612       codeBuf |= b << codeSize;
   27613       codeSize += 8;
   27614     }
   27615     b = codeBuf & ((1 << bits) - 1);
   27616     this.codeBuf = codeBuf >> bits;
   27617     this.codeSize = codeSize -= bits;
   27618     this.bytesPos = bytesPos;
   27619     return b;
   27620   };
   27621 
   27622   FlateStream.prototype.getCode = function FlateStream_getCode(table) {
   27623     var codes = table[0];
   27624     var maxLen = table[1];
   27625     var codeSize = this.codeSize;
   27626     var codeBuf = this.codeBuf;
   27627     var bytes = this.bytes;
   27628     var bytesPos = this.bytesPos;
   27629 
   27630     while (codeSize < maxLen) {
   27631       var b;
   27632       if (typeof (b = bytes[bytesPos++]) == 'undefined')
   27633         error('Bad encoding in flate stream');
   27634       codeBuf |= (b << codeSize);
   27635       codeSize += 8;
   27636     }
   27637     var code = codes[codeBuf & ((1 << maxLen) - 1)];
   27638     var codeLen = code >> 16;
   27639     var codeVal = code & 0xffff;
   27640     if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
   27641       error('Bad encoding in flate stream');
   27642     this.codeBuf = (codeBuf >> codeLen);
   27643     this.codeSize = (codeSize - codeLen);
   27644     this.bytesPos = bytesPos;
   27645     return codeVal;
   27646   };
   27647 
   27648   FlateStream.prototype.generateHuffmanTable =
   27649     function flateStreamGenerateHuffmanTable(lengths) {
   27650     var n = lengths.length;
   27651 
   27652     // find max code length
   27653     var maxLen = 0;
   27654     for (var i = 0; i < n; ++i) {
   27655       if (lengths[i] > maxLen)
   27656         maxLen = lengths[i];
   27657     }
   27658 
   27659     // build the table
   27660     var size = 1 << maxLen;
   27661     var codes = new Uint32Array(size);
   27662     for (var len = 1, code = 0, skip = 2;
   27663          len <= maxLen;
   27664          ++len, code <<= 1, skip <<= 1) {
   27665       for (var val = 0; val < n; ++val) {
   27666         if (lengths[val] == len) {
   27667           // bit-reverse the code
   27668           var code2 = 0;
   27669           var t = code;
   27670           for (var i = 0; i < len; ++i) {
   27671             code2 = (code2 << 1) | (t & 1);
   27672             t >>= 1;
   27673           }
   27674 
   27675           // fill the table entries
   27676           for (var i = code2; i < size; i += skip)
   27677             codes[i] = (len << 16) | val;
   27678 
   27679           ++code;
   27680         }
   27681       }
   27682     }
   27683 
   27684     return [codes, maxLen];
   27685   };
   27686 
   27687   FlateStream.prototype.readBlock = function FlateStream_readBlock() {
   27688     // read block header
   27689     var hdr = this.getBits(3);
   27690     if (hdr & 1)
   27691       this.eof = true;
   27692     hdr >>= 1;
   27693 
   27694     if (hdr == 0) { // uncompressed block
   27695       var bytes = this.bytes;
   27696       var bytesPos = this.bytesPos;
   27697       var b;
   27698 
   27699       if (typeof (b = bytes[bytesPos++]) == 'undefined')
   27700         error('Bad block header in flate stream');
   27701       var blockLen = b;
   27702       if (typeof (b = bytes[bytesPos++]) == 'undefined')
   27703         error('Bad block header in flate stream');
   27704       blockLen |= (b << 8);
   27705       if (typeof (b = bytes[bytesPos++]) == 'undefined')
   27706         error('Bad block header in flate stream');
   27707       var check = b;
   27708       if (typeof (b = bytes[bytesPos++]) == 'undefined')
   27709         error('Bad block header in flate stream');
   27710       check |= (b << 8);
   27711       if (check != (~blockLen & 0xffff))
   27712         error('Bad uncompressed block length in flate stream');
   27713 
   27714       this.codeBuf = 0;
   27715       this.codeSize = 0;
   27716 
   27717       var bufferLength = this.bufferLength;
   27718       var buffer = this.ensureBuffer(bufferLength + blockLen);
   27719       var end = bufferLength + blockLen;
   27720       this.bufferLength = end;
   27721       for (var n = bufferLength; n < end; ++n) {
   27722         if (typeof (b = bytes[bytesPos++]) == 'undefined') {
   27723           this.eof = true;
   27724           break;
   27725         }
   27726         buffer[n] = b;
   27727       }
   27728       this.bytesPos = bytesPos;
   27729       return;
   27730     }
   27731 
   27732     var litCodeTable;
   27733     var distCodeTable;
   27734     if (hdr == 1) { // compressed block, fixed codes
   27735       litCodeTable = fixedLitCodeTab;
   27736       distCodeTable = fixedDistCodeTab;
   27737     } else if (hdr == 2) { // compressed block, dynamic codes
   27738       var numLitCodes = this.getBits(5) + 257;
   27739       var numDistCodes = this.getBits(5) + 1;
   27740       var numCodeLenCodes = this.getBits(4) + 4;
   27741 
   27742       // build the code lengths code table
   27743       var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
   27744 
   27745       for (var i = 0; i < numCodeLenCodes; ++i)
   27746         codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
   27747       var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
   27748 
   27749       // build the literal and distance code tables
   27750       var len = 0;
   27751       var i = 0;
   27752       var codes = numLitCodes + numDistCodes;
   27753       var codeLengths = new Uint8Array(codes);
   27754       while (i < codes) {
   27755         var code = this.getCode(codeLenCodeTab);
   27756         if (code == 16) {
   27757           var bitsLength = 2, bitsOffset = 3, what = len;
   27758         } else if (code == 17) {
   27759           var bitsLength = 3, bitsOffset = 3, what = (len = 0);
   27760         } else if (code == 18) {
   27761           var bitsLength = 7, bitsOffset = 11, what = (len = 0);
   27762         } else {
   27763           codeLengths[i++] = len = code;
   27764           continue;
   27765         }
   27766 
   27767         var repeatLength = this.getBits(bitsLength) + bitsOffset;
   27768         while (repeatLength-- > 0)
   27769           codeLengths[i++] = what;
   27770       }
   27771 
   27772       litCodeTable =
   27773         this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
   27774       distCodeTable =
   27775         this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
   27776     } else {
   27777       error('Unknown block type in flate stream');
   27778     }
   27779 
   27780     var buffer = this.buffer;
   27781     var limit = buffer ? buffer.length : 0;
   27782     var pos = this.bufferLength;
   27783     while (true) {
   27784       var code1 = this.getCode(litCodeTable);
   27785       if (code1 < 256) {
   27786         if (pos + 1 >= limit) {
   27787           buffer = this.ensureBuffer(pos + 1);
   27788           limit = buffer.length;
   27789         }
   27790         buffer[pos++] = code1;
   27791         continue;
   27792       }
   27793       if (code1 == 256) {
   27794         this.bufferLength = pos;
   27795         return;
   27796       }
   27797       code1 -= 257;
   27798       code1 = lengthDecode[code1];
   27799       var code2 = code1 >> 16;
   27800       if (code2 > 0)
   27801         code2 = this.getBits(code2);
   27802       var len = (code1 & 0xffff) + code2;
   27803       code1 = this.getCode(distCodeTable);
   27804       code1 = distDecode[code1];
   27805       code2 = code1 >> 16;
   27806       if (code2 > 0)
   27807         code2 = this.getBits(code2);
   27808       var dist = (code1 & 0xffff) + code2;
   27809       if (pos + len >= limit) {
   27810         buffer = this.ensureBuffer(pos + len);
   27811         limit = buffer.length;
   27812       }
   27813       for (var k = 0; k < len; ++k, ++pos)
   27814         buffer[pos] = buffer[pos - dist];
   27815     }
   27816   };
   27817 
   27818   return FlateStream;
   27819 })();
   27820 
   27821 var PredictorStream = (function PredictorStreamClosure() {
   27822   function PredictorStream(stream, params) {
   27823     var predictor = this.predictor = params.get('Predictor') || 1;
   27824 
   27825     if (predictor <= 1)
   27826       return stream; // no prediction
   27827     if (predictor !== 2 && (predictor < 10 || predictor > 15))
   27828       error('Unsupported predictor: ' + predictor);
   27829 
   27830     if (predictor === 2)
   27831       this.readBlock = this.readBlockTiff;
   27832     else
   27833       this.readBlock = this.readBlockPng;
   27834 
   27835     this.stream = stream;
   27836     this.dict = stream.dict;
   27837 
   27838     var colors = this.colors = params.get('Colors') || 1;
   27839     var bits = this.bits = params.get('BitsPerComponent') || 8;
   27840     var columns = this.columns = params.get('Columns') || 1;
   27841 
   27842     this.pixBytes = (colors * bits + 7) >> 3;
   27843     this.rowBytes = (columns * colors * bits + 7) >> 3;
   27844 
   27845     DecodeStream.call(this);
   27846     return this;
   27847   }
   27848 
   27849   PredictorStream.prototype = Object.create(DecodeStream.prototype);
   27850 
   27851   PredictorStream.prototype.readBlockTiff =
   27852     function predictorStreamReadBlockTiff() {
   27853     var rowBytes = this.rowBytes;
   27854 
   27855     var bufferLength = this.bufferLength;
   27856     var buffer = this.ensureBuffer(bufferLength + rowBytes);
   27857 
   27858     var bits = this.bits;
   27859     var colors = this.colors;
   27860 
   27861     var rawBytes = this.stream.getBytes(rowBytes);
   27862 
   27863     var inbuf = 0, outbuf = 0;
   27864     var inbits = 0, outbits = 0;
   27865     var pos = bufferLength;
   27866 
   27867     if (bits === 1) {
   27868       for (var i = 0; i < rowBytes; ++i) {
   27869         var c = rawBytes[i];
   27870         inbuf = (inbuf << 8) | c;
   27871         // bitwise addition is exclusive or
   27872         // first shift inbuf and then add
   27873         buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
   27874         // truncate inbuf (assumes colors < 16)
   27875         inbuf &= 0xFFFF;
   27876       }
   27877     } else if (bits === 8) {
   27878       for (var i = 0; i < colors; ++i)
   27879         buffer[pos++] = rawBytes[i];
   27880       for (; i < rowBytes; ++i) {
   27881         buffer[pos] = buffer[pos - colors] + rawBytes[i];
   27882         pos++;
   27883       }
   27884     } else {
   27885       var compArray = new Uint8Array(colors + 1);
   27886       var bitMask = (1 << bits) - 1;
   27887       var j = 0, k = bufferLength;
   27888       var columns = this.columns;
   27889       for (var i = 0; i < columns; ++i) {
   27890         for (var kk = 0; kk < colors; ++kk) {
   27891           if (inbits < bits) {
   27892             inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
   27893             inbits += 8;
   27894           }
   27895           compArray[kk] = (compArray[kk] +
   27896                            (inbuf >> (inbits - bits))) & bitMask;
   27897           inbits -= bits;
   27898           outbuf = (outbuf << bits) | compArray[kk];
   27899           outbits += bits;
   27900           if (outbits >= 8) {
   27901             buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
   27902             outbits -= 8;
   27903           }
   27904         }
   27905       }
   27906       if (outbits > 0) {
   27907         buffer[k++] = (outbuf << (8 - outbits)) +
   27908         (inbuf & ((1 << (8 - outbits)) - 1));
   27909       }
   27910     }
   27911     this.bufferLength += rowBytes;
   27912   };
   27913 
   27914   PredictorStream.prototype.readBlockPng =
   27915     function predictorStreamReadBlockPng() {
   27916 
   27917     var rowBytes = this.rowBytes;
   27918     var pixBytes = this.pixBytes;
   27919 
   27920     var predictor = this.stream.getByte();
   27921     var rawBytes = this.stream.getBytes(rowBytes);
   27922 
   27923     var bufferLength = this.bufferLength;
   27924     var buffer = this.ensureBuffer(bufferLength + rowBytes);
   27925 
   27926     var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
   27927     if (prevRow.length == 0)
   27928       prevRow = new Uint8Array(rowBytes);
   27929 
   27930     var j = bufferLength;
   27931     switch (predictor) {
   27932       case 0:
   27933         for (var i = 0; i < rowBytes; ++i)
   27934           buffer[j++] = rawBytes[i];
   27935         break;
   27936       case 1:
   27937         for (var i = 0; i < pixBytes; ++i)
   27938           buffer[j++] = rawBytes[i];
   27939         for (; i < rowBytes; ++i) {
   27940           buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
   27941           j++;
   27942         }
   27943         break;
   27944       case 2:
   27945         for (var i = 0; i < rowBytes; ++i)
   27946           buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
   27947         break;
   27948       case 3:
   27949         for (var i = 0; i < pixBytes; ++i)
   27950           buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
   27951         for (; i < rowBytes; ++i) {
   27952           buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
   27953                            rawBytes[i]) & 0xFF;
   27954           j++;
   27955         }
   27956         break;
   27957       case 4:
   27958         // we need to save the up left pixels values. the simplest way
   27959         // is to create a new buffer
   27960         for (var i = 0; i < pixBytes; ++i) {
   27961           var up = prevRow[i];
   27962           var c = rawBytes[i];
   27963           buffer[j++] = up + c;
   27964         }
   27965         for (; i < rowBytes; ++i) {
   27966           var up = prevRow[i];
   27967           var upLeft = prevRow[i - pixBytes];
   27968           var left = buffer[j - pixBytes];
   27969           var p = left + up - upLeft;
   27970 
   27971           var pa = p - left;
   27972           if (pa < 0)
   27973             pa = -pa;
   27974           var pb = p - up;
   27975           if (pb < 0)
   27976             pb = -pb;
   27977           var pc = p - upLeft;
   27978           if (pc < 0)
   27979             pc = -pc;
   27980 
   27981           var c = rawBytes[i];
   27982           if (pa <= pb && pa <= pc)
   27983             buffer[j++] = left + c;
   27984           else if (pb <= pc)
   27985             buffer[j++] = up + c;
   27986           else
   27987             buffer[j++] = upLeft + c;
   27988         }
   27989         break;
   27990       default:
   27991         error('Unsupported predictor: ' + predictor);
   27992     }
   27993     this.bufferLength += rowBytes;
   27994   };
   27995 
   27996   return PredictorStream;
   27997 })();
   27998 
   27999 /**
   28000  * Depending on the type of JPEG a JpegStream is handled in different ways. For
   28001  * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
   28002  * data is stored and then loaded by the browser.  For unsupported JPEG's we use
   28003  * a library to decode these images and the stream behaves like all the other
   28004  * DecodeStreams.
   28005  */
   28006 var JpegStream = (function JpegStreamClosure() {
   28007   function isAdobeImage(bytes) {
   28008     var maxBytesScanned = Math.max(bytes.length - 16, 1024);
   28009     // Looking for APP14, 'Adobe'
   28010     for (var i = 0; i < maxBytesScanned; ++i) {
   28011       if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
   28012           bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
   28013           bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
   28014           bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
   28015           bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00)
   28016           return true;
   28017       // scanning until frame tag
   28018       if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
   28019         break;
   28020     }
   28021     return false;
   28022   }
   28023 
   28024   function fixAdobeImage(bytes) {
   28025     // Inserting 'EMBED' marker after JPEG signature
   28026     var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
   28027                                       0x44, 0]);
   28028     var newBytes = new Uint8Array(bytes.length + embedMarker.length);
   28029     newBytes.set(bytes, embedMarker.length);
   28030     // copy JPEG header
   28031     newBytes[0] = bytes[0];
   28032     newBytes[1] = bytes[1];
   28033     newBytes.set(embedMarker, 2);
   28034     return newBytes;
   28035   }
   28036 
   28037   function JpegStream(bytes, dict, xref) {
   28038     // TODO: per poppler, some images may have 'junk' before that
   28039     // need to be removed
   28040     this.dict = dict;
   28041 
   28042     this.isAdobeImage = false;
   28043     this.colorTransform = dict.get('ColorTransform') || -1;
   28044 
   28045     if (isAdobeImage(bytes)) {
   28046       this.isAdobeImage = true;
   28047       bytes = fixAdobeImage(bytes);
   28048     }
   28049 
   28050     this.bytes = bytes;
   28051 
   28052     DecodeStream.call(this);
   28053   }
   28054 
   28055   JpegStream.prototype = Object.create(DecodeStream.prototype);
   28056 
   28057   JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
   28058     if (this.bufferLength)
   28059       return;
   28060     try {
   28061       var jpegImage = new JpegImage();
   28062       if (this.colorTransform != -1)
   28063         jpegImage.colorTransform = this.colorTransform;
   28064       jpegImage.parse(this.bytes);
   28065       var width = jpegImage.width;
   28066       var height = jpegImage.height;
   28067       var data = jpegImage.getData(width, height);
   28068       this.buffer = data;
   28069       this.bufferLength = data.length;
   28070     } catch (e) {
   28071       error('JPEG error: ' + e);
   28072     }
   28073   };
   28074   JpegStream.prototype.getIR = function JpegStream_getIR() {
   28075     return bytesToString(this.bytes);
   28076   };
   28077   JpegStream.prototype.getChar = function JpegStream_getChar() {
   28078     error('internal error: getChar is not valid on JpegStream');
   28079   };
   28080   /**
   28081    * Checks if the image can be decoded and displayed by the browser without any
   28082    * further processing such as color space conversions.
   28083    */
   28084   JpegStream.prototype.isNativelySupported =
   28085     function JpegStream_isNativelySupported(xref, res) {
   28086     var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
   28087     // when bug 674619 lands, let's check if browser can do
   28088     // normal cmyk and then we won't need to decode in JS
   28089     if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB')
   28090       return true;
   28091     if (cs.name === 'DeviceCMYK' && !this.isAdobeImage &&
   28092         this.colorTransform < 1)
   28093       return true;
   28094     return false;
   28095   };
   28096   /**
   28097    * Checks if the image can be decoded by the browser.
   28098    */
   28099   JpegStream.prototype.isNativelyDecodable =
   28100     function JpegStream_isNativelyDecodable(xref, res) {
   28101     var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
   28102     var numComps = cs.numComps;
   28103     if (numComps == 1 || numComps == 3)
   28104       return true;
   28105 
   28106     return false;
   28107   };
   28108 
   28109   return JpegStream;
   28110 })();
   28111 
   28112 /**
   28113  * For JPEG 2000's we use a library to decode these images and
   28114  * the stream behaves like all the other DecodeStreams.
   28115  */
   28116 var JpxStream = (function JpxStreamClosure() {
   28117   function JpxStream(bytes, dict) {
   28118     this.dict = dict;
   28119     this.bytes = bytes;
   28120 
   28121     DecodeStream.call(this);
   28122   }
   28123 
   28124   JpxStream.prototype = Object.create(DecodeStream.prototype);
   28125 
   28126   JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
   28127     if (this.bufferLength)
   28128       return;
   28129 
   28130     var jpxImage = new JpxImage();
   28131     jpxImage.parse(this.bytes);
   28132 
   28133     var width = jpxImage.width;
   28134     var height = jpxImage.height;
   28135     var componentsCount = jpxImage.componentsCount;
   28136     if (componentsCount != 1 && componentsCount != 3 && componentsCount != 4)
   28137       error('JPX with ' + componentsCount + ' components is not supported');
   28138 
   28139     var data = new Uint8Array(width * height * componentsCount);
   28140 
   28141     for (var k = 0, kk = jpxImage.tiles.length; k < kk; k++) {
   28142       var tileCompoments = jpxImage.tiles[k];
   28143       var tileWidth = tileCompoments[0].width;
   28144       var tileHeight = tileCompoments[0].height;
   28145       var tileLeft = tileCompoments[0].left;
   28146       var tileTop = tileCompoments[0].top;
   28147 
   28148       var dataPosition, sourcePosition, data0, data1, data2, data3, rowFeed;
   28149       switch (componentsCount) {
   28150         case 1:
   28151           data0 = tileCompoments[0].items;
   28152 
   28153           dataPosition = width * tileTop + tileLeft;
   28154           rowFeed = width - tileWidth;
   28155           sourcePosition = 0;
   28156           for (var j = 0; j < tileHeight; j++) {
   28157             for (var i = 0; i < tileWidth; i++)
   28158               data[dataPosition++] = data0[sourcePosition++];
   28159             dataPosition += rowFeed;
   28160           }
   28161           break;
   28162         case 3:
   28163           data0 = tileCompoments[0].items;
   28164           data1 = tileCompoments[1].items;
   28165           data2 = tileCompoments[2].items;
   28166 
   28167           dataPosition = (width * tileTop + tileLeft) * 3;
   28168           rowFeed = (width - tileWidth) * 3;
   28169           sourcePosition = 0;
   28170           for (var j = 0; j < tileHeight; j++) {
   28171             for (var i = 0; i < tileWidth; i++) {
   28172               data[dataPosition++] = data0[sourcePosition];
   28173               data[dataPosition++] = data1[sourcePosition];
   28174               data[dataPosition++] = data2[sourcePosition];
   28175               sourcePosition++;
   28176             }
   28177             dataPosition += rowFeed;
   28178           }
   28179           break;
   28180         case 4:
   28181           data0 = tileCompoments[0].items;
   28182           data1 = tileCompoments[1].items;
   28183           data2 = tileCompoments[2].items;
   28184           data3 = tileCompoments[3].items;
   28185 
   28186           dataPosition = (width * tileTop + tileLeft) * 4;
   28187           rowFeed = (width - tileWidth) * 4;
   28188           sourcePosition = 0;
   28189           for (var j = 0; j < tileHeight; j++) {
   28190             for (var i = 0; i < tileWidth; i++) {
   28191               data[dataPosition++] = data0[sourcePosition];
   28192               data[dataPosition++] = data1[sourcePosition];
   28193               data[dataPosition++] = data2[sourcePosition];
   28194               data[dataPosition++] = data3[sourcePosition];
   28195               sourcePosition++;
   28196             }
   28197             dataPosition += rowFeed;
   28198           }
   28199           break;
   28200       }
   28201     }
   28202 
   28203     this.buffer = data;
   28204     this.bufferLength = data.length;
   28205   };
   28206   JpxStream.prototype.getChar = function JpxStream_getChar() {
   28207     error('internal error: getChar is not valid on JpxStream');
   28208   };
   28209 
   28210   return JpxStream;
   28211 })();
   28212 
   28213 var DecryptStream = (function DecryptStreamClosure() {
   28214   function DecryptStream(str, decrypt) {
   28215     this.str = str;
   28216     this.dict = str.dict;
   28217     this.decrypt = decrypt;
   28218 
   28219     DecodeStream.call(this);
   28220   }
   28221 
   28222   var chunkSize = 512;
   28223 
   28224   DecryptStream.prototype = Object.create(DecodeStream.prototype);
   28225 
   28226   DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
   28227     var chunk = this.str.getBytes(chunkSize);
   28228     if (!chunk || chunk.length == 0) {
   28229       this.eof = true;
   28230       return;
   28231     }
   28232     var decrypt = this.decrypt;
   28233     chunk = decrypt(chunk);
   28234 
   28235     var bufferLength = this.bufferLength;
   28236     var i, n = chunk.length;
   28237     var buffer = this.ensureBuffer(bufferLength + n);
   28238     for (i = 0; i < n; i++)
   28239       buffer[bufferLength++] = chunk[i];
   28240     this.bufferLength = bufferLength;
   28241   };
   28242 
   28243   return DecryptStream;
   28244 })();
   28245 
   28246 var Ascii85Stream = (function Ascii85StreamClosure() {
   28247   function Ascii85Stream(str) {
   28248     this.str = str;
   28249     this.dict = str.dict;
   28250     this.input = new Uint8Array(5);
   28251 
   28252     DecodeStream.call(this);
   28253   }
   28254 
   28255   Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
   28256 
   28257   Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
   28258     var tildaCode = '~'.charCodeAt(0);
   28259     var zCode = 'z'.charCodeAt(0);
   28260     var str = this.str;
   28261 
   28262     var c = str.getByte();
   28263     while (Lexer.isSpace(String.fromCharCode(c)))
   28264       c = str.getByte();
   28265 
   28266     if (!c || c === tildaCode) {
   28267       this.eof = true;
   28268       return;
   28269     }
   28270 
   28271     var bufferLength = this.bufferLength, buffer;
   28272 
   28273     // special code for z
   28274     if (c == zCode) {
   28275       buffer = this.ensureBuffer(bufferLength + 4);
   28276       for (var i = 0; i < 4; ++i)
   28277         buffer[bufferLength + i] = 0;
   28278       this.bufferLength += 4;
   28279     } else {
   28280       var input = this.input;
   28281       input[0] = c;
   28282       for (var i = 1; i < 5; ++i) {
   28283         c = str.getByte();
   28284         while (Lexer.isSpace(String.fromCharCode(c)))
   28285           c = str.getByte();
   28286 
   28287         input[i] = c;
   28288 
   28289         if (!c || c == tildaCode)
   28290           break;
   28291       }
   28292       buffer = this.ensureBuffer(bufferLength + i - 1);
   28293       this.bufferLength += i - 1;
   28294 
   28295       // partial ending;
   28296       if (i < 5) {
   28297         for (; i < 5; ++i)
   28298           input[i] = 0x21 + 84;
   28299         this.eof = true;
   28300       }
   28301       var t = 0;
   28302       for (var i = 0; i < 5; ++i)
   28303         t = t * 85 + (input[i] - 0x21);
   28304 
   28305       for (var i = 3; i >= 0; --i) {
   28306         buffer[bufferLength + i] = t & 0xFF;
   28307         t >>= 8;
   28308       }
   28309     }
   28310   };
   28311 
   28312   return Ascii85Stream;
   28313 })();
   28314 
   28315 var AsciiHexStream = (function AsciiHexStreamClosure() {
   28316   function AsciiHexStream(str) {
   28317     this.str = str;
   28318     this.dict = str.dict;
   28319 
   28320     DecodeStream.call(this);
   28321   }
   28322 
   28323   var hexvalueMap = {
   28324       9: -1, // \t
   28325       32: -1, // space
   28326       48: 0,
   28327       49: 1,
   28328       50: 2,
   28329       51: 3,
   28330       52: 4,
   28331       53: 5,
   28332       54: 6,
   28333       55: 7,
   28334       56: 8,
   28335       57: 9,
   28336       65: 10,
   28337       66: 11,
   28338       67: 12,
   28339       68: 13,
   28340       69: 14,
   28341       70: 15,
   28342       97: 10,
   28343       98: 11,
   28344       99: 12,
   28345       100: 13,
   28346       101: 14,
   28347       102: 15
   28348   };
   28349 
   28350   AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
   28351 
   28352   AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
   28353     var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n,
   28354         decodeLength, buffer, bufferLength, i, length;
   28355 
   28356     decodeLength = (bytes.length + 1) >> 1;
   28357     buffer = this.ensureBuffer(this.bufferLength + decodeLength);
   28358     bufferLength = this.bufferLength;
   28359 
   28360     for (i = 0, length = bytes.length; i < length; i++) {
   28361       c = hexvalueMap[bytes[i]];
   28362       while (c == -1 && (i + 1) < length) {
   28363         c = hexvalueMap[bytes[++i]];
   28364       }
   28365 
   28366       if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
   28367         n = hexvalueMap[bytes[++i]];
   28368         buffer[bufferLength++] = c * 16 + n;
   28369       } else {
   28370         // EOD marker at an odd number, behave as if a 0 followed the last
   28371         // digit.
   28372         if (bytes[i] !== gtCode) {
   28373           buffer[bufferLength++] = c * 16;
   28374         }
   28375       }
   28376     }
   28377 
   28378     this.bufferLength = bufferLength;
   28379     this.eof = true;
   28380   };
   28381 
   28382   return AsciiHexStream;
   28383 })();
   28384 
   28385 var RunLengthStream = (function RunLengthStreamClosure() {
   28386   function RunLengthStream(str) {
   28387     this.str = str;
   28388     this.dict = str.dict;
   28389 
   28390     DecodeStream.call(this);
   28391   }
   28392 
   28393   RunLengthStream.prototype = Object.create(DecodeStream.prototype);
   28394 
   28395   RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
   28396     // The repeatHeader has following format. The first byte defines type of run
   28397     // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
   28398     // (in addition to the second byte from the header), n = 129 through 255 -
   28399     // duplicate the second byte from the header (257 - n) times, n = 128 - end.
   28400     var repeatHeader = this.str.getBytes(2);
   28401     if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] == 128) {
   28402       this.eof = true;
   28403       return;
   28404     }
   28405 
   28406     var bufferLength = this.bufferLength;
   28407     var n = repeatHeader[0];
   28408     if (n < 128) {
   28409       // copy n bytes
   28410       var buffer = this.ensureBuffer(bufferLength + n + 1);
   28411       buffer[bufferLength++] = repeatHeader[1];
   28412       if (n > 0) {
   28413         var source = this.str.getBytes(n);
   28414         buffer.set(source, bufferLength);
   28415         bufferLength += n;
   28416       }
   28417     } else {
   28418       n = 257 - n;
   28419       var b = repeatHeader[1];
   28420       var buffer = this.ensureBuffer(bufferLength + n + 1);
   28421       for (var i = 0; i < n; i++)
   28422         buffer[bufferLength++] = b;
   28423     }
   28424     this.bufferLength = bufferLength;
   28425   };
   28426 
   28427   return RunLengthStream;
   28428 })();
   28429 
   28430 var CCITTFaxStream = (function CCITTFaxStreamClosure() {
   28431 
   28432   var ccittEOL = -2;
   28433   var twoDimPass = 0;
   28434   var twoDimHoriz = 1;
   28435   var twoDimVert0 = 2;
   28436   var twoDimVertR1 = 3;
   28437   var twoDimVertL1 = 4;
   28438   var twoDimVertR2 = 5;
   28439   var twoDimVertL2 = 6;
   28440   var twoDimVertR3 = 7;
   28441   var twoDimVertL3 = 8;
   28442 
   28443   var twoDimTable = [
   28444     [-1, -1], [-1, -1],                   // 000000x
   28445     [7, twoDimVertL3],                    // 0000010
   28446     [7, twoDimVertR3],                    // 0000011
   28447     [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
   28448     [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
   28449     [4, twoDimPass], [4, twoDimPass],     // 0001xxx
   28450     [4, twoDimPass], [4, twoDimPass],
   28451     [4, twoDimPass], [4, twoDimPass],
   28452     [4, twoDimPass], [4, twoDimPass],
   28453     [3, twoDimHoriz], [3, twoDimHoriz],   // 001xxxx
   28454     [3, twoDimHoriz], [3, twoDimHoriz],
   28455     [3, twoDimHoriz], [3, twoDimHoriz],
   28456     [3, twoDimHoriz], [3, twoDimHoriz],
   28457     [3, twoDimHoriz], [3, twoDimHoriz],
   28458     [3, twoDimHoriz], [3, twoDimHoriz],
   28459     [3, twoDimHoriz], [3, twoDimHoriz],
   28460     [3, twoDimHoriz], [3, twoDimHoriz],
   28461     [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
   28462     [3, twoDimVertL1], [3, twoDimVertL1],
   28463     [3, twoDimVertL1], [3, twoDimVertL1],
   28464     [3, twoDimVertL1], [3, twoDimVertL1],
   28465     [3, twoDimVertL1], [3, twoDimVertL1],
   28466     [3, twoDimVertL1], [3, twoDimVertL1],
   28467     [3, twoDimVertL1], [3, twoDimVertL1],
   28468     [3, twoDimVertL1], [3, twoDimVertL1],
   28469     [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
   28470     [3, twoDimVertR1], [3, twoDimVertR1],
   28471     [3, twoDimVertR1], [3, twoDimVertR1],
   28472     [3, twoDimVertR1], [3, twoDimVertR1],
   28473     [3, twoDimVertR1], [3, twoDimVertR1],
   28474     [3, twoDimVertR1], [3, twoDimVertR1],
   28475     [3, twoDimVertR1], [3, twoDimVertR1],
   28476     [3, twoDimVertR1], [3, twoDimVertR1],
   28477     [1, twoDimVert0], [1, twoDimVert0],   // 1xxxxxx
   28478     [1, twoDimVert0], [1, twoDimVert0],
   28479     [1, twoDimVert0], [1, twoDimVert0],
   28480     [1, twoDimVert0], [1, twoDimVert0],
   28481     [1, twoDimVert0], [1, twoDimVert0],
   28482     [1, twoDimVert0], [1, twoDimVert0],
   28483     [1, twoDimVert0], [1, twoDimVert0],
   28484     [1, twoDimVert0], [1, twoDimVert0],
   28485     [1, twoDimVert0], [1, twoDimVert0],
   28486     [1, twoDimVert0], [1, twoDimVert0],
   28487     [1, twoDimVert0], [1, twoDimVert0],
   28488     [1, twoDimVert0], [1, twoDimVert0],
   28489     [1, twoDimVert0], [1, twoDimVert0],
   28490     [1, twoDimVert0], [1, twoDimVert0],
   28491     [1, twoDimVert0], [1, twoDimVert0],
   28492     [1, twoDimVert0], [1, twoDimVert0],
   28493     [1, twoDimVert0], [1, twoDimVert0],
   28494     [1, twoDimVert0], [1, twoDimVert0],
   28495     [1, twoDimVert0], [1, twoDimVert0],
   28496     [1, twoDimVert0], [1, twoDimVert0],
   28497     [1, twoDimVert0], [1, twoDimVert0],
   28498     [1, twoDimVert0], [1, twoDimVert0],
   28499     [1, twoDimVert0], [1, twoDimVert0],
   28500     [1, twoDimVert0], [1, twoDimVert0],
   28501     [1, twoDimVert0], [1, twoDimVert0],
   28502     [1, twoDimVert0], [1, twoDimVert0],
   28503     [1, twoDimVert0], [1, twoDimVert0],
   28504     [1, twoDimVert0], [1, twoDimVert0],
   28505     [1, twoDimVert0], [1, twoDimVert0],
   28506     [1, twoDimVert0], [1, twoDimVert0],
   28507     [1, twoDimVert0], [1, twoDimVert0],
   28508     [1, twoDimVert0], [1, twoDimVert0]
   28509   ];
   28510 
   28511   var whiteTable1 = [
   28512     [-1, -1],                               // 00000
   28513     [12, ccittEOL],                         // 00001
   28514     [-1, -1], [-1, -1],                     // 0001x
   28515     [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
   28516     [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
   28517     [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
   28518     [11, 1792], [11, 1792],                 // 1000x
   28519     [12, 1984],                             // 10010
   28520     [12, 2048],                             // 10011
   28521     [12, 2112],                             // 10100
   28522     [12, 2176],                             // 10101
   28523     [12, 2240],                             // 10110
   28524     [12, 2304],                             // 10111
   28525     [11, 1856], [11, 1856],                 // 1100x
   28526     [11, 1920], [11, 1920],                 // 1101x
   28527     [12, 2368],                             // 11100
   28528     [12, 2432],                             // 11101
   28529     [12, 2496],                             // 11110
   28530     [12, 2560]                              // 11111
   28531   ];
   28532 
   28533   var whiteTable2 = [
   28534     [-1, -1], [-1, -1], [-1, -1], [-1, -1],     // 0000000xx
   28535     [8, 29], [8, 29],                           // 00000010x
   28536     [8, 30], [8, 30],                           // 00000011x
   28537     [8, 45], [8, 45],                           // 00000100x
   28538     [8, 46], [8, 46],                           // 00000101x
   28539     [7, 22], [7, 22], [7, 22], [7, 22],         // 0000011xx
   28540     [7, 23], [7, 23], [7, 23], [7, 23],         // 0000100xx
   28541     [8, 47], [8, 47],                           // 00001010x
   28542     [8, 48], [8, 48],                           // 00001011x
   28543     [6, 13], [6, 13], [6, 13], [6, 13],         // 000011xxx
   28544     [6, 13], [6, 13], [6, 13], [6, 13],
   28545     [7, 20], [7, 20], [7, 20], [7, 20],         // 0001000xx
   28546     [8, 33], [8, 33],                           // 00010010x
   28547     [8, 34], [8, 34],                           // 00010011x
   28548     [8, 35], [8, 35],                           // 00010100x
   28549     [8, 36], [8, 36],                           // 00010101x
   28550     [8, 37], [8, 37],                           // 00010110x
   28551     [8, 38], [8, 38],                           // 00010111x
   28552     [7, 19], [7, 19], [7, 19], [7, 19],         // 0001100xx
   28553     [8, 31], [8, 31],                           // 00011010x
   28554     [8, 32], [8, 32],                           // 00011011x
   28555     [6, 1], [6, 1], [6, 1], [6, 1],             // 000111xxx
   28556     [6, 1], [6, 1], [6, 1], [6, 1],
   28557     [6, 12], [6, 12], [6, 12], [6, 12],         // 001000xxx
   28558     [6, 12], [6, 12], [6, 12], [6, 12],
   28559     [8, 53], [8, 53],                           // 00100100x
   28560     [8, 54], [8, 54],                           // 00100101x
   28561     [7, 26], [7, 26], [7, 26], [7, 26],         // 0010011xx
   28562     [8, 39], [8, 39],                           // 00101000x
   28563     [8, 40], [8, 40],                           // 00101001x
   28564     [8, 41], [8, 41],                           // 00101010x
   28565     [8, 42], [8, 42],                           // 00101011x
   28566     [8, 43], [8, 43],                           // 00101100x
   28567     [8, 44], [8, 44],                           // 00101101x
   28568     [7, 21], [7, 21], [7, 21], [7, 21],         // 0010111xx
   28569     [7, 28], [7, 28], [7, 28], [7, 28],         // 0011000xx
   28570     [8, 61], [8, 61],                           // 00110010x
   28571     [8, 62], [8, 62],                           // 00110011x
   28572     [8, 63], [8, 63],                           // 00110100x
   28573     [8, 0], [8, 0],                             // 00110101x
   28574     [8, 320], [8, 320],                         // 00110110x
   28575     [8, 384], [8, 384],                         // 00110111x
   28576     [5, 10], [5, 10], [5, 10], [5, 10],         // 00111xxxx
   28577     [5, 10], [5, 10], [5, 10], [5, 10],
   28578     [5, 10], [5, 10], [5, 10], [5, 10],
   28579     [5, 10], [5, 10], [5, 10], [5, 10],
   28580     [5, 11], [5, 11], [5, 11], [5, 11],         // 01000xxxx
   28581     [5, 11], [5, 11], [5, 11], [5, 11],
   28582     [5, 11], [5, 11], [5, 11], [5, 11],
   28583     [5, 11], [5, 11], [5, 11], [5, 11],
   28584     [7, 27], [7, 27], [7, 27], [7, 27],         // 0100100xx
   28585     [8, 59], [8, 59],                           // 01001010x
   28586     [8, 60], [8, 60],                           // 01001011x
   28587     [9, 1472],                                  // 010011000
   28588     [9, 1536],                                  // 010011001
   28589     [9, 1600],                                  // 010011010
   28590     [9, 1728],                                  // 010011011
   28591     [7, 18], [7, 18], [7, 18], [7, 18],         // 0100111xx
   28592     [7, 24], [7, 24], [7, 24], [7, 24],         // 0101000xx
   28593     [8, 49], [8, 49],                           // 01010010x
   28594     [8, 50], [8, 50],                           // 01010011x
   28595     [8, 51], [8, 51],                           // 01010100x
   28596     [8, 52], [8, 52],                           // 01010101x
   28597     [7, 25], [7, 25], [7, 25], [7, 25],         // 0101011xx
   28598     [8, 55], [8, 55],                           // 01011000x
   28599     [8, 56], [8, 56],                           // 01011001x
   28600     [8, 57], [8, 57],                           // 01011010x
   28601     [8, 58], [8, 58],                           // 01011011x
   28602     [6, 192], [6, 192], [6, 192], [6, 192],     // 010111xxx
   28603     [6, 192], [6, 192], [6, 192], [6, 192],
   28604     [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
   28605     [6, 1664], [6, 1664], [6, 1664], [6, 1664],
   28606     [8, 448], [8, 448],                         // 01100100x
   28607     [8, 512], [8, 512],                         // 01100101x
   28608     [9, 704],                                   // 011001100
   28609     [9, 768],                                   // 011001101
   28610     [8, 640], [8, 640],                         // 01100111x
   28611     [8, 576], [8, 576],                         // 01101000x
   28612     [9, 832],                                   // 011010010
   28613     [9, 896],                                   // 011010011
   28614     [9, 960],                                   // 011010100
   28615     [9, 1024],                                  // 011010101
   28616     [9, 1088],                                  // 011010110
   28617     [9, 1152],                                  // 011010111
   28618     [9, 1216],                                  // 011011000
   28619     [9, 1280],                                  // 011011001
   28620     [9, 1344],                                  // 011011010
   28621     [9, 1408],                                  // 011011011
   28622     [7, 256], [7, 256], [7, 256], [7, 256],     // 0110111xx
   28623     [4, 2], [4, 2], [4, 2], [4, 2],             // 0111xxxxx
   28624     [4, 2], [4, 2], [4, 2], [4, 2],
   28625     [4, 2], [4, 2], [4, 2], [4, 2],
   28626     [4, 2], [4, 2], [4, 2], [4, 2],
   28627     [4, 2], [4, 2], [4, 2], [4, 2],
   28628     [4, 2], [4, 2], [4, 2], [4, 2],
   28629     [4, 2], [4, 2], [4, 2], [4, 2],
   28630     [4, 2], [4, 2], [4, 2], [4, 2],
   28631     [4, 3], [4, 3], [4, 3], [4, 3],             // 1000xxxxx
   28632     [4, 3], [4, 3], [4, 3], [4, 3],
   28633     [4, 3], [4, 3], [4, 3], [4, 3],
   28634     [4, 3], [4, 3], [4, 3], [4, 3],
   28635     [4, 3], [4, 3], [4, 3], [4, 3],
   28636     [4, 3], [4, 3], [4, 3], [4, 3],
   28637     [4, 3], [4, 3], [4, 3], [4, 3],
   28638     [4, 3], [4, 3], [4, 3], [4, 3],
   28639     [5, 128], [5, 128], [5, 128], [5, 128],     // 10010xxxx
   28640     [5, 128], [5, 128], [5, 128], [5, 128],
   28641     [5, 128], [5, 128], [5, 128], [5, 128],
   28642     [5, 128], [5, 128], [5, 128], [5, 128],
   28643     [5, 8], [5, 8], [5, 8], [5, 8],             // 10011xxxx
   28644     [5, 8], [5, 8], [5, 8], [5, 8],
   28645     [5, 8], [5, 8], [5, 8], [5, 8],
   28646     [5, 8], [5, 8], [5, 8], [5, 8],
   28647     [5, 9], [5, 9], [5, 9], [5, 9],             // 10100xxxx
   28648     [5, 9], [5, 9], [5, 9], [5, 9],
   28649     [5, 9], [5, 9], [5, 9], [5, 9],
   28650     [5, 9], [5, 9], [5, 9], [5, 9],
   28651     [6, 16], [6, 16], [6, 16], [6, 16],         // 101010xxx
   28652     [6, 16], [6, 16], [6, 16], [6, 16],
   28653     [6, 17], [6, 17], [6, 17], [6, 17],         // 101011xxx
   28654     [6, 17], [6, 17], [6, 17], [6, 17],
   28655     [4, 4], [4, 4], [4, 4], [4, 4],             // 1011xxxxx
   28656     [4, 4], [4, 4], [4, 4], [4, 4],
   28657     [4, 4], [4, 4], [4, 4], [4, 4],
   28658     [4, 4], [4, 4], [4, 4], [4, 4],
   28659     [4, 4], [4, 4], [4, 4], [4, 4],
   28660     [4, 4], [4, 4], [4, 4], [4, 4],
   28661     [4, 4], [4, 4], [4, 4], [4, 4],
   28662     [4, 4], [4, 4], [4, 4], [4, 4],
   28663     [4, 5], [4, 5], [4, 5], [4, 5],             // 1100xxxxx
   28664     [4, 5], [4, 5], [4, 5], [4, 5],
   28665     [4, 5], [4, 5], [4, 5], [4, 5],
   28666     [4, 5], [4, 5], [4, 5], [4, 5],
   28667     [4, 5], [4, 5], [4, 5], [4, 5],
   28668     [4, 5], [4, 5], [4, 5], [4, 5],
   28669     [4, 5], [4, 5], [4, 5], [4, 5],
   28670     [4, 5], [4, 5], [4, 5], [4, 5],
   28671     [6, 14], [6, 14], [6, 14], [6, 14],         // 110100xxx
   28672     [6, 14], [6, 14], [6, 14], [6, 14],
   28673     [6, 15], [6, 15], [6, 15], [6, 15],         // 110101xxx
   28674     [6, 15], [6, 15], [6, 15], [6, 15],
   28675     [5, 64], [5, 64], [5, 64], [5, 64],         // 11011xxxx
   28676     [5, 64], [5, 64], [5, 64], [5, 64],
   28677     [5, 64], [5, 64], [5, 64], [5, 64],
   28678     [5, 64], [5, 64], [5, 64], [5, 64],
   28679     [4, 6], [4, 6], [4, 6], [4, 6],             // 1110xxxxx
   28680     [4, 6], [4, 6], [4, 6], [4, 6],
   28681     [4, 6], [4, 6], [4, 6], [4, 6],
   28682     [4, 6], [4, 6], [4, 6], [4, 6],
   28683     [4, 6], [4, 6], [4, 6], [4, 6],
   28684     [4, 6], [4, 6], [4, 6], [4, 6],
   28685     [4, 6], [4, 6], [4, 6], [4, 6],
   28686     [4, 6], [4, 6], [4, 6], [4, 6],
   28687     [4, 7], [4, 7], [4, 7], [4, 7],             // 1111xxxxx
   28688     [4, 7], [4, 7], [4, 7], [4, 7],
   28689     [4, 7], [4, 7], [4, 7], [4, 7],
   28690     [4, 7], [4, 7], [4, 7], [4, 7],
   28691     [4, 7], [4, 7], [4, 7], [4, 7],
   28692     [4, 7], [4, 7], [4, 7], [4, 7],
   28693     [4, 7], [4, 7], [4, 7], [4, 7],
   28694     [4, 7], [4, 7], [4, 7], [4, 7]
   28695   ];
   28696 
   28697   var blackTable1 = [
   28698     [-1, -1], [-1, -1],                             // 000000000000x
   28699     [12, ccittEOL], [12, ccittEOL],                 // 000000000001x
   28700     [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000001xx
   28701     [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000010xx
   28702     [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000011xx
   28703     [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000100xx
   28704     [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000101xx
   28705     [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000110xx
   28706     [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000111xx
   28707     [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
   28708     [12, 1984], [12, 1984],                         // 000000010010x
   28709     [12, 2048], [12, 2048],                         // 000000010011x
   28710     [12, 2112], [12, 2112],                         // 000000010100x
   28711     [12, 2176], [12, 2176],                         // 000000010101x
   28712     [12, 2240], [12, 2240],                         // 000000010110x
   28713     [12, 2304], [12, 2304],                         // 000000010111x
   28714     [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
   28715     [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
   28716     [12, 2368], [12, 2368],                         // 000000011100x
   28717     [12, 2432], [12, 2432],                         // 000000011101x
   28718     [12, 2496], [12, 2496],                         // 000000011110x
   28719     [12, 2560], [12, 2560],                         // 000000011111x
   28720     [10, 18], [10, 18], [10, 18], [10, 18],         // 0000001000xxx
   28721     [10, 18], [10, 18], [10, 18], [10, 18],
   28722     [12, 52], [12, 52],                             // 000000100100x
   28723     [13, 640],                                      // 0000001001010
   28724     [13, 704],                                      // 0000001001011
   28725     [13, 768],                                      // 0000001001100
   28726     [13, 832],                                      // 0000001001101
   28727     [12, 55], [12, 55],                             // 000000100111x
   28728     [12, 56], [12, 56],                             // 000000101000x
   28729     [13, 1280],                                     // 0000001010010
   28730     [13, 1344],                                     // 0000001010011
   28731     [13, 1408],                                     // 0000001010100
   28732     [13, 1472],                                     // 0000001010101
   28733     [12, 59], [12, 59],                             // 000000101011x
   28734     [12, 60], [12, 60],                             // 000000101100x
   28735     [13, 1536],                                     // 0000001011010
   28736     [13, 1600],                                     // 0000001011011
   28737     [11, 24], [11, 24], [11, 24], [11, 24],         // 00000010111xx
   28738     [11, 25], [11, 25], [11, 25], [11, 25],         // 00000011000xx
   28739     [13, 1664],                                     // 0000001100100
   28740     [13, 1728],                                     // 0000001100101
   28741     [12, 320], [12, 320],                           // 000000110011x
   28742     [12, 384], [12, 384],                           // 000000110100x
   28743     [12, 448], [12, 448],                           // 000000110101x
   28744     [13, 512],                                      // 0000001101100
   28745     [13, 576],                                      // 0000001101101
   28746     [12, 53], [12, 53],                             // 000000110111x
   28747     [12, 54], [12, 54],                             // 000000111000x
   28748     [13, 896],                                      // 0000001110010
   28749     [13, 960],                                      // 0000001110011
   28750     [13, 1024],                                     // 0000001110100
   28751     [13, 1088],                                     // 0000001110101
   28752     [13, 1152],                                     // 0000001110110
   28753     [13, 1216],                                     // 0000001110111
   28754     [10, 64], [10, 64], [10, 64], [10, 64],         // 0000001111xxx
   28755     [10, 64], [10, 64], [10, 64], [10, 64]
   28756   ];
   28757 
   28758   var blackTable2 = [
   28759     [8, 13], [8, 13], [8, 13], [8, 13],     // 00000100xxxx
   28760     [8, 13], [8, 13], [8, 13], [8, 13],
   28761     [8, 13], [8, 13], [8, 13], [8, 13],
   28762     [8, 13], [8, 13], [8, 13], [8, 13],
   28763     [11, 23], [11, 23],                     // 00000101000x
   28764     [12, 50],                               // 000001010010
   28765     [12, 51],                               // 000001010011
   28766     [12, 44],                               // 000001010100
   28767     [12, 45],                               // 000001010101
   28768     [12, 46],                               // 000001010110
   28769     [12, 47],                               // 000001010111
   28770     [12, 57],                               // 000001011000
   28771     [12, 58],                               // 000001011001
   28772     [12, 61],                               // 000001011010
   28773     [12, 256],                              // 000001011011
   28774     [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
   28775     [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
   28776     [12, 48],                               // 000001100100
   28777     [12, 49],                               // 000001100101
   28778     [12, 62],                               // 000001100110
   28779     [12, 63],                               // 000001100111
   28780     [12, 30],                               // 000001101000
   28781     [12, 31],                               // 000001101001
   28782     [12, 32],                               // 000001101010
   28783     [12, 33],                               // 000001101011
   28784     [12, 40],                               // 000001101100
   28785     [12, 41],                               // 000001101101
   28786     [11, 22], [11, 22],                     // 00000110111x
   28787     [8, 14], [8, 14], [8, 14], [8, 14],     // 00000111xxxx
   28788     [8, 14], [8, 14], [8, 14], [8, 14],
   28789     [8, 14], [8, 14], [8, 14], [8, 14],
   28790     [8, 14], [8, 14], [8, 14], [8, 14],
   28791     [7, 10], [7, 10], [7, 10], [7, 10],     // 0000100xxxxx
   28792     [7, 10], [7, 10], [7, 10], [7, 10],
   28793     [7, 10], [7, 10], [7, 10], [7, 10],
   28794     [7, 10], [7, 10], [7, 10], [7, 10],
   28795     [7, 10], [7, 10], [7, 10], [7, 10],
   28796     [7, 10], [7, 10], [7, 10], [7, 10],
   28797     [7, 10], [7, 10], [7, 10], [7, 10],
   28798     [7, 10], [7, 10], [7, 10], [7, 10],
   28799     [7, 11], [7, 11], [7, 11], [7, 11],     // 0000101xxxxx
   28800     [7, 11], [7, 11], [7, 11], [7, 11],
   28801     [7, 11], [7, 11], [7, 11], [7, 11],
   28802     [7, 11], [7, 11], [7, 11], [7, 11],
   28803     [7, 11], [7, 11], [7, 11], [7, 11],
   28804     [7, 11], [7, 11], [7, 11], [7, 11],
   28805     [7, 11], [7, 11], [7, 11], [7, 11],
   28806     [7, 11], [7, 11], [7, 11], [7, 11],
   28807     [9, 15], [9, 15], [9, 15], [9, 15],     // 000011000xxx
   28808     [9, 15], [9, 15], [9, 15], [9, 15],
   28809     [12, 128],                              // 000011001000
   28810     [12, 192],                              // 000011001001
   28811     [12, 26],                               // 000011001010
   28812     [12, 27],                               // 000011001011
   28813     [12, 28],                               // 000011001100
   28814     [12, 29],                               // 000011001101
   28815     [11, 19], [11, 19],                     // 00001100111x
   28816     [11, 20], [11, 20],                     // 00001101000x
   28817     [12, 34],                               // 000011010010
   28818     [12, 35],                               // 000011010011
   28819     [12, 36],                               // 000011010100
   28820     [12, 37],                               // 000011010101
   28821     [12, 38],                               // 000011010110
   28822     [12, 39],                               // 000011010111
   28823     [11, 21], [11, 21],                     // 00001101100x
   28824     [12, 42],                               // 000011011010
   28825     [12, 43],                               // 000011011011
   28826     [10, 0], [10, 0], [10, 0], [10, 0],     // 0000110111xx
   28827     [7, 12], [7, 12], [7, 12], [7, 12],     // 0000111xxxxx
   28828     [7, 12], [7, 12], [7, 12], [7, 12],
   28829     [7, 12], [7, 12], [7, 12], [7, 12],
   28830     [7, 12], [7, 12], [7, 12], [7, 12],
   28831     [7, 12], [7, 12], [7, 12], [7, 12],
   28832     [7, 12], [7, 12], [7, 12], [7, 12],
   28833     [7, 12], [7, 12], [7, 12], [7, 12],
   28834     [7, 12], [7, 12], [7, 12], [7, 12]
   28835   ];
   28836 
   28837   var blackTable3 = [
   28838     [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
   28839     [6, 9],                                 // 000100
   28840     [6, 8],                                 // 000101
   28841     [5, 7], [5, 7],                         // 00011x
   28842     [4, 6], [4, 6], [4, 6], [4, 6],         // 0010xx
   28843     [4, 5], [4, 5], [4, 5], [4, 5],         // 0011xx
   28844     [3, 1], [3, 1], [3, 1], [3, 1],         // 010xxx
   28845     [3, 1], [3, 1], [3, 1], [3, 1],
   28846     [3, 4], [3, 4], [3, 4], [3, 4],         // 011xxx
   28847     [3, 4], [3, 4], [3, 4], [3, 4],
   28848     [2, 3], [2, 3], [2, 3], [2, 3],         // 10xxxx
   28849     [2, 3], [2, 3], [2, 3], [2, 3],
   28850     [2, 3], [2, 3], [2, 3], [2, 3],
   28851     [2, 3], [2, 3], [2, 3], [2, 3],
   28852     [2, 2], [2, 2], [2, 2], [2, 2],         // 11xxxx
   28853     [2, 2], [2, 2], [2, 2], [2, 2],
   28854     [2, 2], [2, 2], [2, 2], [2, 2],
   28855     [2, 2], [2, 2], [2, 2], [2, 2]
   28856   ];
   28857 
   28858   function CCITTFaxStream(str, params) {
   28859     this.str = str;
   28860     this.dict = str.dict;
   28861 
   28862     params = params || new Dict();
   28863 
   28864     this.encoding = params.get('K') || 0;
   28865     this.eoline = params.get('EndOfLine') || false;
   28866     this.byteAlign = params.get('EncodedByteAlign') || false;
   28867     this.columns = params.get('Columns') || 1728;
   28868     this.rows = params.get('Rows') || 0;
   28869     var eoblock = params.get('EndOfBlock');
   28870     if (eoblock == null)
   28871       eoblock = true;
   28872     this.eoblock = eoblock;
   28873     this.black = params.get('BlackIs1') || false;
   28874 
   28875     this.codingLine = new Uint32Array(this.columns + 1);
   28876     this.refLine = new Uint32Array(this.columns + 2);
   28877 
   28878     this.codingLine[0] = this.columns;
   28879     this.codingPos = 0;
   28880 
   28881     this.row = 0;
   28882     this.nextLine2D = this.encoding < 0;
   28883     this.inputBits = 0;
   28884     this.inputBuf = 0;
   28885     this.outputBits = 0;
   28886     this.buf = EOF;
   28887 
   28888     var code1;
   28889     while ((code1 = this.lookBits(12)) == 0) {
   28890       this.eatBits(1);
   28891     }
   28892     if (code1 == 1) {
   28893       this.eatBits(12);
   28894     }
   28895     if (this.encoding > 0) {
   28896       this.nextLine2D = !this.lookBits(1);
   28897       this.eatBits(1);
   28898     }
   28899 
   28900     DecodeStream.call(this);
   28901   }
   28902 
   28903   CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
   28904 
   28905   CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
   28906     while (!this.eof) {
   28907       var c = this.lookChar();
   28908       this.buf = EOF;
   28909       this.ensureBuffer(this.bufferLength + 1);
   28910       this.buffer[this.bufferLength++] = c;
   28911     }
   28912   };
   28913 
   28914   CCITTFaxStream.prototype.addPixels =
   28915     function ccittFaxStreamAddPixels(a1, blackPixels) {
   28916     var codingLine = this.codingLine;
   28917     var codingPos = this.codingPos;
   28918 
   28919     if (a1 > codingLine[codingPos]) {
   28920       if (a1 > this.columns) {
   28921         warn('row is wrong length');
   28922         this.err = true;
   28923         a1 = this.columns;
   28924       }
   28925       if ((codingPos & 1) ^ blackPixels) {
   28926         ++codingPos;
   28927       }
   28928 
   28929       codingLine[codingPos] = a1;
   28930     }
   28931     this.codingPos = codingPos;
   28932   };
   28933 
   28934   CCITTFaxStream.prototype.addPixelsNeg =
   28935     function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
   28936     var codingLine = this.codingLine;
   28937     var codingPos = this.codingPos;
   28938 
   28939     if (a1 > codingLine[codingPos]) {
   28940       if (a1 > this.columns) {
   28941         warn('row is wrong length');
   28942         this.err = true;
   28943         a1 = this.columns;
   28944       }
   28945       if ((codingPos & 1) ^ blackPixels)
   28946         ++codingPos;
   28947 
   28948       codingLine[codingPos] = a1;
   28949     } else if (a1 < codingLine[codingPos]) {
   28950       if (a1 < 0) {
   28951         warn('invalid code');
   28952         this.err = true;
   28953         a1 = 0;
   28954       }
   28955       while (codingPos > 0 && a1 < codingLine[codingPos - 1])
   28956         --codingPos;
   28957       codingLine[codingPos] = a1;
   28958     }
   28959 
   28960     this.codingPos = codingPos;
   28961   };
   28962 
   28963   CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
   28964     if (this.buf != EOF)
   28965       return this.buf;
   28966 
   28967     var refLine = this.refLine;
   28968     var codingLine = this.codingLine;
   28969     var columns = this.columns;
   28970 
   28971     var refPos, blackPixels, bits;
   28972 
   28973     if (this.outputBits == 0) {
   28974       if (this.eof)
   28975         return null;
   28976 
   28977       this.err = false;
   28978 
   28979       var code1, code2, code3;
   28980       if (this.nextLine2D) {
   28981         for (var i = 0; codingLine[i] < columns; ++i)
   28982           refLine[i] = codingLine[i];
   28983 
   28984         refLine[i++] = columns;
   28985         refLine[i] = columns;
   28986         codingLine[0] = 0;
   28987         this.codingPos = 0;
   28988         refPos = 0;
   28989         blackPixels = 0;
   28990 
   28991         while (codingLine[this.codingPos] < columns) {
   28992           code1 = this.getTwoDimCode();
   28993           switch (code1) {
   28994             case twoDimPass:
   28995               this.addPixels(refLine[refPos + 1], blackPixels);
   28996               if (refLine[refPos + 1] < columns)
   28997                 refPos += 2;
   28998               break;
   28999             case twoDimHoriz:
   29000               code1 = code2 = 0;
   29001               if (blackPixels) {
   29002                 do {
   29003                   code1 += (code3 = this.getBlackCode());
   29004                 } while (code3 >= 64);
   29005                 do {
   29006                   code2 += (code3 = this.getWhiteCode());
   29007                 } while (code3 >= 64);
   29008               } else {
   29009                 do {
   29010                   code1 += (code3 = this.getWhiteCode());
   29011                 } while (code3 >= 64);
   29012                 do {
   29013                   code2 += (code3 = this.getBlackCode());
   29014                 } while (code3 >= 64);
   29015               }
   29016               this.addPixels(codingLine[this.codingPos] +
   29017                              code1, blackPixels);
   29018               if (codingLine[this.codingPos] < columns) {
   29019                 this.addPixels(codingLine[this.codingPos] + code2,
   29020                                blackPixels ^ 1);
   29021               }
   29022               while (refLine[refPos] <= codingLine[this.codingPos] &&
   29023                      refLine[refPos] < columns) {
   29024                 refPos += 2;
   29025               }
   29026               break;
   29027             case twoDimVertR3:
   29028               this.addPixels(refLine[refPos] + 3, blackPixels);
   29029               blackPixels ^= 1;
   29030               if (codingLine[this.codingPos] < columns) {
   29031                 ++refPos;
   29032                 while (refLine[refPos] <= codingLine[this.codingPos] &&
   29033                        refLine[refPos] < columns)
   29034                   refPos += 2;
   29035               }
   29036               break;
   29037             case twoDimVertR2:
   29038               this.addPixels(refLine[refPos] + 2, blackPixels);
   29039               blackPixels ^= 1;
   29040               if (codingLine[this.codingPos] < columns) {
   29041                 ++refPos;
   29042                 while (refLine[refPos] <= codingLine[this.codingPos] &&
   29043                        refLine[refPos] < columns) {
   29044                   refPos += 2;
   29045                 }
   29046               }
   29047               break;
   29048             case twoDimVertR1:
   29049               this.addPixels(refLine[refPos] + 1, blackPixels);
   29050               blackPixels ^= 1;
   29051               if (codingLine[this.codingPos] < columns) {
   29052                 ++refPos;
   29053                 while (refLine[refPos] <= codingLine[this.codingPos] &&
   29054                        refLine[refPos] < columns)
   29055                   refPos += 2;
   29056               }
   29057               break;
   29058             case twoDimVert0:
   29059               this.addPixels(refLine[refPos], blackPixels);
   29060               blackPixels ^= 1;
   29061               if (codingLine[this.codingPos] < columns) {
   29062                 ++refPos;
   29063                 while (refLine[refPos] <= codingLine[this.codingPos] &&
   29064                        refLine[refPos] < columns)
   29065                   refPos += 2;
   29066               }
   29067               break;
   29068             case twoDimVertL3:
   29069               this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
   29070               blackPixels ^= 1;
   29071               if (codingLine[this.codingPos] < columns) {
   29072                 if (refPos > 0)
   29073                   --refPos;
   29074                 else
   29075                   ++refPos;
   29076                 while (refLine[refPos] <= codingLine[this.codingPos] &&
   29077                        refLine[refPos] < columns)
   29078                   refPos += 2;
   29079               }
   29080               break;
   29081             case twoDimVertL2:
   29082               this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
   29083               blackPixels ^= 1;
   29084               if (codingLine[this.codingPos] < columns) {
   29085                 if (refPos > 0)
   29086                   --refPos;
   29087                 else
   29088                   ++refPos;
   29089                 while (refLine[refPos] <= codingLine[this.codingPos] &&
   29090                        refLine[refPos] < columns)
   29091                   refPos += 2;
   29092               }
   29093               break;
   29094             case twoDimVertL1:
   29095               this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
   29096               blackPixels ^= 1;
   29097               if (codingLine[this.codingPos] < columns) {
   29098                 if (refPos > 0)
   29099                   --refPos;
   29100                 else
   29101                   ++refPos;
   29102 
   29103                 while (refLine[refPos] <= codingLine[this.codingPos] &&
   29104                        refLine[refPos] < columns)
   29105                   refPos += 2;
   29106               }
   29107               break;
   29108             case EOF:
   29109               this.addPixels(columns, 0);
   29110               this.eof = true;
   29111               break;
   29112             default:
   29113               warn('bad 2d code');
   29114               this.addPixels(columns, 0);
   29115               this.err = true;
   29116           }
   29117         }
   29118       } else {
   29119         codingLine[0] = 0;
   29120         this.codingPos = 0;
   29121         blackPixels = 0;
   29122         while (codingLine[this.codingPos] < columns) {
   29123           code1 = 0;
   29124           if (blackPixels) {
   29125             do {
   29126               code1 += (code3 = this.getBlackCode());
   29127             } while (code3 >= 64);
   29128           } else {
   29129             do {
   29130               code1 += (code3 = this.getWhiteCode());
   29131             } while (code3 >= 64);
   29132           }
   29133           this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
   29134           blackPixels ^= 1;
   29135         }
   29136       }
   29137 
   29138       if (this.byteAlign)
   29139         this.inputBits &= ~7;
   29140 
   29141       var gotEOL = false;
   29142 
   29143       if (!this.eoblock && this.row == this.rows - 1) {
   29144         this.eof = true;
   29145       } else {
   29146         code1 = this.lookBits(12);
   29147         while (code1 == 0) {
   29148           this.eatBits(1);
   29149           code1 = this.lookBits(12);
   29150         }
   29151         if (code1 == 1) {
   29152           this.eatBits(12);
   29153           gotEOL = true;
   29154         } else if (code1 == EOF) {
   29155           this.eof = true;
   29156         }
   29157       }
   29158 
   29159       if (!this.eof && this.encoding > 0) {
   29160         this.nextLine2D = !this.lookBits(1);
   29161         this.eatBits(1);
   29162       }
   29163 
   29164       if (this.eoblock && gotEOL) {
   29165         code1 = this.lookBits(12);
   29166         if (code1 == 1) {
   29167           this.eatBits(12);
   29168           if (this.encoding > 0) {
   29169             this.lookBits(1);
   29170             this.eatBits(1);
   29171           }
   29172           if (this.encoding >= 0) {
   29173             for (var i = 0; i < 4; ++i) {
   29174               code1 = this.lookBits(12);
   29175               if (code1 != 1)
   29176                 warn('bad rtc code: ' + code1);
   29177               this.eatBits(12);
   29178               if (this.encoding > 0) {
   29179                 this.lookBits(1);
   29180                 this.eatBits(1);
   29181               }
   29182             }
   29183           }
   29184           this.eof = true;
   29185         }
   29186       } else if (this.err && this.eoline) {
   29187         while (true) {
   29188           code1 = this.lookBits(13);
   29189           if (code1 == EOF) {
   29190             this.eof = true;
   29191             return null;
   29192           }
   29193           if ((code1 >> 1) == 1) {
   29194             break;
   29195           }
   29196           this.eatBits(1);
   29197         }
   29198         this.eatBits(12);
   29199         if (this.encoding > 0) {
   29200           this.eatBits(1);
   29201           this.nextLine2D = !(code1 & 1);
   29202         }
   29203       }
   29204 
   29205       if (codingLine[0] > 0)
   29206         this.outputBits = codingLine[this.codingPos = 0];
   29207       else
   29208         this.outputBits = codingLine[this.codingPos = 1];
   29209       this.row++;
   29210     }
   29211 
   29212     if (this.outputBits >= 8) {
   29213       this.buf = (this.codingPos & 1) ? 0 : 0xFF;
   29214       this.outputBits -= 8;
   29215       if (this.outputBits == 0 && codingLine[this.codingPos] < columns) {
   29216         this.codingPos++;
   29217         this.outputBits = (codingLine[this.codingPos] -
   29218                            codingLine[this.codingPos - 1]);
   29219       }
   29220     } else {
   29221       var bits = 8;
   29222       this.buf = 0;
   29223       do {
   29224         if (this.outputBits > bits) {
   29225           this.buf <<= bits;
   29226           if (!(this.codingPos & 1)) {
   29227             this.buf |= 0xFF >> (8 - bits);
   29228           }
   29229           this.outputBits -= bits;
   29230           bits = 0;
   29231         } else {
   29232           this.buf <<= this.outputBits;
   29233           if (!(this.codingPos & 1)) {
   29234             this.buf |= 0xFF >> (8 - this.outputBits);
   29235           }
   29236           bits -= this.outputBits;
   29237           this.outputBits = 0;
   29238           if (codingLine[this.codingPos] < columns) {
   29239             this.codingPos++;
   29240             this.outputBits = (codingLine[this.codingPos] -
   29241                                codingLine[this.codingPos - 1]);
   29242           } else if (bits > 0) {
   29243             this.buf <<= bits;
   29244             bits = 0;
   29245           }
   29246         }
   29247       } while (bits);
   29248     }
   29249     if (this.black) {
   29250       this.buf ^= 0xFF;
   29251     }
   29252     return this.buf;
   29253   };
   29254 
   29255   // This functions returns the code found from the table.
   29256   // The start and end parameters set the boundaries for searching the table.
   29257   // The limit parameter is optional. Function returns an array with three
   29258   // values. The first array element indicates whether a valid code is being
   29259   // returned. The second array element is the actual code. The third array
   29260   // element indicates whether EOF was reached.
   29261   CCITTFaxStream.prototype.findTableCode =
   29262     function ccittFaxStreamFindTableCode(start, end, table, limit) {
   29263 
   29264     var limitValue = limit || 0;
   29265     for (var i = start; i <= end; ++i) {
   29266       var code = this.lookBits(i);
   29267       if (code == EOF)
   29268         return [true, 1, false];
   29269       if (i < end)
   29270         code <<= end - i;
   29271       if (!limitValue || code >= limitValue) {
   29272         var p = table[code - limitValue];
   29273         if (p[0] == i) {
   29274           this.eatBits(i);
   29275           return [true, p[1], true];
   29276         }
   29277       }
   29278     }
   29279     return [false, 0, false];
   29280   };
   29281 
   29282   CCITTFaxStream.prototype.getTwoDimCode =
   29283     function ccittFaxStreamGetTwoDimCode() {
   29284 
   29285     var code = 0;
   29286     var p;
   29287     if (this.eoblock) {
   29288       code = this.lookBits(7);
   29289       p = twoDimTable[code];
   29290       if (p && p[0] > 0) {
   29291         this.eatBits(p[0]);
   29292         return p[1];
   29293       }
   29294     } else {
   29295       var result = this.findTableCode(1, 7, twoDimTable);
   29296       if (result[0] && result[2])
   29297         return result[1];
   29298     }
   29299     warn('Bad two dim code');
   29300     return EOF;
   29301   };
   29302 
   29303   CCITTFaxStream.prototype.getWhiteCode =
   29304     function ccittFaxStreamGetWhiteCode() {
   29305 
   29306     var code = 0;
   29307     var p;
   29308     var n;
   29309     if (this.eoblock) {
   29310       code = this.lookBits(12);
   29311       if (code == EOF)
   29312         return 1;
   29313 
   29314       if ((code >> 5) == 0)
   29315         p = whiteTable1[code];
   29316       else
   29317         p = whiteTable2[code >> 3];
   29318 
   29319       if (p[0] > 0) {
   29320         this.eatBits(p[0]);
   29321         return p[1];
   29322       }
   29323     } else {
   29324       var result = this.findTableCode(1, 9, whiteTable2);
   29325       if (result[0])
   29326         return result[1];
   29327 
   29328       result = this.findTableCode(11, 12, whiteTable1);
   29329       if (result[0])
   29330         return result[1];
   29331     }
   29332     warn('bad white code');
   29333     this.eatBits(1);
   29334     return 1;
   29335   };
   29336 
   29337   CCITTFaxStream.prototype.getBlackCode =
   29338     function ccittFaxStreamGetBlackCode() {
   29339 
   29340     var code, p;
   29341     if (this.eoblock) {
   29342       code = this.lookBits(13);
   29343       if (code == EOF)
   29344         return 1;
   29345       if ((code >> 7) == 0)
   29346         p = blackTable1[code];
   29347       else if ((code >> 9) == 0 && (code >> 7) != 0)
   29348         p = blackTable2[(code >> 1) - 64];
   29349       else
   29350         p = blackTable3[code >> 7];
   29351 
   29352       if (p[0] > 0) {
   29353         this.eatBits(p[0]);
   29354         return p[1];
   29355       }
   29356     } else {
   29357       var result = this.findTableCode(2, 6, blackTable3);
   29358       if (result[0])
   29359         return result[1];
   29360 
   29361       result = this.findTableCode(7, 12, blackTable2, 64);
   29362       if (result[0])
   29363         return result[1];
   29364 
   29365       result = this.findTableCode(10, 13, blackTable1);
   29366       if (result[0])
   29367         return result[1];
   29368     }
   29369     warn('bad black code');
   29370     this.eatBits(1);
   29371     return 1;
   29372   };
   29373 
   29374   CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
   29375     var c;
   29376     while (this.inputBits < n) {
   29377       if ((c = this.str.getByte()) == null) {
   29378         if (this.inputBits == 0)
   29379           return EOF;
   29380         return ((this.inputBuf << (n - this.inputBits)) &
   29381                 (0xFFFF >> (16 - n)));
   29382       }
   29383       this.inputBuf = (this.inputBuf << 8) + c;
   29384       this.inputBits += 8;
   29385     }
   29386     return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
   29387   };
   29388 
   29389   CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
   29390     if ((this.inputBits -= n) < 0)
   29391       this.inputBits = 0;
   29392   };
   29393 
   29394   return CCITTFaxStream;
   29395 })();
   29396 
   29397 var LZWStream = (function LZWStreamClosure() {
   29398   function LZWStream(str, earlyChange) {
   29399     this.str = str;
   29400     this.dict = str.dict;
   29401     this.cachedData = 0;
   29402     this.bitsCached = 0;
   29403 
   29404     var maxLzwDictionarySize = 4096;
   29405     var lzwState = {
   29406       earlyChange: earlyChange,
   29407       codeLength: 9,
   29408       nextCode: 258,
   29409       dictionaryValues: new Uint8Array(maxLzwDictionarySize),
   29410       dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
   29411       dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
   29412       currentSequence: new Uint8Array(maxLzwDictionarySize),
   29413       currentSequenceLength: 0
   29414     };
   29415     for (var i = 0; i < 256; ++i) {
   29416       lzwState.dictionaryValues[i] = i;
   29417       lzwState.dictionaryLengths[i] = 1;
   29418     }
   29419     this.lzwState = lzwState;
   29420 
   29421     DecodeStream.call(this);
   29422   }
   29423 
   29424   LZWStream.prototype = Object.create(DecodeStream.prototype);
   29425 
   29426   LZWStream.prototype.readBits = function LZWStream_readBits(n) {
   29427     var bitsCached = this.bitsCached;
   29428     var cachedData = this.cachedData;
   29429     while (bitsCached < n) {
   29430       var c = this.str.getByte();
   29431       if (c == null) {
   29432         this.eof = true;
   29433         return null;
   29434       }
   29435       cachedData = (cachedData << 8) | c;
   29436       bitsCached += 8;
   29437     }
   29438     this.bitsCached = (bitsCached -= n);
   29439     this.cachedData = cachedData;
   29440     this.lastCode = null;
   29441     return (cachedData >>> bitsCached) & ((1 << n) - 1);
   29442   };
   29443 
   29444   LZWStream.prototype.readBlock = function LZWStream_readBlock() {
   29445     var blockSize = 512;
   29446     var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
   29447     var i, j, q;
   29448 
   29449     var lzwState = this.lzwState;
   29450     if (!lzwState)
   29451       return; // eof was found
   29452 
   29453     var earlyChange = lzwState.earlyChange;
   29454     var nextCode = lzwState.nextCode;
   29455     var dictionaryValues = lzwState.dictionaryValues;
   29456     var dictionaryLengths = lzwState.dictionaryLengths;
   29457     var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
   29458     var codeLength = lzwState.codeLength;
   29459     var prevCode = lzwState.prevCode;
   29460     var currentSequence = lzwState.currentSequence;
   29461     var currentSequenceLength = lzwState.currentSequenceLength;
   29462 
   29463     var decodedLength = 0;
   29464     var currentBufferLength = this.bufferLength;
   29465     var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
   29466 
   29467     for (i = 0; i < blockSize; i++) {
   29468       var code = this.readBits(codeLength);
   29469       var hasPrev = currentSequenceLength > 0;
   29470       if (code < 256) {
   29471         currentSequence[0] = code;
   29472         currentSequenceLength = 1;
   29473       } else if (code >= 258) {
   29474         if (code < nextCode) {
   29475           currentSequenceLength = dictionaryLengths[code];
   29476           for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
   29477             currentSequence[j] = dictionaryValues[q];
   29478             q = dictionaryPrevCodes[q];
   29479           }
   29480         } else {
   29481           currentSequence[currentSequenceLength++] = currentSequence[0];
   29482         }
   29483       } else if (code == 256) {
   29484         codeLength = 9;
   29485         nextCode = 258;
   29486         currentSequenceLength = 0;
   29487         continue;
   29488       } else {
   29489         this.eof = true;
   29490         delete this.lzwState;
   29491         break;
   29492       }
   29493 
   29494       if (hasPrev) {
   29495         dictionaryPrevCodes[nextCode] = prevCode;
   29496         dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
   29497         dictionaryValues[nextCode] = currentSequence[0];
   29498         nextCode++;
   29499         codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
   29500           codeLength : Math.min(Math.log(nextCode + earlyChange) /
   29501           0.6931471805599453 + 1, 12) | 0;
   29502       }
   29503       prevCode = code;
   29504 
   29505       decodedLength += currentSequenceLength;
   29506       if (estimatedDecodedSize < decodedLength) {
   29507         do {
   29508           estimatedDecodedSize += decodedSizeDelta;
   29509         } while (estimatedDecodedSize < decodedLength);
   29510         buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
   29511       }
   29512       for (j = 0; j < currentSequenceLength; j++)
   29513         buffer[currentBufferLength++] = currentSequence[j];
   29514     }
   29515     lzwState.nextCode = nextCode;
   29516     lzwState.codeLength = codeLength;
   29517     lzwState.prevCode = prevCode;
   29518     lzwState.currentSequenceLength = currentSequenceLength;
   29519 
   29520     this.bufferLength = currentBufferLength;
   29521   };
   29522 
   29523   return LZWStream;
   29524 })();
   29525 
   29526 
   29527 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   29528 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   29529 
   29530 'use strict';
   29531 
   29532 function MessageHandler(name, comObj) {
   29533   this.name = name;
   29534   this.comObj = comObj;
   29535   this.callbackIndex = 1;
   29536   var callbacks = this.callbacks = {};
   29537   var ah = this.actionHandler = {};
   29538 
   29539   ah['console_log'] = [function ahConsoleLog(data) {
   29540       PdfJS_window.console.log.apply(PdfJS_window.console, data);
   29541   }];
   29542   ah['console_error'] = [function ahConsoleError(data) {
   29543       PdfJS_window.console.error.apply(PdfJS_window.console, data);
   29544   }];
   29545 
   29546   comObj.onmessage = function messageHandlerComObjOnMessage(event) {
   29547     var data = event.data;
   29548     if (data.isReply) {
   29549       var callbackId = data.callbackId;
   29550       if (data.callbackId in callbacks) {
   29551         var callback = callbacks[callbackId];
   29552         delete callbacks[callbackId];
   29553         callback(data.data);
   29554       } else {
   29555         error('Cannot resolve callback ' + callbackId);
   29556       }
   29557     } else if (data.action in ah) {
   29558       var action = ah[data.action];
   29559       if (data.callbackId) {
   29560         var promise = new Promise();
   29561         promise.then(function(resolvedData) {
   29562           comObj.postMessage({
   29563             isReply: true,
   29564             callbackId: data.callbackId,
   29565             data: resolvedData
   29566           });
   29567         });
   29568         action[0].call(action[1], data.data, promise);
   29569       } else {
   29570         action[0].call(action[1], data.data);
   29571       }
   29572     } else {
   29573       error('Unkown action from worker: ' + data.action);
   29574     }
   29575   };
   29576 }
   29577 
   29578 MessageHandler.prototype = {
   29579   on: function messageHandlerOn(actionName, handler, scope) {
   29580     var ah = this.actionHandler;
   29581     if (ah[actionName]) {
   29582       error('There is already an actionName called "' + actionName + '"');
   29583     }
   29584     ah[actionName] = [handler, scope];
   29585   },
   29586   /**
   29587    * Sends a message to the comObj to invoke the action with the supplied data.
   29588    * @param {String} actionName Action to call.
   29589    * @param {JSON} data JSON data to send.
   29590    * @param {function} [callback] Optional callback that will handle a reply.
   29591    */
   29592   send: function messageHandlerSend(actionName, data, callback) {
   29593     var message = {
   29594       action: actionName,
   29595       data: data
   29596     };
   29597     if (callback) {
   29598       var callbackId = this.callbackIndex++;
   29599       this.callbacks[callbackId] = callback;
   29600       message.callbackId = callbackId;
   29601     }
   29602     this.comObj.postMessage(message);
   29603   }
   29604 };
   29605 
   29606 var WorkerMessageHandler = {
   29607   setup: function wphSetup(handler) {
   29608     var pdfModel = null;
   29609 
   29610     handler.on('test', function wphSetupTest(data) {
   29611       handler.send('test', data instanceof Uint8Array);
   29612     });
   29613 
   29614     handler.on('GetDocRequest', function wphSetupDoc(data) {
   29615       // Create only the model of the PDFDoc, which is enough for
   29616       // processing the content of the pdf.
   29617       pdfModel = new PDFDocument(new Stream(data));
   29618       var doc = {
   29619         numPages: pdfModel.numPages,
   29620         fingerprint: pdfModel.getFingerprint(),
   29621         destinations: pdfModel.catalog.destinations,
   29622         outline: pdfModel.catalog.documentOutline,
   29623         info: pdfModel.getDocumentInfo(),
   29624         metadata: pdfModel.catalog.metadata
   29625       };
   29626       handler.send('GetDoc', {pdfInfo: doc});
   29627     });
   29628 
   29629     handler.on('GetPageRequest', function wphSetupGetPage(data) {
   29630       var pageNumber = data.pageIndex + 1;
   29631       var pdfPage = pdfModel.getPage(pageNumber);
   29632       var page = {
   29633         pageIndex: data.pageIndex,
   29634         rotate: pdfPage.rotate,
   29635         ref: pdfPage.ref,
   29636         view: pdfPage.view
   29637       };
   29638       handler.send('GetPage', {pageInfo: page});
   29639     });
   29640 
   29641     handler.on('GetAnnotationsRequest', function wphSetupGetAnnotations(data) {
   29642       var pdfPage = pdfModel.getPage(data.pageIndex + 1);
   29643       handler.send('GetAnnotations', {
   29644         pageIndex: data.pageIndex,
   29645         annotations: pdfPage.getAnnotations()
   29646       });
   29647     });
   29648 
   29649     handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
   29650       var pageNum = data.pageIndex + 1;
   29651 
   29652 
   29653       // The following code does quite the same as
   29654       // Page.prototype.startRendering, but stops at one point and sends the
   29655       // result back to the main thread.
   29656       var gfx = new CanvasGraphics(null);
   29657 
   29658       var start = Date.now();
   29659 
   29660       var dependency = [];
   29661       var operatorList = null;
   29662       try {
   29663         var page = pdfModel.getPage(pageNum);
   29664         // Pre compile the pdf page and fetch the fonts/images.
   29665         operatorList = page.getOperatorList(handler, dependency);
   29666       } catch (e) {
   29667         var minimumStackMessage =
   29668             'worker.js: while trying to getPage() and getOperatorList()';
   29669 
   29670         // Turn the error into an obj that can be serialized
   29671         if (typeof e === 'string') {
   29672           e = {
   29673             message: e,
   29674             stack: minimumStackMessage
   29675           };
   29676         } else if (typeof e === 'object') {
   29677           e = {
   29678             message: e.message || e.toString(),
   29679             stack: e.stack || minimumStackMessage
   29680           };
   29681         } else {
   29682           e = {
   29683             message: 'Unknown exception type: ' + (typeof e),
   29684             stack: minimumStackMessage
   29685           };
   29686         }
   29687 
   29688         handler.send('PageError', {
   29689           pageNum: pageNum,
   29690           error: e
   29691         });
   29692         return;
   29693       }
   29694 
   29695       //comment out as it floods the logcat
   29696       //PdfJS_window.console.log('page=%d - getOperatorList: time=%dms, len=%d', pageNum,
   29697       //                        Date.now() - start, operatorList.fnArray.length);
   29698 
   29699       // Filter the dependecies for fonts.
   29700       var fonts = {};
   29701       for (var i = 0, ii = dependency.length; i < ii; i++) {
   29702         var dep = dependency[i];
   29703         if (dep.indexOf('font_') == 0) {
   29704           fonts[dep] = true;
   29705         }
   29706       }
   29707       handler.send('RenderPage', {
   29708         pageIndex: data.pageIndex,
   29709         operatorList: operatorList,
   29710         depFonts: Object.keys(fonts)
   29711       });
   29712     }, this);
   29713   }
   29714 };
   29715 
   29716 var consoleTimer = {};
   29717 
   29718 var workerConsole = {
   29719   log: function log() {
   29720     var args = Array.prototype.slice.call(arguments);
   29721     postMessage({
   29722       action: 'console_log',
   29723       data: args
   29724     });
   29725   },
   29726 
   29727   error: function error() {
   29728     var args = Array.prototype.slice.call(arguments);
   29729     postMessage({
   29730       action: 'console_error',
   29731       data: args
   29732     });
   29733     throw 'pdf.js execution error';
   29734   },
   29735 
   29736   time: function time(name) {
   29737     consoleTimer[name] = Date.now();
   29738   },
   29739 
   29740   timeEnd: function timeEnd(name) {
   29741     var time = consoleTimer[name];
   29742     if (time == null) {
   29743       error('Unkown timer name ' + name);
   29744     }
   29745     this.log('Timer:', name, Date.now() - time);
   29746   }
   29747 };
   29748 
   29749 // Worker thread?
   29750 if (typeof PdfJS_window.window === 'undefined') {
   29751   globalScope.console = workerConsole;
   29752 
   29753   var handler = new MessageHandler('worker_processor', this);
   29754   WorkerMessageHandler.setup(handler);
   29755 }
   29756 
   29757 
   29758 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
   29759 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   29760 
   29761 // - The JPEG specification can be found in the ITU CCITT Recommendation T.81
   29762 //   (www.w3.org/Graphics/JPEG/itu-t81.pdf)
   29763 // - The JFIF specification can be found in the JPEG File Interchange Format
   29764 //   (www.w3.org/Graphics/JPEG/jfif3.pdf)
   29765 // - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
   29766 //   in PostScript Level 2, Technical Note #5116
   29767 //   (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
   29768 
   29769 var JpegImage = (function jpegImage() {
   29770   "use strict";
   29771   var dctZigZag = new Int32Array([
   29772      0,
   29773      1,  8,
   29774     16,  9,  2,
   29775      3, 10, 17, 24,
   29776     32, 25, 18, 11, 4,
   29777      5, 12, 19, 26, 33, 40,
   29778     48, 41, 34, 27, 20, 13,  6,
   29779      7, 14, 21, 28, 35, 42, 49, 56,
   29780     57, 50, 43, 36, 29, 22, 15,
   29781     23, 30, 37, 44, 51, 58,
   29782     59, 52, 45, 38, 31,
   29783     39, 46, 53, 60,
   29784     61, 54, 47,
   29785     55, 62,
   29786     63
   29787   ]);
   29788 
   29789   var dctCos1  =  4017   // cos(pi/16)
   29790   var dctSin1  =   799   // sin(pi/16)
   29791   var dctCos3  =  3406   // cos(3*pi/16)
   29792   var dctSin3  =  2276   // sin(3*pi/16)
   29793   var dctCos6  =  1567   // cos(6*pi/16)
   29794   var dctSin6  =  3784   // sin(6*pi/16)
   29795   var dctSqrt2 =  5793   // sqrt(2)
   29796   var dctSqrt1d2 = 2896  // sqrt(2) / 2
   29797 
   29798   function constructor() {
   29799   }
   29800 
   29801   function buildHuffmanTable(codeLengths, values) {
   29802     var k = 0, code = [], i, j, length = 16;
   29803     while (length > 0 && !codeLengths[length - 1])
   29804       length--;
   29805     code.push({children: [], index: 0});
   29806     var p = code[0], q;
   29807     for (i = 0; i < length; i++) {
   29808       for (j = 0; j < codeLengths[i]; j++) {
   29809         p = code.pop();
   29810         p.children[p.index] = values[k];
   29811         while (p.index > 0) {
   29812           p = code.pop();
   29813         }
   29814         p.index++;
   29815         code.push(p);
   29816         while (code.length <= i) {
   29817           code.push(q = {children: [], index: 0});
   29818           p.children[p.index] = q.children;
   29819           p = q;
   29820         }
   29821         k++;
   29822       }
   29823       if (i + 1 < length) {
   29824         // p here points to last code
   29825         code.push(q = {children: [], index: 0});
   29826         p.children[p.index] = q.children;
   29827         p = q;
   29828       }
   29829     }
   29830     return code[0].children;
   29831   }
   29832 
   29833   function decodeScan(data, offset,
   29834                       frame, components, resetInterval,
   29835                       spectralStart, spectralEnd,
   29836                       successivePrev, successive) {
   29837     var precision = frame.precision;
   29838     var samplesPerLine = frame.samplesPerLine;
   29839     var scanLines = frame.scanLines;
   29840     var mcusPerLine = frame.mcusPerLine;
   29841     var progressive = frame.progressive;
   29842     var maxH = frame.maxH, maxV = frame.maxV;
   29843 
   29844     var startOffset = offset, bitsData = 0, bitsCount = 0;
   29845     function readBit() {
   29846       if (bitsCount > 0) {
   29847         bitsCount--;
   29848         return (bitsData >> bitsCount) & 1;
   29849       }
   29850       bitsData = data[offset++];
   29851       if (bitsData == 0xFF) {
   29852         var nextByte = data[offset++];
   29853         if (nextByte) {
   29854           throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
   29855         }
   29856         // unstuff 0
   29857       }
   29858       bitsCount = 7;
   29859       return bitsData >>> 7;
   29860     }
   29861     function decodeHuffman(tree) {
   29862       var node = tree, bit;
   29863       while ((bit = readBit()) !== null) {
   29864         node = node[bit];
   29865         if (typeof node === 'number')
   29866           return node;
   29867         if (typeof node !== 'object')
   29868           throw "invalid huffman sequence";
   29869       }
   29870       return null;
   29871     }
   29872     function receive(length) {
   29873       var n = 0;
   29874       while (length > 0) {
   29875         var bit = readBit();
   29876         if (bit === null) return;
   29877         n = (n << 1) | bit;
   29878         length--;
   29879       }
   29880       return n;
   29881     }
   29882     function receiveAndExtend(length) {
   29883       var n = receive(length);
   29884       if (n >= 1 << (length - 1))
   29885         return n;
   29886       return n + (-1 << length) + 1;
   29887     }
   29888     function decodeBaseline(component, zz) {
   29889       var t = decodeHuffman(component.huffmanTableDC);
   29890       var diff = t === 0 ? 0 : receiveAndExtend(t);
   29891       zz[0]= (component.pred += diff);
   29892       var k = 1;
   29893       while (k < 64) {
   29894         var rs = decodeHuffman(component.huffmanTableAC);
   29895         var s = rs & 15, r = rs >> 4;
   29896         if (s === 0) {
   29897           if (r < 15)
   29898             break;
   29899           k += 16;
   29900           continue;
   29901         }
   29902         k += r;
   29903         var z = dctZigZag[k];
   29904         zz[z] = receiveAndExtend(s);
   29905         k++;
   29906       }
   29907     }
   29908     function decodeDCFirst(component, zz) {
   29909       var t = decodeHuffman(component.huffmanTableDC);
   29910       var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
   29911       zz[0] = (component.pred += diff);
   29912     }
   29913     function decodeDCSuccessive(component, zz) {
   29914       zz[0] |= readBit() << successive;
   29915     }
   29916     var eobrun = 0;
   29917     function decodeACFirst(component, zz) {
   29918       if (eobrun > 0) {
   29919         eobrun--;
   29920         return;
   29921       }
   29922       var k = spectralStart, e = spectralEnd;
   29923       while (k <= e) {
   29924         var rs = decodeHuffman(component.huffmanTableAC);
   29925         var s = rs & 15, r = rs >> 4;
   29926         if (s === 0) {
   29927           if (r < 15) {
   29928             eobrun = receive(r) + (1 << r) - 1;
   29929             break;
   29930           }
   29931           k += 16;
   29932           continue;
   29933         }
   29934         k += r;
   29935         var z = dctZigZag[k];
   29936         zz[z] = receiveAndExtend(s) * (1 << successive);
   29937         k++;
   29938       }
   29939     }
   29940     var successiveACState = 0, successiveACNextValue;
   29941     function decodeACSuccessive(component, zz) {
   29942       var k = spectralStart, e = spectralEnd, r = 0;
   29943       while (k <= e) {
   29944         var z = dctZigZag[k];
   29945         switch (successiveACState) {
   29946         case 0: // initial state
   29947           var rs = decodeHuffman(component.huffmanTableAC);
   29948           var s = rs & 15, r = rs >> 4;
   29949           if (s === 0) {
   29950             if (r < 15) {
   29951               eobrun = receive(r) + (1 << r);
   29952               successiveACState = 4;
   29953             } else {
   29954               r = 16;
   29955               successiveACState = 1;
   29956             }
   29957           } else {
   29958             if (s !== 1)
   29959               throw "invalid ACn encoding";
   29960             successiveACNextValue = receiveAndExtend(s);
   29961             successiveACState = r ? 2 : 3;
   29962           }
   29963           continue;
   29964         case 1: // skipping r zero items
   29965         case 2:
   29966           if (zz[z])
   29967             zz[z] += (readBit() << successive);
   29968           else {
   29969             r--;
   29970             if (r === 0)
   29971               successiveACState = successiveACState == 2 ? 3 : 0;
   29972           }
   29973           break;
   29974         case 3: // set value for a zero item
   29975           if (zz[z])
   29976             zz[z] += (readBit() << successive);
   29977           else {
   29978             zz[z] = successiveACNextValue << successive;
   29979             successiveACState = 0;
   29980           }
   29981           break;
   29982         case 4: // eob
   29983           if (zz[z])
   29984             zz[z] += (readBit() << successive);
   29985           break;
   29986         }
   29987         k++;
   29988       }
   29989       if (successiveACState === 4) {
   29990         eobrun--;
   29991         if (eobrun === 0)
   29992           successiveACState = 0;
   29993       }
   29994     }
   29995     function decodeMcu(component, decode, mcu, row, col) {
   29996       var mcuRow = (mcu / mcusPerLine) | 0;
   29997       var mcuCol = mcu % mcusPerLine;
   29998       var blockRow = mcuRow * component.v + row;
   29999       var blockCol = mcuCol * component.h + col;
   30000       decode(component, component.blocks[blockRow][blockCol]);
   30001     }
   30002     function decodeBlock(component, decode, mcu) {
   30003       var blockRow = (mcu / component.blocksPerLine) | 0;
   30004       var blockCol = mcu % component.blocksPerLine;
   30005       decode(component, component.blocks[blockRow][blockCol]);
   30006     }
   30007 
   30008     var componentsLength = components.length;
   30009     var component, i, j, k, n;
   30010     var decodeFn;
   30011     if (progressive) {
   30012       if (spectralStart === 0)
   30013         decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
   30014       else
   30015         decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
   30016     } else {
   30017       decodeFn = decodeBaseline;
   30018     }
   30019 
   30020     var mcu = 0, marker;
   30021     var mcuExpected;
   30022     if (componentsLength == 1) {
   30023       mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
   30024     } else {
   30025       mcuExpected = mcusPerLine * frame.mcusPerColumn;
   30026     }
   30027     if (!resetInterval) resetInterval = mcuExpected;
   30028 
   30029     var h, v;
   30030     while (mcu < mcuExpected) {
   30031       // reset interval stuff
   30032       for (i = 0; i < componentsLength; i++)
   30033         components[i].pred = 0;
   30034       eobrun = 0;
   30035 
   30036       if (componentsLength == 1) {
   30037         component = components[0];
   30038         for (n = 0; n < resetInterval; n++) {
   30039           decodeBlock(component, decodeFn, mcu);
   30040           mcu++;
   30041         }
   30042       } else {
   30043         for (n = 0; n < resetInterval; n++) {
   30044           for (i = 0; i < componentsLength; i++) {
   30045             component = components[i];
   30046             h = component.h;
   30047             v = component.v;
   30048             for (j = 0; j < v; j++) {
   30049               for (k = 0; k < h; k++) {
   30050                 decodeMcu(component, decodeFn, mcu, j, k);
   30051               }
   30052             }
   30053           }
   30054           mcu++;
   30055         }
   30056       }
   30057 
   30058       // find marker
   30059       bitsCount = 0;
   30060       marker = (data[offset] << 8) | data[offset + 1];
   30061       if (marker <= 0xFF00) {
   30062         throw "marker was not found";
   30063       }
   30064 
   30065       if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
   30066         offset += 2;
   30067       }
   30068       else
   30069         break;
   30070     }
   30071 
   30072     return offset - startOffset;
   30073   }
   30074 
   30075   function buildComponentData(frame, component) {
   30076     var lines = [];
   30077     var blocksPerLine = component.blocksPerLine;
   30078     var blocksPerColumn = component.blocksPerColumn;
   30079     var samplesPerLine = blocksPerLine << 3;
   30080     var R = new Int32Array(64), r = new Uint8Array(64);
   30081 
   30082     // A port of poppler's IDCT method which in turn is taken from:
   30083     //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
   30084     //   "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
   30085     //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
   30086     //   988-991.
   30087     function quantizeAndInverse(zz, dataOut, dataIn) {
   30088       var qt = component.quantizationTable;
   30089       var v0, v1, v2, v3, v4, v5, v6, v7, t;
   30090       var p = dataIn;
   30091       var i;
   30092 
   30093       // dequant
   30094       for (i = 0; i < 64; i++)
   30095         p[i] = zz[i] * qt[i];
   30096 
   30097       // inverse DCT on rows
   30098       for (i = 0; i < 8; ++i) {
   30099         var row = 8 * i;
   30100 
   30101         // check for all-zero AC coefficients
   30102         if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
   30103             p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
   30104             p[7 + row] == 0) {
   30105           t = (dctSqrt2 * p[0 + row] + 512) >> 10;
   30106           p[0 + row] = t;
   30107           p[1 + row] = t;
   30108           p[2 + row] = t;
   30109           p[3 + row] = t;
   30110           p[4 + row] = t;
   30111           p[5 + row] = t;
   30112           p[6 + row] = t;
   30113           p[7 + row] = t;
   30114           continue;
   30115         }
   30116 
   30117         // stage 4
   30118         v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
   30119         v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
   30120         v2 = p[2 + row];
   30121         v3 = p[6 + row];
   30122         v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
   30123         v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
   30124         v5 = p[3 + row] << 4;
   30125         v6 = p[5 + row] << 4;
   30126 
   30127         // stage 3
   30128         t = (v0 - v1+ 1) >> 1;
   30129         v0 = (v0 + v1 + 1) >> 1;
   30130         v1 = t;
   30131         t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
   30132         v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
   30133         v3 = t;
   30134         t = (v4 - v6 + 1) >> 1;
   30135         v4 = (v4 + v6 + 1) >> 1;
   30136         v6 = t;
   30137         t = (v7 + v5 + 1) >> 1;
   30138         v5 = (v7 - v5 + 1) >> 1;
   30139         v7 = t;
   30140 
   30141         // stage 2
   30142         t = (v0 - v3 + 1) >> 1;
   30143         v0 = (v0 + v3 + 1) >> 1;
   30144         v3 = t;
   30145         t = (v1 - v2 + 1) >> 1;
   30146         v1 = (v1 + v2 + 1) >> 1;
   30147         v2 = t;
   30148         t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
   30149         v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
   30150         v7 = t;
   30151         t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
   30152         v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
   30153         v6 = t;
   30154 
   30155         // stage 1
   30156         p[0 + row] = v0 + v7;
   30157         p[7 + row] = v0 - v7;
   30158         p[1 + row] = v1 + v6;
   30159         p[6 + row] = v1 - v6;
   30160         p[2 + row] = v2 + v5;
   30161         p[5 + row] = v2 - v5;
   30162         p[3 + row] = v3 + v4;
   30163         p[4 + row] = v3 - v4;
   30164       }
   30165 
   30166       // inverse DCT on columns
   30167       for (i = 0; i < 8; ++i) {
   30168         var col = i;
   30169 
   30170         // check for all-zero AC coefficients
   30171         if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 &&
   30172             p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 &&
   30173             p[7*8 + col] == 0) {
   30174           t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;
   30175           p[0*8 + col] = t;
   30176           p[1*8 + col] = t;
   30177           p[2*8 + col] = t;
   30178           p[3*8 + col] = t;
   30179           p[4*8 + col] = t;
   30180           p[5*8 + col] = t;
   30181           p[6*8 + col] = t;
   30182           p[7*8 + col] = t;
   30183           continue;
   30184         }
   30185 
   30186         // stage 4
   30187         v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
   30188         v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
   30189         v2 = p[2*8 + col];
   30190         v3 = p[6*8 + col];
   30191         v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12;
   30192         v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12;
   30193         v5 = p[3*8 + col];
   30194         v6 = p[5*8 + col];
   30195 
   30196         // stage 3
   30197         t = (v0 - v1 + 1) >> 1;
   30198         v0 = (v0 + v1 + 1) >> 1;
   30199         v1 = t;
   30200         t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
   30201         v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
   30202         v3 = t;
   30203         t = (v4 - v6 + 1) >> 1;
   30204         v4 = (v4 + v6 + 1) >> 1;
   30205         v6 = t;
   30206         t = (v7 + v5 + 1) >> 1;
   30207         v5 = (v7 - v5 + 1) >> 1;
   30208         v7 = t;
   30209 
   30210         // stage 2
   30211         t = (v0 - v3 + 1) >> 1;
   30212         v0 = (v0 + v3 + 1) >> 1;
   30213         v3 = t;
   30214         t = (v1 - v2 + 1) >> 1;
   30215         v1 = (v1 + v2 + 1) >> 1;
   30216         v2 = t;
   30217         t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
   30218         v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
   30219         v7 = t;
   30220         t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
   30221         v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
   30222         v6 = t;
   30223 
   30224         // stage 1
   30225         p[0*8 + col] = v0 + v7;
   30226         p[7*8 + col] = v0 - v7;
   30227         p[1*8 + col] = v1 + v6;
   30228         p[6*8 + col] = v1 - v6;
   30229         p[2*8 + col] = v2 + v5;
   30230         p[5*8 + col] = v2 - v5;
   30231         p[3*8 + col] = v3 + v4;
   30232         p[4*8 + col] = v3 - v4;
   30233       }
   30234 
   30235       // convert to 8-bit integers
   30236       for (i = 0; i < 64; ++i) {
   30237         var sample = 128 + ((p[i] + 8) >> 4);
   30238         dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;
   30239       }
   30240     }
   30241 
   30242     var i, j;
   30243     for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
   30244       var scanLine = blockRow << 3;
   30245       for (i = 0; i < 8; i++)
   30246         lines.push(new Uint8Array(samplesPerLine));
   30247       for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
   30248         quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
   30249 
   30250         var offset = 0, sample = blockCol << 3;
   30251         for (j = 0; j < 8; j++) {
   30252           var line = lines[scanLine + j];
   30253           for (i = 0; i < 8; i++)
   30254             line[sample + i] = r[offset++];
   30255         }
   30256       }
   30257     }
   30258     return lines;
   30259   }
   30260 
   30261   constructor.prototype = {
   30262     load: function load(path) {
   30263       var xhr = new PdfJS_window.XMLHttpRequest();
   30264       xhr.open("GET", path, true);
   30265       xhr.responseType = "arraybuffer";
   30266       xhr.onload = (function() {
   30267         // TODO catch parse error
   30268         var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
   30269         this.parse(data);
   30270         if (this.onload)
   30271           this.onload();
   30272       }).bind(this);
   30273       xhr.send(null);
   30274     },
   30275     parse: function parse(data) {
   30276       var offset = 0, length = data.length;
   30277       function readUint16() {
   30278         var value = (data[offset] << 8) | data[offset + 1];
   30279         offset += 2;
   30280         return value;
   30281       }
   30282       function readDataBlock() {
   30283         var length = readUint16();
   30284         var array = data.subarray(offset, offset + length - 2);
   30285         offset += array.length;
   30286         return array;
   30287       }
   30288       function prepareComponents(frame) {
   30289         var maxH = 0, maxV = 0;
   30290         var component, componentId;
   30291         for (componentId in frame.components) {
   30292           if (frame.components.hasOwnProperty(componentId)) {
   30293             component = frame.components[componentId];
   30294             if (maxH < component.h) maxH = component.h;
   30295             if (maxV < component.v) maxV = component.v;
   30296           }
   30297         }
   30298         var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
   30299         var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
   30300         for (componentId in frame.components) {
   30301           if (frame.components.hasOwnProperty(componentId)) {
   30302             component = frame.components[componentId];
   30303             var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
   30304             var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines  / 8) * component.v / maxV);
   30305             var blocksPerLineForMcu = mcusPerLine * component.h;
   30306             var blocksPerColumnForMcu = mcusPerColumn * component.v;
   30307             var blocks = [];
   30308             for (var i = 0; i < blocksPerColumnForMcu; i++) {
   30309               var row = [];
   30310               for (var j = 0; j < blocksPerLineForMcu; j++)
   30311                 row.push(new Int32Array(64));
   30312               blocks.push(row);
   30313             }
   30314             component.blocksPerLine = blocksPerLine;
   30315             component.blocksPerColumn = blocksPerColumn;
   30316             component.blocks = blocks;
   30317           }
   30318         }
   30319         frame.maxH = maxH;
   30320         frame.maxV = maxV;
   30321         frame.mcusPerLine = mcusPerLine;
   30322         frame.mcusPerColumn = mcusPerColumn;
   30323       }
   30324       var jfif = null;
   30325       var adobe = null;
   30326       var pixels = null;
   30327       var frame, resetInterval;
   30328       var quantizationTables = [], frames = [];
   30329       var huffmanTablesAC = [], huffmanTablesDC = [];
   30330       var fileMarker = readUint16();
   30331       if (fileMarker != 0xFFD8) { // SOI (Start of Image)
   30332         throw "SOI not found";
   30333       }
   30334 
   30335       fileMarker = readUint16();
   30336       while (fileMarker != 0xFFD9) { // EOI (End of image)
   30337         var i, j, l;
   30338         switch(fileMarker) {
   30339           case 0xFFE0: // APP0 (Application Specific)
   30340           case 0xFFE1: // APP1
   30341           case 0xFFE2: // APP2
   30342           case 0xFFE3: // APP3
   30343           case 0xFFE4: // APP4
   30344           case 0xFFE5: // APP5
   30345           case 0xFFE6: // APP6
   30346           case 0xFFE7: // APP7
   30347           case 0xFFE8: // APP8
   30348           case 0xFFE9: // APP9
   30349           case 0xFFEA: // APP10
   30350           case 0xFFEB: // APP11
   30351           case 0xFFEC: // APP12
   30352           case 0xFFED: // APP13
   30353           case 0xFFEE: // APP14
   30354           case 0xFFEF: // APP15
   30355           case 0xFFFE: // COM (Comment)
   30356             var appData = readDataBlock();
   30357 
   30358             if (fileMarker === 0xFFE0) {
   30359               if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
   30360                 appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
   30361                 jfif = {
   30362                   version: { major: appData[5], minor: appData[6] },
   30363                   densityUnits: appData[7],
   30364                   xDensity: (appData[8] << 8) | appData[9],
   30365                   yDensity: (appData[10] << 8) | appData[11],
   30366                   thumbWidth: appData[12],
   30367                   thumbHeight: appData[13],
   30368                   thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
   30369                 };
   30370               }
   30371             }
   30372             // TODO APP1 - Exif
   30373             if (fileMarker === 0xFFEE) {
   30374               if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
   30375                 appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
   30376                 adobe = {
   30377                   version: appData[6],
   30378                   flags0: (appData[7] << 8) | appData[8],
   30379                   flags1: (appData[9] << 8) | appData[10],
   30380                   transformCode: appData[11]
   30381                 };
   30382               }
   30383             }
   30384             break;
   30385 
   30386           case 0xFFDB: // DQT (Define Quantization Tables)
   30387             var quantizationTableCount = Math.floor((readUint16() - 2) / 65);
   30388             for (i = 0; i < quantizationTableCount; i++) {
   30389               var quantizationTableSpec = data[offset++];
   30390               var tableData = new Int32Array(64);
   30391               if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
   30392                 for (j = 0; j < 64; j++) {
   30393                   var z = dctZigZag[j];
   30394                   tableData[z] = data[offset++];
   30395                 }
   30396               } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
   30397                 for (j = 0; j < 64; j++) {
   30398                   var z = dctZigZag[j];
   30399                   tableData[z] = readUint16();
   30400                 }
   30401               } else
   30402                 throw "DQT: invalid table spec";
   30403               quantizationTables[quantizationTableSpec & 15] = tableData;
   30404             }
   30405             break;
   30406 
   30407           case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
   30408           case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
   30409             readUint16(); // skip data length
   30410             frame = {};
   30411             frame.progressive = (fileMarker === 0xFFC2);
   30412             frame.precision = data[offset++];
   30413             frame.scanLines = readUint16();
   30414             frame.samplesPerLine = readUint16();
   30415             frame.components = {};
   30416             frame.componentsOrder = [];
   30417             var componentsCount = data[offset++], componentId;
   30418             var maxH = 0, maxV = 0;
   30419             for (i = 0; i < componentsCount; i++) {
   30420               componentId = data[offset];
   30421               var h = data[offset + 1] >> 4;
   30422               var v = data[offset + 1] & 15;
   30423               var qId = data[offset + 2];
   30424               frame.componentsOrder.push(componentId);
   30425               frame.components[componentId] = {
   30426                 h: h,
   30427                 v: v,
   30428                 quantizationTable: quantizationTables[qId]
   30429               };
   30430               offset += 3;
   30431             }
   30432             prepareComponents(frame);
   30433             frames.push(frame);
   30434             break;
   30435 
   30436           case 0xFFC4: // DHT (Define Huffman Tables)
   30437             var huffmanLength = readUint16();
   30438             for (i = 2; i < huffmanLength;) {
   30439               var huffmanTableSpec = data[offset++];
   30440               var codeLengths = new Uint8Array(16);
   30441               var codeLengthSum = 0;
   30442               for (j = 0; j < 16; j++, offset++)
   30443                 codeLengthSum += (codeLengths[j] = data[offset]);
   30444               var huffmanValues = new Uint8Array(codeLengthSum);
   30445               for (j = 0; j < codeLengthSum; j++, offset++)
   30446                 huffmanValues[j] = data[offset];
   30447               i += 17 + codeLengthSum;
   30448 
   30449               ((huffmanTableSpec >> 4) === 0 ? 
   30450                 huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
   30451                 buildHuffmanTable(codeLengths, huffmanValues);
   30452             }
   30453             break;
   30454 
   30455           case 0xFFDD: // DRI (Define Restart Interval)
   30456             readUint16(); // skip data length
   30457             resetInterval = readUint16();
   30458             break;
   30459 
   30460           case 0xFFDA: // SOS (Start of Scan)
   30461             var scanLength = readUint16();
   30462             var selectorsCount = data[offset++];
   30463             var components = [], component;
   30464             for (i = 0; i < selectorsCount; i++) {
   30465               component = frame.components[data[offset++]];
   30466               var tableSpec = data[offset++];
   30467               component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
   30468               component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
   30469               components.push(component);
   30470             }
   30471             var spectralStart = data[offset++];
   30472             var spectralEnd = data[offset++];
   30473             var successiveApproximation = data[offset++];
   30474             var processed = decodeScan(data, offset,
   30475               frame, components, resetInterval,
   30476               spectralStart, spectralEnd,
   30477               successiveApproximation >> 4, successiveApproximation & 15);
   30478             offset += processed;
   30479             break;
   30480           default:
   30481             throw "unknown JPEG marker " + fileMarker.toString(16);
   30482         }
   30483         fileMarker = readUint16();
   30484       }
   30485       if (frames.length != 1)
   30486         throw "only single frame JPEGs supported";
   30487 
   30488       this.width = frame.samplesPerLine;
   30489       this.height = frame.scanLines;
   30490       this.jfif = jfif;
   30491       this.adobe = adobe;
   30492       this.components = [];
   30493       for (var i = 0; i < frame.componentsOrder.length; i++) {
   30494         var component = frame.components[frame.componentsOrder[i]];
   30495         this.components.push({
   30496           lines: buildComponentData(frame, component),
   30497           scaleX: component.h / frame.maxH,
   30498           scaleY: component.v / frame.maxV
   30499         });
   30500       }
   30501     },
   30502     getData: function getData(width, height) {
   30503       function clampTo8bit(a) {
   30504         return a < 0 ? 0 : a > 255 ? 255 : a;
   30505       }
   30506       var scaleX = this.width / width, scaleY = this.height / height;
   30507 
   30508       var component1, component2, component3, component4;
   30509       var component1Line, component2Line, component3Line, component4Line;
   30510       var x, y;
   30511       var offset = 0;
   30512       var Y, Cb, Cr, K, C, M, Ye, R, G, B;
   30513       var colorTransform;
   30514       var dataLength = width * height * this.components.length;
   30515       var data = new Uint8Array(dataLength);
   30516       switch (this.components.length) {
   30517         case 1:
   30518           component1 = this.components[0];
   30519           for (y = 0; y < height; y++) {
   30520             component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
   30521             for (x = 0; x < width; x++) {
   30522               Y = component1Line[0 | (x * component1.scaleX * scaleX)];
   30523 
   30524               data[offset++] = Y;
   30525             }
   30526           }
   30527           break;
   30528         case 3:
   30529           // The default transform for three components is true
   30530           colorTransform = true;
   30531           // The adobe transform marker overrides any previous setting
   30532           if (this.adobe && this.adobe.transformCode)
   30533             colorTransform = true;
   30534           else if (typeof this.colorTransform !== 'undefined')
   30535             colorTransform = !!this.colorTransform;
   30536 
   30537           component1 = this.components[0];
   30538           component2 = this.components[1];
   30539           component3 = this.components[2];
   30540           for (y = 0; y < height; y++) {
   30541             component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
   30542             component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
   30543             component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
   30544             for (x = 0; x < width; x++) {
   30545               if (!colorTransform) {
   30546                 R = component1Line[0 | (x * component1.scaleX * scaleX)];
   30547                 G = component2Line[0 | (x * component2.scaleX * scaleX)];
   30548                 B = component3Line[0 | (x * component3.scaleX * scaleX)];
   30549               } else {
   30550                 Y = component1Line[0 | (x * component1.scaleX * scaleX)];
   30551                 Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
   30552                 Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
   30553 
   30554                 R = clampTo8bit(Y + 1.402 * (Cr - 128));
   30555                 G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
   30556                 B = clampTo8bit(Y + 1.772 * (Cb - 128));
   30557               }
   30558 
   30559               data[offset++] = R;
   30560               data[offset++] = G;
   30561               data[offset++] = B;
   30562             }
   30563           }
   30564           break;
   30565         case 4:
   30566           if (!this.adobe)
   30567             throw 'Unsupported color mode (4 components)';
   30568           // The default transform for four components is false
   30569           colorTransform = false;
   30570           // The adobe transform marker overrides any previous setting
   30571           if (this.adobe && this.adobe.transformCode)
   30572             colorTransform = true;
   30573           else if (typeof this.colorTransform !== 'undefined')
   30574             colorTransform = !!this.colorTransform;
   30575 
   30576           component1 = this.components[0];
   30577           component2 = this.components[1];
   30578           component3 = this.components[2];
   30579           component4 = this.components[3];
   30580           for (y = 0; y < height; y++) {
   30581             component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
   30582             component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
   30583             component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
   30584             component4Line = component4.lines[0 | (y * component4.scaleY * scaleY)];
   30585             for (x = 0; x < width; x++) {
   30586               if (!colorTransform) {
   30587                 C = component1Line[0 | (x * component1.scaleX * scaleX)];
   30588                 M = component2Line[0 | (x * component2.scaleX * scaleX)];
   30589                 Ye = component3Line[0 | (x * component3.scaleX * scaleX)];
   30590                 K = component4Line[0 | (x * component4.scaleX * scaleX)];
   30591               } else {
   30592                 Y = component1Line[0 | (x * component1.scaleX * scaleX)];
   30593                 Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
   30594                 Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
   30595                 K = component4Line[0 | (x * component4.scaleX * scaleX)];
   30596 
   30597                 C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
   30598                 M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
   30599                 Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
   30600               }
   30601               data[offset++] = C;
   30602               data[offset++] = M;
   30603               data[offset++] = Ye;
   30604               data[offset++] = K;
   30605             }
   30606           }
   30607           break;
   30608         default:
   30609           throw 'Unsupported color mode';
   30610       }
   30611       return data;
   30612     },
   30613     copyToImageData: function copyToImageData(imageData) {
   30614       var width = imageData.width, height = imageData.height;
   30615       var imageDataArray = imageData.data;
   30616       var data = this.getData(width, height);
   30617       var i = 0, j = 0, x, y;
   30618       var Y, K, C, M, R, G, B;
   30619       switch (this.components.length) {
   30620         case 1:
   30621           for (y = 0; y < height; y++) {
   30622             for (x = 0; x < width; x++) {
   30623               Y = data[i++];
   30624 
   30625               imageDataArray[j++] = Y;
   30626               imageDataArray[j++] = Y;
   30627               imageDataArray[j++] = Y;
   30628               imageDataArray[j++] = 255;
   30629             }
   30630           }
   30631           break;
   30632         case 3:
   30633           for (y = 0; y < height; y++) {
   30634             for (x = 0; x < width; x++) {
   30635               R = data[i++];
   30636               G = data[i++];
   30637               B = data[i++];
   30638 
   30639               imageDataArray[j++] = R;
   30640               imageDataArray[j++] = G;
   30641               imageDataArray[j++] = B;
   30642               imageDataArray[j++] = 255;
   30643             }
   30644           }
   30645           break;
   30646         case 4:
   30647           for (y = 0; y < height; y++) {
   30648             for (x = 0; x < width; x++) {
   30649               C = data[i++];
   30650               M = data[i++];
   30651               Y = data[i++];
   30652               K = data[i++];
   30653 
   30654               R = 255 - clampTo8bit(C * (1 - K / 255) + K);
   30655               G = 255 - clampTo8bit(M * (1 - K / 255) + K);
   30656               B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
   30657 
   30658               imageDataArray[j++] = R;
   30659               imageDataArray[j++] = G;
   30660               imageDataArray[j++] = B;
   30661               imageDataArray[j++] = 255;
   30662             }
   30663           }
   30664           break;
   30665         default:
   30666           throw 'Unsupported color mode';
   30667       }
   30668     }
   30669   };
   30670 
   30671   return constructor;
   30672 })();
   30673 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   30674 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   30675 
   30676 'use strict';
   30677 
   30678 var JpxImage = (function JpxImageClosure() {
   30679   // Table E.1
   30680   var SubbandsGainLog2 = {
   30681     'LL': 0,
   30682     'LH': 1,
   30683     'HL': 1,
   30684     'HH': 2
   30685   };
   30686   function JpxImage() {
   30687     this.failOnCorruptedImage = false;
   30688   }
   30689   JpxImage.prototype = {
   30690     load: function JpxImage_load(url) {
   30691       var xhr = new PdfJS_window.XMLHttpRequest();
   30692       xhr.open('GET', url, true);
   30693       xhr.responseType = 'arraybuffer';
   30694       xhr.onload = (function() {
   30695         // TODO catch parse error
   30696         var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
   30697         this.parse(data);
   30698         if (this.onload)
   30699           this.onload();
   30700       }).bind(this);
   30701       xhr.send(null);
   30702     },
   30703     parse: function JpxImage_parse(data) {
   30704       function ReadUint(data, offset, bytes) {
   30705         var n = 0;
   30706         for (var i = 0; i < bytes; i++)
   30707           n = n * 256 + (data[offset + i] & 0xFF);
   30708         return n;
   30709       }
   30710       var position = 0, length = data.length;
   30711       while (position < length) {
   30712         var headerSize = 8;
   30713         var lbox = ReadUint(data, position, 4);
   30714         var tbox = ReadUint(data, position + 4, 4);
   30715         position += headerSize;
   30716         if (lbox == 1) {
   30717           lbox = ReadUint(data, position, 8);
   30718           position += 8;
   30719           headerSize += 8;
   30720         }
   30721         if (lbox == 0)
   30722           lbox = length - position + headerSize;
   30723         if (lbox < headerSize)
   30724           error('JPX error: Invalid box field size');
   30725         var dataLength = lbox - headerSize;
   30726         var jumpDataLength = true;
   30727         switch (tbox) {
   30728           case 0x6A501A1A: // 'jP\032\032'
   30729             // TODO
   30730             break;
   30731           case 0x6A703268: // 'jp2h'
   30732             jumpDataLength = false; // parsing child boxes
   30733             break;
   30734           case 0x636F6C72: // 'colr'
   30735             // TODO
   30736             break;
   30737           case 0x6A703263: // 'jp2c'
   30738             this.parseCodestream(data, position, position + dataLength);
   30739             break;
   30740         }
   30741         if (jumpDataLength)
   30742           position += dataLength;
   30743       }
   30744     },
   30745     parseCodestream: function JpxImage_parseCodestream(data, start, end) {
   30746       var context = {};
   30747       try {
   30748         var position = start;
   30749         while (position < end) {
   30750           var code = readUint16(data, position);
   30751           position += 2;
   30752 
   30753           var length = 0, j;
   30754           switch (code) {
   30755             case 0xFF4F: // Start of codestream (SOC)
   30756               context.mainHeader = true;
   30757               break;
   30758             case 0xFFD9: // End of codestream (EOC)
   30759               break;
   30760             case 0xFF51: // Image and tile size (SIZ)
   30761               length = readUint16(data, position);
   30762               var siz = {};
   30763               siz.Xsiz = readUint32(data, position + 4);
   30764               siz.Ysiz = readUint32(data, position + 8);
   30765               siz.XOsiz = readUint32(data, position + 12);
   30766               siz.YOsiz = readUint32(data, position + 16);
   30767               siz.XTsiz = readUint32(data, position + 20);
   30768               siz.YTsiz = readUint32(data, position + 24);
   30769               siz.XTOsiz = readUint32(data, position + 28);
   30770               siz.YTOsiz = readUint32(data, position + 32);
   30771               var componentsCount = readUint16(data, position + 36);
   30772               siz.Csiz = componentsCount;
   30773               var components = [];
   30774               j = position + 38;
   30775               for (var i = 0; i < componentsCount; i++) {
   30776                 var component = {
   30777                   precision: (data[j] & 0x7F) + 1,
   30778                   isSigned: !!(data[j] & 0x80),
   30779                   XRsiz: data[j + 1],
   30780                   YRsiz: data[j + 1]
   30781                 };
   30782                 calculateComponentDimensions(component, siz);
   30783                 components.push(component);
   30784               }
   30785               context.SIZ = siz;
   30786               context.components = components;
   30787               calculateTileGrids(context, components);
   30788               context.QCC = [];
   30789               context.COC = [];
   30790               break;
   30791             case 0xFF5C: // Quantization default (QCD)
   30792               length = readUint16(data, position);
   30793               var qcd = {};
   30794               j = position + 2;
   30795               var sqcd = data[j++];
   30796               var spqcdSize, scalarExpounded;
   30797               switch (sqcd & 0x1F) {
   30798                 case 0:
   30799                   spqcdSize = 8;
   30800                   scalarExpounded = true;
   30801                   break;
   30802                 case 1:
   30803                   spqcdSize = 16;
   30804                   scalarExpounded = false;
   30805                   break;
   30806                 case 2:
   30807                   spqcdSize = 16;
   30808                   scalarExpounded = true;
   30809                   break;
   30810                 default:
   30811                   throw 'Invalid SQcd value ' + sqcd;
   30812               }
   30813               qcd.noQuantization = spqcdSize == 8;
   30814               qcd.scalarExpounded = scalarExpounded;
   30815               qcd.guardBits = sqcd >> 5;
   30816               var spqcds = [];
   30817               while (j < length + position) {
   30818                 var spqcd = {};
   30819                 if (spqcdSize == 8) {
   30820                   spqcd.epsilon = data[j++] >> 3;
   30821                   spqcd.mu = 0;
   30822                 } else {
   30823                   spqcd.epsilon = data[j] >> 3;
   30824                   spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
   30825                   j += 2;
   30826                 }
   30827                 spqcds.push(spqcd);
   30828               }
   30829               qcd.SPqcds = spqcds;
   30830               if (context.mainHeader)
   30831                 context.QCD = qcd;
   30832               else {
   30833                 context.currentTile.QCD = qcd;
   30834                 context.currentTile.QCC = [];
   30835               }
   30836               break;
   30837             case 0xFF5D: // Quantization component (QCC)
   30838               length = readUint16(data, position);
   30839               var qcc = {};
   30840               j = position + 2;
   30841               var cqcc;
   30842               if (context.SIZ.Csiz < 257)
   30843                 cqcc = data[j++];
   30844               else {
   30845                 cqcc = readUint16(data, j);
   30846                 j += 2;
   30847               }
   30848               var sqcd = data[j++];
   30849               var spqcdSize, scalarExpounded;
   30850               switch (sqcd & 0x1F) {
   30851                 case 0:
   30852                   spqcdSize = 8;
   30853                   scalarExpounded = true;
   30854                   break;
   30855                 case 1:
   30856                   spqcdSize = 16;
   30857                   scalarExpounded = false;
   30858                   break;
   30859                 case 2:
   30860                   spqcdSize = 16;
   30861                   scalarExpounded = true;
   30862                   break;
   30863                 default:
   30864                   throw 'Invalid SQcd value ' + sqcd;
   30865               }
   30866               qcc.noQuantization = spqcdSize == 8;
   30867               qcc.scalarExpounded = scalarExpounded;
   30868               qcc.guardBits = sqcd >> 5;
   30869               var spqcds = [];
   30870               while (j < length + position) {
   30871                 var spqcd = {};
   30872                 if (spqcdSize == 8) {
   30873                   spqcd.epsilon = data[j++] >> 3;
   30874                   spqcd.mu = 0;
   30875                 } else {
   30876                   spqcd.epsilon = data[j] >> 3;
   30877                   spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
   30878                   j += 2;
   30879                 }
   30880                 spqcds.push(spqcd);
   30881               }
   30882               qcc.SPqcds = spqcds;
   30883               if (context.mainHeader)
   30884                 context.QCC[cqcc] = qcc;
   30885               else
   30886                 context.currentTile.QCC[cqcc] = qcc;
   30887               break;
   30888             case 0xFF52: // Coding style default (COD)
   30889               length = readUint16(data, position);
   30890               var cod = {};
   30891               j = position + 2;
   30892               var scod = data[j++];
   30893               cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
   30894               cod.sopMarkerUsed = !!(scod & 2);
   30895               cod.ephMarkerUsed = !!(scod & 4);
   30896               var codingStyle = {};
   30897               cod.progressionOrder = data[j++];
   30898               cod.layersCount = readUint16(data, j);
   30899               j += 2;
   30900               cod.multipleComponentTransform = data[j++];
   30901 
   30902               cod.decompositionLevelsCount = data[j++];
   30903               cod.xcb = (data[j++] & 0xF) + 2;
   30904               cod.ycb = (data[j++] & 0xF) + 2;
   30905               var blockStyle = data[j++];
   30906               cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
   30907               cod.resetContextProbabilities = !!(blockStyle & 2);
   30908               cod.terminationOnEachCodingPass = !!(blockStyle & 4);
   30909               cod.verticalyStripe = !!(blockStyle & 8);
   30910               cod.predictableTermination = !!(blockStyle & 16);
   30911               cod.segmentationSymbolUsed = !!(blockStyle & 32);
   30912               cod.transformation = data[j++];
   30913               if (cod.entropyCoderWithCustomPrecincts) {
   30914                 var precinctsSizes = {};
   30915                 while (j < length + position) {
   30916                   var precinctsSize = data[j];
   30917                   precinctsSizes.push({
   30918                     PPx: precinctsSize & 0xF,
   30919                     PPy: precinctsSize >> 4
   30920                   });
   30921                 }
   30922                 cod.precinctsSizes = precinctsSizes;
   30923               }
   30924 
   30925               if (cod.sopMarkerUsed || cod.ephMarkerUsed ||
   30926                   cod.selectiveArithmeticCodingBypass ||
   30927                   cod.resetContextProbabilities ||
   30928                   cod.terminationOnEachCodingPass ||
   30929                   cod.verticalyStripe || cod.predictableTermination ||
   30930                   cod.segmentationSymbolUsed)
   30931                 throw 'Unsupported COD options: ' + uneval(cod);
   30932 
   30933               if (context.mainHeader)
   30934                 context.COD = cod;
   30935               else {
   30936                 context.currentTile.COD = cod;
   30937                 context.currentTile.COC = [];
   30938               }
   30939               break;
   30940             case 0xFF90: // Start of tile-part (SOT)
   30941               length = readUint16(data, position);
   30942               var tile = {};
   30943               tile.index = readUint16(data, position + 2);
   30944               tile.length = readUint32(data, position + 4);
   30945               tile.dataEnd = tile.length + position - 2;
   30946               tile.partIndex = data[position + 8];
   30947               tile.partsCount = data[position + 9];
   30948 
   30949               context.mainHeader = false;
   30950               if (tile.partIndex == 0) {
   30951                 // reset component specific settings
   30952                 tile.COD = context.COD;
   30953                 tile.COC = context.COC.slice(0); // clone of the global COC
   30954                 tile.QCD = context.QCD;
   30955                 tile.QCC = context.QCC.slice(0); // clone of the global COC
   30956               }
   30957               context.currentTile = tile;
   30958               break;
   30959             case 0xFF93: // Start of data (SOD)
   30960               var tile = context.currentTile;
   30961               if (tile.partIndex == 0) {
   30962                 initializeTile(context, tile.index);
   30963                 buildPackets(context);
   30964               }
   30965 
   30966               // moving to the end of the data
   30967               length = tile.dataEnd - position;
   30968 
   30969               parseTilePackets(context, data, position, length);
   30970               break;
   30971             case 0xFF64: // Comment (COM)
   30972               length = readUint16(data, position);
   30973               // skipping content
   30974               break;
   30975             default:
   30976               throw 'Unknown codestream code: ' + code.toString(16);
   30977           }
   30978           position += length;
   30979         }
   30980       } catch (e) {
   30981         if (this.failOnCorruptedImage)
   30982           error('JPX error: ' + e);
   30983         else
   30984           warn('JPX error: ' + e + '. Trying to recover');
   30985       }
   30986       this.tiles = transformComponents(context);
   30987       this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
   30988       this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
   30989       this.componentsCount = context.SIZ.Csiz;
   30990     }
   30991   };
   30992   function readUint32(data, offset) {
   30993     return (data[offset] << 24) | (data[offset + 1] << 16) |
   30994       (data[offset + 2] << 8) | data[offset + 3];
   30995   }
   30996   function readUint16(data, offset) {
   30997     return (data[offset] << 8) | data[offset + 1];
   30998   }
   30999   function log2(x) {
   31000     var n = 1, i = 0;
   31001     while (x > n) {
   31002       n <<= 1;
   31003       i++;
   31004     }
   31005     return i;
   31006   }
   31007   function calculateComponentDimensions(component, siz) {
   31008     // Section B.2 Component mapping
   31009     component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
   31010     component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
   31011     component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
   31012     component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
   31013     component.width = component.x1 - component.x0;
   31014     component.height = component.y1 - component.y0;
   31015   }
   31016   function calculateTileGrids(context, components) {
   31017     var siz = context.SIZ;
   31018     // Section B.3 Division into tile and tile-components
   31019     var tiles = [];
   31020     var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
   31021     var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
   31022     for (var q = 0; q < numYtiles; q++) {
   31023       for (var p = 0; p < numXtiles; p++) {
   31024         var tile = {};
   31025         tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
   31026         tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
   31027         tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
   31028         tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
   31029         tile.width = tile.tx1 - tile.tx0;
   31030         tile.height = tile.ty1 - tile.ty0;
   31031         tile.components = [];
   31032         tiles.push(tile);
   31033       }
   31034     }
   31035     context.tiles = tiles;
   31036 
   31037     var componentsCount = siz.Csiz;
   31038     for (var i = 0, ii = componentsCount; i < ii; i++) {
   31039       var component = components[i];
   31040       var tileComponents = [];
   31041       for (var j = 0, jj = tiles.length; j < jj; j++) {
   31042         var tileComponent = {}, tile = tiles[j];
   31043         tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
   31044         tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
   31045         tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
   31046         tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
   31047         tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
   31048         tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
   31049         tile.components[i] = tileComponent;
   31050       }
   31051     }
   31052   }
   31053   function getBlocksDimensions(context, component, r) {
   31054     var codOrCoc = component.codingStyleParameters;
   31055     var result = {};
   31056     if (!codOrCoc.entropyCoderWithCustomPrecincts) {
   31057       result.PPx = 15;
   31058       result.PPy = 15;
   31059     } else {
   31060       result.PPx = codOrCoc.precinctsSizes[r].PPx;
   31061       result.PPy = codOrCoc.precinctsSizes[r].PPy;
   31062     }
   31063     // calculate codeblock size as described in section B.7
   31064     result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
   31065       Math.min(codOrCoc.xcb, result.PPx);
   31066     result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
   31067       Math.min(codOrCoc.ycb, result.PPy);
   31068     return result;
   31069   }
   31070   function buildPrecincts(context, resolution, dimensions) {
   31071     // Section B.6 Division resolution to precincts
   31072     var precinctWidth = 1 << dimensions.PPx;
   31073     var precinctHeight = 1 << dimensions.PPy;
   31074     var numprecinctswide = resolution.trx1 > resolution.trx0 ?
   31075       Math.ceil(resolution.trx1 / precinctWidth) -
   31076       Math.floor(resolution.trx0 / precinctWidth) : 0;
   31077     var numprecinctshigh = resolution.try1 > resolution.try0 ?
   31078       Math.ceil(resolution.try1 / precinctHeight) -
   31079       Math.floor(resolution.try0 / precinctHeight) : 0;
   31080     var numprecincts = numprecinctswide * numprecinctshigh;
   31081     var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) *
   31082       precinctWidth;
   31083     var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
   31084       precinctHeight;
   31085     resolution.precinctParameters = {
   31086       precinctXOffset: precinctXOffset,
   31087       precinctYOffset: precinctYOffset,
   31088       precinctWidth: precinctWidth,
   31089       precinctHeight: precinctHeight,
   31090       numprecinctswide: numprecinctswide,
   31091       numprecinctshigh: numprecinctshigh,
   31092       numprecincts: numprecincts
   31093     };
   31094   }
   31095   function buildCodeblocks(context, subband, dimensions) {
   31096     // Section B.7 Division sub-band into code-blocks
   31097     var xcb_ = dimensions.xcb_;
   31098     var ycb_ = dimensions.ycb_;
   31099     var codeblockWidth = 1 << xcb_;
   31100     var codeblockHeight = 1 << ycb_;
   31101     var cbx0 = Math.floor(subband.tbx0 / codeblockWidth);
   31102     var cby0 = Math.floor(subband.tby0 / codeblockHeight);
   31103     var cbx1 = Math.ceil(subband.tbx1 / codeblockWidth);
   31104     var cby1 = Math.ceil(subband.tby1 / codeblockHeight);
   31105     var precinctParameters = subband.resolution.precinctParameters;
   31106     var codeblocks = [];
   31107     var precincts = [];
   31108     for (var j = cby0; j < cby1; j++) {
   31109       for (var i = cbx0; i < cbx1; i++) {
   31110         var codeblock = {
   31111           cbx: i,
   31112           cby: j,
   31113           tbx0: codeblockWidth * i,
   31114           tby0: codeblockHeight * j,
   31115           tbx1: codeblockWidth * (i + 1),
   31116           tby1: codeblockHeight * (j + 1)
   31117         };
   31118         // calculate precinct number
   31119         var pi = Math.floor((codeblock.tbx0 -
   31120           precinctParameters.precinctXOffset) /
   31121           precinctParameters.precinctWidth);
   31122         var pj = Math.floor((codeblock.tby0 -
   31123           precinctParameters.precinctYOffset) /
   31124           precinctParameters.precinctHeight);
   31125         var precinctNumber = pj +
   31126           pi * precinctParameters.numprecinctswide;
   31127         codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
   31128         codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
   31129         codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
   31130         codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
   31131         codeblock.precinctNumber = precinctNumber;
   31132         codeblock.subbandType = subband.type;
   31133         var coefficientsLength = (codeblock.tbx1_ - codeblock.tbx0_) *
   31134           (codeblock.tby1_ - codeblock.tby0_);
   31135         codeblock.Lblock = 3;
   31136         codeblocks.push(codeblock);
   31137         // building precinct for the sub-band
   31138         var precinct;
   31139         if (precinctNumber in precincts) {
   31140           precinct = precincts[precinctNumber];
   31141           precinct.cbxMin = Math.min(precinct.cbxMin, i);
   31142           precinct.cbyMin = Math.min(precinct.cbyMin, j);
   31143           precinct.cbxMax = Math.max(precinct.cbxMax, i);
   31144           precinct.cbyMax = Math.max(precinct.cbyMax, j);
   31145         } else {
   31146           precincts[precinctNumber] = precinct = {
   31147             cbxMin: i,
   31148             cbyMin: j,
   31149             cbxMax: i,
   31150             cbyMax: j
   31151           };
   31152         }
   31153         codeblock.precinct = precinct;
   31154       }
   31155     }
   31156     subband.codeblockParameters = {
   31157       codeblockWidth: xcb_,
   31158       codeblockHeight: ycb_,
   31159       numcodeblockwide: cbx1 - cbx0 + 1,
   31160       numcodeblockhigh: cby1 - cby1 + 1
   31161     };
   31162     subband.codeblocks = codeblocks;
   31163     for (var i = 0, ii = codeblocks.length; i < ii; i++) {
   31164       var codeblock = codeblocks[i];
   31165       var precinctNumber = codeblock.precinctNumber;
   31166     }
   31167     subband.precincts = precincts;
   31168   }
   31169   function createPacket(resolution, precinctNumber, layerNumber) {
   31170     var precinctCodeblocks = [];
   31171     // Section B.10.8 Order of info in packet
   31172     var subbands = resolution.subbands;
   31173     // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
   31174     for (var i = 0, ii = subbands.length; i < ii; i++) {
   31175       var subband = subbands[i];
   31176       var codeblocks = subband.codeblocks;
   31177       for (var j = 0, jj = codeblocks.length; j < jj; j++) {
   31178         var codeblock = codeblocks[j];
   31179         if (codeblock.precinctNumber != precinctNumber)
   31180           continue;
   31181         precinctCodeblocks.push(codeblock);
   31182       }
   31183     }
   31184     return {
   31185       layerNumber: layerNumber,
   31186       codeblocks: precinctCodeblocks
   31187     };
   31188   }
   31189   function LayerResolutionComponentPositionIterator(context) {
   31190     var siz = context.SIZ;
   31191     var tileIndex = context.currentTile.index;
   31192     var tile = context.tiles[tileIndex];
   31193     var layersCount = tile.codingStyleDefaultParameters.layersCount;
   31194     var componentsCount = siz.Csiz;
   31195     var maxDecompositionLevelsCount = 0;
   31196     for (var q = 0; q < componentsCount; q++) {
   31197       maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
   31198         tile.components[q].codingStyleParameters.decompositionLevelsCount);
   31199     }
   31200 
   31201     var l = 0, r = 0, i = 0, k = 0;
   31202 
   31203     this.nextPacket = function JpxImage_nextPacket() {
   31204       // Section B.12.1.1 Layer-resolution-component-position
   31205       for (; l < layersCount; l++) {
   31206         for (; r <= maxDecompositionLevelsCount; r++) {
   31207           for (; i < componentsCount; i++) {
   31208             var component = tile.components[i];
   31209             if (r > component.codingStyleParameters.decompositionLevelsCount)
   31210               continue;
   31211 
   31212             var resolution = component.resolutions[r];
   31213             var numprecincts = resolution.precinctParameters.numprecincts;
   31214             for (; k < numprecincts;) {
   31215               var packet = createPacket(resolution, k, l);
   31216               k++;
   31217               return packet;
   31218             }
   31219             k = 0;
   31220           }
   31221           i = 0;
   31222         }
   31223         r = 0;
   31224       }
   31225       throw 'Out of packets';
   31226     };
   31227   }
   31228   function ResolutionLayerComponentPositionIterator(context) {
   31229     var siz = context.SIZ;
   31230     var tileIndex = context.currentTile.index;
   31231     var tile = context.tiles[tileIndex];
   31232     var layersCount = tile.codingStyleDefaultParameters.layersCount;
   31233     var componentsCount = siz.Csiz;
   31234     var maxDecompositionLevelsCount = 0;
   31235     for (var q = 0; q < componentsCount; q++) {
   31236       maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
   31237         tile.components[q].codingStyleParameters.decompositionLevelsCount);
   31238     }
   31239 
   31240     var r = 0, l = 0, i = 0, k = 0;
   31241 
   31242     this.nextPacket = function JpxImage_nextPacket() {
   31243       // Section B.12.1.2 Resolution-layer-component-position
   31244       for (; r <= maxDecompositionLevelsCount; r++) {
   31245         for (; l < layersCount; l++) {
   31246           for (; i < componentsCount; i++) {
   31247             var component = tile.components[i];
   31248             if (r > component.codingStyleParameters.decompositionLevelsCount)
   31249               continue;
   31250 
   31251             var resolution = component.resolutions[r];
   31252             var numprecincts = resolution.precinctParameters.numprecincts;
   31253             for (; k < numprecincts;) {
   31254               var packet = createPacket(resolution, k, l);
   31255               k++;
   31256               return packet;
   31257             }
   31258             k = 0;
   31259           }
   31260           i = 0;
   31261         }
   31262         l = 0;
   31263       }
   31264       throw 'Out of packets';
   31265     };
   31266   }
   31267   function buildPackets(context) {
   31268     var siz = context.SIZ;
   31269     var tileIndex = context.currentTile.index;
   31270     var tile = context.tiles[tileIndex];
   31271     var componentsCount = siz.Csiz;
   31272     // Creating resolutions and sub-bands for each component
   31273     for (var c = 0; c < componentsCount; c++) {
   31274       var component = tile.components[c];
   31275       var decompositionLevelsCount =
   31276         component.codingStyleParameters.decompositionLevelsCount;
   31277       // Section B.5 Resolution levels and sub-bands
   31278       var resolutions = [];
   31279       var subbands = [];
   31280       for (var r = 0; r <= decompositionLevelsCount; r++) {
   31281         var blocksDimensions = getBlocksDimensions(context, component, r);
   31282         var resolution = {};
   31283         var scale = 1 << (decompositionLevelsCount - r);
   31284         resolution.trx0 = Math.ceil(component.tcx0 / scale);
   31285         resolution.try0 = Math.ceil(component.tcy0 / scale);
   31286         resolution.trx1 = Math.ceil(component.tcx1 / scale);
   31287         resolution.try1 = Math.ceil(component.tcy1 / scale);
   31288         buildPrecincts(context, resolution, blocksDimensions);
   31289         resolutions.push(resolution);
   31290 
   31291         var subband;
   31292         if (r == 0) {
   31293           // one sub-band (LL) with last decomposition
   31294           subband = {};
   31295           subband.type = 'LL';
   31296           subband.tbx0 = Math.ceil(component.tcx0 / scale);
   31297           subband.tby0 = Math.ceil(component.tcy0 / scale);
   31298           subband.tbx1 = Math.ceil(component.tcx1 / scale);
   31299           subband.tby1 = Math.ceil(component.tcy1 / scale);
   31300           subband.resolution = resolution;
   31301           buildCodeblocks(context, subband, blocksDimensions);
   31302           subbands.push(subband);
   31303           resolution.subbands = [subband];
   31304         } else {
   31305           var bscale = 1 << (decompositionLevelsCount - r + 1);
   31306           var resolutionSubbands = [];
   31307           // three sub-bands (HL, LH and HH) with rest of decompositions
   31308           subband = {};
   31309           subband.type = 'HL';
   31310           subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
   31311           subband.tby0 = Math.ceil(component.tcy0 / bscale);
   31312           subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
   31313           subband.tby1 = Math.ceil(component.tcy1 / bscale);
   31314           subband.resolution = resolution;
   31315           buildCodeblocks(context, subband, blocksDimensions);
   31316           subbands.push(subband);
   31317           resolutionSubbands.push(subband);
   31318 
   31319           subband = {};
   31320           subband.type = 'LH';
   31321           subband.tbx0 = Math.ceil(component.tcx0 / bscale);
   31322           subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
   31323           subband.tbx1 = Math.ceil(component.tcx1 / bscale);
   31324           subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
   31325           subband.resolution = resolution;
   31326           buildCodeblocks(context, subband, blocksDimensions);
   31327           subbands.push(subband);
   31328           resolutionSubbands.push(subband);
   31329 
   31330           subband = {};
   31331           subband.type = 'HH';
   31332           subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
   31333           subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
   31334           subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
   31335           subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
   31336           subband.resolution = resolution;
   31337           buildCodeblocks(context, subband, blocksDimensions);
   31338           subbands.push(subband);
   31339           resolutionSubbands.push(subband);
   31340 
   31341           resolution.subbands = resolutionSubbands;
   31342         }
   31343       }
   31344       component.resolutions = resolutions;
   31345       component.subbands = subbands;
   31346     }
   31347     // Generate the packets sequence
   31348     var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
   31349     var packetsIterator;
   31350     switch (progressionOrder) {
   31351       case 0:
   31352         tile.packetsIterator =
   31353           new LayerResolutionComponentPositionIterator(context);
   31354         break;
   31355       case 1:
   31356         tile.packetsIterator =
   31357           new ResolutionLayerComponentPositionIterator(context);
   31358         break;
   31359       default:
   31360         throw 'Unsupported progression order ' + progressionOrder;
   31361     }
   31362   }
   31363   function parseTilePackets(context, data, offset, dataLength) {
   31364     var position = 0;
   31365     var buffer, bufferSize = 0, skipNextBit = false;
   31366     function readBits(count) {
   31367       while (bufferSize < count) {
   31368         var b = data[offset + position];
   31369         position++;
   31370         if (skipNextBit) {
   31371           buffer = (buffer << 7) | b;
   31372           bufferSize += 7;
   31373           skipNextBit = false;
   31374         } else {
   31375           buffer = (buffer << 8) | b;
   31376           bufferSize += 8;
   31377         }
   31378         if (b == 0xFF) {
   31379           skipNextBit = true;
   31380         }
   31381       }
   31382       bufferSize -= count;
   31383       return (buffer >>> bufferSize) & ((1 << count) - 1);
   31384     }
   31385     function alignToByte() {
   31386       bufferSize = 0;
   31387       if (skipNextBit) {
   31388         position++;
   31389         skipNextBit = false;
   31390       }
   31391     }
   31392     function readCodingpasses() {
   31393       var value = readBits(1);
   31394       if (value == 0)
   31395         return 1;
   31396       value = (value << 1) | readBits(1);
   31397       if (value == 0x02)
   31398         return 2;
   31399       value = (value << 2) | readBits(2);
   31400       if (value <= 0x0E)
   31401         return (value & 0x03) + 3;
   31402       value = (value << 5) | readBits(5);
   31403       if (value <= 0x1FE)
   31404         return (value & 0x1F) + 6;
   31405       value = (value << 7) | readBits(7);
   31406       return (value & 0x7F) + 37;
   31407     }
   31408     var tileIndex = context.currentTile.index;
   31409     var tile = context.tiles[tileIndex];
   31410     var packetsIterator = tile.packetsIterator;
   31411     while (position < dataLength) {
   31412       var packet = packetsIterator.nextPacket();
   31413       if (!readBits(1)) {
   31414         alignToByte();
   31415         continue;
   31416       }
   31417       var layerNumber = packet.layerNumber;
   31418       var queue = [];
   31419       for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
   31420         var codeblock = packet.codeblocks[i];
   31421         var precinct = codeblock.precinct;
   31422         var codeblockColumn = codeblock.cbx - precinct.cbxMin;
   31423         var codeblockRow = codeblock.cby - precinct.cbyMin;
   31424         var codeblockIncluded = false;
   31425         var firstTimeInclusion = false;
   31426         if ('included' in codeblock) {
   31427           codeblockIncluded = !!readBits(1);
   31428         } else {
   31429           // reading inclusion tree
   31430           var precinct = codeblock.precinct;
   31431           var inclusionTree, zeroBitPlanesTree;
   31432           if ('inclusionTree' in precinct) {
   31433             inclusionTree = precinct.inclusionTree;
   31434           } else {
   31435             // building inclusion and zero bit-planes trees
   31436             var width = precinct.cbxMax - precinct.cbxMin + 1;
   31437             var height = precinct.cbyMax - precinct.cbyMin + 1;
   31438             inclusionTree = new InclusionTree(width, height, layerNumber);
   31439             zeroBitPlanesTree = new TagTree(width, height);
   31440             precinct.inclusionTree = inclusionTree;
   31441             precinct.zeroBitPlanesTree = zeroBitPlanesTree;
   31442           }
   31443 
   31444           if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
   31445             while (true) {
   31446               if (readBits(1)) {
   31447                 var valueReady = !inclusionTree.nextLevel();
   31448                 if (valueReady) {
   31449                   codeblock.included = true;
   31450                   codeblockIncluded = firstTimeInclusion = true;
   31451                   break;
   31452                 }
   31453               } else {
   31454                 inclusionTree.incrementValue(layerNumber);
   31455                 break;
   31456               }
   31457             }
   31458           }
   31459         }
   31460         if (!codeblockIncluded)
   31461           continue;
   31462         if (firstTimeInclusion) {
   31463           zeroBitPlanesTree = precinct.zeroBitPlanesTree;
   31464           zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
   31465           while (true) {
   31466             if (readBits(1)) {
   31467               var valueReady = !zeroBitPlanesTree.nextLevel();
   31468               if (valueReady)
   31469                 break;
   31470             } else
   31471               zeroBitPlanesTree.incrementValue();
   31472           }
   31473           codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
   31474         }
   31475         var codingpasses = readCodingpasses();
   31476         while (readBits(1))
   31477           codeblock.Lblock++;
   31478         var codingpassesLog2 = log2(codingpasses);
   31479         // rounding down log2
   31480         var bits = ((codingpasses < (1 << codingpassesLog2)) ?
   31481           codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
   31482         var codedDataLength = readBits(bits);
   31483         queue.push({
   31484           codeblock: codeblock,
   31485           codingpasses: codingpasses,
   31486           dataLength: codedDataLength
   31487         });
   31488       }
   31489       alignToByte();
   31490       while (queue.length > 0) {
   31491         var packetItem = queue.shift();
   31492         var codeblock = packetItem.codeblock;
   31493         if (!('data' in codeblock))
   31494           codeblock.data = [];
   31495         codeblock.data.push({
   31496           data: data,
   31497           start: offset + position,
   31498           end: offset + position + packetItem.dataLength,
   31499           codingpasses: packetItem.codingpasses
   31500         });
   31501         position += packetItem.dataLength;
   31502       }
   31503     }
   31504     return position;
   31505   }
   31506   function copyCoefficients(coefficients, x0, y0, width, height,
   31507                             delta, mb, codeblocks, transformation) {
   31508     var r = 0.5; // formula (E-6)
   31509     for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
   31510       var codeblock = codeblocks[i];
   31511       var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
   31512       var blockHeight = codeblock.tby1_ - codeblock.tby0_;
   31513       if (blockWidth == 0 || blockHeight == 0)
   31514         continue;
   31515       if (!('data' in codeblock))
   31516         continue;
   31517 
   31518       var bitModel, currentCodingpassType;
   31519       bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
   31520         codeblock.zeroBitPlanes);
   31521       currentCodingpassType = 2; // first bit plane starts from cleanup
   31522 
   31523       // collect data
   31524       var data = codeblock.data, totalLength = 0, codingpasses = 0;
   31525       for (var q = 0, qq = data.length; q < qq; q++) {
   31526         var dataItem = data[q];
   31527         totalLength += dataItem.end - dataItem.start;
   31528         codingpasses += dataItem.codingpasses;
   31529       }
   31530       var encodedData = new Uint8Array(totalLength), k = 0;
   31531       for (var q = 0, qq = data.length; q < qq; q++) {
   31532         var dataItem = data[q];
   31533         var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
   31534         encodedData.set(chunk, k);
   31535         k += chunk.length;
   31536       }
   31537       // decoding the item
   31538       var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
   31539       bitModel.setDecoder(decoder);
   31540 
   31541       for (var q = 0; q < codingpasses; q++) {
   31542         switch (currentCodingpassType) {
   31543           case 0:
   31544             bitModel.runSignificancePropogationPass();
   31545             break;
   31546           case 1:
   31547             bitModel.runMagnitudeRefinementPass();
   31548             break;
   31549           case 2:
   31550             bitModel.runCleanupPass();
   31551             break;
   31552         }
   31553         currentCodingpassType = (currentCodingpassType + 1) % 3;
   31554       }
   31555 
   31556       var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
   31557       var position = 0;
   31558       for (var j = 0; j < blockHeight; j++) {
   31559         for (var k = 0; k < blockWidth; k++) {
   31560           var n = (bitModel.coefficentsSign[position] ? -1 : 1) *
   31561             bitModel.coefficentsMagnitude[position];
   31562           var nb = bitModel.bitsDecoded[position], correction;
   31563           if (transformation == 0 || mb > nb) {
   31564             // use r only if transformation is irreversible or
   31565             // not all bitplanes were decoded for reversible transformation
   31566             n += n < 0 ? n - r : n > 0 ? n + r : 0;
   31567             correction = 1 << (mb - nb);
   31568           } else
   31569             correction = 1;
   31570           coefficients[offset++] = n * correction * delta;
   31571           position++;
   31572         }
   31573         offset += width - blockWidth;
   31574       }
   31575     }
   31576   }
   31577   function transformTile(context, tile, c) {
   31578     var component = tile.components[c];
   31579     var codingStyleParameters = component.codingStyleParameters;
   31580     var quantizationParameters = component.quantizationParameters;
   31581     var decompositionLevelsCount =
   31582       codingStyleParameters.decompositionLevelsCount;
   31583     var spqcds = quantizationParameters.SPqcds;
   31584     var scalarExpounded = quantizationParameters.scalarExpounded;
   31585     var guardBits = quantizationParameters.guardBits;
   31586     var transformation = codingStyleParameters.transformation;
   31587     var precision = context.components[c].precision;
   31588 
   31589     var subbandCoefficients = [];
   31590     var k = 0, b = 0;
   31591     for (var i = 0; i <= decompositionLevelsCount; i++) {
   31592       var resolution = component.resolutions[i];
   31593 
   31594       for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
   31595         var mu, epsilon;
   31596         if (!scalarExpounded) {
   31597           // formula E-5
   31598           mu = spqcds[0].mu;
   31599           epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
   31600         } else {
   31601           mu = spqcds[b].mu;
   31602           epsilon = spqcds[b].epsilon;
   31603         }
   31604 
   31605         var subband = resolution.subbands[j];
   31606         var width = subband.tbx1 - subband.tbx0;
   31607         var height = subband.tby1 - subband.tby0;
   31608         var gainLog2 = SubbandsGainLog2[subband.type];
   31609 
   31610         // calulate quantization coefficient (Section E.1.1.1)
   31611         var delta = Math.pow(2, (precision + gainLog2) - epsilon) *
   31612           (1 + mu / 2048);
   31613         var mb = (guardBits + epsilon - 1);
   31614 
   31615         var coefficients = new Float32Array(width * height);
   31616         copyCoefficients(coefficients, subband.tbx0, subband.tby0,
   31617           width, height, delta, mb, subband.codeblocks, transformation);
   31618 
   31619         subbandCoefficients.push({
   31620           width: width,
   31621           height: height,
   31622           items: coefficients
   31623         });
   31624 
   31625         b++;
   31626       }
   31627     }
   31628 
   31629     var transformation = codingStyleParameters.transformation;
   31630     var transform = transformation == 0 ? new IrreversibleTransform() :
   31631       new ReversibleTransform();
   31632     var result = transform.calculate(subbandCoefficients,
   31633       component.tcx0, component.tcy0);
   31634     return {
   31635       left: component.tcx0,
   31636       top: component.tcy0,
   31637       width: result.width,
   31638       height: result.height,
   31639       items: result.items
   31640     };
   31641   }
   31642   function transformComponents(context) {
   31643     var siz = context.SIZ;
   31644     var components = context.components;
   31645     var componentsCount = siz.Csiz;
   31646     var resultImages = [];
   31647     for (var i = 0, ii = context.tiles.length; i < ii; i++) {
   31648       var tile = context.tiles[i];
   31649       var result = [];
   31650       for (var c = 0; c < componentsCount; c++) {
   31651         var image = transformTile(context, tile, c);
   31652         result.push(image);
   31653       }
   31654 
   31655       // Section G.2.2 Inverse multi component transform
   31656       if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
   31657         var y0items = result[0].items;
   31658         var y1items = result[1].items;
   31659         var y2items = result[2].items;
   31660         for (var j = 0, jj = y0items.length; j < jj; j++) {
   31661           var y0 = y0items[j], y1 = y1items[j], y2 = y2items[j];
   31662           var i1 = y0 - ((y2 + y1) >> 2);
   31663           y1items[j] = i1;
   31664           y0items[j] = y2 + i1;
   31665           y2items[j] = y1 + i1;
   31666         }
   31667       }
   31668 
   31669       // Section G.1 DC level shifting to unsigned component values
   31670       for (var c = 0; c < componentsCount; c++) {
   31671         var component = components[c];
   31672         if (component.isSigned)
   31673           continue;
   31674 
   31675         var offset = 1 << (component.precision - 1);
   31676         var tileImage = result[c];
   31677         var items = tileImage.items;
   31678         for (var j = 0, jj = items.length; j < jj; j++)
   31679           items[j] += offset;
   31680       }
   31681 
   31682       // To simplify things: shift and clamp output to 8 bit unsigned
   31683       for (var c = 0; c < componentsCount; c++) {
   31684         var component = components[c];
   31685         var offset = component.isSigned ? 128 : 0;
   31686         var shift = component.precision - 8;
   31687         var tileImage = result[c];
   31688         var items = tileImage.items;
   31689         var data = new Uint8Array(items.length);
   31690         for (var j = 0, jj = items.length; j < jj; j++) {
   31691           var value = (items[j] >> shift) + offset;
   31692           data[j] = value < 0 ? 0 : value > 255 ? 255 : value;
   31693         }
   31694         result[c].items = data;
   31695       }
   31696 
   31697       resultImages.push(result);
   31698     }
   31699     return resultImages;
   31700   }
   31701   function initializeTile(context, tileIndex) {
   31702     var siz = context.SIZ;
   31703     var componentsCount = siz.Csiz;
   31704     var tile = context.tiles[tileIndex];
   31705     var resultTiles = [];
   31706     for (var c = 0; c < componentsCount; c++) {
   31707       var component = tile.components[c];
   31708       var qcdOrQcc = c in context.currentTile.QCC ?
   31709         context.currentTile.QCC[c] : context.currentTile.QCD;
   31710       component.quantizationParameters = qcdOrQcc;
   31711       var codOrCoc = c in context.currentTile.COC ?
   31712         context.currentTile.COC[c] : context.currentTile.COD;
   31713       component.codingStyleParameters = codOrCoc;
   31714     }
   31715     tile.codingStyleDefaultParameters = context.currentTile.COD;
   31716   }
   31717 
   31718   // Section B.10.2 Tag trees
   31719   var TagTree = (function TagTreeClosure() {
   31720     function TagTree(width, height) {
   31721       var levelsLength = log2(Math.max(width, height)) + 1;
   31722       this.levels = [];
   31723       for (var i = 0; i < levelsLength; i++) {
   31724         var level = {
   31725           width: width,
   31726           height: height,
   31727           items: []
   31728         };
   31729         this.levels.push(level);
   31730         width = Math.ceil(width / 2);
   31731         height = Math.ceil(height / 2);
   31732       }
   31733     }
   31734     TagTree.prototype = {
   31735       reset: function TagTree_reset(i, j) {
   31736         var currentLevel = 0, value = 0;
   31737         while (currentLevel < this.levels.length) {
   31738           var level = this.levels[currentLevel];
   31739           var index = i + j * level.width;
   31740           if (index in level.items) {
   31741             value = level.items[index];
   31742             break;
   31743           }
   31744           level.index = index;
   31745           i >>= 1;
   31746           j >>= 1;
   31747           currentLevel++;
   31748         }
   31749         currentLevel--;
   31750         var level = this.levels[currentLevel];
   31751         level.items[level.index] = value;
   31752         this.currentLevel = currentLevel;
   31753         delete this.value;
   31754       },
   31755       incrementValue: function TagTree_incrementValue() {
   31756         var level = this.levels[this.currentLevel];
   31757         level.items[level.index]++;
   31758       },
   31759       nextLevel: function TagTree_nextLevel() {
   31760         var currentLevel = this.currentLevel;
   31761         var level = this.levels[currentLevel];
   31762         var value = level.items[level.index];
   31763         currentLevel--;
   31764         if (currentLevel < 0) {
   31765           this.value = value;
   31766           return false;
   31767         }
   31768 
   31769         this.currentLevel = currentLevel;
   31770         var level = this.levels[currentLevel];
   31771         level.items[level.index] = value;
   31772         return true;
   31773       }
   31774     };
   31775     return TagTree;
   31776   })();
   31777 
   31778   var InclusionTree = (function InclusionTreeClosure() {
   31779     function InclusionTree(width, height,  defaultValue) {
   31780       var levelsLength = log2(Math.max(width, height)) + 1;
   31781       this.levels = [];
   31782       for (var i = 0; i < levelsLength; i++) {
   31783         var items = new Uint8Array(width * height);
   31784         for (var j = 0, jj = items.length; j < jj; j++)
   31785           items[j] = defaultValue;
   31786 
   31787         var level = {
   31788           width: width,
   31789           height: height,
   31790           items: items
   31791         };
   31792         this.levels.push(level);
   31793 
   31794         width = Math.ceil(width / 2);
   31795         height = Math.ceil(height / 2);
   31796       }
   31797     }
   31798     InclusionTree.prototype = {
   31799       reset: function InclusionTree_reset(i, j, stopValue) {
   31800         var currentLevel = 0;
   31801         while (currentLevel < this.levels.length) {
   31802           var level = this.levels[currentLevel];
   31803           var index = i + j * level.width;
   31804           level.index = index;
   31805           var value = level.items[index];
   31806 
   31807           if (value == 0xFF)
   31808             break;
   31809 
   31810           if (value > stopValue) {
   31811             this.currentLevel = currentLevel;
   31812             // already know about this one, propagating the value to top levels
   31813             this.propagateValues();
   31814             return false;
   31815           }
   31816 
   31817           i >>= 1;
   31818           j >>= 1;
   31819           currentLevel++;
   31820         }
   31821         this.currentLevel = currentLevel - 1;
   31822         return true;
   31823       },
   31824       incrementValue: function InclusionTree_incrementValue(stopValue) {
   31825         var level = this.levels[this.currentLevel];
   31826         level.items[level.index] = stopValue + 1;
   31827         this.propagateValues();
   31828       },
   31829       propagateValues: function InclusionTree_propagateValues() {
   31830         var levelIndex = this.currentLevel;
   31831         var level = this.levels[levelIndex];
   31832         var currentValue = level.items[level.index];
   31833         while (--levelIndex >= 0) {
   31834           var level = this.levels[levelIndex];
   31835           level.items[level.index] = currentValue;
   31836         }
   31837       },
   31838       nextLevel: function InclusionTree_nextLevel() {
   31839         var currentLevel = this.currentLevel;
   31840         var level = this.levels[currentLevel];
   31841         var value = level.items[level.index];
   31842         level.items[level.index] = 0xFF;
   31843         currentLevel--;
   31844         if (currentLevel < 0)
   31845           return false;
   31846 
   31847         this.currentLevel = currentLevel;
   31848         var level = this.levels[currentLevel];
   31849         level.items[level.index] = value;
   31850         return true;
   31851       }
   31852     };
   31853     return InclusionTree;
   31854   })();
   31855 
   31856   // Implements C.3. Arithmetic decoding procedures
   31857   var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
   31858     var QeTable = [
   31859       {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
   31860       {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
   31861       {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
   31862       {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
   31863       {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
   31864       {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
   31865       {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
   31866       {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
   31867       {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
   31868       {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
   31869       {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
   31870       {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
   31871       {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
   31872       {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
   31873       {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
   31874       {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
   31875       {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
   31876       {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
   31877       {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
   31878       {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
   31879       {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
   31880       {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
   31881       {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
   31882       {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
   31883       {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
   31884       {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
   31885       {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
   31886       {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
   31887       {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
   31888       {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
   31889       {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
   31890       {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
   31891       {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
   31892       {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
   31893       {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
   31894       {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
   31895       {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
   31896       {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
   31897       {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
   31898       {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
   31899       {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
   31900       {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
   31901       {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
   31902       {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
   31903       {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
   31904       {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
   31905       {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
   31906     ];
   31907 
   31908     function ArithmeticDecoder(data, start, end) {
   31909       this.data = data;
   31910       this.bp = start;
   31911       this.dataEnd = end;
   31912 
   31913       this.chigh = data[start];
   31914       this.clow = 0;
   31915 
   31916       this.byteIn();
   31917 
   31918       this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
   31919       this.clow = (this.clow << 7) & 0xFFFF;
   31920       this.ct -= 7;
   31921       this.a = 0x8000;
   31922     }
   31923 
   31924     ArithmeticDecoder.prototype = {
   31925       byteIn: function ArithmeticDecoder_byteIn() {
   31926         var data = this.data;
   31927         var bp = this.bp;
   31928         if (data[bp] == 0xFF) {
   31929           var b1 = data[bp + 1];
   31930           if (b1 > 0x8F) {
   31931             this.clow += 0xFF00;
   31932             this.ct = 8;
   31933           } else {
   31934             bp++;
   31935             this.clow += (data[bp] << 9);
   31936             this.ct = 7;
   31937             this.bp = bp;
   31938           }
   31939         } else {
   31940           bp++;
   31941           this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
   31942           this.ct = 8;
   31943           this.bp = bp;
   31944         }
   31945         if (this.clow > 0xFFFF) {
   31946           this.chigh += (this.clow >> 16);
   31947           this.clow &= 0xFFFF;
   31948         }
   31949       },
   31950       readBit: function ArithmeticDecoder_readBit(cx) {
   31951         var qeIcx = QeTable[cx.index].qe;
   31952         this.a -= qeIcx;
   31953 
   31954         if (this.chigh < qeIcx) {
   31955           var d = this.exchangeLps(cx);
   31956           this.renormD();
   31957           return d;
   31958         } else {
   31959           this.chigh -= qeIcx;
   31960           if ((this.a & 0x8000) == 0) {
   31961             var d = this.exchangeMps(cx);
   31962             this.renormD();
   31963             return d;
   31964           } else {
   31965             return cx.mps;
   31966           }
   31967         }
   31968       },
   31969       renormD: function ArithmeticDecoder_renormD() {
   31970         do {
   31971           if (this.ct == 0)
   31972             this.byteIn();
   31973 
   31974           this.a <<= 1;
   31975           this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
   31976           this.clow = (this.clow << 1) & 0xFFFF;
   31977           this.ct--;
   31978         } while ((this.a & 0x8000) == 0);
   31979       },
   31980       exchangeMps: function ArithmeticDecoder_exchangeMps(cx) {
   31981         var d;
   31982         var qeTableIcx = QeTable[cx.index];
   31983         if (this.a < qeTableIcx.qe) {
   31984           d = 1 - cx.mps;
   31985 
   31986           if (qeTableIcx.switchFlag == 1) {
   31987             cx.mps = 1 - cx.mps;
   31988           }
   31989           cx.index = qeTableIcx.nlps;
   31990         } else {
   31991           d = cx.mps;
   31992           cx.index = qeTableIcx.nmps;
   31993         }
   31994         return d;
   31995       },
   31996       exchangeLps: function ArithmeticDecoder_exchangeLps(cx) {
   31997         var d;
   31998         var qeTableIcx = QeTable[cx.index];
   31999         if (this.a < qeTableIcx.qe) {
   32000           this.a = qeTableIcx.qe;
   32001           d = cx.mps;
   32002           cx.index = qeTableIcx.nmps;
   32003         } else {
   32004           this.a = qeTableIcx.qe;
   32005           d = 1 - cx.mps;
   32006 
   32007           if (qeTableIcx.switchFlag == 1) {
   32008             cx.mps = 1 - cx.mps;
   32009           }
   32010           cx.index = qeTableIcx.nlps;
   32011         }
   32012         return d;
   32013       }
   32014     };
   32015 
   32016     return ArithmeticDecoder;
   32017   })();
   32018 
   32019   // Section D. Coefficient bit modeling
   32020   var BitModel = (function BitModelClosure() {
   32021     // Table D-1
   32022     // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
   32023     // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
   32024     var LLAndLHContextsLabel = new Uint8Array([
   32025       0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,
   32026       7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,
   32027       8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8
   32028     ]);
   32029     var HLContextLabel = new Uint8Array([
   32030       0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,
   32031       8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,
   32032       4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8
   32033     ]);
   32034     var HHContextLabel = new Uint8Array([
   32035       0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,
   32036       5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,
   32037       8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8
   32038     ]);
   32039 
   32040     // Table D-2
   32041     function calcSignContribution(significance0, sign0, significance1, sign1) {
   32042       if (significance1) {
   32043         if (!sign1)
   32044           return significance0 ? (!sign0 ? 1 : 0) : 1;
   32045         else
   32046           return significance0 ? (!sign0 ? 0 : -1) : -1;
   32047       } else
   32048         return significance0 ? (!sign0 ? 1 : -1) : 0;
   32049     }
   32050     // Table D-3
   32051     var SignContextLabels = [
   32052       {contextLabel: 13, xorBit: 0},
   32053       {contextLabel: 12, xorBit: 0},
   32054       {contextLabel: 11, xorBit: 0},
   32055       {contextLabel: 10, xorBit: 0},
   32056       {contextLabel: 9, xorBit: 0},
   32057       {contextLabel: 10, xorBit: 1},
   32058       {contextLabel: 11, xorBit: 1},
   32059       {contextLabel: 12, xorBit: 1},
   32060       {contextLabel: 13, xorBit: 1}
   32061     ];
   32062 
   32063     function BitModel(width, height, subband, zeroBitPlanes) {
   32064       this.width = width;
   32065       this.height = height;
   32066 
   32067       this.contextLabelTable = subband == 'HH' ? HHContextLabel :
   32068         subband == 'HL' ? HLContextLabel : LLAndLHContextsLabel;
   32069 
   32070       var coefficientCount = width * height;
   32071 
   32072       // coefficients outside the encoding region treated as insignificant
   32073       // add border state cells for significanceState
   32074       this.neighborsSignificance = new Uint8Array(coefficientCount);
   32075       this.coefficentsSign = new Uint8Array(coefficientCount);
   32076       this.coefficentsMagnitude = new Uint32Array(coefficientCount);
   32077       this.processingFlags = new Uint8Array(coefficientCount);
   32078 
   32079       var bitsDecoded = new Uint8Array(this.width * this.height);
   32080       for (var i = 0, ii = bitsDecoded.length; i < ii; i++)
   32081         bitsDecoded[i] = zeroBitPlanes;
   32082       this.bitsDecoded = bitsDecoded;
   32083 
   32084       this.reset();
   32085     }
   32086 
   32087     BitModel.prototype = {
   32088       setDecoder: function BitModel_setDecoder(decoder) {
   32089         this.decoder = decoder;
   32090       },
   32091       reset: function BitModel_reset() {
   32092         this.uniformContext = {index: 46, mps: 0};
   32093         this.runLengthContext = {index: 3, mps: 0};
   32094         this.contexts = [];
   32095         this.contexts.push({index: 4, mps: 0});
   32096         for (var i = 1; i <= 16; i++)
   32097           this.contexts.push({index: 0, mps: 0});
   32098       },
   32099       setNeighborsSignificance:
   32100         function BitModel_setNeighborsSignificance(row, column) {
   32101         var neighborsSignificance = this.neighborsSignificance;
   32102         var width = this.width, height = this.height;
   32103         var index = row * width + column;
   32104         if (row > 0) {
   32105           if (column > 0)
   32106             neighborsSignificance[index - width - 1] += 0x10;
   32107           if (column + 1 < width)
   32108             neighborsSignificance[index - width + 1] += 0x10;
   32109           neighborsSignificance[index - width] += 0x04;
   32110         }
   32111         if (row + 1 < height) {
   32112           if (column > 0)
   32113             neighborsSignificance[index + width - 1] += 0x10;
   32114           if (column + 1 < width)
   32115             neighborsSignificance[index + width + 1] += 0x10;
   32116           neighborsSignificance[index + width] += 0x04;
   32117         }
   32118         if (column > 0)
   32119           neighborsSignificance[index - 1] += 0x01;
   32120         if (column + 1 < width)
   32121           neighborsSignificance[index + 1] += 0x01;
   32122         neighborsSignificance[index] |= 0x80;
   32123       },
   32124       runSignificancePropogationPass:
   32125         function BitModel_runSignificancePropogationPass() {
   32126         var decoder = this.decoder;
   32127         var width = this.width, height = this.height;
   32128         var coefficentsMagnitude = this.coefficentsMagnitude;
   32129         var coefficentsSign = this.coefficentsSign;
   32130         var contextLabels = this.contextLabels;
   32131         var neighborsSignificance = this.neighborsSignificance;
   32132         var processingFlags = this.processingFlags;
   32133         var contexts = this.contexts;
   32134         var labels = this.contextLabelTable;
   32135         var bitsDecoded = this.bitsDecoded;
   32136         // clear processed flag
   32137         var processedInverseMask = ~1;
   32138         var processedMask = 1;
   32139         var firstMagnitudeBitMask = 2;
   32140         for (var q = 0, qq = width * height; q < qq; q++)
   32141           processingFlags[q] &= processedInverseMask;
   32142 
   32143         for (var i0 = 0; i0 < height; i0 += 4) {
   32144           for (var j = 0; j < width; j++) {
   32145             var index = i0 * width + j;
   32146             for (var i1 = 0; i1 < 4; i1++, index += width) {
   32147               var i = i0 + i1;
   32148               if (i >= height)
   32149                 break;
   32150 
   32151               if (coefficentsMagnitude[index] || !neighborsSignificance[index])
   32152                 continue;
   32153 
   32154               var contextLabel = labels[neighborsSignificance[index]];
   32155               var cx = contexts[contextLabel];
   32156               var decision = decoder.readBit(cx);
   32157               if (decision) {
   32158                 var sign = this.decodeSignBit(i, j);
   32159                 coefficentsSign[index] = sign;
   32160                 coefficentsMagnitude[index] = 1;
   32161                 this.setNeighborsSignificance(i, j);
   32162                 processingFlags[index] |= firstMagnitudeBitMask;
   32163               }
   32164               bitsDecoded[index]++;
   32165               processingFlags[index] |= processedMask;
   32166             }
   32167           }
   32168         }
   32169       },
   32170       decodeSignBit: function BitModel_decodeSignBit(row, column) {
   32171         var width = this.width, height = this.height;
   32172         var index = row * width + column;
   32173         var coefficentsMagnitude = this.coefficentsMagnitude;
   32174         var coefficentsSign = this.coefficentsSign;
   32175         var horizontalContribution = calcSignContribution(
   32176           column > 0 && coefficentsMagnitude[index - 1],
   32177           coefficentsSign[index - 1],
   32178           column + 1 < width && coefficentsMagnitude[index + 1],
   32179           coefficentsSign[index + 1]);
   32180         var verticalContribution = calcSignContribution(
   32181           row > 0 && coefficentsMagnitude[index - width],
   32182           coefficentsSign[index - width],
   32183           row + 1 < height && coefficentsMagnitude[index + width],
   32184           coefficentsSign[index + width]);
   32185 
   32186         var contextLabelAndXor = SignContextLabels[
   32187           3 * (1 - horizontalContribution) + (1 - verticalContribution)];
   32188         var contextLabel = contextLabelAndXor.contextLabel;
   32189         var cx = this.contexts[contextLabel];
   32190         var decoded = this.decoder.readBit(cx);
   32191         return decoded ^ contextLabelAndXor.xorBit;
   32192       },
   32193       runMagnitudeRefinementPass:
   32194         function BitModel_runMagnitudeRefinementPass() {
   32195         var decoder = this.decoder;
   32196         var width = this.width, height = this.height;
   32197         var coefficentsMagnitude = this.coefficentsMagnitude;
   32198         var neighborsSignificance = this.neighborsSignificance;
   32199         var contexts = this.contexts;
   32200         var bitsDecoded = this.bitsDecoded;
   32201         var processingFlags = this.processingFlags;
   32202         var processedMask = 1;
   32203         var firstMagnitudeBitMask = 2;
   32204         for (var i0 = 0; i0 < height; i0 += 4) {
   32205           for (var j = 0; j < width; j++) {
   32206             for (var i1 = 0; i1 < 4; i1++) {
   32207               var i = i0 + i1;
   32208               if (i >= height)
   32209                 break;
   32210               var index = i * width + j;
   32211 
   32212               // significant but not those that have just become
   32213               if (!coefficentsMagnitude[index] ||
   32214                 (processingFlags[index] & processedMask) != 0)
   32215                 continue;
   32216 
   32217               var contextLabel = 16;
   32218               if ((processingFlags[index] &
   32219                 firstMagnitudeBitMask) != 0) {
   32220                 processingFlags[i * width + j] ^= firstMagnitudeBitMask;
   32221                 // first refinement
   32222                 var significance = neighborsSignificance[index];
   32223                 var sumOfSignificance = (significance & 3) +
   32224                   ((significance >> 2) & 3) + ((significance >> 4) & 7);
   32225                 contextLabel = sumOfSignificance >= 1 ? 15 : 14;
   32226               }
   32227 
   32228               var cx = contexts[contextLabel];
   32229               var bit = decoder.readBit(cx);
   32230               coefficentsMagnitude[index] =
   32231                 (coefficentsMagnitude[index] << 1) | bit;
   32232               bitsDecoded[index]++;
   32233               processingFlags[index] |= processedMask;
   32234             }
   32235           }
   32236         }
   32237       },
   32238       runCleanupPass: function BitModel_runCleanupPass() {
   32239         var decoder = this.decoder;
   32240         var width = this.width, height = this.height;
   32241         var neighborsSignificance = this.neighborsSignificance;
   32242         var significanceState = this.significanceState;
   32243         var coefficentsMagnitude = this.coefficentsMagnitude;
   32244         var coefficentsSign = this.coefficentsSign;
   32245         var contexts = this.contexts;
   32246         var labels = this.contextLabelTable;
   32247         var bitsDecoded = this.bitsDecoded;
   32248         var processingFlags = this.processingFlags;
   32249         var processedMask = 1;
   32250         var firstMagnitudeBitMask = 2;
   32251         var oneRowDown = width;
   32252         var twoRowsDown = width * 2;
   32253         var threeRowsDown = width * 3;
   32254         for (var i0 = 0; i0 < height; i0 += 4) {
   32255           for (var j = 0; j < width; j++) {
   32256             var index0 = i0 * width + j;
   32257             // using the property: labels[neighborsSignificance[index]] == 0
   32258             // when neighborsSignificance[index] == 0
   32259             var allEmpty = i0 + 3 < height &&
   32260               processingFlags[index0] == 0 &&
   32261               processingFlags[index0 + oneRowDown] == 0 &&
   32262               processingFlags[index0 + twoRowsDown] == 0 &&
   32263               processingFlags[index0 + threeRowsDown] == 0 &&
   32264               neighborsSignificance[index0] == 0 &&
   32265               neighborsSignificance[index0 + oneRowDown] == 0 &&
   32266               neighborsSignificance[index0 + twoRowsDown] == 0 &&
   32267               neighborsSignificance[index0 + threeRowsDown] == 0;
   32268             var i1 = 0, index = index0;
   32269             var cx, i;
   32270             if (allEmpty) {
   32271               cx = this.runLengthContext;
   32272               var hasSignificantCoefficent = decoder.readBit(cx);
   32273               if (!hasSignificantCoefficent) {
   32274                 bitsDecoded[index0]++;
   32275                 bitsDecoded[index0 + oneRowDown]++;
   32276                 bitsDecoded[index0 + twoRowsDown]++;
   32277                 bitsDecoded[index0 + threeRowsDown]++;
   32278                 continue; // next column
   32279               }
   32280               cx = this.uniformContext;
   32281               i1 = (decoder.readBit(cx) << 1) | decoder.readBit(cx);
   32282               i = i0 + i1;
   32283               index += i1 * width;
   32284 
   32285               var sign = this.decodeSignBit(i, j);
   32286               coefficentsSign[index] = sign;
   32287               coefficentsMagnitude[index] = 1;
   32288               this.setNeighborsSignificance(i, j);
   32289               processingFlags[index] |= firstMagnitudeBitMask;
   32290 
   32291               index = index0;
   32292               for (var i2 = i0; i2 <= i; i2++, index += width)
   32293                 bitsDecoded[index]++;
   32294 
   32295               i1++;
   32296             }
   32297             for (; i1 < 4; i1++, index += width) {
   32298               i = i0 + i1;
   32299               if (i >= height)
   32300                 break;
   32301 
   32302               if (coefficentsMagnitude[index] ||
   32303                 (processingFlags[index] & processedMask) != 0)
   32304                 continue;
   32305 
   32306               var contextLabel = labels[neighborsSignificance[index]];
   32307               cx = contexts[contextLabel];
   32308               var decision = decoder.readBit(cx);
   32309               if (decision == 1) {
   32310                 var sign = this.decodeSignBit(i, j);
   32311                 coefficentsSign[index] = sign;
   32312                 coefficentsMagnitude[index] = 1;
   32313                 this.setNeighborsSignificance(i, j);
   32314                 processingFlags[index] |= firstMagnitudeBitMask;
   32315               }
   32316               bitsDecoded[index]++;
   32317             }
   32318           }
   32319         }
   32320       }
   32321     };
   32322 
   32323     return BitModel;
   32324   })();
   32325 
   32326   // Section F, Discrete wavelet transofrmation
   32327   var Transform = (function TransformClosure() {
   32328     function Transform() {
   32329     }
   32330     Transform.prototype.calculate =
   32331       function transformCalculate(subbands, u0, v0) {
   32332       var ll = subbands[0];
   32333       for (var i = 1, ii = subbands.length, j = 1; i < ii; i += 3, j++) {
   32334         ll = this.iterate(ll, subbands[i], subbands[i + 1],
   32335                           subbands[i + 2], u0, v0);
   32336       }
   32337       return ll;
   32338     };
   32339     Transform.prototype.iterate = function Transform_iterate(ll, hl, lh, hh,
   32340                                                             u0, v0) {
   32341       var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
   32342       var hlWidth = hl.width, hlHeight = hl.height, hlItems = hl.items;
   32343       var lhWidth = lh.width, lhHeight = lh.height, lhItems = lh.items;
   32344       var hhWidth = hh.width, hhHeight = hh.height, hhItems = hh.items;
   32345 
   32346       // Section F.3.3 interleave
   32347       var width = llWidth + hlWidth;
   32348       var height = llHeight + lhHeight;
   32349       var items = new Float32Array(width * height);
   32350       for (var i = 0, ii = llHeight; i < ii; i++) {
   32351         var k = i * llWidth, l = i * 2 * width;
   32352         for (var j = 0, jj = llWidth; j < jj; j++, k++, l += 2)
   32353           items[l] = llItems[k];
   32354       }
   32355       for (var i = 0, ii = hlHeight; i < ii; i++) {
   32356         var k = i * hlWidth, l = i * 2 * width + 1;
   32357         for (var j = 0, jj = hlWidth; j < jj; j++, k++, l += 2)
   32358           items[l] = hlItems[k];
   32359       }
   32360       for (var i = 0, ii = lhHeight; i < ii; i++) {
   32361         var k = i * lhWidth, l = (i * 2 + 1) * width;
   32362         for (var j = 0, jj = lhWidth; j < jj; j++, k++, l += 2)
   32363           items[l] = lhItems[k];
   32364       }
   32365       for (var i = 0, ii = hhHeight; i < ii; i++) {
   32366         var k = i * hhWidth, l = (i * 2 + 1) * width + 1;
   32367         for (var j = 0, jj = hhWidth; j < jj; j++, k++, l += 2)
   32368           items[l] = hhItems[k];
   32369       }
   32370 
   32371       var bufferPadding = 4;
   32372       var bufferLength = new Float32Array(Math.max(width, height) +
   32373         2 * bufferPadding);
   32374       var buffer = new Float32Array(bufferLength);
   32375       var bufferOut = new Float32Array(bufferLength);
   32376 
   32377       // Section F.3.4 HOR_SR
   32378       for (var v = 0; v < height; v++) {
   32379         if (width == 1) {
   32380           // if width = 1, when u0 even keep items as is, when odd divide by 2
   32381           if ((u0 % 1) != 0) {
   32382             items[v * width] /= 2;
   32383           }
   32384           continue;
   32385         }
   32386 
   32387         var k = v * width;
   32388         var l = bufferPadding;
   32389         for (var u = 0; u < width; u++, k++, l++)
   32390           buffer[l] = items[k];
   32391 
   32392         // Section F.3.7 extending... using max extension of 4
   32393         var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
   32394         var i2 = bufferPadding + width - 2, j2 = bufferPadding + width;
   32395         buffer[i1--] = buffer[j1++];
   32396         buffer[j2++] = buffer[i2--];
   32397         buffer[i1--] = buffer[j1++];
   32398         buffer[j2++] = buffer[i2--];
   32399         buffer[i1--] = buffer[j1++];
   32400         buffer[j2++] = buffer[i2--];
   32401         buffer[i1--] = buffer[j1++];
   32402         buffer[j2++] = buffer[i2--];
   32403 
   32404         this.filter(buffer, bufferPadding, width, u0, bufferOut);
   32405 
   32406         k = v * width;
   32407         l = bufferPadding;
   32408         for (var u = 0; u < width; u++, k++, l++)
   32409           items[k] = bufferOut[l];
   32410       }
   32411 
   32412       // Section F.3.5 VER_SR
   32413       for (var u = 0; u < width; u++) {
   32414         if (height == 1) {
   32415           // if height = 1, when v0 even keep items as is, when odd divide by 2
   32416           if ((v0 % 1) != 0) {
   32417             items[u] /= 2;
   32418           }
   32419           continue;
   32420         }
   32421 
   32422         var k = u;
   32423         var l = bufferPadding;
   32424         for (var v = 0; v < height; v++, k += width, l++)
   32425           buffer[l] = items[k];
   32426 
   32427         // Section F.3.7 extending... using max extension of 4
   32428         var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
   32429         var i2 = bufferPadding + height - 2, j2 = bufferPadding + height;
   32430         buffer[i1--] = buffer[j1++];
   32431         buffer[j2++] = buffer[i2--];
   32432         buffer[i1--] = buffer[j1++];
   32433         buffer[j2++] = buffer[i2--];
   32434         buffer[i1--] = buffer[j1++];
   32435         buffer[j2++] = buffer[i2--];
   32436         buffer[i1--] = buffer[j1++];
   32437         buffer[j2++] = buffer[i2--];
   32438 
   32439         this.filter(buffer, bufferPadding, height, v0, bufferOut);
   32440 
   32441         k = u;
   32442         l = bufferPadding;
   32443         for (var v = 0; v < height; v++, k += width, l++)
   32444           items[k] = bufferOut[l];
   32445       }
   32446       return {
   32447         width: width,
   32448         height: height,
   32449         items: items
   32450       };
   32451     };
   32452     return Transform;
   32453   })();
   32454 
   32455   // Section 3.8.2 Irreversible 9-7 filter
   32456   var IrreversibleTransform = (function IrreversibleTransformClosure() {
   32457     function IrreversibleTransform() {
   32458       Transform.call(this);
   32459     }
   32460 
   32461     IrreversibleTransform.prototype = Object.create(Transform.prototype);
   32462     IrreversibleTransform.prototype.filter =
   32463       function irreversibleTransformFilter(y, offset, length, i0, x) {
   32464       var i0_ = Math.floor(i0 / 2);
   32465       var i1_ = Math.floor((i0 + length) / 2);
   32466       var offset_ = offset - (i0 % 1);
   32467 
   32468       var alpha = -1.586134342059924;
   32469       var beta = -0.052980118572961;
   32470       var gamma = 0.882911075530934;
   32471       var delta = 0.443506852043971;
   32472       var K = 1.230174104914001;
   32473       var K_ = 1 / K;
   32474 
   32475       // step 1
   32476       var j = offset_ - 2;
   32477       for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
   32478         x[j] = K * y[j];
   32479 
   32480       // step 2
   32481       var j = offset_ - 3;
   32482       for (var n = i0_ - 2, nn = i1_ + 2; n < nn; n++, j += 2)
   32483         x[j] = K_ * y[j];
   32484 
   32485       // step 3
   32486       var j = offset_ - 2;
   32487       for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
   32488         x[j] -= delta * (x[j - 1] + x[j + 1]);
   32489 
   32490       // step 4
   32491       var j = offset_ - 1;
   32492       for (var n = i0_ - 1, nn = i1_ + 1; n < nn; n++, j += 2)
   32493         x[j] -= gamma * (x[j - 1] + x[j + 1]);
   32494 
   32495       // step 5
   32496       var j = offset_;
   32497       for (var n = i0_, nn = i1_ + 1; n < nn; n++, j += 2)
   32498         x[j] -= beta * (x[j - 1] + x[j + 1]);
   32499 
   32500       // step 6
   32501       var j = offset_ + 1;
   32502       for (var n = i0_, nn = i1_; n < nn; n++, j += 2)
   32503         x[j] -= alpha * (x[j - 1] + x[j + 1]);
   32504     };
   32505 
   32506     return IrreversibleTransform;
   32507   })();
   32508 
   32509   // Section 3.8.1 Reversible 5-3 filter
   32510   var ReversibleTransform = (function ReversibleTransformClosure() {
   32511     function ReversibleTransform() {
   32512       Transform.call(this);
   32513     }
   32514 
   32515     ReversibleTransform.prototype = Object.create(Transform.prototype);
   32516     ReversibleTransform.prototype.filter =
   32517       function reversibleTransformFilter(y, offset, length, i0, x) {
   32518       var i0_ = Math.floor(i0 / 2);
   32519       var i1_ = Math.floor((i0 + length) / 2);
   32520       var offset_ = offset - (i0 % 1);
   32521 
   32522       for (var n = i0_, nn = i1_ + 1, j = offset_; n < nn; n++, j += 2)
   32523         x[j] = y[j] - Math.floor((y[j - 1] + y[j + 1] + 2) / 4);
   32524 
   32525       for (var n = i0_, nn = i1_, j = offset_ + 1; n < nn; n++, j += 2)
   32526         x[j] = y[j] + Math.floor((x[j - 1] + x[j + 1]) / 2);
   32527     };
   32528 
   32529     return ReversibleTransform;
   32530   })();
   32531 
   32532   return JpxImage;
   32533 })();
   32534 
   32535 
   32536 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   32537 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   32538 
   32539 'use strict';
   32540 
   32541 var bidi = PDFJS.bidi = (function bidiClosure() {
   32542   // Character types for symbols from 0000 to 00FF.
   32543   var baseTypes = [
   32544     'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
   32545     'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
   32546     'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
   32547     'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
   32548     'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
   32549     'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
   32550     'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
   32551     'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
   32552     'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
   32553     'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
   32554     'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
   32555     'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
   32556     'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
   32557     'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
   32558     'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
   32559     'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
   32560     'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
   32561     'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
   32562     'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
   32563   ];
   32564 
   32565   // Character types for symbols from 0600 to 06FF
   32566   var arabicTypes = [
   32567     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32568     'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
   32569     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32570     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32571     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32572     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32573     'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
   32574     'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
   32575     'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
   32576     'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
   32577     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32578     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32579     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32580     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32581     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32582     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32583     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32584     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32585     'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
   32586     'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
   32587     'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
   32588     'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
   32589   ];
   32590 
   32591   function isOdd(i) {
   32592     return (i & 1) != 0;
   32593   }
   32594 
   32595   function isEven(i) {
   32596     return (i & 1) == 0;
   32597   }
   32598 
   32599   function findUnequal(arr, start, value) {
   32600     var j;
   32601     for (var j = start, jj = arr.length; j < jj; ++j) {
   32602       if (arr[j] != value)
   32603         return j;
   32604     }
   32605     return j;
   32606   }
   32607 
   32608   function setValues(arr, start, end, value) {
   32609     for (var j = start; j < end; ++j) {
   32610       arr[j] = value;
   32611     }
   32612   }
   32613 
   32614   function reverseValues(arr, start, end) {
   32615     for (var i = start, j = end - 1; i < j; ++i, --j) {
   32616       var temp = arr[i];
   32617       arr[i] = arr[j];
   32618       arr[j] = temp;
   32619     }
   32620   }
   32621 
   32622   function mirrorGlyphs(c) {
   32623     /*
   32624      # BidiMirroring-1.txt
   32625      0028; 0029 # LEFT PARENTHESIS
   32626      0029; 0028 # RIGHT PARENTHESIS
   32627      003C; 003E # LESS-THAN SIGN
   32628      003E; 003C # GREATER-THAN SIGN
   32629      005B; 005D # LEFT SQUARE BRACKET
   32630      005D; 005B # RIGHT SQUARE BRACKET
   32631      007B; 007D # LEFT CURLY BRACKET
   32632      007D; 007B # RIGHT CURLY BRACKET
   32633      00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
   32634      00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
   32635      */
   32636     switch (c) {
   32637       case '(':
   32638         return ')';
   32639       case ')':
   32640         return '(';
   32641       case '<':
   32642         return '>';
   32643       case '>':
   32644         return '<';
   32645       case ']':
   32646         return '[';
   32647       case '[':
   32648         return ']';
   32649       case '}':
   32650         return '{';
   32651       case '{':
   32652         return '}';
   32653       case '\u00AB':
   32654         return '\u00BB';
   32655       case '\u00BB':
   32656         return '\u00AB';
   32657       default:
   32658         return c;
   32659     }
   32660   }
   32661 
   32662   function bidi(text, startLevel) {
   32663     var str = text.str;
   32664     var strLength = str.length;
   32665     if (strLength == 0)
   32666       return str;
   32667 
   32668     // get types, fill arrays
   32669 
   32670     var chars = [];
   32671     var types = [];
   32672     var oldtypes = [];
   32673     var numBidi = 0;
   32674 
   32675     for (var i = 0; i < strLength; ++i) {
   32676       chars[i] = str.charAt(i);
   32677 
   32678       var charCode = str.charCodeAt(i);
   32679       var charType = 'L';
   32680       if (charCode <= 0x00ff)
   32681         charType = baseTypes[charCode];
   32682       else if (0x0590 <= charCode && charCode <= 0x05f4)
   32683         charType = 'R';
   32684       else if (0x0600 <= charCode && charCode <= 0x06ff)
   32685         charType = arabicTypes[charCode & 0xff];
   32686       else if (0x0700 <= charCode && charCode <= 0x08AC)
   32687         charType = 'AL';
   32688 
   32689       if (charType == 'R' || charType == 'AL' || charType == 'AN')
   32690         numBidi++;
   32691 
   32692       oldtypes[i] = types[i] = charType;
   32693     }
   32694 
   32695     // detect the bidi method
   32696     //  if there are no rtl characters then no bidi needed
   32697     //  if less than 30% chars are rtl then string is primarily ltr
   32698     //  if more than 30% chars are rtl then string is primarily rtl
   32699     if (numBidi == 0) {
   32700       text.direction = 'ltr';
   32701       return str;
   32702     }
   32703 
   32704     if (startLevel == -1) {
   32705       if ((strLength / numBidi) < 0.3) {
   32706         text.direction = 'ltr';
   32707         startLevel = 0;
   32708       } else {
   32709         text.direction = 'rtl';
   32710         startLevel = 1;
   32711       }
   32712     }
   32713 
   32714     var levels = [];
   32715 
   32716     for (var i = 0; i < strLength; ++i) {
   32717       levels[i] = startLevel;
   32718     }
   32719 
   32720     /*
   32721      X1-X10: skip most of this, since we are NOT doing the embeddings.
   32722      */
   32723 
   32724     var e = isOdd(startLevel) ? 'R' : 'L';
   32725     var sor = e;
   32726     var eor = sor;
   32727 
   32728     /*
   32729      W1. Examine each non-spacing mark (NSM) in the level run, and change the
   32730      type of the NSM to the type of the previous character. If the NSM is at the
   32731      start of the level run, it will get the type of sor.
   32732      */
   32733 
   32734     var lastType = sor;
   32735     for (var i = 0; i < strLength; ++i) {
   32736       if (types[i] == 'NSM')
   32737         types[i] = lastType;
   32738       else
   32739         lastType = types[i];
   32740     }
   32741 
   32742     /*
   32743      W2. Search backwards from each instance of a European number until the
   32744      first strong type (R, L, AL, or sor) is found.  If an AL is found, change
   32745      the type of the European number to Arabic number.
   32746      */
   32747 
   32748     var lastType = sor;
   32749     for (var i = 0; i < strLength; ++i) {
   32750       var t = types[i];
   32751       if (t == 'EN')
   32752         types[i] = (lastType == 'AL') ? 'AN' : 'EN';
   32753       else if (t == 'R' || t == 'L' || t == 'AL')
   32754         lastType = t;
   32755     }
   32756 
   32757     /*
   32758      W3. Change all ALs to R.
   32759      */
   32760 
   32761     for (var i = 0; i < strLength; ++i) {
   32762       var t = types[i];
   32763       if (t == 'AL')
   32764         types[i] = 'R';
   32765     }
   32766 
   32767     /*
   32768      W4. A single European separator between two European numbers changes to a
   32769      European number. A single common separator between two numbers of the same
   32770      type changes to that type:
   32771      */
   32772 
   32773     for (var i = 1; i < strLength - 1; ++i) {
   32774       if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN')
   32775         types[i] = 'EN';
   32776       if (types[i] == 'CS' && (types[i - 1] == 'EN' || types[i - 1] == 'AN') &&
   32777           types[i + 1] == types[i - 1])
   32778         types[i] = types[i - 1];
   32779     }
   32780 
   32781     /*
   32782      W5. A sequence of European terminators adjacent to European numbers changes
   32783      to all European numbers:
   32784      */
   32785 
   32786     for (var i = 0; i < strLength; ++i) {
   32787       if (types[i] == 'EN') {
   32788         // do before
   32789         for (var j = i - 1; j >= 0; --j) {
   32790           if (types[j] != 'ET')
   32791             break;
   32792           types[j] = 'EN';
   32793         }
   32794         // do after
   32795         for (var j = i + 1; j < strLength; --j) {
   32796           if (types[j] != 'ET')
   32797             break;
   32798           types[j] = 'EN';
   32799         }
   32800       }
   32801     }
   32802 
   32803     /*
   32804      W6. Otherwise, separators and terminators change to Other Neutral:
   32805      */
   32806 
   32807     for (var i = 0; i < strLength; ++i) {
   32808       var t = types[i];
   32809       if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS')
   32810         types[i] = 'ON';
   32811     }
   32812 
   32813     /*
   32814      W7. Search backwards from each instance of a European number until the
   32815      first strong type (R, L, or sor) is found. If an L is found,  then change
   32816      the type of the European number to L.
   32817      */
   32818 
   32819     var lastType = sor;
   32820     for (var i = 0; i < strLength; ++i) {
   32821       var t = types[i];
   32822       if (t == 'EN')
   32823         types[i] = (lastType == 'L') ? 'L' : 'EN';
   32824       else if (t == 'R' || t == 'L')
   32825         lastType = t;
   32826     }
   32827 
   32828     /*
   32829      N1. A sequence of neutrals takes the direction of the surrounding strong
   32830      text if the text on both sides has the same direction. European and Arabic
   32831      numbers are treated as though they were R. Start-of-level-run (sor) and
   32832      end-of-level-run (eor) are used at level run boundaries.
   32833      */
   32834 
   32835     for (var i = 0; i < strLength; ++i) {
   32836       if (types[i] == 'ON') {
   32837         var end = findUnequal(types, i + 1, 'ON');
   32838         var before = sor;
   32839         if (i > 0)
   32840           before = types[i - 1];
   32841         var after = eor;
   32842         if (end + 1 < strLength)
   32843           after = types[end + 1];
   32844         if (before != 'L')
   32845           before = 'R';
   32846         if (after != 'L')
   32847           after = 'R';
   32848         if (before == after)
   32849           setValues(types, i, end, before);
   32850         i = end - 1; // reset to end (-1 so next iteration is ok)
   32851       }
   32852     }
   32853 
   32854     /*
   32855      N2. Any remaining neutrals take the embedding direction.
   32856      */
   32857 
   32858     for (var i = 0; i < strLength; ++i) {
   32859       if (types[i] == 'ON')
   32860         types[i] = e;
   32861     }
   32862 
   32863     /*
   32864      I1. For all characters with an even (left-to-right) embedding direction,
   32865      those of type R go up one level and those of type AN or EN go up two
   32866      levels.
   32867      I2. For all characters with an odd (right-to-left) embedding direction,
   32868      those of type L, EN or AN go up one level.
   32869      */
   32870 
   32871     for (var i = 0; i < strLength; ++i) {
   32872       var t = types[i];
   32873       if (isEven(levels[i])) {
   32874         if (t == 'R') {
   32875           levels[i] += 1;
   32876         } else if (t == 'AN' || t == 'EN') {
   32877           levels[i] += 2;
   32878         }
   32879       } else { // isOdd, so
   32880         if (t == 'L' || t == 'AN' || t == 'EN') {
   32881           levels[i] += 1;
   32882         }
   32883       }
   32884     }
   32885 
   32886     /*
   32887      L1. On each line, reset the embedding level of the following characters to
   32888      the paragraph embedding level:
   32889 
   32890      segment separators,
   32891      paragraph separators,
   32892      any sequence of whitespace characters preceding a segment separator or
   32893      paragraph separator, and any sequence of white space characters at the end
   32894      of the line.
   32895      */
   32896 
   32897     // don't bother as text is only single line
   32898 
   32899     /*
   32900      L2. From the highest level found in the text to the lowest odd level on
   32901      each line, reverse any contiguous sequence of characters that are at that
   32902      level or higher.
   32903      */
   32904 
   32905     // find highest level & lowest odd level
   32906 
   32907     var highestLevel = -1;
   32908     var lowestOddLevel = 99;
   32909     for (var i = 0, ii = levels.length; i < ii; ++i) {
   32910       var level = levels[i];
   32911       if (highestLevel < level)
   32912         highestLevel = level;
   32913       if (lowestOddLevel > level && isOdd(level))
   32914         lowestOddLevel = level;
   32915     }
   32916 
   32917     // now reverse between those limits
   32918 
   32919     for (var level = highestLevel; level >= lowestOddLevel; --level) {
   32920       // find segments to reverse
   32921       var start = -1;
   32922       for (var i = 0, ii = levels.length; i < ii; ++i) {
   32923         if (levels[i] < level) {
   32924           if (start >= 0) {
   32925             reverseValues(chars, start, i);
   32926             start = -1;
   32927           }
   32928         } else if (start < 0) {
   32929           start = i;
   32930         }
   32931       }
   32932       if (start >= 0) {
   32933         reverseValues(chars, start, levels.length);
   32934       }
   32935     }
   32936 
   32937     /*
   32938      L3. Combining marks applied to a right-to-left base character will at this
   32939      point precede their base character. If the rendering engine expects them to
   32940      follow the base characters in the final display process, then the ordering
   32941      of the marks and the base character must be reversed.
   32942      */
   32943 
   32944     // don't bother for now
   32945 
   32946     /*
   32947      L4. A character that possesses the mirrored property as specified by
   32948      Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
   32949      directionality of that character is R.
   32950      */
   32951 
   32952     // don't mirror as characters are already mirrored in the pdf
   32953 
   32954     // Finally, return string
   32955 
   32956     var result = '';
   32957     for (var i = 0, ii = chars.length; i < ii; ++i) {
   32958       var ch = chars[i];
   32959       if (ch != '<' && ch != '>')
   32960         result += ch;
   32961     }
   32962     return result;
   32963   }
   32964 
   32965   return bidi;
   32966 })();
   32967 
   32968 
   32969 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
   32970 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
   32971 
   32972 'use strict';
   32973 
   32974 var Metadata = PDFJS.Metadata = (function MetadataClosure() {
   32975   function fixMetadata(meta) {
   32976     return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {
   32977       var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,
   32978                                 function(code, d1, d2, d3) {
   32979         return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
   32980       });
   32981       var chars = '';
   32982       for (var i = 0; i < bytes.length; i += 2) {
   32983         var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
   32984         chars += code >= 32 && code < 127 && code != 60 && code != 62 &&
   32985           code != 38 && false ? String.fromCharCode(code) :
   32986           '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
   32987       }
   32988       return '>' + chars;
   32989     });
   32990   }
   32991 
   32992   function Metadata(meta) {
   32993     if (typeof meta === 'string') {
   32994       // Ghostscript produces invalid metadata
   32995       meta = fixMetadata(meta);
   32996 
   32997       var parser = new DOMParser();
   32998       meta = parser.parseFromString(meta, 'application/xml');
   32999     } else if (!(meta instanceof Document)) {
   33000       error('Metadata: Invalid metadata object');
   33001     }
   33002 
   33003     this.metaDocument = meta;
   33004     this.metadata = {};
   33005     this.parse();
   33006   }
   33007 
   33008   Metadata.prototype = {
   33009     parse: function Metadata_parse() {
   33010       var doc = this.metaDocument;
   33011       var rdf = doc.documentElement;
   33012 
   33013       if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
   33014         rdf = rdf.firstChild;
   33015         while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf')
   33016           rdf = rdf.nextSibling;
   33017       }
   33018 
   33019       var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
   33020       if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes())
   33021         return;
   33022 
   33023       var childNodes = rdf.childNodes, desc, namespace, entries, entry;
   33024 
   33025       for (var i = 0, length = childNodes.length; i < length; i++) {
   33026         desc = childNodes[i];
   33027         if (desc.nodeName.toLowerCase() !== 'rdf:description')
   33028           continue;
   33029 
   33030         entries = [];
   33031         for (var ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
   33032           if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text')
   33033             entries.push(desc.childNodes[ii]);
   33034         }
   33035 
   33036         for (ii = 0, iLength = entries.length; ii < iLength; ii++) {
   33037           var entry = entries[ii];
   33038           var name = entry.nodeName.toLowerCase();
   33039           this.metadata[name] = entry.textContent.trim();
   33040         }
   33041       }
   33042     },
   33043 
   33044     get: function Metadata_get(name) {
   33045       return this.metadata[name] || null;
   33046     },
   33047 
   33048     has: function Metadata_has(name) {
   33049       return typeof this.metadata[name] !== 'undefined';
   33050     }
   33051   };
   33052 
   33053   return Metadata;
   33054 })();
   33055 
   33056 }).call((typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window);
   33057