1 // Portions copyright 2012 Google, Inc.
2 // Portions copyright 2011 Mozilla Foundation. All rights reserved.
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.
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.
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
18 // The PDF-JS code in this file has been written by Mozilla.
19 // It is available in its latest version from:
21 // https://github.com/mozilla/pdf.js
24 //////// Benchmark set-up. (c) by Google. ////////
26 var pdf_file = "test.pdf";
29 var PdfJS = new BenchmarkSuite("PdfJS", [10124921], [
30 new Benchmark("PdfJS", false, false, 24,
31 runPdfJS, setupPdfJS, tearDownPdfJS, null, 4)
34 function setupPdfJS() {
35 // Check for Typed Arrays support, throw error if not.
36 if (!(typeof Uint8Array != "undefined" &&
37 typeof Float64Array != "undefined" &&
38 typeof (new Uint8Array(0)).subarray != "undefined")) {
39 throw "TypedArrayUnsupported";
42 PdfJS_window.__resources__[pdf_file] = buffer(PdfJS_window.atob(getPDF()));
46 PDFJS.getDocument(pdf_file).then(function(pdf) {
47 var canvas = PdfJS_window.document.getElementById('canvas');
48 var context = canvas.getContext('2d');
49 var renderContext = {canvasContext: context};
50 canvas_logs.push(context.__log__);
52 // Cycle through all pages.
53 function renderPages(i, j) {
55 context.clearRect(0, 0, canvas.width, canvas.height);
56 pdf.getPage(i).then(function(page) {
57 renderContext.viewport = page.getViewport(1);
58 canvas.height = renderContext.viewport.height;
59 canvas.width = renderContext.viewport.width;
60 page.render(renderContext).then(renderPages.bind(null, i + 1, j));
63 renderPages(1, pdf.numPages);
66 // Wait for everything to complete.
67 PdfJS_window.flushTimeouts();
70 function tearDownPdfJS() {
71 // Should produce 36788 939524096 for all runs.
72 for (var i = 0; i < canvas_logs.length; ++i) {
73 var log_length = canvas_logs[i].length;
74 var log_hash = hash(canvas_logs[i].join(" "));
75 var expected_length = 36788;
76 var expected_hash = 939524096;
77 if (log_length !== expected_length || log_hash !== expected_hash) {
78 var message = "PdfJS produced incorrect output: " +
79 "expected " + expected_length + " " + expected_hash + ", " +
80 "got " + log_length + " " + log_hash;
81 console.log(message + "\n");
85 // Allow GC of global state.
87 delete this.PdfJS_window;
91 var b = new ArrayBuffer(s.length);
92 var a = new Uint8Array(b);
93 for (var i = 0; i < s.length; ++i) a[i] = s.charCodeAt(i);
98 var up = Math.floor((s.length + 3) / 4);
100 for (var i = 0; 4*i - 3 < s.length; i += 4) {
101 for (var j = 0; j < 4 && i + j < s.length; ++j)
102 h = (h + s.charCodeAt(i + j) << (8*j)) | 0;
108 ///////// Mocks of relevant browser functionality. (c) by Google. ////////
110 // Every acces to window will be redirected to PdfJS_window.
111 var PdfJS_window = Object.create(this);
113 function PdfJS_windowInstall(name, x) {
114 Object.defineProperty(PdfJS_window, name, {value: x});
117 PdfJS_windowInstall("setTimeout", function(cmd, delay) {
118 PdfJS_window.__timeouts__.push(cmd);
121 PdfJS_windowInstall("flushTimeouts", function() {
122 while (PdfJS_window.__timeouts__.length != 0) {
123 var next = PdfJS_window.__timeouts__.pop();
124 if (typeof next === "function")
131 PdfJS_windowInstall("window", PdfJS_window);
133 PdfJS_window.__timeouts__ = [];
134 PdfJS_window.__resources__ = {};
137 // Base64 encoding/decoding is based on code by Grant Galitz.
138 PdfJS_window.__to64__ = [
139 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
140 "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
141 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
142 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
143 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/", "="
146 PdfJS_windowInstall("btoa", function(data) {
148 if (data.length > 0) {
150 while (i < data.length) {
151 var b1 = data.charCodeAt(i++) & 0xff;
152 var b2 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff;
153 var b3 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff;
154 result += PdfJS_window.__to64__[b1 >> 2];
155 if (i === data.length + 2) {
156 result += PdfJS_window.__to64__[(b1 & 0x3) << 4] + "==";
158 result += PdfJS_window.__to64__[((b1 & 0x3) << 4) | (b2 >> 4)];
159 if (i === data.length + 1) {
160 result += PdfJS_window.__to64__[(b2 & 0xF) << 2] + "=";
162 result += PdfJS_window.__to64__[((b2 & 0xF) << 2) | (b3 >> 6)] +
163 PdfJS_window.__to64__[b3 & 0x3F];
171 PdfJS_window.__from64__ =
172 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
174 PdfJS_windowInstall("atob", function(data) {
177 while (i < data.length) {
178 var x1 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
179 var x2 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
180 var x3 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
181 var x4 = PdfJS_window.__from64__.indexOf(data.charAt(i++));
182 result += String.fromCharCode((x1 << 2) | (x2 >> 4));
184 result += String.fromCharCode(((x2 & 0x0F) << 4) | (x3 >> 2));
186 result += String.fromCharCode(((x3 & 0x03) << 6) | x4);
194 PdfJS_windowInstall("XMLHttpRequest", function() {
195 this.open = function(type, url, some_bool) {
198 this.overrideMimeType = function() {}
199 this.send = function() {
200 this.response = PdfJS_window.__resources__[this.url];
203 this.onreadystatechange();
207 PdfJS_windowInstall("console", this.console ? this.console : {
209 // To verify that the test produces the right results,
210 // uncomment this code.
212 var re = new RegExp("%d", "g");
213 var args = arguments;
215 print(s.replace(re, function() { return args[++i] }));
220 PdfJS_windowInstall("location", {
224 PdfJS_windowInstall("Event", function() {
225 this.initEvent = function(name) {
230 PdfJS_windowInstall("Element", function(type) {
231 this.__listeners__ = {};
232 this.element_type = type;
233 this.insertBefore = function() {};
234 this.addEventListener = function(name, listener) {
235 this.__listeners__[name] = listener;
237 this.removeEventListener = function(name) {
238 delete this.__listeners__[name];
240 this.dispatchEvent = function(event) {
241 this.__listeners__[event.name](event)
243 this.getElementsByTagName = function(name) {
244 if (name === "head") {
245 return [{appendChild: function() {}}]
248 this.appendChild = function() {};
249 this.setAttribute = function() {};
252 insertRule: function() {}
256 PdfJS_windowInstall("Context", function() {
258 this.save = function() {
259 this.__log__.push("save","\n");
261 this.restore = function() {
262 this.__log__.push("restore","\n");
264 this.transform = function(a,b,c,d,e,f) {
265 this.__log__.push("transform",a,b,c,d,e,f,"\n");
267 this.translate = function(x,y) {
268 this.__log__.push("translate",x,y,"\n");
270 this.scale = function(x,y) {
271 this.__log__.push("scale",x,y,"\n");
273 this.rect = function(x,y,w,h) {
274 this.__log__.push("rect",x,y,w,h,"\n");
276 this.clip = function() {
277 this.__log__.push("clip","\n");
279 this.fill = function() {
280 this.__log__.push("fill","\n");
282 this.stroke = function() {
283 this.__log__.push("stroke","\n");
285 this.beginPath = function() {
286 this.__log__.push("beginPath","\n");
288 this.closePath = function() {
289 this.__log__.push("closePath","\n");
291 this.moveTo = function(x,y) {
292 this.__log__.push("moveTo",x,y,"\n");
294 this.lineTo = function(x,y) {
295 this.__log__.push("lineTo",x,y,"\n");
297 this.fillRect = function(x,y,w,h) {
298 this.__log__.push("fillRect",x,y,w,h,"\n");
300 this.fillText = function(s,x,y,w) {
301 this.__log__.push("fillText",s,x,y,"\n");
303 this.strokeText = function(s,x,y,w) {
304 this.__log__.push("strokeText",s,x,y,"\n");
306 this.getImageData = function(x,y,w,h) {
307 this.__log__.push("getImageData",x,y,w,h,"\n");
310 this.putImageData = function(data,x,y) {
311 this.__log__.push("putImageData","{...}",x,y,"\n");
313 this.drawImage = function(image,x,y) {
314 this.__log__.push("drawImage","<elem>",x,y,"\n");
316 this.getParameter = function(name) {
317 this.__log__.push("getParameter",name,"\n");
320 this.enable = function() {
321 this.__log__.push("enable","\n");
323 this.disable = function() {
324 this.__log__.push("disable","\n");
326 this.depthFunc = function(param) {
327 this.__log__.push("depthFunc",param,"\n");
329 this.clearColor = function(r,g,b,a) {
330 this.__log__.push("clearColor",r,g,b,a,"\n");
332 this.clear = function(m) {
333 this.__log__.push("clear",m,"\n");
335 this.clearRect = function(x,y,w,h) {
336 this.__log__.push("createRect",x,y,w,h,"\n");
340 PdfJS_windowInstall("Canvas", function() {
341 this.getContext = function() {
342 return new PdfJS_window.Context();
346 this.style = { visibility: "visibile" };
349 PdfJS_windowInstall("document", {
350 body : new PdfJS_window.Element("body"),
351 documentElement : new PdfJS_window.Element("document"),
352 createElement : function(element_type) {
354 if (element_type === "canvas") {
355 element = new PdfJS_window.Canvas();
357 element = new PdfJS_window.Element(element_type);
359 element.parentNode = new PdfJS_window.Element("dummy_parent");
362 getElementById : function(name) {
363 if (name === "canvas") {
364 return new PdfJS_window.Canvas();
369 getElementsByTagName : function(element) {
370 if (element === "script") {
371 return new Array(new this.createElement(element));
374 createEvent : function() { return new PdfJS_window.Event() }
377 PdfJS_window.window.addEventListener = function(name, listener) {
378 PdfJS_window.setTimeout(listener)
381 PdfJS_windowInstall("Worker", undefined);
384 ///////// The PDF we want to render, encoded in base64. ////////
387 return "JVBERi0xLjQKJdDUxdgKMyAwIG9iaiA8PAovTGVuZ3RoIDMxMTAgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjalVlLk+O2Eb7Pr1B8MadqRfP9uGX9iu2yEyc7VU7V7h4wFCTRQ5EKQM7u5pK/nq8flMhdeVO5iECj0Wh0N7o/QF8/3H31fVxs4jJM4jzbPOw3cZGEZVRtyjgP4zrfPOw2r4PfjvdJEXy436ZREnx/X9bB1DdjO/SmE9qvbjg4czq1/UEIv5hxtM7fv3346avvk3gTx2Gd5wmtkBR1WOX1pgiTrBT5b6IoFda4XLJukzwL87jebNMizDGHuX8ajj1WgUY/TIej9S+oUwY/9n5sx4nUsvdx0At1Pzjh/daM5h6EZ/qxo+39032eB+b8glbeZBm2XWy2cRrWs1rfHE13ol2wgIf7Kg7sU9/qRFXhfhsH/7nP6igYDhiB8KEzIjOFKdNcZVYiM4uTupCpf8G0qg6G0T7eb2meO8i8bVqHRVqvJ7767btvv/trKFPd76fjnxsfNrSeahl6KzZMk00d1kVSkAlzGLuAqKwKy0pFvXz0ozPNKOzVgnsbF3GYRwk1wlTt/RIGSPIi8MN+pPXe3SdVYJwVKuleBbYZTpb5yuA0zGOm30njNJCZHNxihQfs586+f0EbT4J2FLb2cxKcTm1PZ15ycKPpSRWdPA6qJi01ugmLNdyklrNi2TiDRTN8Ochkf7x6ncu+bNfBxlmaBL/dVyl1tzDW1IyTszvhEztUSzvUqjtGrfEfpMUKkVzXjpaCNEovo8VldGcfp4OOYj9xsJPxsxtI/nO7syrZyKcZus7y6RPGYc9bi3RThWyKLI7pu6mj6WkBdY5mpFYRNKYXkvpOqM5uJ097ZOZhJu6mRhn2UG4iO0j3vDrzBSkmpvcwYJ7FwTcDu+eZzSqemlMGpnemP0zmYP1Ke3XJuTO0alZEkNo39jxONC/L66BrT+3oZYxMQLTxqMziEvr5IAQo+djZkxc+jgejky6bp87VXMa1sAK2UCUpch1iYJHrWIHPKj75I9gSMvfgSThO60VlkB9NQ+o9YYEyiYIfSaN+ntEq09lIiFsnfYlMEeaPgwSfziGnEv0akoMM7a0hZ3kZRpQIdbkb9D+7m5bipKqgjxvbhmyDQM2Q3o8tEq/bDm5HKhLLLNdLl88tNTrz7w/Sss/3dKC7yRCfCpJQxGgjwTK69nEardAODlvoeHotEQkie6qEp7a3NCb3jeJ/eI4CEZ+XrFQU2PeGsg4XjDq+WJWGTqZvz9ggL11SlPlRZ8lWQBud1bnJHPwy4O2zipIcxyGOmbyjCbm5bWaS6Q4DNDye/Itb6vNaWVxQkkPY2jm/EUmCPC5JfBycj2arEYy6xgxHOyF24SjpvonyiGMdbUOq0TRdXQTtSdlBOy/h4jdRnDUthwYm/SirIwW2B9vzeQRVcgTr2N9KPAdzslucX3YC54akLmd7eSgVc35Ng1cty6TRi0/VfWXwQQYkqZayd2o8saF1VFJoGfipaaz3+6lbLUaZiRPrKupvBs18BrYpFOOUnqYZcu9oOo4/UG+VHaJzXNL3qLMQtJ2Q5DS6DtlECnO2Qf1Js4LBDZQAQCjmohzDRTEOJKyeUv0isSgGk2T6Tyo1ZidxWAFa8ewHzh1pVq9yB/VnOh80+gKYnc6jdFh5fHf2hKMLUMDxn0fYXEx5hJu8MTC9idNMN4feZXNfqCgpL2gtUwxrtCgUt5IMK1gsrJ1R/FPEnhUXzRZ/IRrJicwomfhBWrIRYCHbnYWy1uJargTPgWDfn7uhHWUe52cWuZM01VMUjhoUlwXkFN6IesSeOv1Rqw+Fwsk8SXWk+NF4aTprnAy/E5Nx8HCx4OgjBfJAd7yKSg6jzS0I80mdirN1fc7inA1NA2Qz6iMpdXKWBQkAFjdm4qIVM9qgzyXR0UwkaS+JkYbmmu4seY0oXGTAdykG4R+jrgcOq4KMxGWmyBZJFR14xHZ7bXv5EpICcpeOUaKRz7ymch5brrNH6TrbcHZuJVHrzHFWQRf+Uultf57G9SIUH7fytTtMiywdFRcIR+2d7XRBirksyjWHR8VyRaIP08hLUtt4YRHIAAJq+NSNyJoFAM0DZ8czVRS2+lVorpbMFvlOJd3UfWcp3feMaoHeaGpCRrGO4BKRyJ38xQpOmnsC0+pcBu/10tQrOZPrhSIQucj/jxVRxeg80agC/+K6qY9Kp57ASaORpqWU5uhbaeVIa43wYRyp4BGh06qtE5RxhWRY0HxrSa/QTxjPjnBdKxdKAr2428E/CLOjTIkD/79lnhgkyEVOmLtWqtwtpwFxtb1xlF9Kcji0xo/ii3JlI+CNYgYvYmz6CshMS4QgIZVFrSgJZ9IZAZ2TWVnMaUE6C/cR8yXRob1Wy/5LMJ4e/4+28LeJVgN+6IfR6IlFb49rzcDXSy+EB85prrfuS6VczU+9X1qH3RmCOQ+/EK4Q8mudV+Vv+WEgCh4pZuk8A+UAPU/dTjivt5+YLjpmZ3BVkN47gKRbuvdcBVJyPb8rZEnw1IvWSKWsGUYpimloXYLSK86gWClTRmi6C2Eg03tpKgUlGbXZuKel5DT4h/WoIpcMB8qrjy+lN7T/edyFbKg/KiMPArOSwGtcCBgkiqxl6NnACsr0MiA3dGpcK+elcBGdz3S9tkZyhdAnxYjJfJWmGZzkE2B0P6FiU1TublSS+eRD2QzTVo8MWQ1rOfkC8nth4dwKigYbzEW+qJPk0wp61VDnzDcUSbIgUDCIUN8e+kUZwJhHaF/wOx3GHCUchfeGV8RqrqXo42OLAjowNE6jOji08/2Zu0Y+AhG6ySp/r7nMybA6qz9Yxto4K5xEWZ7FgeLagf3q7FWcRtVi3yxsUCzUqg79zW34dme3lCFS2zCYwrICb0hTflQBdHsphEWxTgWIyAS5DoJ0NNenA6Hw0QPLvIRQtTRREwC0F5YZvJLA4XSW+yQ4BOSli4pKKl0y9u0yaen23sObNDev2AP0YIAv/PY7LeWE5IfJsdvAxQeVHhmmA/uUoASnYtAUtYIL+FCKh3QFj9BsvVeDWQTBCu9tM6nJQG4dUJddHjihb4Xb893qjxJYHq+9JSSxfZ4sokcGVK04mC/wVvhENXlQoS8ANQzr5XKf5rlA3qvkeJFxiX0OYth2p5LGi0StLbR8e+Iwriu55dzYFWzR2iu0y2ZTZuUC9suAZNByZqjgIRi7F6IM0gGwvnHto4D3JTcsls/vL0tx8yHhGzUHe1XRDXd+hFRtribytzCMGAon8GqoqPzEUBhnQ2FIrikfpEOG4hONzNdbYbxI3DvLMJ3azur7GnVW6WdeXa0fsSFbt+SE+5VNApoG2kZVFSzkvLnlpS09yaXzkxVaLR2NrM6XibbQ+zc15MK5t26+aSjmLbgu9v5s5pEv6L0OGVauwcRA+93x20aR8K1Q6fORk4HPvwss8iBkCxClexs/nitYoIEFCptfC+ZklF0MmF4qyOVBtLw+iPKoQljr6L1NwNPddw93/7qLoVm0iTdlsonzIoyrbNOc7l6/jTY70KF3mNbV5h1znTZxFYV5VKLdbV7d/f3ua/qXJyk3eViXJT8eVFmYlDEgQB2iLn38H0xSbaqwLgr+PygLAZs22zSsonr11ABwuXpqQH+nWRLNvSPbUyuuq4wfzcr5URBZuXUNP7Zp3+gsI5/F/y7onexpUKGDLnSiuK85RCv6XwptwCF+d67K4FXXHo5syU45nH1u/bzYM7O76yGk/zryqsI3gu91l+asezP87k/Hmes+5GNHtbTkuY5JdSRMjDBAef3DdKijtx/xEbWq31K0AtxotFZlMN8S5cpWycMXfR+Nn5efh+S6V9G7SHtoBaygdzUaMbPR5NEpXngzWm+yd8N+f8PpSRlmdQ1uqexc1+ioFmUgtq3FthlArt217Edqs4Oo8bMBCket/qd0Zf9o0CsKfR+dvEpk8t8PfZtu8Nat2WSrWRycp8eu9cd5nYW5OIUUxXUJhu7c4iTIjVmsAmRUVXG87nNlE+vcwKGXUlZHmQXg3TFUyINfO2vknYYKcjNJey4PIPqVeYgydLvt3vgj/Su5U25OrxpeW2/HUR8q6WbY71Yiy2DP/1lQHRlFoj60LZedH7aFrO+XFV2whLJ4qV3s9AdD/1fW9B/Xn8L5hZEYojrmKEiSsI5jmKkOq+szpWal/wISIDWMCmVuZHN0cmVhbQplbmRvYmoKMiAwIG9iaiA8PAovVHlwZSAvUGFnZQovQ29udGVudHMgMyAwIFIKL1Jlc291cmNlcyAxIDAgUgovTWVkaWFCb3ggWzAgMCA1OTUuMjc2IDg0MS44OV0KL1BhcmVudCAxMyAwIFIKPj4gZW5kb2JqCjEgMCBvYmogPDwKL0ZvbnQgPDwgL0YxNiA0IDAgUiAvRjIxIDUgMCBSIC9GMTcgNiAwIFIgL0YzMiA3IDAgUiAvRjggOCAwIFIgL0YzNCA5IDAgUiAvRjI3IDEwIDAgUiAvRjI4IDExIDAgUiAvRjMxIDEyIDAgUiA+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKMTQgMCBvYmoKWzUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNV0KZW5kb2JqCjE1IDAgb2JqClsyODUuNSA1MTMuOSA4NTYuNSA1MTMuOSA4NTYuNSA3OTkuNCAyODUuNSAzOTkuNyAzOTkuNyA1MTMuOSA3OTkuNCAyODUuNSAzNDIuNiAyODUuNSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSAyODUuNSAyODUuNSAyODUuNSA3OTkuNCA0ODUuMyA0ODUuMyA3OTkuNCA3NzAuNyA3MjcuOSA3NDIuMyA3ODUgNjk5LjQgNjcwLjggODA2LjUgNzcwLjcgMzcxIDUyOC4xIDc5OS4yIDY0Mi4zIDk0MiA3NzAuNyA3OTkuNCA2OTkuNCA3OTkuNCA3NTYuNSA1NzEgNzQyLjMgNzcwLjcgNzcwLjcgMTA1Ni4yIDc3MC43IDc3MC43IDYyOC4xIDI4NS41IDUxMy45IDI4NS41IDUxMy45IDI4NS41IDI4NS41IDUxMy45IDU3MSA0NTYuOCA1NzEgNDU3LjIgMzE0IDUxMy45IDU3MSAyODUuNSAzMTQgNTQyLjQgMjg1LjUgODU2LjUgNTcxIDUxMy45IDU3MSA1NDIuNCA0MDIgNDA1LjQgMzk5LjcgNTcxIDU0Mi40IDc0Mi4zIDU0Mi40IDU0Mi40XQplbmRvYmoKMTYgMCBvYmoKWzYzOC45XQplbmRvYmoKMTcgMCBvYmoKWzU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDMxMi41IDMxMi41IDM0Mi42IDg3NSA1MzEuMiA1MzEuMiA4NzUgODQ5LjUgNzk5LjggODEyLjUgODYyLjMgNzM4LjQgNzA3LjIgODg0LjMgODc5LjYgNDE5IDU4MSA4ODAuOCA2NzUuOSAxMDY3LjEgODc5LjYgODQ0LjkgNzY4LjUgODQ0LjkgODM5LjEgNjI1IDc4Mi40IDg2NC42IDg0OS41IDExNjIgODQ5LjUgODQ5LjUgNjg3LjUgMzEyLjUgNTgxIDMxMi41IDU2Mi41IDMxMi41IDMxMi41IDU0Ni45IDYyNSA1MDAgNjI1IDUxMy4zIDM0My43IDU2Mi41IDYyNSAzMTIuNSAzNDMuNyA1OTMuNyAzMTIuNSA5MzcuNSA2MjUgNTYyLjUgNjI1IDU5My43IDQ1OS41IDQ0My44IDQzNy41IDYyNV0KZW5kb2JqCjE4IDAgb2JqCls1ODMuMyA1NTUuNiA1NTUuNiA4MzMuMyA4MzMuMyAyNzcuOCAzMDUuNiA1MDAgNTAwIDUwMCA1MDAgNTAwIDc1MCA0NDQuNCA1MDAgNzIyLjIgNzc3LjggNTAwIDkwMi44IDEwMTMuOSA3NzcuOCAyNzcuOCAyNzcuOCA1MDAgODMzLjMgNTAwIDgzMy4zIDc3Ny44IDI3Ny44IDM4OC45IDM4OC45IDUwMCA3NzcuOCAyNzcuOCAzMzMuMyAyNzcuOCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDI3Ny44IDI3Ny44IDI3Ny44IDc3Ny44IDQ3Mi4yIDQ3Mi4yIDc3Ny44IDc1MCA3MDguMyA3MjIuMiA3NjMuOSA2ODAuNiA2NTIuOCA3ODQuNyA3NTAgMzYxLjEgNTEzLjkgNzc3LjggNjI1IDkxNi43IDc1MCA3NzcuOCA2ODAuNiA3NzcuOCA3MzYuMSA1NTUuNiA3MjIuMiA3NTAgNzUwIDEwMjcuOCA3NTAgNzUwIDYxMS4xIDI3Ny44IDUwMCAyNzcuOCA1MDAgMjc3LjggMjc3LjggNTAwIDU1NS42IDQ0NC40IDU1NS42IDQ0NC40IDMwNS42IDUwMCA1NTUuNiAyNzcuOCAzMDUuNiA1MjcuOCAyNzcuOCA4MzMuMyA1NTUuNiA1MDAgNTU1LjYgNTI3LjggMzkxLjcgMzk0LjQgMzg4LjkgNTU1LjYgNTI3LjggNzIyLjIgNTI3LjggNTI3LjggNDQ0LjRdCmVuZG9iagoxOSAwIG9iagpbODY5LjQgODE4LjEgODMwLjYgODgxLjkgNzU1LjYgNzIzLjYgOTA0LjIgOTAwIDQzNi4xIDU5NC40IDkwMS40IDY5MS43IDEwOTEuNyA5MDAgODYzLjkgNzg2LjEgODYzLjkgODYyLjUgNjM4LjkgODAwIDg4NC43IDg2OS40IDExODguOSA4NjkuNCA4NjkuNCA3MDIuOCAzMTkuNCA2MDIuOCAzMTkuNCA1NzUgMzE5LjQgMzE5LjQgNTU5IDYzOC45IDUxMS4xIDYzOC45IDUyNy4xIDM1MS40IDU3NSA2MzguOSAzMTkuNCAzNTEuNCA2MDYuOSAzMTkuNCA5NTguMyA2MzguOSA1NzUgNjM4LjkgNjA2LjkgNDczLjYgNDUzLjYgNDQ3LjJdCmVuZG9iagoyMCAwIG9iagpbMjcyIDMyNi40IDI3MiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiAyNzIgMjcyIDI3MiA3NjEuNiA0NjIuNCA0NjIuNCA3NjEuNiA3MzQgNjkzLjQgNzA3LjIgNzQ3LjggNjY2LjIgNjM5IDc2OC4zIDczNCAzNTMuMiA1MDMgNzYxLjIgNjExLjggODk3LjIgNzM0IDc2MS42IDY2Ni4yIDc2MS42IDcyMC42IDU0NCA3MDcuMiA3MzQgNzM0IDEwMDYgNzM0IDczNCA1OTguNCAyNzIgNDg5LjYgMjcyIDQ4OS42IDI3MiAyNzIgNDg5LjYgNTQ0IDQzNS4yIDU0NCA0MzUuMiAyOTkuMiA0ODkuNiA1NDQgMjcyIDI5OS4yIDUxNi44IDI3MiA4MTYgNTQ0IDQ4OS42IDU0NCA1MTYuOCAzODAuOCAzODYuMiAzODAuOCA1NDQgNTE2LjggNzA3LjIgNTE2LjggNTE2LjggNDM1LjIgNDg5LjYgOTc5LjIgNDg5LjYgNDg5LjYgNDg5LjZdCmVuZG9iagoyMSAwIG9iagpbNTAwXQplbmRvYmoKMjIgMCBvYmoKWzYwMi4xIDcyNi4zIDY5My4zIDMyNy42IDQ3MS41IDcxOS40IDU3NiA4NTAgNjkzLjMgNzE5LjggNjI4LjIgNzE5LjggNjgwLjUgNTEwLjkgNjY3LjYgNjkzLjMgNjkzLjMgOTU0LjUgNjkzLjMgNjkzLjMgNTYzLjEgMjQ5LjYgNDU4LjYgMjQ5LjYgNDU4LjYgMjQ5LjYgMjQ5LjYgNDU4LjYgNTEwLjkgNDA2LjQgNTEwLjkgNDA2LjQgMjc1LjggNDU4LjYgNTEwLjkgMjQ5LjYgMjc1LjggNDg0LjcgMjQ5LjYgNzcyLjEgNTEwLjkgNDU4LjYgNTEwLjkgNDg0LjcgMzU0LjEgMzU5LjQgMzU0LjEgNTEwLjkgNDg0LjcgNjY3LjYgNDg0LjcgNDg0LjddCmVuZG9iagoyMyAwIG9iaiA8PAovTGVuZ3RoMSAxNDc4Ci9MZW5ndGgyIDg1MTgKL0xlbmd0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v8GGxC7XToegrvebyXdbtw9p5HgLpTWptCKqTLk+yf8P4ygJngplbmRzdHJlYW0KZW5kb2JqCjQwIDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL01GTURBRitDTVRUOQovRmxhZ3MgNAovRm9udEJCb3ggWy02IC0yMzMgNTQyIDY5OF0KL0FzY2VudCA2MTEKL0NhcEhlaWdodCA2MTEKL0Rlc2NlbnQgLTIyMgovSXRhbGljQW5nbGUgMAovU3RlbVYgNzQKL1hIZWlnaHQgNDMxCi9DaGFyU2V0ICgvZi9uL28vcikKL0ZvbnRGaWxlIDM5IDAgUgo+PiBlbmRvYmoKNyAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9RWktSRE0rQ01CWDEwCi9Gb250RGVzY3JpcHRvciAyNCAwIFIKL0ZpcnN0Q2hhciA2NQovTGFzdENoYXIgMTE2Ci9XaWR0aHMgMTkgMCBSCj4+IGVuZG9iago5IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dYR0dCUStDTUJYMTIKL0ZvbnREZXNjcmlwdG9yIDI2IDAgUgovRmlyc3RDaGFyIDQ5Ci9MYXN0Q2hhciAxMTcKL1dpZHRocyAxNyAwIFIKPj4gZW5kb2JqCjggMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvUlpQTUxTK0NNUjEwCi9Gb250RGVzY3JpcHRvciAyOCAwIFIKL0ZpcnN0Q2hhciAxMQovTGFzdENoYXIgMTIyCi9XaWR0aHMgMTggMCBSCj4+IGVuZG9iago2IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1BIQlhEUStDTVIxMgovRm9udERlc2NyaXB0b3IgMzAgMCBSCi9GaXJzdENoYXIgNDQKL0xhc3RDaGFyIDEyNwovV2lkdGhzIDIwIDAgUgo+PiBlbmRvYmoKNCAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9KVFlNS04rQ01SMTcKL0ZvbnREZXNjcmlwdG9yIDMyIDAgUgovRmlyc3RDaGFyIDcwCi9MYXN0Q2hhciAxMjEKL1dpZHRocyAyMiAwIFIKPj4gZW5kb2JqCjExIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1RLSkhISStDTVI5Ci9Gb250RGVzY3JpcHRvciAzNCAwIFIKL0ZpcnN0Q2hhciAzMwovTGFzdENoYXIgMTIxCi9XaWR0aHMgMTUgMCBSCj4+IGVuZG9iago1IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1VFSVpZVytDTVNZMTAKL0ZvbnREZXNjcmlwdG9yIDM2IDAgUgovRmlyc3RDaGFyIDMKL0xhc3RDaGFyIDMKL1dpZHRocyAyMSAwIFIKPj4gZW5kb2JqCjEwIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dVT1dUSytDTVNZNgovRm9udERlc2NyaXB0b3IgMzggMCBSCi9GaXJzdENoYXIgMwovTGFzdENoYXIgMwovV2lkdGhzIDE2IDAgUgo+PiBlbmRvYmoKMTIgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvTUZNREFGK0NNVFQ5Ci9Gb250RGVzY3JpcHRvciA0MCAwIFIKL0ZpcnN0Q2hhciAxMDIKL0xhc3RDaGFyIDExNAovV2lkdGhzIDE0IDAgUgo+PiBlbmRvYmoKMTMgMCBvYmogPDwKL1R5cGUgL1BhZ2VzCi9Db3VudCAxCi9LaWRzIFsyIDAgUl0KPj4gZW5kb2JqCjQxIDAgb2JqIDw8Ci9UeXBlIC9DYXRhbG9nCi9QYWdlcyAxMyAwIFIKPj4gZW5kb2JqCjQyIDAgb2JqIDw8Ci9Qcm9kdWNlciAocGRmVGVYLTEuNDAuMTApCi9DcmVhdG9yIChUZVgpCi9DcmVhdGlvbkRhdGUgKEQ6MjAxMjA2MTExODA4NDYrMDInMDAnKQovTW9kRGF0ZSAoRDoyMDEyMDYxMTE4MDg0NiswMicwMCcpCi9UcmFwcGVkIC9GYWxzZQovUFRFWC5GdWxsYmFubmVyIChUaGlzIGlzIHBkZlRlWCwgVmVyc2lvbiAzLjE0MTU5MjYtMS40MC4xMC0yLjIgKFRlWCBMaXZlIDIwMDkvRGViaWFuKSBrcGF0aHNlYSB2ZXJzaW9uIDUuMC4wKQo+PiBlbmRvYmoKeHJlZgowIDQzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMzMxNiAwMDAwMCBuIAowMDAwMDAzMjA0IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDEwODgzNCAwMDAwMCBuIAowMDAwMTA5MTEyIDAwMDAwIG4gCjAwMDAxMDg2OTUgMDAwMDAgbiAKMDAwMDEwODI3NiAwMDAwMCBuIAowMDAwMTA4NTU2IDAwMDAwIG4gCjAwMDAxMDg0MTYgMDAwMDAgbiAKMDAwMDEwOTI0OSAwMDAwMCBuIAowMDAwMTA4OTczIDAwMDAwIG4gCjAwMDAxMDkzODYgMDAwMDAgbiAKMDAwMDEwOTUyNyAwMDAwMCBuIAowMDAwMDAzNDc0IDAwMDAwIG4gCjAwMDAwMDM1NDQgMDAwMDAgbiAKMDAwMDAwNDA3MSAwMDAwMCBuIAowMDAwMDA0MDk1IDAwMDAwIG4gCjAwMDAwMDQ1MDEgMDAwMDAgbiAKMDAwMDAwNTEyMyAwMDAwMCBuIAowMDAwMDA1NDQxIDAwMDAwIG4gCjAwMDAwMDU5MDYgMDAwMDAgbiAKMDAwMDAwNTkyOCAwMDAwMCBuIAowMDAwMDA2MjU0IDAwMDAwIG4gCjAwMDAwMTU4NzcgMDAwMDAgbiAKMDAwMDAxNjEwOCAwMDAwMCBuIAowMDAwMDI0NDIxIDAwMDAwIG4gCjAwMDAwMjQ2NjAgMDAwMDAgbiAKMDAwMDA0MzkyNSAwMDAwMCBuIAowMDAwMDQ0MzQyIDAwMDAwIG4gCjAwMDAwNTg3MzMgMDAwMDAgbiAKMDAwMDA1OTA1NiAwMDAwMCBuIAowMDAwMDY5NjY1IDAwMDAwIG4gCjAwMDAwNjk5MTcgMDAwMDAgbiAKMDAwMDA4NTU4MCAwMDAwMCBuIAowMDAwMDg1OTMxIDAwMDAwIG4gCjAwMDAwOTMwNDggMDAwMDAgbiAKMDAwMDA5MzI3OSAwMDAwMCBuIAowMDAwMTAwNDQ1IDAwMDAwIG4gCjAwMDAxMDA2NzQgMDAwMDAgbiAKMDAwMDEwODA1NSAwMDAwMCBuIAowMDAwMTA5NTg1IDAwMDAwIG4gCjAwMDAxMDk2MzYgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA0MwovUm9vdCA0MSAwIFIKL0luZm8gNDIgMCBSCi9JRCBbPEE1MTIyOERDMEI2RDhERTcwNDA5QjM4RUY1MDJDQkYwPiA8QTUxMjI4REMwQjZEOERFNzA0MDlCMzhFRjUwMkNCRjA+XSA+PgpzdGFydHhyZWYKMTA5OTAyCiUlRU9GCg=="
391 ///////// Rest taken from generated pdf.js. (c) by Mozilla. ////////
392 ///////// File unchanged, except that all references to DOM- ////////
393 ///////// specific global names have been prefixed by PdfJS_window., ////////
394 ///////// to avoid interference with the benchmark runner script. ////////
396 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
397 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
401 (function pdfjsWrapper() {
402 // Use strict in our context only - users might not want it
405 PDFJS.build = '3cc61f0';
407 // Files are inserted below - see Makefile
408 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
409 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
413 var globalScope = (typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window;
415 var isWorker = (typeof PdfJS_window.window == 'undefined');
417 var ERRORS = 0, WARNINGS = 1, TODOS = 5;
418 var verbosity = WARNINGS;
420 // The global PDFJS object exposes the API
421 // In production, it will be declared outside a global wrapper
422 // In development, it will be declared here
423 if (!globalScope.PDFJS) {
424 globalScope.PDFJS = {};
428 // Convenience function to perform binary Ajax GET
429 // Usage: getPdf('http://...', callback)
432 // [,progress:Function, error:Function]
435 function getPdf(arg, callback) {
437 if (typeof arg === 'string')
438 params = { url: arg };
440 var xhr = new PdfJS_window.XMLHttpRequest();
441 xhr.open('GET', params.url);
442 xhr.mozResponseType = xhr.responseType = 'arraybuffer';
443 var protocol = params.url.indexOf(':') < 0 ? PdfJS_window.window.location.protocol :
444 params.url.substring(0, params.url.indexOf(':') + 1);
445 xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0;
447 if ('progress' in params)
448 xhr.onprogress = params.progress || undefined;
450 if ('error' in params)
451 xhr.onerror = params.error || undefined;
453 xhr.onreadystatechange = function getPdfOnreadystatechange(e) {
454 if (xhr.readyState === 4) {
455 if (xhr.status === xhr.expected) {
456 var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse ||
457 xhr.responseArrayBuffer || xhr.response);
459 } else if (params.error) {
466 globalScope.PDFJS.getPdf = getPdf;
467 globalScope.PDFJS.pdfBug = false;
469 var Page = (function PageClosure() {
470 function Page(xref, pageNumber, pageDict, ref) {
471 this.pageNumber = pageNumber;
472 this.pageDict = pageDict;
476 this.displayReadyPromise = null;
480 getPageProp: function Page_getPageProp(key) {
481 return this.pageDict.get(key);
483 inheritPageProp: function Page_inheritPageProp(key) {
484 var dict = this.pageDict;
485 var obj = dict.get(key);
486 while (obj === undefined) {
487 dict = dict.get('Parent');
495 return shadow(this, 'content', this.getPageProp('Contents'));
498 return shadow(this, 'resources', this.inheritPageProp('Resources'));
501 var obj = this.inheritPageProp('MediaBox');
502 // Reset invalid media box to letter size.
503 if (!isArray(obj) || obj.length !== 4)
504 obj = [0, 0, 612, 792];
505 return shadow(this, 'mediaBox', obj);
508 var mediaBox = this.mediaBox;
509 var cropBox = this.inheritPageProp('CropBox');
510 if (!isArray(cropBox) || cropBox.length !== 4)
511 return shadow(this, 'view', mediaBox);
513 // From the spec, 6th ed., p.963:
514 // "The crop, bleed, trim, and art boxes should not ordinarily
515 // extend beyond the boundaries of the media box. If they do, they are
516 // effectively reduced to their intersection with the media box."
517 cropBox = Util.intersect(cropBox, mediaBox);
519 return shadow(this, 'view', mediaBox);
521 return shadow(this, 'view', cropBox);
524 return shadow(this, 'annotations', this.inheritPageProp('Annots'));
527 var rotate = this.inheritPageProp('Rotate') || 0;
528 // Normalize rotation so it's a multiple of 90 and between 0 and 270
529 if (rotate % 90 != 0) {
531 } else if (rotate >= 360) {
532 rotate = rotate % 360;
533 } else if (rotate < 0) {
534 // The spec doesn't cover negatives, assume its counterclockwise
535 // rotation. The following is the other implementation of modulo.
536 rotate = ((rotate % 360) + 360) % 360;
538 return shadow(this, 'rotate', rotate);
541 getOperatorList: function Page_getOperatorList(handler, dependency) {
542 var xref = this.xref;
543 var content = this.content;
544 var resources = this.resources;
545 if (isArray(content)) {
548 var i, n = content.length;
549 for (i = 0; i < n; ++i)
550 streams.push(xref.fetchIfRef(content[i]));
551 content = new StreamsSequenceStream(streams);
552 } else if (isStream(content)) {
554 } else if (!content) {
555 // replacing non-existent page content with empty one
556 content = new Stream(new Uint8Array(0));
559 var pe = this.pe = new PartialEvaluator(
560 xref, handler, 'p' + this.pageNumber + '_');
562 return pe.getOperatorList(content, resources, dependency);
565 getLinks: function Page_getLinks() {
567 var annotations = pageGetAnnotations();
568 var i, n = annotations.length;
569 for (i = 0; i < n; ++i) {
570 if (annotations[i].type != 'Link')
572 links.push(annotations[i]);
576 getAnnotations: function Page_getAnnotations() {
577 var xref = this.xref;
578 function getInheritableProperty(annotation, name) {
579 var item = annotation;
580 while (item && !item.has(name)) {
581 item = item.get('Parent');
585 return item.get(name);
587 function isValidUrl(url) {
590 var colon = url.indexOf(':');
593 var protocol = url.substr(0, colon);
605 var annotations = this.annotations || [];
606 var i, n = annotations.length;
608 for (i = 0; i < n; ++i) {
609 var annotationRef = annotations[i];
610 var annotation = xref.fetch(annotationRef);
611 if (!isDict(annotation))
613 var subtype = annotation.get('Subtype');
614 if (!isName(subtype))
616 var rect = annotation.get('Rect');
619 item.type = subtype.name;
621 switch (subtype.name) {
623 var a = annotation.get('A');
625 switch (a.get('S').name) {
627 var url = a.get('URI');
628 // TODO: pdf spec mentions urls can be relative to a Base
629 // entry in the dictionary.
630 if (!isValidUrl(url))
635 item.dest = a.get('D');
638 TODO('other link types');
640 } else if (annotation.has('Dest')) {
641 // simple destination link
642 var dest = annotation.get('Dest');
643 item.dest = isName(dest) ? dest.name : dest;
647 var fieldType = getInheritableProperty(annotation, 'FT');
648 if (!isName(fieldType))
650 item.fieldType = fieldType.name;
651 // Building the full field name by collecting the field and
652 // its ancestors 'T' properties and joining them using '.'.
654 var namedItem = annotation, ref = annotationRef;
656 var parent = namedItem.get('Parent');
657 var parentRef = namedItem.getRaw('Parent');
658 var name = namedItem.get('T');
660 fieldName.unshift(stringToPDFString(name));
662 // The field name is absent, that means more than one field
663 // with the same name may exist. Replacing the empty name
664 // with the '`' plus index in the parent's 'Kids' array.
665 // This is not in the PDF spec but necessary to id the
666 // the input controls.
667 var kids = parent.get('Kids');
669 for (j = 0, jj = kids.length; j < jj; j++) {
670 var kidRef = kids[j];
671 if (kidRef.num == ref.num && kidRef.gen == ref.gen)
674 fieldName.unshift('`' + j);
679 item.fullName = fieldName.join('.');
680 var alternativeText = stringToPDFString(annotation.get('TU') || '');
681 item.alternativeText = alternativeText;
682 var da = getInheritableProperty(annotation, 'DA') || '';
683 var m = /([\d\.]+)\sTf/.exec(da);
685 item.fontSize = parseFloat(m[1]);
686 item.textAlignment = getInheritableProperty(annotation, 'Q');
687 item.flags = getInheritableProperty(annotation, 'Ff') || 0;
690 var content = annotation.get('Contents');
691 var title = annotation.get('T');
692 item.content = stringToPDFString(content || '');
693 item.title = stringToPDFString(title || '');
694 item.name = !annotation.has('Name') ? 'Note' :
695 annotation.get('Name').name;
698 TODO('unimplemented annotation type: ' + subtype.name);
711 * The `PDFDocument` holds all the data of the PDF file. Compared to the
712 * `PDFDoc`, this one doesn't have any job management code.
713 * Right now there exists one PDFDocument on the main thread + one object
714 * for each worker. If there is no worker support enabled, there are two
715 * `PDFDocument` objects on the main thread created.
717 var PDFDocument = (function PDFDocumentClosure() {
718 function PDFDocument(arg, callback) {
720 init.call(this, arg);
721 else if (isArrayBuffer(arg))
722 init.call(this, new Stream(arg));
724 error('PDFDocument: Unknown argument type');
727 function init(stream) {
728 assertWellFormed(stream.length > 0, 'stream must have data');
729 this.stream = stream;
731 this.acroForm = this.catalog.catDict.get('AcroForm');
734 function find(stream, needle, limit, backwards) {
735 var pos = stream.pos;
736 var end = stream.end;
738 if (pos + limit > end)
740 for (var n = 0; n < limit; ++n)
741 str += stream.getChar();
743 var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
745 return false; /* not found */
747 return true; /* found */
750 PDFDocument.prototype = {
751 get linearization() {
752 var length = this.stream.length;
753 var linearization = false;
755 linearization = new Linearization(this.stream);
756 if (linearization.length != length)
757 linearization = false;
759 // shadow the prototype getter with a data property
760 return shadow(this, 'linearization', linearization);
763 var stream = this.stream;
765 var linearization = this.linearization;
767 // Find end of first obj.
769 if (find(stream, 'endobj', 1024))
770 startXRef = stream.pos + 6;
772 // Find startxref by jumping backward from the end of the file.
774 var found = false, pos = stream.end;
775 while (!found && pos > 0) {
776 pos -= step - 'startxref'.length;
780 found = find(stream, 'startxref', step, true);
786 ch = stream.getChar();
787 } while (Lexer.isSpace(ch));
789 while ((ch - '0') <= 9) {
791 ch = stream.getChar();
793 startXRef = parseInt(str, 10);
794 if (isNaN(startXRef))
798 // shadow the prototype getter with a data property
799 return shadow(this, 'startXRef', startXRef);
801 get mainXRefEntriesOffset() {
802 var mainXRefEntriesOffset = 0;
803 var linearization = this.linearization;
805 mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
806 // shadow the prototype getter with a data property
807 return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
809 // Find the header, remove leading garbage and setup the stream
810 // starting from the header.
811 checkHeader: function PDFDocument_checkHeader() {
812 var stream = this.stream;
814 if (find(stream, '%PDF-', 1024)) {
815 // Found the header, trim off any garbage before it.
819 // May not be a PDF file, continue anyway.
821 setup: function PDFDocument_setup(ownerPassword, userPassword) {
823 var xref = new XRef(this.stream,
825 this.mainXRefEntriesOffset);
827 this.catalog = new Catalog(xref);
830 var linearization = this.linearization;
831 var num = linearization ? linearization.numPages : this.catalog.numPages;
832 // shadow the prototype getter
833 return shadow(this, 'numPages', num);
835 getDocumentInfo: function PDFDocument_getDocumentInfo() {
837 if (this.xref.trailer.has('Info')) {
838 var infoDict = this.xref.trailer.get('Info');
841 infoDict.forEach(function(key, value) {
842 info[key] = typeof value !== 'string' ? value :
843 stringToPDFString(value);
847 return shadow(this, 'getDocumentInfo', info);
849 getFingerprint: function PDFDocument_getFingerprint() {
850 var xref = this.xref, fileID;
851 if (xref.trailer.has('ID')) {
853 var id = xref.trailer.get('ID')[0];
854 id.split('').forEach(function(el) {
855 fileID += Number(el.charCodeAt(0)).toString(16);
858 // If we got no fileID, then we generate one,
859 // from the first 100 bytes of PDF
860 var data = this.stream.bytes.subarray(0, 100);
861 var hash = calculateMD5(data, 0, data.length);
863 for (var i = 0, length = hash.length; i < length; i++) {
864 fileID += Number(hash[i]).toString(16);
868 return shadow(this, 'getFingerprint', fileID);
870 getPage: function PDFDocument_getPage(n) {
871 return this.catalog.getPage(n);
878 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
879 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
884 if (PdfJS_window.console && PdfJS_window.console.log)
885 PdfJS_window.console.log(msg);
891 if (verbosity >= WARNINGS)
892 log('Warning: ' + msg);
895 function backtrace() {
899 return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
903 function error(msg) {
904 log('Error: ' + msg);
906 throw new Error(msg);
909 function TODO(what) {
910 if (verbosity >= TODOS)
911 log('TODO: ' + what);
914 function malformed(msg) {
915 error('Malformed PDF: ' + msg);
918 function assert(cond, msg) {
923 // In a well-formed PDF, |cond| holds. If it doesn't, subsequent
924 // behavior is undefined.
925 function assertWellFormed(cond, msg) {
930 function shadow(obj, prop, value) {
931 Object.defineProperty(obj, prop, { value: value,
938 function bytesToString(bytes) {
940 var length = bytes.length;
941 for (var n = 0; n < length; ++n)
942 str += String.fromCharCode(bytes[n]);
946 function stringToBytes(str) {
947 var length = str.length;
948 var bytes = new Uint8Array(length);
949 for (var n = 0; n < length; ++n)
950 bytes[n] = str.charCodeAt(n) & 0xFF;
954 var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
956 var Util = PDFJS.Util = (function UtilClosure() {
959 Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
960 var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0;
961 return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
964 Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) {
965 c = (new DeviceCmykCS()).getRgb([c, m, y, k]);
966 var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0;
967 return 'rgb(' + ri + ',' + gi + ',' + bi + ')';
970 // For 2d affine transforms
971 Util.applyTransform = function Util_applyTransform(p, m) {
972 var xt = p[0] * m[0] + p[1] * m[2] + m[4];
973 var yt = p[0] * m[1] + p[1] * m[3] + m[5];
977 Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
978 var d = m[0] * m[3] - m[1] * m[2];
979 var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
980 var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
984 Util.inverseTransform = function Util_inverseTransform(m) {
985 var d = m[0] * m[3] - m[1] * m[2];
986 return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
987 (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
990 // Apply a generic 3d matrix M on a 3-vector v:
994 // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
996 Util.apply3dTransform = function Util_apply3dTransform(m, v) {
998 m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
999 m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
1000 m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
1004 // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
1005 // For coordinate systems whose origin lies in the bottom-left, this
1006 // means normalization to (BL,TR) ordering. For systems with origin in the
1007 // top-left, this means (TL,BR) ordering.
1008 Util.normalizeRect = function Util_normalizeRect(rect) {
1009 var r = rect.slice(0); // clone rect
1010 if (rect[0] > rect[2]) {
1014 if (rect[1] > rect[3]) {
1021 // Returns a rectangle [x1, y1, x2, y2] corresponding to the
1022 // intersection of rect1 and rect2. If no intersection, returns 'false'
1023 // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
1024 Util.intersect = function Util_intersect(rect1, rect2) {
1025 function compare(a, b) {
1029 // Order points along the axes
1030 var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
1031 orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
1034 rect1 = Util.normalizeRect(rect1);
1035 rect2 = Util.normalizeRect(rect2);
1037 // X: first and second points belong to different rectangles?
1038 if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
1039 (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
1040 // Intersection must be between second and third points
1041 result[0] = orderedX[1];
1042 result[2] = orderedX[2];
1047 // Y: first and second points belong to different rectangles?
1048 if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
1049 (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
1050 // Intersection must be between second and third points
1051 result[1] = orderedY[1];
1052 result[3] = orderedY[2];
1060 Util.sign = function Util_sign(num) {
1061 return num < 0 ? -1 : 1;
1067 var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
1068 function PageViewport(viewBox, scale, rotate, offsetX, offsetY) {
1069 // creating transform to convert pdf coordinate system to the normal
1070 // canvas like coordinates taking in account scale and rotation
1071 var centerX = (viewBox[2] + viewBox[0]) / 2;
1072 var centerY = (viewBox[3] + viewBox[1]) / 2;
1073 var rotateA, rotateB, rotateC, rotateD;
1077 rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
1081 rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
1085 rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
1090 rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
1093 var offsetCanvasX, offsetCanvasY;
1096 offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
1097 offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
1098 width = Math.abs(viewBox[3] - viewBox[1]) * scale;
1099 height = Math.abs(viewBox[2] - viewBox[0]) * scale;
1101 offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
1102 offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
1103 width = Math.abs(viewBox[2] - viewBox[0]) * scale;
1104 height = Math.abs(viewBox[3] - viewBox[1]) * scale;
1106 // creating transform for the following operations:
1107 // translate(-centerX, -centerY), rotate and flip vertically,
1108 // scale, and translate(offsetCanvasX, offsetCanvasY)
1114 offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
1115 offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
1118 this.offsetX = offsetX;
1119 this.offsetY = offsetY;
1121 this.height = height;
1122 this.fontScale = scale;
1124 PageViewport.prototype = {
1125 convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
1126 return Util.applyTransform([x, y], this.transform);
1128 convertToViewportRectangle:
1129 function PageViewport_convertToViewportRectangle(rect) {
1130 var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
1131 var br = Util.applyTransform([rect[2], rect[3]], this.transform);
1132 return [tl[0], tl[1], br[0], br[1]];
1134 convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
1135 return Util.applyInverseTransform([x, y], this.transform);
1138 return PageViewport;
1141 var PDFStringTranslateTable = [
1142 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1143 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1147 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
1148 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
1149 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
1150 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
1153 function stringToPDFString(str) {
1154 var i, n = str.length, str2 = '';
1155 if (str[0] === '\xFE' && str[1] === '\xFF') {
1157 for (i = 2; i < n; i += 2)
1158 str2 += String.fromCharCode(
1159 (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
1161 for (i = 0; i < n; ++i) {
1162 var code = PDFStringTranslateTable[str.charCodeAt(i)];
1163 str2 += code ? String.fromCharCode(code) : str.charAt(i);
1169 function isBool(v) {
1170 return typeof v == 'boolean';
1174 return typeof v == 'number' && ((v | 0) == v);
1178 return typeof v == 'number';
1181 function isString(v) {
1182 return typeof v == 'string';
1185 function isNull(v) {
1189 function isName(v) {
1190 return v instanceof Name;
1193 function isCmd(v, cmd) {
1194 return v instanceof Cmd && (!cmd || v.cmd == cmd);
1197 function isDict(v, type) {
1198 return v instanceof Dict && (!type || v.get('Type').name == type);
1201 function isArray(v) {
1202 return v instanceof Array;
1205 function isStream(v) {
1206 return typeof v == 'object' && v != null && ('getChar' in v);
1209 function isArrayBuffer(v) {
1210 return typeof v == 'object' && v != null && ('byteLength' in v);
1214 return v instanceof Ref;
1217 function isPDFFunction(v) {
1219 if (typeof v != 'object')
1223 else if (isStream(v))
1227 return fnDict.has('FunctionType');
1232 * Each object that is stored in PDFObjects is based on a Promise object that
1233 * contains the status of the object and the data. There migth be situations,
1234 * where a function want to use the value of an object, but it isn't ready at
1235 * that time. To get a notification, once the object is ready to be used, s.o.
1236 * can add a callback using the `then` method on the promise that then calls
1237 * the callback once the object gets resolved.
1238 * A promise can get resolved only once and only once the data of the promise
1239 * can be set. If any of these happens twice or the data is required before
1240 * it was set, an exception is throw.
1242 var Promise = PDFJS.Promise = (function PromiseClosure() {
1243 var EMPTY_PROMISE = {};
1246 * If `data` is passed in this constructor, the promise is created resolved.
1247 * If there isn't data, it isn't resolved at the beginning.
1249 function Promise(name, data) {
1251 this.isRejected = false;
1253 // If you build a promise and pass in some data it's already resolved.
1255 this.isResolved = true;
1257 this.hasData = true;
1259 this.isResolved = false;
1260 this._data = EMPTY_PROMISE;
1262 this.callbacks = [];
1264 this.progressbacks = [];
1267 * Builds a promise that is resolved when all the passed in promises are
1269 * @param {Promise[]} promises Array of promises to wait for.
1270 * @return {Promise} New dependant promise.
1272 Promise.all = function Promise_all(promises) {
1273 var deferred = new Promise();
1274 var unresolved = promises.length;
1276 if (unresolved === 0) {
1277 deferred.resolve(results);
1280 for (var i = 0, ii = promises.length; i < ii; ++i) {
1281 var promise = promises[i];
1282 promise.then((function(i) {
1283 return function(value) {
1286 if (unresolved === 0)
1287 deferred.resolve(results);
1293 Promise.prototype = {
1297 if (value === undefined) {
1300 if (this._data !== EMPTY_PROMISE) {
1301 error('Promise ' + this.name +
1302 ': Cannot set the data of a promise twice');
1305 this.hasData = true;
1307 if (this.onDataCallback) {
1308 this.onDataCallback(value);
1313 if (this._data === EMPTY_PROMISE) {
1314 error('Promise ' + this.name + ': Cannot get data that isn\'t set');
1319 onData: function Promise_onData(callback) {
1320 if (this._data !== EMPTY_PROMISE) {
1321 callback(this._data);
1323 this.onDataCallback = callback;
1327 resolve: function Promise_resolve(data) {
1328 if (this.isResolved) {
1329 error('A Promise can be resolved only once ' + this.name);
1331 if (this.isRejected) {
1332 error('The Promise was already rejected ' + this.name);
1335 this.isResolved = true;
1336 this.data = data || null;
1337 var callbacks = this.callbacks;
1339 for (var i = 0, ii = callbacks.length; i < ii; i++) {
1340 callbacks[i].call(null, data);
1344 progress: function Promise_progress(data) {
1345 var callbacks = this.progressbacks;
1346 for (var i = 0, ii = callbacks.length; i < ii; i++) {
1347 callbacks[i].call(null, data);
1351 reject: function Promise_reject(reason) {
1352 if (this.isRejected) {
1353 error('A Promise can be rejected only once ' + this.name);
1355 if (this.isResolved) {
1356 error('The Promise was already resolved ' + this.name);
1359 this.isRejected = true;
1360 this.error = reason || null;
1361 var errbacks = this.errbacks;
1363 for (var i = 0, ii = errbacks.length; i < ii; i++) {
1364 errbacks[i].call(null, reason);
1368 then: function Promise_then(callback, errback, progressback) {
1370 error('Requiring callback' + this.name);
1373 // If the promise is already resolved, call the callback directly.
1374 if (this.isResolved) {
1375 var data = this.data;
1376 callback.call(null, data);
1377 } else if (this.isRejected && errback) {
1378 var error = this.error;
1379 errback.call(null, error);
1381 this.callbacks.push(callback);
1383 this.errbacks.push(errback);
1387 this.progressbacks.push(progressback);
1394 var StatTimer = (function StatTimerClosure() {
1395 function rpad(str, pad, length) {
1396 while (str.length < length)
1400 function StatTimer() {
1403 this.enabled = true;
1405 StatTimer.prototype = {
1406 time: function StatTimer_time(name) {
1409 if (name in this.started)
1410 throw 'Timer is already running for ' + name;
1411 this.started[name] = Date.now();
1413 timeEnd: function StatTimer_timeEnd(name) {
1416 if (!(name in this.started))
1417 throw 'Timer has not been started for ' + name;
1420 'start': this.started[name],
1423 // Remove timer from started so it can be called again.
1424 delete this.started[name];
1426 toString: function StatTimer_toString() {
1427 var times = this.times;
1429 // Find the longest name for padding purposes.
1431 for (var i = 0, ii = times.length; i < ii; ++i) {
1432 var name = times[i]['name'];
1433 if (name.length > longest)
1434 longest = name.length;
1436 for (var i = 0, ii = times.length; i < ii; ++i) {
1437 var span = times[i];
1438 var duration = span.end - span.start;
1439 out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
1447 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
1448 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
1451 * This is the main entry point for loading a PDF and interacting with it.
1452 * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)
1453 * is used, which means it must follow the same origin rules that any XHR does
1454 * e.g. No cross domain requests without CORS.
1456 * @param {string|TypedAray} source Either a url to a PDF is located or a
1457 * typed array already populated with data.
1458 * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object.
1460 PDFJS.getDocument = function getDocument(source) {
1461 var promise = new PDFJS.Promise();
1462 var transport = new WorkerTransport(promise);
1463 if (typeof source === 'string') {
1468 progress: function getPDFProgress(evt) {
1469 if (evt.lengthComputable)
1475 error: function getPDFError(e) {
1476 promise.reject('Unexpected server response of ' +
1477 e.target.status + '.');
1480 function getPDFLoad(data) {
1481 transport.sendData(data);
1484 // assuming the source is array, instantiating directly from it
1485 transport.sendData(source);
1491 * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
1492 * properties that can be read synchronously.
1494 var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
1495 function PDFDocumentProxy(pdfInfo, transport) {
1496 this.pdfInfo = pdfInfo;
1497 this.transport = transport;
1499 PDFDocumentProxy.prototype = {
1501 * @return {number} Total number of pages the PDF contains.
1504 return this.pdfInfo.numPages;
1507 * @return {string} A unique ID to identify a PDF. Not guaranteed to be
1511 return this.pdfInfo.fingerprint;
1514 * @param {number} The page number to get. The first page is 1.
1515 * @return {Promise} A promise that is resolved with a {PDFPageProxy}
1518 getPage: function PDFDocumentProxy_getPage(number) {
1519 return this.transport.getPage(number);
1522 * @return {Promise} A promise that is resolved with a lookup table for
1523 * mapping named destinations to reference numbers.
1525 getDestinations: function PDFDocumentProxy_getDestinations() {
1526 var promise = new PDFJS.Promise();
1527 var destinations = this.pdfInfo.destinations;
1528 promise.resolve(destinations);
1532 * @return {Promise} A promise that is resolved with an {array} that is a
1533 * tree outline (if it has one) of the PDF. The tree is in the format of:
1541 * items: array of more items like this
1546 getOutline: function PDFDocumentProxy_getOutline() {
1547 var promise = new PDFJS.Promise();
1548 var outline = this.pdfInfo.outline;
1549 promise.resolve(outline);
1553 * @return {Promise} A promise that is resolved with an {object} that has
1554 * info and metadata properties. Info is an {object} filled with anything
1555 * available in the information dictionary and similarly metadata is a
1556 * {Metadata} object with information from the metadata section of the PDF.
1558 getMetadata: function PDFDocumentProxy_getMetadata() {
1559 var promise = new PDFJS.Promise();
1560 var info = this.pdfInfo.info;
1561 var metadata = this.pdfInfo.metadata;
1564 metadata: metadata ? new PDFJS.Metadata(metadata) : null
1568 destroy: function PDFDocumentProxy_destroy() {
1569 this.transport.destroy();
1572 return PDFDocumentProxy;
1575 var PDFPageProxy = (function PDFPageProxyClosure() {
1576 function PDFPageProxy(pageInfo, transport) {
1577 this.pageInfo = pageInfo;
1578 this.transport = transport;
1579 this.stats = new StatTimer();
1580 this.stats.enabled = !!globalScope.PDFJS.enableStats;
1581 this.objs = transport.objs;
1582 this.renderInProgress = false;
1584 PDFPageProxy.prototype = {
1586 * @return {number} Page number of the page. First page is 1.
1589 return this.pageInfo.pageIndex + 1;
1592 * @return {number} The number of degrees the page is rotated clockwise.
1595 return this.pageInfo.rotate;
1598 * @return {object} The reference that points to this page. It has 'num' and
1602 return this.pageInfo.ref;
1605 * @return {array} An array of the visible portion of the PDF page in the
1606 * user space units - [x1, y1, x2, y2].
1609 return this.pageInfo.view;
1612 * @param {number} scale The desired scale of the viewport.
1613 * @param {number} rotate Degrees to rotate the viewport. If omitted this
1614 * defaults to the page rotation.
1615 * @return {PageViewport} Contains 'width' and 'height' properties along
1616 * with transforms required for rendering.
1618 getViewport: function PDFPageProxy_getViewport(scale, rotate) {
1619 if (arguments.length < 2)
1620 rotate = this.rotate;
1621 return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
1624 * @return {Promise} A promise that is resolved with an {array} of the
1625 * annotation objects.
1627 getAnnotations: function PDFPageProxy_getAnnotations() {
1628 if (this.annotationsPromise)
1629 return this.annotationsPromise;
1631 var promise = new PDFJS.Promise();
1632 this.annotationsPromise = promise;
1633 this.transport.getAnnotations(this.pageInfo.pageIndex);
1637 * Begins the process of rendering a page to the desired context.
1638 * @param {object} params A parameter object that supports:
1640 * canvasContext(required): A 2D context of a DOM Canvas object.,
1641 * textLayer(optional): An object that has beginLayout, endLayout, and
1642 * appendText functions.
1644 * @return {Promise} A promise that is resolved when the page finishes
1647 render: function PDFPageProxy_render(params) {
1648 this.renderInProgress = true;
1650 var promise = new Promise();
1651 var stats = this.stats;
1652 stats.time('Overall');
1653 // If there is no displayReadyPromise yet, then the operatorList was never
1654 // requested before. Make the request and create the promise.
1655 if (!this.displayReadyPromise) {
1656 this.displayReadyPromise = new Promise();
1657 this.destroyed = false;
1659 this.stats.time('Page Request');
1660 this.transport.messageHandler.send('RenderPageRequest', {
1661 pageIndex: this.pageNumber - 1
1666 function complete(error) {
1667 self.renderInProgress = false;
1668 if (self.destroyed) {
1669 delete self.operatorList;
1670 delete self.displayReadyPromise;
1674 promise.reject(error);
1679 // Once the operatorList and fonts are loaded, do the actual rendering.
1680 this.displayReadyPromise.then(
1681 function pageDisplayReadyPromise() {
1682 if (self.destroyed) {
1687 var gfx = new CanvasGraphics(params.canvasContext,
1688 this.objs, params.textLayer);
1690 this.display(gfx, params.viewport, complete);
1695 function pageDisplayReadPromiseError(reason) {
1703 * For internal use only.
1705 startRenderingFromOperatorList:
1706 function PDFPageProxy_startRenderingFromOperatorList(operatorList,
1709 this.operatorList = operatorList;
1711 var displayContinuation = function pageDisplayContinuation() {
1712 // Always defer call to display() to work around bug in
1713 // Firefox error reporting from XHR callbacks.
1714 PdfJS_window.setTimeout(function pageSetTimeout() {
1715 self.displayReadyPromise.resolve();
1719 this.ensureFonts(fonts,
1720 function pageStartRenderingFromOperatorListEnsureFonts() {
1721 displayContinuation();
1726 * For internal use only.
1728 ensureFonts: function PDFPageProxy_ensureFonts(fonts, callback) {
1729 this.stats.time('Font Loading');
1730 // Convert the font names to the corresponding font obj.
1731 for (var i = 0, ii = fonts.length; i < ii; i++) {
1732 fonts[i] = this.objs.objs[fonts[i]].data;
1735 // Load all the fonts
1738 function pageEnsureFontsFontObjs(fontObjs) {
1739 this.stats.timeEnd('Font Loading');
1741 callback.call(this);
1746 * For internal use only.
1748 display: function PDFPageProxy_display(gfx, viewport, callback) {
1749 var stats = this.stats;
1750 stats.time('Rendering');
1752 gfx.beginDrawing(viewport);
1755 var length = this.operatorList.fnArray.length;
1756 var operatorList = this.operatorList;
1758 if (PDFJS.pdfBug && StepperManager.enabled) {
1759 stepper = StepperManager.create(this.pageNumber - 1);
1760 stepper.init(operatorList);
1761 stepper.nextBreakPoint = stepper.getNextBreakPoint();
1767 gfx.executeOperatorList(operatorList, startIdx, next, stepper);
1768 if (startIdx == length) {
1770 stats.timeEnd('Rendering');
1771 stats.timeEnd('Overall');
1772 if (callback) callback();
1778 * Stub for future feature.
1780 getTextContent: function PDFPageProxy_getTextContent() {
1781 var promise = new PDFJS.Promise();
1782 var textContent = 'page text'; // not implemented
1783 promise.resolve(textContent);
1787 * Stub for future feature.
1789 getOperationList: function PDFPageProxy_getOperationList() {
1790 var promise = new PDFJS.Promise();
1791 var operationList = { // not implemented
1792 dependencyFontsID: null,
1795 promise.resolve(operationList);
1799 * Destroys resources allocated by the page.
1801 destroy: function PDFPageProxy_destroy() {
1802 this.destroyed = true;
1804 if (!this.renderInProgress) {
1805 delete this.operatorList;
1806 delete this.displayReadyPromise;
1810 return PDFPageProxy;
1813 * For internal use only.
1815 var WorkerTransport = (function WorkerTransportClosure() {
1816 function WorkerTransport(promise) {
1817 this.workerReadyPromise = promise;
1818 this.objs = new PDFObjects();
1820 this.pageCache = [];
1821 this.pagePromises = [];
1822 this.fontsLoading = {};
1824 // If worker support isn't disabled explicit and the browser has worker
1825 // support, create a new web worker and test if it/the browser fullfills
1826 // all requirements to run parts of pdf.js in a web worker.
1827 // Right now, the requirement is, that an Uint8Array is still an Uint8Array
1828 // as it arrives on the worker. Chrome added this with version 15.
1829 if (!globalScope.PDFJS.disableWorker && typeof PdfJS_window.Worker !== 'undefined') {
1830 var workerSrc = PDFJS.workerSrc;
1831 if (typeof workerSrc === 'undefined') {
1832 error('No PDFJS.workerSrc specified');
1837 if (PDFJS.isFirefoxExtension) {
1838 // The firefox extension can't load the worker from the resource://
1839 // url so we have to inline the script and then use the blob loader.
1840 var bb = new MozBlobBuilder();
1841 bb.append(PdfJS_window.document.querySelector('#PDFJS_SCRIPT_TAG').textContent);
1842 var blobUrl = PdfJS_window.window.URL.createObjectURL(bb.getBlob());
1843 worker = new Worker(blobUrl);
1845 // Some versions of FF can't create a worker on localhost, see:
1846 // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
1847 worker = new Worker(workerSrc);
1850 var messageHandler = new MessageHandler('main', worker);
1851 this.messageHandler = messageHandler;
1853 messageHandler.on('test', function transportTest(supportTypedArray) {
1854 if (supportTypedArray) {
1855 this.worker = worker;
1856 this.setupMessageHandler(messageHandler);
1858 globalScope.PDFJS.disableWorker = true;
1859 this.setupFakeWorker();
1863 var testObj = new Uint8Array(1);
1864 // Some versions of Opera throw a DATA_CLONE_ERR on
1865 // serializing the typed array.
1866 messageHandler.send('test', testObj);
1869 warn('The worker has been disabled.');
1872 // Either workers are disabled, not supported or have thrown an exception.
1873 // Thus, we fallback to a faked worker.
1874 globalScope.PDFJS.disableWorker = true;
1875 this.setupFakeWorker();
1877 WorkerTransport.prototype = {
1878 destroy: function WorkerTransport_destroy() {
1880 this.worker.terminate();
1882 this.pageCache = [];
1883 this.pagePromises = [];
1885 setupFakeWorker: function WorkerTransport_setupFakeWorker() {
1886 // If we don't use a worker, just post/sendMessage to the main thread.
1888 postMessage: function WorkerTransport_postMessage(obj) {
1889 fakeWorker.onmessage({data: obj});
1891 terminate: function WorkerTransport_terminate() {}
1894 var messageHandler = new MessageHandler('main', fakeWorker);
1895 this.setupMessageHandler(messageHandler);
1897 // If the main thread is our worker, setup the handling for the messages
1898 // the main thread sends to it self.
1899 WorkerMessageHandler.setup(messageHandler);
1902 setupMessageHandler:
1903 function WorkerTransport_setupMessageHandler(messageHandler) {
1904 this.messageHandler = messageHandler;
1906 messageHandler.on('GetDoc', function transportDoc(data) {
1907 var pdfInfo = data.pdfInfo;
1908 var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
1909 this.pdfDocument = pdfDocument;
1910 this.workerReadyPromise.resolve(pdfDocument);
1913 messageHandler.on('GetPage', function transportPage(data) {
1914 var pageInfo = data.pageInfo;
1915 var page = new PDFPageProxy(pageInfo, this);
1916 this.pageCache[pageInfo.pageIndex] = page;
1917 var promise = this.pagePromises[pageInfo.pageIndex];
1918 promise.resolve(page);
1921 messageHandler.on('GetAnnotations', function transportAnnotations(data) {
1922 var annotations = data.annotations;
1923 var promise = this.pageCache[data.pageIndex].annotationsPromise;
1924 promise.resolve(annotations);
1927 messageHandler.on('RenderPage', function transportRender(data) {
1928 var page = this.pageCache[data.pageIndex];
1929 var depFonts = data.depFonts;
1931 page.stats.timeEnd('Page Request');
1932 page.startRenderingFromOperatorList(data.operatorList, depFonts);
1935 messageHandler.on('obj', function transportObj(data) {
1938 if (this.objs.hasData(id))
1943 var imageData = data[2];
1944 loadJpegStream(id, imageData, this.objs);
1947 var imageData = data[2];
1948 this.objs.resolve(id, imageData);
1953 var properties = data[4];
1956 // Rewrap the ArrayBuffer in a stream.
1957 var fontFileDict = new Dict();
1958 file = new Stream(file, 0, file.length, fontFileDict);
1961 // At this point, only the font object is created but the font is
1962 // not yet attached to the DOM. This is done in `FontLoader.bind`.
1963 var font = new Font(name, file, properties);
1964 this.objs.resolve(id, font);
1967 error('Got unkown object type ' + type);
1971 messageHandler.on('PageError', function transportError(data) {
1972 var page = this.pageCache[data.pageNum - 1];
1973 if (page.displayReadyPromise)
1974 page.displayReadyPromise.reject(data.error);
1979 messageHandler.on('JpegDecode', function(data, promise) {
1980 var imageData = data[0];
1981 var components = data[1];
1982 if (components != 3 && components != 1)
1983 error('Only 3 component or 1 component can be returned');
1985 var img = new Image();
1986 img.onload = (function messageHandler_onloadClosure() {
1987 var width = img.width;
1988 var height = img.height;
1989 var size = width * height;
1990 var rgbaLength = size * 4;
1991 var buf = new Uint8Array(size * components);
1992 var tmpCanvas = createScratchCanvas(width, height);
1993 var tmpCtx = tmpCanvas.getContext('2d');
1994 tmpCtx.drawImage(img, 0, 0);
1995 var data = tmpCtx.getImageData(0, 0, width, height).data;
1997 if (components == 3) {
1998 for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
2000 buf[j + 1] = data[i + 1];
2001 buf[j + 2] = data[i + 2];
2003 } else if (components == 1) {
2004 for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) {
2008 promise.resolve({ data: buf, width: width, height: height});
2010 var src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
2015 sendData: function WorkerTransport_sendData(data) {
2016 this.messageHandler.send('GetDocRequest', data);
2019 getPage: function WorkerTransport_getPage(pageNumber, promise) {
2020 var pageIndex = pageNumber - 1;
2021 if (pageIndex in this.pagePromises)
2022 return this.pagePromises[pageIndex];
2023 var promise = new PDFJS.Promise('Page ' + pageNumber);
2024 this.pagePromises[pageIndex] = promise;
2025 this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex });
2029 getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
2030 this.messageHandler.send('GetAnnotationsRequest',
2031 { pageIndex: pageIndex });
2034 return WorkerTransport;
2038 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2039 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
2043 // <canvas> contexts store most of the state we need natively.
2044 // However, PDF needs a bit more state, which we store here.
2046 var TextRenderingMode = {
2051 FILL_ADD_TO_PATH: 4,
2052 STROKE_ADD_TO_PATH: 5,
2053 FILL_STROKE_ADD_TO_PATH: 6,
2057 // Minimal font size that would be used during canvas fillText operations.
2058 var MIN_FONT_SIZE = 1;
2060 function createScratchCanvas(width, height) {
2061 var canvas = PdfJS_window.document.createElement('canvas');
2062 canvas.width = width;
2063 canvas.height = height;
2067 function addContextCurrentTransform(ctx) {
2068 // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
2069 if (!ctx.mozCurrentTransform) {
2070 // Store the original context
2071 ctx._originalSave = ctx.save;
2072 ctx._originalRestore = ctx.restore;
2073 ctx._originalRotate = ctx.rotate;
2074 ctx._originalScale = ctx.scale;
2075 ctx._originalTranslate = ctx.translate;
2076 ctx._originalTransform = ctx.transform;
2078 ctx._transformMatrix = [1, 0, 0, 1, 0, 0];
2079 ctx._transformStack = [];
2081 Object.defineProperty(ctx, 'mozCurrentTransform', {
2082 get: function getCurrentTransform() {
2083 return this._transformMatrix;
2087 Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
2088 get: function getCurrentTransformInverse() {
2089 // Calculation done using WolframAlpha:
2090 // http://www.wolframalpha.com/input/?
2091 // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
2093 var m = this._transformMatrix;
2094 var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
2096 var ad_bc = a * d - b * c;
2097 var bc_ad = b * c - a * d;
2104 (d * e - c * f) / bc_ad,
2105 (b * e - a * f) / ad_bc
2110 ctx.save = function ctxSave() {
2111 var old = this._transformMatrix;
2112 this._transformStack.push(old);
2113 this._transformMatrix = old.slice(0, 6);
2115 this._originalSave();
2118 ctx.restore = function ctxRestore() {
2119 var prev = this._transformStack.pop();
2121 this._transformMatrix = prev;
2122 this._originalRestore();
2126 ctx.translate = function ctxTranslate(x, y) {
2127 var m = this._transformMatrix;
2128 m[4] = m[0] * x + m[2] * y + m[4];
2129 m[5] = m[1] * x + m[3] * y + m[5];
2131 this._originalTranslate(x, y);
2134 ctx.scale = function ctxScale(x, y) {
2135 var m = this._transformMatrix;
2141 this._originalScale(x, y);
2144 ctx.transform = function ctxTransform(a, b, c, d, e, f) {
2145 var m = this._transformMatrix;
2146 this._transformMatrix = [
2147 m[0] * a + m[2] * b,
2148 m[1] * a + m[3] * b,
2149 m[0] * c + m[2] * d,
2150 m[1] * c + m[3] * d,
2151 m[0] * e + m[2] * f + m[4],
2152 m[1] * e + m[3] * f + m[5]
2155 ctx._originalTransform(a, b, c, d, e, f);
2158 ctx.rotate = function ctxRotate(angle) {
2159 var cosValue = Math.cos(angle);
2160 var sinValue = Math.sin(angle);
2162 var m = this._transformMatrix;
2163 this._transformMatrix = [
2164 m[0] * cosValue + m[2] * sinValue,
2165 m[1] * cosValue + m[3] * sinValue,
2166 m[0] * (-sinValue) + m[2] * cosValue,
2167 m[1] * (-sinValue) + m[3] * cosValue,
2172 this._originalRotate(angle);
2177 var CanvasExtraState = (function CanvasExtraStateClosure() {
2178 function CanvasExtraState(old) {
2179 // Are soft masks and alpha values shapes or opacities?
2180 this.alphaIsShape = false;
2182 this.fontSizeScale = 1;
2183 this.textMatrix = IDENTITY_MATRIX;
2184 this.fontMatrix = IDENTITY_MATRIX;
2186 // Current point (in user coordinates)
2189 // Start of text line (in text coordinates)
2192 // Character and word spacing
2193 this.charSpacing = 0;
2194 this.wordSpacing = 0;
2195 this.textHScale = 1;
2196 this.textRenderingMode = TextRenderingMode.FILL;
2198 this.fillColorSpace = new DeviceGrayCS();
2199 this.fillColorSpaceObj = null;
2200 this.strokeColorSpace = new DeviceGrayCS();
2201 this.strokeColorSpaceObj = null;
2202 this.fillColorObj = null;
2203 this.strokeColorObj = null;
2204 // Default fore and background colors
2205 this.fillColor = '#000000';
2206 this.strokeColor = '#000000';
2207 // Note: fill alpha applies to all non-stroking operations
2209 this.strokeAlpha = 1;
2215 CanvasExtraState.prototype = {
2216 clone: function CanvasExtraState_clone() {
2217 return Object.create(this);
2219 setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
2224 return CanvasExtraState;
2227 var CanvasGraphics = (function CanvasGraphicsClosure() {
2228 // Defines the time the executeOperatorList is going to be executing
2229 // before it stops and shedules a continue of execution.
2230 var kExecutionTime = 15;
2232 function CanvasGraphics(canvasCtx, objs, textLayer) {
2233 this.ctx = canvasCtx;
2234 this.current = new CanvasExtraState();
2235 this.stateStack = [];
2236 this.pendingClip = null;
2240 this.textLayer = textLayer;
2242 addContextCurrentTransform(canvasCtx);
2246 var LINE_CAP_STYLES = ['butt', 'round', 'square'];
2247 var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
2248 var NORMAL_CLIP = {};
2251 CanvasGraphics.prototype = {
2254 'closeStroke': true,
2258 'eoFillStroke': true,
2259 'closeFillStroke': true,
2260 'closeEOFillStroke': true,
2262 'showSpacedText': true,
2263 'setStrokeColorSpace': true,
2264 'setFillColorSpace': true,
2265 'setStrokeColor': true,
2266 'setStrokeColorN': true,
2267 'setFillColor': true,
2268 'setFillColorN': true,
2269 'setStrokeGray': true,
2270 'setFillGray': true,
2271 'setStrokeRGBColor': true,
2272 'setFillRGBColor': true,
2273 'setStrokeCMYKColor': true,
2274 'setFillCMYKColor': true,
2275 'paintJpegXObject': true,
2276 'paintImageXObject': true,
2277 'paintImageMaskXObject': true,
2281 beginDrawing: function CanvasGraphics_beginDrawing(viewport) {
2282 var transform = viewport.transform;
2284 this.ctx.transform.apply(this.ctx, transform);
2287 this.textLayer.beginLayout();
2290 executeOperatorList: function CanvasGraphics_executeOperatorList(
2292 executionStartIdx, continueCallback,
2294 var argsArray = operatorList.argsArray;
2295 var fnArray = operatorList.fnArray;
2296 var i = executionStartIdx || 0;
2297 var argsArrayLen = argsArray.length;
2299 // Sometimes the OperatorList to execute is empty.
2300 if (argsArrayLen == i) {
2304 var executionEndIdx;
2305 var endTime = Date.now() + kExecutionTime;
2307 var objs = this.objs;
2309 var slowCommands = this.slowCommands;
2312 if (stepper && i === stepper.nextBreakPoint) {
2313 stepper.breakIt(i, continueCallback);
2317 fnName = fnArray[i];
2319 if (fnName !== 'dependency') {
2320 this[fnName].apply(this, argsArray[i]);
2322 var deps = argsArray[i];
2323 for (var n = 0, nn = deps.length; n < nn; n++) {
2324 var depObjId = deps[n];
2326 // If the promise isn't resolved yet, add the continueCallback
2327 // to the promise and bail out.
2328 if (!objs.isResolved(depObjId)) {
2329 objs.get(depObjId, continueCallback);
2337 // If the entire operatorList was executed, stop as were done.
2338 if (i == argsArrayLen) {
2342 // If the execution took longer then a certain amount of time, shedule
2343 // to continue exeution after a short delay.
2344 // However, this is only possible if a 'continueCallback' is passed in.
2345 if (continueCallback && slowCommands[fnName] && Date.now() > endTime) {
2346 PdfJS_window.setTimeout(continueCallback, 0);
2350 // If the operatorList isn't executed completely yet OR the execution
2351 // time was short enough, do another execution round.
2355 endDrawing: function CanvasGraphics_endDrawing() {
2359 this.textLayer.endLayout();
2363 setLineWidth: function CanvasGraphics_setLineWidth(width) {
2364 this.current.lineWidth = width;
2365 this.ctx.lineWidth = width;
2367 setLineCap: function CanvasGraphics_setLineCap(style) {
2368 this.ctx.lineCap = LINE_CAP_STYLES[style];
2370 setLineJoin: function CanvasGraphics_setLineJoin(style) {
2371 this.ctx.lineJoin = LINE_JOIN_STYLES[style];
2373 setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
2374 this.ctx.miterLimit = limit;
2376 setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
2377 this.ctx.mozDash = dashArray;
2378 this.ctx.mozDashOffset = dashPhase;
2379 this.ctx.webkitLineDash = dashArray;
2380 this.ctx.webkitLineDashOffset = dashPhase;
2382 setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
2383 TODO('set rendering intent: ' + intent);
2385 setFlatness: function CanvasGraphics_setFlatness(flatness) {
2386 TODO('set flatness: ' + flatness);
2388 setGState: function CanvasGraphics_setGState(states) {
2389 for (var i = 0, ii = states.length; i < ii; i++) {
2390 var state = states[i];
2392 var value = state[1];
2396 this.setLineWidth(value);
2399 this.setLineCap(value);
2402 this.setLineJoin(value);
2405 this.setMiterLimit(value);
2408 this.setDash(value[0], value[1]);
2411 this.setRenderingIntent(value);
2414 this.setFlatness(value);
2417 this.setFont(state[1], state[2]);
2420 this.current.strokeAlpha = state[1];
2423 this.current.fillAlpha = state[1];
2424 this.ctx.globalAlpha = state[1];
2429 save: function CanvasGraphics_save() {
2431 var old = this.current;
2432 this.stateStack.push(old);
2433 this.current = old.clone();
2435 restore: function CanvasGraphics_restore() {
2436 var prev = this.stateStack.pop();
2438 this.current = prev;
2442 transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
2443 this.ctx.transform(a, b, c, d, e, f);
2447 moveTo: function CanvasGraphics_moveTo(x, y) {
2448 this.ctx.moveTo(x, y);
2449 this.current.setCurrentPoint(x, y);
2451 lineTo: function CanvasGraphics_lineTo(x, y) {
2452 this.ctx.lineTo(x, y);
2453 this.current.setCurrentPoint(x, y);
2455 curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) {
2456 this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
2457 this.current.setCurrentPoint(x3, y3);
2459 curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) {
2460 var current = this.current;
2461 this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3);
2462 current.setCurrentPoint(x3, y3);
2464 curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
2465 this.curveTo(x1, y1, x3, y3, x3, y3);
2466 this.current.setCurrentPoint(x3, y3);
2468 closePath: function CanvasGraphics_closePath() {
2469 this.ctx.closePath();
2471 rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
2472 this.ctx.rect(x, y, width, height);
2474 stroke: function CanvasGraphics_stroke(consumePath) {
2475 consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
2477 var strokeColor = this.current.strokeColor;
2478 if (this.current.lineWidth === 0)
2479 ctx.lineWidth = this.getSinglePixelWidth();
2480 // For stroke we want to temporarily change the global alpha to the
2482 ctx.globalAlpha = this.current.strokeAlpha;
2483 if (strokeColor && strokeColor.hasOwnProperty('type') &&
2484 strokeColor.type === 'Pattern') {
2485 // for patterns, we transform to pattern space, calculate
2486 // the pattern, call stroke, and restore to user space
2488 ctx.strokeStyle = strokeColor.getPattern(ctx);
2496 // Restore the global alpha to the fill alpha
2497 ctx.globalAlpha = this.current.fillAlpha;
2499 closeStroke: function CanvasGraphics_closeStroke() {
2503 fill: function CanvasGraphics_fill(consumePath) {
2504 consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
2506 var fillColor = this.current.fillColor;
2508 if (fillColor && fillColor.hasOwnProperty('type') &&
2509 fillColor.type === 'Pattern') {
2511 ctx.fillStyle = fillColor.getPattern(ctx);
2520 eoFill: function CanvasGraphics_eoFill() {
2521 var savedFillRule = this.setEOFillRule();
2523 this.restoreFillRule(savedFillRule);
2525 fillStroke: function CanvasGraphics_fillStroke() {
2531 eoFillStroke: function CanvasGraphics_eoFillStroke() {
2532 var savedFillRule = this.setEOFillRule();
2534 this.restoreFillRule(savedFillRule);
2536 closeFillStroke: function CanvasGraphics_closeFillStroke() {
2540 closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
2541 var savedFillRule = this.setEOFillRule();
2544 this.restoreFillRule(savedFillRule);
2546 endPath: function CanvasGraphics_endPath() {
2551 clip: function CanvasGraphics_clip() {
2552 this.pendingClip = NORMAL_CLIP;
2554 eoClip: function CanvasGraphics_eoClip() {
2555 this.pendingClip = EO_CLIP;
2559 beginText: function CanvasGraphics_beginText() {
2560 this.current.textMatrix = IDENTITY_MATRIX;
2561 this.current.x = this.current.lineX = 0;
2562 this.current.y = this.current.lineY = 0;
2564 endText: function CanvasGraphics_endText() {
2566 setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
2567 this.current.charSpacing = spacing;
2569 setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
2570 this.current.wordSpacing = spacing;
2572 setHScale: function CanvasGraphics_setHScale(scale) {
2573 this.current.textHScale = scale / 100;
2575 setLeading: function CanvasGraphics_setLeading(leading) {
2576 this.current.leading = -leading;
2578 setFont: function CanvasGraphics_setFont(fontRefName, size) {
2579 var fontObj = this.objs.get(fontRefName);
2580 var current = this.current;
2583 error('Can\'t find font for ' + fontRefName);
2585 // Slice-clone matrix so we can manipulate it without affecting original
2586 if (fontObj.fontMatrix)
2587 current.fontMatrix = fontObj.fontMatrix.slice(0);
2589 current.fontMatrix = IDENTITY_MATRIX.slice(0);
2591 // A valid matrix needs all main diagonal elements to be non-zero
2592 // This also ensures we bypass FF bugzilla bug #719844.
2593 if (current.fontMatrix[0] === 0 ||
2594 current.fontMatrix[3] === 0) {
2595 warn('Invalid font matrix for font ' + fontRefName);
2598 // The spec for Tf (setFont) says that 'size' specifies the font 'scale',
2599 // and in some docs this can be negative (inverted x-y axes).
2600 // We implement this condition with fontMatrix.
2603 current.fontMatrix[0] *= -1;
2604 current.fontMatrix[3] *= -1;
2607 this.current.font = fontObj;
2608 this.current.fontSize = size;
2611 return; // we don't need ctx.font for Type3 fonts
2613 var name = fontObj.loadedName || 'sans-serif';
2614 var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
2615 (fontObj.bold ? 'bold' : 'normal');
2617 var italic = fontObj.italic ? 'italic' : 'normal';
2618 var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif';
2619 var typeface = '"' + name + '", ' + serif;
2621 // Some font backends cannot handle fonts below certain size.
2622 // Keeping the font at minimal size and using the fontSizeScale to change
2623 // the current transformation matrix before the fillText/strokeText.
2624 // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
2625 var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
2626 this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 :
2627 size / MIN_FONT_SIZE;
2629 var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
2630 this.ctx.font = rule;
2632 setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
2633 if (mode >= TextRenderingMode.FILL_ADD_TO_PATH)
2634 TODO('unsupported text rendering mode: ' + mode);
2635 this.current.textRenderingMode = mode;
2637 setTextRise: function CanvasGraphics_setTextRise(rise) {
2638 TODO('text rise: ' + rise);
2640 moveText: function CanvasGraphics_moveText(x, y) {
2641 this.current.x = this.current.lineX += x;
2642 this.current.y = this.current.lineY += y;
2644 setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
2645 this.setLeading(-y);
2646 this.moveText(x, y);
2648 setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
2649 this.current.textMatrix = [a, b, c, d, e, f];
2651 this.current.x = this.current.lineX = 0;
2652 this.current.y = this.current.lineY = 0;
2654 nextLine: function CanvasGraphics_nextLine() {
2655 this.moveText(0, this.current.leading);
2657 applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
2659 var current = this.current;
2660 var textHScale = current.textHScale;
2661 var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
2663 ctx.transform.apply(ctx, current.textMatrix);
2665 ctx.translate(current.x, -1 * current.y);
2666 ctx.transform.apply(ctx, fontMatrix);
2667 ctx.scale(textHScale, 1);
2669 getTextGeometry: function CanvasGraphics_getTextGeometry() {
2672 var font = this.current.font;
2673 var ctxMatrix = ctx.mozCurrentTransform;
2675 var bl = Util.applyTransform([0, 0], ctxMatrix);
2676 var tr = Util.applyTransform([1, 1], ctxMatrix);
2679 geometry.hScale = tr[0] - bl[0];
2680 geometry.vScale = tr[1] - bl[1];
2682 geometry.spaceWidth = font.spaceWidth;
2686 showText: function CanvasGraphics_showText(str, skipTextSelection) {
2688 var current = this.current;
2689 var font = current.font;
2690 var glyphs = font.charsToGlyphs(str);
2691 var fontSize = current.fontSize;
2692 var fontSizeScale = current.fontSizeScale;
2693 var charSpacing = current.charSpacing;
2694 var wordSpacing = current.wordSpacing;
2695 var textHScale = current.textHScale;
2696 var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
2697 var textHScale2 = textHScale * fontMatrix[0];
2698 var glyphsLength = glyphs.length;
2699 var textLayer = this.textLayer;
2700 var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
2701 var textSelection = textLayer && !skipTextSelection ? true : false;
2702 var textRenderingMode = current.textRenderingMode;
2704 // Type3 fonts - each glyph is a "mini-PDF"
2707 ctx.transform.apply(ctx, current.textMatrix);
2708 ctx.translate(current.x, current.y);
2710 ctx.scale(textHScale, 1);
2712 if (textSelection) {
2715 text.geom = this.getTextGeometry();
2718 for (var i = 0; i < glyphsLength; ++i) {
2720 var glyph = glyphs[i];
2721 if (glyph === null) {
2723 this.ctx.translate(wordSpacing, 0);
2728 ctx.scale(fontSize, fontSize);
2729 ctx.transform.apply(ctx, fontMatrix);
2730 this.executeOperatorList(glyph.operatorList);
2733 var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
2734 var width = transformed[0] * fontSize +
2735 Util.sign(current.fontMatrix[0]) * charSpacing;
2737 ctx.translate(width, 0);
2738 current.x += width * textHScale;
2740 text.str += glyph.unicode;
2742 text.canvasWidth += width;
2747 this.applyTextTransforms();
2749 var lineWidth = current.lineWidth;
2750 var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]);
2751 if (scale == 0 || lineWidth == 0)
2752 lineWidth = this.getSinglePixelWidth();
2757 text.geom = this.getTextGeometry();
2759 if (fontSizeScale != 1.0) {
2760 ctx.scale(fontSizeScale, fontSizeScale);
2761 lineWidth /= fontSizeScale;
2764 ctx.lineWidth = lineWidth;
2767 for (var i = 0; i < glyphsLength; ++i) {
2768 var glyph = glyphs[i];
2769 if (glyph === null) {
2771 x += Util.sign(current.fontMatrix[0]) * wordSpacing;
2775 var character = glyph.fontChar;
2776 var charWidth = glyph.width * fontSize * 0.001 +
2777 Util.sign(current.fontMatrix[0]) * charSpacing;
2779 if (!glyph.disabled) {
2780 var scaledX = x / fontSizeScale;
2781 switch (textRenderingMode) {
2782 default: // other unsupported rendering modes
2783 case TextRenderingMode.FILL:
2784 case TextRenderingMode.FILL_ADD_TO_PATH:
2785 ctx.fillText(character, scaledX, 0);
2787 case TextRenderingMode.STROKE:
2788 case TextRenderingMode.STROKE_ADD_TO_PATH:
2789 ctx.strokeText(character, scaledX, 0);
2791 case TextRenderingMode.FILL_STROKE:
2792 case TextRenderingMode.FILL_STROKE_ADD_TO_PATH:
2793 ctx.fillText(character, scaledX, 0);
2794 ctx.strokeText(character, scaledX, 0);
2796 case TextRenderingMode.INVISIBLE:
2803 var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode;
2804 var glyphUnicodeLength = glyphUnicode.length;
2805 //reverse an arabic ligature
2806 if (glyphUnicodeLength > 1 &&
2807 isRTLRangeFor(glyphUnicode.charCodeAt(0))) {
2808 for (var ii = glyphUnicodeLength - 1; ii >= 0; ii--)
2809 text.str += glyphUnicode[ii];
2811 text.str += glyphUnicode;
2812 text.length += glyphUnicodeLength;
2813 text.canvasWidth += charWidth;
2815 current.x += x * textHScale2;
2820 this.textLayer.appendText(text, font.loadedName, fontSize);
2824 showSpacedText: function CanvasGraphics_showSpacedText(arr) {
2826 var current = this.current;
2827 var font = current.font;
2828 var fontSize = current.fontSize;
2829 var textHScale = current.textHScale;
2831 textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0];
2832 var arrLength = arr.length;
2833 var textLayer = this.textLayer;
2834 var text = {str: '', length: 0, canvasWidth: 0, geom: {}};
2835 var textSelection = textLayer ? true : false;
2837 if (textSelection) {
2839 // Type3 fonts - each glyph is a "mini-PDF" (see also showText)
2841 ctx.transform.apply(ctx, current.textMatrix);
2843 ctx.translate(current.x, -1 * current.y);
2844 ctx.scale(textHScale, 1);
2846 this.applyTextTransforms();
2847 text.geom = this.getTextGeometry();
2851 for (var i = 0; i < arrLength; ++i) {
2854 var spacingLength = -e * 0.001 * fontSize * textHScale;
2855 current.x += spacingLength;
2857 if (textSelection) {
2858 // Emulate precise spacing via HTML spaces
2859 text.canvasWidth += spacingLength;
2860 if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero
2861 var numFakeSpaces = Math.round(-e / text.geom.spaceWidth);
2862 if (numFakeSpaces > 0) {
2863 text.str += '\u00A0';
2868 } else if (isString(e)) {
2869 var shownText = this.showText(e, true);
2871 if (textSelection) {
2872 if (shownText.str === ' ') {
2873 text.str += '\u00A0';
2875 text.str += shownText.str;
2877 text.canvasWidth += shownText.canvasWidth;
2878 text.length += shownText.length;
2881 malformed('TJ array element ' + e + ' is not string or num');
2886 this.textLayer.appendText(text, font.loadedName, fontSize);
2888 nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
2890 this.showText(text);
2892 nextLineSetSpacingShowText:
2893 function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
2896 this.setWordSpacing(wordSpacing);
2897 this.setCharSpacing(charSpacing);
2898 this.nextLineShowText(text);
2902 setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
2903 // We can safely ignore this since the width should be the same
2904 // as the width in the Widths array.
2906 setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
2912 // TODO According to the spec we're also suppose to ignore any operators
2913 // that set color or include images while processing this type3 font.
2914 this.rectangle(llx, lly, urx - llx, ury - lly);
2920 setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
2921 this.current.strokeColorSpace = ColorSpace.fromIR(raw);
2923 setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
2924 this.current.fillColorSpace = ColorSpace.fromIR(raw);
2926 setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) {
2927 var cs = this.current.strokeColorSpace;
2928 var rgbColor = cs.getRgb(arguments);
2929 var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
2930 this.ctx.strokeStyle = color;
2931 this.current.strokeColor = color;
2933 getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
2934 if (IR[0] == 'TilingPattern') {
2939 var baseComps = base.numComps;
2942 for (var i = 0; i < baseComps; ++i)
2943 color.push(args[i]);
2945 color = base.getRgb(color);
2947 var pattern = new TilingPattern(IR, color, this.ctx, this.objs);
2948 } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') {
2949 var pattern = Pattern.shadingFromIR(IR);
2951 error('Unkown IR type ' + IR[0]);
2955 setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) {
2956 var cs = this.current.strokeColorSpace;
2958 if (cs.name == 'Pattern') {
2959 this.current.strokeColor = this.getColorN_Pattern(arguments, cs);
2961 this.setStrokeColor.apply(this, arguments);
2964 setFillColor: function CanvasGraphics_setFillColor(/*...*/) {
2965 var cs = this.current.fillColorSpace;
2966 var rgbColor = cs.getRgb(arguments);
2967 var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
2968 this.ctx.fillStyle = color;
2969 this.current.fillColor = color;
2971 setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) {
2972 var cs = this.current.fillColorSpace;
2974 if (cs.name == 'Pattern') {
2975 this.current.fillColor = this.getColorN_Pattern(arguments, cs);
2977 this.setFillColor.apply(this, arguments);
2980 setStrokeGray: function CanvasGraphics_setStrokeGray(gray) {
2981 if (!(this.current.strokeColorSpace instanceof DeviceGrayCS))
2982 this.current.strokeColorSpace = new DeviceGrayCS();
2984 var color = Util.makeCssRgb(gray, gray, gray);
2985 this.ctx.strokeStyle = color;
2986 this.current.strokeColor = color;
2988 setFillGray: function CanvasGraphics_setFillGray(gray) {
2989 if (!(this.current.fillColorSpace instanceof DeviceGrayCS))
2990 this.current.fillColorSpace = new DeviceGrayCS();
2992 var color = Util.makeCssRgb(gray, gray, gray);
2993 this.ctx.fillStyle = color;
2994 this.current.fillColor = color;
2996 setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
2997 if (!(this.current.strokeColorSpace instanceof DeviceRgbCS))
2998 this.current.strokeColorSpace = new DeviceRgbCS();
3000 var color = Util.makeCssRgb(r, g, b);
3001 this.ctx.strokeStyle = color;
3002 this.current.strokeColor = color;
3004 setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
3005 if (!(this.current.fillColorSpace instanceof DeviceRgbCS))
3006 this.current.fillColorSpace = new DeviceRgbCS();
3008 var color = Util.makeCssRgb(r, g, b);
3009 this.ctx.fillStyle = color;
3010 this.current.fillColor = color;
3012 setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) {
3013 if (!(this.current.strokeColorSpace instanceof DeviceCmykCS))
3014 this.current.strokeColorSpace = new DeviceCmykCS();
3016 var color = Util.makeCssCmyk(c, m, y, k);
3017 this.ctx.strokeStyle = color;
3018 this.current.strokeColor = color;
3020 setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) {
3021 if (!(this.current.fillColorSpace instanceof DeviceCmykCS))
3022 this.current.fillColorSpace = new DeviceCmykCS();
3024 var color = Util.makeCssCmyk(c, m, y, k);
3025 this.ctx.fillStyle = color;
3026 this.current.fillColor = color;
3029 shadingFill: function CanvasGraphics_shadingFill(patternIR) {
3033 var pattern = Pattern.shadingFromIR(patternIR);
3034 ctx.fillStyle = pattern.getPattern(ctx);
3036 var inv = ctx.mozCurrentTransformInverse;
3038 var canvas = ctx.canvas;
3039 var width = canvas.width;
3040 var height = canvas.height;
3042 var bl = Util.applyTransform([0, 0], inv);
3043 var br = Util.applyTransform([0, height], inv);
3044 var ul = Util.applyTransform([width, 0], inv);
3045 var ur = Util.applyTransform([width, height], inv);
3047 var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
3048 var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
3049 var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
3050 var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
3052 this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
3054 // HACK to draw the gradient onto an infinite rectangle.
3055 // PDF gradients are drawn across the entire image while
3056 // Canvas only allows gradients to be drawn in a rectangle
3057 // The following bug should allow us to remove this.
3058 // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
3060 this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
3067 beginInlineImage: function CanvasGraphics_beginInlineImage() {
3068 error('Should not call beginInlineImage');
3070 beginImageData: function CanvasGraphics_beginImageData() {
3071 error('Should not call beginImageData');
3074 paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
3078 if (matrix && isArray(matrix) && 6 == matrix.length)
3079 this.transform.apply(this, matrix);
3081 if (bbox && isArray(bbox) && 4 == bbox.length) {
3082 var width = bbox[2] - bbox[0];
3083 var height = bbox[3] - bbox[1];
3084 this.rectangle(bbox[0], bbox[1], width, height);
3090 paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
3094 paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
3095 var domImage = this.objs.get(objId);
3097 error('Dependent image isn\'t ready yet');
3103 // scale the image to the unit square
3104 ctx.scale(1 / w, -1 / h);
3106 ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
3112 paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(
3113 imgArray, inverseDecode, width, height) {
3114 function applyStencilMask(buffer, inverseDecode) {
3115 var imgArrayPos = 0;
3116 var i, j, mask, buf;
3117 // removing making non-masked pixels transparent
3118 var bufferPos = 3; // alpha component offset
3119 for (i = 0; i < height; i++) {
3121 for (j = 0; j < width; j++) {
3123 buf = imgArray[imgArrayPos++];
3126 if (!(buf & mask) == inverseDecode) {
3127 buffer[bufferPos] = 0;
3138 var w = width, h = height;
3139 // scale the image to the unit square
3140 ctx.scale(1 / w, -1 / h);
3142 var tmpCanvas = createScratchCanvas(w, h);
3143 var tmpCtx = tmpCanvas.getContext('2d');
3145 var fillColor = this.current.fillColor;
3146 tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
3147 fillColor.type === 'Pattern') ?
3148 fillColor.getPattern(tmpCtx) : fillColor;
3149 tmpCtx.fillRect(0, 0, w, h);
3151 var imgData = tmpCtx.getImageData(0, 0, w, h);
3152 var pixels = imgData.data;
3154 applyStencilMask(pixels, inverseDecode);
3156 tmpCtx.putImageData(imgData, 0, 0);
3157 ctx.drawImage(tmpCanvas, 0, -h);
3161 paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
3162 var imgData = this.objs.get(objId);
3164 error('Dependent image isn\'t ready yet');
3168 var w = imgData.width;
3169 var h = imgData.height;
3170 // scale the image to the unit square
3171 ctx.scale(1 / w, -1 / h);
3173 var tmpCanvas = createScratchCanvas(w, h);
3174 var tmpCtx = tmpCanvas.getContext('2d');
3175 this.putBinaryImageData(tmpCtx, imgData, w, h);
3177 ctx.drawImage(tmpCanvas, 0, -h);
3181 putBinaryImageData: function CanvasGraphics_putBinaryImageData() {
3187 markPoint: function CanvasGraphics_markPoint(tag) {
3188 TODO('Marked content');
3190 markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
3191 TODO('Marked content');
3193 beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
3194 TODO('Marked content');
3196 beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
3198 TODO('Marked content');
3200 endMarkedContent: function CanvasGraphics_endMarkedContent() {
3201 TODO('Marked content');
3206 beginCompat: function CanvasGraphics_beginCompat() {
3207 TODO('ignore undefined operators (should we do that anyway?)');
3209 endCompat: function CanvasGraphics_endCompat() {
3210 TODO('stop ignoring undefined operators');
3215 consumePath: function CanvasGraphics_consumePath() {
3216 if (this.pendingClip) {
3217 var savedFillRule = null;
3218 if (this.pendingClip == EO_CLIP)
3219 savedFillRule = this.setEOFillRule();
3223 this.pendingClip = null;
3224 if (savedFillRule !== null)
3225 this.restoreFillRule(savedFillRule);
3227 this.ctx.beginPath();
3229 // We generally keep the canvas context set for
3230 // nonzero-winding, and just set evenodd for the operations
3232 setEOFillRule: function CanvasGraphics_setEOFillRule() {
3233 var savedFillRule = this.ctx.mozFillRule;
3234 this.ctx.mozFillRule = 'evenodd';
3235 return savedFillRule;
3237 restoreFillRule: function CanvasGraphics_restoreFillRule(rule) {
3238 this.ctx.mozFillRule = rule;
3240 getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
3241 var inverse = this.ctx.mozCurrentTransformInverse;
3242 return Math.abs(inverse[0] + inverse[2]);
3246 return CanvasGraphics;
3250 // Feature detection if the browser can use an Uint8Array directly as imgData.
3251 var canvas = PdfJS_window.document.createElement('canvas');
3254 var ctx = canvas.getContext('2d');
3260 data: new Uint8Array(4)
3263 CanvasGraphics.prototype.putBinaryImageData =
3264 function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) {
3265 ctx.putImageData(imgData, 0, 0);
3268 CanvasGraphics.prototype.putBinaryImageData =
3269 function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) {
3270 var tmpImgData = ctx.getImageData(0, 0, w, h);
3272 // Copy over the imageData pixel by pixel.
3273 var tmpImgDataPixels = tmpImgData.data;
3274 var len = tmpImgDataPixels.length;
3277 tmpImgDataPixels[len] = imgData.data[len];
3280 ctx.putImageData(tmpImgData, 0, 0);
3285 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
3286 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
3290 var Name = (function NameClosure() {
3291 function Name(name) {
3295 Name.prototype = {};
3300 var Cmd = (function CmdClosure() {
3309 Cmd.get = function Cmd_get(cmd) {
3310 var cmdValue = cmdCache[cmd];
3314 return cmdCache[cmd] = new Cmd(cmd);
3320 var Dict = (function DictClosure() {
3322 function Dict(xref) {
3323 // Map should only be used internally, use functions below to access.
3324 var map = Object.create(null);
3326 this.assignXref = function Dict_assignXref(newXref) {
3330 // automatically dereferences Ref objects
3331 this.get = function Dict_get(key1, key2, key3) {
3333 if (typeof (value = map[key1]) != 'undefined' || key1 in map ||
3334 typeof key2 == 'undefined') {
3335 return xref ? xref.fetchIfRef(value) : value;
3337 if (typeof (value = map[key2]) != 'undefined' || key2 in map ||
3338 typeof key3 == 'undefined') {
3339 return xref ? xref.fetchIfRef(value) : value;
3341 value = map[key3] || null;
3342 return xref ? xref.fetchIfRef(value) : value;
3346 this.getRaw = function Dict_getRaw(key) {
3350 // creates new map and dereferences all Refs
3351 this.getAll = function Dict_getAll() {
3353 for (var key in map) {
3354 var obj = this.get(key);
3355 all[key] = obj instanceof Dict ? obj.getAll() : obj;
3360 this.set = function Dict_set(key, value) {
3364 this.has = function Dict_has(key) {
3368 this.forEach = function Dict_forEach(callback) {
3369 for (var key in map) {
3370 callback(key, this.get(key));
3378 var Ref = (function RefClosure() {
3379 function Ref(num, gen) {
3389 // The reference is identified by number and generation,
3390 // this structure stores only one instance of the reference.
3391 var RefSet = (function RefSetClosure() {
3396 RefSet.prototype = {
3397 has: function RefSet_has(ref) {
3398 return !!this.dict['R' + ref.num + '.' + ref.gen];
3401 put: function RefSet_put(ref) {
3402 this.dict['R' + ref.num + '.' + ref.gen] = ref;
3409 var Catalog = (function CatalogClosure() {
3410 function Catalog(xref) {
3412 var obj = xref.getCatalogObj();
3413 assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
3417 Catalog.prototype = {
3419 var stream = this.catDict.get('Metadata');
3421 if (stream && isDict(stream.dict)) {
3422 var type = stream.dict.get('Type');
3423 var subtype = stream.dict.get('Subtype');
3425 if (isName(type) && isName(subtype) &&
3426 type.name === 'Metadata' && subtype.name === 'XML') {
3427 metadata = stringToPDFString(bytesToString(stream.getBytes()));
3431 return shadow(this, 'metadata', metadata);
3433 get toplevelPagesDict() {
3434 var pagesObj = this.catDict.get('Pages');
3435 assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary');
3436 // shadow the prototype getter
3437 return shadow(this, 'toplevelPagesDict', pagesObj);
3439 get documentOutline() {
3440 var xref = this.xref;
3441 var obj = this.catDict.get('Outlines');
3442 var root = { items: [] };
3444 obj = obj.getRaw('First');
3445 var processed = new RefSet();
3447 var queue = [{obj: obj, parent: root}];
3448 // to avoid recursion keeping track of the items
3449 // in the processed dictionary
3451 while (queue.length > 0) {
3452 var i = queue.shift();
3453 var outlineDict = xref.fetchIfRef(i.obj);
3454 if (outlineDict === null)
3456 if (!outlineDict.has('Title'))
3457 error('Invalid outline item');
3458 var dest = outlineDict.get('A');
3460 dest = dest.get('D');
3461 else if (outlineDict.has('Dest')) {
3462 dest = outlineDict.getRaw('Dest');
3466 var title = outlineDict.get('Title');
3469 title: stringToPDFString(title),
3470 color: outlineDict.get('C') || [0, 0, 0],
3471 count: outlineDict.get('Count'),
3472 bold: !!(outlineDict.get('F') & 2),
3473 italic: !!(outlineDict.get('F') & 1),
3476 i.parent.items.push(outlineItem);
3477 obj = outlineDict.getRaw('First');
3478 if (isRef(obj) && !processed.has(obj)) {
3479 queue.push({obj: obj, parent: outlineItem});
3482 obj = outlineDict.getRaw('Next');
3483 if (isRef(obj) && !processed.has(obj)) {
3484 queue.push({obj: obj, parent: i.parent});
3490 obj = root.items.length > 0 ? root.items : null;
3491 return shadow(this, 'documentOutline', obj);
3494 var obj = this.toplevelPagesDict.get('Count');
3497 'page count in top level pages object is not an integer'
3499 // shadow the prototype getter
3500 return shadow(this, 'num', obj);
3502 traverseKids: function Catalog_traverseKids(pagesDict) {
3503 var pageCache = this.pageCache;
3504 var kids = pagesDict.get('Kids');
3505 assertWellFormed(isArray(kids),
3506 'page dictionary kids object is not an array');
3507 for (var i = 0, ii = kids.length; i < ii; ++i) {
3509 assertWellFormed(isRef(kid),
3510 'page dictionary kid is not a reference');
3511 var obj = this.xref.fetch(kid);
3512 if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {
3513 pageCache.push(new Page(this.xref, pageCache.length, obj, kid));
3514 } else { // must be a child page dictionary
3517 'page dictionary kid reference points to wrong type of object'
3519 this.traverseKids(obj);
3523 get destinations() {
3524 function fetchDestination(dest) {
3525 return isDict(dest) ? dest.get('D') : dest;
3528 var xref = this.xref;
3529 var dests = {}, nameTreeRef, nameDictionaryRef;
3530 var obj = this.catDict.get('Names');
3532 nameTreeRef = obj.getRaw('Dests');
3533 else if (this.catDict.has('Dests'))
3534 nameDictionaryRef = this.catDict.get('Dests');
3536 if (nameDictionaryRef) {
3537 // reading simple destination dictionary
3538 obj = nameDictionaryRef;
3539 obj.forEach(function catalogForEach(key, value) {
3541 dests[key] = fetchDestination(value);
3545 // reading name tree
3546 var processed = new RefSet();
3547 processed.put(nameTreeRef);
3548 var queue = [nameTreeRef];
3549 while (queue.length > 0) {
3551 obj = xref.fetch(queue.shift());
3552 if (obj.has('Kids')) {
3553 var kids = obj.get('Kids');
3554 for (i = 0, n = kids.length; i < n; i++) {
3556 if (processed.has(kid))
3557 error('invalid destinations');
3563 var names = obj.get('Names');
3564 for (i = 0, n = names.length; i < n; i += 2) {
3565 dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1]));
3569 return shadow(this, 'destinations', dests);
3571 getPage: function Catalog_getPage(n) {
3572 var pageCache = this.pageCache;
3574 pageCache = this.pageCache = [];
3575 this.traverseKids(this.toplevelPagesDict);
3577 return this.pageCache[n - 1];
3584 var XRef = (function XRefClosure() {
3585 function XRef(stream, startXRef, mainXRefEntriesOffset) {
3586 this.stream = stream;
3589 var trailerDict = this.readXRef(startXRef);
3590 trailerDict.assignXref(this);
3591 this.trailer = trailerDict;
3592 // prepare the XRef cache
3595 var encrypt = trailerDict.get('Encrypt');
3597 var fileId = trailerDict.get('ID');
3598 this.encrypt = new CipherTransformFactory(encrypt,
3599 fileId[0] /*, password */);
3602 // get the root dictionary (catalog) object
3603 if (!(this.root = trailerDict.get('Root')))
3604 error('Invalid root reference');
3608 readXRefTable: function XRef_readXRefTable(parser) {
3609 // Example of cross-reference table:
3611 // 0 1 <-- subsection header (first obj #, obj count)
3612 // 0000000000 65535 f <-- actual object (offset, generation #, f/n)
3613 // 23 2 <-- subsection header ... and so on ...
3614 // 0000025518 00002 n
3615 // 0000025635 00000 n
3619 // Outer loop is over subsection headers
3621 while (!isCmd(obj = parser.getObj(), 'trailer')) {
3623 count = parser.getObj();
3625 if (!isInt(first) || !isInt(count))
3626 error('Invalid XRef table: wrong types in subsection header');
3628 // Inner loop is over objects themselves
3629 for (var i = 0; i < count; i++) {
3631 entry.offset = parser.getObj();
3632 entry.gen = parser.getObj();
3633 var type = parser.getObj();
3635 if (isCmd(type, 'f'))
3637 else if (isCmd(type, 'n'))
3638 entry.uncompressed = true;
3640 // Validate entry obj
3641 if (!isInt(entry.offset) || !isInt(entry.gen) ||
3642 !(entry.free || entry.uncompressed)) {
3643 error('Invalid entry in XRef subsection: ' + first + ', ' + count);
3646 if (!this.entries[i + first])
3647 this.entries[i + first] = entry;
3651 // Sanity check: as per spec, first object must be free
3652 if (this.entries[0] && !this.entries[0].free)
3653 error('Invalid XRef table: unexpected first object');
3656 if (!isCmd(obj, 'trailer'))
3657 error('Invalid XRef table: could not find trailer dictionary');
3659 // Read trailer dictionary, e.g.
3664 // /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
3666 // The parser goes through the entire stream << ... >> and provides
3667 // a getter interface for the key-value table
3668 var dict = parser.getObj();
3670 error('Invalid XRef table: could not parse trailer dictionary');
3674 readXRefStream: function XRef_readXRefStream(stream) {
3675 var streamParameters = stream.parameters;
3676 var byteWidths = streamParameters.get('W');
3677 var range = streamParameters.get('Index');
3679 range = [0, streamParameters.get('Size')];
3681 while (range.length > 0) {
3682 var first = range[0], n = range[1];
3683 if (!isInt(first) || !isInt(n))
3684 error('Invalid XRef range fields: ' + first + ', ' + n);
3685 var typeFieldWidth = byteWidths[0];
3686 var offsetFieldWidth = byteWidths[1];
3687 var generationFieldWidth = byteWidths[2];
3688 if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
3689 !isInt(generationFieldWidth)) {
3690 error('Invalid XRef entry fields length: ' + first + ', ' + n);
3692 for (i = 0; i < n; ++i) {
3693 var type = 0, offset = 0, generation = 0;
3694 for (j = 0; j < typeFieldWidth; ++j)
3695 type = (type << 8) | stream.getByte();
3696 // if type field is absent, its default value = 1
3697 if (typeFieldWidth == 0)
3699 for (j = 0; j < offsetFieldWidth; ++j)
3700 offset = (offset << 8) | stream.getByte();
3701 for (j = 0; j < generationFieldWidth; ++j)
3702 generation = (generation << 8) | stream.getByte();
3704 entry.offset = offset;
3705 entry.gen = generation;
3711 entry.uncompressed = true;
3716 error('Invalid XRef entry type: ' + type);
3718 if (!this.entries[first + i])
3719 this.entries[first + i] = entry;
3723 return streamParameters;
3725 indexObjects: function XRef_indexObjects() {
3726 // Simple scan through the PDF content to find objects,
3727 // trailers and XRef streams.
3728 function readToken(data, offset) {
3729 var token = '', ch = data[offset];
3730 while (ch !== 13 && ch !== 10) {
3731 if (++offset >= data.length)
3733 token += String.fromCharCode(ch);
3738 function skipUntil(data, offset, what) {
3739 var length = what.length, dataLength = data.length;
3741 // finding byte sequence
3742 while (offset < dataLength) {
3744 while (i < length && data[offset + i] == what[i])
3747 break; // sequence found
3754 var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
3755 var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
3757 var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
3758 var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
3760 var stream = this.stream;
3762 var buffer = stream.getBytes();
3763 var position = stream.start, length = buffer.length;
3764 var trailers = [], xrefStms = [];
3767 while (position < length) {
3768 var ch = buffer[position];
3769 if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
3773 if (ch === 37) { // %-comment
3776 ch = buffer[position];
3777 } while (ch !== 13 && ch !== 10);
3780 var token = readToken(buffer, position);
3782 if (token === 'xref') {
3783 position += skipUntil(buffer, position, trailerBytes);
3784 trailers.push(position);
3785 position += skipUntil(buffer, position, startxrefBytes);
3786 } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
3787 this.entries[m[1]] = {
3793 var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
3794 var content = buffer.subarray(position, position + contentLength);
3796 // checking XRef stream suspect
3797 // (it shall have '/XRef' and next char is not a letter)
3798 var xrefTagOffset = skipUntil(content, 0, xrefBytes);
3799 if (xrefTagOffset < contentLength &&
3800 content[xrefTagOffset + 5] < 64) {
3801 xrefStms.push(position);
3802 this.xrefstms[position] = 1; // don't read it recursively
3805 position += contentLength;
3807 position += token.length + 1;
3809 // reading XRef streams
3810 for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
3811 this.readXRef(xrefStms[i], true);
3813 // finding main trailer
3815 for (var i = 0, ii = trailers.length; i < ii; ++i) {
3816 stream.pos = trailers[i];
3817 var parser = new Parser(new Lexer(stream), true, null);
3818 var obj = parser.getObj();
3819 if (!isCmd(obj, 'trailer'))
3821 // read the trailer dictionary
3822 if (!isDict(dict = parser.getObj()))
3824 // taking the first one with 'ID'
3828 // no tailer with 'ID', taking last one (if exists)
3832 error('Invalid PDF structure');
3834 readXRef: function XRef_readXRef(startXRef, recoveryMode) {
3835 var stream = this.stream;
3836 stream.pos = startXRef;
3839 var parser = new Parser(new Lexer(stream), true, null);
3840 var obj = parser.getObj();
3844 if (isCmd(obj, 'xref')) {
3845 // Parse end-of-file XRef
3846 dict = this.readXRefTable(parser);
3848 // Recursively get other XRefs 'XRefStm', if any
3849 obj = dict.get('XRefStm');
3852 // ignore previously loaded xref streams
3853 // (possible infinite recursion)
3854 if (!(pos in this.xrefstms)) {
3855 this.xrefstms[pos] = 1;
3859 } else if (isInt(obj)) {
3860 // Parse in-stream XRef
3861 if (!isInt(parser.getObj()) ||
3862 !isCmd(parser.getObj(), 'obj') ||
3863 !isStream(obj = parser.getObj())) {
3864 error('Invalid XRef stream');
3866 dict = this.readXRefStream(obj);
3868 error('Failed to read XRef stream');
3871 // Recursively get previous dictionary, if any
3872 obj = dict.get('Prev');
3874 this.readXRef(obj, recoveryMode);
3875 else if (isRef(obj)) {
3876 // The spec says Prev must not be a reference, i.e. "/Prev NNN"
3877 // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
3878 this.readXRef(obj.num, recoveryMode);
3883 log('(while reading XRef): ' + e);
3889 warn('Indexing all PDF objects');
3890 return this.indexObjects();
3892 getEntry: function XRef_getEntry(i) {
3893 var e = this.entries[i];
3896 return e.free ? null : e; // returns null is the entry is free
3898 fetchIfRef: function XRef_fetchIfRef(obj) {
3901 return this.fetch(obj);
3903 fetch: function XRef_fetch(ref, suppressEncryption) {
3904 assertWellFormed(isRef(ref), 'ref object is not a reference');
3906 if (num in this.cache)
3907 return this.cache[num];
3909 var e = this.getEntry(num);
3911 // the referenced entry can be free
3913 return (this.cache[num] = e);
3917 if (e.uncompressed) {
3919 error('inconsistent generation in XRef');
3920 stream = this.stream.makeSubStream(e.offset);
3921 parser = new Parser(new Lexer(stream), true, this);
3922 var obj1 = parser.getObj();
3923 var obj2 = parser.getObj();
3924 var obj3 = parser.getObj();
3925 if (!isInt(obj1) || obj1 != num ||
3926 !isInt(obj2) || obj2 != gen ||
3928 error('bad XRef entry');
3930 if (!isCmd(obj3, 'obj')) {
3931 // some bad pdfs use "obj1234" and really mean 1234
3932 if (obj3.cmd.indexOf('obj') == 0) {
3933 num = parseInt(obj3.cmd.substring(3), 10);
3937 error('bad XRef entry');
3939 if (this.encrypt && !suppressEncryption) {
3941 e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
3943 // almost all streams must be encrypted, but sometimes
3944 // they are not probably due to some broken generators
3945 // re-trying without encryption
3946 return this.fetch(ref, true);
3949 e = parser.getObj();
3951 // Don't cache streams since they are mutable (except images).
3952 if (!isStream(e) || e instanceof JpegStream)
3953 this.cache[num] = e;
3958 stream = this.fetch(new Ref(e.offset, 0));
3959 if (!isStream(stream))
3960 error('bad ObjStm stream');
3961 var first = stream.parameters.get('First');
3962 var n = stream.parameters.get('N');
3963 if (!isInt(first) || !isInt(n)) {
3964 error('invalid first and n parameters for ObjStm stream');
3966 parser = new Parser(new Lexer(stream), false, this);
3967 var i, entries = [], nums = [];
3968 // read the object numbers to populate cache
3969 for (i = 0; i < n; ++i) {
3970 num = parser.getObj();
3972 error('invalid object number in the ObjStm stream: ' + num);
3975 var offset = parser.getObj();
3976 if (!isInt(offset)) {
3977 error('invalid object offset in the ObjStm stream: ' + offset);
3980 // read stream objects for cache
3981 for (i = 0; i < n; ++i) {
3982 entries.push(parser.getObj());
3983 this.cache[nums[i]] = entries[i];
3987 error('bad XRef entry for compressed object');
3991 getCatalogObj: function XRef_getCatalogObj() {
4000 * A PDF document and page is built of many objects. E.g. there are objects
4001 * for fonts, images, rendering code and such. These objects might get processed
4002 * inside of a worker. The `PDFObjects` implements some basic functions to
4003 * manage these objects.
4005 var PDFObjects = (function PDFObjectsClosure() {
4006 function PDFObjects() {
4010 PDFObjects.prototype = {
4014 * Internal function.
4015 * Ensures there is an object defined for `objId`. Stores `data` on the
4016 * object *if* it is created.
4018 ensureObj: function PDFObjects_ensureObj(objId, data) {
4019 if (this.objs[objId])
4020 return this.objs[objId];
4021 return this.objs[objId] = new Promise(objId, data);
4025 * If called *without* callback, this returns the data of `objId` but the
4026 * object needs to be resolved. If it isn't, this function throws.
4028 * If called *with* a callback, the callback is called with the data of the
4029 * object once the object is resolved. That means, if you call this
4030 * function and the object is already resolved, the callback gets called
4033 get: function PDFObjects_get(objId, callback) {
4034 // If there is a callback, then the get can be async and the object is
4035 // not required to be resolved right now
4037 this.ensureObj(objId).then(callback);
4041 // If there isn't a callback, the user expects to get the resolved data
4043 var obj = this.objs[objId];
4045 // If there isn't an object yet or the object isn't resolved, then the
4046 // data isn't ready yet!
4047 if (!obj || !obj.isResolved)
4048 error('Requesting object that isn\'t resolved yet ' + objId);
4054 * Resolves the object `objId` with optional `data`.
4056 resolve: function PDFObjects_resolve(objId, data) {
4057 var objs = this.objs;
4059 // In case there is a promise already on this object, just resolve it.
4061 objs[objId].resolve(data);
4063 this.ensureObj(objId, data);
4067 onData: function PDFObjects_onData(objId, callback) {
4068 this.ensureObj(objId).onData(callback);
4071 isResolved: function PDFObjects_isResolved(objId) {
4072 var objs = this.objs;
4076 return objs[objId].isResolved;
4080 hasData: function PDFObjects_hasData(objId) {
4081 var objs = this.objs;
4085 return objs[objId].hasData;
4090 * Sets the data of an object but *doesn't* resolve it.
4092 setData: function PDFObjects_setData(objId, data) {
4093 // Watchout! If you call `this.ensureObj(objId, data)` you're going to
4094 // create a *resolved* promise which shouldn't be the case!
4095 this.ensureObj(objId).data = data;
4102 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
4103 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
4107 var PDFFunction = (function PDFFunctionClosure() {
4108 var CONSTRUCT_SAMPLED = 0;
4109 var CONSTRUCT_INTERPOLATED = 2;
4110 var CONSTRUCT_STICHED = 3;
4111 var CONSTRUCT_POSTSCRIPT = 4;
4114 getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
4117 for (var i = 0, ii = size.length; i < ii; i++)
4119 length *= outputSize;
4124 // 32 is a valid bps so shifting won't work
4125 var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
4127 var strBytes = str.getBytes((length * bps + 7) / 8);
4129 for (var i = 0; i < length; i++) {
4130 while (codeSize < bps) {
4132 codeBuf |= strBytes[strIdx++];
4136 array.push((codeBuf >> codeSize) * sampleMul);
4137 codeBuf &= (1 << codeSize) - 1;
4142 getIR: function PDFFunction_getIR(xref, fn) {
4147 var types = [this.constructSampled,
4149 this.constructInterpolated,
4150 this.constructStiched,
4151 this.constructPostScript];
4153 var typeNum = dict.get('FunctionType');
4154 var typeFn = types[typeNum];
4156 error('Unknown type of function');
4158 return typeFn.call(this, fn, dict, xref);
4161 fromIR: function PDFFunction_fromIR(IR) {
4164 case CONSTRUCT_SAMPLED:
4165 return this.constructSampledFromIR(IR);
4166 case CONSTRUCT_INTERPOLATED:
4167 return this.constructInterpolatedFromIR(IR);
4168 case CONSTRUCT_STICHED:
4169 return this.constructStichedFromIR(IR);
4170 case CONSTRUCT_POSTSCRIPT:
4172 return this.constructPostScriptFromIR(IR);
4176 parse: function PDFFunction_parse(xref, fn) {
4177 var IR = this.getIR(xref, fn);
4178 return this.fromIR(IR);
4181 constructSampled: function PDFFunction_constructSampled(str, dict) {
4182 function toMultiArray(arr) {
4183 var inputLength = arr.length;
4184 var outputLength = arr.length / 2;
4187 for (var i = 0; i < inputLength; i += 2) {
4188 out[index] = [arr[i], arr[i + 1]];
4193 var domain = dict.get('Domain');
4194 var range = dict.get('Range');
4196 if (!domain || !range)
4197 error('No domain or range');
4199 var inputSize = domain.length / 2;
4200 var outputSize = range.length / 2;
4202 domain = toMultiArray(domain);
4203 range = toMultiArray(range);
4205 var size = dict.get('Size');
4206 var bps = dict.get('BitsPerSample');
4207 var order = dict.get('Order');
4211 error('No support for cubic spline interpolation: ' + order);
4213 var encode = dict.get('Encode');
4216 for (var i = 0; i < inputSize; ++i) {
4218 encode.push(size[i] - 1);
4221 encode = toMultiArray(encode);
4223 var decode = dict.get('Decode');
4227 decode = toMultiArray(decode);
4229 var samples = this.getSampleArray(size, outputSize, bps, str);
4232 CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
4233 outputSize, Math.pow(2, bps) - 1, range
4237 constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
4238 // See chapter 3, page 109 of the PDF reference
4239 function interpolate(x, xmin, xmax, ymin, ymax) {
4240 return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
4243 return function constructSampledFromIRResult(args) {
4244 // See chapter 3, page 110 of the PDF reference.
4249 var samples = IR[5];
4255 if (m != args.length)
4256 error('Incorrect number of arguments: ' + inputSize + ' != ' +
4261 // Building the cube vertices: its part and sample index
4262 // http://rjwagner49.com/Mathematics/Interpolation.pdf
4263 var cubeVertices = 1 << m;
4264 var cubeN = new Float64Array(cubeVertices);
4265 var cubeVertex = new Uint32Array(cubeVertices);
4266 for (var j = 0; j < cubeVertices; j++)
4270 // Map x_i to y_j for 0 <= i < m using the sampled function.
4271 for (var i = 0; i < m; ++i) {
4272 // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
4273 var domain_2i = domain[i][0];
4274 var domain_2i_1 = domain[i][1];
4275 var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1);
4277 // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
4278 // Encode_2i, Encode_2i+1)
4279 var e = interpolate(xi, domain_2i, domain_2i_1,
4280 encode[i][0], encode[i][1]);
4282 // e_i' = min(max(e_i, 0), Size_i - 1)
4283 var size_i = size[i];
4284 e = Math.min(Math.max(e, 0), size_i - 1);
4286 // Adjusting the cube: N and vertex sample index
4287 var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
4288 var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
4289 var n1 = e - e0; // (e - e0) / (e1 - e0);
4290 var offset0 = e0 * k;
4291 var offset1 = offset0 + k; // e1 * k
4292 for (var j = 0; j < cubeVertices; j++) {
4295 cubeVertex[j] += offset1;
4298 cubeVertex[j] += offset0;
4306 var y = new Float64Array(n);
4307 for (var j = 0; j < n; ++j) {
4308 // Sum all cube vertices' samples portions
4310 for (var i = 0; i < cubeVertices; i++)
4311 rj += samples[cubeVertex[i] + j] * cubeN[i];
4313 // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
4314 // Decode_2j, Decode_2j+1)
4315 rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
4317 // y_j = min(max(r_j, range_2j), range_2j+1)
4318 y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
4325 constructInterpolated: function PDFFunction_constructInterpolated(str,
4327 var c0 = dict.get('C0') || [0];
4328 var c1 = dict.get('C1') || [1];
4329 var n = dict.get('N');
4331 if (!isArray(c0) || !isArray(c1))
4332 error('Illegal dictionary for interpolated function');
4334 var length = c0.length;
4336 for (var i = 0; i < length; ++i)
4337 diff.push(c1[i] - c0[i]);
4339 return [CONSTRUCT_INTERPOLATED, c0, diff, n];
4342 constructInterpolatedFromIR:
4343 function PDFFunction_constructInterpolatedFromIR(IR) {
4348 var length = diff.length;
4350 return function constructInterpolatedFromIRResult(args) {
4351 var x = n == 1 ? args[0] : Math.pow(args[0], n);
4354 for (var j = 0; j < length; ++j)
4355 out.push(c0[j] + (x * diff[j]));
4362 constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
4363 var domain = dict.get('Domain');
4368 var inputSize = domain.length / 2;
4370 error('Bad domain for stiched function');
4372 var fnRefs = dict.get('Functions');
4374 for (var i = 0, ii = fnRefs.length; i < ii; ++i)
4375 fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
4377 var bounds = dict.get('Bounds');
4378 var encode = dict.get('Encode');
4380 return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
4383 constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
4390 for (var i = 0, ii = fnsIR.length; i < ii; i++) {
4391 fns.push(PDFFunction.fromIR(fnsIR[i]));
4394 return function constructStichedFromIRResult(args) {
4395 var clip = function constructStichedFromIRClip(v, min, max) {
4404 var v = clip(args[0], domain[0], domain[1]);
4405 // calulate which bound the value is in
4406 for (var i = 0, ii = bounds.length; i < ii; ++i) {
4411 // encode value into domain of function
4412 var dmin = domain[0];
4414 dmin = bounds[i - 1];
4415 var dmax = domain[1];
4416 if (i < bounds.length)
4419 var rmin = encode[2 * i];
4420 var rmax = encode[2 * i + 1];
4422 var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
4424 // call the appropropriate function
4425 return fns[i]([v2]);
4429 constructPostScript: function PDFFunction_constructPostScript(fn, dict,
4431 var domain = dict.get('Domain');
4432 var range = dict.get('Range');
4435 error('No domain.');
4440 var lexer = new PostScriptLexer(fn);
4441 var parser = new PostScriptParser(lexer);
4442 var code = parser.parse();
4444 return [CONSTRUCT_POSTSCRIPT, domain, range, code];
4447 constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
4452 var numOutputs = range.length / 2;
4453 var evaluator = new PostScriptEvaluator(code);
4454 // Cache the values for a big speed up, the cache size is limited though
4455 // since the number of possible values can be huge from a PS function.
4456 var cache = new FunctionCache();
4457 return function constructPostScriptFromIRResult(args) {
4458 var initialStack = [];
4459 for (var i = 0, ii = (domain.length / 2); i < ii; ++i) {
4460 initialStack.push(args[i]);
4463 var key = initialStack.join('_');
4465 return cache.get(key);
4467 var stack = evaluator.execute(initialStack);
4468 var transformed = [];
4469 for (i = numOutputs - 1; i >= 0; --i) {
4470 var out = stack.pop();
4471 var rangeIndex = 2 * i;
4472 if (out < range[rangeIndex])
4473 out = range[rangeIndex];
4474 else if (out > range[rangeIndex + 1])
4475 out = range[rangeIndex + 1];
4476 transformed[i] = out;
4478 cache.set(key, transformed);
4485 var FunctionCache = (function FunctionCacheClosure() {
4486 // Of 10 PDF's with type4 functions the maxium number of distinct values seen
4487 // was 256. This still may need some tweaking in the future though.
4488 var MAX_CACHE_SIZE = 1024;
4489 function FunctionCache() {
4493 FunctionCache.prototype = {
4494 has: function FunctionCache_has(key) {
4495 return key in this.cache;
4497 get: function FunctionCache_get(key) {
4498 return this.cache[key];
4500 set: function FunctionCache_set(key, value) {
4501 if (this.total < MAX_CACHE_SIZE) {
4502 this.cache[key] = value;
4507 return FunctionCache;
4510 var PostScriptStack = (function PostScriptStackClosure() {
4511 var MAX_STACK_SIZE = 100;
4512 function PostScriptStack(initialStack) {
4513 this.stack = initialStack || [];
4516 PostScriptStack.prototype = {
4517 push: function PostScriptStack_push(value) {
4518 if (this.stack.length >= MAX_STACK_SIZE)
4519 error('PostScript function stack overflow.');
4520 this.stack.push(value);
4522 pop: function PostScriptStack_pop() {
4523 if (this.stack.length <= 0)
4524 error('PostScript function stack underflow.');
4525 return this.stack.pop();
4527 copy: function PostScriptStack_copy(n) {
4528 if (this.stack.length + n >= MAX_STACK_SIZE)
4529 error('PostScript function stack overflow.');
4530 var stack = this.stack;
4531 for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++)
4532 stack.push(stack[i]);
4534 index: function PostScriptStack_index(n) {
4535 this.push(this.stack[this.stack.length - n - 1]);
4537 // rotate the last n stack elements p times
4538 roll: function PostScriptStack_roll(n, p) {
4539 var stack = this.stack;
4540 var l = stack.length - n;
4541 var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
4542 for (i = l, j = r; i < j; i++, j--) {
4543 t = stack[i]; stack[i] = stack[j]; stack[j] = t;
4545 for (i = l, j = c - 1; i < j; i++, j--) {
4546 t = stack[i]; stack[i] = stack[j]; stack[j] = t;
4548 for (i = c, j = r; i < j; i++, j--) {
4549 t = stack[i]; stack[i] = stack[j]; stack[j] = t;
4553 return PostScriptStack;
4555 var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
4556 function PostScriptEvaluator(operators, operands) {
4557 this.operators = operators;
4558 this.operands = operands;
4560 PostScriptEvaluator.prototype = {
4561 execute: function PostScriptEvaluator_execute(initialStack) {
4562 var stack = new PostScriptStack(initialStack);
4564 var operators = this.operators;
4565 var length = operators.length;
4567 while (counter < length) {
4568 operator = operators[counter++];
4569 if (typeof operator == 'number') {
4570 // Operator is really an operand and should be pushed to the stack.
4571 stack.push(operator);
4575 // non standard ps operators
4576 case 'jz': // jump if false
4587 // all ps operators in alphabetical order (excluding if/ifelse)
4590 stack.push(Math.abs(a));
4600 if (isBool(a) && isBool(b))
4607 stack.push(Math.atan(a));
4619 stack.push(Math.ceil(a));
4627 stack.push(Math.cos(a));
4630 a = stack.pop() | 0;
4655 stack.push(Math.pow(a, b));
4662 stack.push(Math.floor(a));
4677 stack.push((a / b) | 0);
4690 stack.push(Math.log(a));
4694 stack.push(Math.log(a) / Math.LN10);
4722 if (isBool(a) && isBool(b))
4730 if (isBool(a) && isBool(b))
4745 stack.push(Math.round(a));
4749 stack.push(Math.sin(a));
4753 stack.push(Math.sqrt(a));
4765 a = a < 0 ? Math.ceil(a) : Math.floor(a);
4771 if (isBool(a) && isBool(b))
4777 error('Unknown operator ' + operator);
4784 return PostScriptEvaluator;
4787 var PostScriptParser = (function PostScriptParserClosure() {
4788 function PostScriptParser(lexer) {
4790 this.operators = [];
4794 PostScriptParser.prototype = {
4795 nextToken: function PostScriptParser_nextToken() {
4796 this.prev = this.token;
4797 this.token = this.lexer.getToken();
4799 accept: function PostScriptParser_accept(type) {
4800 if (this.token.type == type) {
4806 expect: function PostScriptParser_expect(type) {
4807 if (this.accept(type))
4809 error('Unexpected symbol: found ' + this.token.type + ' expected ' +
4812 parse: function PostScriptParser_parse() {
4814 this.expect(PostScriptTokenTypes.LBRACE);
4816 this.expect(PostScriptTokenTypes.RBRACE);
4817 return this.operators;
4819 parseBlock: function PostScriptParser_parseBlock() {
4821 if (this.accept(PostScriptTokenTypes.NUMBER)) {
4822 this.operators.push(this.prev.value);
4823 } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
4824 this.operators.push(this.prev.value);
4825 } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
4826 this.parseCondition();
4832 parseCondition: function PostScriptParser_parseCondition() {
4833 // Add two place holders that will be updated later
4834 var conditionLocation = this.operators.length;
4835 this.operators.push(null, null);
4838 this.expect(PostScriptTokenTypes.RBRACE);
4839 if (this.accept(PostScriptTokenTypes.IF)) {
4840 // The true block is right after the 'if' so it just falls through on
4841 // true else it jumps and skips the true block.
4842 this.operators[conditionLocation] = this.operators.length;
4843 this.operators[conditionLocation + 1] = 'jz';
4844 } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
4845 var jumpLocation = this.operators.length;
4846 this.operators.push(null, null);
4847 var endOfTrue = this.operators.length;
4849 this.expect(PostScriptTokenTypes.RBRACE);
4850 this.expect(PostScriptTokenTypes.IFELSE);
4851 // The jump is added at the end of the true block to skip the false
4853 this.operators[jumpLocation] = this.operators.length;
4854 this.operators[jumpLocation + 1] = 'j';
4856 this.operators[conditionLocation] = endOfTrue;
4857 this.operators[conditionLocation + 1] = 'jz';
4859 error('PS Function: error parsing conditional.');
4863 return PostScriptParser;
4866 var PostScriptTokenTypes = {
4875 var PostScriptToken = (function PostScriptTokenClosure() {
4876 function PostScriptToken(type, value) {
4883 PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
4884 var opValue = opCache[op];
4888 return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
4891 PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
4893 PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
4895 PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
4896 PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
4898 return PostScriptToken;
4901 var PostScriptLexer = (function PostScriptLexerClosure() {
4902 function PostScriptLexer(stream) {
4903 this.stream = stream;
4905 PostScriptLexer.prototype = {
4906 getToken: function PostScriptLexer_getToken() {
4909 var comment = false;
4910 var stream = this.stream;
4914 if (!(ch = stream.getChar()))
4918 if (ch == '\x0a' || ch == '\x0d')
4920 } else if (ch == '%') {
4922 } else if (!Lexer.isSpace(ch)) {
4927 case '0': case '1': case '2': case '3': case '4':
4928 case '5': case '6': case '7': case '8': case '9':
4929 case '+': case '-': case '.':
4930 return new PostScriptToken(PostScriptTokenTypes.NUMBER,
4931 this.getNumber(ch));
4933 return PostScriptToken.LBRACE;
4935 return PostScriptToken.RBRACE;
4938 var str = ch.toLowerCase();
4940 ch = stream.lookChar();
4943 ch = ch.toLowerCase();
4944 if (ch >= 'a' && ch <= 'z')
4952 return PostScriptToken.IF;
4954 return PostScriptToken.IFELSE;
4956 return PostScriptToken.getOperator(str);
4959 getNumber: function PostScriptLexer_getNumber(ch) {
4961 var stream = this.stream;
4963 ch = stream.lookChar();
4964 if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.')
4970 var value = parseFloat(str);
4972 error('Invalid floating point number: ' + value);
4976 return PostScriptLexer;
4980 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
4981 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
4985 var ISOAdobeCharset = [
4986 '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
4987 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
4988 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
4989 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
4990 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
4991 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
4992 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
4993 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
4994 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
4995 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
4996 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
4997 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
4998 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
4999 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
5000 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
5001 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
5002 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
5003 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
5004 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
5005 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
5006 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
5007 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
5008 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
5009 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
5010 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
5011 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
5012 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
5013 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
5014 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
5015 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
5016 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
5017 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
5018 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
5019 'ugrave', 'yacute', 'ydieresis', 'zcaron'
5022 var ExpertCharset = [
5023 '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
5024 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
5025 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
5026 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
5027 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
5028 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
5029 'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
5030 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
5031 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
5032 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
5033 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
5034 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
5035 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
5036 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
5037 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
5038 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
5039 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
5040 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
5041 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
5042 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
5043 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
5044 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
5045 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
5046 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
5047 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
5048 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
5049 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
5050 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
5051 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
5052 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
5053 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
5054 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
5055 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
5056 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
5057 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
5058 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
5062 var ExpertSubsetCharset = [
5063 '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
5064 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
5065 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
5066 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
5067 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
5068 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
5069 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
5070 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
5071 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
5072 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
5073 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
5074 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
5075 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
5076 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
5077 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
5078 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
5079 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
5080 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
5081 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
5082 'periodinferior', 'commainferior'
5086 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
5087 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
5091 var CIDToUnicodeMaps = {
5092 'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165,
5093 {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771],
5094 [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402,
5095 0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0,
5096 [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769},
5097 [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212],
5098 198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172,
5099 174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192},
5100 {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0,
5101 {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194,
5102 {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288],
5103 {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281,
5104 {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541},
5105 {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295,
5106 65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288},
5107 {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291,
5108 [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806},
5109 8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284,
5110 {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675,
5111 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306,
5112 8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838},
5113 {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704,
5114 8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730,
5115 8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834,
5116 {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313},
5117 {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913},
5118 {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025,
5119 {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463,
5120 21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569,
5121 28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451,
5122 22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433,
5123 24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301,
5124 20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944,
5125 26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806,
5126 [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946,
5127 37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419,
5128 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139,
5129 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879,
5130 [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867,
5131 [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417,
5132 28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180,
5133 21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945,
5134 29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123,
5135 30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290,
5136 22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814,
5137 28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467,
5138 40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540,
5139 25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206,
5140 [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742,
5141 29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899],
5142 19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025,
5143 22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827,
5144 [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499,
5145 33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942,
5146 38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469,
5147 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602,
5148 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913,
5149 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809,
5150 38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830,
5151 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012,
5152 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275,
5153 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226,
5154 [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398,
5155 23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949,
5156 28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088,
5157 36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427,
5158 33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000,
5159 33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223,
5160 24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185,
5161 24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454,
5162 27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475,
5163 31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694,
5164 35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867,
5165 39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721,
5166 32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916,
5167 22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582,
5168 26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671,
5169 27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020,
5170 36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096],
5171 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097,
5172 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507,
5173 21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458,
5174 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470,
5175 [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699,
5176 31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435,
5177 23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624,
5178 28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689,
5179 20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659,
5180 23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841,
5181 29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911,
5182 39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997,
5183 [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670,
5184 [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465,
5185 33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061,
5186 20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368,
5187 39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533,
5188 20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705,
5189 31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531,
5190 34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670,
5191 21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693,
5192 24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054,
5193 31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336,
5194 35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119,
5195 25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500,
5196 [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537,
5197 20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314,
5198 25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486,
5199 30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562,
5200 36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187,
5201 24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328],
5202 35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396,
5203 [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392,
5204 31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431,
5205 38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566,
5206 23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492,
5207 35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809,
5208 20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897,
5209 22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055,
5210 24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511,
5211 25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946,
5212 28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024,
5213 32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618,
5214 [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783,
5215 37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083,
5216 21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811,
5217 21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425,
5218 33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915,
5219 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681,
5220 26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449,
5221 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782,
5222 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622,
5223 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319,
5224 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555,
5225 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018,
5226 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662,
5227 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545,
5228 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217,
5229 38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977,
5230 20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642,
5231 29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283,
5232 27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235,
5233 [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107,
5234 24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525,
5235 [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992],
5236 32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430,
5237 35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284,
5238 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835,
5239 29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819],
5240 [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235,
5241 31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460,
5242 24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612,
5243 33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012,
5244 29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034,
5245 20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509,
5246 23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530,
5247 29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463,
5248 21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447,
5249 23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333,
5250 32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655,
5251 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313],
5252 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460,
5253 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899,
5254 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490,
5255 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981,
5256 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210,
5257 32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207,
5258 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484,
5259 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558,
5260 [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220,
5261 25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167,
5262 27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465,
5263 30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750,
5264 33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062,
5265 37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055,
5266 20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465,
5267 26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065,
5268 22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394],
5269 35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767,
5270 23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862,
5271 27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051,
5272 [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763],
5273 36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563,
5274 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920,
5275 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700],
5276 28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543,
5277 29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441,
5278 26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990,
5279 28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104,
5280 25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298,
5281 [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488,
5282 35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246,
5283 33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707],
5284 31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889,
5285 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634,
5286 32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554,
5287 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927,
5288 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680,
5289 33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983,
5290 37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109,
5291 32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970,
5292 29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311,
5293 35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489,
5294 21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436,
5295 25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437,
5296 29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609,
5297 33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783,
5298 38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419,
5299 20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895,
5300 20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384,
5301 23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409,
5302 21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364,
5303 39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907,
5304 25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864,
5305 36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261,
5306 38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299,
5307 27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552,
5308 21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466,
5309 36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336,
5310 22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701,
5311 31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727,
5312 24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320,
5313 24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933,
5314 39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378,
5315 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609,
5316 27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710,
5317 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086,
5318 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397,
5319 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548,
5320 36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189,
5321 25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684,
5322 26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131,
5323 20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378,
5324 22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302,
5325 20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237,
5326 24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118,
5327 31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336,
5328 [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969,
5329 37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635,
5330 22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857,
5331 20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615,
5332 22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077,
5333 36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900,
5334 24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616,
5335 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812,
5336 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095,
5337 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342,
5338 35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472,
5339 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643,
5340 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499,
5341 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233,
5342 20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702,
5343 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311,
5344 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466,
5345 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741,
5346 [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425,
5347 24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219,
5348 22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105,
5349 24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492,
5350 22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468,
5351 24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110,
5352 32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479,
5353 30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757,
5354 26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204,
5355 30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333],
5356 31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707,
5357 39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368,
5358 24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271,
5359 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532,
5360 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495,
5361 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009,
5362 31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436,
5363 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754,
5364 25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382],
5365 30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991,
5366 [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503,
5367 27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305,
5368 [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050,
5369 31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426,
5370 27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551,
5371 30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428,
5372 25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184,
5373 22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975,
5374 26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676,
5375 36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310,
5376 33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239,
5377 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343,
5378 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996,
5379 25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862,
5380 19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109,
5381 38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887,
5382 21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232,
5383 36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303,
5384 37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675,
5385 24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253,
5386 21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447,
5387 25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990,
5388 33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165,
5389 40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125,
5390 {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938,
5391 33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693,
5392 [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187,
5393 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705,
5394 30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737,
5395 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451,
5396 [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975,
5397 24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637,
5398 23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885,
5399 [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695,
5400 40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855,
5401 37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236,
5402 [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611],
5403 29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665,
5404 [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839,
5405 24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822,
5406 37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493,
5407 38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664,
5408 21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558,
5409 26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480,
5410 36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313,
5411 19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562,
5412 25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992],
5413 31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965,
5414 38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096,
5415 32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853,
5416 37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033,
5417 21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041,
5418 [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504,
5419 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534,
5420 [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142,
5421 20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637,
5422 31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147],
5423 32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563,
5424 40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363,
5425 20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646,
5426 38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265,
5427 24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676,
5428 21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266,
5429 24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725,
5430 [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682,
5431 35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434,
5432 20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109,
5433 24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031],
5434 20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333,
5435 20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174,
5436 20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233,
5437 20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376,
5438 20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447,
5439 20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520,
5440 20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478,
5441 20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570,
5442 20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681},
5443 20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725,
5444 20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791,
5445 20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834,
5446 31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873,
5447 20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898,
5448 {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917,
5449 20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976,
5450 [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038,
5451 21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108,
5452 21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137,
5453 36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214,
5454 21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254,
5455 21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283,
5456 21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321,
5457 21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367,
5458 [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430],
5459 21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498,
5460 21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533,
5461 21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627,
5462 21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676,
5463 21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720,
5464 {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817,
5465 21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811,
5466 21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918,
5467 21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956,
5468 21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009,
5469 22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063,
5470 22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190,
5471 22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225,
5472 22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280,
5473 22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327},
5474 22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409,
5475 22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484,
5476 {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561,
5477 22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687,
5478 22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743,
5479 22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777,
5480 {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790,
5481 22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862,
5482 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941,
5483 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001},
5484 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113,
5485 {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229,
5486 23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318,
5487 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381,
5488 {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418,
5489 [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504,
5490 23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557,
5491 {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592,
5492 [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409,
5493 23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939,
5494 23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785,
5495 23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839,
5496 23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886,
5497 23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980,
5498 23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022,
5499 [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091,
5500 {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162,
5501 24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636,
5502 [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291,
5503 24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305,
5504 24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413,
5505 24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392,
5506 24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409,
5507 [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458,
5508 24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508,
5509 24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672,
5510 24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591,
5511 24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675,
5512 24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707,
5513 24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760,
5514 24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853,
5515 24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817,
5516 {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876,
5517 24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948,
5518 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967,
5519 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033,
5520 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059,
5521 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096],
5522 25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136,
5523 {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212,
5524 25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303,
5525 25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290,
5526 25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352,
5527 25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472,
5528 25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534,
5529 25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652,
5530 25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711,
5531 25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818,
5532 25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289,
5533 {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850,
5534 25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908],
5535 [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933,
5536 25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015,
5537 26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073,
5538 [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483,
5539 {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205,
5540 26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249,
5541 26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296,
5542 26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359,
5543 26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433,
5544 26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480,
5545 26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607,
5546 26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606,
5547 26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701,
5548 26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767,
5549 26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784,
5550 26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918,
5551 26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839,
5552 26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913,
5553 26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937,
5554 26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058,
5555 27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101,
5556 27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102,
5557 27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057,
5558 27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204,
5559 27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192,
5560 27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323,
5561 27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354,
5562 27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448,
5563 27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476,
5564 27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523,
5565 27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569,
5566 [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628,
5567 27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684,
5568 27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803,
5569 27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863,
5570 27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882,
5571 27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922,
5572 27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644,
5573 28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140,
5574 28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138,
5575 28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267,
5576 28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189,
5577 28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356,
5578 28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748,
5579 28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478,
5580 28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659,
5581 28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579,
5582 28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632,
5583 28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670,
5584 28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753,
5585 28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895,
5586 28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064,
5587 29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096,
5588 29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164,
5589 29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229,
5590 29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254,
5591 29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346,
5592 29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410,
5593 {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469,
5594 29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546,
5595 29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627,
5596 29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746,
5597 29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795,
5598 29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681,
5599 29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943,
5600 29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990,
5601 29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057,
5602 30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090,
5603 30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147,
5604 30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179,
5605 30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194},
5606 30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256,
5607 30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305},
5608 {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332,
5609 30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384,
5610 30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437,
5611 30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494,
5612 {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571,
5613 30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622,
5614 30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679,
5615 30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018,
5616 30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890,
5617 30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956,
5618 30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019,
5619 31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114,
5620 31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189,
5621 31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263,
5622 31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329},
5623 31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382,
5624 31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434,
5625 31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457},
5626 31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512},
5627 31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564,
5628 31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645,
5629 31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641,
5630 31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764,
5631 31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757,
5632 31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811,
5633 31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852,
5634 31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923,
5635 31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954,
5636 31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002,
5637 32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070,
5638 32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137,
5639 32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189,
5640 32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221,
5641 32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274,
5642 32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313,
5643 32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345},
5644 32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383,
5645 {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398,
5646 {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592,
5647 [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616},
5648 32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670,
5649 32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697,
5650 {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761,
5651 39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801,
5652 32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866,
5653 32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900,
5654 32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997,
5655 32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065,
5656 33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137,
5657 33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184,
5658 33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208,
5659 33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224,
5660 33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281},
5661 33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331,
5662 33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384,
5663 {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426,
5664 33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523,
5665 33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497,
5666 33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583,
5667 33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571,
5668 33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704,
5669 33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783,
5670 33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787,
5671 33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922,
5672 33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983,
5673 33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953,
5674 34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044,
5675 34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212,
5676 34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204,
5677 34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269,
5678 34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338,
5679 34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417,
5680 34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500,
5681 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527,
5682 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569,
5683 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586,
5684 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649,
5685 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749,
5686 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799,
5687 34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833,
5688 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884,
5689 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933,
5690 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957,
5691 34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032},
5692 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082,
5693 35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126,
5694 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183,
5695 35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233,
5696 35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290,
5697 {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355,
5698 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437,
5699 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493},
5700 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556,
5701 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610,
5702 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646,
5703 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691,
5704 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730},
5705 35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920,
5706 [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973,
5707 35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029,
5708 {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093,
5709 {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112,
5710 40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225,
5711 36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299,
5712 {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351,
5713 {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423,
5714 36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437,
5715 36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499,
5716 36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542,
5717 36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618,
5718 36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646,
5719 36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686,
5720 36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791,
5721 36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857},
5722 36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917,
5723 36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958,
5724 36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002,
5725 37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083,
5726 37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221,
5727 37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290,
5728 37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343,
5729 37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397,
5730 37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451,
5731 37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609,
5732 37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685,
5733 37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780,
5734 37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832,
5735 37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941,
5736 37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994,
5737 37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015,
5738 38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311,
5739 38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348,
5740 38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440,
5741 {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493,
5742 38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567,
5743 {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585],
5744 38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660,
5745 38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698,
5746 38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748,
5747 38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780,
5748 38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819,
5749 {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876,
5750 [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968,
5751 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023},
5752 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145,
5753 39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204,
5754 39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243,
5755 {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341},
5756 39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405},
5757 {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467,
5758 39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511,
5759 39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612,
5760 39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647],
5761 {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675,
5762 39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717],
5763 {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747,
5764 39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825,
5765 {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865,
5766 39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994,
5767 39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944,
5768 39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007,
5769 39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172,
5770 40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227,
5771 40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264,
5772 {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363,
5773 40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376,
5774 40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431,
5775 40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584,
5776 {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632,
5777 40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669,
5778 40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697],
5779 {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737,
5780 40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803,
5781 {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822,
5782 40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0,
5783 {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0,
5784 13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0,
5785 {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470,
5786 13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180,
5787 8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976,
5788 0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0,
5789 194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171,
5790 0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070,
5791 {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4},
5792 64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625,
5793 39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0,
5794 28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802,
5795 63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584,
5796 {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432,
5797 194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0,
5798 {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0,
5799 {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089},
5800 {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508,
5801 65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825,
5802 9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235,
5803 13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090,
5804 13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056,
5805 13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3},
5806 {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560},
5807 {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856,
5808 12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976,
5809 12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947,
5810 12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260,
5811 13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256,
5812 8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824,
5813 9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953,
5814 9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612,
5815 9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566,
5816 9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20},
5817 20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575,
5818 8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0,
5819 12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704,
5820 37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389,
5821 [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362,
5822 20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546,
5823 20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148,
5824 21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014,
5825 21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471,
5826 64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970,
5827 23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0,
5828 23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542,
5829 24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880,
5830 24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133,
5831 26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272,
5832 26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831,
5833 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262,
5834 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039,
5835 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199,
5836 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843,
5837 28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374,
5838 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685,
5839 29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364,
5840 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842,
5841 31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467,
5842 31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030,
5843 33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155,
5844 64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495,
5845 35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214,
5846 64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335,
5847 37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434,
5848 37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495},
5849 37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665,
5850 37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830,
5851 37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707,
5852 38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013,
5853 {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794,
5854 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636},
5855 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256,
5856 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304,
5857 {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0,
5858 467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593,
5859 8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0,
5860 331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108},
5861 {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424},
5862 {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944,
5863 {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963,
5864 12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111,
5865 {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0,
5866 0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3},
5867 {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0,
5868 13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082},
5869 {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0,
5870 {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0,
5871 13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128,
5872 {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139,
5873 {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0,
5874 {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265,
5875 {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312},
5876 {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121,
5877 {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8},
5878 9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855,
5879 {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598},
5880 8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0,
5881 9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093},
5882 {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069,
5883 64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105,
5884 64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072,
5885 64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885,
5886 64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095,
5887 24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075,
5888 64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150,
5889 64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0,
5890 37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5},
5891 37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478,
5892 11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10},
5893 171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7},
5894 11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555,
5895 23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4},
5896 29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600,
5897 0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577,
5898 {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136],
5899 [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155],
5900 131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237,
5901 {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4},
5902 [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842,
5903 {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741,
5904 194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9},
5905 20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46},
5906 13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0,
5907 0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0,
5908 63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210,
5909 194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669,
5910 23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0,
5911 26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818,
5912 {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570,
5913 30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5},
5914 11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094],
5915 [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4},
5916 34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0,
5917 0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206,
5918 {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972},
5919 19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058],
5920 20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245,
5921 20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431,
5922 20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586,
5923 20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747,
5924 20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993,
5925 [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232,
5926 {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478,
5927 21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677,
5928 21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896,
5929 21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118,
5930 22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193,
5931 22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348,
5932 22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537,
5933 22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761,
5934 22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011},
5935 23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207,
5936 23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420,
5937 {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676,
5938 23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956,
5939 23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088,
5940 24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274,
5941 24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384,
5942 [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504,
5943 [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627,
5944 24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850},
5945 24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155,
5946 25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368,
5947 25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502,
5948 25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723,
5949 {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959,
5950 25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209,
5951 26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486,
5952 26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672},
5953 26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856,
5954 26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979,
5955 26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137,
5956 27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227,
5957 27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428,
5958 27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699,
5959 [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856,
5960 27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950,
5961 27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194,
5962 28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506,
5963 28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583},
5964 28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772,
5965 [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892,
5966 28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139,
5967 29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276,
5968 29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489,
5969 29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598},
5970 29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693,
5971 29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743},
5972 29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809,
5973 29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867,
5974 29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096,
5975 [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229},
5976 30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321,
5977 30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556,
5978 {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726,
5979 30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926,
5980 30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035],
5981 31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163,
5982 31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308,
5983 31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430,
5984 31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602,
5985 31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798,
5986 31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959,
5987 31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083,
5988 32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249,
5989 32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401,
5990 32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657,
5991 32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785,
5992 32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934,
5993 32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156,
5994 33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359,
5995 33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670,
5996 33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866,
5997 33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142,
5998 34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415,
5999 34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579,
6000 34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741,
6001 34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911,
6002 [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035,
6003 {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195,
6004 35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455,
6005 35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924,
6006 35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228,
6007 36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460,
6008 36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662,
6009 36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866,
6010 36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085,
6011 37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220,
6012 37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371,
6013 37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570,
6014 {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0,
6015 37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885,
6016 37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0,
6017 38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564,
6018 38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755,
6019 38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922,
6020 38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096,
6021 39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263,
6022 39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463,
6023 {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673,
6024 39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895,
6025 39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001,
6026 40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316,
6027 40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469,
6028 40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729,
6029 40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848,
6030 40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665,
6031 28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435,
6032 20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668,
6033 29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0,
6034 0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094,
6035 13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836},
6036 {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741},
6037 {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209},
6038 {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472,
6039 474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711,
6040 351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336,
6041 344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345,
6042 369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365,
6043 625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607,
6044 626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644,
6045 608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674,
6046 673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0,
6047 0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828,
6048 820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3},
6049 {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695,
6050 704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0,
6051 {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0,
6052 {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649,
6053 {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0,
6054 9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258,
6055 {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842},
6056 {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504,
6057 20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938,
6058 20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631,
6059 21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391,
6060 22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369,
6061 22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421,
6062 23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760,
6063 138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320,
6064 24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647,
6065 24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302,
6066 25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155,
6067 26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344,
6068 26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953,
6069 144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215,
6070 27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565,
6071 27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967,
6072 27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432,
6073 28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750,
6074 28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063,
6075 29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602,
6076 29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242,
6077 30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420,
6078 30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688,
6079 152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028,
6080 31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052,
6081 31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853,
6082 31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194,
6083 32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120,
6084 {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463,
6085 33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581,
6086 33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887,
6087 33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148,
6088 34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988,
6089 34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898,
6090 34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399,
6091 35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944,
6092 36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638,
6093 36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054,
6094 {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167,
6095 37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939,
6096 37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355,
6097 18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857,
6098 38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682,
6099 39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909,
6100 39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274,
6101 40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623,
6102 40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049,
6103 13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186,
6104 20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343},
6105 20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499,
6106 20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650,
6107 131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686,
6108 131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851,
6109 20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010,
6110 21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144,
6111 133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314,
6112 133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917,
6113 {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602,
6114 21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740,
6115 21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831,
6116 13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765,
6117 21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056,
6118 135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112,
6119 22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239,
6120 22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341},
6121 22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895,
6122 22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004,
6123 22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585,
6124 136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671},
6125 22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771},
6126 {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974,
6127 158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984,
6128 22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079,
6129 23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221,
6130 23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319,
6131 23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468,
6132 {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555,
6133 23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616,
6134 138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642,
6135 23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837,
6136 23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333,
6137 23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036,
6138 24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433,
6139 {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317,
6140 24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519,
6141 24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610,
6142 24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793,
6143 24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928,
6144 141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077,
6145 141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301,
6146 142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397,
6147 {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246,
6148 25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568,
6149 {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715,
6150 25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828,
6151 25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963,
6152 25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062,
6153 26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082,
6154 143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256,
6155 26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386,
6156 144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341,
6157 26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587,
6158 26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683,
6159 26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748,
6160 26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794},
6161 26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841,
6162 {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950,
6163 26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072,
6164 27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309,
6165 27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209,
6166 27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307,
6167 27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389,
6168 145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480,
6169 27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581,
6170 {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662,
6171 27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799,
6172 27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940,
6173 {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016,
6174 {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937,
6175 146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150,
6176 28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239,
6177 {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469,
6178 28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326,
6179 28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591,
6180 15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715,
6181 28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806,
6182 28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934,
6183 28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056,
6184 29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877,
6185 29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311,
6186 29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427,
6187 29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501,
6188 29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588,
6189 29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689,
6190 29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832,
6191 150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882,
6192 29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215,
6193 150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074,
6194 {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135,
6195 {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183,
6196 30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227,
6197 {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273,
6198 151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375},
6199 30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517,
6200 151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618,
6201 30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622,
6202 30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868,
6203 30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999,
6204 30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137,
6205 31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524,
6206 16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324,
6207 31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820,
6208 31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549,
6209 31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609,
6210 31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676,
6211 31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747,
6212 31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222,
6213 155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949,
6214 155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616,
6215 155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090,
6216 32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167,
6217 32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272,
6218 32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195,
6219 32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294,
6220 {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662,
6221 32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790,
6222 32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952,
6223 157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054,
6224 17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436,
6225 33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252,
6226 157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238,
6227 33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379,
6228 158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458,
6229 33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620,
6230 33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587,
6231 {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785,
6232 33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881},
6233 33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982,
6234 17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042,
6235 34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129,
6236 {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205,
6237 34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264},
6238 34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343,
6239 160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441,
6240 {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531,
6241 34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609,
6242 34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731,
6243 160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784,
6244 34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856,
6245 34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329,
6246 34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550,
6247 35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231,
6248 35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345,
6249 35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472,
6250 35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188,
6251 35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901,
6252 162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986,
6253 35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110,
6254 36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374,
6255 {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461,
6256 36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616,
6257 36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806,
6258 64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919,
6259 165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613,
6260 37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106,
6261 37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177,
6262 {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302,
6263 {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251,
6264 37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503,
6265 37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554,
6266 {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673,
6267 166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605,
6268 37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852,
6269 37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997,
6270 37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419,
6271 167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530,
6272 167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616,
6273 38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743,
6274 38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860,
6275 38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132,
6276 169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423,
6277 39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146,
6278 {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753,
6279 {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246,
6280 39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182,
6281 39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500,
6282 39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632,
6283 39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708,
6284 39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787},
6285 {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896,
6286 39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958,
6287 {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028,
6288 171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031,
6289 {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178,
6290 40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058,
6291 40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310},
6292 40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416,
6293 40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581,
6294 40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762,
6295 40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813,
6296 40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326,
6297 19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267,
6298 20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578,
6299 20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743,
6300 {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943,
6301 20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035,
6302 {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112},
6303 21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298,
6304 21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434,
6305 21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556},
6306 21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768,
6307 21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924,
6308 21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008,
6309 22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149,
6310 22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257,
6311 22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333},
6312 22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541,
6313 22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815,
6314 22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218,
6315 23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520,
6316 23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860,
6317 23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155,
6318 24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276},
6319 24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829,
6320 24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989,
6321 25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149,
6322 25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419,
6323 25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578,
6324 {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663,
6325 25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840,
6326 25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056,
6327 26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405,
6328 26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664,
6329 26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051,
6330 27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336},
6331 27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657,
6332 27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001,
6333 28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348,
6334 {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685,
6335 28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207,
6336 29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385,
6337 29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528,
6338 29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015,
6339 30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191,
6340 30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397,
6341 30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521,
6342 30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596,
6343 {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681,
6344 30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931,
6345 30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147,
6346 31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380,
6347 31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730,
6348 31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826},
6349 {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962,
6350 32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208,
6351 32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573,
6352 32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674,
6353 {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980,
6354 33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135,
6355 33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249,
6356 33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389,
6357 33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622,
6358 33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134,
6359 34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617,
6360 34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751,
6361 34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901,
6362 34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086},
6363 35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260,
6364 35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537,
6365 35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704,
6366 35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041,
6367 36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241,
6368 36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363,
6369 36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465,
6370 36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584,
6371 36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679,
6372 36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955,
6373 36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104,
6374 37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307,
6375 37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551,
6376 {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720,
6377 37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901},
6378 37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368,
6379 38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527,
6380 38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696,
6381 38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861,
6382 38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170,
6383 39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459,
6384 39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693},
6385 39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856,
6386 39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040,
6387 40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578},
6388 40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742,
6389 {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044,
6390 151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790,
6391 {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488,
6392 {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339,
6393 0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5},
6394 15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207,
6395 162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532,
6396 63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819,
6397 38315, 38741, 171581, 173594],
6398 'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644],
6399 {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211},
6400 8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308},
6401 {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176,
6402 {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736,
6403 8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679,
6404 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594,
6405 {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757,
6406 {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745,
6407 {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733,
6408 730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240,
6409 9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673,
6410 9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641,
6411 9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598,
6412 8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250,
6413 13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507,
6414 {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544},
6415 {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472,
6416 9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475,
6417 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512,
6418 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494,
6419 9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510},
6420 {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525},
6421 {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539},
6422 {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209},
6423 13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223},
6424 {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200},
6425 8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229},
6426 13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254,
6427 198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330,
6428 {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189,
6429 {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307,
6430 312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800},
6431 {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319,
6432 {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040},
6433 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036,
6434 {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068,
6435 {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107,
6436 44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151},
6437 44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180,
6438 {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204,
6439 {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232,
6440 44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266,
6441 44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288,
6442 44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329,
6443 {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359,
6444 44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400,
6445 {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417},
6446 {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471,
6447 {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512,
6448 44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555,
6449 44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602,
6450 {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624,
6451 44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648},
6452 44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684,
6453 {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751},
6454 {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796,
6455 {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852,
6456 {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880,
6457 {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936,
6458 {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992,
6459 {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032},
6460 {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072,
6461 45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132,
6462 45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184,
6463 45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212,
6464 {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233,
6465 {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255},
6466 {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320},
6467 {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336},
6468 {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364},
6469 {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392},
6470 {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440,
6471 45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468,
6472 45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544},
6473 45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576,
6474 {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628,
6475 45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692,
6476 {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720},
6477 {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748,
6478 {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789,
6479 45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811},
6480 {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840},
6481 {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915},
6482 {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934,
6483 {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964,
6484 45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024,
6485 {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043,
6486 46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112,
6487 {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168,
6488 {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248,
6489 46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293,
6490 {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319,
6491 46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372},
6492 {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400},
6493 {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428},
6494 {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506},
6495 {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532,
6496 {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612,
6497 46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752,
6498 46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840,
6499 {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895},
6500 {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944,
6501 46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976,
6502 46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008,
6503 {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049,
6504 {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103},
6505 {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133,
6506 {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168,
6507 47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212},
6508 47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288,
6509 {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329,
6510 {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364,
6511 47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441,
6512 {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469,
6513 {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497},
6514 {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551,
6515 47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579,
6516 {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604},
6517 {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676,
6518 47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699},
6519 47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732,
6520 47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787},
6521 47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816,
6522 {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900,
6523 47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931},
6524 {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960,
6525 47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052,
6526 48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124,
6527 {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145,
6528 {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173,
6529 {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201,
6530 {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267},
6531 48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292,
6532 {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316},
6533 48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348,
6534 {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400,
6535 48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464,
6536 {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519},
6537 {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560,
6538 48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640,
6539 48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671,
6540 {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727,
6541 {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752},
6542 {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780},
6543 {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852,
6544 {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904},
6545 {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968,
6546 {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104,
6547 49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248,
6548 {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315,
6549 49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331},
6550 {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360,
6551 {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388,
6552 {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429,
6553 {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452},
6554 {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480},
6555 {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508},
6556 {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552,
6557 49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576},
6558 49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632,
6559 49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668,
6560 {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695},
6561 {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736,
6562 {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776,
6563 49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816,
6564 49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844},
6565 49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899},
6566 49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920,
6567 {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948,
6568 {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032,
6569 50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112,
6570 {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157,
6571 {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228,
6572 {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292},
6573 50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420,
6574 50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460,
6575 {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493,
6576 {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515},
6577 {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536,
6578 {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567,
6579 {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592,
6580 50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619},
6581 {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648,
6582 {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676,
6583 {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704,
6584 {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728,
6585 {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747,
6586 {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771},
6587 {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812,
6588 50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844,
6589 {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872},
6590 {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900,
6591 {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928,
6592 {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964},
6593 50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995,
6594 50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020},
6595 51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060},
6596 51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086,
6597 {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104},
6598 {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132},
6599 {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165,
6600 51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210,
6601 {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236,
6602 {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272},
6603 {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322,
6604 {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357,
6605 51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404,
6606 {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445,
6607 {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473,
6608 51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552},
6609 51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600,
6610 {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655},
6611 51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673},
6612 {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692},
6613 {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720},
6614 {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796,
6615 {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864,
6616 {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923,
6617 {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992,
6618 {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056},
6619 52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201,
6620 {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257},
6621 {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283},
6622 {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320,
6623 52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384,
6624 {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412,
6625 {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481,
6626 {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516,
6627 52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593,
6628 52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647,
6629 52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728},
6630 52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772,
6631 52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828,
6632 {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856,
6633 52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888,
6634 {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929,
6635 {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980},
6636 {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011,
6637 53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048,
6638 {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097,
6639 {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168,
6640 53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237,
6641 53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308,
6642 {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344,
6643 {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412},
6644 53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444,
6645 {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468},
6646 53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517,
6647 {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571},
6648 {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608,
6649 53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672,
6650 {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752,
6651 53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820},
6652 53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896,
6653 {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937,
6654 {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963,
6655 53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008,
6656 {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038,
6657 {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064,
6658 {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140},
6659 54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172,
6660 54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204,
6661 {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243,
6662 {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280,
6663 54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392},
6664 54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420,
6665 54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520,
6666 54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551,
6667 {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609,
6668 {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637,
6669 {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672,
6670 54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747,
6671 54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777,
6672 {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812,
6673 54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853,
6674 {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876,
6675 54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924},
6676 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971,
6677 {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012,
6678 55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057,
6679 {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085,
6680 {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120},
6681 55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148,
6682 55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184,
6683 {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487,
6684 21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468,
6685 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747],
6686 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580,
6687 29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904,
6688 23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567,
6689 30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393,
6690 35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088,
6691 34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954,
6692 26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039,
6693 {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083,
6694 22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074,
6695 30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611,
6696 37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887,
6697 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445,
6698 33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520,
6699 21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067,
6700 36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062],
6701 24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625,
6702 26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163,
6703 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160,
6704 35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937,
6705 [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080,
6706 32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435,
6707 20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465,
6708 24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039,
6709 28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478,
6710 32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857,
6711 38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395,
6712 23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926,
6713 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476,
6714 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911,
6715 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295,
6716 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996,
6717 35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741,
6718 26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825,
6719 26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592],
6720 20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329,
6721 25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521,
6722 [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328,
6723 36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448,
6724 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733,
6725 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809,
6726 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009,
6727 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871,
6728 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676,
6729 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350,
6730 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171,
6731 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312,
6732 [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943,
6733 24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628,
6734 27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127,
6735 32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544,
6736 36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407,
6737 [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628,
6738 21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391,
6739 23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240,
6740 21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152,
6741 36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512,
6742 36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789,
6743 31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343,
6744 30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840,
6745 26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135,
6746 29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935,
6747 25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167,
6748 37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834,
6749 30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522,
6750 22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190,
6751 24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231,
6752 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859,
6753 30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000,
6754 32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215,
6755 37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342,
6756 21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062,
6757 [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423,
6758 25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064,
6759 20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873],
6760 [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684,
6761 25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361,
6762 [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126,
6763 [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612,
6764 [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998],
6765 [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086,
6766 27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170,
6767 37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812,
6768 26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203,
6769 35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530,
6770 22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680,
6771 20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140,
6772 25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503,
6773 24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648,
6774 23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691,
6775 26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153,
6776 31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117,
6777 37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167,
6778 31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788,
6779 28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205,
6780 21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643,
6781 31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168,
6782 31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929,
6783 36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588,
6784 37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758],
6785 [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762],
6786 [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097,
6787 [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771],
6788 [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774],
6789 [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900,
6790 27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261,
6791 [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784],
6792 [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690,
6793 [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790],
6794 [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864],
6795 [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867],
6796 [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791,
6797 [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150,
6798 [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851,
6799 [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881],
6800 [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019,
6801 [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891,
6802 [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894],
6803 [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898],
6804 [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916,
6805 [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909],
6806 28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278,
6807 [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917],
6808 31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921],
6809 [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925],
6810 28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791],
6811 25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794],
6812 [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798],
6813 [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802],
6814 [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805],
6815 [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595,
6816 [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903,
6817 [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814],
6818 [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817],
6819 [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934],
6820 [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938],
6821 [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105,
6822 [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267,
6823 [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825],
6824 [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946],
6825 [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244,
6826 [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954],
6827 [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958],
6828 32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962],
6829 [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828],
6830 [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832],
6831 [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774,
6832 [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432,
6833 [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673,
6834 [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328,
6835 [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982],
6836 [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986],
6837 [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990],
6838 38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705,
6839 29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518,
6840 24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398,
6841 24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067,
6842 34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178,
6843 38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579,
6844 33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757,
6845 27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476,
6846 39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906,
6847 35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236,
6848 [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269,
6849 26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528,
6850 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720},
6851 26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520,
6852 [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408],
6853 27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818,
6854 26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218,
6855 29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287,
6856 25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045,
6857 32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664,
6858 20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862,
6859 34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614,
6860 23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473,
6861 [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758,
6862 24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225,
6863 38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420,
6864 27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180,
6865 36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856,
6866 26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928,
6867 [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187,
6868 25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747,
6869 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918,
6870 [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938,
6871 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848,
6872 20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403,
6873 32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271,
6874 20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146,
6875 29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624,
6876 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539,
6877 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887,
6878 34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029,
6879 30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170,
6880 26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432,
6881 20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668,
6882 29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264,
6883 [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068,
6884 35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472,
6885 22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299,
6886 34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613,
6887 21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500,
6888 24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807,
6889 [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000,
6890 36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385,
6891 40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575,
6892 24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452,
6893 36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844,
6894 32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138,
6895 24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604],
6896 {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875,
6897 32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692,
6898 36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338,
6899 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007,
6900 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181,
6901 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235,
6902 [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473,
6903 24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863,
6904 28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023,
6905 32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613,
6906 36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632,
6907 21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948,
6908 37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441,
6909 26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978,
6910 20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120,
6911 24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248,
6912 [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937,
6913 36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850],
6914 [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996,
6915 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360,
6916 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298,
6917 34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736],
6918 [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101,
6919 28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808,
6920 21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764,
6921 29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337,
6922 34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352,
6923 23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373,
6924 [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814,
6925 36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615,
6926 24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596,
6927 32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237,
6928 31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569,
6929 24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703,
6930 28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032,
6931 32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902,
6932 39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895,
6933 23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435,
6934 24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862,
6935 37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234,
6936 23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628,
6937 25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159,
6938 29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929,
6939 32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966,
6940 35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539,
6941 {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460,
6942 22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901,
6943 33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529,
6944 27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600,
6945 34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899,
6946 36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629,
6947 [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319,
6948 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204,
6949 [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178,
6950 26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997,
6951 35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335,
6952 24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996],
6953 36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480,
6954 24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251],
6955 33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805,
6956 22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145,
6957 28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617,
6958 [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105,
6959 [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187,
6960 40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569,
6961 [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823,
6962 23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839,
6963 26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284,
6964 33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171,
6965 27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079,
6966 30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099,
6967 38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825,
6968 25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903,
6969 33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965,
6970 26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344,
6971 [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044,
6972 28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014,
6973 25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578,
6974 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989,
6975 20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349,
6976 33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123,
6977 32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310,
6978 25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895,
6979 28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893,
6980 36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814,
6981 28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121,
6982 [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704,
6983 27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787,
6984 29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034,
6985 20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454,
6986 34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116,
6987 20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887,
6988 23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595,
6989 28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779,
6990 29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314,
6991 20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252,
6992 28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113,
6993 23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233,
6994 32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352],
6995 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806,
6996 23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002,
6997 23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796,
6998 31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953,
6999 36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653,
7000 20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263,
7001 28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362,
7002 37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491,
7003 23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760,
7004 30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398,
7005 36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423,
7006 26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550,
7007 28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074,
7008 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435,
7009 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304,
7010 29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219,
7011 [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996,
7012 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806,
7013 33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759,
7014 20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188},
7015 24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586,
7016 {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788,
7017 30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400,
7018 36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603,
7019 [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103,
7020 37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681,
7021 24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093,
7022 38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033,
7023 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885,
7024 27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516,
7025 35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347,
7026 24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780],
7027 [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180,
7028 28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995,
7029 21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106,
7030 33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777,
7031 [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001,
7032 24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381,
7033 33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383,
7034 23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133,
7035 30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039,
7036 38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189,
7037 33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697,
7038 26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580,
7039 22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454,
7040 27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144,
7041 33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292,
7042 [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685,
7043 26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782,
7044 29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213,
7045 25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672,
7046 32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048,
7047 38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380,
7048 30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042,
7049 [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346,
7050 20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637,
7051 24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728,
7052 [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399,
7053 35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019,
7054 39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118,
7055 21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509,
7056 25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450,
7057 24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230,
7058 26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254,
7059 28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357,
7060 31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478,
7061 37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137,
7062 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532,
7063 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988,
7064 [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514,
7065 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437,
7066 28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199,
7067 31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412,
7068 35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165],
7069 26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469,
7070 20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066,
7071 32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038,
7072 24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610,
7073 21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666,
7074 27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044,
7075 32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659,
7076 36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737,
7077 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940,
7078 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210,
7079 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366,
7080 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482,
7081 21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088,
7082 26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757,
7083 31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584,
7084 35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767,
7085 21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941,
7086 28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206,
7087 32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587,
7088 [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489,
7089 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541,
7090 36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878,
7091 38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919,
7092 24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974,
7093 25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158,
7094 29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013,
7095 39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851],
7096 22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513,
7097 21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274,
7098 27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980,
7099 20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081,
7100 37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389,
7101 20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364,
7102 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029,
7103 25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368,
7104 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764,
7105 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979,
7106 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266,
7107 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729,
7108 35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558,
7109 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786,
7110 26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245,
7111 32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259,
7112 37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534,
7113 26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880,
7114 34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894,
7115 27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861,
7116 37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985,
7117 30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600,
7118 36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798,
7119 34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068,
7120 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519,
7121 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988,
7122 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305,
7123 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347,
7124 [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405,
7125 23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756,
7126 31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171,
7127 25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828,
7128 22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351,
7129 37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187,
7130 35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067,
7131 23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526,
7132 27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580,
7133 25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171,
7134 31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600,
7135 22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110,
7136 24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772,
7137 32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009,
7138 36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726,
7139 25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429,
7140 28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255],
7141 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544,
7142 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109,
7143 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067,
7144 24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071,
7145 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133,
7146 [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451,
7147 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697,
7148 31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130,
7149 [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848],
7150 29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979,
7151 20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032,
7152 36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680,
7153 24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289},
7154 38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323,
7155 28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532,
7156 38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239,
7157 26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565,
7158 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809,
7159 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184,
7160 26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141,
7161 38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010,
7162 27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203,
7163 [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843,
7164 [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335,
7165 34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880],
7166 [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433,
7167 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418,
7168 27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610,
7169 34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935,
7170 26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778,
7171 22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009,
7172 28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786,
7173 29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382,
7174 34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239,
7175 23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700,
7176 24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270,
7177 21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457,
7178 33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339,
7179 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707,
7180 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748],
7181 29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908,
7182 {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343,
7183 31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238,
7184 24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590,
7185 28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554,
7186 23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783,
7187 28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402,
7188 21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869,
7189 21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347,
7190 [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585,
7191 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658,
7192 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958,
7193 33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007,
7194 35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288,
7195 20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984,
7196 25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690,
7197 35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314},
7198 {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759,
7199 {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61},
7200 {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0,
7201 8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771,
7202 8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045,
7203 0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711,
7204 {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102},
7205 {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787,
7206 8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649,
7207 0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716,
7208 {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3},
7209 9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327},
7210 {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0,
7211 8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144},
7212 {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673,
7213 8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944,
7214 {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540,
7215 0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056,
7216 {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078,
7217 {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097},
7218 44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121},
7219 {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153,
7220 {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173},
7221 {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203,
7222 {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222},
7223 {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237},
7224 44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267,
7225 {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286},
7226 {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306},
7227 {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330},
7228 {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349},
7229 44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373},
7230 {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398},
7231 {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419},
7232 {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446},
7233 {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485},
7234 {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509},
7235 {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541},
7236 {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565},
7237 {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612,
7238 {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631},
7239 44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650},
7240 {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670},
7241 {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737},
7242 {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762},
7243 {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782},
7244 {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809},
7245 {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851,
7246 {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874},
7247 {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922},
7248 {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946},
7249 {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989},
7250 {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013},
7251 {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045},
7252 {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069},
7253 {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097},
7254 {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144,
7255 {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185},
7256 {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213},
7257 {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241},
7258 {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266},
7259 {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286},
7260 45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342},
7261 {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366,
7262 {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385},
7263 {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405},
7264 {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441,
7265 {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461},
7266 {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517},
7267 {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536},
7268 {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564,
7269 {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581},
7270 45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621},
7271 {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665},
7272 {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702},
7273 {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723},
7274 45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745},
7275 {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777,
7276 {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799,
7277 {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820},
7278 {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842,
7279 {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917,
7280 {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935,
7281 {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954,
7282 {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973},
7283 {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022},
7284 {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042,
7285 46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053},
7286 {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105},
7287 {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124},
7288 {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169},
7289 46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209},
7290 {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249},
7291 {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273},
7292 {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294},
7293 {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320,
7294 {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361},
7295 {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386},
7296 {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406},
7297 {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430,
7298 {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505,
7299 {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526},
7300 {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546},
7301 {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613},
7302 {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645},
7303 {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750},
7304 {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770},
7305 {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841},
7306 {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893},
7307 {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917},
7308 {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945},
7309 {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966},
7310 {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990,
7311 {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009},
7312 47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048,
7313 {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093},
7314 47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117},
7315 {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142},
7316 {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162},
7317 {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188},
7318 {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216,
7319 {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246},
7320 {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289},
7321 47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313},
7322 {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338},
7323 {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358},
7324 {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422},
7325 {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440,
7326 {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457},
7327 47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481},
7328 {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503},
7329 {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552,
7330 {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580,
7331 {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593},
7332 {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618},
7333 {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677},
7334 47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702},
7335 {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722},
7336 {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750,
7337 {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793,
7338 {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813},
7339 {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873},
7340 {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897},
7341 {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927,
7342 {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950,
7343 {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970,
7344 {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013},
7345 {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045},
7346 {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069},
7347 {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122},
7348 {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144,
7349 {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168,
7350 {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181},
7351 {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202},
7352 {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262},
7353 {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283},
7354 {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306,
7355 {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325},
7356 48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345},
7357 {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392,
7358 {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421},
7359 {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461},
7360 {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489},
7361 {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532,
7362 {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549},
7363 {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601},
7364 {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629},
7365 {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646},
7366 {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670,
7367 {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717,
7368 {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738},
7369 {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758},
7370 {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782,
7371 {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850},
7372 {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870},
7373 {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922,
7374 {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969},
7375 {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073},
7376 {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109},
7377 {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213},
7378 {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249},
7379 {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305},
7380 49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335},
7381 49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354},
7382 {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374},
7383 {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400,
7384 {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417},
7385 {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445,
7386 {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466},
7387 {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486},
7388 {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510,
7389 {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529},
7390 {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566,
7391 49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578},
7392 {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605},
7393 {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625},
7394 {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650,
7395 {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669},
7396 49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693},
7397 {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717},
7398 {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753},
7399 {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777},
7400 {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802},
7401 {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822},
7402 {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848,
7403 {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893},
7404 49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917},
7405 {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942},
7406 {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962},
7407 {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033,
7408 {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053},
7409 {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138},
7410 {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154},
7411 {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185},
7412 {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225},
7413 {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278},
7414 {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298},
7415 {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361},
7416 {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421},
7417 50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445},
7418 {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474},
7419 {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494},
7420 {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527,
7421 {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546,
7422 {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565},
7423 {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585},
7424 {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614},
7425 50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642},
7426 {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671,
7427 {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690},
7428 {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714,
7429 {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735,
7430 {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754},
7431 {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774},
7432 {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800,
7433 {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817},
7434 50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841},
7435 {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866},
7436 {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886},
7437 {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910},
7438 {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929},
7439 {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953},
7440 {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978},
7441 {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000},
7442 {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024,
7443 {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049},
7444 {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071},
7445 51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097,
7446 {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118},
7447 {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138},
7448 {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161},
7449 {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181},
7450 {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220,
7451 {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237},
7452 51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261},
7453 {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285},
7454 {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332,
7455 {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360,
7456 {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397},
7457 {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418},
7458 {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454},
7459 {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474},
7460 {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538},
7461 {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556},
7462 {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581},
7463 {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612,
7464 {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657,
7465 {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678},
7466 51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698},
7467 {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722,
7468 {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754},
7469 {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806,
7470 {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845},
7471 {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909},
7472 51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937},
7473 {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985},
7474 {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034},
7475 {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058},
7476 {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125},
7477 {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200,
7478 {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245},
7479 {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271,
7480 {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294},
7481 {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314},
7482 {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337},
7483 {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385},
7484 52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409},
7485 {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433},
7486 {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465},
7487 {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497},
7488 52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521},
7489 {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577},
7490 {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601},
7491 {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637},
7492 52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677},
7493 {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717},
7494 {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741},
7495 {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762},
7496 {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788,
7497 {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834},
7498 52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857},
7499 {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882},
7500 {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902},
7501 {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969},
7502 {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994},
7503 {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014},
7504 {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038,
7505 {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081},
7506 {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106},
7507 {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126},
7508 {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169},
7509 {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225},
7510 53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249},
7511 {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294},
7512 {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320,
7513 {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337},
7514 {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365},
7515 {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417},
7516 {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442},
7517 {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462},
7518 {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486,
7519 {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554},
7520 {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574},
7521 {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600,
7522 {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629},
7523 {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669},
7524 {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693},
7525 {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753},
7526 53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806},
7527 {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826},
7528 {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890},
7529 {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910},
7530 {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933},
7531 {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953,
7532 {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973},
7533 {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002},
7534 {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031,
7535 {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050},
7536 {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065},
7537 54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142},
7538 {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162},
7539 {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188,
7540 {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205},
7541 {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233},
7542 54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257},
7543 {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281},
7544 {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365},
7545 {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384},
7546 {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412,
7547 {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477},
7548 {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496},
7549 {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521},
7550 54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537},
7551 {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590},
7552 {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610},
7553 {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630},
7554 54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649},
7555 {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673},
7556 {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737,
7557 {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758},
7558 {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778},
7559 {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802,
7560 {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821},
7561 {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849},
7562 {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866},
7563 {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888,
7564 {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916,
7565 {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933},
7566 54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957},
7567 {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982},
7568 {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997},
7569 55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013},
7570 {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038},
7571 {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066},
7572 {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086},
7573 {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109},
7574 55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138,
7575 55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149},
7576 {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170},
7577 {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196,
7579 'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294,
7580 8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106,
7581 183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288},
7582 {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308},
7583 {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298},
7584 {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300},
7585 {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113},
7586 {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283,
7587 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733,
7588 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0,
7589 {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119},
7590 65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806},
7591 8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869,
7592 8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793,
7593 9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0,
7594 0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451,
7595 8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217,
7596 {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835],
7597 [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044],
7598 [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609,
7599 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492,
7600 9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698},
7601 9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544},
7602 {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313},
7603 {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
7604 {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153],
7605 [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158],
7606 [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163],
7607 [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168],
7608 [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173],
7609 [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178],
7610 [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008],
7611 [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185],
7612 [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188],
7613 [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191],
7614 [12057, 21353, 63192], [12059, 21430, 63193],
7615 [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195],
7616 [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198],
7617 [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201],
7618 [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204],
7619 [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216},
7620 9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102,
7621 [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837],
7622 [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147],
7623 [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977,
7624 19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062,
7625 20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475],
7626 [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823],
7627 [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544],
7628 [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029,
7629 [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062],
7630 [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165,
7631 19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113,
7632 20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173,
7633 {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844,
7634 20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305,
7635 21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825,
7636 22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187,
7637 24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142],
7638 [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007],
7639 [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352],
7640 [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490],
7641 [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611],
7642 [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226],
7643 [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273],
7644 [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992,
7645 20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180},
7646 {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908,
7647 {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271,
7648 21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487,
7649 21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483,
7650 21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234,
7651 22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039,
7652 24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098,
7653 {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412,
7654 {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712,
7655 27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916],
7656 [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993,
7657 [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333],
7658 [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683],
7659 [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166],
7660 [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073,
7661 20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237,
7662 {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225,
7663 20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015,
7664 {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280,
7665 {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508,
7666 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237,
7667 22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809},
7668 {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913,
7669 {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673,
7670 24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102,
7671 {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088,
7672 {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421,
7673 27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728,
7674 27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334,
7675 [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566],
7676 [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780],
7677 [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905],
7678 {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267],
7679 [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311],
7680 [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880],
7681 [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303,
7682 20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285,
7683 20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271,
7684 20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853,
7685 {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163,
7686 {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566,
7687 21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545,
7688 21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568,
7689 21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353,
7690 22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846,
7691 22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931,
7692 22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596,
7693 {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043,
7694 24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439,
7695 24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106,
7696 25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212,
7697 25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233,
7698 25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460,
7699 26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599,
7700 27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770,
7701 27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774,
7702 27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796},
7703 28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995,
7704 {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995,
7705 32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426,
7706 33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328],
7707 [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997],
7708 [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523],
7709 [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804,
7710 24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193],
7711 [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006,
7712 20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365,
7713 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360,
7714 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821,
7715 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050,
7716 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329,
7717 21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624,
7718 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617,
7719 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403,
7720 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857,
7721 {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993,
7722 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981,
7723 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578,
7724 23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731,
7725 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220,
7726 {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447,
7727 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629,
7728 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109,
7729 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273,
7730 25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276,
7731 [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304,
7732 {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106,
7733 26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122,
7734 26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487,
7735 26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485,
7736 26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667,
7737 27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837},
7738 27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822,
7739 27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887,
7740 27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228},
7741 29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609,
7742 29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402,
7743 30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354,
7744 31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933,
7745 32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278,
7746 33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452,
7747 33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021,
7748 34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319,
7749 [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464,
7750 38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738,
7751 [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448,
7752 20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398,
7753 20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881,
7754 20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193,
7755 21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672,
7756 21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697,
7757 21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271,
7758 22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865,
7759 22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013,
7760 23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458,
7761 23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093,
7762 24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456,
7763 24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613,
7764 24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684,
7765 24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345,
7766 25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361,
7767 25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151,
7768 26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580,
7769 26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548,
7770 26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589,
7771 26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915,
7772 27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963,
7773 {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950,
7774 27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856,
7775 28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623,
7776 29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028,
7777 30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328,
7778 {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473,
7779 30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046,
7780 31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359,
7781 31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004,
7782 32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997,
7783 32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989,
7784 33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509,
7785 33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502,
7786 33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923,
7787 35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276,
7788 36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836,
7789 36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480,
7790 {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859],
7791 [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080],
7792 [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056,
7793 20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375],
7794 20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500,
7795 20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522,
7796 20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934,
7797 20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407,
7798 21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766,
7799 21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799,
7800 21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537,
7801 22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059,
7802 23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472,
7803 23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637,
7804 23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796,
7805 24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464,
7806 24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735,
7807 24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343,
7808 25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424,
7809 25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009,
7810 26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177,
7811 26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681,
7812 26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704,
7813 26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529,
7814 27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040,
7815 28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994,
7816 28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888,
7817 28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432,
7818 29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045,
7819 30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140,
7820 30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505,
7821 {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775,
7822 30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062,
7823 31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206,
7824 31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023,
7825 32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013,
7826 32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792,
7827 32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005,
7828 33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261,
7829 33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618,
7830 33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593,
7831 33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451,
7832 34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941,
7833 34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350,
7834 35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524,
7835 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852,
7836 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197,
7837 37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497,
7838 38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340],
7839 [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730],
7840 [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556,
7841 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559,
7842 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209,
7843 21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364,
7844 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846,
7845 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811,
7846 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496,
7847 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105,
7848 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408,
7849 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648,
7850 {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849,
7851 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119,
7852 {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425,
7853 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739,
7854 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757,
7855 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775,
7856 {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463,
7857 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512,
7858 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449,
7859 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944,
7860 25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205,
7861 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799,
7862 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755,
7863 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754,
7864 27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082,
7865 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113,
7866 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085,
7867 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074,
7868 28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309,
7869 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699,
7870 29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986,
7871 {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154,
7872 30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520,
7873 30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381,
7874 31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895,
7875 31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051,
7876 32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718,
7877 32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072,
7878 33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656,
7879 33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655,
7880 {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500,
7881 34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987,
7882 34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365,
7883 35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011,
7884 36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889,
7885 36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896,
7886 36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207,
7887 37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517,
7888 38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633,
7889 31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165],
7890 [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642,
7891 20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977,
7892 21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883,
7893 21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908,
7894 21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947,
7895 21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580,
7896 22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880,
7897 [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506,
7898 23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879,
7899 24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260,
7900 24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800,
7901 24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846,
7902 24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536,
7903 25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558,
7904 {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950,
7905 25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786],
7906 26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397,
7907 26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855,
7908 26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825,
7909 26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631,
7910 {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263,
7911 28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270,
7912 28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901],
7913 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255,
7914 {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260,
7915 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730,
7916 29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736,
7917 {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174,
7918 30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813,
7919 30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382,
7920 31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563,
7921 31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043,
7922 32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724},
7923 32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094,
7924 33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805,
7925 33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802,
7926 33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756,
7927 33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532,
7928 34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424,
7929 35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386,
7930 35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027,
7931 36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302,
7932 36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604,
7933 36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129,
7934 37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389,
7935 37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286,
7936 38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593,
7937 38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917},
7938 38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341,
7939 [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661,
7940 {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119,
7941 21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992,
7942 21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978,
7943 21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609,
7944 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610,
7945 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234,
7946 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492,
7947 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840,
7948 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887,
7949 {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615,
7950 25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032,
7951 26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028,
7952 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984,
7953 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506,
7954 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304,
7955 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310,
7956 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028,
7957 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032,
7958 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781,
7959 29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072,
7960 30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195,
7961 {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572,
7962 30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860,
7963 30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165,
7964 31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680,
7965 31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129,
7966 32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854,
7967 32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131,
7968 {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909,
7969 33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897,
7970 33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560,
7971 34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033,
7972 35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435,
7973 {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441,
7974 35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938,
7975 35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037,
7976 36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530,
7977 36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930,
7978 36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926,
7979 36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432,
7980 37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453,
7981 37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603,
7982 {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774,
7983 {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156,
7984 {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718],
7985 [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903],
7986 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123,
7987 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022,
7988 22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296,
7989 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781,
7990 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254,
7991 23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522,
7992 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151,
7993 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907,
7994 24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688,
7995 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723,
7996 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029,
7997 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088,
7998 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467,
7999 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418,
8000 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459,
8001 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081,
8002 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796,
8003 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217,
8004 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887,
8005 30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401,
8006 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631,
8007 [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156,
8008 {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191,
8009 32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736},
8010 32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151,
8011 33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990,
8012 33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936,
8013 33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584,
8014 34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048,
8015 35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492,
8016 35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980,
8017 36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629,
8018 36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957,
8019 36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548,
8020 37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521,
8021 38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604,
8022 38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171,
8023 39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745},
8024 40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736,
8025 20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956,
8026 {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066,
8027 22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063},
8028 22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305,
8029 23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531,
8030 {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287,
8031 24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942,
8032 24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003,
8033 24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721,
8034 25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769,
8035 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973,
8036 {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137,
8037 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117,
8038 27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497,
8039 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528,
8040 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105,
8041 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824,
8042 30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394,
8043 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922,
8044 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291,
8045 31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648,
8046 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232,
8047 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631,
8048 32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109,
8049 34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028,
8050 34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664,
8051 34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090},
8052 35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506,
8053 35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916,
8054 35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076},
8055 {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368,
8056 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635,
8057 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968,
8058 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251,
8059 37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575,
8060 37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797,
8061 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192,
8062 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607,
8063 {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195,
8064 40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752,
8065 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137,
8066 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114,
8067 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536,
8068 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034,
8069 25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799,
8070 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297,
8071 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193,
8072 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511,
8073 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608,
8074 28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138,
8075 29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852,
8076 29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266,
8077 30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951,
8078 31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689,
8079 31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264,
8080 32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690,
8081 {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288,
8082 {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121,
8083 34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114,
8084 35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563,
8085 35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565,
8086 35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404,
8087 36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981,
8088 36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624,
8089 37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665,
8090 37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673,
8091 38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960,
8092 38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195,
8093 39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720,
8094 39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660,
8095 [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158,
8096 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344,
8097 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171,
8098 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806,
8099 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837,
8100 {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355,
8101 27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632,
8102 28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641,
8103 28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157,
8104 29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872,
8105 29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636,
8106 30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146,
8107 31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964,
8108 31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306,
8109 32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309,
8110 32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883,
8111 33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256,
8112 33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203,
8113 34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758,
8114 34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133,
8115 35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600,
8116 35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425,
8117 36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989,
8118 36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762,
8119 37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744,
8120 37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684,
8121 38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851,
8122 39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667,
8123 40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059,
8124 25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332,
8125 26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487,
8126 27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687,
8127 {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294,
8128 30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150,
8129 {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774,
8130 31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345,
8131 32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217,
8132 34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784,
8133 35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441,
8134 36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995,
8135 37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806,
8136 37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626,
8137 38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989,
8138 38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333,
8139 39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933,
8140 39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181,
8141 22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078,
8142 25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699,
8143 28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346,
8144 29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663,
8145 31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808,
8146 32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696,
8147 33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821,
8148 34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672,
8149 35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466,
8150 36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002},
8151 37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846,
8152 37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698,
8153 38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241,
8154 39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306,
8155 40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196,
8156 22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880,
8157 25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563,
8158 29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820,
8159 31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768,
8160 33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314,
8161 {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679,
8162 35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912,
8163 37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472,
8164 39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803,
8165 40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084,
8166 25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748,
8167 29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700,
8168 34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261,
8169 35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306,
8170 37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712},
8171 38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486,
8172 39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605,
8173 40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217,
8174 23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760,
8175 29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893,
8176 33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705,
8177 37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019,
8178 39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403,
8179 40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899,
8180 25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406,
8181 32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984,
8182 37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635},
8183 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900,
8184 28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914,
8185 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724,
8186 38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441},
8187 {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854,
8188 34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715,
8189 40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740,
8190 36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924,
8191 38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060,
8192 [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109,
8193 [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014,
8194 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787,
8195 22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668],
8196 [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186,
8197 21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428,
8198 23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168,
8199 27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160],
8200 32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215,
8201 20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913,
8202 21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239,
8203 22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903,
8204 22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031,
8205 [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180,
8206 25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911,
8207 26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419,
8208 27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723},
8209 28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593],
8210 [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198],
8211 37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435,
8212 20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319,
8213 20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022,
8214 21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552,
8215 21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583,
8216 21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348,
8217 22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926,
8218 22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693,
8219 23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032,
8220 24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440,
8221 24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548,
8222 24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228,
8223 {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224,
8224 25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437,
8225 26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600,
8226 {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759,
8227 27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749,
8228 27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377,
8229 29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009,
8230 {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924,
8231 33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411},
8232 [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024,
8233 38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352,
8234 20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378,
8235 20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373,
8236 20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041,
8237 21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649,
8238 21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645,
8239 21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383,
8240 22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395,
8241 {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991,
8242 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973,
8243 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623,
8244 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725,
8245 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084,
8246 24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549,
8247 24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602,
8248 24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585,
8249 24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290,
8250 25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043,
8251 26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117,
8252 26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486,
8253 26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513,
8254 26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518,
8255 27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821,
8256 27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858,
8257 27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847,
8258 27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806,
8259 28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400,
8260 29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613,
8261 29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014,
8262 30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713,
8263 30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861,
8264 31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440,
8265 33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438,
8266 33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442,
8267 34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822,
8268 36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460,
8269 38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436,
8270 20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416,
8271 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398,
8272 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687,
8273 21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694,
8274 21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429,
8275 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797,
8276 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036,
8277 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038,
8278 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771,
8279 23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752,
8280 23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240,
8281 24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631,
8282 24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652,
8283 24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154},
8284 25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356,
8285 25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921,
8286 25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146,
8287 26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561,
8288 26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565,
8289 26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595,
8290 26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572,
8291 26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432,
8292 27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956,
8293 27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929,
8294 27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907,
8295 27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855,
8296 28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249,
8297 {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419,
8298 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625,
8299 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624,
8300 29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404,
8301 30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695},
8302 30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723,
8303 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190,
8304 31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864},
8305 {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775,
8306 {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962,
8307 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983,
8308 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512,
8309 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525,
8310 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517,
8311 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283,
8312 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055,
8313 37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484,
8314 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514,
8315 20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503,
8316 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883,
8317 20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074,
8318 {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783,
8319 21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777,
8320 21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771,
8321 {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460,
8322 22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065,
8323 23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404,
8324 23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793,
8325 23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371,
8326 24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722,
8327 24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113,
8328 25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572,
8329 25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433,
8330 25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930,
8331 25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193,
8332 {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699,
8333 26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692,
8334 26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661,
8335 26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622,
8336 27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022,
8337 27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143,
8338 28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999,
8339 28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035,
8340 28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569,
8341 28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890,
8342 28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438,
8343 29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671,
8344 29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655},
8345 29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128,
8346 30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493,
8347 30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498,
8348 30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753,
8349 30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058,
8350 31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197,
8351 31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492,
8352 31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889,
8353 31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024,
8354 32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608,
8355 32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825,
8356 33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317,
8357 33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574,
8358 33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558,
8359 33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566,
8360 33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445,
8361 34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457,
8362 34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883},
8363 34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942,
8364 34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216,
8365 36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859,
8366 36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093,
8367 37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346,
8368 37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095,
8369 20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552,
8370 20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587,
8371 {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099,
8372 21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820,
8373 21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842,
8374 21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824,
8375 21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528,
8376 22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499,
8377 22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540,
8378 22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125,
8379 [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148,
8380 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182,
8381 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106,
8382 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834,
8383 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843,
8384 23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374,
8385 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762,
8386 {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759,
8387 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469,
8388 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488,
8389 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503,
8390 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209,
8391 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780,
8392 {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741,
8393 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752,
8394 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747,
8395 26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535,
8396 {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076,
8397 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118,
8398 28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144,
8399 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119,
8400 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912,
8401 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918,
8402 28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447,
8403 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688,
8404 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708,
8405 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155},
8406 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513},
8407 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797,
8408 30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075,
8409 31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376,
8410 31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530,
8411 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892,
8412 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044,
8413 32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661,
8414 {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711,
8415 32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061,
8416 33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053,
8417 33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699,
8418 33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689,
8419 33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675,
8420 33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710,
8421 33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480,
8422 34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499,
8423 {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961,
8424 34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956,
8425 34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358,
8426 35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284,
8427 36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567,
8428 {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098,
8429 37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206,
8430 37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348,
8431 37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524,
8432 38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635,
8433 20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584,
8434 20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415,
8435 21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903,
8436 21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909,
8437 21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568,
8438 22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585,
8439 22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202,
8440 23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172,
8441 23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183,
8442 23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564,
8443 23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886,
8444 23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881,
8445 23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673],
8446 24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852,
8447 24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769,
8448 24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521,
8449 25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568,
8450 25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540,
8451 25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561,
8452 25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013},
8453 26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218,
8454 26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865,
8455 26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849,
8456 26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872,
8457 26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824,
8458 {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917,
8459 26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581,
8460 27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233,
8461 28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275,
8462 28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264,
8463 28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208,
8464 28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262,
8465 {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963,
8466 28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274,
8467 {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489,
8468 29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740,
8469 29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725,
8470 29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177,
8471 30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534},
8472 30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816,
8473 {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824,
8474 30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244,
8475 31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566,
8476 31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099,
8477 32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084,
8478 32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674,
8479 {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091,
8480 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262,
8481 {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595,
8482 [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788,
8483 33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765,
8484 33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801,
8485 [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735,
8486 33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751,
8487 33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522,
8488 34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888,
8489 34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004,
8490 34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293,
8491 {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415},
8492 {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969,
8493 35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312,
8494 36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311,
8495 36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597,
8496 {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916,
8497 36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115,
8498 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216,
8499 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394,
8500 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399,
8501 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536},
8502 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766,
8503 38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669,
8504 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673,
8505 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112,
8506 {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981,
8507 [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973,
8508 21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632,
8509 22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629,
8510 22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224,
8511 23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242,
8512 23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603,
8513 23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906,
8514 24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267,
8515 24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886,
8516 24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123,
8517 25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636,
8518 25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612,
8519 25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637,
8520 25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067,
8521 26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400,
8522 26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937,
8523 26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941,
8524 26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968,
8525 26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930,
8526 26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457,
8527 27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360,
8528 28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370,
8529 28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338,
8530 28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321,
8531 28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010,
8532 29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025,
8533 28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005,
8534 29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499,
8535 29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783,
8536 29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951,
8537 29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199,
8538 30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197,
8539 30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554,
8540 30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863,
8541 30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870,
8542 30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255,
8543 31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590,
8544 31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585,
8545 31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141,
8546 32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132,
8547 32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679,
8548 {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122,
8549 33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353,
8550 33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935,
8551 33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882,
8552 33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914,
8553 33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837,
8554 33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851,
8555 33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902,
8556 33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552,
8557 34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021},
8558 35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300,
8559 35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391,
8560 35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915,
8561 35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044,
8562 {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243},
8563 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323,
8564 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613,
8565 {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925,
8566 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230},
8567 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422,
8568 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473,
8569 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462,
8570 37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606,
8571 38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927,
8572 {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597,
8573 39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692,
8574 20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720,
8575 20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420,
8576 22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018,
8577 22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662,
8578 22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658,
8579 22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253,
8580 23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262,
8581 23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936,
8582 23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932,
8583 23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270,
8584 24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876,
8585 24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960,
8586 24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129,
8587 25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714},
8588 25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683,
8589 25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971,
8590 26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081,
8591 27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047,
8592 27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065,
8593 27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031,
8594 27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550},
8595 {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471,
8596 28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434,
8597 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476,
8598 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444,
8599 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065,
8600 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267,
8601 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809,
8602 29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230,
8603 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597,
8604 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893,
8605 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128,
8606 {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120,
8607 31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470,
8608 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630,
8609 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930,
8610 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206,
8611 32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166,
8612 32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804,
8613 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301,
8614 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963,
8615 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959,
8616 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327],
8617 34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968,
8618 33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593,
8619 34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602,
8620 34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616,
8621 34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070,
8622 35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231,
8623 35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478,
8624 35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351,
8625 36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356,
8626 {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149,
8627 37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540,
8628 37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547,
8629 37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501,
8630 37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545,
8631 37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782,
8632 38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934,
8633 {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355,
8634 39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742},
8635 {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739,
8636 20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733,
8637 20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081,
8638 22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078,
8639 22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703,
8640 22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299,
8641 23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959,
8642 23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966,
8643 24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498,
8644 24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007,
8645 25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710,
8646 25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740,
8647 25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979,
8648 {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136,
8649 27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116,
8650 27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111,
8651 27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160,
8652 27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555,
8653 27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551,
8654 28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566,
8655 28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563,
8656 28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521,
8657 28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104,
8658 29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098,
8659 29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533,
8660 29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825,
8661 29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245,
8662 30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364},
8663 30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929,
8664 30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132,
8665 31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691,
8666 31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948,
8667 31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230,
8668 32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749,
8669 32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182,
8670 33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358,
8671 33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079,
8672 34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090,
8673 34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070,
8674 34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086,
8675 {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073,
8676 34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644,
8677 34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638,
8678 34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683,
8679 34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083,
8680 {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235,
8681 35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540},
8682 35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545,
8683 35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071,
8684 36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373,
8685 36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371,
8686 36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643,
8687 {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163,
8688 {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258,
8689 {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593,
8690 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615,
8691 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600,
8692 37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268,
8693 38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658,
8694 38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953,
8695 38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188,
8696 {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374,
8697 39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659,
8698 39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798,
8699 39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183,
8700 40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659,
8701 {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473,
8702 22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135,
8703 22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726,
8704 23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539],
8705 23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984,
8706 23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166,
8707 24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989,
8708 25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016,
8709 24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819,
8710 25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304,
8711 {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238,
8712 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217,
8713 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220,
8714 27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206,
8715 27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651,
8716 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612,
8717 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586,
8718 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592,
8719 29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130,
8720 29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146},
8721 {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546,
8722 29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255,
8723 30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438,
8724 30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615,
8725 30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957,
8726 {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409,
8727 31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737,
8728 31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959,
8729 {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275,
8730 32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276,
8731 32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809,
8732 32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204,
8733 33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125,
8734 34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129,
8735 34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151,
8736 34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404,
8737 34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712,
8738 34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716,
8739 34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106,
8740 35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570,
8741 {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553,
8742 35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081,
8743 36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416,
8744 36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329],
8745 36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998,
8746 37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263,
8747 37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659,
8748 37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626,
8749 37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685,
8750 37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332,
8751 38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612,
8752 38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959,
8753 38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396,
8754 39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670,
8755 39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803,
8756 39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215,
8757 40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223,
8758 40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722,
8759 40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163,
8760 {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742,
8761 22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334,
8762 23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027,
8763 25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833,
8764 25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277,
8765 27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283,
8766 27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269,
8767 27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643,
8768 28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153,
8769 29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847,
8770 29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968},
8771 29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635,
8772 30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978,
8773 {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144,
8774 31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749,
8775 31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746,
8776 31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760,
8777 31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329,
8778 32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581,
8779 32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226,
8780 33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191,
8781 34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167,
8782 34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189,
8783 34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200,
8784 34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745,
8785 34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756,
8786 34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123,
8787 35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246,
8788 {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599,
8789 35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919,
8790 35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429,
8791 36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274,
8792 37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807,
8793 37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712},
8794 37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711,
8795 37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343,
8796 38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687,
8797 38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868,
8798 38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211},
8799 39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329,
8800 39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421},
8801 39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848,
8802 39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855,
8803 40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261,
8804 {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585,
8805 40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788,
8806 [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173,
8807 22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048,
8808 25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855,
8809 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330},
8810 26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335,
8811 27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677,
8812 28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682,
8813 [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877,
8814 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297,
8815 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988,
8816 {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772,
8817 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781,
8818 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352,
8819 32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233},
8820 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229,
8821 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230,
8822 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779,
8823 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797,
8824 34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147,
8825 35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635,
8826 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622,
8827 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992,
8828 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438,
8829 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436,
8830 {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285,
8831 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769,
8832 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760,
8833 37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354},
8834 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690,
8835 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871,
8836 38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226,
8837 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430,
8838 39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755,
8839 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876,
8840 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278,
8841 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671,
8842 40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780,
8843 40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189,
8844 {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802,
8845 {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865,
8846 25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345,
8847 27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488,
8848 27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713,
8849 28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349},
8850 29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304,
8851 {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006,
8852 31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978,
8853 32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360,
8854 32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237,
8855 33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280,
8856 34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257,
8857 34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806},
8858 34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170,
8859 {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255,
8860 35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659,
8861 35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994,
8862 {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467,
8863 36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788,
8864 37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840,
8865 37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859,
8866 37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362},
8867 38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838,
8868 {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102,
8869 39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460,
8870 39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691,
8871 39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910,
8872 39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905,
8873 39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326,
8874 {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325,
8875 40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593,
8876 40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303,
8877 22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302},
8878 {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344,
8879 {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377,
8880 {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728,
8881 28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203},
8882 29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668,
8883 {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012,
8884 31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815,
8885 31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243,
8886 33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294,
8887 34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835,
8888 34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683,
8889 35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694},
8890 36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298},
8891 37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928,
8892 37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882,
8893 37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894,
8894 38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909},
8895 39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257,
8896 39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465,
8897 39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947,
8898 39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959,
8899 39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347,
8900 40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350,
8901 40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677,
8902 40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793,
8903 40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367,
8904 24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392,
8905 {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210,
8906 29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827,
8907 31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699,
8908 32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343,
8909 34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848,
8910 34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705,
8911 35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702,
8912 36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929,
8913 37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372,
8914 38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256,
8915 39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629,
8916 39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980,
8917 39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391,
8918 40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377},
8919 40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604,
8920 40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804,
8921 40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017,
8922 24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661,
8923 {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909,
8924 29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836,
8925 31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387,
8926 {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858,
8927 34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717,
8928 35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704,
8929 36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957,
8930 {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259,
8931 39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504,
8932 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004,
8933 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411,
8934 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409,
8935 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754,
8936 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373,
8937 24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347,
8938 {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571,
8939 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364,
8940 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187,
8941 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707,
8942 37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510,
8943 39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021,
8944 40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420,
8945 40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436,
8946 40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760,
8947 40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221,
8948 23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768,
8949 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649,
8950 33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732},
8951 {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992},
8952 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035,
8953 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454,
8954 40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774,
8955 {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418,
8956 28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410,
8957 32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193},
8958 35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997,
8959 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459,
8960 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824,
8961 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315,
8962 38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049,
8963 40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410,
8964 34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027},
8965 39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776,
8966 25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528,
8967 40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477,
8968 {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0,
8969 65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210],
8970 [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216],
8971 [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339],
8972 [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224],
8973 [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228],
8974 [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232],
8975 [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236],
8976 [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240],
8977 [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244],
8978 [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248],
8979 [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252],
8980 [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256],
8981 [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260],
8982 [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264],
8983 [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268],
8984 [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272],
8985 [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276],
8986 [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280],
8987 [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284],
8988 [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288],
8989 [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292],
8990 [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296],
8991 [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300],
8992 [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304],
8993 [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308],
8994 [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312],
8995 [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316],
8996 [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320],
8997 [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324],
8998 [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328],
8999 [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332],
9000 [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336],
9001 [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340],
9002 [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344],
9003 [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348],
9004 [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352],
9005 [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356],
9006 [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360],
9007 [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364],
9008 [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368],
9009 [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372],
9010 [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376],
9011 [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380],
9012 [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384],
9013 [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388],
9014 [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392],
9015 [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397],
9016 [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402],
9017 [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407],
9018 [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412],
9019 [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417],
9020 [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422],
9021 [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427],
9022 [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432],
9023 [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437],
9024 [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442],
9025 [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447],
9026 [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452],
9027 [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457],
9028 [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461],
9029 [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465],
9030 [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287],
9031 {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287],
9032 [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849,
9033 [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568,
9034 9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563,
9035 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619,
9036 {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132],
9037 [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137],
9038 [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141],
9039 [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145],
9040 [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813],
9041 [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153],
9042 [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157],
9043 [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878],
9044 [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548],
9045 [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0,
9046 [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177],
9047 [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634],
9048 [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186],
9049 [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192],
9050 [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446],
9051 [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214,
9052 [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206],
9053 [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0,
9054 [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216],
9055 [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220],
9056 [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224],
9057 [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801],
9058 [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666],
9059 [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0,
9060 [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243],
9061 [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247],
9062 [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251],
9063 [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255],
9064 [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824],
9065 [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310],
9066 [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268],
9067 [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273],
9068 [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927],
9069 [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282],
9070 [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286],
9071 [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140],
9072 [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294],
9073 [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139],
9074 [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302],
9075 [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306],
9076 [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444],
9077 [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298],
9078 [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321],
9079 [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0,
9080 [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0,
9081 [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336],
9082 [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340],
9083 [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345],
9084 [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413],
9085 [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353],
9086 [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357],
9087 [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361],
9088 [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366],
9089 [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990],
9090 [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374],
9091 [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873],
9092 [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382],
9093 [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551],
9094 [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437],
9095 [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399],
9096 [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393],
9097 [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616],
9098 [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624],
9099 [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417],
9100 [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421],
9101 [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425],
9102 [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429],
9103 [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261],
9104 [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437],
9105 [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443],
9106 [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447],
9107 [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451],
9108 [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455],
9109 [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459],
9110 [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0,
9111 [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468],
9112 [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475],
9113 [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494],
9114 [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483],
9115 [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0,
9116 [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493],
9117 [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497],
9118 [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598],
9119 [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449],
9120 [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891],
9121 [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515],
9122 [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911],
9123 [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523],
9124 [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527],
9125 [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990],
9126 [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536],
9127 [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541,
9128 [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545],
9129 [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688],
9130 [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493],
9131 [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557],
9132 [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249],
9133 [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405],
9134 [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570],
9135 [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548],
9136 [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578],
9137 [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684],
9138 [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587],
9139 [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591],
9140 [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595],
9141 [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804],
9142 [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603],
9143 [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915],
9144 [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611],
9145 [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615],
9146 [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619],
9147 [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381],
9148 [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627],
9149 [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631],
9150 [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635],
9151 [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640],
9152 [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315],
9153 [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649],
9154 [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434],
9155 [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511],
9156 [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661],
9157 [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531],
9158 [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724],
9159 [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675],
9160 [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324],
9161 [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683],
9162 [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687],
9163 [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138],
9164 [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696],
9165 [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700],
9166 [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705],
9167 [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947],
9168 [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097],
9169 [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717],
9170 [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721],
9171 [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725],
9172 [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729],
9173 [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595],
9174 [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737],
9175 [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349],
9176 [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955],
9177 [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425],
9178 [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753],
9179 [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134],
9180 [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762],
9181 [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924],
9182 [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134],
9183 [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774],
9184 [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506],
9185 [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681],
9186 [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786],
9187 [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135],
9188 [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795],
9189 [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534],
9190 [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804],
9191 [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043],
9192 [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812],
9193 [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701],
9194 [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820],
9195 [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030],
9196 [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828],
9197 [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832],
9198 [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001],
9199 [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081],
9200 [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848],
9201 [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852],
9202 [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856],
9203 [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861],
9204 [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396],
9205 [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870],
9206 [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874],
9207 [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878],
9208 [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909],
9209 [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886],
9210 [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891],
9211 [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470],
9212 [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899],
9213 [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904],
9214 [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117],
9215 [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912],
9216 [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115],
9217 [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920],
9218 [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924],
9219 [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928],
9220 [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158],
9221 [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476],
9222 [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958],
9223 [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682],
9224 [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948],
9225 [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019],
9226 [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957],
9227 [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961],
9228 [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603],
9229 [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827],
9230 [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491],
9231 [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977],
9232 [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114],
9233 [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985],
9234 [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987],
9235 [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994],
9236 [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502],
9237 [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002],
9238 [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006],
9239 [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964],
9240 [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923],
9241 [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258],
9242 [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746],
9243 [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027],
9244 [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731],
9245 [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035],
9246 [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340],
9247 [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043],
9248 [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049],
9249 [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054],
9250 [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490],
9251 [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062],
9252 [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586],
9253 [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603],
9254 [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074],
9255 [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080],
9256 [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084],
9257 [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088],
9258 [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085],
9259 [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285],
9260 [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100],
9261 [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783],
9262 [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239],
9263 [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112],
9264 [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116],
9265 [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120],
9266 [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124],
9267 [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070],
9268 [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133],
9269 [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957],
9270 [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141],
9271 [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097],
9272 [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149],
9273 [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281],
9274 [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157],
9275 [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161],
9276 [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961],
9277 [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169],
9278 [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315],
9279 [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194],
9280 [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934],
9281 [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476],
9282 [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070],
9283 [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195],
9284 [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199],
9285 [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203],
9286 [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566],
9287 [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211],
9288 [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302],
9289 [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219],
9290 [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223],
9291 [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257],
9292 [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266],
9293 [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235],
9294 [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690],
9295 [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164],
9296 [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150],
9297 [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252],
9298 [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257],
9299 [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262],
9300 [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266],
9301 [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274],
9302 [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274],
9303 [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278],
9304 [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377],
9305 [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004],
9306 [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290],
9307 [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294],
9308 [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219],
9309 [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901],
9310 [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306],
9311 [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310],
9312 [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314],
9313 [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318],
9314 [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322],
9315 [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326],
9316 [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331],
9317 [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335],
9318 [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339],
9319 [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343],
9320 [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348],
9321 [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475],
9322 [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941],
9323 [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360],
9324 [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220],
9325 [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082],
9326 [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372],
9327 [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376],
9328 [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380],
9329 [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112],
9330 [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0,
9331 [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703],
9332 [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397],
9333 [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0,
9334 [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853],
9335 [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410],
9336 [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736],
9337 [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469],
9338 [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422],
9339 [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0,
9340 [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757],
9341 [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435],
9342 [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312],
9343 [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443],
9344 [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944],
9345 [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872],
9346 [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455],
9347 [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459],
9348 [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463],
9349 [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565],
9350 [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471],
9351 [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475],
9352 [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275],
9353 [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250],
9354 [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487],
9355 [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491],
9356 [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748],
9357 [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982],
9358 [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504],
9359 [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508],
9360 [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925],
9361 [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516],
9362 [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520],
9363 [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525],
9364 [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529],
9365 [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533],
9366 [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784],
9367 [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542],
9368 [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616],
9369 [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550],
9370 [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554],
9371 [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374],
9372 [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505],
9373 [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945],
9374 [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570],
9375 [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375],
9376 [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578],
9377 [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164],
9378 [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228],
9379 [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590],
9380 [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594],
9381 [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422],
9382 [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602],
9383 [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399],
9384 [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328],
9385 [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614],
9386 [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618],
9387 [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933],
9388 [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900],
9389 [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630],
9390 [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314],
9391 [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638],
9392 [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642],
9393 [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376],
9394 [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650],
9395 [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654],
9396 [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658],
9397 [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662],
9398 [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666],
9399 [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670],
9400 [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674],
9401 [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322],
9402 [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221],
9403 [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613],
9404 [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366],
9405 [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069],
9406 [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698],
9407 [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0,
9408 [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848],
9409 [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712],
9410 [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477],
9411 [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020],
9412 [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724],
9413 [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115],
9414 [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571],
9415 [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369],
9416 [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686],
9417 [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054],
9418 [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749],
9419 [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757],
9420 [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334],
9421 [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797],
9422 [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832],
9423 [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853],
9424 [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898],
9425 [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920],
9426 [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984],
9427 [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038],
9428 [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075],
9429 [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102],
9430 [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132],
9431 [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143],
9432 [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166],
9433 [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194],
9434 [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201],
9435 [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0,
9436 [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233],
9437 [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418],
9438 [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515],
9439 [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625],
9440 [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687],
9441 [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266],
9442 [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274],
9443 [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283],
9444 [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290],
9445 [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299],
9446 [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0,
9447 [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834],
9448 [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327],
9449 [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006],
9450 [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341],
9451 [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0,
9452 [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352],
9453 [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0,
9454 [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369],
9455 [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105],
9456 [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384],
9457 [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390],
9458 [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642],
9459 [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904],
9460 [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979],
9461 [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248],
9462 [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181],
9463 [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714],
9464 [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133],
9465 [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438],
9466 [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446],
9467 [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451],
9468 [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455],
9469 [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133],
9470 [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960],
9471 [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470],
9472 [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474],
9473 [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478],
9474 [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496],
9475 [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0,
9476 [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546],
9477 [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554],
9478 [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876],
9479 [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248],
9480 [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0,
9481 [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416],
9482 [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595],
9483 [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604],
9484 [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608],
9485 [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612],
9486 [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616],
9487 [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620],
9488 [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624],
9489 [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578],
9490 [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632],
9491 [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294],
9492 [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818],
9493 [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646],
9494 [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650],
9495 [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654],
9496 [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027],
9497 [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662],
9498 [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666],
9499 [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670],
9500 [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675],
9501 [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683],
9502 [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697],
9503 [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704],
9504 [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0,
9505 [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719],
9506 [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726],
9507 [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739,
9508 [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744],
9509 [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752],
9510 [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761],
9511 [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765],
9512 [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769],
9513 [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773],
9514 [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777],
9515 [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0,
9516 [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788],
9517 [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797],
9518 [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802],
9519 [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807],
9520 [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023],
9521 [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818],
9522 [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822],
9523 [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826],
9524 [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831],
9525 [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982,
9526 [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842],
9527 [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847],
9528 [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851],
9529 [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855],
9530 [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859],
9531 [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863],
9532 [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867],
9533 [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871],
9534 [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876],
9535 60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882],
9536 [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886],
9537 [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894],
9538 [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898],
9539 [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0,
9540 [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908],
9541 [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913],
9542 [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919],
9543 [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923],
9544 [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927],
9545 [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933],
9546 60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938],
9547 60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943],
9548 [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947],
9549 [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952],
9550 [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957],
9551 [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961],
9552 [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966],
9553 [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203],
9554 [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975,
9555 [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981,
9556 [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985],
9557 [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0,
9558 [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994],
9559 [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998],
9560 [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003],
9561 [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008],
9562 [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013],
9563 [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018],
9564 [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025],
9565 [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030,
9566 [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035],
9567 [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039],
9568 [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043],
9569 [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047],
9570 [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051],
9571 [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056],
9572 [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060],
9573 [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064],
9574 [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0,
9575 [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074],
9576 [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078],
9577 [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0,
9578 [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345],
9579 [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349],
9580 [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826],
9581 [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357],
9582 [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361],
9583 [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643],
9584 [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369],
9585 [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193],
9586 [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968],
9587 [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383],
9588 [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387],
9589 [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391],
9590 [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516],
9591 [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923],
9592 [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531],
9593 [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407],
9594 [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411],
9595 [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417],
9596 [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421],
9597 [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425],
9598 [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429],
9599 [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433],
9600 [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438],
9601 [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0,
9602 [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447],
9603 [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451],
9604 [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455],
9605 [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598],
9606 [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555],
9607 [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468],
9608 [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472],
9609 [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476],
9610 [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480],
9611 [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263],
9612 [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488],
9613 [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516],
9614 [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496],
9615 [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477],
9616 [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504],
9617 [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0,
9618 [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533],
9619 [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517],
9620 [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522],
9621 [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526],
9622 [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758],
9623 [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877],
9624 [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538],
9625 [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542],
9626 [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0,
9627 [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551],
9628 [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555],
9629 [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559],
9630 [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563],
9631 [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568],
9632 [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018],
9633 [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138],
9634 [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917],
9635 [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584],
9636 [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589],
9637 [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628],
9638 [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598],
9639 [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602],
9640 [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588],
9641 [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517],
9642 [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615],
9643 [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619],
9644 [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623],
9645 [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627],
9646 [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631],
9647 [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635],
9648 [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337],
9649 [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643],
9650 [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355],
9651 [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073],
9652 [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659],
9653 [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663],
9654 [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667],
9655 [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240],
9656 [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678],
9657 [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682],
9658 [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992],
9659 [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441],
9660 [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695],
9661 [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699],
9662 [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903],
9663 [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709],
9664 [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442],
9665 [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718],
9666 [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722],
9667 [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726],
9668 [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730],
9669 [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734],
9670 [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738],
9671 [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742],
9672 [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0,
9673 [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753],
9674 [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757],
9675 [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761],
9676 [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824],
9677 [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771,
9678 [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775],
9679 [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780],
9680 [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783],
9681 [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364],
9682 [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559],
9683 [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049],
9684 [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803],
9685 [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807],
9686 [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811],
9687 [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495],
9688 [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819],
9689 [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823],
9690 [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828],
9691 [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832],
9692 [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836],
9693 [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562],
9694 [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844],
9695 [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848],
9696 [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852],
9697 [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0,
9698 [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266],
9699 [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865],
9700 [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869],
9701 [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873],
9702 [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760],
9703 [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450],
9704 [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885],
9705 [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211],
9706 [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893],
9707 [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897],
9708 [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0,
9709 [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908],
9710 [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912],
9711 [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916],
9712 [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920],
9713 [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924],
9714 [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780],
9715 [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513],
9716 [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936],
9717 [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125],
9718 [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945],
9719 [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949],
9720 [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087],
9721 [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0,
9722 [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161],
9723 [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050],
9724 [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971],
9725 [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975],
9726 [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979],
9727 [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983],
9728 [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987],
9729 [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539],
9730 [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996],
9731 [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202],
9732 [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938],
9733 [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008],
9734 [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012],
9735 [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016],
9736 [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602],
9737 [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026],
9738 [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031],
9739 [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807],
9740 [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915],
9741 [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043],
9742 [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048],
9743 [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052],
9744 [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056],
9745 [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060],
9746 [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064],
9747 [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069],
9748 [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966],
9749 [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077],
9750 [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933],
9751 [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085],
9752 [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044],
9753 [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897],
9754 [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100],
9755 [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056],
9756 [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292],
9757 [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114],
9758 [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687],
9759 [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122],
9760 [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126],
9761 [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210],
9762 [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534],
9763 [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968],
9764 [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392],
9765 [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194],
9766 [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092],
9767 [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0,
9768 [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0,
9769 [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564],
9770 [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568],
9771 [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263],
9772 [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0,
9773 [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0,
9774 [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208],
9775 [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0,
9776 [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497],
9777 [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936],
9778 [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0,
9779 [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325],
9780 [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620],
9781 [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624],
9782 [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665],
9783 [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635],
9784 [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209],
9785 [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645],
9786 [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987],
9787 [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778],
9788 [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417],
9789 [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122],
9790 [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630],
9791 [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489],
9792 [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436],
9793 [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0,
9794 [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0,
9795 [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0,
9796 0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030],
9797 [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042],
9798 [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063],
9799 [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924],
9800 [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0,
9801 [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818],
9802 [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388],
9803 [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863],
9804 [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0,
9805 [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963],
9806 [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233],
9807 [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051],
9808 [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078],
9809 [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148],
9810 [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056],
9811 {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520],
9812 {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277],
9813 {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274],
9814 {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776},
9815 [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206],
9816 [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785],
9817 [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789],
9818 [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793],
9819 [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797],
9820 [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801],
9821 [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491],
9822 [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033],
9823 [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970],
9824 [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818],
9825 [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822],
9826 [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826],
9827 [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830],
9828 [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207],
9829 [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521],
9830 [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525],
9831 [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529],
9832 [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534],
9833 [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538],
9834 [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543],
9835 [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969],
9836 [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375],
9837 [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382],
9838 [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387],
9839 [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391],
9840 [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395],
9841 [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399],
9842 [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403],
9843 [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407],
9844 [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411],
9845 [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415],
9846 [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419],
9847 [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423],
9848 [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427],
9849 [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431],
9850 [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435],
9851 [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447],
9852 [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453],
9853 [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510],
9854 [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461],
9855 [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467],
9856 [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471],
9857 [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054],
9858 [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480],
9859 [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484],
9860 [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490],
9861 [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496],
9862 [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501],
9863 [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507],
9864 [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511],
9865 [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515],
9866 [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519],
9867 [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524],
9868 [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155],
9869 [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287],
9870 [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611],
9871 [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724],
9872 [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662],
9873 [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826],
9874 [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503],
9875 [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472],
9876 [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950],
9877 [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526],
9878 [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958],
9879 [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701],
9880 [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830],
9881 [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713],
9882 [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906],
9883 [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019],
9884 [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237],
9885 [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288],
9886 [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777],
9887 [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197],
9888 [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743],
9889 [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093],
9890 [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094],
9891 [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978],
9892 [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759],
9893 [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763],
9894 [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767],
9895 [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484],
9896 [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775],
9897 [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032],
9898 [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039],
9899 [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044],
9900 [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048],
9901 [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053],
9902 [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059],
9903 [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064],
9904 [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070],
9905 [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074],
9906 [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078],
9907 [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083],
9908 [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087],
9909 [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091],
9910 [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096],
9911 [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100],
9912 [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104],
9913 [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108],
9914 [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112],
9915 [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116],
9916 [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120],
9917 [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336],
9918 [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128],
9919 [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132],
9920 [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136],
9921 [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140],
9922 [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144],
9923 [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877],
9924 [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134],
9925 [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188],
9926 [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480],
9927 [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087],
9928 [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385],
9929 [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415],
9930 [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564],
9931 [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922],
9932 [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611],
9933 [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888],
9934 [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010],
9935 [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996],
9936 [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254],
9937 [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427],
9938 [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746],
9939 [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756],
9940 [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761],
9941 [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766],
9942 [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166],
9943 [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774],
9944 [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779],
9945 [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787],
9946 [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794],
9947 [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802],
9948 [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806],
9949 [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810],
9950 [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815],
9951 [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822],
9952 [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827],
9953 [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833],
9954 [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837],
9955 [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844],
9956 [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850],
9957 [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856],
9958 [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864],
9959 [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868],
9960 [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873],
9961 [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878],
9962 [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882],
9963 [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351],
9964 [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891],
9965 [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896],
9966 [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901],
9967 [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906],
9968 [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911],
9969 [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916],
9970 [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921],
9971 [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927],
9972 [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931],
9973 [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937],
9974 [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942],
9975 [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947],
9976 [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951],
9977 [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955],
9978 [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959],
9979 [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965],
9980 [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970],
9981 [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975],
9982 [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979],
9983 [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985],
9984 [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992],
9985 [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996],
9986 [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001],
9987 [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006],
9988 [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010],
9989 [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014],
9990 [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018],
9991 [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022],
9992 [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028],
9993 [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032],
9994 [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036],
9995 [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041],
9996 [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047],
9997 [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052],
9998 [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059],
9999 [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063],
10000 [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069],
10001 [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178],
10002 [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079],
10003 [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086],
10004 [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090],
10005 [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220],
10006 [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311],
10007 [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726],
10008 [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826],
10009 [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091],
10010 [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227],
10011 [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325],
10012 [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578],
10013 [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871],
10014 [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100],
10015 [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304],
10016 [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471],
10017 [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053],
10018 [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155],
10019 [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578],
10020 [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352],
10021 [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029],
10022 [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183],
10023 [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098],
10024 [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715],
10025 [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143],
10026 [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600],
10027 [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741],
10028 [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411],
10029 [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743],
10030 [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231],
10031 [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737],
10032 [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374],
10033 [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108],
10034 [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037],
10035 [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596],
10036 [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646],
10037 [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930],
10038 [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859],
10039 [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316],
10040 [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674],
10041 [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946],
10042 [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436],
10043 [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790],
10044 [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202],
10045 [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621],
10046 [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205],
10047 [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486],
10048 [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740],
10049 [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301],
10050 [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849],
10051 [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984],
10052 [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271],
10053 [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746],
10054 [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230],
10055 [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726],
10056 [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172],
10057 [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286],
10058 [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392],
10059 [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313],
10060 [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766],
10061 [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768],
10062 [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691],
10063 [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543],
10064 [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464],
10065 [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700],
10066 [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809],
10067 [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942],
10068 [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080],
10069 [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698],
10070 [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600],
10071 [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880],
10072 [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254],
10073 [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119],
10074 [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438],
10075 [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828],
10076 [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752],
10077 [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559],
10078 [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727],
10079 [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382],
10080 [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389],
10081 [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374],
10082 [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191],
10083 [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790],
10084 [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100],
10085 [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822],
10086 [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685],
10087 [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928],
10088 [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275],
10089 [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566],
10090 [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088],
10091 [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366],
10092 [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196],
10093 [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015],
10094 [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106],
10095 [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110],
10096 [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520],
10097 [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608],
10098 [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703],
10099 [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486],
10100 [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021],
10101 [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028],
10102 [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779],
10103 [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237],
10104 [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242],
10105 [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248],
10106 [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253],
10107 [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258],
10108 [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263],
10109 [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268],
10110 [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273],
10111 [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279],
10112 [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553],
10113 [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558],
10114 [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530],
10115 [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842,
10116 [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848],
10117 [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450],
10118 36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295],
10119 [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910,
10120 [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871],
10121 34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284,
10122 [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464,
10123 20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678],
10124 24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203,
10125 [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911],
10126 [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237],
10127 31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537,
10128 62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255],
10129 [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333,
10130 34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951],
10131 [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956},
10132 23446, 62959, 32347],
10133 'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168,
10134 12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216},
10135 {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310},
10136 {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746,
10137 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801,
10138 8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757,
10139 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504},
10140 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632,
10141 9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352},
10142 {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544},
10143 {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353},
10144 {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945},
10145 {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081},
10146 {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284},
10147 {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075},
10148 {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225,
10149 462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363,
10150 250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609,
10151 {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467,
10152 25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861,
10153 29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018,
10154 26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658,
10155 22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494,
10156 [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365,
10157 38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133,
10158 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256,
10159 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758,
10160 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502,
10161 32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453,
10162 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329,
10163 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953,
10164 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454,
10165 36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887,
10166 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949,
10167 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534,
10168 36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631,
10169 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626,
10170 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851,
10171 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187,
10172 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850,
10173 39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493,
10174 31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572,
10175 36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813,
10176 24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133,
10177 26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554,
10178 21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815,
10179 25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130,
10180 20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607,
10181 32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046,
10182 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507,
10183 24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561,
10184 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576,
10185 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507,
10186 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360,
10187 23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411],
10188 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167,
10189 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148,
10190 38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788,
10191 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383,
10192 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149,
10193 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576,
10194 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425,
10195 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751,
10196 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929,
10197 28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514,
10198 25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574,
10199 [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453,
10200 36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086,
10201 27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826,
10202 33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548,
10203 21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783,
10204 30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932,
10205 31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532,
10206 24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856,
10207 38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583,
10208 30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300,
10209 29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025,
10210 39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891,
10211 25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238,
10212 [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602,
10213 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230,
10214 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817,
10215 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462,
10216 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333,
10217 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077,
10218 24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780],
10219 [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144,
10220 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070,
10221 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820,
10222 33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938,
10223 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750],
10224 21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153,
10225 33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881,
10226 22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792,
10227 38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964,
10228 20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133,
10229 27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343,
10230 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104,
10231 36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428],
10232 [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648,
10233 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178],
10234 [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954,
10235 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464,
10236 31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295,
10237 21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106,
10238 [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508,
10239 32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775,
10240 [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467,
10241 [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807,
10242 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629,
10243 20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592],
10244 [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916],
10245 21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448,
10246 20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809,
10247 [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394,
10248 36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053,
10249 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704,
10250 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039,
10251 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421,
10252 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741,
10253 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917,
10254 33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977,
10255 38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657],
10256 30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720,
10257 21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399,
10258 29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774,
10259 33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252,
10260 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010,
10261 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707,
10262 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462,
10263 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822,
10264 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674,
10265 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229,
10266 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746,
10267 27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785,
10268 38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215,
10269 31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521,
10270 21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762,
10271 21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015,
10272 25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490,
10273 35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551,
10274 22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551,
10275 31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546,
10276 38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604,
10277 30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099,
10278 37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073,
10279 39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743,
10280 30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898,
10281 30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605,
10282 38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478,
10283 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342,
10284 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571,
10285 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511,
10286 20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020],
10287 [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827,
10288 38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834,
10289 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117,
10290 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742,
10291 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590,
10292 [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087,
10293 [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141,
10294 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298,
10295 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844,
10296 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899,
10297 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740,
10298 38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888,
10299 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570,
10300 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130,
10301 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933,
10302 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838,
10303 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511,
10304 25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239,
10305 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393,
10306 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103,
10307 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304,
10308 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420,
10309 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182,
10310 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597,
10311 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070,
10312 26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226,
10313 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769,
10314 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792,
10315 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324],
10316 40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782,
10317 21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813,
10318 [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830,
10319 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860,
10320 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238,
10321 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518,
10322 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454,
10323 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161,
10324 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940,
10325 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827,
10326 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657,
10327 31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699,
10328 28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383,
10329 40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108,
10330 24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649,
10331 32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402,
10332 28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814,
10333 32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064,
10334 33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434,
10335 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033,
10336 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426,
10337 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611],
10338 [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040,
10339 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209,
10340 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804,
10341 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753,
10342 31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588,
10343 23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517,
10344 [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937,
10345 34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126,
10346 34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169,
10347 33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819,
10348 28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982,
10349 27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446],
10350 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435,
10351 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376,
10352 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958,
10353 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346,
10354 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479,
10355 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592,
10356 29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445,
10357 33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262,
10358 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572,
10359 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750,
10360 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928,
10361 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243,
10362 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060,
10363 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921,
10364 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447,
10365 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860,
10366 33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687,
10367 20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629,
10368 25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179,
10369 20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748,
10370 36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970,
10371 22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450,
10372 26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827,
10373 22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569,
10374 36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668],
10375 36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190,
10376 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065,
10377 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424],
10378 27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207,
10379 38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772,
10380 32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054,
10381 20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777,
10382 38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773,
10383 39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714,
10384 22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537,
10385 28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275,
10386 27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820,
10387 30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123,
10388 20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469,
10389 24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748,
10390 20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993,
10391 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580,
10392 [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741,
10393 [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070,
10394 33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977,
10395 21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234,
10396 29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049,
10397 27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441,
10398 [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203,
10399 21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978,
10400 23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569,
10401 21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198,
10402 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280,
10403 [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978,
10404 32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499,
10405 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287,
10406 35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102,
10407 20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351,
10408 23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623,
10409 20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181,
10410 20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797,
10411 25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463,
10412 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298,
10413 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626,
10414 34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463,
10415 25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684,
10416 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841,
10417 [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805,
10418 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515,
10419 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824,
10420 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013,
10421 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487,
10422 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635,
10423 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001,
10424 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427,
10425 22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488,
10426 27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393,
10427 22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899,
10428 25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776,
10429 31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486,
10430 33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150,
10431 30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884,
10432 20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635,
10433 [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522,
10434 36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572,
10435 20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108,
10436 24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836,
10437 36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648,
10438 [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581,
10439 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464,
10440 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964,
10441 23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609,
10442 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451,
10443 23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448,
10444 26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829,
10445 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996,
10446 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890,
10447 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442,
10448 [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705,
10449 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779,
10450 24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436,
10451 26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310,
10452 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735,
10453 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560,
10454 38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796,
10455 29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219,
10456 21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283,
10457 38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523,
10458 25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335,
10459 38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146,
10460 39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262,
10461 [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819,
10462 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813,
10463 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195,
10464 [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123,
10465 27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856,
10466 20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218,
10467 33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449,
10468 34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026,
10469 [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016,
10470 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152,
10471 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464,
10472 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167,
10473 32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873,
10474 30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634,
10475 [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033,
10476 27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493,
10477 21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597,
10478 21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005,
10479 30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839,
10480 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746,
10481 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495,
10482 31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687,
10483 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671,
10484 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768,
10485 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994,
10486 21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558,
10487 38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202,
10488 33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050,
10489 [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673,
10490 20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589,
10491 24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764,
10492 32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035,
10493 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521,
10494 27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631,
10495 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323,
10496 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704,
10497 24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001,
10498 37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491,
10499 20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402,
10500 27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189,
10501 28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431,
10502 35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935,
10503 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507,
10504 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945,
10505 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828,
10506 33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053,
10507 23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248,
10508 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776,
10509 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874,
10510 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531,
10511 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131,
10512 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166,
10513 21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643,
10514 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651,
10515 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360,
10516 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467,
10517 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260,
10518 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903,
10519 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825,
10520 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390,
10521 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529,
10522 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151,
10523 37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930,
10524 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540,
10525 20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535,
10526 25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234,
10527 31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405,
10528 24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247,
10529 [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090,
10530 21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482,
10531 35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065,
10532 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880,
10533 31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776,
10534 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894,
10535 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331,
10536 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672,
10537 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371,
10538 [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447,
10539 32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199,
10540 [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386,
10541 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590,
10542 20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317,
10543 19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162,
10544 [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664,
10545 22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720,
10546 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405,
10547 21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294,
10548 21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043,
10549 {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121,
10550 21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200,
10551 20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263,
10552 20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274,
10553 20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394,
10554 20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444,
10555 20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525,
10556 20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558,
10557 20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716,
10558 20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430,
10559 [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804,
10560 [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128],
10561 20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819,
10562 32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898,
10563 20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767,
10564 {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798,
10565 {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822,
10566 35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847,
10567 35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864,
10568 35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886},
10569 {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434,
10570 38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503,
10571 38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021,
10572 37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071,
10573 37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079,
10574 37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167,
10575 37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759,
10576 21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981],
10577 20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441,
10578 22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329,
10579 {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396,
10580 22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479,
10581 22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456,
10582 22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528,
10583 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656,
10584 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412,
10585 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482,
10586 33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441,
10587 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551,
10588 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562,
10589 33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627},
10590 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607,
10591 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637,
10592 33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656,
10593 {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705,
10594 33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793,
10595 33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848,
10596 33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733,
10597 33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907,
10598 {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932,
10599 33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994,
10600 33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060,
10601 29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044,
10602 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171,
10603 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231,
10604 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364,
10605 [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263,
10606 [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290,
10607 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590,
10608 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532,
10609 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534,
10610 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732,
10611 25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815,
10612 25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337,
10613 21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579,
10614 {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634,
10615 21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661,
10616 21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618,
10617 21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724,
10618 {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757,
10619 21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903,
10620 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846,
10621 {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945,
10622 21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949},
10623 21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972,
10624 21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964},
10625 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051,
10626 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114,
10627 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139},
10628 22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251,
10629 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081,
10630 24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692,
10631 23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708,
10632 23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748,
10633 23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844,
10634 23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919,
10635 23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955,
10636 23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469,
10637 24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357,
10638 29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416,
10639 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434},
10640 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477,
10641 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566,
10642 [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267,
10643 {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309,
10644 {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229,
10645 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296,
10646 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545,
10647 24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614,
10648 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696},
10649 24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707,
10650 24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794,
10651 24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906,
10652 24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377,
10653 38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403},
10654 38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421},
10655 {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722,
10656 27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782,
10657 27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872,
10658 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943,
10659 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950,
10660 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064,
10661 27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101,
10662 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075,
10663 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294,
10664 {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461,
10665 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303,
10666 28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470,
10667 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530,
10668 28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654,
10669 28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766,
10670 [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652,
10671 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837,
10672 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902,
10673 36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932,
10674 {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989,
10675 36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611,
10676 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365,
10677 33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953},
10678 22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999,
10679 22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049,
10680 23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100,
10681 23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218,
10682 23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260,
10683 23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397,
10684 23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549,
10685 {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574,
10686 39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591,
10687 32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446,
10688 {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475,
10689 {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525,
10690 32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519},
10691 {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539,
10692 32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565,
10693 [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614,
10694 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640,
10695 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711,
10696 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722,
10697 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838,
10698 {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863,
10699 29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533,
10700 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507,
10701 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585,
10702 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561,
10703 26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724,
10704 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697,
10705 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876,
10706 {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896,
10707 26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000,
10708 26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035,
10709 27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029,
10710 27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204,
10711 27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224,
10712 27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521},
10713 27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562,
10714 36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727,
10715 {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747,
10716 {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122,
10717 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969,
10718 29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133,
10719 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207,
10720 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279,
10721 26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150,
10722 36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173,
10723 36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343,
10724 29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330,
10725 25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637,
10726 27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689,
10727 27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232,
10728 34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939,
10729 32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973,
10730 32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010,
10731 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096,
10732 33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129,
10733 {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373,
10734 33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447,
10735 27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129},
10736 [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054,
10737 26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829,
10738 28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950,
10739 28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050,
10740 29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213,
10741 29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160},
10742 31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063,
10743 31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529,
10744 24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838,
10745 24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895],
10746 27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737,
10747 26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757,
10748 30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791,
10749 30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898,
10750 30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995,
10751 31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468,
10752 30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517,
10753 30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591,
10754 30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653,
10755 30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600,
10756 32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413,
10757 30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028},
10758 {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051},
10759 38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068,
10760 {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088},
10761 {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110},
10762 38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123,
10763 {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143,
10764 38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157},
10765 {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186},
10766 38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204,
10767 {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220,
10768 {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235,
10769 {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255,
10770 {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211,
10771 31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655,
10772 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996,
10773 40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503,
10774 {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518},
10775 {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542,
10776 40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102,
10777 30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128,
10778 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183,
10779 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218,
10780 30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253,
10781 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300,
10782 30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368,
10783 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930,
10784 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022,
10785 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097,
10786 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195,
10787 [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790,
10788 32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821,
10789 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043,
10790 39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070},
10791 {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414,
10792 34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471,
10793 34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490,
10794 34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547,
10795 34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552,
10796 34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586,
10797 34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594,
10798 {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659,
10799 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696,
10800 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763,
10801 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838,
10802 34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578,
10803 {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509,
10804 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520,
10805 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564,
10806 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654},
10807 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668,
10808 31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742,
10809 31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808,
10810 33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325,
10811 33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353,
10812 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039,
10813 35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889,
10814 31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943,
10815 {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703,
10816 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992],
10817 32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244,
10818 36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198},
10819 37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236,
10820 37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290,
10821 {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331,
10822 36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310},
10823 36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343},
10824 36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396,
10825 36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425,
10826 {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463,
10827 36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970,
10828 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301,
10829 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657,
10830 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835,
10831 {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585],
10832 {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694,
10833 37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267,
10834 40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090},
10835 {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109},
10836 {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138},
10837 {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780,
10838 38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601,
10839 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618,
10840 {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761,
10841 39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663,
10842 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715,
10843 {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846,
10844 40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677,
10845 40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772,
10846 12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631,
10847 25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165,
10848 23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970,
10849 32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722,
10850 36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173,
10851 25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922,
10852 24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652,
10853 35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369,
10854 39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396,
10855 [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425,
10856 36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490,
10857 31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659,
10858 30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880,
10859 24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934,
10860 37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153,
10861 27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958,
10862 32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336,
10863 38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346,
10864 29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136,
10865 38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818,
10866 29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684,
10867 36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027,
10868 22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219,
10869 39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489,
10870 36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123,
10871 23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499,
10872 20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865,
10873 39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512,
10874 [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707,
10875 22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703,
10876 40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441,
10877 25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036,
10878 31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554,
10879 36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221,
10880 26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352,
10881 38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381,
10882 27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572,
10883 25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068,
10884 [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559,
10885 28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308,
10886 25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542,
10887 31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180,
10888 30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169,
10889 31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273,
10890 32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982,
10891 27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744,
10892 23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346,
10893 34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348,
10894 34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736,
10895 21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023,
10896 39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486,
10897 32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832,
10898 25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904,
10899 29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936,
10900 39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580,
10901 27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796,
10902 28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311,
10903 24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650,
10904 20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854,
10905 39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393,
10906 21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415,
10907 35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683,
10908 22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313,
10909 40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126,
10910 24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886,
10911 22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016,
10912 33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442,
10913 30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315,
10914 24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229,
10915 [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467,
10916 36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958,
10917 22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434,
10918 27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898,
10919 31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306,
10920 30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054,
10921 32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632,
10922 21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493,
10923 36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086,
10924 35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854,
10925 24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218,
10926 36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360,
10927 36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918,
10928 35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359,
10929 35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403,
10930 25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010,
10931 30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295,
10932 35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307,
10933 32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213,
10934 39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178,
10935 [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702,
10936 32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198,
10937 31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209,
10938 35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676,
10939 23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289,
10940 39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129,
10941 35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406,
10942 33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137,
10943 38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416,
10944 21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232,
10945 21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421,
10946 30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178,
10947 27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291,
10948 37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427,
10949 35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387,
10950 23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111,
10951 31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438,
10952 29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486,
10953 39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729,
10954 22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142,
10955 38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106,
10956 36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042,
10957 36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028,
10958 36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081,
10959 36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806,
10960 38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025,
10961 25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886,
10962 35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225,
10963 36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674,
10964 35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310,
10965 28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013,
10966 21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132,
10967 21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712,
10968 20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131,
10969 33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382,
10970 35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445,
10971 35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535,
10972 35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585,
10973 35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606,
10974 35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734,
10975 38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233,
10976 24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610,
10977 22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338,
10978 34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366,
10979 34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133,
10980 40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167,
10981 34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759,
10982 25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072,
10983 22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118,
10984 22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195,
10985 22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151,
10986 23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937,
10987 24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136,
10988 39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195,
10989 39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082,
10990 25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887,
10991 24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284,
10992 38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333,
10993 38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711,
10994 28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150,
10995 28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703,
10996 28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285,
10997 23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338,
10998 23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498,
10999 39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470,
11000 39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002,
11001 {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272,
11002 32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190,
11003 32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199,
11004 32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225,
11005 32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309,
11006 32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367,
11007 32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908,
11008 29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783,
11009 27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194,
11010 27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384,
11011 27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567,
11012 36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706,
11013 36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636,
11014 36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326,
11015 36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058,
11016 36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247,
11017 35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051,
11018 33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112,
11019 36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152,
11020 31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824,
11021 30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558,
11022 30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351,
11023 37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377,
11024 37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437,
11025 37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453,
11026 37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891,
11027 37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523,
11028 37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906,
11029 37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622,
11030 {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696,
11031 37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703,
11032 37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767,
11033 37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858,
11034 {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879,
11035 37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951,
11036 37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327,
11037 40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275,
11038 40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329,
11039 40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410,
11040 40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311,
11041 30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313,
11042 30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392,
11043 32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481,
11044 38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024,
11045 34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760,
11046 34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691,
11047 31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677,
11048 31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489,
11049 36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451,
11050 36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799,
11051 40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703,
11052 40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056,
11053 31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851,
11054 39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882,
11055 39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906,
11056 39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945,
11057 39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008,
11058 39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857,
11059 40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695,
11060 40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725,
11061 22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339,
11062 39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637,
11063 [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890,
11064 38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590,
11065 31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634,
11066 38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211,
11067 8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786,
11068 {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619},
11069 {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317},
11070 {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252,
11071 13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208,
11072 12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445},
11073 {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128},
11074 12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991,
11075 {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019,
11076 20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053,
11077 20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071},
11078 {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095},
11079 {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118},
11080 20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148,
11081 {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178,
11082 {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205},
11083 20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226},
11084 {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259,
11085 {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281,
11086 20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308,
11087 20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333},
11088 {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357,
11089 20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373,
11090 {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395,
11091 20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416},
11092 {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450,
11093 {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468},
11094 20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490,
11095 20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512,
11096 {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543},
11097 {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560},
11098 {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582},
11099 {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609},
11100 {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631,
11101 {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662,
11102 {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675},
11103 {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690},
11104 {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713},
11105 {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737,
11106 20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758},
11107 {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779},
11108 {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810,
11109 20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829},
11110 {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858,
11111 {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874},
11112 {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897,
11113 20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920},
11114 {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944,
11115 {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962},
11116 {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990,
11117 {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007},
11118 {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025},
11119 {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044},
11120 21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070},
11121 {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087},
11122 {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107,
11123 {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134},
11124 21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166},
11125 {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194,
11126 {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212,
11127 {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234},
11128 {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255,
11129 {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275},
11130 {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287},
11131 {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304],
11132 {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328,
11133 {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356},
11134 21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379,
11135 {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398},
11136 {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418},
11137 {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440,
11138 {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466,
11139 {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506,
11140 21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538,
11141 {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565,
11142 21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580},
11143 21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609},
11144 21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637,
11145 {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660,
11146 {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685},
11147 {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720,
11148 21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743},
11149 {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768,
11150 {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788},
11151 21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810,
11152 {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829,
11153 {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844,
11154 {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858},
11155 {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887,
11156 {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906},
11157 {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920},
11158 {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944,
11159 21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967},
11160 21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991,
11161 {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015,
11162 {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037,
11163 {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056,
11164 {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080,
11165 {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106},
11166 {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131,
11167 22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152},
11168 22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170},
11169 {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197,
11170 {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214},
11171 22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229},
11172 {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254},
11173 {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272},
11174 22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297},
11175 {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315,
11176 {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337,
11177 {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354},
11178 {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382,
11179 {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397},
11180 {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428},
11181 22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453},
11182 {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480},
11183 22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498},
11184 {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517},
11185 {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531},
11186 {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546},
11187 {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562},
11188 {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582},
11189 {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617},
11190 {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637},
11191 {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662},
11192 {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688},
11193 {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717,
11194 {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740,
11195 {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762,
11196 22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775},
11197 {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789},
11198 {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798,
11199 {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813},
11200 {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834},
11201 {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853},
11202 22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875},
11203 22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895},
11204 22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921,
11205 {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936,
11206 {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956},
11207 {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972},
11208 {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997},
11209 23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017},
11210 {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050},
11211 {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065},
11212 {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078},
11213 {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101},
11214 {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126},
11215 {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147},
11216 {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168},
11217 {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211},
11218 23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231},
11219 {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253,
11220 {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268},
11221 {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282},
11222 {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306,
11223 {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330},
11224 {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353},
11225 {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392},
11226 {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417,
11227 {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437},
11228 {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468},
11229 {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491,
11230 {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523,
11231 23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552,
11232 {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577,
11233 23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597},
11234 {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622},
11235 {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642},
11236 23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666},
11237 {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689},
11238 {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709},
11239 {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734,
11240 {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749},
11241 {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778},
11242 23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797,
11243 {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812},
11244 {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832},
11245 {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850},
11246 {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880},
11247 {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900,
11248 {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920},
11249 {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960,
11250 {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976},
11251 23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014},
11252 24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042,
11253 {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063},
11254 24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087,
11255 {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114,
11256 {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129,
11257 {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153},
11258 {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183,
11259 {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216,
11260 24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238},
11261 24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267},
11262 {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292},
11263 24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315},
11264 {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342,
11265 {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360,
11266 {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379,
11267 {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399,
11268 24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421,
11269 {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440,
11270 24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467},
11271 24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491},
11272 {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510},
11273 {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531},
11274 {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549},
11275 {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562},
11276 {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583},
11277 {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602,
11278 {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624},
11279 {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652,
11280 {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662},
11281 {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686,
11282 {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704},
11283 {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725,
11284 {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743,
11285 {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761},
11286 {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786},
11287 {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821,
11288 {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839,
11289 {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861},
11290 {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876},
11291 {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909,
11292 {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921,
11293 {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937,
11294 {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952},
11295 {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981},
11296 {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005,
11297 {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023},
11298 {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045},
11299 {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065},
11300 {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107,
11301 25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131,
11302 25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154,
11303 {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173},
11304 {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192,
11305 {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210},
11306 25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241,
11307 {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257},
11308 {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278,
11309 {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309},
11310 {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333,
11311 {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354},
11312 {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372,
11313 {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392},
11314 {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412,
11315 {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440,
11316 {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459},
11317 {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485,
11318 25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510,
11319 25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533,
11320 25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553,
11321 {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570,
11322 {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591,
11323 {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614,
11324 {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631,
11325 {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653,
11326 {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673,
11327 {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693,
11328 {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712},
11329 {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737},
11330 25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760},
11331 {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795,
11332 25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813},
11333 25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831},
11334 {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855,
11335 {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866},
11336 {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886},
11337 {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916},
11338 {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933},
11339 25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951},
11340 {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974,
11341 {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997},
11342 26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016,
11343 {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040,
11344 {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061,
11345 {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081,
11346 {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104},
11347 {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125,
11348 {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142,
11349 {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162},
11350 {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180},
11351 {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203},
11352 26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217},
11353 {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235},
11354 {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250},
11355 {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270},
11356 {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287},
11357 {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312,
11358 {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334},
11359 {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349},
11360 26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369},
11361 {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390,
11362 {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416,
11363 {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430},
11364 26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450,
11365 {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466},
11366 {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488},
11367 26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506,
11368 {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527},
11369 26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548,
11370 {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591,
11371 26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602},
11372 {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630,
11373 26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654},
11374 {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682},
11375 26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730,
11376 {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759},
11377 {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782,
11378 {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798,
11379 {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826,
11380 26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843},
11381 {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863,
11382 {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877},
11383 {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899},
11384 {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929},
11385 {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944},
11386 {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968},
11387 {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983,
11388 {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998,
11389 {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018},
11390 {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037},
11391 27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061},
11392 {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087,
11393 {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105},
11394 {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136,
11395 {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156},
11396 {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179},
11397 27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195},
11398 {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212},
11399 {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235},
11400 {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261},
11401 {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279,
11402 {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293},
11403 27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312},
11404 {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332},
11405 {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373},
11406 {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397},
11407 {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415},
11408 27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448,
11409 {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464,
11410 {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482},
11411 27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514,
11412 {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540},
11413 27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554},
11414 {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574,
11415 {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587},
11416 {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610,
11417 {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632},
11418 27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648},
11419 {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685,
11420 27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710},
11421 {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734,
11422 {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755},
11423 27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775},
11424 27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793},
11425 {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820,
11426 {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840},
11427 {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857},
11428 {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881,
11429 {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906},
11430 {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919},
11431 {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942,
11432 {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956,
11433 {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980,
11434 27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001},
11435 {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016},
11436 {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035},
11437 28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054},
11438 28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083},
11439 {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104},
11440 {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127,
11441 {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146,
11442 28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175,
11443 {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187},
11444 {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208},
11445 28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223},
11446 {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249},
11447 {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272},
11448 {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298},
11449 {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320},
11450 {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339,
11451 28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358,
11452 {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376},
11453 {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397},
11454 {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416,
11455 {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432},
11456 {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464,
11457 {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482},
11458 {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498},
11459 {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517,
11460 {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539,
11461 {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554},
11462 {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578},
11463 {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594,
11464 {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612},
11465 {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633},
11466 {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652},
11467 {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682,
11468 {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700,
11469 28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721,
11470 {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735},
11471 {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754},
11472 {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773},
11473 {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797,
11474 {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815},
11475 28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850,
11476 {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873,
11477 {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892},
11478 {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917},
11479 28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939},
11480 {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962},
11481 {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998},
11482 29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023},
11483 29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044},
11484 29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061},
11485 {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077},
11486 {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101},
11487 29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122,
11488 {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139,
11489 {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153},
11490 {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178},
11491 29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198},
11492 {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227,
11493 {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248},
11494 {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276,
11495 29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296},
11496 {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314},
11497 {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331},
11498 {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352},
11499 29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381},
11500 {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402},
11501 29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429},
11502 {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451},
11503 {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471},
11504 {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487},
11505 {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506},
11506 {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523},
11507 {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555},
11508 29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576,
11509 29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586},
11510 {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603},
11511 29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624},
11512 {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646,
11513 {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672,
11514 {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695},
11515 29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713},
11516 {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743,
11517 {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760,
11518 {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792},
11519 {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809},
11520 {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834,
11521 {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855},
11522 {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883},
11523 {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907,
11524 {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927},
11525 {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952},
11526 {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979,
11527 {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998,
11528 30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017},
11529 {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032},
11530 {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055},
11531 {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080},
11532 {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101,
11533 30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125,
11534 {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150,
11535 {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172},
11536 {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194},
11537 {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212,
11538 {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234,
11539 {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257},
11540 {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280,
11541 {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301,
11542 {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326],
11543 30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345},
11544 {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356},
11545 {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383},
11546 30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400},
11547 {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421,
11548 {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440},
11549 30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463},
11550 {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478},
11551 {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510,
11552 {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532},
11553 {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559},
11554 30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586},
11555 {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611},
11556 {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635,
11557 {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654,
11558 {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680},
11559 {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704},
11560 {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723},
11561 {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750,
11562 {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766},
11563 {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788,
11564 30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803},
11565 {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825,
11566 {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856,
11567 {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873,
11568 {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890},
11569 {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911},
11570 {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929},
11571 {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953},
11572 {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965},
11573 {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978},
11574 {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002},
11575 {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021},
11576 {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047,
11577 {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073,
11578 {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097,
11579 {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115},
11580 {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147},
11581 31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170,
11582 {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182},
11583 {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200},
11584 31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225},
11585 31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244,
11586 {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259},
11587 31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282,
11588 {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303},
11589 {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331},
11590 31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362,
11591 31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379},
11592 {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407},
11593 {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424},
11594 31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450},
11595 {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470,
11596 {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486,
11597 {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504,
11598 {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519,
11599 {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538,
11600 {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562,
11601 {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582},
11602 31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599},
11603 {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615,
11604 {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630},
11605 {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646},
11606 {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669},
11607 {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693},
11608 31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710},
11609 {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727},
11610 31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745},
11611 {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778,
11612 {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801},
11613 31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837},
11614 {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855},
11615 {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891},
11616 31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910},
11617 {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930},
11618 {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950},
11619 31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987,
11620 31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012,
11621 {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029},
11622 {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052},
11623 32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079,
11624 {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103,
11625 {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120,
11626 {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138},
11627 {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159},
11628 {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188,
11629 {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204},
11630 32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228},
11631 32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245,
11632 {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268},
11633 {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292},
11634 {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316,
11635 {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339,
11636 {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355},
11637 32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378},
11638 {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400},
11639 32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436,
11640 {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567,
11641 32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591,
11642 {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611},
11643 {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634},
11644 {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653,
11645 {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672,
11646 {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691},
11647 {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715,
11648 32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729},
11649 {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754,
11650 {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775},
11651 {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801,
11652 {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820,
11653 {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836},
11654 {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857,
11655 {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888,
11656 {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909},
11657 {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940,
11658 32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965,
11659 {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991},
11660 {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019,
11661 {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035},
11662 33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069},
11663 33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095,
11664 33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115},
11665 {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138},
11666 {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168,
11667 {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185},
11668 {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212,
11669 {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241,
11670 {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259,
11671 {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291,
11672 {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312,
11673 {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340},
11674 {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356},
11675 {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383,
11676 {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400],
11677 {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420,
11678 33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442},
11679 33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471},
11680 {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497},
11681 33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522},
11682 {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549,
11683 33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565},
11684 {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597},
11685 {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619,
11686 {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657},
11687 {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679},
11688 {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697,
11689 {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726},
11690 {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741},
11691 {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762},
11692 {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786},
11693 {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810},
11694 {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837},
11695 {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854},
11696 {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880,
11697 {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904,
11698 33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933,
11699 {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946},
11700 {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971,
11701 {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996,
11702 {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014,
11703 {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046,
11704 {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069},
11705 {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084},
11706 {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114,
11707 {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135,
11708 {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149},
11709 {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168,
11710 {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189},
11711 34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205},
11712 {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232,
11713 {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257},
11714 34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278},
11715 {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300},
11716 {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322},
11717 {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339},
11718 34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365},
11719 {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397,
11720 {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413,
11721 {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446},
11722 34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475,
11723 {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491},
11724 {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514},
11725 {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528},
11726 {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549},
11727 {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571},
11728 {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591},
11729 34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607},
11730 {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620},
11731 {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646,
11732 34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671,
11733 {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687},
11734 {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702},
11735 {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723},
11736 {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748,
11737 {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764},
11738 {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785},
11739 34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803},
11740 {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820,
11741 {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839},
11742 {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867},
11743 {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881},
11744 {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906,
11745 34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929,
11746 {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950},
11747 {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963},
11748 {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988,
11749 {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005},
11750 {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024},
11751 35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040},
11752 {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061},
11753 {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080},
11754 {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100},
11755 {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127,
11756 {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141},
11757 {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173,
11758 {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184},
11759 {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202,
11760 {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216},
11761 {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234},
11762 {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248},
11763 {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277,
11764 {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300,
11765 {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319,
11766 {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343,
11767 {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358,
11768 {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371},
11769 {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383},
11770 {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399,
11771 {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417},
11772 {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431},
11773 35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453},
11774 {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476,
11775 {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495,
11776 {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507},
11777 {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520},
11778 35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536,
11779 {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557,
11780 {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577,
11781 35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595},
11782 35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614},
11783 {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630},
11784 {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658},
11785 {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687},
11786 {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704},
11787 {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727},
11788 35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792,
11789 35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914},
11790 {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931},
11791 {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963},
11792 {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981},
11793 {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003},
11794 {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041,
11795 {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069,
11796 {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095},
11797 {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119},
11798 36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204,
11799 {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226},
11800 {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246},
11801 {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265},
11802 {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293,
11803 {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316,
11804 {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333},
11805 {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358},
11806 36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373},
11807 {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402},
11808 {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419,
11809 {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438},
11810 {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458},
11811 36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477},
11812 36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501},
11813 36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519},
11814 {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539},
11815 {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565},
11816 {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588},
11817 {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616,
11818 {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640},
11819 {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660},
11820 {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675,
11821 {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693},
11822 36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768},
11823 {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789],
11824 {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806,
11825 {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832},
11826 36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853},
11827 {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883,
11828 36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912},
11829 {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931,
11830 {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957,
11831 36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975},
11832 36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001,
11833 {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020,
11834 {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042,
11835 37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062,
11836 {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076},
11837 {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100,
11838 37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113},
11839 {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139,
11840 37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151},
11841 {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175},
11842 {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203},
11843 {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222},
11844 37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256,
11845 37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271},
11846 {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302},
11847 {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334,
11848 {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352,
11849 {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378},
11850 {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394},
11851 {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423,
11852 {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441},
11853 {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458},
11854 37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471},
11855 {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493},
11856 37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510},
11857 {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531,
11858 {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551},
11859 {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574,
11860 {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587},
11861 37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618},
11862 37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634},
11863 {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654},
11864 {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673},
11865 {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687,
11866 {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708,
11867 {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724},
11868 {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745},
11869 {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763,
11870 {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776},
11871 37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807,
11872 {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817},
11873 {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838},
11874 {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861},
11875 {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892},
11876 {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914},
11877 {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935},
11878 37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952},
11879 {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973},
11880 {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001,
11881 {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038,
11882 38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176,
11883 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254,
11884 {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276},
11885 {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293},
11886 {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318},
11887 {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336},
11888 {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353},
11889 {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371},
11890 {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432,
11891 {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455},
11892 38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481},
11893 {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501},
11894 38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535,
11895 38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569,
11896 {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594},
11897 38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611},
11898 {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628},
11899 {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650,
11900 {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666},
11901 {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685,
11902 {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702},
11903 38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723,
11904 {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740},
11905 {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755},
11906 {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775},
11907 {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803,
11908 {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820},
11909 {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837},
11910 {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858,
11911 {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877,
11912 {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912,
11913 38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937},
11914 {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951},
11915 {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972,
11916 {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997},
11917 39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014,
11918 {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061,
11919 39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092},
11920 {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113},
11921 {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137,
11922 {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157},
11923 {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182},
11924 {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199},
11925 {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220},
11926 {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238},
11927 {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263},
11928 39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298},
11929 39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337},
11930 {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379,
11931 {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395},
11932 {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426},
11933 {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450},
11934 39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494},
11935 {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512},
11936 {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538,
11937 39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590,
11938 {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613},
11939 {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639,
11940 {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660,
11941 {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687,
11942 {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700},
11943 {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722},
11944 39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760,
11945 {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771},
11946 {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810,
11947 {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835},
11948 {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880,
11949 {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907,
11950 {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921},
11951 {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946},
11952 {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972,
11953 {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992,
11954 39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006},
11955 {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032},
11956 {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064,
11957 {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086},
11958 40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136},
11959 {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163},
11960 {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181,
11961 {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220,
11962 40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233},
11963 {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259},
11964 {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299,
11965 {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328,
11966 {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347},
11967 {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373},
11968 {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408,
11969 {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436},
11970 {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487,
11971 40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528,
11972 {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549,
11973 {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576},
11974 {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596},
11975 {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615},
11976 {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633},
11977 40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645},
11978 {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661},
11979 {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683},
11980 {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704},
11981 40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728,
11982 {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749},
11983 {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773},
11984 {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794},
11985 {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811,
11986 {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833},
11987 {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861},
11988 {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024,
11989 {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905,
11990 [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383,
11991 11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616,
11992 59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584,
11993 11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955,
11994 {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622,
11995 18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759,
11996 18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871,
11997 18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575,
11998 19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351,
11999 {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339},
12000 {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904,
12001 {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917},
12002 {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947},
12003 {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964},
12004 {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384},
12005 {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839},
12006 {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703},
12007 {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964},
12008 {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585},
12009 {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208},
12010 {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374},
12011 {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018},
12012 {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318},
12013 {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820,
12014 {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872},
12015 {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738},
12020 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
12021 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
12025 var ColorSpace = (function ColorSpaceClosure() {
12026 // Constructor should define this.numComps, this.defaultColor, this.name
12027 function ColorSpace() {
12028 error('should not call ColorSpace constructor');
12031 ColorSpace.prototype = {
12032 // Input: array of size numComps representing color component values
12033 // Output: array of rgb values, each value ranging from [0.1]
12034 getRgb: function ColorSpace_getRgb(color) {
12035 error('Should not call ColorSpace.getRgb: ' + color);
12037 // Input: Uint8Array of component values, each value scaled to [0,255]
12038 // Output: Uint8Array of rgb values, each value scaled to [0,255]
12039 getRgbBuffer: function ColorSpace_getRgbBuffer(input) {
12040 error('Should not call ColorSpace.getRgbBuffer: ' + input);
12044 ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
12045 var IR = ColorSpace.parseToIR(cs, xref, res);
12046 if (IR instanceof AlternateCS)
12049 return ColorSpace.fromIR(IR);
12052 ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
12053 var name = isArray(IR) ? IR[0] : IR;
12056 case 'DeviceGrayCS':
12057 return new DeviceGrayCS();
12058 case 'DeviceRgbCS':
12059 return new DeviceRgbCS();
12060 case 'DeviceCmykCS':
12061 return new DeviceCmykCS();
12063 var basePatternCS = IR[1];
12065 basePatternCS = ColorSpace.fromIR(basePatternCS);
12066 return new PatternCS(basePatternCS);
12068 var baseIndexedCS = IR[1];
12070 var lookup = IR[3];
12071 return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
12072 case 'AlternateCS':
12073 var numComps = IR[1];
12075 var tintFnIR = IR[3];
12077 return new AlternateCS(numComps, ColorSpace.fromIR(alt),
12078 PDFFunction.fromIR(tintFnIR));
12080 var whitePoint = IR[1].WhitePoint;
12081 var blackPoint = IR[1].BlackPoint;
12082 var range = IR[1].Range;
12083 return new LabCS(whitePoint, blackPoint, range);
12085 error('Unkown name ' + name);
12090 ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
12092 var colorSpaces = res.get('ColorSpace');
12093 if (isDict(colorSpaces)) {
12094 var refcs = colorSpaces.get(cs.name);
12100 cs = xref.fetchIfRef(cs);
12110 return 'DeviceGrayCS';
12113 return 'DeviceRgbCS';
12116 return 'DeviceCmykCS';
12118 return ['PatternCS', null];
12120 error('unrecognized colorspace ' + mode);
12122 } else if (isArray(cs)) {
12129 return 'DeviceGrayCS';
12132 return 'DeviceRgbCS';
12135 return 'DeviceCmykCS';
12137 return 'DeviceGrayCS';
12139 return 'DeviceRgbCS';
12141 var stream = xref.fetchIfRef(cs[1]);
12142 var dict = stream.dict;
12143 var numComps = dict.get('N');
12145 return 'DeviceGrayCS';
12147 return 'DeviceRgbCS';
12149 return 'DeviceCmykCS';
12152 var basePatternCS = cs[1];
12154 basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
12155 return ['PatternCS', basePatternCS];
12158 var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
12159 var hiVal = cs[2] + 1;
12160 var lookup = xref.fetchIfRef(cs[3]);
12161 return ['IndexedCS', baseIndexedCS, hiVal, lookup];
12168 else if (isArray(name))
12169 numComps = name.length;
12170 var alt = ColorSpace.parseToIR(cs[2], xref, res);
12171 var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
12172 return ['AlternateCS', numComps, alt, tintFnIR];
12174 var params = cs[1].getAll();
12175 return ['LabCS', params];
12177 error('unimplemented color space object "' + mode + '"');
12180 error('unrecognized color space object: "' + cs + '"');
12185 * Checks if a decode map matches the default decode map for a color space.
12186 * This handles the general decode maps where there are two values per
12187 * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
12188 * This does not handle Lab, Indexed, or Pattern decode maps since they are
12189 * slightly different.
12190 * @param {Array} decode Decode map (usually from an image).
12191 * @param {Number} n Number of components the color space has.
12193 ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
12197 if (n * 2 !== decode.length) {
12198 warning('The decode map is not the correct length');
12201 for (var i = 0, ii = decode.length; i < ii; i += 2) {
12202 if (decode[i] != 0 || decode[i + 1] != 1)
12212 * Alternate color space handles both Separation and DeviceN color spaces. A
12213 * Separation color space is actually just a DeviceN with one color component.
12214 * Both color spaces use a tinting function to convert colors to a base color
12217 var AlternateCS = (function AlternateCSClosure() {
12218 function AlternateCS(numComps, base, tintFn) {
12219 this.name = 'Alternate';
12220 this.numComps = numComps;
12221 this.defaultColor = [];
12222 for (var i = 0; i < numComps; ++i)
12223 this.defaultColor.push(1);
12225 this.tintFn = tintFn;
12228 AlternateCS.prototype = {
12229 getRgb: function AlternateCS_getRgb(color) {
12230 var tinted = this.tintFn(color);
12231 return this.base.getRgb(tinted);
12233 getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) {
12234 var tintFn = this.tintFn;
12235 var base = this.base;
12236 var scale = 1 / ((1 << bits) - 1);
12237 var length = input.length;
12239 var baseNumComps = base.numComps;
12240 var baseBuf = new Uint8Array(baseNumComps * length);
12241 var numComps = this.numComps;
12244 for (var i = 0; i < length; i += numComps) {
12245 for (var z = 0; z < numComps; ++z)
12246 scaled[z] = input[i + z] * scale;
12248 var tinted = tintFn(scaled);
12249 for (var j = 0; j < baseNumComps; ++j)
12250 baseBuf[pos++] = 255 * tinted[j];
12252 return base.getRgbBuffer(baseBuf, 8);
12254 isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
12255 return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12259 return AlternateCS;
12262 var PatternCS = (function PatternCSClosure() {
12263 function PatternCS(baseCS) {
12264 this.name = 'Pattern';
12265 this.base = baseCS;
12267 PatternCS.prototype = {};
12272 var IndexedCS = (function IndexedCSClosure() {
12273 function IndexedCS(base, highVal, lookup) {
12274 this.name = 'Indexed';
12276 this.defaultColor = [0];
12278 this.highVal = highVal;
12280 var baseNumComps = base.numComps;
12281 var length = baseNumComps * highVal;
12282 var lookupArray = new Uint8Array(length);
12284 if (isStream(lookup)) {
12285 var bytes = lookup.getBytes(length);
12286 lookupArray.set(bytes);
12287 } else if (isString(lookup)) {
12288 for (var i = 0; i < length; ++i)
12289 lookupArray[i] = lookup.charCodeAt(i);
12291 error('Unrecognized lookup table: ' + lookup);
12293 this.lookup = lookupArray;
12296 IndexedCS.prototype = {
12297 getRgb: function IndexedCS_getRgb(color) {
12298 var numComps = this.base.numComps;
12299 var start = color[0] * numComps;
12302 for (var i = start, ii = start + numComps; i < ii; ++i)
12303 c.push(this.lookup[i]);
12305 return this.base.getRgb(c);
12307 getRgbBuffer: function IndexedCS_getRgbBuffer(input) {
12308 var base = this.base;
12309 var numComps = base.numComps;
12310 var lookup = this.lookup;
12311 var length = input.length;
12312 var baseBuf = new Uint8Array(length * numComps);
12313 var baseBufPos = 0;
12315 for (var i = 0; i < length; ++i) {
12316 var lookupPos = input[i] * numComps;
12317 for (var j = 0; j < numComps; ++j) {
12318 baseBuf[baseBufPos++] = lookup[lookupPos + j];
12322 return base.getRgbBuffer(baseBuf, 8);
12324 isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
12325 // indexed color maps shouldn't be changed
12332 var DeviceGrayCS = (function DeviceGrayCSClosure() {
12333 function DeviceGrayCS() {
12334 this.name = 'DeviceGray';
12336 this.defaultColor = [0];
12339 DeviceGrayCS.prototype = {
12340 getRgb: function DeviceGrayCS_getRgb(color) {
12344 getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) {
12345 var scale = 255 / ((1 << bits) - 1);
12346 var length = input.length;
12347 var rgbBuf = new Uint8Array(length * 3);
12348 for (var i = 0, j = 0; i < length; ++i) {
12349 var c = (scale * input[i]) | 0;
12356 isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
12357 return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12360 return DeviceGrayCS;
12363 var DeviceRgbCS = (function DeviceRgbCSClosure() {
12364 function DeviceRgbCS() {
12365 this.name = 'DeviceRGB';
12367 this.defaultColor = [0, 0, 0];
12369 DeviceRgbCS.prototype = {
12370 getRgb: function DeviceRgbCS_getRgb(color) {
12373 getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) {
12376 var scale = 255 / ((1 << bits) - 1);
12377 var i, length = input.length;
12378 var rgbBuf = new Uint8Array(length);
12379 for (i = 0; i < length; ++i)
12380 rgbBuf[i] = (scale * input[i]) | 0;
12383 isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
12384 return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12387 return DeviceRgbCS;
12390 var DeviceCmykCS = (function DeviceCmykCSClosure() {
12391 function DeviceCmykCS() {
12392 this.name = 'DeviceCMYK';
12394 this.defaultColor = [0, 0, 0, 1];
12396 DeviceCmykCS.prototype = {
12397 getRgb: function DeviceCmykCS_getRgb(color) {
12398 var c = color[0], m = color[1], y = color[2], k = color[3];
12400 // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14
12401 c = (c * (1 - k) + k);
12402 m = (m * (1 - k) + k);
12403 y = (y * (1 - k) + k);
12405 // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12
12412 getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) {
12413 var scale = 1 / ((1 << bits) - 1);
12414 var length = colorBuf.length / 4;
12415 var rgbBuf = new Uint8Array(length * 3);
12417 var colorBufPos = 0;
12419 for (var i = 0; i < length; i++) {
12421 for (var j = 0; j < 4; ++j)
12422 cmyk.push(scale * colorBuf[colorBufPos++]);
12424 var rgb = this.getRgb(cmyk);
12425 for (var j = 0; j < 3; ++j)
12426 rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255);
12431 isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
12432 return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12436 return DeviceCmykCS;
12440 // LabCS: Based on "PDF Reference, Sixth Ed", p.250
12442 var LabCS = (function LabCSClosure() {
12443 function LabCS(whitePoint, blackPoint, range) {
12446 this.defaultColor = [0, 0, 0];
12449 error('WhitePoint missing - required for color space Lab');
12450 blackPoint = blackPoint || [0, 0, 0];
12451 range = range || [-100, 100, -100, 100];
12453 // Translate args to spec variables
12454 this.XW = whitePoint[0];
12455 this.YW = whitePoint[1];
12456 this.ZW = whitePoint[2];
12457 this.amin = range[0];
12458 this.amax = range[1];
12459 this.bmin = range[2];
12460 this.bmax = range[3];
12462 // These are here just for completeness - the spec doesn't offer any
12463 // formulas that use BlackPoint in Lab
12464 this.XB = blackPoint[0];
12465 this.YB = blackPoint[1];
12466 this.ZB = blackPoint[2];
12468 // Validate vars as per spec
12469 if (this.XW < 0 || this.ZW < 0 || this.YW !== 1)
12470 error('Invalid WhitePoint components, no fallback available');
12472 if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
12473 warn('Invalid BlackPoint, falling back to default');
12474 this.XB = this.YB = this.ZB = 0;
12477 if (this.amin > this.amax || this.bmin > this.bmax) {
12478 warn('Invalid Range, falling back to defaults');
12486 // Function g(x) from spec
12491 return (108 / 841) * (x - 4 / 29);
12494 LabCS.prototype = {
12495 getRgb: function LabCS_getRgb(color) {
12496 // Ls,as,bs <---> L*,a*,b* in the spec
12497 var Ls = color[0], as = color[1], bs = color[2];
12499 // Adjust limits of 'as' and 'bs'
12500 as = as > this.amax ? this.amax : as;
12501 as = as < this.amin ? this.amin : as;
12502 bs = bs > this.bmax ? this.bmax : bs;
12503 bs = bs < this.bmin ? this.bmin : bs;
12505 // Computes intermediate variables X,Y,Z as per spec
12506 var M = (Ls + 16) / 116;
12507 var L = M + (as / 500);
12508 var N = M - (bs / 200);
12509 var X = this.XW * g(L);
12510 var Y = this.YW * g(M);
12511 var Z = this.ZW * g(N);
12513 // XYZ to RGB 3x3 matrix, from:
12514 // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18
12515 var XYZtoRGB = [3.240479, -1.537150, -0.498535,
12516 -0.969256, 1.875992, 0.041556,
12517 0.055648, -0.204043, 1.057311];
12519 return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]);
12521 getRgbBuffer: function LabCS_getRgbBuffer(input, bits) {
12524 var scale = 255 / ((1 << bits) - 1);
12525 var i, length = input.length / 3;
12526 var rgbBuf = new Uint8Array(length);
12529 for (i = 0; i < length; ++i) {
12530 // Convert L*, a*, s* into RGB
12531 var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]);
12532 rgbBuf[j++] = rgb[0];
12533 rgbBuf[j++] = rgb[1];
12534 rgbBuf[j++] = rgb[2];
12539 isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
12540 // From Table 90 in Adobe's:
12541 // "Document management - Portable document format", 1st ed, 2008
12542 if (decodeMap[0] === 0 && decodeMap[1] === 100 &&
12543 decodeMap[2] === this.amin && decodeMap[3] === this.amax &&
12544 decodeMap[4] === this.bmin && decodeMap[5] === this.bmax)
12553 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
12554 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
12558 var ARCFourCipher = (function ARCFourCipherClosure() {
12559 function ARCFourCipher(key) {
12562 var s = new Uint8Array(256);
12563 var i, j = 0, tmp, keyLength = key.length;
12564 for (i = 0; i < 256; ++i)
12566 for (i = 0; i < 256; ++i) {
12568 j = (j + tmp + key[i % keyLength]) & 0xFF;
12575 ARCFourCipher.prototype = {
12576 encryptBlock: function ARCFourCipher_encryptBlock(data) {
12577 var i, n = data.length, tmp, tmp2;
12578 var a = this.a, b = this.b, s = this.s;
12579 var output = new Uint8Array(n);
12580 for (i = 0; i < n; ++i) {
12581 a = (a + 1) & 0xFF;
12583 b = (b + tmp) & 0xFF;
12587 output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
12594 ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
12596 return ARCFourCipher;
12599 var calculateMD5 = (function calculateMD5Closure() {
12600 var r = new Uint8Array([
12601 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
12602 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
12603 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
12604 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
12606 var k = new Int32Array([
12607 -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
12608 -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
12609 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
12610 643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
12611 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
12612 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
12613 -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
12614 -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
12615 -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
12616 -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
12617 -145523070, -1120210379, 718787259, -343485551]);
12619 function hash(data, offset, length) {
12620 var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
12622 var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
12623 var padded = new Uint8Array(paddedLength);
12625 for (i = 0; i < length; ++i)
12626 padded[i] = data[offset++];
12627 padded[i++] = 0x80;
12628 n = paddedLength - 8;
12631 padded[i++] = (length << 3) & 0xFF;
12632 padded[i++] = (length >> 5) & 0xFF;
12633 padded[i++] = (length >> 13) & 0xFF;
12634 padded[i++] = (length >> 21) & 0xFF;
12635 padded[i++] = (length >>> 29) & 0xFF;
12640 // TODO ArrayBuffer ?
12641 var w = new Int32Array(16);
12642 for (i = 0; i < paddedLength;) {
12643 for (j = 0; j < 16; ++j, i += 4) {
12644 w[j] = (padded[i] | (padded[i + 1] << 8) |
12645 (padded[i + 2] << 16) | (padded[i + 3] << 24));
12647 var a = h0, b = h1, c = h2, d = h3, f, g;
12648 for (j = 0; j < 64; ++j) {
12650 f = (b & c) | ((~b) & d);
12652 } else if (j < 32) {
12653 f = (d & b) | ((~d) & c);
12654 g = (5 * j + 1) & 15;
12655 } else if (j < 48) {
12657 g = (3 * j + 5) & 15;
12659 f = c ^ (b | (~d));
12662 var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
12665 b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
12673 return new Uint8Array([
12674 h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
12675 h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
12676 h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
12677 h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
12683 var NullCipher = (function NullCipherClosure() {
12684 function NullCipher() {
12687 NullCipher.prototype = {
12688 decryptBlock: function NullCipher_decryptBlock(data) {
12696 var AES128Cipher = (function AES128CipherClosure() {
12697 var rcon = new Uint8Array([
12698 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
12699 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
12700 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
12701 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
12702 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
12703 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
12704 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
12705 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
12706 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
12707 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
12708 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
12709 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
12710 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
12711 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
12712 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
12713 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
12714 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
12715 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
12716 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
12717 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
12718 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
12719 0x74, 0xe8, 0xcb, 0x8d]);
12721 var s = new Uint8Array([
12722 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
12723 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
12724 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
12725 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
12726 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
12727 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
12728 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
12729 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
12730 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
12731 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
12732 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
12733 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
12734 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
12735 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
12736 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
12737 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
12738 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
12739 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
12740 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
12741 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
12742 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
12743 0xb0, 0x54, 0xbb, 0x16]);
12745 var inv_s = new Uint8Array([
12746 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
12747 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
12748 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
12749 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
12750 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
12751 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
12752 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
12753 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
12754 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
12755 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
12756 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
12757 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
12758 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
12759 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
12760 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
12761 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
12762 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
12763 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
12764 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
12765 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
12766 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
12767 0x55, 0x21, 0x0c, 0x7d]);
12769 var mix = new Uint32Array([
12770 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
12771 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
12772 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
12773 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
12774 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
12775 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
12776 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
12777 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
12778 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
12779 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
12780 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
12781 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
12782 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
12783 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
12784 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
12785 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
12786 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
12787 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
12788 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
12789 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
12790 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
12791 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
12792 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
12793 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
12794 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
12795 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
12796 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
12797 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
12798 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
12799 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
12800 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
12801 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
12802 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
12803 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
12804 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
12805 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
12806 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
12807 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
12808 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
12809 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
12810 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
12811 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
12812 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
12814 function expandKey128(cipherKey) {
12815 var b = 176, result = new Uint8Array(b);
12816 result.set(cipherKey);
12817 for (var j = 16, i = 1; j < b; ++i) {
12819 var t1 = result[j - 3], t2 = result[j - 2],
12820 t3 = result[j - 1], t4 = result[j - 4];
12822 t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
12825 for (var n = 0; n < 4; ++n) {
12826 result[j] = (t1 ^= result[j - 16]); j++;
12827 result[j] = (t2 ^= result[j - 16]); j++;
12828 result[j] = (t3 ^= result[j - 16]); j++;
12829 result[j] = (t4 ^= result[j - 16]); j++;
12835 function decrypt128(input, key) {
12836 var state = new Uint8Array(16);
12841 for (j = 0, k = 160; j < 16; ++j, ++k)
12842 state[j] ^= key[k];
12843 for (i = 9; i >= 1; --i) {
12845 t = state[13]; state[13] = state[9]; state[9] = state[5];
12846 state[5] = state[1]; state[1] = t;
12847 t = state[14]; u = state[10]; state[14] = state[6];
12848 state[10] = state[2]; state[6] = t; state[2] = u;
12849 t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
12850 state[11] = t; state[7] = u; state[3] = v;
12852 for (j = 0; j < 16; ++j)
12853 state[j] = inv_s[state[j]];
12855 for (j = 0, k = i * 16; j < 16; ++j, ++k)
12856 state[j] ^= key[k];
12858 for (j = 0; j < 16; j += 4) {
12859 var s0 = mix[state[j]], s1 = mix[state[j + 1]],
12860 s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
12861 t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
12862 (s3 >>> 24) ^ (s3 << 8));
12863 state[j] = (t >>> 24) & 0xFF;
12864 state[j + 1] = (t >> 16) & 0xFF;
12865 state[j + 2] = (t >> 8) & 0xFF;
12866 state[j + 3] = t & 0xFF;
12870 t = state[13]; state[13] = state[9]; state[9] = state[5];
12871 state[5] = state[1]; state[1] = t;
12872 t = state[14]; u = state[10]; state[14] = state[6];
12873 state[10] = state[2]; state[6] = t; state[2] = u;
12874 t = state[15]; u = state[11]; v = state[7]; state[15] = state[3];
12875 state[11] = t; state[7] = u; state[3] = v;
12876 for (j = 0; j < 16; ++j) {
12878 state[j] = inv_s[state[j]];
12880 state[j] ^= key[j];
12885 function AES128Cipher(key) {
12886 this.key = expandKey128(key);
12887 this.buffer = new Uint8Array(16);
12888 this.bufferPosition = 0;
12891 function decryptBlock2(data) {
12892 var i, j, ii, sourceLength = data.length,
12893 buffer = this.buffer, bufferLength = this.bufferPosition,
12894 result = [], iv = this.iv;
12895 for (i = 0; i < sourceLength; ++i) {
12896 buffer[bufferLength] = data[i];
12898 if (bufferLength < 16)
12900 // buffer is full, decrypting
12901 var plain = decrypt128(buffer, this.key);
12902 // xor-ing the IV vector to get plain text
12903 for (j = 0; j < 16; ++j)
12906 result.push(plain);
12907 buffer = new Uint8Array(16);
12910 // saving incomplete buffer
12911 this.buffer = buffer;
12912 this.bufferLength = bufferLength;
12914 if (result.length == 0)
12915 return new Uint8Array([]);
12916 if (result.length == 1)
12918 // combining plain text blocks into one
12919 var output = new Uint8Array(16 * result.length);
12920 for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16)
12921 output.set(result[i], j);
12925 AES128Cipher.prototype = {
12926 decryptBlock: function AES128Cipher_decryptBlock(data) {
12927 var i, sourceLength = data.length;
12928 var buffer = this.buffer, bufferLength = this.bufferPosition;
12929 // waiting for IV values -- they are at the start of the stream
12930 for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength)
12931 buffer[bufferLength] = data[i];
12932 if (bufferLength < 16) {
12934 this.bufferLength = bufferLength;
12935 return new Uint8Array([]);
12938 this.buffer = new Uint8Array(16);
12939 this.bufferLength = 0;
12940 // starting decryption
12941 this.decryptBlock = decryptBlock2;
12942 return this.decryptBlock(data.subarray(16));
12946 return AES128Cipher;
12949 var CipherTransform = (function CipherTransformClosure() {
12950 function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
12951 this.stringCipherConstructor = stringCipherConstructor;
12952 this.streamCipherConstructor = streamCipherConstructor;
12954 CipherTransform.prototype = {
12955 createStream: function CipherTransform_createStream(stream) {
12956 var cipher = new this.streamCipherConstructor();
12957 return new DecryptStream(stream,
12958 function cipherTransformDecryptStream(data) {
12959 return cipher.decryptBlock(data);
12963 decryptString: function CipherTransform_decryptString(s) {
12964 var cipher = new this.stringCipherConstructor();
12965 var data = stringToBytes(s);
12966 data = cipher.decryptBlock(data);
12967 return bytesToString(data);
12970 return CipherTransform;
12973 var CipherTransformFactory = (function CipherTransformFactoryClosure() {
12974 function prepareKeyData(fileId, password, ownerPassword, userPassword,
12975 flags, revision, keyLength, encryptMetadata) {
12976 var defaultPasswordBytes = new Uint8Array([
12977 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
12978 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
12979 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
12980 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
12981 var hashData = new Uint8Array(100), i = 0, j, n;
12983 n = Math.min(32, password.length);
12985 hashData[i] = password[i];
12989 hashData[i++] = defaultPasswordBytes[j++];
12991 // as now the padded password in the hashData[0..i]
12992 for (j = 0, n = ownerPassword.length; j < n; ++j)
12993 hashData[i++] = ownerPassword[j];
12994 hashData[i++] = flags & 0xFF;
12995 hashData[i++] = (flags >> 8) & 0xFF;
12996 hashData[i++] = (flags >> 16) & 0xFF;
12997 hashData[i++] = (flags >>> 24) & 0xFF;
12998 for (j = 0, n = fileId.length; j < n; ++j)
12999 hashData[i++] = fileId[j];
13000 if (revision >= 4 && !encryptMetadata) {
13001 hashData[i++] = 0xFF;
13002 hashData[i++] = 0xFF;
13003 hashData[i++] = 0xFF;
13004 hashData[i++] = 0xFF;
13006 var hash = calculateMD5(hashData, 0, i);
13007 var keyLengthInBytes = keyLength >> 3;
13008 if (revision >= 3) {
13009 for (j = 0; j < 50; ++j) {
13010 hash = calculateMD5(hash, 0, keyLengthInBytes);
13013 var encryptionKey = hash.subarray(0, keyLengthInBytes);
13014 var cipher, checkData;
13016 if (revision >= 3) {
13017 // padded password in hashData, we can use this array for user
13020 for (j = 0, n = fileId.length; j < n; ++j)
13021 hashData[i++] = fileId[j];
13022 cipher = new ARCFourCipher(encryptionKey);
13023 var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
13024 n = encryptionKey.length;
13025 var derivedKey = new Uint8Array(n), k;
13026 for (j = 1; j <= 19; ++j) {
13027 for (k = 0; k < n; ++k)
13028 derivedKey[k] = encryptionKey[k] ^ j;
13029 cipher = new ARCFourCipher(derivedKey);
13030 checkData = cipher.encryptBlock(checkData);
13033 cipher = new ARCFourCipher(encryptionKey);
13034 checkData = cipher.encryptBlock(hashData.subarray(0, 32));
13036 for (j = 0, n = checkData.length; j < n; ++j) {
13037 if (userPassword[j] != checkData[j])
13038 error('incorrect password');
13040 return encryptionKey;
13043 var identityName = new Name('Identity');
13045 function CipherTransformFactory(dict, fileId, password) {
13046 var filter = dict.get('Filter');
13047 if (!isName(filter) || filter.name != 'Standard')
13048 error('unknown encryption method');
13050 var algorithm = dict.get('V');
13051 if (!isInt(algorithm) ||
13052 (algorithm != 1 && algorithm != 2 && algorithm != 4))
13053 error('unsupported encryption algorithm');
13054 this.algorithm = algorithm;
13055 var keyLength = dict.get('Length') || 40;
13056 if (!isInt(keyLength) ||
13057 keyLength < 40 || (keyLength % 8) != 0)
13058 error('invalid key length');
13060 var ownerPassword = stringToBytes(dict.get('O'));
13061 var userPassword = stringToBytes(dict.get('U'));
13062 var flags = dict.get('P');
13063 var revision = dict.get('R');
13064 var encryptMetadata =
13065 dict.get('EncryptMetadata') !== false; // makes true as default value
13066 var fileIdBytes = stringToBytes(fileId);
13069 passwordBytes = stringToBytes(password);
13071 this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
13072 ownerPassword, userPassword,
13074 keyLength, encryptMetadata);
13075 if (algorithm == 4) {
13076 this.cf = dict.get('CF');
13077 this.stmf = dict.get('StmF') || identityName;
13078 this.strf = dict.get('StrF') || identityName;
13079 this.eff = dict.get('EFF') || this.strf;
13083 function buildObjectKey(num, gen, encryptionKey, isAes) {
13084 var key = new Uint8Array(encryptionKey.length + 9), i, n;
13085 for (i = 0, n = encryptionKey.length; i < n; ++i)
13086 key[i] = encryptionKey[i];
13087 key[i++] = num & 0xFF;
13088 key[i++] = (num >> 8) & 0xFF;
13089 key[i++] = (num >> 16) & 0xFF;
13090 key[i++] = gen & 0xFF;
13091 key[i++] = (gen >> 8) & 0xFF;
13098 var hash = calculateMD5(key, 0, i);
13099 return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
13102 function buildCipherConstructor(cf, name, num, gen, key) {
13103 var cryptFilter = cf.get(name.name);
13105 if (cryptFilter != null)
13106 cfm = cryptFilter.get('CFM');
13107 if (!cfm || cfm.name == 'None') {
13108 return function cipherTransformFactoryBuildCipherConstructorNone() {
13109 return new NullCipher();
13112 if ('V2' == cfm.name) {
13113 return function cipherTransformFactoryBuildCipherConstructorV2() {
13114 return new ARCFourCipher(
13115 buildObjectKey(num, gen, key, false));
13118 if ('AESV2' == cfm.name) {
13119 return function cipherTransformFactoryBuildCipherConstructorAESV2() {
13120 return new AES128Cipher(
13121 buildObjectKey(num, gen, key, true));
13124 error('Unknown crypto method');
13127 CipherTransformFactory.prototype = {
13128 createCipherTransform:
13129 function CipherTransformFactory_createCipherTransform(num, gen) {
13130 if (this.algorithm == 4) {
13131 return new CipherTransform(
13132 buildCipherConstructor(this.cf, this.stmf,
13133 num, gen, this.encryptionKey),
13134 buildCipherConstructor(this.cf, this.strf,
13135 num, gen, this.encryptionKey));
13137 // algorithms 1 and 2
13138 var key = buildObjectKey(num, gen, this.encryptionKey, false);
13139 var cipherConstructor = function buildCipherCipherConstructor() {
13140 return new ARCFourCipher(key);
13142 return new CipherTransform(cipherConstructor, cipherConstructor);
13146 return CipherTransformFactory;
13150 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
13151 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
13155 var PartialEvaluator = (function PartialEvaluatorClosure() {
13156 function PartialEvaluator(xref, handler, uniquePrefix) {
13157 this.state = new EvalState();
13158 this.stateStack = [];
13161 this.handler = handler;
13162 this.uniquePrefix = uniquePrefix;
13163 this.objIdCounter = 0;
13171 M: 'setMiterLimit',
13173 ri: 'setRenderingIntent',
13194 'B*': 'eoFillStroke',
13195 b: 'closeFillStroke',
13196 'b*': 'closeEOFillStroke',
13206 Tc: 'setCharSpacing',
13207 Tw: 'setWordSpacing',
13211 Tr: 'setTextRenderingMode',
13214 TD: 'setLeadingMoveText',
13215 Tm: 'setTextMatrix',
13218 TJ: 'showSpacedText',
13219 "'": 'nextLineShowText',
13220 '"': 'nextLineSetSpacingShowText',
13223 d0: 'setCharWidth',
13224 d1: 'setCharWidthAndBounds',
13227 CS: 'setStrokeColorSpace',
13228 cs: 'setFillColorSpace',
13229 SC: 'setStrokeColor',
13230 SCN: 'setStrokeColorN',
13231 sc: 'setFillColor',
13232 scn: 'setFillColorN',
13233 G: 'setStrokeGray',
13235 RG: 'setStrokeRGBColor',
13236 rg: 'setFillRGBColor',
13237 K: 'setStrokeCMYKColor',
13238 k: 'setFillCMYKColor',
13244 BI: 'beginInlineImage',
13245 ID: 'beginImageData',
13246 EI: 'endInlineImage',
13249 Do: 'paintXObject',
13253 DP: 'markPointProps',
13254 BMC: 'beginMarkedContent',
13255 BDC: 'beginMarkedContentProps',
13256 EMC: 'endMarkedContent',
13263 function splitCombinedOperations(operations) {
13264 // Two operations can be combined together, trying to find which two
13265 // operations were concatenated.
13266 for (var i = operations.length - 1; i > 0; i--) {
13267 var op1 = operations.substring(0, i), op2 = operations.substring(i);
13268 if (op1 in OP_MAP && op2 in OP_MAP)
13269 return [op1, op2]; // operations found
13274 PartialEvaluator.prototype = {
13275 getOperatorList: function PartialEvaluator_getOperatorList(stream,
13281 var xref = this.xref;
13282 var handler = this.handler;
13283 var uniquePrefix = this.uniquePrefix || '';
13285 function insertDependency(depList) {
13286 fnArray.push('dependency');
13287 argsArray.push(depList);
13288 for (var i = 0, ii = depList.length; i < ii; i++) {
13289 var dep = depList[i];
13290 if (dependency.indexOf(dep) == -1) {
13291 dependency.push(depList[i]);
13296 function handleSetFont(fontName, font) {
13297 var loadedName = null;
13299 var fontRes = resources.get('Font');
13301 assert(fontRes, 'fontRes not available');
13303 font = xref.fetchIfRef(font) || fontRes.get(fontName);
13304 assertWellFormed(isDict(font));
13305 ++self.objIdCounter;
13306 if (!font.translated) {
13307 font.translated = self.translateFont(font, xref, resources,
13309 if (font.translated) {
13310 // keep track of each font we translated so the caller can
13311 // load them asynchronously before calling display on a page
13312 loadedName = 'font_' + uniquePrefix + self.objIdCounter;
13313 font.translated.properties.loadedName = loadedName;
13314 font.loadedName = loadedName;
13316 var translated = font.translated;
13317 // Convert the file to an ArrayBuffer which will be turned back into
13318 // a Stream in the main thread.
13319 if (translated.file)
13320 translated.file = translated.file.getBytes();
13321 if (translated.properties.file) {
13322 translated.properties.file =
13323 translated.properties.file.getBytes();
13326 handler.send('obj', [
13331 translated.properties
13335 loadedName = loadedName || font.loadedName;
13337 // Ensure the font is ready before the font is set
13338 // and later on used for drawing.
13339 // OPTIMIZE: This should get insert to the operatorList only once per
13341 insertDependency([loadedName]);
13345 function buildPaintImageXObject(image, inline) {
13346 var dict = image.dict;
13347 var w = dict.get('Width', 'W');
13348 var h = dict.get('Height', 'H');
13350 var imageMask = dict.get('ImageMask', 'IM') || false;
13352 // This depends on a tmpCanvas beeing filled with the
13353 // current fillStyle, such that processing the pixel
13354 // data can't be done here. Instead of creating a
13355 // complete PDFImage, only read the information needed
13358 var width = dict.get('Width', 'W');
13359 var height = dict.get('Height', 'H');
13360 var bitStrideLength = (width + 7) >> 3;
13361 var imgArray = image.getBytes(bitStrideLength * height);
13362 var decode = dict.get('Decode', 'D');
13363 var inverseDecode = !!decode && decode[0] > 0;
13365 fn = 'paintImageMaskXObject';
13366 args = [imgArray, inverseDecode, width, height];
13370 // If there is no imageMask, create the PDFImage and a lot
13371 // of image processing can be done here.
13372 var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
13373 insertDependency([objId]);
13374 args = [objId, w, h];
13376 var softMask = dict.get('SMask', 'IM') || false;
13377 if (!softMask && image instanceof JpegStream &&
13378 image.isNativelySupported(xref, resources)) {
13379 // These JPEGs don't need any more processing so we can just send it.
13380 fn = 'paintJpegXObject';
13381 handler.send('obj', [objId, 'JpegStream', image.getIR()]);
13385 fn = 'paintImageXObject';
13387 PDFImage.buildImage(function(imageObj) {
13388 var drawWidth = imageObj.drawWidth;
13389 var drawHeight = imageObj.drawHeight;
13392 height: drawHeight,
13393 data: new Uint8Array(drawWidth * drawHeight * 4)
13395 var pixels = imgData.data;
13396 imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight);
13397 handler.send('obj', [objId, 'Image', imgData]);
13398 }, handler, xref, resources, image, inline);
13404 if (!queue.argsArray) {
13405 queue.argsArray = [];
13407 if (!queue.fnArray) {
13408 queue.fnArray = [];
13411 var fnArray = queue.fnArray, argsArray = queue.argsArray;
13412 var dependencyArray = dependency || [];
13414 resources = resources || new Dict();
13415 var xobjs = resources.get('XObject') || new Dict();
13416 var patterns = resources.get('Pattern') || new Dict();
13417 var parser = new Parser(new Lexer(stream), false, xref);
13418 var res = resources;
13419 var hasNextObj = false, nextObj;
13420 var args = [], obj;
13421 var TILING_PATTERN = 1, SHADING_PATTERN = 2;
13426 hasNextObj = false;
13428 obj = parser.getObj();
13435 var fn = OP_MAP[cmd];
13437 // invalid content command, trying to recover
13438 var cmds = splitCombinedOperations(cmd);
13442 // feeding other command on the next interation
13444 nextObj = Cmd.get(cmds[1]);
13447 assertWellFormed(fn, 'Unknown command "' + cmd + '"');
13448 // TODO figure out how to type-check vararg functions
13450 if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) {
13451 // compile tiling patterns
13452 var patternName = args[args.length - 1];
13453 // SCN/scn applies patterns along with normal colors
13454 if (isName(patternName)) {
13455 var pattern = patterns.get(patternName.name);
13457 var dict = isStream(pattern) ? pattern.dict : pattern;
13458 var typeNum = dict.get('PatternType');
13460 if (typeNum == TILING_PATTERN) {
13461 // Create an IR of the pattern code.
13462 var depIdx = dependencyArray.length;
13463 var operatorList = this.getOperatorList(pattern,
13464 dict.get('Resources') || resources, dependencyArray);
13466 // Add the dependencies that are required to execute the
13468 insertDependency(dependencyArray.slice(depIdx));
13470 args = TilingPattern.getIR(operatorList, dict, args);
13472 else if (typeNum == SHADING_PATTERN) {
13473 var shading = dict.get('Shading');
13474 var matrix = dict.get('Matrix');
13475 var pattern = Pattern.parseShading(shading, matrix, xref,
13477 args = pattern.getIR();
13479 error('Unkown PatternType ' + typeNum);
13483 } else if (cmd == 'Do' && !args[0].code) {
13484 // eagerly compile XForm objects
13485 var name = args[0].name;
13486 var xobj = xobjs.get(name);
13488 assertWellFormed(isStream(xobj), 'XObject should be a stream');
13490 var type = xobj.dict.get('Subtype');
13493 'XObject should have a Name subtype'
13496 if ('Form' == type.name) {
13497 var matrix = xobj.dict.get('Matrix');
13498 var bbox = xobj.dict.get('BBox');
13500 fnArray.push('paintFormXObjectBegin');
13501 argsArray.push([matrix, bbox]);
13503 // This adds the operatorList of the xObj to the current queue.
13504 var depIdx = dependencyArray.length;
13506 // Pass in the current `queue` object. That means the `fnArray`
13507 // and the `argsArray` in this scope is reused and new commands
13508 // are added to them.
13509 this.getOperatorList(xobj,
13510 xobj.dict.get('Resources') || resources,
13511 dependencyArray, queue);
13513 // Add the dependencies that are required to execute the
13515 insertDependency(dependencyArray.slice(depIdx));
13517 fn = 'paintFormXObjectEnd';
13519 } else if ('Image' == type.name) {
13520 buildPaintImageXObject(xobj, false);
13522 error('Unhandled XObject subtype ' + type.name);
13525 } else if (cmd == 'Tf') { // eagerly collect all fonts
13526 args[0] = handleSetFont(args[0].name);
13527 } else if (cmd == 'EI') {
13528 buildPaintImageXObject(args[0], true);
13532 // Parse the ColorSpace data to a raw format.
13533 case 'setFillColorSpace':
13534 case 'setStrokeColorSpace':
13535 args = [ColorSpace.parseToIR(args[0], xref, resources)];
13537 case 'shadingFill':
13538 var shadingRes = res.get('Shading');
13540 error('No shading resource found');
13542 var shading = shadingRes.get(args[0].name);
13544 error('No shading object found');
13546 var shadingFill = Pattern.parseShading(shading, null, xref, res);
13547 var patternIR = shadingFill.getIR();
13548 args = [patternIR];
13549 fn = 'shadingFill';
13552 var dictName = args[0];
13553 var extGState = resources.get('ExtGState');
13555 if (!isDict(extGState) || !extGState.has(dictName.name))
13558 var gsState = extGState.get(dictName.name);
13560 // This array holds the converted/processed state data.
13561 var gsStateObj = [];
13564 function canvasGraphicsSetGStateForEach(key, value) {
13577 gsStateObj.push([key, value]);
13582 handleSetFont(null, value[0]),
13602 TODO('graphic state operator ' + key);
13605 warn('Unknown graphic state operator ' + key);
13610 args = [gsStateObj];
13615 argsArray.push(args);
13617 } else if (obj != null) {
13618 assertWellFormed(args.length <= 33, 'Too many arguments');
13619 args.push(obj instanceof Dict ? obj.getAll() : obj);
13626 extractDataStructures: function
13627 partialEvaluatorExtractDataStructures(dict, baseDict,
13628 xref, properties) {
13630 var toUnicode = dict.get('ToUnicode') ||
13631 baseDict.get('ToUnicode');
13633 properties.toUnicode = this.readToUnicode(toUnicode, xref, properties);
13635 if (properties.composite) {
13636 // CIDSystemInfo helps to match CID to glyphs
13637 var cidSystemInfo = dict.get('CIDSystemInfo');
13638 if (isDict(cidSystemInfo)) {
13639 properties.cidSystemInfo = {
13640 registry: cidSystemInfo.get('Registry'),
13641 ordering: cidSystemInfo.get('Ordering'),
13642 supplement: cidSystemInfo.get('Supplement')
13646 var cidToGidMap = dict.get('CIDToGIDMap');
13647 if (isStream(cidToGidMap))
13648 properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
13651 var flags = properties.flags;
13652 var differences = [];
13653 var baseEncoding = !!(flags & FontFlags.Symbolic) ?
13654 Encodings.symbolsEncoding : Encodings.StandardEncoding;
13655 var hasEncoding = dict.has('Encoding');
13657 var encoding = dict.get('Encoding');
13658 if (isDict(encoding)) {
13659 var baseName = encoding.get('BaseEncoding');
13661 baseEncoding = Encodings[baseName.name];
13663 hasEncoding = false; // base encoding was not provided
13665 // Load the differences between the base and original
13666 if (encoding.has('Differences')) {
13667 var diffEncoding = encoding.get('Differences');
13669 for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
13670 var data = diffEncoding[j];
13674 differences[index++] = data.name;
13677 } else if (isName(encoding)) {
13678 baseEncoding = Encodings[encoding.name];
13680 error('Encoding is not a Name nor a Dict');
13684 properties.differences = differences;
13685 properties.baseEncoding = baseEncoding;
13686 properties.hasEncoding = hasEncoding;
13689 readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref,
13691 var cmapObj = toUnicode;
13692 var charToUnicode = [];
13693 if (isName(cmapObj)) {
13694 var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-';
13695 if (!isIdentityMap)
13696 error('ToUnicode file cmap translation not implemented');
13697 } else if (isStream(cmapObj)) {
13700 var beginArrayToken = {};
13702 var cmap = cmapObj.getBytes(cmapObj.length);
13703 for (var i = 0, ii = cmap.length; i < ii; i++) {
13704 var octet = cmap[i];
13705 if (octet == 0x20 || octet == 0x0D || octet == 0x0A ||
13706 octet == 0x3C || octet == 0x5B || octet == 0x5D) {
13709 error('usecmap is not implemented');
13712 case 'beginbfchar':
13713 case 'beginbfrange':
13714 case 'begincidchar':
13715 case 'begincidrange':
13720 case 'endcidrange':
13722 for (var j = 0, jj = tokens.length; j < jj; j += 3) {
13723 var startRange = tokens[j];
13724 var endRange = tokens[j + 1];
13725 var code = tokens[j + 2];
13726 if (code == 0xFFFF) {
13727 // CMap is broken, assuming code == startRange
13730 if (isArray(code)) {
13732 while (startRange <= endRange) {
13733 charToUnicode[startRange] = code[codeindex++];
13737 while (startRange <= endRange) {
13738 charToUnicode[startRange] = code++;
13747 for (var j = 0, jj = tokens.length; j < jj; j += 2) {
13748 var index = tokens[j];
13749 var code = tokens[j + 1];
13750 charToUnicode[index] = code;
13758 if (token[0] >= '0' && token[0] <= '9')
13759 token = parseInt(token, 10); // a number
13760 tokens.push(token);
13765 // begin list parsing
13766 tokens.push(beginArrayToken);
13769 // collect array items
13770 var items = [], item;
13771 while (tokens.length &&
13772 (item = tokens.pop()) != beginArrayToken)
13773 items.unshift(item);
13774 tokens.push(items);
13777 } else if (octet == 0x3E) {
13778 if (token.length) {
13779 // XXX guessing chars size by checking number size in the CMap
13780 if (token.length <= 2 && properties.composite)
13781 properties.wideChars = false;
13783 if (token.length <= 4) {
13784 // parsing hex number
13785 tokens.push(parseInt(token, 16));
13788 // parsing hex UTF-16BE numbers
13790 for (var k = 0, kk = token.length; k < kk; k += 4) {
13791 var b = parseInt(token.substr(k, 4), 16);
13794 b = (b << 16) | parseInt(token.substr(k, 4), 16);
13796 str.push(0xD800 | (b >> 10));
13797 str.push(0xDC00 | (b & 0x3FF));
13802 tokens.push(String.fromCharCode.apply(String, str));
13807 token += String.fromCharCode(octet);
13811 return charToUnicode;
13813 readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
13814 // Extract the encoding from the CIDToGIDMap
13815 var glyphsData = cidToGidStream.getBytes();
13817 // Set encoding 0 to later verify the font has an encoding
13819 for (var j = 0, jj = glyphsData.length; j < jj; j++) {
13820 var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
13825 result[code] = glyphID;
13830 extractWidths: function PartialEvaluator_extractWidths(dict,
13834 var glyphsWidths = [];
13835 var defaultWidth = 0;
13836 if (properties.composite) {
13837 defaultWidth = dict.get('DW') || 1000;
13839 var widths = dict.get('W');
13841 var start = 0, end = 0;
13842 for (var i = 0, ii = widths.length; i < ii; i++) {
13843 var code = widths[i];
13844 if (isArray(code)) {
13845 for (var j = 0, jj = code.length; j < jj; j++)
13846 glyphsWidths[start++] = code[j];
13848 } else if (start) {
13849 var width = widths[++i];
13850 for (var j = start; j <= code; j++)
13851 glyphsWidths[j] = width;
13859 var firstChar = properties.firstChar;
13860 var widths = dict.get('Widths');
13863 for (var i = 0, ii = widths.length; i < ii; i++)
13864 glyphsWidths[j++] = widths[i];
13865 defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
13867 // Trying get the BaseFont metrics (see comment above).
13868 var baseFontName = dict.get('BaseFont');
13869 if (isName(baseFontName)) {
13870 var metrics = this.getBaseFontMetrics(baseFontName.name);
13872 glyphsWidths = metrics.widths;
13873 defaultWidth = metrics.defaultWidth;
13878 properties.defaultWidth = defaultWidth;
13879 properties.widths = glyphsWidths;
13882 getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
13883 var defaultWidth = 0, widths = [];
13884 var glyphWidths = Metrics[stdFontMap[name] || name];
13885 if (isNum(glyphWidths)) {
13886 defaultWidth = glyphWidths;
13888 widths = glyphWidths;
13892 defaultWidth: defaultWidth,
13897 translateFont: function PartialEvaluator_translateFont(dict,
13901 var baseDict = dict;
13902 var type = dict.get('Subtype');
13903 assertWellFormed(isName(type), 'invalid font Subtype');
13905 var composite = false;
13906 if (type.name == 'Type0') {
13907 // If font is a composite
13908 // - get the descendant font
13909 // - set the type according to the descendant font
13910 // - get the FontDescriptor from the descendant font
13911 var df = dict.get('DescendantFonts');
13915 dict = isArray(df) ? xref.fetchIfRef(df[0]) : df;
13917 type = dict.get('Subtype');
13918 assertWellFormed(isName(type), 'invalid font Subtype');
13921 var maxCharIndex = composite ? 0xFFFF : 0xFF;
13923 var descriptor = dict.get('FontDescriptor');
13925 if (type.name == 'Type3') {
13926 // FontDescriptor is only required for Type3 fonts when the document
13927 // is a tagged pdf. Create a barbebones one to get by.
13928 descriptor = new Dict();
13929 descriptor.set('FontName', new Name(type.name));
13931 // Before PDF 1.5 if the font was one of the base 14 fonts, having a
13932 // FontDescriptor was not required.
13933 // This case is here for compatibility.
13934 var baseFontName = dict.get('BaseFont');
13935 if (!isName(baseFontName))
13938 // Using base font name as a font name.
13939 baseFontName = baseFontName.name.replace(/[,_]/g, '-');
13940 var metrics = this.getBaseFontMetrics(baseFontName);
13942 // Simulating descriptor flags attribute
13943 var fontNameWoStyle = baseFontName.split('-')[0];
13944 var flags = (serifFonts[fontNameWoStyle] ||
13945 (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) |
13946 (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
13947 FontFlags.Nonsymbolic);
13951 widths: metrics.widths,
13952 defaultWidth: metrics.defaultWidth,
13955 lastChar: maxCharIndex
13957 this.extractDataStructures(dict, dict, xref, properties);
13960 name: baseFontName,
13962 properties: properties
13967 // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
13968 // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
13969 // to ignore this rule when a variant of a standart font is used.
13970 // TODO Fill the width array depending on which of the base font this is
13972 var firstChar = dict.get('FirstChar') || 0;
13973 var lastChar = dict.get('LastChar') || maxCharIndex;
13974 var fontName = descriptor.get('FontName');
13975 // Some bad pdf's have a string as the font name.
13976 if (isString(fontName))
13977 fontName = new Name(fontName);
13978 assertWellFormed(isName(fontName), 'invalid font name');
13980 var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
13982 if (fontFile.dict) {
13983 var subtype = fontFile.dict.get('Subtype');
13985 subtype = subtype.name;
13987 var length1 = fontFile.dict.get('Length1');
13989 var length2 = fontFile.dict.get('Length2');
13999 composite: composite,
14000 wideChars: composite,
14002 fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX,
14003 firstChar: firstChar || 0,
14004 lastChar: lastChar || maxCharIndex,
14005 bbox: descriptor.get('FontBBox'),
14006 ascent: descriptor.get('Ascent'),
14007 descent: descriptor.get('Descent'),
14008 xHeight: descriptor.get('XHeight'),
14009 capHeight: descriptor.get('CapHeight'),
14010 flags: descriptor.get('Flags'),
14011 italicAngle: descriptor.get('ItalicAngle'),
14014 this.extractWidths(dict, xref, descriptor, properties);
14015 this.extractDataStructures(dict, baseDict, xref, properties);
14017 if (type.name === 'Type3') {
14018 properties.coded = true;
14019 var charProcs = dict.get('CharProcs').getAll();
14020 var fontResources = dict.get('Resources') || resources;
14021 properties.charProcOperatorList = {};
14022 for (var key in charProcs) {
14023 var glyphStream = charProcs[key];
14024 properties.charProcOperatorList[key] =
14025 this.getOperatorList(glyphStream, fontResources, dependency);
14030 name: fontName.name,
14033 properties: properties
14038 return PartialEvaluator;
14041 var EvalState = (function EvalStateClosure() {
14042 function EvalState() {
14043 // Are soft masks and alpha values shapes or opacities?
14044 this.alphaIsShape = false;
14046 this.textMatrix = IDENTITY_MATRIX;
14048 // Start of text line (in text coordinates)
14051 // Character and word spacing
14052 this.charSpacing = 0;
14053 this.wordSpacing = 0;
14054 this.textHScale = 1;
14056 this.fillColorSpace = null;
14057 this.strokeColorSpace = null;
14059 EvalState.prototype = {
14065 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
14066 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
14071 * Maximum time to wait for a font to be loaded by font-face rules.
14073 var kMaxWaitForFontFace = 1000;
14075 // Unicode Private Use Area
14076 var kCmapGlyphOffset = 0xE000;
14077 var kSizeOfGlyphArea = 0x1900;
14078 var kSymbolicFontGlyphOffset = 0xF000;
14080 // PDF Glyph Space Units are one Thousandth of a TextSpace Unit
14081 // except for Type 3 fonts
14082 var kPDFGlyphSpaceUnits = 1000;
14084 // Until hinting is fully supported this constant can be used
14085 var kHintingEnabled = false;
14100 ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14101 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14102 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
14103 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
14104 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
14105 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
14106 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
14107 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
14108 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
14109 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
14110 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
14111 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
14112 '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
14113 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
14114 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
14115 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
14116 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
14117 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
14118 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
14119 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14120 '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
14121 '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
14122 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
14123 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
14124 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
14125 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
14126 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
14127 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
14128 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
14129 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
14130 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
14131 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
14132 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
14133 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
14134 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
14135 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
14136 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
14137 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
14138 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
14139 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
14141 MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
14142 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14143 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
14144 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
14145 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
14146 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
14147 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
14148 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
14149 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
14150 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
14151 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
14152 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
14153 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
14154 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
14155 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
14156 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
14157 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
14158 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
14159 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
14160 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
14161 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
14162 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
14163 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
14164 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
14165 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
14166 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
14167 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
14168 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
14169 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
14170 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
14171 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
14172 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
14173 '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
14174 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
14175 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
14176 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
14177 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
14178 '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
14179 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
14180 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
14181 MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14182 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14183 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
14184 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
14185 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
14186 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
14187 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
14188 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
14189 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
14190 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
14191 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
14192 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
14193 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
14194 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
14195 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
14196 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
14197 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
14198 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
14199 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
14200 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
14201 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
14202 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
14203 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
14204 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
14205 'guillemotright', 'ellipsis', '', 'Agrave', 'Atilde', 'Otilde', 'OE',
14206 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
14207 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
14208 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
14209 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
14210 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
14211 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
14212 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
14213 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
14214 'ogonek', 'caron'],
14215 StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14216 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14217 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
14218 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
14219 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
14220 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
14221 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
14222 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
14223 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
14224 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',
14225 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
14226 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
14227 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14228 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
14229 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
14230 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
14231 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
14232 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
14233 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
14234 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
14235 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
14236 '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
14237 '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
14238 '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
14239 '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
14240 WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14241 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14242 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
14243 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
14244 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
14245 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
14246 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
14247 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
14248 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
14249 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
14250 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
14251 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
14252 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
14253 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
14254 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
14255 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
14256 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
14257 'zcaron', 'Ydieresis', '', 'exclamdown', 'cent', 'sterling',
14258 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
14259 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
14260 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
14261 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
14262 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
14263 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
14264 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
14265 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
14266 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
14267 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
14268 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
14269 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
14270 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
14271 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
14272 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
14274 symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14275 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14276 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
14277 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
14278 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
14279 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
14280 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
14281 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
14282 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
14283 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
14284 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
14285 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
14286 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
14287 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
14288 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
14289 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14290 '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
14291 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
14292 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
14293 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
14294 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
14295 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
14296 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
14297 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
14298 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
14299 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
14300 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
14301 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
14302 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
14303 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
14304 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
14305 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
14306 '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
14307 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
14308 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
14310 zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
14311 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14312 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
14313 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
14314 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
14315 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
14316 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
14317 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
14318 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
14319 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
14320 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
14321 'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '',
14322 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
14323 '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112',
14324 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125',
14325 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134',
14326 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143',
14327 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152',
14328 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161',
14329 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169',
14330 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177',
14331 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201',
14332 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187',
14333 'a188', 'a189', 'a190', 'a191']
14337 * Hold a map of decoded fonts and of the standard fourteen Type1
14338 * fonts and their acronyms.
14341 'ArialNarrow': 'Helvetica',
14342 'ArialNarrow-Bold': 'Helvetica-Bold',
14343 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
14344 'ArialNarrow-Italic': 'Helvetica-Oblique',
14345 'ArialBlack': 'Helvetica',
14346 'ArialBlack-Bold': 'Helvetica-Bold',
14347 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
14348 'ArialBlack-Italic': 'Helvetica-Oblique',
14349 'Arial': 'Helvetica',
14350 'Arial-Bold': 'Helvetica-Bold',
14351 'Arial-BoldItalic': 'Helvetica-BoldOblique',
14352 'Arial-Italic': 'Helvetica-Oblique',
14353 'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
14354 'Arial-BoldMT': 'Helvetica-Bold',
14355 'Arial-ItalicMT': 'Helvetica-Oblique',
14356 'ArialMT': 'Helvetica',
14357 'Courier-Bold': 'Courier-Bold',
14358 'Courier-BoldItalic': 'Courier-BoldOblique',
14359 'Courier-Italic': 'Courier-Oblique',
14360 'CourierNew': 'Courier',
14361 'CourierNew-Bold': 'Courier-Bold',
14362 'CourierNew-BoldItalic': 'Courier-BoldOblique',
14363 'CourierNew-Italic': 'Courier-Oblique',
14364 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
14365 'CourierNewPS-BoldMT': 'Courier-Bold',
14366 'CourierNewPS-ItalicMT': 'Courier-Oblique',
14367 'CourierNewPSMT': 'Courier',
14368 'Helvetica-Bold': 'Helvetica-Bold',
14369 'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
14370 'Helvetica-Italic': 'Helvetica-Oblique',
14371 'Symbol-Bold': 'Symbol',
14372 'Symbol-BoldItalic': 'Symbol',
14373 'Symbol-Italic': 'Symbol',
14374 'TimesNewRoman': 'Times-Roman',
14375 'TimesNewRoman-Bold': 'Times-Bold',
14376 'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
14377 'TimesNewRoman-Italic': 'Times-Italic',
14378 'TimesNewRomanPS': 'Times-Roman',
14379 'TimesNewRomanPS-Bold': 'Times-Bold',
14380 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
14381 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
14382 'TimesNewRomanPS-BoldMT': 'Times-Bold',
14383 'TimesNewRomanPS-Italic': 'Times-Italic',
14384 'TimesNewRomanPS-ItalicMT': 'Times-Italic',
14385 'TimesNewRomanPSMT': 'Times-Roman',
14386 'TimesNewRomanPSMT-Bold': 'Times-Bold',
14387 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
14388 'TimesNewRomanPSMT-Italic': 'Times-Italic'
14392 * Holds the map of the non-standard fonts that might be included as a standard
14393 * fonts without glyph data.
14395 var nonStdFontMap = {
14396 'ComicSansMS': 'Comic Sans MS',
14397 'ComicSansMS-Bold': 'Comic Sans MS-Bold',
14398 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
14399 'ComicSansMS-Italic': 'Comic Sans MS-Italic',
14400 'LucidaConsole': 'Courier',
14401 'LucidaConsole-Bold': 'Courier-Bold',
14402 'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
14403 'LucidaConsole-Italic': 'Courier-Oblique'
14407 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
14408 'Aldus': true, 'Alexandria': true, 'Algerian': true,
14409 'American Typewriter': true, 'Antiqua': true, 'Apex': true,
14410 'Arno': true, 'Aster': true, 'Aurora': true,
14411 'Baskerville': true, 'Bell': true, 'Bembo': true,
14412 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
14413 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
14414 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
14415 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
14416 'Calvert': true, 'Capitals': true, 'Cambria': true,
14417 'Cartier': true, 'Caslon': true, 'Catull': true,
14418 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
14419 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
14420 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
14421 'Cochin': true, 'Colonna': true, 'Computer Modern': true,
14422 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
14423 'Corona': true, 'Ecotype': true, 'Egyptienne': true,
14424 'Elephant': true, 'Excelsior': true, 'Fairfield': true,
14425 'FF Scala': true, 'Folkard': true, 'Footlight': true,
14426 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
14427 'Gentium': true, 'Georgia': true, 'Gloucester': true,
14428 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
14429 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
14430 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
14431 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
14432 'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
14433 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
14434 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
14435 'Lucida Bright': true, 'Melior': true, 'Memphis': true,
14436 'Miller': true, 'Minion': true, 'Modern': true,
14437 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
14438 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
14439 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
14440 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
14441 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
14442 'Requiem': true, 'Rockwell': true, 'Roman': true,
14443 'Rotis Serif': true, 'Sabon': true, 'Scala': true,
14444 'Seagull': true, 'Sistina': true, 'Souvenir': true,
14445 'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
14446 'Sylfaen': true, 'Times': true, 'Trajan': true,
14447 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
14448 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
14449 'Versailles': true, 'Wanted': true, 'Weiss': true,
14450 'Wide Latin': true, 'Windsor': true, 'XITS': true
14453 var symbolsFonts = {
14454 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
14457 // Some characters, e.g. copyrightserif, mapped to the private use area and
14458 // might not be displayed using standard fonts. Mapping/hacking well-known chars
14459 // to the similar equivalents in the normal characters range.
14460 function mapPrivateUseChars(code) {
14462 case 0xF8E9: // copyrightsans
14463 case 0xF6D9: // copyrightserif
14464 return 0x00A9; // copyright
14471 listeningForFontLoad: false,
14473 bind: function fontLoaderBind(fonts, callback) {
14474 function checkFontsLoaded() {
14475 for (var i = 0, ii = fonts.length; i < ii; i++) {
14476 var fontObj = fonts[i];
14477 if (fontObj.loading) {
14482 PdfJS_window.document.documentElement.removeEventListener(
14483 'pdfjsFontLoad', checkFontsLoaded, false);
14489 var rules = [], names = [], fontsToLoad = [];
14490 var fontCreateTimer = 0;
14492 for (var i = 0, ii = fonts.length; i < ii; i++) {
14493 var font = fonts[i];
14495 // Add the font to the DOM only once or skip if the font
14496 // is already loaded.
14497 if (font.attached || font.loading == false) {
14500 font.attached = true;
14502 fontsToLoad.push(font);
14505 var data = font.data;
14507 var length = data.length;
14508 for (var j = 0; j < length; j++)
14509 str += String.fromCharCode(data[j]);
14511 var rule = font.bindDOM(str);
14514 names.push(font.loadedName);
14519 this.listeningForFontLoad = false;
14520 if (!isWorker && rules.length) {
14521 FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad);
14524 if (!checkFontsLoaded()) {
14525 PdfJS_window.document.documentElement.addEventListener(
14526 'pdfjsFontLoad', checkFontsLoaded, false);
14529 // Set things up so that at least one pdfjsFontLoad event is
14530 // dispatched when all the @font-face |rules| for |names| have been
14531 // loaded in a subdocument. It's expected that the load of |rules|
14532 // has already started in this (outer) document, so that they should
14533 // be ordered before the load in the subdocument.
14534 prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names,
14537 // There's no event when a font has finished downloading so the
14538 // following code is a dirty hack to 'guess' when a font is
14539 // ready. This code will be obsoleted by Mozilla bug 471915.
14541 // The only reliable way to know if a font is loaded in Gecko
14542 // (at the moment) is document.onload in a document with
14543 // a @font-face rule defined in a "static" stylesheet. We use a
14544 // subdocument in an <iframe>, set up properly, to know when
14545 // our @font-face rule was loaded. However, the subdocument and
14546 // outer document can't share CSS rules, so the inner document
14547 // is only part of the puzzle. The second piece is an invisible
14548 // div created in order to force loading of the @font-face in
14549 // the *outer* document. (The font still needs to be loaded for
14550 // its metrics, for reflow). We create the div first for the
14551 // outer document, then create the iframe. Unless something
14552 // goes really wonkily, we expect the @font-face for the outer
14553 // document to be processed before the inner. That's still
14554 // fragile, but seems to work in practice.
14556 // The postMessage() hackery was added to work around chrome bug
14559 // Validate the names parameter -- the values can used to construct HTML.
14560 if (!/^\w+$/.test(names.join(''))) {
14561 error('Invalid font name(s): ' + names.join());
14563 // Normally the error-function throws. But if a malicious code
14564 // intercepts the function call then the return is needed.
14568 var div = PdfJS_window.document.createElement('div');
14569 div.setAttribute('style',
14570 'visibility: hidden;' +
14571 'width: 10px; height: 10px;' +
14572 'position: absolute; top: 0px; left: 0px;');
14574 for (var i = 0, ii = names.length; i < ii; ++i) {
14575 html += '<span style="font-family:' + names[i] + '">Hi</span>';
14577 div.innerHTML = html;
14578 PdfJS_window.document.body.appendChild(div);
14580 if (!this.listeningForFontLoad) {
14581 PdfJS_window.window.addEventListener(
14583 function fontLoaderMessage(e) {
14584 var fontNames = JSON.parse(e.data);
14585 for (var i = 0, ii = fonts.length; i < ii; ++i) {
14586 var font = fonts[i];
14587 font.loading = false;
14589 var evt = PdfJS_window.document.createEvent('Events');
14590 evt.initEvent('pdfjsFontLoad', true, false);
14591 PdfJS_window.document.documentElement.dispatchEvent(evt);
14594 this.listeningForFontLoad = true;
14597 // XXX we should have a time-out here too, and maybe fire
14598 // pdfjsFontLoadFailed?
14599 var src = '<!DOCTYPE HTML><html><head>';
14600 src += '<style type="text/css">';
14601 for (var i = 0, ii = rules.length; i < ii; ++i) {
14605 src += '<script type="application/javascript">';
14606 var fontNamesArray = '';
14607 for (var i = 0, ii = names.length; i < ii; ++i) {
14608 fontNamesArray += '"' + names[i] + '", ';
14610 src += ' var fontNames=[' + fontNamesArray + '];\n';
14611 src += ' PdfJS_window.window.onload = function fontLoaderOnload() {\n';
14612 src += ' parent.postMessage(JSON.stringify(fontNames), "*");\n';
14614 // Hack so the end script tag isn't counted if this is inline JS.
14615 src += '</scr' + 'ipt></head><body>';
14616 for (var i = 0, ii = names.length; i < ii; ++i) {
14617 src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>';
14619 src += '</body></html>';
14620 var frame = PdfJS_window.document.createElement('iframe');
14621 frame.src = 'data:text/html,' + src;
14622 frame.setAttribute('style',
14623 'visibility: hidden;' +
14624 'width: 10px; height: 10px;' +
14625 'position: absolute; top: 0px; left: 0px;');
14626 PdfJS_window.document.body.appendChild(frame);
14631 var UnicodeRanges = [
14632 { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
14633 { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
14634 { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
14635 { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
14636 { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
14637 { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
14638 { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
14639 { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
14640 { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
14641 { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
14642 { 'begin': 0x0530, 'end': 0x058F }, // Armenian
14643 { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
14644 { 'begin': 0xA500, 'end': 0xA63F }, // Vai
14645 { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
14646 { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
14647 { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
14648 { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
14649 { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
14650 { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
14651 { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
14652 { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
14653 { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
14654 { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
14655 { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
14656 { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
14657 { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
14658 { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
14659 { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
14660 { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
14661 { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
14662 { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
14663 { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
14664 { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
14665 { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
14666 { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
14667 { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
14668 { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
14669 { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
14670 { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
14671 { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
14672 { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
14673 { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
14674 { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
14675 { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
14676 { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
14677 { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
14678 { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
14679 { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
14680 { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
14681 { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
14682 { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
14683 { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
14684 { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
14685 { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
14686 { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
14687 { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
14688 { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
14689 { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
14690 { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
14691 { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
14692 { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
14693 { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
14694 { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
14695 { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
14696 { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
14697 { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
14698 { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
14699 { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
14700 { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
14701 { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
14702 { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
14703 { 'begin': 0x0700, 'end': 0x074F }, // Syriac
14704 { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
14705 { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
14706 { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
14707 { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
14708 { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
14709 { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
14710 { 'begin': 0x1680, 'end': 0x169F }, // Ogham
14711 { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
14712 { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
14713 { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
14714 { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
14715 { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
14716 { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
14717 { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
14718 { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
14719 { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
14720 { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
14721 { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
14722 { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
14723 { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
14724 { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
14725 { 'begin': 0x1900, 'end': 0x194F }, // Limbu
14726 { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
14727 { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
14728 { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
14729 { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
14730 { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
14731 { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
14732 { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
14733 { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
14734 { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
14735 { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
14736 { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
14737 { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
14738 { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
14739 { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
14740 { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
14741 { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
14742 { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
14743 { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
14744 { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
14745 { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
14746 { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
14747 { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
14748 { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
14749 { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
14750 { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
14751 { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
14752 { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
14753 { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
14754 { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles
14757 var MacStandardGlyphOrdering = [
14758 '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
14759 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
14760 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
14761 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
14762 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
14763 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
14764 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
14765 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
14766 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
14767 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
14768 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
14769 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
14770 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
14771 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
14772 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
14773 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
14774 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
14775 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
14776 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
14777 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
14778 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
14779 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
14780 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
14781 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
14782 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
14783 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
14784 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
14785 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
14786 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
14787 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
14788 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
14789 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
14790 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
14791 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
14792 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
14793 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
14795 function getUnicodeRangeFor(value) {
14796 for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
14797 var range = UnicodeRanges[i];
14798 if (value >= range.begin && value < range.end)
14804 function isRTLRangeFor(value) {
14805 var range = UnicodeRanges[13];
14806 if (value >= range.begin && value < range.end)
14808 range = UnicodeRanges[11];
14809 if (value >= range.begin && value < range.end)
14814 function isSpecialUnicode(unicode) {
14815 return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) ||
14816 (unicode >= kCmapGlyphOffset &&
14817 unicode < kCmapGlyphOffset + kSizeOfGlyphArea);
14821 * 'Font' is the class the outside world should use, it encapsulate all the font
14822 * decoding logics whatever type it is (assuming the font type is supported).
14824 * For example to read a Type1 font and to attach it to the document:
14825 * var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
14826 * type1Font.bind();
14828 var Font = (function FontClosure() {
14829 function Font(name, file, properties) {
14831 this.coded = properties.coded;
14832 this.charProcOperatorList = properties.charProcOperatorList;
14835 var names = name.split('+');
14836 names = names.length > 1 ? names[1] : names[0];
14837 names = names.split(/[-,_]/g)[0];
14838 this.isSerifFont = !!(properties.flags & FontFlags.Serif);
14839 this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
14841 var type = properties.type;
14844 // If the font is to be ignored, register it like an already loaded font
14845 // to avoid the cost of waiting for it be be loaded by the platform.
14846 if (properties.ignore) {
14847 this.loadedName = this.isSerifFont ? 'serif' : 'sans-serif';
14848 this.loading = false;
14852 this.differences = properties.differences;
14853 this.widths = properties.widths;
14854 this.defaultWidth = properties.defaultWidth;
14855 this.composite = properties.composite;
14856 this.wideChars = properties.wideChars;
14857 this.hasEncoding = properties.hasEncoding;
14859 this.fontMatrix = properties.fontMatrix;
14860 this.widthMultiplier = 1.0;
14861 if (properties.type == 'Type3') {
14862 this.encoding = properties.baseEncoding;
14866 // Trying to fix encoding using glyph CIDSystemInfo.
14867 this.loadCidToUnicode(properties);
14869 if (properties.toUnicode)
14870 this.toUnicode = properties.toUnicode;
14872 this.rebuildToUnicode(properties);
14874 this.toFontChar = this.buildToFontChar(this.toUnicode);
14877 // The file data is not specified. Trying to fix the font name
14878 // to be used with the canvas.font.
14879 var fontName = name.replace(/[,_]/g, '-');
14880 fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
14882 this.bold = (fontName.search(/bold/gi) != -1);
14883 this.italic = (fontName.search(/oblique/gi) != -1) ||
14884 (fontName.search(/italic/gi) != -1);
14886 // Use 'name' instead of 'fontName' here because the original
14887 // name ArialBlack for example will be replaced by Helvetica.
14888 this.black = (name.search(/Black/g) != -1);
14890 this.encoding = properties.baseEncoding;
14891 this.noUnicodeAdaptation = true;
14892 this.loadedName = fontName.split('-')[0];
14893 this.loading = false;
14900 case 'CIDFontType0':
14901 this.mimetype = 'font/opentype';
14903 var subtype = properties.subtype;
14904 var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ?
14905 new CFFFont(file, properties) : new Type1Font(name, file, properties);
14907 // Wrap the CFF data inside an OTF font file
14908 data = this.convert(name, cff, properties);
14912 case 'CIDFontType2':
14913 this.mimetype = 'font/opentype';
14915 // Repair the TrueType file. It is can be damaged in the point of
14916 // view of the sanitizer
14917 data = this.checkAndRepair(name, file, properties);
14921 warn('Font ' + properties.type + ' is not supported');
14926 this.fontMatrix = properties.fontMatrix;
14927 this.widthMultiplier = !properties.fontMatrix ? 1.0 :
14928 1.0 / properties.fontMatrix[0];
14929 this.encoding = properties.baseEncoding;
14930 this.loadedName = properties.loadedName;
14931 this.loading = true;
14935 function getUniqueName() {
14936 return 'pdfFont' + numFonts++;
14939 function stringToArray(str) {
14941 for (var i = 0, ii = str.length; i < ii; ++i)
14942 array[i] = str.charCodeAt(i);
14947 function arrayToString(arr) {
14949 for (var i = 0, ii = arr.length; i < ii; ++i)
14950 str += String.fromCharCode(arr[i]);
14955 function int16(bytes) {
14956 return (bytes[0] << 8) + (bytes[1] & 0xff);
14959 function int32(bytes) {
14960 return (bytes[0] << 24) + (bytes[1] << 16) +
14961 (bytes[2] << 8) + (bytes[3] & 0xff);
14964 function getMaxPower2(number) {
14966 var value = number;
14967 while (value >= 2) {
14973 for (var i = 1; i < maxPower; i++)
14978 function string16(value) {
14979 return String.fromCharCode((value >> 8) & 0xff) +
14980 String.fromCharCode(value & 0xff);
14983 function safeString16(value) {
14984 // clamp value to the 16-bit int range
14985 value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;
14986 return String.fromCharCode((value >> 8) & 0xff) +
14987 String.fromCharCode(value & 0xff);
14990 function string32(value) {
14991 return String.fromCharCode((value >> 24) & 0xff) +
14992 String.fromCharCode((value >> 16) & 0xff) +
14993 String.fromCharCode((value >> 8) & 0xff) +
14994 String.fromCharCode(value & 0xff);
14997 function createOpenTypeHeader(sfnt, file, numTables) {
14998 // Windows hates the Mac TrueType sfnt version number
14999 if (sfnt == 'true')
15000 sfnt = string32(0x00010000);
15002 // sfnt version (4 bytes)
15005 // numTables (2 bytes)
15006 header += string16(numTables);
15008 // searchRange (2 bytes)
15009 var tablesMaxPower2 = getMaxPower2(numTables);
15010 var searchRange = tablesMaxPower2 * 16;
15011 header += string16(searchRange);
15013 // entrySelector (2 bytes)
15014 header += string16(Math.log(tablesMaxPower2) / Math.log(2));
15016 // rangeShift (2 bytes)
15017 header += string16(numTables * 16 - searchRange);
15019 file.file += header;
15020 file.virtualOffset += header.length;
15023 function createTableEntry(file, tag, data) {
15025 var offset = file.virtualOffset;
15028 var length = data.length;
15030 // Per spec tables must be 4-bytes align so add padding as needed
15031 while (data.length & 3)
15034 while (file.virtualOffset & 3)
15035 file.virtualOffset++;
15038 var checksum = 0, n = data.length;
15039 for (var i = 0; i < n; i += 4)
15040 checksum = (checksum + int32([data[i], data[i + 1], data[i + 2],
15041 data[i + 3]])) | 0;
15043 var tableEntry = (tag + string32(checksum) +
15044 string32(offset) + string32(length));
15045 file.file += tableEntry;
15046 file.virtualOffset += data.length;
15049 function getRanges(glyphs) {
15050 // Array.sort() sorts by characters, not numerically, so convert to an
15051 // array of characters.
15053 var length = glyphs.length;
15054 for (var n = 0; n < length; ++n)
15055 codes.push({ unicode: glyphs[n].unicode, code: n });
15056 codes.sort(function fontGetRangesSort(a, b) {
15057 return a.unicode - b.unicode;
15060 // Split the sorted codes into ranges.
15062 for (var n = 0; n < length; ) {
15063 var start = codes[n].unicode;
15064 var codeIndices = [codes[n].code];
15067 while (n < length && end + 1 == codes[n].unicode) {
15068 codeIndices.push(codes[n].code);
15072 ranges.push([start, end, codeIndices]);
15078 function createCMapTable(glyphs, deltas) {
15079 var ranges = getRanges(glyphs);
15082 var cmap = '\x00\x00' + // version
15083 string16(numTables) + // numTables
15084 '\x00\x03' + // platformID
15085 '\x00\x01' + // encodingID
15086 string32(4 + numTables * 8); // start of the table record
15088 var segCount = ranges.length + 1;
15089 var segCount2 = segCount * 2;
15090 var searchRange = getMaxPower2(segCount) * 2;
15091 var searchEntry = Math.log(segCount) / Math.log(2);
15092 var rangeShift = 2 * segCount - searchRange;
15094 // Fill up the 4 parallel arrays describing the segments.
15095 var startCount = '';
15098 var idRangeOffsets = '';
15099 var glyphsIds = '';
15103 for (var i = 0; i < segCount - 1; i++) {
15104 var range = ranges[i];
15105 var start = range[0];
15106 var end = range[1];
15107 var offset = (segCount - i) * 2 + bias * 2;
15108 bias += (end - start + 1);
15110 startCount += string16(start);
15111 endCount += string16(end);
15112 idDeltas += string16(0);
15113 idRangeOffsets += string16(offset);
15115 var codes = range[2];
15116 for (var j = 0, jj = codes.length; j < jj; ++j)
15117 glyphsIds += string16(deltas[codes[j]]);
15120 for (var i = 0; i < segCount - 1; i++) {
15121 var range = ranges[i];
15122 var start = range[0];
15123 var end = range[1];
15124 var startCode = range[2][0];
15126 startCount += string16(start);
15127 endCount += string16(end);
15128 idDeltas += string16((startCode - start + 1) & 0xFFFF);
15129 idRangeOffsets += string16(0);
15133 endCount += '\xFF\xFF';
15134 startCount += '\xFF\xFF';
15135 idDeltas += '\x00\x01';
15136 idRangeOffsets += '\x00\x00';
15138 var format314 = '\x00\x00' + // language
15139 string16(segCount2) +
15140 string16(searchRange) +
15141 string16(searchEntry) +
15142 string16(rangeShift) +
15143 endCount + '\x00\x00' + startCount +
15144 idDeltas + idRangeOffsets + glyphsIds;
15146 return stringToArray(cmap +
15147 '\x00\x04' + // format
15148 string16(format314.length + 4) + // length
15152 function createOS2Table(properties, charstrings, override) {
15153 override = override || {
15161 var ulUnicodeRange1 = 0;
15162 var ulUnicodeRange2 = 0;
15163 var ulUnicodeRange3 = 0;
15164 var ulUnicodeRange4 = 0;
15166 var firstCharIndex = null;
15167 var lastCharIndex = 0;
15170 for (var i = 0; i < charstrings.length; ++i) {
15171 var code = charstrings[i].unicode;
15172 if (firstCharIndex > code || !firstCharIndex)
15173 firstCharIndex = code;
15174 if (lastCharIndex < code)
15175 lastCharIndex = code;
15177 var position = getUnicodeRangeFor(code);
15178 if (position < 32) {
15179 ulUnicodeRange1 |= 1 << position;
15180 } else if (position < 64) {
15181 ulUnicodeRange2 |= 1 << position - 32;
15182 } else if (position < 96) {
15183 ulUnicodeRange3 |= 1 << position - 64;
15184 } else if (position < 123) {
15185 ulUnicodeRange4 |= 1 << position - 96;
15187 error('Unicode ranges Bits > 123 are reserved for internal usage');
15192 firstCharIndex = 0;
15193 lastCharIndex = 255;
15196 var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits;
15197 var typoAscent = override.ascent || properties.ascent;
15198 var typoDescent = override.descent || properties.descent;
15199 var winAscent = override.yMax || typoAscent;
15200 var winDescent = -override.yMin || -typoDescent;
15202 // if there is a units per em value but no other override
15203 // then scale the calculated ascent
15204 if (unitsPerEm != kPDFGlyphSpaceUnits &&
15205 'undefined' == typeof(override.ascent)) {
15206 // if the font units differ to the PDF glyph space units
15207 // then scale up the values
15208 typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits);
15209 typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits);
15210 winAscent = typoAscent;
15211 winDescent = -typoDescent;
15214 return '\x00\x03' + // version
15215 '\x02\x24' + // xAvgCharWidth
15216 '\x01\xF4' + // usWeightClass
15217 '\x00\x05' + // usWidthClass
15218 '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
15219 '\x02\x8A' + // ySubscriptXSize
15220 '\x02\xBB' + // ySubscriptYSize
15221 '\x00\x00' + // ySubscriptXOffset
15222 '\x00\x8C' + // ySubscriptYOffset
15223 '\x02\x8A' + // ySuperScriptXSize
15224 '\x02\xBB' + // ySuperScriptYSize
15225 '\x00\x00' + // ySuperScriptXOffset
15226 '\x01\xDF' + // ySuperScriptYOffset
15227 '\x00\x31' + // yStrikeOutSize
15228 '\x01\x02' + // yStrikeOutPosition
15229 '\x00\x00' + // sFamilyClass
15231 String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
15232 '\x00\x00\x00\x00\x00\x00' + // Panose
15233 string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
15234 string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
15235 string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
15236 string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
15237 '\x2A\x32\x31\x2A' + // achVendID
15238 string16(properties.italicAngle ? 1 : 0) + // fsSelection
15239 string16(firstCharIndex ||
15240 properties.firstChar) + // usFirstCharIndex
15241 string16(lastCharIndex || properties.lastChar) + // usLastCharIndex
15242 string16(typoAscent) + // sTypoAscender
15243 string16(typoDescent) + // sTypoDescender
15244 '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
15245 string16(winAscent) + // usWinAscent
15246 string16(winDescent) + // usWinDescent
15247 '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
15248 '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
15249 string16(properties.xHeight) + // sxHeight
15250 string16(properties.capHeight) + // sCapHeight
15251 string16(0) + // usDefaultChar
15252 string16(firstCharIndex || properties.firstChar) + // usBreakChar
15253 '\x00\x03'; // usMaxContext
15256 function createPostTable(properties) {
15257 var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
15258 return '\x00\x03\x00\x00' + // Version number
15259 string32(angle) + // italicAngle
15260 '\x00\x00' + // underlinePosition
15261 '\x00\x00' + // underlineThickness
15262 string32(properties.fixedPitch) + // isFixedPitch
15263 '\x00\x00\x00\x00' + // minMemType42
15264 '\x00\x00\x00\x00' + // maxMemType42
15265 '\x00\x00\x00\x00' + // minMemType1
15266 '\x00\x00\x00\x00'; // maxMemType1
15269 function createNameTable(name) {
15271 'Original licence', // 0.Copyright
15272 name, // 1.Font family
15273 'Unknown', // 2.Font subfamily (font weight)
15274 'uniqueID', // 3.Unique ID
15275 name, // 4.Full font name
15276 'Version 0.11', // 5.Version
15277 '', // 6.Postscript name
15278 'Unknown', // 7.Trademark
15279 'Unknown', // 8.Manufacturer
15280 'Unknown' // 9.Designer
15283 // Mac want 1-byte per character strings while Windows want
15284 // 2-bytes per character, so duplicate the names table
15285 var stringsUnicode = [];
15286 for (var i = 0, ii = strings.length; i < ii; i++) {
15287 var str = strings[i];
15289 var strUnicode = '';
15290 for (var j = 0, jj = str.length; j < jj; j++)
15291 strUnicode += string16(str.charCodeAt(j));
15292 stringsUnicode.push(strUnicode);
15295 var names = [strings, stringsUnicode];
15296 var platforms = ['\x00\x01', '\x00\x03'];
15297 var encodings = ['\x00\x00', '\x00\x01'];
15298 var languages = ['\x00\x00', '\x04\x09'];
15300 var namesRecordCount = strings.length * platforms.length;
15302 '\x00\x00' + // format
15303 string16(namesRecordCount) + // Number of names Record
15304 string16(namesRecordCount * 12 + 6); // Storage
15306 // Build the name records field
15308 for (var i = 0, ii = platforms.length; i < ii; i++) {
15309 var strs = names[i];
15310 for (var j = 0, jj = strs.length; j < jj; j++) {
15313 platforms[i] + // platform ID
15314 encodings[i] + // encoding ID
15315 languages[i] + // language ID
15316 string16(j) + // name ID
15317 string16(str.length) +
15318 string16(strOffset);
15319 nameTable += nameRecord;
15320 strOffset += str.length;
15324 nameTable += strings.join('') + stringsUnicode.join('');
15334 checkAndRepair: function Font_checkAndRepair(name, font, properties) {
15335 function readTableEntry(file) {
15336 var tag = file.getBytes(4);
15337 tag = String.fromCharCode(tag[0]) +
15338 String.fromCharCode(tag[1]) +
15339 String.fromCharCode(tag[2]) +
15340 String.fromCharCode(tag[3]);
15342 var checksum = int32(file.getBytes(4));
15343 var offset = int32(file.getBytes(4));
15344 var length = int32(file.getBytes(4));
15346 // Read the table associated data
15347 var previousPosition = file.pos;
15348 file.pos = file.start ? file.start : 0;
15350 var data = file.getBytes(length);
15351 file.pos = previousPosition;
15353 if (tag == 'head') {
15354 // clearing checksum adjustment
15355 data[8] = data[9] = data[10] = data[11] = 0;
15356 data[17] |= 0x20; //Set font optimized for cleartype flag
15361 checksum: checksum,
15368 function readOpenTypeHeader(ttf) {
15370 version: arrayToString(ttf.getBytes(4)),
15371 numTables: int16(ttf.getBytes(2)),
15372 searchRange: int16(ttf.getBytes(2)),
15373 entrySelector: int16(ttf.getBytes(2)),
15374 rangeShift: int16(ttf.getBytes(2))
15378 function createGlyphNameMap(glyphs, ids, properties) {
15379 var glyphNames = properties.glyphNames;
15381 properties.glyphNameMap = {};
15384 var glyphsLength = glyphs.length;
15385 var glyphNameMap = {};
15387 for (var i = 0; i < glyphsLength; ++i) {
15388 var glyphName = glyphNames[ids[i]];
15391 var unicode = glyphs[i].unicode;
15392 glyphNameMap[glyphName] = unicode;
15393 var code = glyphs[i].code;
15394 encoding[code] = glyphName;
15396 properties.glyphNameMap = glyphNameMap;
15397 if (!properties.hasEncoding)
15398 properties.baseEncoding = encoding;
15401 function readCMapTable(cmap, font) {
15402 var start = (font.start ? font.start : 0) + cmap.offset;
15405 var version = int16(font.getBytes(2));
15406 var numRecords = int16(font.getBytes(2));
15409 for (var i = 0; i < numRecords; i++) {
15411 platformID: int16(font.getBytes(2)),
15412 encodingID: int16(font.getBytes(2)),
15413 offset: int32(font.getBytes(4))
15417 // Check that table are sorted by platformID then encodingID,
15418 records.sort(function fontReadCMapTableSort(a, b) {
15419 return ((a.platformID << 16) + a.encodingID) -
15420 ((b.platformID << 16) + b.encodingID);
15423 var tables = [records[0]];
15424 for (var i = 1; i < numRecords; i++) {
15425 // The sanitizer will drop the font if 2 tables have the same
15426 // platformID and the same encodingID, this will be correct for
15427 // most cases but if the font has been made for Mac it could
15428 // exist a few platformID: 1, encodingID: 0 but with a different
15429 // language field and that's correct. But the sanitizer does not
15430 // seem to support this case.
15431 var current = records[i];
15432 var previous = records[i - 1];
15433 if (((current.platformID << 16) + current.encodingID) <=
15434 ((previous.platformID << 16) + previous.encodingID))
15436 tables.push(current);
15439 var missing = numRecords - tables.length;
15441 numRecords = tables.length;
15442 var data = string16(version) + string16(numRecords);
15444 for (var i = 0; i < numRecords; i++) {
15445 var table = tables[i];
15446 data += string16(table.platformID) +
15447 string16(table.encodingID) +
15448 string32(table.offset);
15451 for (var i = 0, ii = data.length; i < ii; i++)
15452 cmap.data[i] = data.charCodeAt(i);
15455 for (var i = 0; i < numRecords; i++) {
15456 var table = tables[i];
15457 font.pos = start + table.offset;
15459 var format = int16(font.getBytes(2));
15460 var length = int16(font.getBytes(2));
15461 var language = int16(font.getBytes(2));
15464 // Characters below 0x20 are controls characters that are hardcoded
15465 // into the platform so if some characters in the font are assigned
15466 // under this limit they will not be displayed so let's rewrite the
15470 for (var j = 0; j < 256; j++) {
15471 var index = font.getByte();
15473 glyphs.push({ unicode: j, code: j });
15482 } else if (format == 4) {
15483 // re-creating the table in format 4 since the encoding
15484 // might be changed
15485 var segCount = (int16(font.getBytes(2)) >> 1);
15486 font.getBytes(6); // skipping range fields
15487 var segIndex, segments = [];
15488 for (segIndex = 0; segIndex < segCount; segIndex++) {
15489 segments.push({ end: int16(font.getBytes(2)) });
15492 for (segIndex = 0; segIndex < segCount; segIndex++) {
15493 segments[segIndex].start = int16(font.getBytes(2));
15496 for (segIndex = 0; segIndex < segCount; segIndex++) {
15497 segments[segIndex].delta = int16(font.getBytes(2));
15500 var offsetsCount = 0;
15501 for (segIndex = 0; segIndex < segCount; segIndex++) {
15502 var segment = segments[segIndex];
15503 var rangeOffset = int16(font.getBytes(2));
15504 if (!rangeOffset) {
15505 segment.offsetIndex = -1;
15509 var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
15510 segment.offsetIndex = offsetIndex;
15511 offsetsCount = Math.max(offsetsCount, offsetIndex +
15512 segment.end - segment.start + 1);
15516 for (var j = 0; j < offsetsCount; j++)
15517 offsets.push(int16(font.getBytes(2)));
15519 var glyphs = [], ids = [];
15521 for (segIndex = 0; segIndex < segCount; segIndex++) {
15522 var segment = segments[segIndex];
15523 var start = segment.start, end = segment.end;
15524 var delta = segment.delta, offsetIndex = segment.offsetIndex;
15526 for (var j = start; j <= end; j++) {
15530 var glyphCode = offsetIndex < 0 ? j :
15531 offsets[offsetIndex + j - start];
15532 glyphCode = (glyphCode + delta) & 0xFFFF;
15533 if (glyphCode == 0)
15536 glyphs.push({ unicode: j, code: j });
15537 ids.push(glyphCode);
15545 } else if (format == 6) {
15546 // Format 6 is a 2-bytes dense mapping, which means the font data
15547 // lives glue together even if they are pretty far in the unicode
15548 // table. (This looks weird, so I can have missed something), this
15549 // works on Linux but seems to fails on Mac so let's rewrite the
15550 // cmap table to a 3-1-4 style
15551 var firstCode = int16(font.getBytes(2));
15552 var entryCount = int16(font.getBytes(2));
15556 for (var j = 0; j < entryCount; j++) {
15557 var glyphCode = int16(font.getBytes(2));
15558 var code = firstCode + j;
15560 glyphs.push({ unicode: code, code: code });
15561 ids.push(glyphCode);
15570 error('Unsupported cmap table format');
15573 function sanitizeMetrics(font, header, metrics, numGlyphs) {
15574 if (!header && !metrics)
15577 // The vhea/vmtx tables are not required, so it happens that
15578 // some fonts embed a vmtx table without a vhea table. In this
15579 // situation the sanitizer assume numOfLongVerMetrics = 1. As
15580 // a result it tries to read numGlyphs - 1 SHORT from the vmtx
15581 // table, and if it is not possible, the font is rejected.
15582 // So remove the vmtx table if there is no vhea table.
15583 if (!header && metrics) {
15584 metrics.data = null;
15588 font.pos = (font.start ? font.start : 0) + header.offset;
15589 font.pos += header.length - 2;
15590 var numOfMetrics = int16(font.getBytes(2));
15592 var numOfSidebearings = numGlyphs - numOfMetrics;
15593 var numMissing = numOfSidebearings -
15594 ((hmtx.length - numOfMetrics * 4) >> 1);
15595 if (numMissing > 0) {
15596 font.pos = (font.start ? font.start : 0) + metrics.offset;
15598 for (var i = 0, ii = hmtx.length; i < ii; i++)
15599 entries += String.fromCharCode(font.getByte());
15600 for (var i = 0; i < numMissing; i++)
15601 entries += '\x00\x00';
15602 metrics.data = stringToArray(entries);
15606 function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) {
15607 if (sourceEnd - sourceStart <= 12) {
15608 // glyph with data less than 12 is invalid one
15611 var glyf = source.subarray(sourceStart, sourceEnd);
15612 var contoursCount = (glyf[0] << 8) | glyf[1];
15613 if (contoursCount & 0x8000) {
15614 // complex glyph, writing as is
15615 dest.set(glyf, destStart);
15616 return glyf.length;
15619 var j = 10, flagsCount = 0;
15620 for (var i = 0; i < contoursCount; i++) {
15621 var endPoint = (glyf[j] << 8) | glyf[j + 1];
15622 flagsCount = endPoint + 1;
15625 // skipping instructions
15626 var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
15627 j += 2 + instructionsLength;
15628 // validating flags
15629 var coordinatesLength = 0;
15630 for (var i = 0; i < flagsCount; i++) {
15631 var flag = glyf[j++];
15633 // reserved flags must be zero, rejecting
15636 var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
15637 ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
15638 coordinatesLength += xyLength;
15640 var repeat = glyf[j++];
15642 coordinatesLength += repeat * xyLength;
15645 var glyphDataLength = j + coordinatesLength;
15646 if (glyphDataLength > glyf.length) {
15647 // not enough data for coordinates
15650 if (glyf.length - glyphDataLength > 3) {
15651 // truncating and aligning to 4 bytes the long glyph data
15652 glyphDataLength = (glyphDataLength + 3) & ~3;
15653 dest.set(glyf.subarray(0, glyphDataLength), destStart);
15654 return glyphDataLength;
15656 // glyph data is fine
15657 dest.set(glyf, destStart);
15658 return glyf.length;
15661 function sanitizeGlyphLocations(loca, glyf, numGlyphs,
15662 isGlyphLocationsLong) {
15663 var itemSize, itemDecode, itemEncode;
15664 if (isGlyphLocationsLong) {
15666 itemDecode = function fontItemDecodeLong(data, offset) {
15667 return (data[offset] << 24) | (data[offset + 1] << 16) |
15668 (data[offset + 2] << 8) | data[offset + 3];
15670 itemEncode = function fontItemEncodeLong(data, offset, value) {
15671 data[offset] = (value >>> 24) & 0xFF;
15672 data[offset + 1] = (value >> 16) & 0xFF;
15673 data[offset + 2] = (value >> 8) & 0xFF;
15674 data[offset + 3] = value & 0xFF;
15678 itemDecode = function fontItemDecode(data, offset) {
15679 return (data[offset] << 9) | (data[offset + 1] << 1);
15681 itemEncode = function fontItemEncode(data, offset, value) {
15682 data[offset] = (value >> 9) & 0xFF;
15683 data[offset + 1] = (value >> 1) & 0xFF;
15686 var locaData = loca.data;
15687 // removing the invalid glyphs
15688 var oldGlyfData = glyf.data;
15689 var oldGlyfDataLength = oldGlyfData.length;
15690 var newGlyfData = new Uint8Array(oldGlyfDataLength);
15691 var startOffset = itemDecode(locaData, 0);
15692 var writeOffset = 0;
15693 itemEncode(locaData, 0, writeOffset);
15694 for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
15695 var endOffset = itemDecode(locaData, j);
15696 if (endOffset > oldGlyfDataLength) {
15697 // glyph end offset points outside glyf data, rejecting the glyph
15698 itemEncode(locaData, j, writeOffset);
15699 startOffset = endOffset;
15703 var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
15704 newGlyfData, writeOffset);
15705 writeOffset += newLength;
15706 itemEncode(locaData, j, writeOffset);
15707 startOffset = endOffset;
15710 if (writeOffset == 0) {
15711 // glyf table cannot be empty -- redoing the glyf and loca tables
15712 // to have single glyph with one point
15713 var simpleGlyph = new Uint8Array(
15714 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
15715 for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize)
15716 itemEncode(locaData, j, simpleGlyph.length);
15717 glyf.data = simpleGlyph;
15721 glyf.data = newGlyfData.subarray(0, writeOffset);
15724 function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) {
15725 var itemSize, itemDecode;
15726 if (isGlyphLocationsLong) {
15728 itemDecode = function fontItemDecodeLong(data, offset) {
15729 return (data[offset] << 24) | (data[offset + 1] << 16) |
15730 (data[offset + 2] << 8) | data[offset + 3];
15734 itemDecode = function fontItemDecode(data, offset) {
15735 return (data[offset] << 9) | (data[offset + 1] << 1);
15738 var data = locaTable.data, length = data.length;
15739 var lastOffset = itemDecode(data, 0);
15740 for (var i = itemSize, j = 0; i < length; i += itemSize, j++) {
15741 var offset = itemDecode(data, i);
15742 if (offset == lastOffset)
15743 emptyGlyphIds[j] = true;
15744 lastOffset = offset;
15748 function readGlyphNameMap(post, properties) {
15749 var start = (font.start ? font.start : 0) + post.offset;
15752 var length = post.length, end = start + length;
15753 var version = int32(font.getBytes(4));
15754 // skip rest to the tables
15760 glyphNames = MacStandardGlyphOrdering;
15763 var numGlyphs = int16(font.getBytes(2));
15764 var glyphNameIndexes = [];
15765 for (var i = 0; i < numGlyphs; ++i)
15766 glyphNameIndexes.push(int16(font.getBytes(2)));
15767 var customNames = [];
15768 while (font.pos < end) {
15769 var stringLength = font.getByte();
15771 for (var i = 0; i < stringLength; ++i)
15772 string += font.getChar();
15773 customNames.push(string);
15776 for (var i = 0; i < numGlyphs; ++i) {
15777 var j = glyphNameIndexes[i];
15779 glyphNames.push(MacStandardGlyphOrdering[j]);
15782 glyphNames.push(customNames[j - 258]);
15788 warn('Unknown/unsupported post table version ' + version);
15791 properties.glyphNames = glyphNames;
15794 function isOS2Valid(os2Table) {
15795 var data = os2Table.data;
15796 // usWinAscent == 0 makes font unreadable by windows
15797 var usWinAscent = (data[74] << 8) | data[75];
15798 if (usWinAscent == 0)
15804 // Check that required tables are present
15805 var requiredTables = ['OS/2', 'cmap', 'head', 'hhea',
15806 'hmtx', 'maxp', 'name', 'post'];
15808 var header = readOpenTypeHeader(font);
15809 var numTables = header.numTables;
15811 var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf, os2;
15813 for (var i = 0; i < numTables; i++) {
15814 var table = readTableEntry(font);
15815 var index = requiredTables.indexOf(table.tag);
15817 if (table.tag == 'cmap')
15819 else if (table.tag == 'post')
15821 else if (table.tag == 'maxp')
15823 else if (table.tag == 'hhea')
15825 else if (table.tag == 'hmtx')
15827 else if (table.tag == 'head')
15829 else if (table.tag == 'OS/2')
15832 requiredTables.splice(index, 1);
15834 if (table.tag == 'vmtx')
15836 else if (table.tag == 'vhea')
15838 else if (table.tag == 'loca')
15840 else if (table.tag == 'glyf')
15843 tables.push(table);
15846 var numTables = tables.length + requiredTables.length;
15848 // header and new offsets. Table entry information is appended to the
15849 // end of file. The virtualOffset represents where to put the actual
15850 // data of a particular table;
15853 virtualOffset: numTables * (4 * 4)
15856 // The new numbers of tables will be the last one plus the num
15857 // of missing tables
15858 createOpenTypeHeader(header.version, ttf, numTables);
15860 // Invalid OS/2 can break the font for the Windows
15861 if (os2 && !isOS2Valid(os2)) {
15862 tables.splice(tables.indexOf(os2), 1);
15866 // Ensure the [h/v]mtx tables contains the advance width and
15867 // sidebearings information for numGlyphs in the maxp table
15868 font.pos = (font.start || 0) + maxp.offset;
15869 var version = int16(font.getBytes(4));
15870 var numGlyphs = int16(font.getBytes(2));
15872 sanitizeMetrics(font, hhea, hmtx, numGlyphs);
15873 sanitizeMetrics(font, vhea, vmtx, numGlyphs);
15875 var isGlyphLocationsLong = int16([head.data[50], head.data[51]]);
15876 if (head && loca && glyf) {
15877 sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong);
15880 var emptyGlyphIds = [];
15882 findEmptyGlyphs(loca, isGlyphLocationsLong, emptyGlyphIds);
15884 // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
15885 // Sometimes it's 0. That needs to be fixed
15886 if (hhea.data[10] == 0 && hhea.data[11] == 0) {
15887 hhea.data[10] = 0xFF;
15888 hhea.data[11] = 0xFF;
15891 // The 'post' table has glyphs names.
15893 readGlyphNameMap(post, properties);
15897 if (properties.type == 'CIDFontType2') {
15898 // Replace the old CMAP table with a shiny new one
15899 // Type2 composite fonts map characters directly to glyphs so the cmap
15900 // table must be replaced.
15901 // canvas fillText will reencode some characters even if the font has a
15902 // glyph at that position - e.g. newline is converted to a space and
15903 // U+00AD (soft hyphen) is not drawn.
15904 // So, offset all the glyphs by 0xFF to avoid these cases and use
15905 // the encoding to map incoming characters to the new glyph positions
15914 var cidToGidMap = properties.cidToGidMap || [];
15915 var gidToCidMap = [0];
15916 if (cidToGidMap.length > 0) {
15917 for (var j = cidToGidMap.length - 1; j >= 0; j--) {
15918 var gid = cidToGidMap[j];
15920 gidToCidMap[gid] = j;
15922 // filling the gaps using CID above the CIDs currently used in font
15923 var nextCid = cidToGidMap.length;
15924 for (var i = 1; i < numGlyphs; i++) {
15925 if (!gidToCidMap[i])
15926 gidToCidMap[i] = nextCid++;
15933 var usedUnicodes = [];
15934 var unassignedUnicodeItems = [];
15935 for (var i = 1; i < numGlyphs; i++) {
15936 var cid = gidToCidMap[i] || i;
15937 var unicode = this.toFontChar[cid];
15938 if (!unicode || typeof unicode !== 'number' ||
15939 isSpecialUnicode(unicode) || unicode in usedUnicodes) {
15940 unassignedUnicodeItems.push(i);
15943 usedUnicodes[unicode] = true;
15944 glyphs.push({ unicode: unicode, code: cid });
15947 // trying to fit as many unassigned symbols as we can
15948 // in the range allocated for the user defined symbols
15949 var unusedUnicode = kCmapGlyphOffset;
15950 for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
15951 var i = unassignedUnicodeItems[j];
15952 var cid = gidToCidMap[i] || i;
15953 while (unusedUnicode in usedUnicodes)
15955 if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea)
15957 var unicode = unusedUnicode++;
15958 this.toFontChar[cid] = unicode;
15959 usedUnicodes[unicode] = true;
15960 glyphs.push({ unicode: unicode, code: cid });
15964 var cmapTable = readCMapTable(cmap, font);
15966 glyphs = cmapTable.glyphs;
15967 ids = cmapTable.ids;
15969 var hasShortCmap = !!cmapTable.hasShortCmap;
15970 var toFontChar = this.toFontChar;
15972 if (hasShortCmap && ids.length == numGlyphs) {
15973 // Fixes the short cmap tables -- some generators use incorrect
15975 for (var i = 0, ii = ids.length; i < ii; i++)
15979 var unusedUnicode = kCmapGlyphOffset;
15980 var glyphNames = properties.glyphNames || [];
15981 var encoding = properties.baseEncoding;
15982 var differences = properties.differences;
15983 if (toFontChar && toFontChar.length > 0) {
15984 // checking if cmap is just identity map
15985 var isIdentity = true;
15986 for (var i = 0, ii = glyphs.length; i < ii; i++) {
15987 if (glyphs[i].unicode != i + 1) {
15988 isIdentity = false;
15992 // if it is, replacing with meaningful toUnicode values
15993 if (isIdentity && !this.isSymbolicFont) {
15994 var usedUnicodes = [], unassignedUnicodeItems = [];
15995 for (var i = 0, ii = glyphs.length; i < ii; i++) {
15996 var unicode = toFontChar[i + 1];
15997 if (!unicode || typeof unicode !== 'number' ||
15998 unicode in usedUnicodes) {
15999 unassignedUnicodeItems.push(i);
16002 glyphs[i].unicode = unicode;
16003 usedUnicodes[unicode] = true;
16005 for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
16006 var i = unassignedUnicodeItems[j];
16007 while (unusedUnicode in usedUnicodes)
16010 // override only if unicode mapping is not specified
16011 if (!(cid in toFontChar))
16012 toFontChar[cid] = unusedUnicode;
16013 glyphs[i].unicode = unusedUnicode++;
16015 this.useToFontChar = true;
16019 // remove glyph references outside range of avaialable glyphs or empty
16020 var glyphsRemoved = 0;
16021 for (var i = ids.length - 1; i >= 0; i--) {
16022 if (ids[i] < numGlyphs &&
16023 (!emptyGlyphIds[ids[i]] || this.isSymbolicFont))
16026 glyphs.splice(i, 1);
16030 // checking if it's a "true" symbolic font
16031 if (this.isSymbolicFont) {
16032 var minUnicode = 0xFFFF, maxUnicode = 0;
16033 for (var i = 0, ii = glyphs.length; i < ii; i++) {
16034 var unicode = glyphs[i].unicode;
16035 minUnicode = Math.min(minUnicode, unicode);
16036 maxUnicode = Math.max(maxUnicode, unicode);
16038 // high byte must be the same for min and max unicodes
16039 if ((maxUnicode & 0xFF00) != (minUnicode & 0xFF00))
16040 this.isSymbolicFont = false;
16043 // heuristics: if removed more than 2 glyphs encoding WinAnsiEncoding
16044 // does not set properly
16045 if (glyphsRemoved > 2) {
16046 warn('Switching TrueType encoding to MacRomanEncoding for ' +
16047 this.name + ' font');
16048 encoding = Encodings.MacRomanEncoding;
16051 if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) {
16052 // Re-encode short map encoding to unicode -- that simplifies the
16053 // resolution of MacRoman encoded glyphs logic for TrueType fonts:
16054 // copying all characters to private use area, all mapping all known
16055 // glyphs to the unicodes. The glyphs and ids arrays will grow.
16056 var usedUnicodes = [];
16057 for (var i = 0, ii = glyphs.length; i < ii; i++) {
16058 var code = glyphs[i].unicode;
16060 glyphs[i].unicode += kCmapGlyphOffset;
16061 toFontChar[code] = glyphs[i].unicode;
16063 var glyphName = glyphNames[gid] || encoding[code];
16064 if (glyphName in GlyphsUnicode) {
16065 var unicode = GlyphsUnicode[glyphName];
16066 if (unicode in usedUnicodes)
16069 usedUnicodes[unicode] = true;
16072 code: glyphs[i].code
16075 toFontChar[code] = unicode;
16078 this.useToFontChar = true;
16079 } else if (!this.isSymbolicFont && (this.hasEncoding ||
16080 properties.glyphNames || differences.length > 0)) {
16081 // Re-encode cmap encoding to unicode, based on the 'post' table data
16082 // diffrence array or base encoding
16083 var reverseMap = [];
16084 for (var i = 0, ii = glyphs.length; i < ii; i++)
16085 reverseMap[glyphs[i].unicode] = i;
16087 var newGlyphUnicodes = [];
16088 for (var i = 0, ii = glyphs.length; i < ii; i++) {
16089 var code = glyphs[i].unicode;
16090 var changeCode = false;
16093 var glyphName = glyphNames[gid];
16095 glyphName = differences[code] || encoding[code];
16098 if (glyphName in GlyphsUnicode) {
16099 var unicode = GlyphsUnicode[glyphName];
16100 if (!unicode || reverseMap[unicode] === i)
16101 continue; // unknown glyph name or in its own place
16103 newGlyphUnicodes[i] = unicode;
16105 toFontChar[code] = unicode;
16106 delete reverseMap[code];
16109 for (var index in newGlyphUnicodes) {
16110 var unicode = newGlyphUnicodes[index];
16111 if (reverseMap[unicode]) {
16112 // avoiding assigning to the same unicode
16113 glyphs[index].unicode = unusedUnicode++;
16116 glyphs[index].unicode = unicode;
16117 reverseMap[unicode] = index;
16119 this.useToFontChar = true;
16122 // Moving all symbolic font glyphs into 0xF000 - 0xF0FF range.
16123 if (this.isSymbolicFont) {
16124 for (var i = 0, ii = glyphs.length; i < ii; i++) {
16125 var code = glyphs[i].unicode & 0xFF;
16126 var fontCharCode = kSymbolicFontGlyphOffset | code;
16127 glyphs[i].unicode = toFontChar[code] = fontCharCode;
16129 this.useToFontChar = true;
16132 createGlyphNameMap(glyphs, ids, properties);
16133 this.glyphNameMap = properties.glyphNameMap;
16136 // Converting glyphs and ids into font's cmap table
16137 cmap.data = createCMapTable(glyphs, ids);
16138 var unicodeIsEnabled = [];
16139 for (var i = 0, ii = glyphs.length; i < ii; i++) {
16140 unicodeIsEnabled[glyphs[i].unicode] = true;
16142 this.unicodeIsEnabled = unicodeIsEnabled;
16145 // extract some more font properties from the OpenType head and
16146 // hhea tables; yMin and descent value are always negative
16148 unitsPerEm: int16([head.data[18], head.data[19]]),
16149 yMax: int16([head.data[42], head.data[43]]),
16150 yMin: int16([head.data[38], head.data[39]]) - 0x10000,
16151 ascent: int16([hhea.data[4], hhea.data[5]]),
16152 descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000
16157 data: stringToArray(createOS2Table(properties, glyphs, override))
16161 // Rewrite the 'post' table if needed
16162 if (requiredTables.indexOf('post') != -1) {
16165 data: stringToArray(createPostTable(properties))
16169 // Rewrite the 'name' table if needed
16170 if (requiredTables.indexOf('name') != -1) {
16173 data: stringToArray(createNameTable(this.name))
16177 // Tables needs to be written by ascendant alphabetic order
16178 tables.sort(function tables_sort(a, b) {
16179 return (a.tag > b.tag) - (a.tag < b.tag);
16182 // rewrite the tables but tweak offsets
16183 for (var i = 0, ii = tables.length; i < ii; i++) {
16184 var table = tables[i];
16187 var tableData = table.data;
16188 for (var j = 0, jj = tableData.length; j < jj; j++)
16189 data.push(tableData[j]);
16190 createTableEntry(ttf, table.tag, data);
16193 // Add the table datas
16194 for (var i = 0, ii = tables.length; i < ii; i++) {
16195 var table = tables[i];
16196 var tableData = table.data;
16197 ttf.file += arrayToString(tableData);
16199 // 4-byte aligned data
16200 while (ttf.file.length & 3)
16201 ttf.file += String.fromCharCode(0);
16204 return stringToArray(ttf.file);
16207 convert: function Font_convert(fontName, font, properties) {
16208 function isFixedPitch(glyphs) {
16209 for (var i = 0, ii = glyphs.length - 1; i < ii; i++) {
16210 if (glyphs[i] != glyphs[i + 1])
16216 // The offsets object holds at the same time a representation of where
16217 // to write the table entry information about a table and another offset
16218 // representing the offset where to draw the actual data of a particular
16220 var kRequiredTablesCount = 9;
16224 virtualOffset: 9 * (4 * 4)
16227 createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9);
16229 var charstrings = font.charstrings;
16230 properties.fixedPitch = isFixedPitch(charstrings);
16232 var glyphNameMap = {};
16233 for (var i = 0; i < charstrings.length; ++i) {
16234 var charstring = charstrings[i];
16235 glyphNameMap[charstring.glyph] = charstring.unicode;
16237 this.glyphNameMap = glyphNameMap;
16239 if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
16240 properties.subtype == 'CIDFontType0C')) {
16242 for (var i = 0; i < charstrings.length; ++i) {
16243 var charstring = charstrings[i];
16244 encoding[charstring.code] = charstring.glyph;
16246 properties.baseEncoding = encoding;
16248 if (properties.subtype == 'CIDFontType0C') {
16249 var toFontChar = [];
16250 for (var i = 0; i < charstrings.length; ++i) {
16251 var charstring = charstrings[i];
16252 toFontChar[charstring.code] = charstring.unicode;
16254 this.toFontChar = toFontChar;
16258 // PostScript Font Program
16261 // OS/2 and Windows Specific metrics
16262 'OS/2': stringToArray(createOS2Table(properties, charstrings)),
16264 // Character to glyphs mapping
16265 'cmap': createCMapTable(charstrings.slice(),
16266 ('glyphIds' in font) ? font.glyphIds : null),
16269 'head': (function fontFieldsHead() {
16270 return stringToArray(
16271 '\x00\x01\x00\x00' + // Version number
16272 '\x00\x00\x10\x00' + // fontRevision
16273 '\x00\x00\x00\x00' + // checksumAdjustement
16274 '\x5F\x0F\x3C\xF5' + // magicNumber
16275 '\x00\x00' + // Flags
16276 '\x03\xE8' + // unitsPerEM (defaulting to 1000)
16277 '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
16278 '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
16279 '\x00\x00' + // xMin
16280 safeString16(properties.descent) + // yMin
16281 '\x0F\xFF' + // xMax
16282 safeString16(properties.ascent) + // yMax
16283 string16(properties.italicAngle ? 2 : 0) + // macStyle
16284 '\x00\x11' + // lowestRecPPEM
16285 '\x00\x00' + // fontDirectionHint
16286 '\x00\x00' + // indexToLocFormat
16287 '\x00\x00'); // glyphDataFormat
16290 // Horizontal header
16291 'hhea': (function fontFieldsHhea() {
16292 return stringToArray(
16293 '\x00\x01\x00\x00' + // Version number
16294 safeString16(properties.ascent) + // Typographic Ascent
16295 safeString16(properties.descent) + // Typographic Descent
16296 '\x00\x00' + // Line Gap
16297 '\xFF\xFF' + // advanceWidthMax
16298 '\x00\x00' + // minLeftSidebearing
16299 '\x00\x00' + // minRightSidebearing
16300 '\x00\x00' + // xMaxExtent
16301 safeString16(properties.capHeight) + // caretSlopeRise
16302 safeString16(Math.tan(properties.italicAngle) *
16303 properties.xHeight) + // caretSlopeRun
16304 '\x00\x00' + // caretOffset
16305 '\x00\x00' + // -reserved-
16306 '\x00\x00' + // -reserved-
16307 '\x00\x00' + // -reserved-
16308 '\x00\x00' + // -reserved-
16309 '\x00\x00' + // metricDataFormat
16310 string16(charstrings.length + 1)); // Number of HMetrics
16313 // Horizontal metrics
16314 'hmtx': (function fontFieldsHmtx() {
16315 var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
16316 for (var i = 0, ii = charstrings.length; i < ii; i++) {
16317 var charstring = charstrings[i];
16318 var width = 'width' in charstring ? charstring.width : 0;
16319 hmtx += string16(width) + string16(0);
16321 return stringToArray(hmtx);
16325 'maxp': (function fontFieldsMaxp() {
16326 return stringToArray(
16327 '\x00\x00\x50\x00' + // Version number
16328 string16(charstrings.length + 1)); // Num of glyphs
16332 'name': stringToArray(createNameTable(fontName)),
16334 // PostScript informations
16335 'post': stringToArray(createPostTable(properties))
16338 for (var field in fields)
16339 createTableEntry(otf, field, fields[field]);
16341 for (var field in fields) {
16342 var table = fields[field];
16343 otf.file += arrayToString(table);
16346 return stringToArray(otf.file);
16349 buildToFontChar: function Font_buildToFontChar(toUnicode) {
16351 var unusedUnicode = kCmapGlyphOffset;
16352 for (var i = 0, ii = toUnicode.length; i < ii; i++) {
16353 var unicode = toUnicode[i];
16354 var fontCharCode = typeof unicode === 'object' ? unusedUnicode++ :
16356 if (typeof unicode !== 'undefined')
16357 result[i] = fontCharCode;
16362 rebuildToUnicode: function Font_rebuildToUnicode(properties) {
16363 var firstChar = properties.firstChar, lastChar = properties.lastChar;
16365 if (properties.composite) {
16366 var isIdentityMap = this.cidToUnicode.length == 0;
16367 for (var i = firstChar, ii = lastChar; i <= ii; i++) {
16368 // TODO missing map the character according font's CMap
16370 map[i] = isIdentityMap ? cid : this.cidToUnicode[cid];
16373 for (var i = firstChar, ii = lastChar; i <= ii; i++) {
16374 var glyph = properties.differences[i];
16376 glyph = properties.baseEncoding[i];
16377 if (!!glyph && (glyph in GlyphsUnicode))
16378 map[i] = GlyphsUnicode[glyph];
16381 this.toUnicode = map;
16384 loadCidToUnicode: function Font_loadCidToUnicode(properties) {
16385 if (!properties.cidSystemInfo)
16388 var cidToUnicodeMap = [], unicodeToCIDMap = [];
16389 this.cidToUnicode = cidToUnicodeMap;
16390 this.unicodeToCID = unicodeToCIDMap;
16392 var cidSystemInfo = properties.cidSystemInfo;
16394 if (cidSystemInfo) {
16395 cidToUnicode = CIDToUnicodeMaps[
16396 cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
16400 return; // identity encoding
16402 var cid = 1, i, j, k, ii;
16403 for (i = 0, ii = cidToUnicode.length; i < ii; ++i) {
16404 var unicode = cidToUnicode[i];
16405 if (isArray(unicode)) {
16406 var length = unicode.length;
16407 for (j = 0; j < length; j++) {
16408 cidToUnicodeMap[cid] = unicode[j];
16409 unicodeToCIDMap[unicode[j]] = cid;
16412 } else if (typeof unicode === 'object') {
16413 var fillLength = unicode.f;
16416 for (j = 0; j < fillLength; ++j) {
16417 cidToUnicodeMap[cid] = k;
16418 unicodeToCIDMap[k] = cid;
16424 } else if (unicode) {
16425 cidToUnicodeMap[cid] = unicode;
16426 unicodeToCIDMap[unicode] = cid;
16433 bindDOM: function Font_bindDOM(data) {
16434 var fontName = this.loadedName;
16436 // Add the font-face rule to the document
16437 var url = ('url(data:' + this.mimetype + ';base64,' +
16438 PdfJS_window.window.btoa(data) + ');');
16439 var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}';
16441 var styleElement = PdfJS_window.document.createElement('style');
16442 PdfJS_window.document.documentElement.getElementsByTagName('head')[0].appendChild(
16445 var styleSheet = styleElement.sheet;
16446 styleSheet.insertRule(rule, styleSheet.cssRules.length);
16448 if (PDFJS.pdfBug && FontInspector.enabled)
16449 FontInspector.fontAdded(this, url);
16455 // trying to estimate space character width
16456 var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
16458 for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
16459 var glyphName = possibleSpaceReplacements[i];
16460 // if possible, getting width by glyph name
16461 if (glyphName in this.widths) {
16462 width = this.widths[glyphName];
16465 var glyphUnicode = GlyphsUnicode[glyphName];
16466 // finding the charcode via unicodeToCID map
16468 if (this.composite)
16469 charcode = this.unicodeToCID[glyphUnicode];
16470 // ... via toUnicode map
16471 if (!charcode && 'toUnicode' in this)
16472 charcode = this.toUnicode.indexOf(glyphUnicode);
16473 // setting it to unicode if negative or undefined
16474 if (!(charcode > 0))
16475 charcode = glyphUnicode;
16476 // trying to get width via charcode
16477 width = this.widths[charcode];
16479 break; // the non-zero width found
16481 width = (width || this.defaultWidth) * this.widthMultiplier;
16482 return shadow(this, 'spaceWidth', width);
16485 charToGlyph: function Font_charToGlyph(charcode) {
16486 var fontCharCode, width, operatorList, disabled;
16488 var width = this.widths[charcode];
16490 switch (this.type) {
16491 case 'CIDFontType0':
16492 if (this.noUnicodeAdaptation) {
16493 width = this.widths[this.unicodeToCID[charcode] || charcode];
16494 fontCharCode = mapPrivateUseChars(charcode);
16497 fontCharCode = this.toFontChar[charcode] || charcode;
16499 case 'CIDFontType2':
16500 if (this.noUnicodeAdaptation) {
16501 width = this.widths[this.unicodeToCID[charcode] || charcode];
16502 fontCharCode = mapPrivateUseChars(charcode);
16505 fontCharCode = this.toFontChar[charcode] || charcode;
16508 var glyphName = this.differences[charcode] || this.encoding[charcode];
16510 width = this.widths[glyphName];
16511 if (this.noUnicodeAdaptation) {
16512 fontCharCode = mapPrivateUseChars(GlyphsUnicode[glyphName] ||
16516 fontCharCode = this.glyphNameMap[glyphName] ||
16517 GlyphsUnicode[glyphName] || charcode;
16520 var glyphName = this.differences[charcode] || this.encoding[charcode];
16521 operatorList = this.charProcOperatorList[glyphName];
16522 fontCharCode = charcode;
16525 if (this.useToFontChar) {
16526 fontCharCode = this.toFontChar[charcode] || charcode;
16529 var glyphName = this.differences[charcode] || this.encoding[charcode];
16531 glyphName = Encodings.StandardEncoding[charcode];
16533 width = this.widths[glyphName];
16534 if (this.noUnicodeAdaptation) {
16535 fontCharCode = GlyphsUnicode[glyphName] || charcode;
16538 if (!this.hasEncoding || this.isSymbolicFont) {
16539 fontCharCode = this.useToFontChar ? this.toFontChar[charcode] :
16544 // MacRoman encoding address by re-encoding the cmap table
16545 fontCharCode = glyphName in this.glyphNameMap ?
16546 this.glyphNameMap[glyphName] : GlyphsUnicode[glyphName];
16549 warn('Unsupported font type: ' + this.type);
16553 var unicodeChars = !('toUnicode' in this) ? charcode :
16554 this.toUnicode[charcode] || charcode;
16555 if (typeof unicodeChars === 'number')
16556 unicodeChars = String.fromCharCode(unicodeChars);
16558 width = (isNum(width) ? width : this.defaultWidth) * this.widthMultiplier;
16559 disabled = this.unicodeIsEnabled ?
16560 !this.unicodeIsEnabled[fontCharCode] : false;
16563 fontChar: String.fromCharCode(fontCharCode),
16564 unicode: unicodeChars,
16566 disabled: disabled,
16567 operatorList: operatorList
16571 charsToGlyphs: function Font_charsToGlyphs(chars) {
16572 var charsCache = this.charsCache;
16575 // if we translated this string before, just grab it from the cache
16577 glyphs = charsCache[chars];
16582 // lazily create the translation cache
16584 charsCache = this.charsCache = Object.create(null);
16588 if (this.wideChars) {
16589 // composite fonts have multi-byte strings convert the string from
16590 // single-byte to multi-byte
16591 // XXX assuming CIDFonts are two-byte - later need to extract the
16592 // correct byte encoding according to the PDF spec
16593 var length = chars.length - 1; // looping over two bytes at a time so
16594 // loop should never end on the last byte
16595 for (var i = 0; i < length; i++) {
16596 var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]);
16597 var glyph = this.charToGlyph(charcode);
16598 glyphs.push(glyph);
16599 // placing null after each word break charcode (ASCII SPACE)
16600 if (charcode == 0x20)
16605 for (var i = 0, ii = chars.length; i < ii; ++i) {
16606 var charcode = chars.charCodeAt(i);
16607 var glyph = this.charToGlyph(charcode);
16608 glyphs.push(glyph);
16609 if (charcode == 0x20)
16614 // Enter the translated string into the cache
16615 return (charsCache[chars] = glyphs);
16623 * Type1Parser encapsulate the needed code for parsing a Type1 font
16624 * program. Some of its logic depends on the Type2 charstrings
16627 var Type1Parser = function type1Parser() {
16629 * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
16630 * of Plaintext Bytes. The function took a key as a parameter which can be
16631 * for decrypting the eexec block of for decoding charStrings.
16633 var kEexecEncryptionKey = 55665;
16634 var kCharStringsEncryptionKey = 4330;
16636 function decrypt(stream, key, discardNumber) {
16637 var r = key, c1 = 52845, c2 = 22719;
16638 var decryptedString = [];
16641 var count = stream.length;
16642 for (var i = 0; i < count; i++) {
16644 decryptedString[i] = value ^ (r >> 8);
16645 r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
16647 return decryptedString.slice(discardNumber);
16651 * CharStrings are encoded following the the CharString Encoding sequence
16652 * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
16653 * The value in a byte indicates a command, a number, or subsequent bytes
16654 * that are to be interpreted in a special way.
16656 * CharString Number Encoding:
16657 * A CharString byte containing the values from 32 through 255 inclusive
16658 * indicate an integer. These values are decoded in four ranges.
16660 * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
16661 * indicate the integer v - 139. Thus, the integer values from -107 through
16662 * 107 inclusive may be encoded in single byte.
16664 * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
16665 * indicates an integer involving the next byte, w, according to the formula:
16666 * [(v - 247) x 256] + w + 108
16668 * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
16669 * indicates an integer involving the next byte, w, according to the formula:
16670 * -[(v - 251) * 256] - w - 108
16672 * 4. A CharString containing the value 255 indicates that the next 4 bytes
16673 * are a two complement signed integer. The first of these bytes contains the
16674 * highest order bits, the second byte contains the next higher order bits
16675 * and the fourth byte contain the lowest order bits.
16678 * CharString Command Encoding:
16679 * CharStrings commands are encoded in 1 or 2 bytes.
16681 * Single byte commands are encoded in 1 byte that contains a value between
16682 * 0 and 31 inclusive.
16683 * If a command byte contains the value 12, then the value in the next byte
16684 * indicates a command. This "escape" mechanism allows many extra commands
16685 * to be encoded and this encoding technique helps to minimize the length of
16688 var charStringDictionary = {
16697 // closepath is a Type1 command that do not take argument and is useless
16698 // in Type2 and it can simply be ignored.
16699 '9': null, // closepath
16703 // return is normally used inside sub-routines to tells to the execution
16704 // flow that it can be back to normal.
16705 // During the translation process Type1 charstrings will be flattened and
16706 // sub-routines will be embedded directly into the charstring directly, so
16707 // this can be ignored safely.
16711 // dotsection is a Type1 command to specify some hinting feature for dots
16712 // that do not take a parameter and it can safely be ignored for Type2.
16713 '0': null, // dotsection
16715 // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple
16716 // parameters, so instead of returning [vh]stem3 take a shortcut and
16717 // return [vhstem] instead.
16721 // Type1 only command with command not (yet) built-in ,throw an error
16728 // callothersubr is a mechanism to make calls on the postscript
16729 // interpreter, this is not supported by Type2 charstring but hopefully
16730 // most of the default commands can be ignored safely.
16731 '16': 'callothersubr',
16735 // setcurrentpoint sets the current point to x, y without performing a
16736 // moveto (this is a one shot positionning command). This is used only
16737 // with the return of an OtherSubrs call.
16738 // TODO Implement the OtherSubrs charstring embedding and replace this
16739 // call by a no-op, like 2 'pop' commands for example.
16740 '33': null // setcurrentpoint
16750 var kEscapeCommand = 12;
16752 function decodeCharString(array) {
16753 var charstring = [];
16759 var count = array.length;
16760 for (var i = 0; i < count; i++) {
16764 var command = null;
16765 if (value == kEscapeCommand) {
16766 var escape = array[++i];
16768 // TODO Clean this code
16769 if (escape == 16) {
16770 var index = charstring.pop();
16771 var argc = charstring.pop();
16772 for (var j = 0; j < argc; j++)
16773 charstring.push('drop');
16775 // If the flex mechanism is not used in a font program, Adobe
16776 // states that entries 0, 1 and 2 can simply be replaced by
16777 // {}, which means that we can simply ignore them.
16782 // This is the same things about hint replacement, if it is not used
16783 // entry 3 can be replaced by {3}
16784 // TODO support hint replacment
16786 charstring.push(3);
16790 } else if (escape == 17 || escape == 33) {
16791 // pop or setcurrentpoint commands can be ignored
16792 // since we are not doing callothersubr
16794 } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
16795 charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
16799 command = charStringDictionary['12'][escape];
16801 // TODO Clean this code
16802 if (value == 13) { // hsbw
16803 if (charstring.length == 2) {
16804 lsb = charstring[0];
16805 width = charstring[1];
16806 charstring.splice(0, 1);
16807 } else if (charstring.length == 4 && charstring[3] == 'div') {
16808 lsb = charstring[0];
16809 width = charstring[1] / charstring[2];
16810 charstring.splice(0, 1);
16811 } else if (charstring.length == 4 && charstring[2] == 'div') {
16812 lsb = charstring[0] / charstring[1];
16813 width = charstring[3];
16814 charstring.splice(0, 3);
16816 error('Unsupported hsbw format: ' + charstring);
16819 charstring.push(lsb, 'hmoveto');
16821 } else if (value == 10) { // callsubr
16822 if (charstring[charstring.length - 1] < 3) { // subr #0..2
16823 var subrNumber = charstring.pop();
16824 switch (subrNumber) {
16826 flexState = 1; // prepare for flex coordinates
16829 flexState = 2; // flex in progress
16832 // type2 flex command does not need final coords
16833 charstring.push('exch', 'drop', 'exch', 'drop');
16834 charstring.push('flex');
16840 } else if (value == 21 && flexState > 0) {
16842 continue; // ignoring rmoveto
16843 value = 5; // first segment replacing with rlineto
16844 } else if (!kHintingEnabled && (value == 1 || value == 3)) {
16845 charstring.push('drop', 'drop');
16848 command = charStringDictionary[value];
16851 // Some charstring commands are meaningless in Type2 and will return
16852 // a null, let's just ignored them
16853 if (!command && i < count) {
16855 } else if (!command) {
16857 } else if (command == -1) {
16858 warn('Support for Type1 command ' + value +
16859 ' (' + escape + ') is not implemented in charstring: ' +
16862 // we know how to ignore only some the Type1 commands
16865 charstring.push('drop', 'drop', 'drop', 'drop');
16868 charstring.push('drop');
16875 } else if (value <= 246) {
16876 value = value - 139;
16877 } else if (value <= 250) {
16878 value = ((value - 247) * 256) + array[++i] + 108;
16879 } else if (value <= 254) {
16880 value = -((value - 251) * 256) - array[++i] - 108;
16882 value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
16883 (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
16886 charstring.push(value);
16889 return { charstring: charstring, width: width, lsb: lsb };
16893 * Returns an object containing a Subrs array and a CharStrings
16894 * array extracted from and eexec encrypted block of data
16896 function readNumberArray(str, index) {
16898 while (str[index++] != '[')
16903 while (str[index++] != ']')
16906 str = str.substr(start, count);
16909 // Remove adjacent spaces
16910 str = str.replace(/\s+/g, ' ');
16912 var array = str.split(' ');
16913 for (var i = 0, ii = array.length; i < ii; i++)
16914 array[i] = parseFloat(array[i] || 0);
16918 function readNumber(str, index) {
16919 while (str[index] == ' ')
16925 while (str[index++] != ' ')
16928 return parseFloat(str.substr(start, count) || 0);
16931 function isSeparator(c) {
16932 return c == ' ' || c == '\n' || c == '\x0d';
16935 this.extractFontProgram = function Type1Parser_extractFontProgram(stream) {
16936 var eexec = decrypt(stream, kEexecEncryptionKey, 4);
16938 for (var i = 0, ii = eexec.length; i < ii; i++)
16939 eexecStr += String.fromCharCode(eexec[i]);
16941 var glyphsSection = false, subrsSection = false;
16957 var count = eexecStr.length;
16958 for (var i = 0; i < count; i++) {
16959 var getToken = function getToken() {
16960 while (i < count && isSeparator(eexecStr[i]))
16964 while (i < count && !isSeparator(eexecStr[i]))
16965 token += eexecStr[i++];
16969 var c = eexecStr[i];
16971 if ((glyphsSection || subrsSection) &&
16972 (token == 'RD' || token == '-|')) {
16974 var data = eexec.slice(i, i + length);
16975 var lenIV = program.properties.privateData['lenIV'];
16976 var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
16977 var str = decodeCharString(encoded);
16979 if (glyphsSection) {
16980 program.charstrings.push({
16982 data: str.charstring,
16987 program.subrs.push(str.charstring);
16991 } else if (isSeparator(c)) {
16992 length = parseInt(token, 10);
16996 if (!glyphsSection) {
16998 case '/CharString':
16999 glyphsSection = true;
17003 var num = parseInt(getToken(), 10);
17004 getToken(); // read in 'array'
17005 for (var j = 0; j < num; ++j) {
17006 var t = getToken(); // read in 'dup'
17007 if (t == 'ND' || t == '|-' || t == 'noaccess')
17009 var index = parseInt(getToken(), 10);
17012 var length = parseInt(getToken(), 10);
17013 getToken(); // read in 'RD'
17014 var data = eexec.slice(i + 1, i + 1 + length);
17015 var lenIV = program.properties.privateData['lenIV'];
17016 var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV);
17017 var str = decodeCharString(encoded);
17018 i = i + 1 + length;
17019 t = getToken(); // read in 'NP'
17020 if (t == 'noaccess')
17021 getToken(); // read in 'put'
17022 program.subrs[index] = str.charstring;
17025 case '/BlueValues':
17026 case '/OtherBlues':
17027 case '/FamilyBlues':
17028 case '/FamilyOtherBlues':
17031 program.properties.privateData[token.substring(1)] =
17032 readNumberArray(eexecStr, i + 1);
17036 program.properties.privateData[token.substring(1)] =
17037 readNumberArray(eexecStr, i + 2)[0];
17043 case '/LanguageGroup':
17044 case '/ExpansionFactor':
17045 program.properties.privateData[token.substring(1)] =
17046 readNumber(eexecStr, i + 1);
17049 } else if (c == '/') {
17050 token = glyph = '';
17051 while ((c = eexecStr[++i]) != ' ')
17060 this.extractFontHeader = function Type1Parser_extractFontHeader(stream,
17062 var headerString = '';
17063 for (var i = 0, ii = stream.length; i < ii; i++)
17064 headerString += String.fromCharCode(stream[i]);
17067 var count = headerString.length;
17068 for (var i = 0; i < count; i++) {
17069 var getToken = function getToken() {
17070 var character = headerString[i];
17071 while (i < count && (isSeparator(character) || character == '/'))
17072 character = headerString[++i];
17075 while (i < count && !(isSeparator(character) || character == '/')) {
17076 token += character;
17077 character = headerString[++i];
17083 var c = headerString[i];
17084 if (isSeparator(c)) {
17086 case '/FontMatrix':
17087 var matrix = readNumberArray(headerString, i + 1);
17089 // The FontMatrix is in unitPerEm, so make it pixels
17090 for (var j = 0, jj = matrix.length; j < jj; j++)
17093 // Make the angle into the right direction
17096 properties.fontMatrix = matrix;
17099 var encodingArg = getToken();
17101 if (!/^\d+$/.test(encodingArg)) {
17102 // encoding name is specified
17103 encoding = Encodings[encodingArg];
17106 var size = parseInt(encodingArg, 10);
17107 getToken(); // read in 'array'
17109 for (var j = 0; j < size; j++) {
17110 var token = getToken();
17111 if (token == 'dup') {
17112 var index = parseInt(getToken(), 10);
17113 var glyph = getToken();
17114 encoding[index] = glyph;
17115 getToken(); // read the in 'put'
17119 if (!properties.hasEncoding && encoding) {
17120 properties.baseEncoding = encoding;
17134 * The CFF class takes a Type1 file and wrap it into a
17135 * 'Compact Font Format' which itself embed Type2 charstrings.
17137 var CFFStandardStrings = [
17138 '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
17139 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
17140 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
17141 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
17142 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
17143 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
17144 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
17145 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
17146 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
17147 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
17148 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
17149 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
17150 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
17151 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
17152 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
17153 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
17154 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
17155 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
17156 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
17157 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
17158 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
17159 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
17160 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
17161 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
17162 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
17163 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
17164 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
17165 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
17166 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
17167 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
17168 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
17169 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
17170 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
17171 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff',
17172 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
17173 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
17174 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
17175 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
17176 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
17177 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
17178 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
17179 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
17180 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
17181 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
17182 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
17183 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
17184 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
17185 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
17186 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
17187 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
17188 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
17189 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
17190 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
17191 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
17192 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
17193 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
17194 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
17195 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
17196 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
17197 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
17198 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
17199 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
17200 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
17201 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
17202 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
17205 var type1Parser = new Type1Parser();
17207 // Type1Font is also a CIDFontType0.
17208 var Type1Font = function Type1Font(name, file, properties) {
17209 // Get the data block containing glyphs and subrs informations
17210 var headerBlock = file.getBytes(properties.length1);
17211 type1Parser.extractFontHeader(headerBlock, properties);
17213 // Decrypt the data blocks and retrieve it's content
17214 var eexecBlock = file.getBytes(properties.length2);
17215 var data = type1Parser.extractFontProgram(eexecBlock);
17216 for (var info in data.properties)
17217 properties[info] = data.properties[info];
17219 var charstrings = this.getOrderedCharStrings(data.charstrings, properties);
17220 var type2Charstrings = this.getType2Charstrings(charstrings);
17221 var subrs = this.getType2Subrs(data.subrs);
17223 this.charstrings = charstrings;
17224 this.data = this.wrap(name, type2Charstrings, this.charstrings,
17225 subrs, properties);
17228 Type1Font.prototype = {
17229 createCFFIndexHeader: function Type1Font_createCFFIndexHeader(objects,
17231 // First 2 bytes contains the number of objects contained into this index
17232 var count = objects.length;
17234 // If there is no object, just create an array saying that with another
17237 return '\x00\x00\x00';
17239 var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff);
17241 // Next byte contains the offset size use to reference object in the file
17242 // Actually we're using 0x04 to be sure to be able to store everything
17243 // without thinking of it while coding.
17246 // Add another offset after this one because we need a new offset
17247 var relativeOffset = 1;
17248 for (var i = 0; i < count + 1; i++) {
17249 data += String.fromCharCode((relativeOffset >>> 24) & 0xFF,
17250 (relativeOffset >> 16) & 0xFF,
17251 (relativeOffset >> 8) & 0xFF,
17252 relativeOffset & 0xFF);
17255 relativeOffset += objects[i].length;
17258 for (var i = 0; i < count; i++) {
17259 for (var j = 0, jj = objects[i].length; j < jj; j++)
17260 data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) :
17266 encodeNumber: function Type1Font_encodeNumber(value) {
17267 // some of the fonts has ouf-of-range values
17268 // they are just arithmetic overflows
17269 // make sanitizer happy
17271 if (value >= -32768 && value <= 32767) {
17273 String.fromCharCode((value >> 8) & 0xFF) +
17274 String.fromCharCode(value & 0xFF);
17277 String.fromCharCode((value >> 24) & 0xFF) +
17278 String.fromCharCode((value >> 16) & 0xFF) +
17279 String.fromCharCode((value >> 8) & 0xFF) +
17280 String.fromCharCode(value & 0xFF);
17284 getOrderedCharStrings: function Type1Font_getOrderedCharStrings(glyphs,
17286 var charstrings = [];
17287 var i, length, glyphName;
17288 var unusedUnicode = kCmapGlyphOffset;
17289 for (i = 0, length = glyphs.length; i < length; i++) {
17290 var item = glyphs[i];
17291 var glyphName = item.glyph;
17292 var unicode = glyphName in GlyphsUnicode ?
17293 GlyphsUnicode[glyphName] : unusedUnicode++;
17298 charstring: item.data,
17304 charstrings.sort(function charstrings_sort(a, b) {
17305 return a.unicode - b.unicode;
17307 return charstrings;
17310 getType2Charstrings: function Type1Font_getType2Charstrings(
17311 type1Charstrings) {
17312 var type2Charstrings = [];
17313 var count = type1Charstrings.length;
17314 for (var i = 0; i < count; i++) {
17315 var charstring = type1Charstrings[i].charstring;
17316 type2Charstrings.push(this.flattenCharstring(charstring.slice(),
17317 this.commandsMap));
17319 return type2Charstrings;
17322 getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
17324 var count = type1Subrs.length;
17327 else if (count < 33900)
17332 // Add a bunch of empty subrs to deal with the Type2 bias
17333 var type2Subrs = [];
17334 for (var i = 0; i < bias; i++)
17335 type2Subrs.push([0x0B]);
17337 for (var i = 0; i < count; i++) {
17338 var subr = type1Subrs[i];
17342 type2Subrs.push(this.flattenCharstring(subr, this.commandsMap));
17349 * Flatten the commands by interpreting the postscript code and replacing
17350 * every 'callsubr', 'callothersubr' by the real commands.
17374 flattenCharstring: function Type1Font_flattenCharstring(charstring, map) {
17375 // charstring changes size - can't cache .length in loop
17376 for (var i = 0; i < charstring.length; i++) {
17377 var command = charstring[i];
17378 if (command.charAt) {
17379 var cmd = map[command];
17380 assert(cmd, 'Unknow command: ' + command);
17383 charstring.splice(i++, 1, cmd[0], cmd[1]);
17385 charstring[i] = cmd;
17387 // Type1 charstring use a division for number above 32000
17388 if (command > 32000) {
17389 var divisor = charstring[i + 1];
17390 command /= divisor;
17391 charstring.splice(i, 3, 28, command >> 8, command & 0xff);
17393 charstring.splice(i, 1, 28, command >> 8, command & 0xff);
17401 wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
17403 // major version, minor version, header size, offset size
17404 'header': '\x01\x00\x04\x04',
17406 'names': this.createCFFIndexHeader([name]),
17408 'topDict': (function topDict(self) {
17409 return function cffWrapTopDict() {
17410 var header = '\x00\x01\x01\x01';
17412 '\xf8\x1b\x00' + // version
17413 '\xf8\x1c\x01' + // Notice
17414 '\xf8\x1d\x02' + // FullName
17415 '\xf8\x1e\x03' + // FamilyName
17416 '\xf8\x1f\x04' + // Weight
17417 '\x1c\x00\x00\x10'; // Encoding
17419 var boundingBox = properties.bbox;
17420 for (var i = 0, ii = boundingBox.length; i < ii; i++)
17421 dict += self.encodeNumber(boundingBox[i]);
17422 dict += '\x05'; // FontBBox;
17424 var offset = fields.header.length +
17425 fields.names.length +
17426 (header.length + 1) +
17427 (dict.length + (4 + 4)) +
17428 fields.strings.length +
17429 fields.globalSubrs.length;
17431 // If the offset if over 32767, encodeNumber is going to return
17432 // 5 bytes to encode the position instead of 3.
17433 if ((offset + fields.charstrings.length) > 32767) {
17439 dict += self.encodeNumber(offset) + '\x0f'; // Charset
17441 offset = offset + (glyphs.length * 2) + 1;
17442 dict += self.encodeNumber(offset) + '\x11'; // Charstrings
17444 offset = offset + fields.charstrings.length;
17445 dict += self.encodeNumber(fields.privateData.length);
17446 dict += self.encodeNumber(offset) + '\x12'; // Private
17448 return header + String.fromCharCode(dict.length + 1) + dict;
17452 'strings': (function strings(self) {
17454 'Version 0.11', // Version
17455 'See original notice', // Notice
17457 name, // FamilyName
17460 return self.createCFFIndexHeader(strings);
17463 'globalSubrs': this.createCFFIndexHeader([]),
17465 'charset': (function charset(self) {
17466 var charsetString = '\x00'; // Encoding
17468 var count = glyphs.length;
17469 for (var i = 0; i < count; i++) {
17470 var index = CFFStandardStrings.indexOf(charstrings[i].glyph);
17471 // Some characters like asterikmath && circlecopyrt are
17472 // missing from the original strings, for the moment let's
17473 // map them to .notdef and see later if it cause any
17478 charsetString += String.fromCharCode(index >> 8, index & 0xff);
17480 return charsetString;
17483 'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
17486 'privateData': (function cffWrapPrivate(self) {
17488 '\x8b\x14' + // defaultWidth
17489 '\x8b\x15'; // nominalWidth
17491 BlueValues: '\x06',
17492 OtherBlues: '\x07',
17493 FamilyBlues: '\x08',
17494 FamilyOtherBlues: '\x09',
17495 StemSnapH: '\x0c\x0c',
17496 StemSnapV: '\x0c\x0d',
17497 BlueShift: '\x0c\x0a',
17498 BlueFuzz: '\x0c\x0b',
17499 BlueScale: '\x0c\x09',
17500 LanguageGroup: '\x0c\x11',
17501 ExpansionFactor: '\x0c\x18'
17503 for (var field in fieldMap) {
17504 if (!properties.privateData.hasOwnProperty(field))
17506 var value = properties.privateData[field];
17508 if (isArray(value)) {
17509 data += self.encodeNumber(value[0]);
17510 for (var i = 1, ii = value.length; i < ii; i++)
17511 data += self.encodeNumber(value[i] - value[i - 1]);
17513 data += self.encodeNumber(value);
17515 data += fieldMap[field];
17518 data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
17523 'localSubrs': this.createCFFIndexHeader(subrs, true)
17525 fields.topDict = fields.topDict();
17529 for (var index in fields) {
17530 var field = fields[index];
17531 for (var i = 0, ii = field.length; i < ii; i++)
17532 cff.push(field.charCodeAt(i));
17539 var CFFFont = (function CFFFontClosure() {
17540 function CFFFont(file, properties) {
17541 this.properties = properties;
17543 var parser = new CFFParser(file, properties);
17544 var cff = parser.parse();
17545 var compiler = new CFFCompiler(cff);
17546 this.readExtra(cff);
17548 this.data = compiler.compile();
17550 warn('Failed to compile font ' + properties.loadedName);
17551 // There may have just been an issue with the compiler, set the data
17552 // anyway and hope the font loaded.
17557 CFFFont.prototype = {
17558 readExtra: function CFFFont_readExtra(cff) {
17559 // charstrings contains info about glyphs (one element per glyph
17560 // containing mappings for {unicode, width})
17561 var charset = cff.charset.charset;
17562 var encoding = cff.encoding ? cff.encoding.encoding : null;
17563 var charstrings = this.getCharStrings(charset, encoding);
17565 // create the mapping between charstring and glyph id
17567 for (var i = 0, ii = charstrings.length; i < ii; i++)
17568 glyphIds.push(charstrings[i].gid);
17570 this.charstrings = charstrings;
17571 this.glyphIds = glyphIds;
17573 getCharStrings: function CFFFont_getCharStrings(charsets, encoding) {
17574 var charstrings = [];
17575 var unicodeUsed = [];
17576 var unassignedUnicodeItems = [];
17577 var inverseEncoding = [];
17578 // CID fonts don't have an encoding.
17579 if (encoding !== null)
17580 for (var charcode in encoding)
17581 inverseEncoding[encoding[charcode]] = charcode | 0;
17583 inverseEncoding = charsets;
17584 for (var i = 0, ii = charsets.length; i < ii; i++) {
17585 var glyph = charsets[i];
17586 if (glyph == '.notdef')
17589 var code = inverseEncoding[i];
17590 if (!code || isSpecialUnicode(code)) {
17591 unassignedUnicodeItems.push(i);
17600 unicodeUsed[code] = true;
17603 var nextUnusedUnicode = kCmapGlyphOffset;
17604 for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) {
17605 var i = unassignedUnicodeItems[j];
17606 // giving unicode value anyway
17607 while (nextUnusedUnicode in unicodeUsed)
17608 nextUnusedUnicode++;
17609 var unicode = nextUnusedUnicode++;
17612 code: inverseEncoding[i] || 0,
17618 // sort the array by the unicode value (again)
17619 charstrings.sort(function getCharStringsSort(a, b) {
17620 return a.unicode - b.unicode;
17622 return charstrings;
17629 var CFFParser = (function CFFParserClosure() {
17630 function CFFParser(file, properties) {
17631 this.bytes = file.getBytes();
17632 this.properties = properties;
17634 CFFParser.prototype = {
17635 parse: function CFFParser_parse() {
17636 var properties = this.properties;
17637 var cff = new CFF();
17640 // The first five sections must be in order, all the others are reached
17641 // via offsets contained in one of the below.
17642 var header = this.parseHeader();
17643 var nameIndex = this.parseIndex(header.endPos);
17644 var topDictIndex = this.parseIndex(nameIndex.endPos);
17645 var stringIndex = this.parseIndex(topDictIndex.endPos);
17646 var globalSubrIndex = this.parseIndex(stringIndex.endPos);
17648 var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
17649 var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
17651 cff.header = header.obj;
17652 cff.names = this.parseNameIndex(nameIndex.obj);
17653 cff.strings = this.parseStringIndex(stringIndex.obj);
17654 cff.topDict = topDict;
17655 cff.globalSubrIndex = globalSubrIndex.obj;
17657 this.parsePrivateDict(cff.topDict);
17659 cff.isCIDFont = topDict.hasName('ROS');
17661 var charStringOffset = topDict.getByName('CharStrings');
17662 cff.charStrings = this.parseCharStrings(charStringOffset);
17664 var charset, encoding;
17665 if (cff.isCIDFont) {
17666 var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
17667 for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
17668 var dictRaw = fdArrayIndex.get(i);
17669 var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
17671 this.parsePrivateDict(fontDict);
17672 cff.fdArray.push(fontDict);
17674 // cid fonts don't have an encoding
17676 charset = this.parseCharsets(topDict.getByName('charset'),
17677 cff.charStrings.count, cff.strings, true);
17678 cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
17679 cff.charStrings.count);
17681 charset = this.parseCharsets(topDict.getByName('charset'),
17682 cff.charStrings.count, cff.strings, false);
17683 encoding = this.parseEncoding(topDict.getByName('Encoding'),
17685 cff.strings, charset.charset);
17687 cff.charset = charset;
17688 cff.encoding = encoding;
17692 parseHeader: function CFFParser_parseHeader() {
17693 var bytes = this.bytes;
17696 while (bytes[offset] != 1)
17700 warn('cff data is shifted');
17701 bytes = bytes.subarray(offset);
17702 this.bytes = bytes;
17704 var major = bytes[0];
17705 var minor = bytes[1];
17706 var hdrSize = bytes[2];
17707 var offSize = bytes[3];
17708 var header = new CFFHeader(major, minor, hdrSize, offSize);
17709 return {obj: header, endPos: hdrSize};
17711 parseDict: function CFFParser_parseDict(dict) {
17714 function parseOperand() {
17715 var value = dict[pos++];
17716 if (value === 30) {
17717 return parseFloatOperand(pos);
17718 } else if (value === 28) {
17719 value = dict[pos++];
17720 value = (value << 8) | dict[pos++];
17722 } else if (value === 29) {
17723 value = dict[pos++];
17724 value = (value << 8) | dict[pos++];
17725 value = (value << 8) | dict[pos++];
17726 value = (value << 8) | dict[pos++];
17728 } else if (value >= 32 && value <= 246) {
17729 return value - 139;
17730 } else if (value >= 247 && value <= 250) {
17731 return ((value - 247) * 256) + dict[pos++] + 108;
17732 } else if (value >= 251 && value <= 254) {
17733 return -((value - 251) * 256) - dict[pos++] - 108;
17735 error('255 is not a valid DICT command');
17740 function parseFloatOperand() {
17743 var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
17744 '9', '.', 'E', 'E-', null, '-'];
17745 var length = dict.length;
17746 while (pos < length) {
17747 var b = dict[pos++];
17759 return parseFloat(str);
17766 var end = dict.length;
17767 while (pos < end) {
17771 b = (b << 8) | dict[++pos];
17772 entries.push([b, operands]);
17776 operands.push(parseOperand());
17781 parseIndex: function CFFParser_parseIndex(pos) {
17782 var cffIndex = new CFFIndex();
17783 var bytes = this.bytes;
17784 var count = (bytes[pos++] << 8) | bytes[pos++];
17790 var offsetSize = bytes[pos++];
17791 // add 1 for offset to determine size of last object
17792 var startPos = pos + ((count + 1) * offsetSize) - 1;
17794 for (var i = 0, ii = count + 1; i < ii; ++i) {
17796 for (var j = 0; j < offsetSize; ++j) {
17798 offset += bytes[pos++];
17800 offsets.push(startPos + offset);
17802 end = offsets[count];
17804 for (var i = 0, ii = offsets.length - 1; i < ii; ++i) {
17805 var offsetStart = offsets[i];
17806 var offsetEnd = offsets[i + 1];
17807 cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
17809 return {obj: cffIndex, endPos: end};
17811 parseNameIndex: function CFFParser_parseNameIndex(index) {
17813 for (var i = 0, ii = index.count; i < ii; ++i) {
17814 var name = index.get(i);
17815 // OTS doesn't allow names to be over 127 characters.
17816 var length = Math.min(name.length, 127);
17818 // OTS also only permits certain characters in the name.
17819 for (var j = 0; j < length; ++j) {
17821 if (j === 0 && c === 0) {
17825 if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
17826 c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
17827 c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
17828 c === 47 /* / */ || c === 37 /* % */) {
17834 names.push(String.fromCharCode.apply(null, data));
17838 parseStringIndex: function CFFParser_parseStringIndex(index) {
17839 var strings = new CFFStrings();
17840 for (var i = 0, ii = index.count; i < ii; ++i) {
17841 var data = index.get(i);
17842 strings.add(String.fromCharCode.apply(null, data));
17846 createDict: function CFFParser_createDict(type, dict, strings) {
17847 var cffDict = new type(strings);
17848 var types = cffDict.types;
17850 for (var i = 0, ii = dict.length; i < ii; ++i) {
17851 var pair = dict[i];
17853 var value = pair[1];
17854 cffDict.setByKey(key, value);
17858 parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
17859 var charStrings = this.parseIndex(charStringOffset).obj;
17860 // The CFF specification state that the 'dotsection' command
17861 // (12, 0) is deprecated and treated as a no-op, but all Type2
17862 // charstrings processors should support them. Unfortunately
17863 // the font sanitizer don't. As a workaround the sequence (12, 0)
17864 // is replaced by a useless (0, hmoveto).
17865 var count = charStrings.count;
17866 for (var i = 0; i < count; i++) {
17867 var charstring = charStrings.get(i);
17869 var data = charstring;
17870 var length = data.length;
17871 for (var j = 0; j <= length; j) {
17872 var value = data[j++];
17873 if (value == 12 && data[j++] == 0) {
17876 } else if (value === 28) {
17878 } else if (value >= 247 && value <= 254) {
17880 } else if (value == 255) {
17885 return charStrings;
17887 parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
17888 // no private dict, do nothing
17889 if (!parentDict.hasName('Private'))
17891 var privateOffset = parentDict.getByName('Private');
17892 // make sure the params are formatted correctly
17893 if (!isArray(privateOffset) || privateOffset.length !== 2) {
17894 parentDict.removeByName('Private');
17897 var size = privateOffset[0];
17898 var offset = privateOffset[1];
17899 // remove empty dicts or ones that refer to invalid location
17900 if (size === 0 || offset >= this.bytes.length) {
17901 parentDict.removeByName('Private');
17905 var privateDictEnd = offset + size;
17906 var dictData = this.bytes.subarray(offset, privateDictEnd);
17907 var dict = this.parseDict(dictData);
17908 var privateDict = this.createDict(CFFPrivateDict, dict,
17909 parentDict.strings);
17910 parentDict.privateDict = privateDict;
17912 // Parse the Subrs index also since it's relative to the private dict.
17913 if (!privateDict.getByName('Subrs'))
17915 var subrsOffset = privateDict.getByName('Subrs');
17916 var relativeOffset = offset + subrsOffset;
17917 // Validate the offset.
17918 if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
17919 privateDict.removeByName('Subrs');
17922 var subrsIndex = this.parseIndex(relativeOffset);
17923 privateDict.subrsIndex = subrsIndex.obj;
17925 parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
17927 return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
17929 } else if (pos == 1) {
17930 return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
17932 } else if (pos == 2) {
17933 return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
17934 ExpertSubsetCharset);
17937 var bytes = this.bytes;
17939 var format = bytes[pos++];
17940 var charset = ['.notdef'];
17942 // subtract 1 for the .notdef glyph
17947 for (var i = 0; i < length; i++) {
17948 var id = (bytes[pos++] << 8) | bytes[pos++];
17949 charset.push(cid ? id : strings.get(id));
17953 while (charset.length <= length) {
17954 var id = (bytes[pos++] << 8) | bytes[pos++];
17955 var count = bytes[pos++];
17956 for (var i = 0; i <= count; i++)
17957 charset.push(cid ? id++ : strings.get(id++));
17961 while (charset.length <= length) {
17962 var id = (bytes[pos++] << 8) | bytes[pos++];
17963 var count = (bytes[pos++] << 8) | bytes[pos++];
17964 for (var i = 0; i <= count; i++)
17965 charset.push(cid ? id++ : strings.get(id++));
17969 error('Unknown charset format');
17971 // Raw won't be needed if we actually compile the charset.
17973 var raw = bytes.subarray(start, end);
17975 return new CFFCharset(false, format, charset, raw);
17977 parseEncoding: function CFFParser_parseEncoding(pos,
17982 var bytes = this.bytes;
17983 var predefined = false;
17984 var hasSupplement = false;
17988 function readSupplement() {
17989 var supplementsCount = bytes[pos++];
17990 for (var i = 0; i < supplementsCount; i++) {
17991 var code = bytes[pos++];
17992 var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
17993 encoding[code] = properties.differences.indexOf(strings.get(sid));
17997 if (pos == 0 || pos == 1) {
18001 var baseEncoding = pos ? Encodings.ExpertEncoding :
18002 Encodings.StandardEncoding;
18003 for (var i = 0, ii = charset.length; i < ii; i++) {
18004 var index = baseEncoding.indexOf(charset[i]);
18006 encoding[index] = gid++;
18009 var dataStart = pos;
18010 var format = bytes[pos++];
18011 switch (format & 0x7f) {
18013 var glyphsCount = bytes[pos++];
18014 for (var i = 1; i <= glyphsCount; i++)
18015 encoding[bytes[pos++]] = i;
18019 var rangesCount = bytes[pos++];
18021 for (var i = 0; i < rangesCount; i++) {
18022 var start = bytes[pos++];
18023 var left = bytes[pos++];
18024 for (var j = start; j <= start + left; j++)
18025 encoding[j] = gid++;
18030 error('Unknow encoding format: ' + format + ' in CFF');
18034 if (format & 0x80) {
18035 // The font sanitizer does not support CFF encoding with a
18036 // supplement, since the encoding is not really used to map
18037 // between gid to glyph, let's overwrite what is declared in
18038 // the top dictionary to let the sanitizer think the font use
18039 // StandardEncoding, that's a lie but that's ok.
18040 bytes[dataStart] &= 0x7f;
18042 hasSupplement = true;
18044 raw = bytes.subarray(dataStart, dataEnd);
18046 format = format & 0x7f;
18047 return new CFFEncoding(predefined, format, encoding, raw);
18049 parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
18051 var bytes = this.bytes;
18052 var format = bytes[pos++];
18056 for (var i = 0; i < length; ++i) {
18057 var id = bytes[pos++];
18062 var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
18063 for (var i = 0; i < rangesCount; ++i) {
18064 var first = (bytes[pos++] << 8) | bytes[pos++];
18065 var fdIndex = bytes[pos++];
18066 var next = (bytes[pos] << 8) | bytes[pos + 1];
18067 for (var j = first; j < next; ++j)
18068 fdSelect.push(fdIndex);
18070 // Advance past the sentinel(next).
18074 error('Unknown fdselect format ' + format);
18078 return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
18084 // Compact Font Format
18085 var CFF = (function CFFClosure() {
18087 this.header = null;
18089 this.topDict = null;
18090 this.strings = new CFFStrings();
18091 this.globalSubrIndex = null;
18093 // The following could really be per font, but since we only have one font
18094 // store them here.
18095 this.encoding = null;
18096 this.charset = null;
18097 this.charStrings = null;
18099 this.fdSelect = null;
18101 this.isCIDFont = false;
18106 var CFFHeader = (function CFFHeaderClosure() {
18107 function CFFHeader(major, minor, hdrSize, offSize) {
18108 this.major = major;
18109 this.minor = minor;
18110 this.hdrSize = hdrSize;
18111 this.offSize = offSize;
18116 var CFFStrings = (function CFFStringsClosure() {
18117 function CFFStrings() {
18120 CFFStrings.prototype = {
18121 get: function CFFStrings_get(index) {
18122 if (index >= 0 && index <= 390)
18123 return CFFStandardStrings[index];
18124 if (index - 391 <= this.strings.length)
18125 return this.strings[index - 391];
18126 return CFFStandardStrings[0];
18128 add: function CFFStrings_add(value) {
18129 this.strings.push(value);
18132 return this.strings.length;
18138 var CFFIndex = (function CFFIndexClosure() {
18139 function CFFIndex() {
18143 CFFIndex.prototype = {
18144 add: function CFFIndex_add(data) {
18145 this.length += data.length;
18146 this.objects.push(data);
18148 get: function CFFIndex_get(index) {
18149 return this.objects[index];
18152 return this.objects.length;
18158 var CFFDict = (function CFFDictClosure() {
18159 function CFFDict(tables, strings) {
18160 this.keyToNameMap = tables.keyToNameMap;
18161 this.nameToKeyMap = tables.nameToKeyMap;
18162 this.defaults = tables.defaults;
18163 this.types = tables.types;
18164 this.opcodes = tables.opcodes;
18165 this.order = tables.order;
18166 this.strings = strings;
18169 CFFDict.prototype = {
18170 // value should always be an array
18171 setByKey: function CFFDict_setByKey(key, value) {
18172 if (!(key in this.keyToNameMap))
18174 // ignore empty values
18175 if (value.length === 0)
18177 var type = this.types[key];
18178 // remove the array wrapping these types of values
18179 if (type === 'num' || type === 'sid' || type === 'offset')
18181 this.values[key] = value;
18184 hasName: function CFFDict_hasName(name) {
18185 return this.nameToKeyMap[name] in this.values;
18187 getByName: function CFFDict_getByName(name) {
18188 if (!(name in this.nameToKeyMap))
18189 error('Invalid dictionary name "' + name + '"');
18190 var key = this.nameToKeyMap[name];
18191 if (!(key in this.values))
18192 return this.defaults[key];
18193 return this.values[key];
18195 removeByName: function CFFDict_removeByName(name) {
18196 delete this.values[this.nameToKeyMap[name]];
18199 CFFDict.createTables = function CFFDict_createTables(layout) {
18208 for (var i = 0, ii = layout.length; i < ii; ++i) {
18209 var entry = layout[i];
18210 var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
18211 tables.keyToNameMap[key] = entry[1];
18212 tables.nameToKeyMap[entry[1]] = key;
18213 tables.types[key] = entry[2];
18214 tables.defaults[key] = entry[3];
18215 tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
18216 tables.order.push(key);
18223 var CFFTopDict = (function CFFTopDictClosure() {
18225 [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
18226 [[12, 20], 'SyntheticBase', 'num', null],
18227 [0, 'version', 'sid', null],
18228 [1, 'Notice', 'sid', null],
18229 [[12, 0], 'Copyright', 'sid', null],
18230 [2, 'FullName', 'sid', null],
18231 [3, 'FamilyName', 'sid', null],
18232 [4, 'Weight', 'sid', null],
18233 [[12, 1], 'isFixedPitch', 'num', 0],
18234 [[12, 2], 'ItalicAngle', 'num', 0],
18235 [[12, 3], 'UnderlinePosition', 'num', -100],
18236 [[12, 4], 'UnderlineThickness', 'num', 50],
18237 [[12, 5], 'PaintType', 'num', 0],
18238 [[12, 6], 'CharstringType', 'num', 2],
18239 [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
18240 [.001, 0, 0, .001, 0, 0]],
18241 [13, 'UniqueID', 'num', null],
18242 [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
18243 [[12, 8], 'StrokeWidth', 'num', 0],
18244 [14, 'XUID', 'array', null],
18245 [15, 'charset', 'offset', 0],
18246 [16, 'Encoding', 'offset', 0],
18247 [17, 'CharStrings', 'offset', 0],
18248 [18, 'Private', ['offset', 'offset'], null],
18249 [[12, 21], 'PostScript', 'sid', null],
18250 [[12, 22], 'BaseFontName', 'sid', null],
18251 [[12, 23], 'BaseFontBlend', 'delta', null],
18252 [[12, 31], 'CIDFontVersion', 'num', 0],
18253 [[12, 32], 'CIDFontRevision', 'num', 0],
18254 [[12, 33], 'CIDFontType', 'num', 0],
18255 [[12, 34], 'CIDCount', 'num', 8720],
18256 [[12, 35], 'UIDBase', 'num', null],
18257 [[12, 36], 'FDArray', 'offset', null],
18258 [[12, 37], 'FDSelect', 'offset', null],
18259 [[12, 38], 'FontName', 'sid', null]];
18261 function CFFTopDict(strings) {
18262 if (tables === null)
18263 tables = CFFDict.createTables(layout);
18264 CFFDict.call(this, tables, strings);
18265 this.privateDict = null;
18267 CFFTopDict.prototype = Object.create(CFFDict.prototype);
18271 var CFFPrivateDict = (function CFFPrivateDictClosure() {
18273 [6, 'BlueValues', 'delta', null],
18274 [7, 'OtherBlues', 'delta', null],
18275 [8, 'FamilyBlues', 'delta', null],
18276 [9, 'FamilyOtherBlues', 'delta', null],
18277 [[12, 9], 'BlueScale', 'num', 0.039625],
18278 [[12, 10], 'BlueShift', 'num', 7],
18279 [[12, 11], 'BlueFuzz', 'num', 1],
18280 [10, 'StdHW', 'num', null],
18281 [11, 'StdVW', 'num', null],
18282 [[12, 12], 'StemSnapH', 'delta', null],
18283 [[12, 13], 'StemSnapV', 'delta', null],
18284 [[12, 14], 'ForceBold', 'num', 0],
18285 [[12, 17], 'LanguageGroup', 'num', 0],
18286 [[12, 18], 'ExpansionFactor', 'num', 0.06],
18287 [[12, 19], 'initialRandomSeed', 'num', 0],
18288 [19, 'Subrs', 'offset', null],
18289 [20, 'defaultWidthX', 'num', 0],
18290 [21, 'nominalWidthX', 'num', 0]
18293 function CFFPrivateDict(strings) {
18294 if (tables === null)
18295 tables = CFFDict.createTables(layout);
18296 CFFDict.call(this, tables, strings);
18297 this.subrsIndex = null;
18299 CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
18300 return CFFPrivateDict;
18303 var CFFCharsetPredefinedTypes = {
18308 var CFFCharsetEmbeddedTypes = {
18313 var CFFCharset = (function CFFCharsetClosure() {
18314 function CFFCharset(predefined, format, charset, raw) {
18315 this.predefined = predefined;
18316 this.format = format;
18317 this.charset = charset;
18323 var CFFEncodingPredefinedTypes = {
18327 var CFFCharsetEmbeddedTypes = {
18331 var CFFEncoding = (function CFFEncodingClosure() {
18332 function CFFEncoding(predefined, format, encoding, raw) {
18333 this.predefined = predefined;
18334 this.format = format;
18335 this.encoding = encoding;
18338 return CFFEncoding;
18341 var CFFFDSelect = (function CFFFDSelectClosure() {
18342 function CFFFDSelect(fdSelect, raw) {
18343 this.fdSelect = fdSelect;
18346 return CFFFDSelect;
18349 // Helper class to keep track of where an offset is within the data and helps
18350 // filling in that offset once it's known.
18351 var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
18352 function CFFOffsetTracker() {
18355 CFFOffsetTracker.prototype = {
18356 isTracking: function CFFOffsetTracker_isTracking(key) {
18357 return key in this.offsets;
18359 track: function CFFOffsetTracker_track(key, location) {
18360 if (key in this.offsets)
18361 error('Already tracking location of ' + key);
18362 this.offsets[key] = location;
18364 offset: function CFFOffsetTracker_offset(value) {
18365 for (var key in this.offsets) {
18366 this.offsets[key] += value;
18369 setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
18372 if (!(key in this.offsets))
18373 error('Not tracking location of ' + key);
18374 var data = output.data;
18375 var dataOffset = this.offsets[key];
18377 for (var i = 0, ii = values.length; i < ii; ++i) {
18378 var offset0 = i * size + dataOffset;
18379 var offset1 = offset0 + 1;
18380 var offset2 = offset0 + 2;
18381 var offset3 = offset0 + 3;
18382 var offset4 = offset0 + 4;
18383 // It's easy to screw up offsets so perform this sanity check.
18384 if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
18385 data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0)
18386 error('writing to an offset that is not empty');
18387 var value = values[i];
18388 data[offset0] = 0x1d;
18389 data[offset1] = (value >> 24) & 0xFF;
18390 data[offset2] = (value >> 16) & 0xFF;
18391 data[offset3] = (value >> 8) & 0xFF;
18392 data[offset4] = value & 0xFF;
18396 return CFFOffsetTracker;
18399 // Takes a CFF and converts it to the binary representation.
18400 var CFFCompiler = (function CFFCompilerClosure() {
18401 function stringToArray(str) {
18403 for (var i = 0, ii = str.length; i < ii; ++i)
18404 array[i] = str.charCodeAt(i);
18408 function CFFCompiler(cff) {
18411 CFFCompiler.prototype = {
18412 compile: function CFFCompiler_compile() {
18413 var cff = this.cff;
18417 add: function CFFCompiler_add(data) {
18418 this.data = this.data.concat(data);
18419 this.length = this.data.length;
18423 // Compile the five entries that must be in order.
18424 var header = this.compileHeader(cff.header);
18425 output.add(header);
18427 var nameIndex = this.compileNameIndex(cff.names);
18428 output.add(nameIndex);
18430 var compiled = this.compileTopDicts([cff.topDict], output.length);
18431 output.add(compiled.output);
18432 var topDictTracker = compiled.trackers[0];
18434 var stringIndex = this.compileStringIndex(cff.strings.strings);
18435 output.add(stringIndex);
18437 var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
18438 output.add(globalSubrIndex);
18440 // Now start on the other entries that have no specfic order.
18441 if (cff.encoding && cff.topDict.hasName('Encoding')) {
18442 if (cff.encoding.predefined) {
18443 topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
18446 var encoding = this.compileEncoding(cff.encoding);
18447 topDictTracker.setEntryLocation('Encoding', [output.length], output);
18448 output.add(encoding);
18452 if (cff.charset && cff.topDict.hasName('charset')) {
18453 if (cff.charset.predefined) {
18454 topDictTracker.setEntryLocation('charset', [cff.charset.format],
18457 var charset = this.compileCharset(cff.charset);
18458 topDictTracker.setEntryLocation('charset', [output.length], output);
18459 output.add(charset);
18463 var charStrings = this.compileCharStrings(cff.charStrings);
18464 topDictTracker.setEntryLocation('CharStrings', [output.length], output);
18465 output.add(charStrings);
18467 if (cff.isCIDFont) {
18468 // For some reason FDSelect must be in front of FDArray on windows. OSX
18469 // and linux don't seem to care.
18470 topDictTracker.setEntryLocation('FDSelect', [output.length], output);
18471 var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
18472 output.add(fdSelect);
18474 var compiled = this.compileTopDicts(cff.fdArray, output.length);
18475 topDictTracker.setEntryLocation('FDArray', [output.length], output);
18476 output.add(compiled.output);
18477 var fontDictTrackers = compiled.trackers;
18479 this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
18482 this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
18484 return output.data;
18486 encodeNumber: function CFFCompiler_encodeNumber(value) {
18487 if (parseFloat(value) == parseInt(value) && !isNaN(value)) // isInt
18488 return this.encodeInteger(value);
18490 return this.encodeFloat(value);
18492 encodeFloat: function CFFCompiler_encodeFloat(value) {
18493 value = value.toString();
18494 // Strip off the any leading zeros.
18495 if (value.substr(0, 2) === '0.')
18496 value = value.substr(1);
18497 else if (value.substr(0, 3) === '-0.')
18498 value = '-' + value.substr(2);
18500 for (var i = 0, ii = value.length; i < ii; ++i) {
18501 var a = value.charAt(i), b = value.charAt(i + 1);
18503 if (a === 'e' && b === '-') {
18506 } else if (a === '.') {
18508 } else if (a === 'E') {
18510 } else if (a === '-') {
18515 nibbles.push(nibble);
18518 if (nibbles.length % 2)
18521 for (var i = 0, ii = nibbles.length; i < ii; i += 2)
18522 out.push(nibbles[i] << 4 | nibbles[i + 1]);
18525 encodeInteger: function CFFCompiler_encodeInteger(value) {
18527 if (value >= -107 && value <= 107) {
18528 code = [value + 139];
18529 } else if (value >= 108 && value <= 1131) {
18530 value = [value - 108];
18531 code = [(value >> 8) + 247, value & 0xFF];
18532 } else if (value >= -1131 && value <= -108) {
18533 value = -value - 108;
18534 code = [(value >> 8) + 251, value & 0xFF];
18535 } else if (value >= -32768 && value <= 32767) {
18536 code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
18539 (value >> 24) & 0xFF,
18540 (value >> 16) & 0xFF,
18541 (value >> 8) & 0xFF,
18546 compileHeader: function CFFCompiler_compileHeader(header) {
18554 compileNameIndex: function CFFCompiler_compileNameIndex(names) {
18555 var nameIndex = new CFFIndex();
18556 for (var i = 0, ii = names.length; i < ii; ++i)
18557 nameIndex.add(stringToArray(names[i]));
18558 return this.compileIndex(nameIndex);
18560 compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length) {
18561 var fontDictTrackers = [];
18562 var fdArrayIndex = new CFFIndex();
18563 for (var i = 0, ii = dicts.length; i < ii; ++i) {
18564 var fontDict = dicts[i];
18565 var fontDictTracker = new CFFOffsetTracker();
18566 var fontDictData = this.compileDict(fontDict, fontDictTracker);
18567 fontDictTrackers.push(fontDictTracker);
18568 fdArrayIndex.add(fontDictData);
18569 fontDictTracker.offset(length);
18571 fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
18573 trackers: fontDictTrackers,
18574 output: fdArrayIndex
18577 compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
18580 for (var i = 0, ii = dicts.length; i < ii; ++i) {
18581 var fontDict = dicts[i];
18582 if (!fontDict.privateDict || !fontDict.hasName('Private'))
18584 var privateDict = fontDict.privateDict;
18585 var privateDictTracker = new CFFOffsetTracker();
18586 var privateDictData = this.compileDict(privateDict, privateDictTracker);
18588 privateDictTracker.offset(output.length);
18589 trackers[i].setEntryLocation('Private',
18590 [privateDictData.length, output.length],
18592 output.add(privateDictData);
18594 if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
18595 var subrs = this.compileIndex(privateDict.subrsIndex);
18596 privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
18602 compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
18604 // The dictionary keys must be in a certain order.
18605 var order = dict.order;
18606 for (var i = 0; i < order.length; ++i) {
18607 var key = order[i];
18608 if (!(key in dict.values))
18610 var values = dict.values[key];
18611 var types = dict.types[key];
18612 if (!isArray(types)) types = [types];
18613 if (!isArray(values)) values = [values];
18615 // Remove any empty dict values.
18616 if (values.length === 0)
18619 for (var j = 0, jj = types.length; j < jj; ++j) {
18620 var type = types[j];
18621 var value = values[j];
18625 out = out.concat(this.encodeNumber(value));
18628 // For offsets we just insert a 32bit integer so we don't have to
18629 // deal with figuring out the length of the offset when it gets
18630 // replaced later on by the compiler.
18631 var name = dict.keyToNameMap[key];
18632 // Some offsets have the offset and the length, so just record the
18633 // position of the first one.
18634 if (!offsetTracker.isTracking(name))
18635 offsetTracker.track(name, out.length);
18636 out = out.concat([0x1d, 0, 0, 0, 0]);
18640 out = out.concat(this.encodeNumber(value));
18641 for (var k = 1, kk = values.length; k < kk; ++k)
18642 out = out.concat(this.encodeNumber(values[k]));
18645 error('Unknown data type of ' + type);
18649 out = out.concat(dict.opcodes[key]);
18653 compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
18654 var stringIndex = new CFFIndex();
18655 for (var i = 0, ii = strings.length; i < ii; ++i)
18656 stringIndex.add(stringToArray(strings[i]));
18657 return this.compileIndex(stringIndex);
18659 compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
18660 var globalSubrIndex = this.cff.globalSubrIndex;
18661 this.out.writeByteArray(this.compileIndex(globalSubrIndex));
18663 compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
18664 return this.compileIndex(charStrings);
18666 compileCharset: function CFFCompiler_compileCharset(charset) {
18667 return this.compileTypedArray(charset.raw);
18669 compileEncoding: function CFFCompiler_compileEncoding(encoding) {
18670 return this.compileTypedArray(encoding.raw);
18672 compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
18673 return this.compileTypedArray(fdSelect);
18675 compileTypedArray: function CFFCompiler_compileTypedArray(data) {
18677 for (var i = 0, ii = data.length; i < ii; ++i)
18681 compileIndex: function CFFCompiler_compileIndex(index, trackers) {
18682 trackers = trackers || [];
18683 var objects = index.objects;
18684 // First 2 bytes contains the number of objects contained into this index
18685 var count = objects.length;
18687 // If there is no object, just create an index. This technically
18688 // should just be [0, 0] but OTS has an issue with that.
18692 var data = [(count >> 8) & 0xFF, count & 0xff];
18694 var lastOffset = 1;
18695 for (var i = 0; i < count; ++i)
18696 lastOffset += objects[i].length;
18699 if (lastOffset < 0x100)
18701 else if (lastOffset < 0x10000)
18703 else if (lastOffset < 0x1000000)
18708 // Next byte contains the offset size use to reference object in the file
18709 data.push(offsetSize);
18711 // Add another offset after this one because we need a new offset
18712 var relativeOffset = 1;
18713 for (var i = 0; i < count + 1; i++) {
18714 if (offsetSize === 1) {
18715 data.push(relativeOffset & 0xFF);
18716 } else if (offsetSize === 2) {
18717 data.push((relativeOffset >> 8) & 0xFF,
18718 relativeOffset & 0xFF);
18719 } else if (offsetSize === 3) {
18720 data.push((relativeOffset >> 16) & 0xFF,
18721 (relativeOffset >> 8) & 0xFF,
18722 relativeOffset & 0xFF);
18724 data.push((relativeOffset >>> 24) & 0xFF,
18725 (relativeOffset >> 16) & 0xFF,
18726 (relativeOffset >> 8) & 0xFF,
18727 relativeOffset & 0xFF);
18731 relativeOffset += objects[i].length;
18733 var offset = data.length;
18735 for (var i = 0; i < count; i++) {
18736 // Notify the tracker where the object will be offset in the data.
18738 trackers[i].offset(data.length);
18739 for (var j = 0, jj = objects[i].length; j < jj; j++)
18740 data.push(objects[i][j]);
18745 return CFFCompiler;
18749 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
18750 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
18754 var GlyphsUnicode = {
18761 Aacutesmall: 0xF7E1,
18763 Abreveacute: 0x1EAE,
18764 Abrevecyrillic: 0x04D0,
18765 Abrevedotbelow: 0x1EB6,
18766 Abrevegrave: 0x1EB0,
18767 Abrevehookabove: 0x1EB2,
18768 Abrevetilde: 0x1EB4,
18771 Acircumflex: 0x00C2,
18772 Acircumflexacute: 0x1EA4,
18773 Acircumflexdotbelow: 0x1EAC,
18774 Acircumflexgrave: 0x1EA6,
18775 Acircumflexhookabove: 0x1EA8,
18776 Acircumflexsmall: 0xF7E2,
18777 Acircumflextilde: 0x1EAA,
18779 Acutesmall: 0xF7B4,
18783 Adieresiscyrillic: 0x04D2,
18784 Adieresismacron: 0x01DE,
18785 Adieresissmall: 0xF7E4,
18787 Adotmacron: 0x01E0,
18789 Agravesmall: 0xF7E0,
18790 Ahookabove: 0x1EA2,
18791 Aiecyrillic: 0x04D4,
18792 Ainvertedbreve: 0x0202,
18794 Alphatonos: 0x0386,
18796 Amonospace: 0xFF21,
18799 Aringacute: 0x01FA,
18800 Aringbelow: 0x1E00,
18801 Aringsmall: 0xF7E5,
18804 Atildesmall: 0xF7E3,
18805 Aybarmenian: 0x0531,
18808 Bdotaccent: 0x1E02,
18810 Becyrillic: 0x0411,
18811 Benarmenian: 0x0532,
18814 Blinebelow: 0x1E06,
18815 Bmonospace: 0xFF22,
18816 Brevesmall: 0xF6F4,
18820 Caarmenian: 0x053E,
18823 Caronsmall: 0xF6F5,
18826 Ccedillaacute: 0x1E08,
18827 Ccedillasmall: 0xF7E7,
18829 Ccircumflex: 0x0108,
18831 Cdotaccent: 0x010A,
18832 Cedillasmall: 0xF7B8,
18833 Chaarmenian: 0x0549,
18834 Cheabkhasiancyrillic: 0x04BC,
18835 Checyrillic: 0x0427,
18836 Chedescenderabkhasiancyrillic: 0x04BE,
18837 Chedescendercyrillic: 0x04B6,
18838 Chedieresiscyrillic: 0x04F4,
18839 Cheharmenian: 0x0543,
18840 Chekhakassiancyrillic: 0x04CB,
18841 Cheverticalstrokecyrillic: 0x04B8,
18844 Circumflexsmall: 0xF6F6,
18845 Cmonospace: 0xFF23,
18846 Coarmenian: 0x0551,
18851 Daarmenian: 0x0534,
18856 Dcircumflexbelow: 0x1E12,
18858 Ddotaccent: 0x1E0A,
18860 Decyrillic: 0x0414,
18863 Deltagreek: 0x0394,
18866 DieresisAcute: 0xF6CC,
18867 DieresisGrave: 0xF6CD,
18868 Dieresissmall: 0xF7A8,
18869 Digammagreek: 0x03DC,
18870 Djecyrillic: 0x0402,
18871 Dlinebelow: 0x1E0E,
18872 Dmonospace: 0xFF24,
18873 Dotaccentsmall: 0xF6F7,
18879 Dzeabkhasiancyrillic: 0x04E0,
18880 Dzecyrillic: 0x0405,
18881 Dzhecyrillic: 0x040F,
18884 Eacutesmall: 0xF7E9,
18887 Ecedillabreve: 0x1E1C,
18888 Echarmenian: 0x0535,
18890 Ecircumflex: 0x00CA,
18891 Ecircumflexacute: 0x1EBE,
18892 Ecircumflexbelow: 0x1E18,
18893 Ecircumflexdotbelow: 0x1EC6,
18894 Ecircumflexgrave: 0x1EC0,
18895 Ecircumflexhookabove: 0x1EC2,
18896 Ecircumflexsmall: 0xF7EA,
18897 Ecircumflextilde: 0x1EC4,
18901 Edieresissmall: 0xF7EB,
18903 Edotaccent: 0x0116,
18905 Efcyrillic: 0x0424,
18907 Egravesmall: 0xF7E8,
18908 Eharmenian: 0x0537,
18909 Ehookabove: 0x1EBA,
18910 Eightroman: 0x2167,
18911 Einvertedbreve: 0x0206,
18912 Eiotifiedcyrillic: 0x0464,
18913 Elcyrillic: 0x041B,
18914 Elevenroman: 0x216A,
18916 Emacronacute: 0x1E16,
18917 Emacrongrave: 0x1E14,
18918 Emcyrillic: 0x041C,
18919 Emonospace: 0xFF25,
18920 Encyrillic: 0x041D,
18921 Endescendercyrillic: 0x04A2,
18923 Enghecyrillic: 0x04A4,
18924 Enhookcyrillic: 0x04C7,
18928 Epsilontonos: 0x0388,
18929 Ercyrillic: 0x0420,
18931 Ereversedcyrillic: 0x042D,
18932 Escyrillic: 0x0421,
18933 Esdescendercyrillic: 0x04AA,
18937 Etarmenian: 0x0538,
18942 Etildebelow: 0x1E1A,
18946 Ezhreversed: 0x01B8,
18949 Fdotaccent: 0x1E1E,
18950 Feharmenian: 0x0556,
18953 Fitacyrillic: 0x0472,
18955 Fmonospace: 0xFF26,
18962 Gammaafrican: 0x0194,
18963 Gangiacoptic: 0x03EA,
18968 Gcircumflex: 0x011C,
18969 Gcommaaccent: 0x0122,
18971 Gdotaccent: 0x0120,
18972 Gecyrillic: 0x0413,
18973 Ghadarmenian: 0x0542,
18974 Ghemiddlehookcyrillic: 0x0494,
18975 Ghestrokecyrillic: 0x0492,
18976 Gheupturncyrillic: 0x0490,
18978 Gimarmenian: 0x0533,
18979 Gjecyrillic: 0x0403,
18981 Gmonospace: 0xFF27,
18983 Gravesmall: 0xF760,
18985 Gsmallhook: 0x029B,
18993 Haabkhasiancyrillic: 0x04A8,
18994 Hadescendercyrillic: 0x04B2,
18995 Hardsigncyrillic: 0x042A,
18997 Hbrevebelow: 0x1E2A,
19000 Hcircumflex: 0x0124,
19002 Hdotaccent: 0x1E22,
19004 Hmonospace: 0xFF28,
19005 Hoarmenian: 0x0540,
19006 Horicoptic: 0x03E8,
19008 Hungarumlaut: 0xF6CF,
19009 Hungarumlautsmall: 0xF6F8,
19012 IAcyrillic: 0x042F,
19014 IUcyrillic: 0x042E,
19016 Iacutesmall: 0xF7ED,
19020 Icircumflex: 0x00CE,
19021 Icircumflexsmall: 0xF7EE,
19025 Idieresisacute: 0x1E2E,
19026 Idieresiscyrillic: 0x04E4,
19027 Idieresissmall: 0xF7EF,
19029 Idotaccent: 0x0130,
19031 Iebrevecyrillic: 0x04D6,
19032 Iecyrillic: 0x0415,
19035 Igravesmall: 0xF7EC,
19036 Ihookabove: 0x1EC8,
19037 Iicyrillic: 0x0418,
19038 Iinvertedbreve: 0x020A,
19039 Iishortcyrillic: 0x0419,
19041 Imacroncyrillic: 0x04E2,
19042 Imonospace: 0xFF29,
19043 Iniarmenian: 0x053B,
19044 Iocyrillic: 0x0401,
19047 Iotaafrican: 0x0196,
19048 Iotadieresis: 0x03AA,
19053 Itildebelow: 0x1E2C,
19054 Izhitsacyrillic: 0x0474,
19055 Izhitsadblgravecyrillic: 0x0476,
19057 Jaarmenian: 0x0541,
19059 Jcircumflex: 0x0134,
19060 Jecyrillic: 0x0408,
19061 Jheharmenian: 0x054B,
19062 Jmonospace: 0xFF2A,
19067 Kabashkircyrillic: 0x04A0,
19069 Kacyrillic: 0x041A,
19070 Kadescendercyrillic: 0x049A,
19071 Kahookcyrillic: 0x04C3,
19073 Kastrokecyrillic: 0x049E,
19074 Kaverticalstrokecyrillic: 0x049C,
19078 Kcommaaccent: 0x0136,
19080 Keharmenian: 0x0554,
19081 Kenarmenian: 0x053F,
19082 Khacyrillic: 0x0425,
19083 Kheicoptic: 0x03E6,
19085 Kjecyrillic: 0x040C,
19086 Klinebelow: 0x1E34,
19087 Kmonospace: 0xFF2B,
19088 Koppacyrillic: 0x0480,
19089 Koppagreek: 0x03DE,
19090 Ksicyrillic: 0x046E,
19100 Lcircumflexbelow: 0x1E3C,
19101 Lcommaaccent: 0x013B,
19103 Ldotaccent: 0x013F,
19105 Ldotbelowmacron: 0x1E38,
19106 Liwnarmenian: 0x053C,
19108 Ljecyrillic: 0x0409,
19109 Llinebelow: 0x1E3A,
19110 Lmonospace: 0xFF2C,
19112 Lslashsmall: 0xF6F9,
19117 Macronsmall: 0xF7AF,
19120 Mdotaccent: 0x1E40,
19122 Menarmenian: 0x0544,
19123 Mmonospace: 0xFF2D,
19133 Ncircumflexbelow: 0x1E4A,
19134 Ncommaaccent: 0x0145,
19135 Ndotaccent: 0x1E44,
19140 Njecyrillic: 0x040A,
19141 Nlinebelow: 0x1E48,
19142 Nmonospace: 0xFF2E,
19143 Nowarmenian: 0x0546,
19146 Ntildesmall: 0xF7F1,
19152 Oacutesmall: 0xF7F3,
19153 Obarredcyrillic: 0x04E8,
19154 Obarreddieresiscyrillic: 0x04EA,
19157 Ocenteredtilde: 0x019F,
19159 Ocircumflex: 0x00D4,
19160 Ocircumflexacute: 0x1ED0,
19161 Ocircumflexdotbelow: 0x1ED8,
19162 Ocircumflexgrave: 0x1ED2,
19163 Ocircumflexhookabove: 0x1ED4,
19164 Ocircumflexsmall: 0xF7F4,
19165 Ocircumflextilde: 0x1ED6,
19170 Odieresiscyrillic: 0x04E6,
19171 Odieresissmall: 0xF7F6,
19173 Ogoneksmall: 0xF6FB,
19175 Ogravesmall: 0xF7F2,
19176 Oharmenian: 0x0555,
19178 Ohookabove: 0x1ECE,
19180 Ohornacute: 0x1EDA,
19181 Ohorndotbelow: 0x1EE2,
19182 Ohorngrave: 0x1EDC,
19183 Ohornhookabove: 0x1EDE,
19184 Ohorntilde: 0x1EE0,
19185 Ohungarumlaut: 0x0150,
19187 Oinvertedbreve: 0x020E,
19189 Omacronacute: 0x1E52,
19190 Omacrongrave: 0x1E50,
19192 Omegacyrillic: 0x0460,
19193 Omegagreek: 0x03A9,
19194 Omegaroundcyrillic: 0x047A,
19195 Omegatitlocyrillic: 0x047C,
19196 Omegatonos: 0x038F,
19198 Omicrontonos: 0x038C,
19199 Omonospace: 0xFF2F,
19202 Oogonekmacron: 0x01EC,
19205 Oslashacute: 0x01FE,
19206 Oslashsmall: 0xF7F8,
19208 Ostrokeacute: 0x01FE,
19209 Otcyrillic: 0x047E,
19211 Otildeacute: 0x1E4C,
19212 Otildedieresis: 0x1E4E,
19213 Otildesmall: 0xF7F5,
19217 Pdotaccent: 0x1E56,
19218 Pecyrillic: 0x041F,
19219 Peharmenian: 0x054A,
19220 Pemiddlehookcyrillic: 0x04A6,
19224 Piwrarmenian: 0x0553,
19225 Pmonospace: 0xFF30,
19227 Psicyrillic: 0x0470,
19231 Qmonospace: 0xFF31,
19234 Raarmenian: 0x054C,
19239 Rcommaaccent: 0x0156,
19241 Rdotaccent: 0x1E58,
19243 Rdotbelowmacron: 0x1E5C,
19244 Reharmenian: 0x0550,
19248 Rinvertedbreve: 0x0212,
19249 Rlinebelow: 0x1E5E,
19250 Rmonospace: 0xFF32,
19252 Rsmallinverted: 0x0281,
19253 Rsmallinvertedsuperior: 0x02B6,
19296 Sacutedotaccent: 0x1E64,
19297 Sampigreek: 0x03E0,
19299 Scarondotaccent: 0x1E66,
19300 Scaronsmall: 0xF6FD,
19303 Schwacyrillic: 0x04D8,
19304 Schwadieresiscyrillic: 0x04DA,
19306 Scircumflex: 0x015C,
19307 Scommaaccent: 0x0218,
19308 Sdotaccent: 0x1E60,
19310 Sdotbelowdotaccent: 0x1E68,
19311 Seharmenian: 0x054D,
19312 Sevenroman: 0x2166,
19313 Shaarmenian: 0x0547,
19314 Shacyrillic: 0x0428,
19315 Shchacyrillic: 0x0429,
19316 Sheicoptic: 0x03E2,
19317 Shhacyrillic: 0x04BA,
19318 Shimacoptic: 0x03EC,
19321 Smonospace: 0xFF33,
19322 Softsigncyrillic: 0x042C,
19324 Stigmagreek: 0x03DA,
19331 Tcircumflexbelow: 0x1E70,
19332 Tcommaaccent: 0x0162,
19333 Tdotaccent: 0x1E6A,
19335 Tecyrillic: 0x0422,
19336 Tedescendercyrillic: 0x04AC,
19338 Tetsecyrillic: 0x04B4,
19342 Thornsmall: 0xF7FE,
19343 Threeroman: 0x2162,
19344 Tildesmall: 0xF6FE,
19345 Tiwnarmenian: 0x054F,
19346 Tlinebelow: 0x1E6E,
19347 Tmonospace: 0xFF34,
19348 Toarmenian: 0x0539,
19352 Tretroflexhook: 0x01AE,
19353 Tsecyrillic: 0x0426,
19354 Tshecyrillic: 0x040B,
19356 Twelveroman: 0x216B,
19360 Uacutesmall: 0xF7FA,
19364 Ucircumflex: 0x00DB,
19365 Ucircumflexbelow: 0x1E76,
19366 Ucircumflexsmall: 0xF7FB,
19371 Udieresisacute: 0x01D7,
19372 Udieresisbelow: 0x1E72,
19373 Udieresiscaron: 0x01D9,
19374 Udieresiscyrillic: 0x04F0,
19375 Udieresisgrave: 0x01DB,
19376 Udieresismacron: 0x01D5,
19377 Udieresissmall: 0xF7FC,
19380 Ugravesmall: 0xF7F9,
19381 Uhookabove: 0x1EE6,
19383 Uhornacute: 0x1EE8,
19384 Uhorndotbelow: 0x1EF0,
19385 Uhorngrave: 0x1EEA,
19386 Uhornhookabove: 0x1EEC,
19387 Uhorntilde: 0x1EEE,
19388 Uhungarumlaut: 0x0170,
19389 Uhungarumlautcyrillic: 0x04F2,
19390 Uinvertedbreve: 0x0216,
19391 Ukcyrillic: 0x0478,
19393 Umacroncyrillic: 0x04EE,
19394 Umacrondieresis: 0x1E7A,
19395 Umonospace: 0xFF35,
19399 Upsilonacutehooksymbolgreek: 0x03D3,
19400 Upsilonafrican: 0x01B1,
19401 Upsilondieresis: 0x03AB,
19402 Upsilondieresishooksymbolgreek: 0x03D4,
19403 Upsilonhooksymbol: 0x03D2,
19404 Upsilontonos: 0x038E,
19406 Ushortcyrillic: 0x040E,
19408 Ustraightcyrillic: 0x04AE,
19409 Ustraightstrokecyrillic: 0x04B0,
19411 Utildeacute: 0x1E78,
19412 Utildebelow: 0x1E74,
19416 Vecyrillic: 0x0412,
19417 Vewarmenian: 0x054E,
19419 Vmonospace: 0xFF36,
19420 Voarmenian: 0x0548,
19426 Wcircumflex: 0x0174,
19428 Wdotaccent: 0x1E86,
19431 Wmonospace: 0xFF37,
19436 Xdotaccent: 0x1E8A,
19437 Xeharmenian: 0x053D,
19439 Xmonospace: 0xFF38,
19443 Yacutesmall: 0xF7FD,
19444 Yatcyrillic: 0x0462,
19446 Ycircumflex: 0x0176,
19448 Ydieresissmall: 0xF7FF,
19449 Ydotaccent: 0x1E8E,
19451 Yericyrillic: 0x042B,
19452 Yerudieresiscyrillic: 0x04F8,
19455 Yhookabove: 0x1EF6,
19456 Yiarmenian: 0x0545,
19457 Yicyrillic: 0x0407,
19458 Yiwnarmenian: 0x0552,
19459 Ymonospace: 0xFF39,
19462 Yusbigcyrillic: 0x046A,
19463 Yusbigiotifiedcyrillic: 0x046C,
19464 Yuslittlecyrillic: 0x0466,
19465 Yuslittleiotifiedcyrillic: 0x0468,
19467 Zaarmenian: 0x0536,
19470 Zcaronsmall: 0xF6FF,
19472 Zcircumflex: 0x1E90,
19474 Zdotaccent: 0x017B,
19476 Zecyrillic: 0x0417,
19477 Zedescendercyrillic: 0x0498,
19478 Zedieresiscyrillic: 0x04DE,
19480 Zhearmenian: 0x053A,
19481 Zhebrevecyrillic: 0x04C1,
19482 Zhecyrillic: 0x0416,
19483 Zhedescendercyrillic: 0x0496,
19484 Zhedieresiscyrillic: 0x04DC,
19485 Zlinebelow: 0x1E94,
19486 Zmonospace: 0xFF3A,
19493 aagujarati: 0x0A86,
19494 aagurmukhi: 0x0A06,
19495 aamatragurmukhi: 0x0A3E,
19496 aarusquare: 0x3303,
19497 aavowelsignbengali: 0x09BE,
19498 aavowelsigndeva: 0x093E,
19499 aavowelsigngujarati: 0x0ABE,
19500 abbreviationmarkarmenian: 0x055F,
19501 abbreviationsigndeva: 0x0970,
19505 abreveacute: 0x1EAF,
19506 abrevecyrillic: 0x04D1,
19507 abrevedotbelow: 0x1EB7,
19508 abrevegrave: 0x1EB1,
19509 abrevehookabove: 0x1EB3,
19510 abrevetilde: 0x1EB5,
19513 acircumflex: 0x00E2,
19514 acircumflexacute: 0x1EA5,
19515 acircumflexdotbelow: 0x1EAD,
19516 acircumflexgrave: 0x1EA7,
19517 acircumflexhookabove: 0x1EA9,
19518 acircumflextilde: 0x1EAB,
19520 acutebelowcmb: 0x0317,
19524 acutelowmod: 0x02CF,
19525 acutetonecmb: 0x0341,
19528 addakgurmukhi: 0x0A71,
19531 adieresiscyrillic: 0x04D3,
19532 adieresismacron: 0x01DF,
19534 adotmacron: 0x01E1,
19789 ahookabove: 0x1EA3,
19791 aibopomofo: 0x311E,
19793 aiecyrillic: 0x04D5,
19794 aigujarati: 0x0A90,
19795 aigurmukhi: 0x0A10,
19796 aimatragurmukhi: 0x0A48,
19798 ainfinalarabic: 0xFECA,
19799 aininitialarabic: 0xFECB,
19800 ainmedialarabic: 0xFECC,
19801 ainvertedbreve: 0x0203,
19802 aivowelsignbengali: 0x09C8,
19803 aivowelsigndeva: 0x0948,
19804 aivowelsigngujarati: 0x0AC8,
19806 akatakanahalfwidth: 0xFF71,
19809 alefarabic: 0x0627,
19810 alefdageshhebrew: 0xFB30,
19811 aleffinalarabic: 0xFE8E,
19812 alefhamzaabovearabic: 0x0623,
19813 alefhamzaabovefinalarabic: 0xFE84,
19814 alefhamzabelowarabic: 0x0625,
19815 alefhamzabelowfinalarabic: 0xFE88,
19816 alefhebrew: 0x05D0,
19817 aleflamedhebrew: 0xFB4F,
19818 alefmaddaabovearabic: 0x0622,
19819 alefmaddaabovefinalarabic: 0xFE82,
19820 alefmaksuraarabic: 0x0649,
19821 alefmaksurafinalarabic: 0xFEF0,
19822 alefmaksurainitialarabic: 0xFEF3,
19823 alefmaksuramedialarabic: 0xFEF4,
19824 alefpatahhebrew: 0xFB2E,
19825 alefqamatshebrew: 0xFB2F,
19829 alphatonos: 0x03AC,
19831 amonospace: 0xFF41,
19833 ampersandmonospace: 0xFF06,
19834 ampersandsmall: 0xF726,
19836 anbopomofo: 0x3122,
19837 angbopomofo: 0x3124,
19838 angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
19839 angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
19840 angkhankhuthai: 0x0E5A,
19842 anglebracketleft: 0x3008,
19843 anglebracketleftvertical: 0xFE3F,
19844 anglebracketright: 0x3009,
19845 anglebracketrightvertical: 0xFE40,
19847 angleright: 0x232A,
19850 anudattadeva: 0x0952,
19851 anusvarabengali: 0x0982,
19852 anusvaradeva: 0x0902,
19853 anusvaragujarati: 0x0A82,
19855 apaatosquare: 0x3300,
19857 apostrophearmenian: 0x055A,
19858 apostrophemod: 0x02BC,
19860 approaches: 0x2250,
19861 approxequal: 0x2248,
19862 approxequalorimage: 0x2252,
19863 approximatelyequal: 0x2245,
19864 araeaekorean: 0x318E,
19865 araeakorean: 0x318D,
19867 arighthalfring: 0x1E9A,
19869 aringacute: 0x01FB,
19870 aringbelow: 0x1E01,
19872 arrowdashdown: 0x21E3,
19873 arrowdashleft: 0x21E0,
19874 arrowdashright: 0x21E2,
19875 arrowdashup: 0x21E1,
19876 arrowdblboth: 0x21D4,
19877 arrowdbldown: 0x21D3,
19878 arrowdblleft: 0x21D0,
19879 arrowdblright: 0x21D2,
19880 arrowdblup: 0x21D1,
19882 arrowdownleft: 0x2199,
19883 arrowdownright: 0x2198,
19884 arrowdownwhite: 0x21E9,
19885 arrowheaddownmod: 0x02C5,
19886 arrowheadleftmod: 0x02C2,
19887 arrowheadrightmod: 0x02C3,
19888 arrowheadupmod: 0x02C4,
19889 arrowhorizex: 0xF8E7,
19891 arrowleftdbl: 0x21D0,
19892 arrowleftdblstroke: 0x21CD,
19893 arrowleftoverright: 0x21C6,
19894 arrowleftwhite: 0x21E6,
19895 arrowright: 0x2192,
19896 arrowrightdblstroke: 0x21CF,
19897 arrowrightheavy: 0x279E,
19898 arrowrightoverleft: 0x21C4,
19899 arrowrightwhite: 0x21E8,
19900 arrowtableft: 0x21E4,
19901 arrowtabright: 0x21E5,
19904 arrowupdnbse: 0x21A8,
19905 arrowupdownbase: 0x21A8,
19906 arrowupleft: 0x2196,
19907 arrowupleftofdown: 0x21C5,
19908 arrowupright: 0x2197,
19909 arrowupwhite: 0x21E7,
19910 arrowvertex: 0xF8E6,
19911 asciicircum: 0x005E,
19912 asciicircummonospace: 0xFF3E,
19913 asciitilde: 0x007E,
19914 asciitildemonospace: 0xFF5E,
19916 ascriptturned: 0x0252,
19917 asmallhiragana: 0x3041,
19918 asmallkatakana: 0x30A1,
19919 asmallkatakanahalfwidth: 0xFF67,
19921 asteriskaltonearabic: 0x066D,
19922 asteriskarabic: 0x066D,
19923 asteriskmath: 0x2217,
19924 asteriskmonospace: 0xFF0A,
19925 asterisksmall: 0xFE61,
19928 asymptoticallyequal: 0x2243,
19931 atmonospace: 0xFF20,
19935 aubopomofo: 0x3120,
19937 augujarati: 0x0A94,
19938 augurmukhi: 0x0A14,
19939 aulengthmarkbengali: 0x09D7,
19940 aumatragurmukhi: 0x0A4C,
19941 auvowelsignbengali: 0x09CC,
19942 auvowelsigndeva: 0x094C,
19943 auvowelsigngujarati: 0x0ACC,
19944 avagrahadeva: 0x093D,
19945 aybarmenian: 0x0561,
19947 ayinaltonehebrew: 0xFB20,
19948 ayinhebrew: 0x05E2,
19952 backslashmonospace: 0xFF3C,
19954 bagujarati: 0x0AAC,
19955 bagurmukhi: 0x0A2C,
19956 bahiragana: 0x3070,
19958 bakatakana: 0x30D0,
19960 barmonospace: 0xFF5C,
19963 bdotaccent: 0x1E03,
19965 beamedsixteenthnotes: 0x266C,
19967 becyrillic: 0x0431,
19969 behfinalarabic: 0xFE90,
19970 behinitialarabic: 0xFE91,
19971 behiragana: 0x3079,
19972 behmedialarabic: 0xFE92,
19973 behmeeminitialarabic: 0xFC9F,
19974 behmeemisolatedarabic: 0xFC08,
19975 behnoonfinalarabic: 0xFC6D,
19976 bekatakana: 0x30D9,
19977 benarmenian: 0x0562,
19980 betasymbolgreek: 0x03D0,
19982 betdageshhebrew: 0xFB31,
19984 betrafehebrew: 0xFB4C,
19985 bhabengali: 0x09AD,
19987 bhagujarati: 0x0AAD,
19988 bhagurmukhi: 0x0A2D,
19990 bihiragana: 0x3073,
19991 bikatakana: 0x30D3,
19992 bilabialclick: 0x0298,
19993 bindigurmukhi: 0x0A02,
19994 birusquare: 0x3331,
19995 blackcircle: 0x25CF,
19996 blackdiamond: 0x25C6,
19997 blackdownpointingtriangle: 0x25BC,
19998 blackleftpointingpointer: 0x25C4,
19999 blackleftpointingtriangle: 0x25C0,
20000 blacklenticularbracketleft: 0x3010,
20001 blacklenticularbracketleftvertical: 0xFE3B,
20002 blacklenticularbracketright: 0x3011,
20003 blacklenticularbracketrightvertical: 0xFE3C,
20004 blacklowerlefttriangle: 0x25E3,
20005 blacklowerrighttriangle: 0x25E2,
20006 blackrectangle: 0x25AC,
20007 blackrightpointingpointer: 0x25BA,
20008 blackrightpointingtriangle: 0x25B6,
20009 blacksmallsquare: 0x25AA,
20010 blacksmilingface: 0x263B,
20011 blacksquare: 0x25A0,
20013 blackupperlefttriangle: 0x25E4,
20014 blackupperrighttriangle: 0x25E5,
20015 blackuppointingsmalltriangle: 0x25B4,
20016 blackuppointingtriangle: 0x25B2,
20018 blinebelow: 0x1E07,
20020 bmonospace: 0xFF42,
20021 bobaimaithai: 0x0E1A,
20022 bohiragana: 0x307C,
20023 bokatakana: 0x30DC,
20028 braceleftbt: 0xF8F3,
20029 braceleftmid: 0xF8F2,
20030 braceleftmonospace: 0xFF5B,
20031 braceleftsmall: 0xFE5B,
20032 bracelefttp: 0xF8F1,
20033 braceleftvertical: 0xFE37,
20034 braceright: 0x007D,
20035 bracerightbt: 0xF8FE,
20036 bracerightmid: 0xF8FD,
20037 bracerightmonospace: 0xFF5D,
20038 bracerightsmall: 0xFE5C,
20039 bracerighttp: 0xF8FC,
20040 bracerightvertical: 0xFE38,
20041 bracketleft: 0x005B,
20042 bracketleftbt: 0xF8F0,
20043 bracketleftex: 0xF8EF,
20044 bracketleftmonospace: 0xFF3B,
20045 bracketlefttp: 0xF8EE,
20046 bracketright: 0x005D,
20047 bracketrightbt: 0xF8FB,
20048 bracketrightex: 0xF8FA,
20049 bracketrightmonospace: 0xFF3D,
20050 bracketrighttp: 0xF8F9,
20052 brevebelowcmb: 0x032E,
20054 breveinvertedbelowcmb: 0x032F,
20055 breveinvertedcmb: 0x0311,
20056 breveinverteddoublecmb: 0x0361,
20057 bridgebelowcmb: 0x032A,
20058 bridgeinvertedbelowcmb: 0x033A,
20063 buhiragana: 0x3076,
20064 bukatakana: 0x30D6,
20066 bulletinverse: 0x25D8,
20067 bulletoperator: 0x2219,
20070 caarmenian: 0x056E,
20074 cagujarati: 0x0A9A,
20075 cagurmukhi: 0x0A1A,
20077 candrabindubengali: 0x0981,
20078 candrabinducmb: 0x0310,
20079 candrabindudeva: 0x0901,
20080 candrabindugujarati: 0x0A81,
20084 caronbelowcmb: 0x032C,
20086 carriagereturn: 0x21B5,
20090 ccedillaacute: 0x1E09,
20092 ccircumflex: 0x0109,
20095 cdotaccent: 0x010B,
20098 cedillacmb: 0x0327,
20100 centigrade: 0x2103,
20101 centinferior: 0xF6DF,
20102 centmonospace: 0xFFE0,
20103 centoldstyle: 0xF7A2,
20104 centsuperior: 0xF6E0,
20105 chaarmenian: 0x0579,
20106 chabengali: 0x099B,
20108 chagujarati: 0x0A9B,
20109 chagurmukhi: 0x0A1B,
20110 chbopomofo: 0x3114,
20111 cheabkhasiancyrillic: 0x04BD,
20113 checyrillic: 0x0447,
20114 chedescenderabkhasiancyrillic: 0x04BF,
20115 chedescendercyrillic: 0x04B7,
20116 chedieresiscyrillic: 0x04F5,
20117 cheharmenian: 0x0573,
20118 chekhakassiancyrillic: 0x04CC,
20119 cheverticalstrokecyrillic: 0x04B9,
20121 chieuchacirclekorean: 0x3277,
20122 chieuchaparenkorean: 0x3217,
20123 chieuchcirclekorean: 0x3269,
20124 chieuchkorean: 0x314A,
20125 chieuchparenkorean: 0x3209,
20126 chochangthai: 0x0E0A,
20127 chochanthai: 0x0E08,
20128 chochingthai: 0x0E09,
20129 chochoethai: 0x0E0C,
20131 cieucacirclekorean: 0x3276,
20132 cieucaparenkorean: 0x3216,
20133 cieuccirclekorean: 0x3268,
20134 cieuckorean: 0x3148,
20135 cieucparenkorean: 0x3208,
20136 cieucuparenkorean: 0x321C,
20138 circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
20139 circlemultiply: 0x2297,
20141 circleplus: 0x2295,
20142 circlepostalmark: 0x3036,
20143 circlewithlefthalfblack: 0x25D0,
20144 circlewithrighthalfblack: 0x25D1,
20145 circumflex: 0x02C6,
20146 circumflexbelowcmb: 0x032D,
20147 circumflexcmb: 0x0302,
20149 clickalveolar: 0x01C2,
20150 clickdental: 0x01C0,
20151 clicklateral: 0x01C1,
20152 clickretroflex: 0x01C3,
20154 clubsuitblack: 0x2663,
20155 clubsuitwhite: 0x2667,
20156 cmcubedsquare: 0x33A4,
20157 cmonospace: 0xFF43,
20158 cmsquaredsquare: 0x33A0,
20159 coarmenian: 0x0581,
20161 colonmonetary: 0x20A1,
20162 colonmonospace: 0xFF1A,
20164 colonsmall: 0xFE55,
20165 colontriangularhalfmod: 0x02D1,
20166 colontriangularmod: 0x02D0,
20168 commaabovecmb: 0x0313,
20169 commaaboverightcmb: 0x0315,
20170 commaaccent: 0xF6C3,
20171 commaarabic: 0x060C,
20172 commaarmenian: 0x055D,
20173 commainferior: 0xF6E1,
20174 commamonospace: 0xFF0C,
20175 commareversedabovecmb: 0x0314,
20176 commareversedmod: 0x02BD,
20177 commasmall: 0xFE50,
20178 commasuperior: 0xF6E2,
20179 commaturnedabovecmb: 0x0312,
20180 commaturnedmod: 0x02BB,
20183 contourintegral: 0x222E,
20185 controlACK: 0x0006,
20186 controlBEL: 0x0007,
20188 controlCAN: 0x0018,
20190 controlDC1: 0x0011,
20191 controlDC2: 0x0012,
20192 controlDC3: 0x0013,
20193 controlDC4: 0x0014,
20194 controlDEL: 0x007F,
20195 controlDLE: 0x0010,
20197 controlENQ: 0x0005,
20198 controlEOT: 0x0004,
20199 controlESC: 0x001B,
20200 controlETB: 0x0017,
20201 controlETX: 0x0003,
20207 controlNAK: 0x0015,
20211 controlSOT: 0x0002,
20212 controlSTX: 0x0001,
20213 controlSUB: 0x001A,
20214 controlSYN: 0x0016,
20218 copyrightsans: 0xF8E9,
20219 copyrightserif: 0xF6D9,
20220 cornerbracketleft: 0x300C,
20221 cornerbracketlefthalfwidth: 0xFF62,
20222 cornerbracketleftvertical: 0xFE41,
20223 cornerbracketright: 0x300D,
20224 cornerbracketrighthalfwidth: 0xFF63,
20225 cornerbracketrightvertical: 0xFE42,
20226 corporationsquare: 0x337F,
20228 coverkgsquare: 0x33C6,
20231 cstretched: 0x0297,
20240 daarmenian: 0x0564,
20244 dadfinalarabic: 0xFEBE,
20245 dadinitialarabic: 0xFEBF,
20246 dadmedialarabic: 0xFEC0,
20248 dageshhebrew: 0x05BC,
20251 dagujarati: 0x0AA6,
20252 dagurmukhi: 0x0A26,
20253 dahiragana: 0x3060,
20254 dakatakana: 0x30C0,
20257 daletdagesh: 0xFB33,
20258 daletdageshhebrew: 0xFB33,
20259 dalethebrew: 0x05D3,
20260 dalfinalarabic: 0xFEAA,
20261 dammaarabic: 0x064F,
20262 dammalowarabic: 0x064F,
20263 dammatanaltonearabic: 0x064C,
20264 dammatanarabic: 0x064C,
20266 dargahebrew: 0x05A7,
20267 dargalefthebrew: 0x05A7,
20268 dasiapneumatacyrilliccmb: 0x0485,
20270 dblanglebracketleft: 0x300A,
20271 dblanglebracketleftvertical: 0xFE3D,
20272 dblanglebracketright: 0x300B,
20273 dblanglebracketrightvertical: 0xFE3E,
20274 dblarchinvertedbelowcmb: 0x032B,
20275 dblarrowleft: 0x21D4,
20276 dblarrowright: 0x21D2,
20279 dblgravecmb: 0x030F,
20280 dblintegral: 0x222C,
20281 dbllowline: 0x2017,
20282 dbllowlinecmb: 0x0333,
20283 dbloverlinecmb: 0x033F,
20284 dblprimemod: 0x02BA,
20285 dblverticalbar: 0x2016,
20286 dblverticallineabovecmb: 0x030E,
20292 dcircumflexbelow: 0x1E13,
20294 ddabengali: 0x09A1,
20296 ddagujarati: 0x0AA1,
20297 ddagurmukhi: 0x0A21,
20298 ddalarabic: 0x0688,
20299 ddalfinalarabic: 0xFB89,
20301 ddhabengali: 0x09A2,
20303 ddhagujarati: 0x0AA2,
20304 ddhagurmukhi: 0x0A22,
20305 ddotaccent: 0x1E0B,
20307 decimalseparatorarabic: 0x066B,
20308 decimalseparatorpersian: 0x066B,
20309 decyrillic: 0x0434,
20311 dehihebrew: 0x05AD,
20312 dehiragana: 0x3067,
20314 dekatakana: 0x30C7,
20315 deleteleft: 0x232B,
20316 deleteright: 0x2326,
20318 deltaturned: 0x018D,
20319 denominatorminusonenumeratorbengali: 0x09F8,
20321 dhabengali: 0x09A7,
20323 dhagujarati: 0x0AA7,
20324 dhagurmukhi: 0x0A27,
20326 dialytikatonos: 0x0385,
20327 dialytikatonoscmb: 0x0344,
20329 diamondsuitwhite: 0x2662,
20331 dieresisacute: 0xF6D7,
20332 dieresisbelowcmb: 0x0324,
20333 dieresiscmb: 0x0308,
20334 dieresisgrave: 0xF6D8,
20335 dieresistonos: 0x0385,
20336 dihiragana: 0x3062,
20337 dikatakana: 0x30C2,
20341 divisionslash: 0x2215,
20342 djecyrillic: 0x0452,
20344 dlinebelow: 0x1E0F,
20347 dmonospace: 0xFF44,
20349 dochadathai: 0x0E0E,
20351 dohiragana: 0x3069,
20352 dokatakana: 0x30C9,
20354 dollarinferior: 0xF6E3,
20355 dollarmonospace: 0xFF04,
20356 dollaroldstyle: 0xF724,
20357 dollarsmall: 0xFE69,
20358 dollarsuperior: 0xF6E4,
20360 dorusquare: 0x3326,
20362 dotaccentcmb: 0x0307,
20363 dotbelowcmb: 0x0323,
20364 dotbelowcomb: 0x0323,
20365 dotkatakana: 0x30FB,
20368 dotlessjstrokehook: 0x0284,
20370 dottedcircle: 0x25CC,
20371 doubleyodpatah: 0xFB1F,
20372 doubleyodpatahhebrew: 0xFB1F,
20373 downtackbelowcmb: 0x031E,
20374 downtackmod: 0x02D5,
20379 duhiragana: 0x3065,
20380 dukatakana: 0x30C5,
20385 dzeabkhasiancyrillic: 0x04E1,
20386 dzecyrillic: 0x0455,
20387 dzhecyrillic: 0x045F,
20394 ecandradeva: 0x090D,
20395 ecandragujarati: 0x0A8D,
20396 ecandravowelsigndeva: 0x0945,
20397 ecandravowelsigngujarati: 0x0AC5,
20399 ecedillabreve: 0x1E1D,
20400 echarmenian: 0x0565,
20401 echyiwnarmenian: 0x0587,
20403 ecircumflex: 0x00EA,
20404 ecircumflexacute: 0x1EBF,
20405 ecircumflexbelow: 0x1E19,
20406 ecircumflexdotbelow: 0x1EC7,
20407 ecircumflexgrave: 0x1EC1,
20408 ecircumflexhookabove: 0x1EC3,
20409 ecircumflextilde: 0x1EC5,
20415 edotaccent: 0x0117,
20417 eegurmukhi: 0x0A0F,
20418 eematragurmukhi: 0x0A47,
20419 efcyrillic: 0x0444,
20422 eharmenian: 0x0567,
20423 ehbopomofo: 0x311D,
20425 ehookabove: 0x1EBB,
20426 eibopomofo: 0x311F,
20428 eightarabic: 0x0668,
20429 eightbengali: 0x09EE,
20430 eightcircle: 0x2467,
20431 eightcircleinversesansserif: 0x2791,
20433 eighteencircle: 0x2471,
20434 eighteenparen: 0x2485,
20435 eighteenperiod: 0x2499,
20436 eightgujarati: 0x0AEE,
20437 eightgurmukhi: 0x0A6E,
20438 eighthackarabic: 0x0668,
20439 eighthangzhou: 0x3028,
20440 eighthnotebeamed: 0x266B,
20441 eightideographicparen: 0x3227,
20442 eightinferior: 0x2088,
20443 eightmonospace: 0xFF18,
20444 eightoldstyle: 0xF738,
20445 eightparen: 0x247B,
20446 eightperiod: 0x248F,
20447 eightpersian: 0x06F8,
20448 eightroman: 0x2177,
20449 eightsuperior: 0x2078,
20451 einvertedbreve: 0x0207,
20452 eiotifiedcyrillic: 0x0465,
20454 ekatakanahalfwidth: 0xFF74,
20455 ekonkargurmukhi: 0x0A74,
20457 elcyrillic: 0x043B,
20459 elevencircle: 0x246A,
20460 elevenparen: 0x247E,
20461 elevenperiod: 0x2492,
20462 elevenroman: 0x217A,
20464 ellipsisvertical: 0x22EE,
20466 emacronacute: 0x1E17,
20467 emacrongrave: 0x1E15,
20468 emcyrillic: 0x043C,
20470 emdashvertical: 0xFE31,
20471 emonospace: 0xFF45,
20472 emphasismarkarmenian: 0x055B,
20474 enbopomofo: 0x3123,
20475 encyrillic: 0x043D,
20477 endashvertical: 0xFE32,
20478 endescendercyrillic: 0x04A3,
20480 engbopomofo: 0x3125,
20481 enghecyrillic: 0x04A5,
20482 enhookcyrillic: 0x04C8,
20487 eopenclosed: 0x029A,
20488 eopenreversed: 0x025C,
20489 eopenreversedclosed: 0x025E,
20490 eopenreversedhook: 0x025D,
20493 epsilontonos: 0x03AD,
20495 equalmonospace: 0xFF1D,
20496 equalsmall: 0xFE66,
20497 equalsuperior: 0x207C,
20498 equivalence: 0x2261,
20499 erbopomofo: 0x3126,
20500 ercyrillic: 0x0440,
20502 ereversedcyrillic: 0x044D,
20503 escyrillic: 0x0441,
20504 esdescendercyrillic: 0x04AB,
20507 eshortdeva: 0x090E,
20508 eshortvowelsigndeva: 0x0946,
20509 eshreversedloop: 0x01AA,
20510 eshsquatreversed: 0x0285,
20511 esmallhiragana: 0x3047,
20512 esmallkatakana: 0x30A7,
20513 esmallkatakanahalfwidth: 0xFF6A,
20517 etarmenian: 0x0568,
20521 etildebelow: 0x1E1B,
20522 etnahtafoukhhebrew: 0x0591,
20523 etnahtafoukhlefthebrew: 0x0591,
20524 etnahtahebrew: 0x0591,
20525 etnahtalefthebrew: 0x0591,
20529 evowelsignbengali: 0x09C7,
20530 evowelsigndeva: 0x0947,
20531 evowelsigngujarati: 0x0AC7,
20533 exclamarmenian: 0x055C,
20535 exclamdown: 0x00A1,
20536 exclamdownsmall: 0xF7A1,
20537 exclammonospace: 0xFF01,
20538 exclamsmall: 0xF721,
20539 existential: 0x2203,
20543 ezhreversed: 0x01B9,
20547 fagurmukhi: 0x0A5E,
20548 fahrenheit: 0x2109,
20549 fathaarabic: 0x064E,
20550 fathalowarabic: 0x064E,
20551 fathatanarabic: 0x064B,
20554 fdotaccent: 0x1E1F,
20556 feharmenian: 0x0586,
20557 fehfinalarabic: 0xFED2,
20558 fehinitialarabic: 0xFED3,
20559 fehmedialarabic: 0xFED4,
20566 fifteencircle: 0x246E,
20567 fifteenparen: 0x2482,
20568 fifteenperiod: 0x2496,
20569 figuredash: 0x2012,
20571 filledrect: 0x25AC,
20573 finalkafdagesh: 0xFB3A,
20574 finalkafdageshhebrew: 0xFB3A,
20575 finalkafhebrew: 0x05DA,
20577 finalmemhebrew: 0x05DD,
20579 finalnunhebrew: 0x05DF,
20581 finalpehebrew: 0x05E3,
20582 finaltsadi: 0x05E5,
20583 finaltsadihebrew: 0x05E5,
20584 firsttonechinese: 0x02C9,
20586 fitacyrillic: 0x0473,
20588 fivearabic: 0x0665,
20589 fivebengali: 0x09EB,
20590 fivecircle: 0x2464,
20591 fivecircleinversesansserif: 0x278E,
20593 fiveeighths: 0x215D,
20594 fivegujarati: 0x0AEB,
20595 fivegurmukhi: 0x0A6B,
20596 fivehackarabic: 0x0665,
20597 fivehangzhou: 0x3025,
20598 fiveideographicparen: 0x3224,
20599 fiveinferior: 0x2085,
20600 fivemonospace: 0xFF15,
20601 fiveoldstyle: 0xF735,
20603 fiveperiod: 0x248C,
20604 fivepersian: 0x06F5,
20606 fivesuperior: 0x2075,
20610 fmonospace: 0xFF46,
20614 fongmanthai: 0x0E4F,
20617 fourarabic: 0x0664,
20618 fourbengali: 0x09EA,
20619 fourcircle: 0x2463,
20620 fourcircleinversesansserif: 0x278D,
20622 fourgujarati: 0x0AEA,
20623 fourgurmukhi: 0x0A6A,
20624 fourhackarabic: 0x0664,
20625 fourhangzhou: 0x3024,
20626 fourideographicparen: 0x3223,
20627 fourinferior: 0x2084,
20628 fourmonospace: 0xFF14,
20629 fournumeratorbengali: 0x09F7,
20630 fouroldstyle: 0xF734,
20632 fourperiod: 0x248B,
20633 fourpersian: 0x06F4,
20635 foursuperior: 0x2074,
20636 fourteencircle: 0x246D,
20637 fourteenparen: 0x2481,
20638 fourteenperiod: 0x2495,
20640 fourthtonechinese: 0x02CB,
20649 gaffinalarabic: 0xFB93,
20650 gafinitialarabic: 0xFB94,
20651 gafmedialarabic: 0xFB95,
20652 gagujarati: 0x0A97,
20653 gagurmukhi: 0x0A17,
20654 gahiragana: 0x304C,
20655 gakatakana: 0x30AC,
20657 gammalatinsmall: 0x0263,
20658 gammasuperior: 0x02E0,
20659 gangiacoptic: 0x03EB,
20665 gcircumflex: 0x011D,
20666 gcommaaccent: 0x0123,
20668 gdotaccent: 0x0121,
20669 gecyrillic: 0x0433,
20670 gehiragana: 0x3052,
20671 gekatakana: 0x30B2,
20672 geometricallyequal: 0x2251,
20673 gereshaccenthebrew: 0x059C,
20674 gereshhebrew: 0x05F3,
20675 gereshmuqdamhebrew: 0x059D,
20676 germandbls: 0x00DF,
20677 gershayimaccenthebrew: 0x059E,
20678 gershayimhebrew: 0x05F4,
20680 ghabengali: 0x0998,
20681 ghadarmenian: 0x0572,
20683 ghagujarati: 0x0A98,
20684 ghagurmukhi: 0x0A18,
20685 ghainarabic: 0x063A,
20686 ghainfinalarabic: 0xFECE,
20687 ghaininitialarabic: 0xFECF,
20688 ghainmedialarabic: 0xFED0,
20689 ghemiddlehookcyrillic: 0x0495,
20690 ghestrokecyrillic: 0x0493,
20691 gheupturncyrillic: 0x0491,
20693 ghhagurmukhi: 0x0A5A,
20696 gihiragana: 0x304E,
20697 gikatakana: 0x30AE,
20698 gimarmenian: 0x0563,
20700 gimeldagesh: 0xFB32,
20701 gimeldageshhebrew: 0xFB32,
20702 gimelhebrew: 0x05D2,
20703 gjecyrillic: 0x0453,
20704 glottalinvertedstroke: 0x01BE,
20705 glottalstop: 0x0294,
20706 glottalstopinverted: 0x0296,
20707 glottalstopmod: 0x02C0,
20708 glottalstopreversed: 0x0295,
20709 glottalstopreversedmod: 0x02C1,
20710 glottalstopreversedsuperior: 0x02E4,
20711 glottalstopstroke: 0x02A1,
20712 glottalstopstrokereversed: 0x02A2,
20714 gmonospace: 0xFF47,
20715 gohiragana: 0x3054,
20716 gokatakana: 0x30B4,
20721 gravebelowcmb: 0x0316,
20725 gravelowmod: 0x02CE,
20726 gravemonospace: 0xFF40,
20727 gravetonecmb: 0x0340,
20729 greaterequal: 0x2265,
20730 greaterequalorless: 0x22DB,
20731 greatermonospace: 0xFF1E,
20732 greaterorequivalent: 0x2273,
20733 greaterorless: 0x2277,
20734 greateroverequal: 0x2267,
20735 greatersmall: 0xFE65,
20738 guhiragana: 0x3050,
20739 guillemotleft: 0x00AB,
20740 guillemotright: 0x00BB,
20741 guilsinglleft: 0x2039,
20742 guilsinglright: 0x203A,
20743 gukatakana: 0x30B0,
20744 guramusquare: 0x3318,
20747 haabkhasiancyrillic: 0x04A9,
20748 haaltonearabic: 0x06C1,
20750 hadescendercyrillic: 0x04B3,
20752 hagujarati: 0x0AB9,
20753 hagurmukhi: 0x0A39,
20755 hahfinalarabic: 0xFEA2,
20756 hahinitialarabic: 0xFEA3,
20757 hahiragana: 0x306F,
20758 hahmedialarabic: 0xFEA4,
20759 haitusquare: 0x332A,
20760 hakatakana: 0x30CF,
20761 hakatakanahalfwidth: 0xFF8A,
20762 halantgurmukhi: 0x0A4D,
20763 hamzaarabic: 0x0621,
20764 hamzalowarabic: 0x0621,
20765 hangulfiller: 0x3164,
20766 hardsigncyrillic: 0x044A,
20767 harpoonleftbarbup: 0x21BC,
20768 harpoonrightbarbup: 0x21C0,
20770 hatafpatah: 0x05B2,
20771 hatafpatah16: 0x05B2,
20772 hatafpatah23: 0x05B2,
20773 hatafpatah2f: 0x05B2,
20774 hatafpatahhebrew: 0x05B2,
20775 hatafpatahnarrowhebrew: 0x05B2,
20776 hatafpatahquarterhebrew: 0x05B2,
20777 hatafpatahwidehebrew: 0x05B2,
20778 hatafqamats: 0x05B3,
20779 hatafqamats1b: 0x05B3,
20780 hatafqamats28: 0x05B3,
20781 hatafqamats34: 0x05B3,
20782 hatafqamatshebrew: 0x05B3,
20783 hatafqamatsnarrowhebrew: 0x05B3,
20784 hatafqamatsquarterhebrew: 0x05B3,
20785 hatafqamatswidehebrew: 0x05B3,
20786 hatafsegol: 0x05B1,
20787 hatafsegol17: 0x05B1,
20788 hatafsegol24: 0x05B1,
20789 hatafsegol30: 0x05B1,
20790 hatafsegolhebrew: 0x05B1,
20791 hatafsegolnarrowhebrew: 0x05B1,
20792 hatafsegolquarterhebrew: 0x05B1,
20793 hatafsegolwidehebrew: 0x05B1,
20796 hbrevebelow: 0x1E2B,
20799 hcircumflex: 0x0125,
20801 hdotaccent: 0x1E23,
20805 heartsuitblack: 0x2665,
20806 heartsuitwhite: 0x2661,
20808 hedageshhebrew: 0xFB34,
20809 hehaltonearabic: 0x06C1,
20812 hehfinalaltonearabic: 0xFBA7,
20813 hehfinalalttwoarabic: 0xFEEA,
20814 hehfinalarabic: 0xFEEA,
20815 hehhamzaabovefinalarabic: 0xFBA5,
20816 hehhamzaaboveisolatedarabic: 0xFBA4,
20817 hehinitialaltonearabic: 0xFBA8,
20818 hehinitialarabic: 0xFEEB,
20819 hehiragana: 0x3078,
20820 hehmedialaltonearabic: 0xFBA9,
20821 hehmedialarabic: 0xFEEC,
20822 heiseierasquare: 0x337B,
20823 hekatakana: 0x30D8,
20824 hekatakanahalfwidth: 0xFF8D,
20825 hekutaarusquare: 0x3336,
20827 herutusquare: 0x3339,
20831 hhooksuperior: 0x02B1,
20832 hieuhacirclekorean: 0x327B,
20833 hieuhaparenkorean: 0x321B,
20834 hieuhcirclekorean: 0x326D,
20835 hieuhkorean: 0x314E,
20836 hieuhparenkorean: 0x320D,
20837 hihiragana: 0x3072,
20838 hikatakana: 0x30D2,
20839 hikatakanahalfwidth: 0xFF8B,
20844 hiriqhebrew: 0x05B4,
20845 hiriqnarrowhebrew: 0x05B4,
20846 hiriqquarterhebrew: 0x05B4,
20847 hiriqwidehebrew: 0x05B4,
20848 hlinebelow: 0x1E96,
20849 hmonospace: 0xFF48,
20850 hoarmenian: 0x0570,
20852 hohiragana: 0x307B,
20853 hokatakana: 0x30DB,
20854 hokatakanahalfwidth: 0xFF8E,
20859 holamhebrew: 0x05B9,
20860 holamnarrowhebrew: 0x05B9,
20861 holamquarterhebrew: 0x05B9,
20862 holamwidehebrew: 0x05B9,
20863 honokhukthai: 0x0E2E,
20864 hookabovecomb: 0x0309,
20866 hookpalatalizedbelowcmb: 0x0321,
20867 hookretroflexbelowcmb: 0x0322,
20868 hoonsquare: 0x3342,
20869 horicoptic: 0x03E9,
20870 horizontalbar: 0x2015,
20872 hotsprings: 0x2668,
20877 huhiragana: 0x3075,
20878 huiitosquare: 0x3333,
20879 hukatakana: 0x30D5,
20880 hukatakanahalfwidth: 0xFF8C,
20881 hungarumlaut: 0x02DD,
20882 hungarumlautcmb: 0x030B,
20885 hypheninferior: 0xF6E5,
20886 hyphenmonospace: 0xFF0D,
20887 hyphensmall: 0xFE63,
20888 hyphensuperior: 0xF6E6,
20892 iacyrillic: 0x044F,
20898 icircumflex: 0x00EE,
20901 ideographearthcircle: 0x328F,
20902 ideographfirecircle: 0x328B,
20903 ideographicallianceparen: 0x323F,
20904 ideographiccallparen: 0x323A,
20905 ideographiccentrecircle: 0x32A5,
20906 ideographicclose: 0x3006,
20907 ideographiccomma: 0x3001,
20908 ideographiccommaleft: 0xFF64,
20909 ideographiccongratulationparen: 0x3237,
20910 ideographiccorrectcircle: 0x32A3,
20911 ideographicearthparen: 0x322F,
20912 ideographicenterpriseparen: 0x323D,
20913 ideographicexcellentcircle: 0x329D,
20914 ideographicfestivalparen: 0x3240,
20915 ideographicfinancialcircle: 0x3296,
20916 ideographicfinancialparen: 0x3236,
20917 ideographicfireparen: 0x322B,
20918 ideographichaveparen: 0x3232,
20919 ideographichighcircle: 0x32A4,
20920 ideographiciterationmark: 0x3005,
20921 ideographiclaborcircle: 0x3298,
20922 ideographiclaborparen: 0x3238,
20923 ideographicleftcircle: 0x32A7,
20924 ideographiclowcircle: 0x32A6,
20925 ideographicmedicinecircle: 0x32A9,
20926 ideographicmetalparen: 0x322E,
20927 ideographicmoonparen: 0x322A,
20928 ideographicnameparen: 0x3234,
20929 ideographicperiod: 0x3002,
20930 ideographicprintcircle: 0x329E,
20931 ideographicreachparen: 0x3243,
20932 ideographicrepresentparen: 0x3239,
20933 ideographicresourceparen: 0x323E,
20934 ideographicrightcircle: 0x32A8,
20935 ideographicsecretcircle: 0x3299,
20936 ideographicselfparen: 0x3242,
20937 ideographicsocietyparen: 0x3233,
20938 ideographicspace: 0x3000,
20939 ideographicspecialparen: 0x3235,
20940 ideographicstockparen: 0x3231,
20941 ideographicstudyparen: 0x323B,
20942 ideographicsunparen: 0x3230,
20943 ideographicsuperviseparen: 0x323C,
20944 ideographicwaterparen: 0x322C,
20945 ideographicwoodparen: 0x322D,
20946 ideographiczero: 0x3007,
20947 ideographmetalcircle: 0x328E,
20948 ideographmooncircle: 0x328A,
20949 ideographnamecircle: 0x3294,
20950 ideographsuncircle: 0x3290,
20951 ideographwatercircle: 0x328C,
20952 ideographwoodcircle: 0x328D,
20955 idieresisacute: 0x1E2F,
20956 idieresiscyrillic: 0x04E5,
20958 iebrevecyrillic: 0x04D7,
20959 iecyrillic: 0x0435,
20960 ieungacirclekorean: 0x3275,
20961 ieungaparenkorean: 0x3215,
20962 ieungcirclekorean: 0x3267,
20963 ieungkorean: 0x3147,
20964 ieungparenkorean: 0x3207,
20969 ihookabove: 0x1EC9,
20971 iicyrillic: 0x0438,
20973 iigujarati: 0x0A88,
20974 iigurmukhi: 0x0A08,
20975 iimatragurmukhi: 0x0A40,
20976 iinvertedbreve: 0x020B,
20977 iishortcyrillic: 0x0439,
20978 iivowelsignbengali: 0x09C0,
20979 iivowelsigndeva: 0x0940,
20980 iivowelsigngujarati: 0x0AC0,
20983 ikatakanahalfwidth: 0xFF72,
20986 iluyhebrew: 0x05AC,
20988 imacroncyrillic: 0x04E3,
20989 imageorapproximatelyequal: 0x2253,
20990 imatragurmukhi: 0x0A3F,
20991 imonospace: 0xFF49,
20994 iniarmenian: 0x056B,
20996 integralbottom: 0x2321,
20997 integralbt: 0x2321,
20998 integralex: 0xF8F5,
20999 integraltop: 0x2320,
21000 integraltp: 0x2320,
21001 intersection: 0x2229,
21002 intisquare: 0x3305,
21005 invsmileface: 0x263B,
21006 iocyrillic: 0x0451,
21009 iotadieresis: 0x03CA,
21010 iotadieresistonos: 0x0390,
21014 irigurmukhi: 0x0A72,
21015 ismallhiragana: 0x3043,
21016 ismallkatakana: 0x30A3,
21017 ismallkatakanahalfwidth: 0xFF68,
21018 issharbengali: 0x09FA,
21021 iterationhiragana: 0x309D,
21022 iterationkatakana: 0x30FD,
21024 itildebelow: 0x1E2D,
21025 iubopomofo: 0x3129,
21026 iucyrillic: 0x044E,
21027 ivowelsignbengali: 0x09BF,
21028 ivowelsigndeva: 0x093F,
21029 ivowelsigngujarati: 0x0ABF,
21030 izhitsacyrillic: 0x0475,
21031 izhitsadblgravecyrillic: 0x0477,
21033 jaarmenian: 0x0571,
21036 jagujarati: 0x0A9C,
21037 jagurmukhi: 0x0A1C,
21041 jcircumflex: 0x0135,
21042 jcrossedtail: 0x029D,
21043 jdotlessstroke: 0x025F,
21044 jecyrillic: 0x0458,
21045 jeemarabic: 0x062C,
21046 jeemfinalarabic: 0xFE9E,
21047 jeeminitialarabic: 0xFE9F,
21048 jeemmedialarabic: 0xFEA0,
21050 jehfinalarabic: 0xFB8B,
21051 jhabengali: 0x099D,
21053 jhagujarati: 0x0A9D,
21054 jhagurmukhi: 0x0A1D,
21055 jheharmenian: 0x057B,
21057 jmonospace: 0xFF4A,
21061 kabashkircyrillic: 0x04A1,
21064 kacyrillic: 0x043A,
21065 kadescendercyrillic: 0x049B,
21070 kafdageshhebrew: 0xFB3B,
21071 kaffinalarabic: 0xFEDA,
21073 kafinitialarabic: 0xFEDB,
21074 kafmedialarabic: 0xFEDC,
21075 kafrafehebrew: 0xFB4D,
21076 kagujarati: 0x0A95,
21077 kagurmukhi: 0x0A15,
21078 kahiragana: 0x304B,
21079 kahookcyrillic: 0x04C4,
21080 kakatakana: 0x30AB,
21081 kakatakanahalfwidth: 0xFF76,
21083 kappasymbolgreek: 0x03F0,
21084 kapyeounmieumkorean: 0x3171,
21085 kapyeounphieuphkorean: 0x3184,
21086 kapyeounpieupkorean: 0x3178,
21087 kapyeounssangpieupkorean: 0x3179,
21088 karoriisquare: 0x330D,
21089 kashidaautoarabic: 0x0640,
21090 kashidaautonosidebearingarabic: 0x0640,
21091 kasmallkatakana: 0x30F5,
21093 kasraarabic: 0x0650,
21094 kasratanarabic: 0x064D,
21095 kastrokecyrillic: 0x049F,
21096 katahiraprolongmarkhalfwidth: 0xFF70,
21097 kaverticalstrokecyrillic: 0x049D,
21099 kcalsquare: 0x3389,
21103 kcommaaccent: 0x0137,
21105 keharmenian: 0x0584,
21106 kehiragana: 0x3051,
21107 kekatakana: 0x30B1,
21108 kekatakanahalfwidth: 0xFF79,
21109 kenarmenian: 0x056F,
21110 kesmallkatakana: 0x30F6,
21111 kgreenlandic: 0x0138,
21112 khabengali: 0x0996,
21113 khacyrillic: 0x0445,
21115 khagujarati: 0x0A96,
21116 khagurmukhi: 0x0A16,
21117 khaharabic: 0x062E,
21118 khahfinalarabic: 0xFEA6,
21119 khahinitialarabic: 0xFEA7,
21120 khahmedialarabic: 0xFEA8,
21121 kheicoptic: 0x03E7,
21123 khhagurmukhi: 0x0A59,
21124 khieukhacirclekorean: 0x3278,
21125 khieukhaparenkorean: 0x3218,
21126 khieukhcirclekorean: 0x326A,
21127 khieukhkorean: 0x314B,
21128 khieukhparenkorean: 0x320A,
21129 khokhaithai: 0x0E02,
21130 khokhonthai: 0x0E05,
21131 khokhuatthai: 0x0E03,
21132 khokhwaithai: 0x0E04,
21133 khomutthai: 0x0E5B,
21135 khorakhangthai: 0x0E06,
21137 kihiragana: 0x304D,
21138 kikatakana: 0x30AD,
21139 kikatakanahalfwidth: 0xFF77,
21140 kiroguramusquare: 0x3315,
21141 kiromeetorusquare: 0x3316,
21142 kirosquare: 0x3314,
21143 kiyeokacirclekorean: 0x326E,
21144 kiyeokaparenkorean: 0x320E,
21145 kiyeokcirclekorean: 0x3260,
21146 kiyeokkorean: 0x3131,
21147 kiyeokparenkorean: 0x3200,
21148 kiyeoksioskorean: 0x3133,
21149 kjecyrillic: 0x045C,
21150 klinebelow: 0x1E35,
21152 kmcubedsquare: 0x33A6,
21153 kmonospace: 0xFF4B,
21154 kmsquaredsquare: 0x33A2,
21155 kohiragana: 0x3053,
21156 kohmsquare: 0x33C0,
21158 kokatakana: 0x30B3,
21159 kokatakanahalfwidth: 0xFF7A,
21160 kooposquare: 0x331E,
21161 koppacyrillic: 0x0481,
21162 koreanstandardsymbol: 0x327F,
21163 koroniscmb: 0x0343,
21166 ksicyrillic: 0x046F,
21169 kuhiragana: 0x304F,
21170 kukatakana: 0x30AF,
21171 kukatakanahalfwidth: 0xFF78,
21178 lagujarati: 0x0AB2,
21179 lagurmukhi: 0x0A32,
21180 lakkhangyaothai: 0x0E45,
21181 lamaleffinalarabic: 0xFEFC,
21182 lamalefhamzaabovefinalarabic: 0xFEF8,
21183 lamalefhamzaaboveisolatedarabic: 0xFEF7,
21184 lamalefhamzabelowfinalarabic: 0xFEFA,
21185 lamalefhamzabelowisolatedarabic: 0xFEF9,
21186 lamalefisolatedarabic: 0xFEFB,
21187 lamalefmaddaabovefinalarabic: 0xFEF6,
21188 lamalefmaddaaboveisolatedarabic: 0xFEF5,
21191 lambdastroke: 0x019B,
21193 lameddagesh: 0xFB3C,
21194 lameddageshhebrew: 0xFB3C,
21195 lamedhebrew: 0x05DC,
21196 lamfinalarabic: 0xFEDE,
21197 lamhahinitialarabic: 0xFCCA,
21198 laminitialarabic: 0xFEDF,
21199 lamjeeminitialarabic: 0xFCC9,
21200 lamkhahinitialarabic: 0xFCCB,
21201 lamlamhehisolatedarabic: 0xFDF2,
21202 lammedialarabic: 0xFEE0,
21203 lammeemhahinitialarabic: 0xFD88,
21204 lammeeminitialarabic: 0xFCCC,
21205 largecircle: 0x25EF,
21212 lcircumflexbelow: 0x1E3D,
21213 lcommaaccent: 0x013C,
21215 ldotaccent: 0x0140,
21217 ldotbelowmacron: 0x1E39,
21218 leftangleabovecmb: 0x031A,
21219 lefttackbelowcmb: 0x0318,
21222 lessequalorgreater: 0x22DA,
21223 lessmonospace: 0xFF1C,
21224 lessorequivalent: 0x2272,
21225 lessorgreater: 0x2276,
21226 lessoverequal: 0x2266,
21230 lhookretroflex: 0x026D,
21232 liwnarmenian: 0x056C,
21234 ljecyrillic: 0x0459,
21237 llagujarati: 0x0AB3,
21238 llinebelow: 0x1E3B,
21240 llvocalicbengali: 0x09E1,
21241 llvocalicdeva: 0x0961,
21242 llvocalicvowelsignbengali: 0x09E3,
21243 llvocalicvowelsigndeva: 0x0963,
21244 lmiddletilde: 0x026B,
21245 lmonospace: 0xFF4C,
21247 lochulathai: 0x0E2C,
21248 logicaland: 0x2227,
21249 logicalnot: 0x00AC,
21250 logicalnotreversed: 0x2310,
21252 lolingthai: 0x0E25,
21254 lowlinecenterline: 0xFE4E,
21255 lowlinecmb: 0x0332,
21256 lowlinedashed: 0xFE4D,
21264 lvocalicbengali: 0x098C,
21265 lvocalicdeva: 0x090C,
21266 lvocalicvowelsignbengali: 0x09E2,
21267 lvocalicvowelsigndeva: 0x0962,
21272 macronbelowcmb: 0x0331,
21274 macronlowmod: 0x02CD,
21275 macronmonospace: 0xFFE3,
21278 magujarati: 0x0AAE,
21279 magurmukhi: 0x0A2E,
21280 mahapakhhebrew: 0x05A4,
21281 mahapakhlefthebrew: 0x05A4,
21282 mahiragana: 0x307E,
21283 maichattawalowleftthai: 0xF895,
21284 maichattawalowrightthai: 0xF894,
21285 maichattawathai: 0x0E4B,
21286 maichattawaupperleftthai: 0xF893,
21287 maieklowleftthai: 0xF88C,
21288 maieklowrightthai: 0xF88B,
21290 maiekupperleftthai: 0xF88A,
21291 maihanakatleftthai: 0xF884,
21292 maihanakatthai: 0x0E31,
21293 maitaikhuleftthai: 0xF889,
21294 maitaikhuthai: 0x0E47,
21295 maitholowleftthai: 0xF88F,
21296 maitholowrightthai: 0xF88E,
21297 maithothai: 0x0E49,
21298 maithoupperleftthai: 0xF88D,
21299 maitrilowleftthai: 0xF892,
21300 maitrilowrightthai: 0xF891,
21301 maitrithai: 0x0E4A,
21302 maitriupperleftthai: 0xF890,
21303 maiyamokthai: 0x0E46,
21304 makatakana: 0x30DE,
21305 makatakanahalfwidth: 0xFF8F,
21307 mansyonsquare: 0x3347,
21308 maqafhebrew: 0x05BE,
21310 masoracirclehebrew: 0x05AF,
21315 mcubedsquare: 0x33A5,
21316 mdotaccent: 0x1E41,
21318 meemarabic: 0x0645,
21319 meemfinalarabic: 0xFEE2,
21320 meeminitialarabic: 0xFEE3,
21321 meemmedialarabic: 0xFEE4,
21322 meemmeeminitialarabic: 0xFCD1,
21323 meemmeemisolatedarabic: 0xFC48,
21324 meetorusquare: 0x334D,
21325 mehiragana: 0x3081,
21326 meizierasquare: 0x337E,
21327 mekatakana: 0x30E1,
21328 mekatakanahalfwidth: 0xFF92,
21331 memdageshhebrew: 0xFB3E,
21333 menarmenian: 0x0574,
21334 merkhahebrew: 0x05A5,
21335 merkhakefulahebrew: 0x05A6,
21336 merkhakefulalefthebrew: 0x05A6,
21337 merkhalefthebrew: 0x05A5,
21340 middledotkatakanahalfwidth: 0xFF65,
21342 mieumacirclekorean: 0x3272,
21343 mieumaparenkorean: 0x3212,
21344 mieumcirclekorean: 0x3264,
21345 mieumkorean: 0x3141,
21346 mieumpansioskorean: 0x3170,
21347 mieumparenkorean: 0x3204,
21348 mieumpieupkorean: 0x316E,
21349 mieumsioskorean: 0x316F,
21350 mihiragana: 0x307F,
21351 mikatakana: 0x30DF,
21352 mikatakanahalfwidth: 0xFF90,
21354 minusbelowcmb: 0x0320,
21355 minuscircle: 0x2296,
21359 miribaarusquare: 0x334A,
21360 mirisquare: 0x3349,
21361 mlonglegturned: 0x0270,
21363 mmcubedsquare: 0x33A3,
21364 mmonospace: 0xFF4D,
21365 mmsquaredsquare: 0x339F,
21366 mohiragana: 0x3082,
21367 mohmsquare: 0x33C1,
21368 mokatakana: 0x30E2,
21369 mokatakanahalfwidth: 0xFF93,
21372 moverssquare: 0x33A7,
21373 moverssquaredsquare: 0x33A8,
21382 muchgreater: 0x226B,
21387 muhiragana: 0x3080,
21388 mukatakana: 0x30E0,
21389 mukatakanahalfwidth: 0xFF91,
21393 munahhebrew: 0x05A3,
21394 munahlefthebrew: 0x05A3,
21395 musicalnote: 0x266A,
21396 musicalnotedbl: 0x266B,
21397 musicflatsign: 0x266D,
21398 musicsharpsign: 0x266F,
21402 mvmegasquare: 0x33B9,
21404 mwmegasquare: 0x33BF,
21411 nagujarati: 0x0AA8,
21412 nagurmukhi: 0x0A28,
21413 nahiragana: 0x306A,
21414 nakatakana: 0x30CA,
21415 nakatakanahalfwidth: 0xFF85,
21416 napostrophe: 0x0149,
21423 ncircumflexbelow: 0x1E4B,
21424 ncommaaccent: 0x0146,
21425 ndotaccent: 0x1E45,
21427 nehiragana: 0x306D,
21428 nekatakana: 0x30CD,
21429 nekatakanahalfwidth: 0xFF88,
21430 newsheqelsign: 0x20AA,
21432 ngabengali: 0x0999,
21434 ngagujarati: 0x0A99,
21435 ngagurmukhi: 0x0A19,
21436 ngonguthai: 0x0E07,
21439 nhookretroflex: 0x0273,
21440 nieunacirclekorean: 0x326F,
21441 nieunaparenkorean: 0x320F,
21442 nieuncieuckorean: 0x3135,
21443 nieuncirclekorean: 0x3261,
21444 nieunhieuhkorean: 0x3136,
21445 nieunkorean: 0x3134,
21446 nieunpansioskorean: 0x3168,
21447 nieunparenkorean: 0x3201,
21448 nieunsioskorean: 0x3167,
21449 nieuntikeutkorean: 0x3166,
21450 nihiragana: 0x306B,
21451 nikatakana: 0x30CB,
21452 nikatakanahalfwidth: 0xFF86,
21453 nikhahitleftthai: 0xF899,
21454 nikhahitthai: 0x0E4D,
21456 ninearabic: 0x0669,
21457 ninebengali: 0x09EF,
21458 ninecircle: 0x2468,
21459 ninecircleinversesansserif: 0x2792,
21461 ninegujarati: 0x0AEF,
21462 ninegurmukhi: 0x0A6F,
21463 ninehackarabic: 0x0669,
21464 ninehangzhou: 0x3029,
21465 nineideographicparen: 0x3228,
21466 nineinferior: 0x2089,
21467 ninemonospace: 0xFF19,
21468 nineoldstyle: 0xF739,
21470 nineperiod: 0x2490,
21471 ninepersian: 0x06F9,
21473 ninesuperior: 0x2079,
21474 nineteencircle: 0x2472,
21475 nineteenparen: 0x2486,
21476 nineteenperiod: 0x249A,
21479 njecyrillic: 0x045A,
21481 nkatakanahalfwidth: 0xFF9D,
21482 nlegrightlong: 0x019E,
21483 nlinebelow: 0x1E49,
21484 nmonospace: 0xFF4E,
21486 nnabengali: 0x09A3,
21488 nnagujarati: 0x0AA3,
21489 nnagurmukhi: 0x0A23,
21491 nohiragana: 0x306E,
21492 nokatakana: 0x30CE,
21493 nokatakanahalfwidth: 0xFF89,
21494 nonbreakingspace: 0x00A0,
21497 noonarabic: 0x0646,
21498 noonfinalarabic: 0xFEE6,
21499 noonghunnaarabic: 0x06BA,
21500 noonghunnafinalarabic: 0xFB9F,
21501 nooninitialarabic: 0xFEE7,
21502 noonjeeminitialarabic: 0xFCD2,
21503 noonjeemisolatedarabic: 0xFC4B,
21504 noonmedialarabic: 0xFEE8,
21505 noonmeeminitialarabic: 0xFCD5,
21506 noonmeemisolatedarabic: 0xFC4E,
21507 noonnoonfinalarabic: 0xFC8D,
21508 notcontains: 0x220C,
21509 notelement: 0x2209,
21510 notelementof: 0x2209,
21512 notgreater: 0x226F,
21513 notgreaternorequal: 0x2271,
21514 notgreaternorless: 0x2279,
21515 notidentical: 0x2262,
21517 notlessnorequal: 0x2270,
21518 notparallel: 0x2226,
21519 notprecedes: 0x2280,
21521 notsucceeds: 0x2281,
21522 notsuperset: 0x2285,
21523 nowarmenian: 0x0576,
21529 nuhiragana: 0x306C,
21530 nukatakana: 0x30CC,
21531 nukatakanahalfwidth: 0xFF87,
21532 nuktabengali: 0x09BC,
21534 nuktagujarati: 0x0ABC,
21535 nuktagurmukhi: 0x0A3C,
21536 numbersign: 0x0023,
21537 numbersignmonospace: 0xFF03,
21538 numbersignsmall: 0xFE5F,
21539 numeralsigngreek: 0x0374,
21540 numeralsignlowergreek: 0x0375,
21544 nundageshhebrew: 0xFB40,
21548 nyabengali: 0x099E,
21550 nyagujarati: 0x0A9E,
21551 nyagurmukhi: 0x0A1E,
21556 obarredcyrillic: 0x04E9,
21557 obarreddieresiscyrillic: 0x04EB,
21561 ocandradeva: 0x0911,
21562 ocandragujarati: 0x0A91,
21563 ocandravowelsigndeva: 0x0949,
21564 ocandravowelsigngujarati: 0x0AC9,
21567 ocircumflex: 0x00F4,
21568 ocircumflexacute: 0x1ED1,
21569 ocircumflexdotbelow: 0x1ED9,
21570 ocircumflexgrave: 0x1ED3,
21571 ocircumflexhookabove: 0x1ED5,
21572 ocircumflextilde: 0x1ED7,
21578 odieresiscyrillic: 0x04E7,
21586 oharmenian: 0x0585,
21588 ohookabove: 0x1ECF,
21590 ohornacute: 0x1EDB,
21591 ohorndotbelow: 0x1EE3,
21592 ohorngrave: 0x1EDD,
21593 ohornhookabove: 0x1EDF,
21594 ohorntilde: 0x1EE1,
21595 ohungarumlaut: 0x0151,
21597 oinvertedbreve: 0x020F,
21599 okatakanahalfwidth: 0xFF75,
21603 omacronacute: 0x1E53,
21604 omacrongrave: 0x1E51,
21608 omegacyrillic: 0x0461,
21609 omegalatinclosed: 0x0277,
21610 omegaroundcyrillic: 0x047B,
21611 omegatitlocyrillic: 0x047D,
21612 omegatonos: 0x03CE,
21613 omgujarati: 0x0AD0,
21615 omicrontonos: 0x03CC,
21616 omonospace: 0xFF4F,
21619 onebengali: 0x09E7,
21621 onecircleinversesansserif: 0x278A,
21623 onedotenleader: 0x2024,
21626 onegujarati: 0x0AE7,
21627 onegurmukhi: 0x0A67,
21628 onehackarabic: 0x0661,
21630 onehangzhou: 0x3021,
21631 oneideographicparen: 0x3220,
21632 oneinferior: 0x2081,
21633 onemonospace: 0xFF11,
21634 onenumeratorbengali: 0x09F4,
21635 oneoldstyle: 0xF731,
21638 onepersian: 0x06F1,
21639 onequarter: 0x00BC,
21641 onesuperior: 0x00B9,
21645 oogonekmacron: 0x01ED,
21646 oogurmukhi: 0x0A13,
21647 oomatragurmukhi: 0x0A4B,
21650 openbullet: 0x25E6,
21652 ordfeminine: 0x00AA,
21653 ordmasculine: 0x00BA,
21654 orthogonal: 0x221F,
21655 oshortdeva: 0x0912,
21656 oshortvowelsigndeva: 0x094A,
21658 oslashacute: 0x01FF,
21659 osmallhiragana: 0x3049,
21660 osmallkatakana: 0x30A9,
21661 osmallkatakanahalfwidth: 0xFF6B,
21662 ostrokeacute: 0x01FF,
21664 otcyrillic: 0x047F,
21666 otildeacute: 0x1E4D,
21667 otildedieresis: 0x1E4F,
21668 oubopomofo: 0x3121,
21670 overlinecenterline: 0xFE4A,
21671 overlinecmb: 0x0305,
21672 overlinedashed: 0xFE49,
21673 overlinedblwavy: 0xFE4C,
21674 overlinewavy: 0xFE4B,
21676 ovowelsignbengali: 0x09CB,
21677 ovowelsigndeva: 0x094B,
21678 ovowelsigngujarati: 0x0ACB,
21680 paampssquare: 0x3380,
21681 paasentosquare: 0x332B,
21687 pagujarati: 0x0AAA,
21688 pagurmukhi: 0x0A2A,
21689 pahiragana: 0x3071,
21690 paiyannoithai: 0x0E2F,
21691 pakatakana: 0x30D1,
21692 palatalizationcyrilliccmb: 0x0484,
21693 palochkacyrillic: 0x04C0,
21694 pansioskorean: 0x317F,
21698 parenleftaltonearabic: 0xFD3E,
21699 parenleftbt: 0xF8ED,
21700 parenleftex: 0xF8EC,
21701 parenleftinferior: 0x208D,
21702 parenleftmonospace: 0xFF08,
21703 parenleftsmall: 0xFE59,
21704 parenleftsuperior: 0x207D,
21705 parenlefttp: 0xF8EB,
21706 parenleftvertical: 0xFE35,
21707 parenright: 0x0029,
21708 parenrightaltonearabic: 0xFD3F,
21709 parenrightbt: 0xF8F8,
21710 parenrightex: 0xF8F7,
21711 parenrightinferior: 0x208E,
21712 parenrightmonospace: 0xFF09,
21713 parenrightsmall: 0xFE5A,
21714 parenrightsuperior: 0x207E,
21715 parenrighttp: 0xF8F6,
21716 parenrightvertical: 0xFE36,
21717 partialdiff: 0x2202,
21718 paseqhebrew: 0x05C0,
21719 pashtahebrew: 0x0599,
21725 patahhebrew: 0x05B7,
21726 patahnarrowhebrew: 0x05B7,
21727 patahquarterhebrew: 0x05B7,
21728 patahwidehebrew: 0x05B7,
21729 pazerhebrew: 0x05A1,
21732 pdotaccent: 0x1E57,
21734 pecyrillic: 0x043F,
21736 pedageshhebrew: 0xFB44,
21737 peezisquare: 0x333B,
21738 pefinaldageshhebrew: 0xFB43,
21740 peharmenian: 0x057A,
21742 pehfinalarabic: 0xFB57,
21743 pehinitialarabic: 0xFB58,
21744 pehiragana: 0x307A,
21745 pehmedialarabic: 0xFB59,
21746 pekatakana: 0x30DA,
21747 pemiddlehookcyrillic: 0x04A7,
21748 perafehebrew: 0xFB4E,
21750 percentarabic: 0x066A,
21751 percentmonospace: 0xFF05,
21752 percentsmall: 0xFE6A,
21754 periodarmenian: 0x0589,
21755 periodcentered: 0x00B7,
21756 periodhalfwidth: 0xFF61,
21757 periodinferior: 0xF6E7,
21758 periodmonospace: 0xFF0E,
21759 periodsmall: 0xFE52,
21760 periodsuperior: 0xF6E8,
21761 perispomenigreekcmb: 0x0342,
21762 perpendicular: 0x22A5,
21763 perthousand: 0x2030,
21766 phabengali: 0x09AB,
21768 phagujarati: 0x0AAB,
21769 phagurmukhi: 0x0A2B,
21772 phieuphacirclekorean: 0x327A,
21773 phieuphaparenkorean: 0x321A,
21774 phieuphcirclekorean: 0x326C,
21775 phieuphkorean: 0x314D,
21776 phieuphparenkorean: 0x320C,
21778 phinthuthai: 0x0E3A,
21779 phisymbolgreek: 0x03D5,
21781 phophanthai: 0x0E1E,
21782 phophungthai: 0x0E1C,
21783 phosamphaothai: 0x0E20,
21785 pieupacirclekorean: 0x3273,
21786 pieupaparenkorean: 0x3213,
21787 pieupcieuckorean: 0x3176,
21788 pieupcirclekorean: 0x3265,
21789 pieupkiyeokkorean: 0x3172,
21790 pieupkorean: 0x3142,
21791 pieupparenkorean: 0x3205,
21792 pieupsioskiyeokkorean: 0x3174,
21793 pieupsioskorean: 0x3144,
21794 pieupsiostikeutkorean: 0x3175,
21795 pieupthieuthkorean: 0x3177,
21796 pieuptikeutkorean: 0x3173,
21797 pihiragana: 0x3074,
21798 pikatakana: 0x30D4,
21799 pisymbolgreek: 0x03D6,
21800 piwrarmenian: 0x0583,
21802 plusbelowcmb: 0x031F,
21803 pluscircle: 0x2295,
21806 plusmonospace: 0xFF0B,
21808 plussuperior: 0x207A,
21809 pmonospace: 0xFF50,
21811 pohiragana: 0x307D,
21812 pointingindexdownwhite: 0x261F,
21813 pointingindexleftwhite: 0x261C,
21814 pointingindexrightwhite: 0x261E,
21815 pointingindexupwhite: 0x261D,
21816 pokatakana: 0x30DD,
21818 postalmark: 0x3012,
21819 postalmarkface: 0x3020,
21822 prescription: 0x211E,
21824 primereversed: 0x2035,
21826 projective: 0x2305,
21827 prolongedkana: 0x30FC,
21829 propersubset: 0x2282,
21830 propersuperset: 0x2283,
21831 proportion: 0x2237,
21832 proportional: 0x221D,
21834 psicyrillic: 0x0471,
21835 psilipneumatacyrilliccmb: 0x0486,
21837 puhiragana: 0x3077,
21838 pukatakana: 0x30D7,
21843 qadmahebrew: 0x05A8,
21845 qaffinalarabic: 0xFED6,
21846 qafinitialarabic: 0xFED7,
21847 qafmedialarabic: 0xFED8,
21856 qamatshebrew: 0x05B8,
21857 qamatsnarrowhebrew: 0x05B8,
21858 qamatsqatanhebrew: 0x05B8,
21859 qamatsqatannarrowhebrew: 0x05B8,
21860 qamatsqatanquarterhebrew: 0x05B8,
21861 qamatsqatanwidehebrew: 0x05B8,
21862 qamatsquarterhebrew: 0x05B8,
21863 qamatswidehebrew: 0x05B8,
21864 qarneyparahebrew: 0x059F,
21868 qmonospace: 0xFF51,
21871 qofdageshhebrew: 0xFB47,
21874 quarternote: 0x2669,
21879 qubutshebrew: 0x05BB,
21880 qubutsnarrowhebrew: 0x05BB,
21881 qubutsquarterhebrew: 0x05BB,
21882 qubutswidehebrew: 0x05BB,
21884 questionarabic: 0x061F,
21885 questionarmenian: 0x055E,
21886 questiondown: 0x00BF,
21887 questiondownsmall: 0xF7BF,
21888 questiongreek: 0x037E,
21889 questionmonospace: 0xFF1F,
21890 questionsmall: 0xF73F,
21892 quotedblbase: 0x201E,
21893 quotedblleft: 0x201C,
21894 quotedblmonospace: 0xFF02,
21895 quotedblprime: 0x301E,
21896 quotedblprimereversed: 0x301D,
21897 quotedblright: 0x201D,
21899 quoteleftreversed: 0x201B,
21900 quotereversed: 0x201B,
21901 quoteright: 0x2019,
21902 quoterightn: 0x0149,
21903 quotesinglbase: 0x201A,
21904 quotesingle: 0x0027,
21905 quotesinglemonospace: 0xFF07,
21907 raarmenian: 0x057C,
21913 radoverssquare: 0x33AE,
21914 radoverssquaredsquare: 0x33AF,
21917 rafehebrew: 0x05BF,
21918 ragujarati: 0x0AB0,
21919 ragurmukhi: 0x0A30,
21920 rahiragana: 0x3089,
21921 rakatakana: 0x30E9,
21922 rakatakanahalfwidth: 0xFF97,
21923 ralowerdiagonalbengali: 0x09F1,
21924 ramiddlediagonalbengali: 0x09F0,
21931 rcommaaccent: 0x0157,
21933 rdotaccent: 0x1E59,
21935 rdotbelowmacron: 0x1E5D,
21936 referencemark: 0x203B,
21937 reflexsubset: 0x2286,
21938 reflexsuperset: 0x2287,
21939 registered: 0x00AE,
21940 registersans: 0xF8E8,
21941 registerserif: 0xF6DA,
21943 reharmenian: 0x0580,
21944 rehfinalarabic: 0xFEAE,
21945 rehiragana: 0x308C,
21946 rekatakana: 0x30EC,
21947 rekatakanahalfwidth: 0xFF9A,
21949 reshdageshhebrew: 0xFB48,
21950 reshhebrew: 0x05E8,
21951 reversedtilde: 0x223D,
21952 reviahebrew: 0x0597,
21953 reviamugrashhebrew: 0x0597,
21954 revlogicalnot: 0x2310,
21956 rfishhookreversed: 0x027F,
21957 rhabengali: 0x09DD,
21961 rhookturned: 0x027B,
21962 rhookturnedsuperior: 0x02B5,
21963 rhosymbolgreek: 0x03F1,
21964 rhotichookmod: 0x02DE,
21965 rieulacirclekorean: 0x3271,
21966 rieulaparenkorean: 0x3211,
21967 rieulcirclekorean: 0x3263,
21968 rieulhieuhkorean: 0x3140,
21969 rieulkiyeokkorean: 0x313A,
21970 rieulkiyeoksioskorean: 0x3169,
21971 rieulkorean: 0x3139,
21972 rieulmieumkorean: 0x313B,
21973 rieulpansioskorean: 0x316C,
21974 rieulparenkorean: 0x3203,
21975 rieulphieuphkorean: 0x313F,
21976 rieulpieupkorean: 0x313C,
21977 rieulpieupsioskorean: 0x316B,
21978 rieulsioskorean: 0x313D,
21979 rieulthieuthkorean: 0x313E,
21980 rieultikeutkorean: 0x316A,
21981 rieulyeorinhieuhkorean: 0x316D,
21982 rightangle: 0x221F,
21983 righttackbelowcmb: 0x0319,
21984 righttriangle: 0x22BF,
21985 rihiragana: 0x308A,
21986 rikatakana: 0x30EA,
21987 rikatakanahalfwidth: 0xFF98,
21989 ringbelowcmb: 0x0325,
21991 ringhalfleft: 0x02BF,
21992 ringhalfleftarmenian: 0x0559,
21993 ringhalfleftbelowcmb: 0x031C,
21994 ringhalfleftcentered: 0x02D3,
21995 ringhalfright: 0x02BE,
21996 ringhalfrightbelowcmb: 0x0339,
21997 ringhalfrightcentered: 0x02D2,
21998 rinvertedbreve: 0x0213,
21999 rittorusquare: 0x3351,
22000 rlinebelow: 0x1E5F,
22002 rlonglegturned: 0x027A,
22003 rmonospace: 0xFF52,
22004 rohiragana: 0x308D,
22005 rokatakana: 0x30ED,
22006 rokatakanahalfwidth: 0xFF9B,
22009 rrabengali: 0x09DC,
22011 rragurmukhi: 0x0A5C,
22012 rreharabic: 0x0691,
22013 rrehfinalarabic: 0xFB8D,
22014 rrvocalicbengali: 0x09E0,
22015 rrvocalicdeva: 0x0960,
22016 rrvocalicgujarati: 0x0AE0,
22017 rrvocalicvowelsignbengali: 0x09C4,
22018 rrvocalicvowelsigndeva: 0x0944,
22019 rrvocalicvowelsigngujarati: 0x0AC4,
22023 rturnedsuperior: 0x02B4,
22024 ruhiragana: 0x308B,
22025 rukatakana: 0x30EB,
22026 rukatakanahalfwidth: 0xFF99,
22027 rupeemarkbengali: 0x09F2,
22028 rupeesignbengali: 0x09F3,
22031 rvocalicbengali: 0x098B,
22032 rvocalicdeva: 0x090B,
22033 rvocalicgujarati: 0x0A8B,
22034 rvocalicvowelsignbengali: 0x09C3,
22035 rvocalicvowelsigndeva: 0x0943,
22036 rvocalicvowelsigngujarati: 0x0AC3,
22040 sacutedotaccent: 0x1E65,
22043 sadfinalarabic: 0xFEBA,
22044 sadinitialarabic: 0xFEBB,
22045 sadmedialarabic: 0xFEBC,
22046 sagujarati: 0x0AB8,
22047 sagurmukhi: 0x0A38,
22048 sahiragana: 0x3055,
22049 sakatakana: 0x30B5,
22050 sakatakanahalfwidth: 0xFF7B,
22051 sallallahoualayhewasallamarabic: 0xFDFA,
22053 samekhdagesh: 0xFB41,
22054 samekhdageshhebrew: 0xFB41,
22055 samekhhebrew: 0x05E1,
22056 saraaathai: 0x0E32,
22057 saraaethai: 0x0E41,
22058 saraaimaimalaithai: 0x0E44,
22059 saraaimaimuanthai: 0x0E43,
22060 saraamthai: 0x0E33,
22063 saraiileftthai: 0xF886,
22064 saraiithai: 0x0E35,
22065 saraileftthai: 0xF885,
22068 saraueeleftthai: 0xF888,
22069 saraueethai: 0x0E37,
22070 saraueleftthai: 0xF887,
22071 sarauethai: 0x0E36,
22073 sarauuthai: 0x0E39,
22076 scarondotaccent: 0x1E67,
22079 schwacyrillic: 0x04D9,
22080 schwadieresiscyrillic: 0x04DB,
22083 scircumflex: 0x015D,
22084 scommaaccent: 0x0219,
22085 sdotaccent: 0x1E61,
22087 sdotbelowdotaccent: 0x1E69,
22088 seagullbelowcmb: 0x033C,
22090 secondtonechinese: 0x02CA,
22092 seenarabic: 0x0633,
22093 seenfinalarabic: 0xFEB2,
22094 seeninitialarabic: 0xFEB3,
22095 seenmedialarabic: 0xFEB4,
22100 segolhebrew: 0x05B6,
22101 segolnarrowhebrew: 0x05B6,
22102 segolquarterhebrew: 0x05B6,
22103 segoltahebrew: 0x0592,
22104 segolwidehebrew: 0x05B6,
22105 seharmenian: 0x057D,
22106 sehiragana: 0x305B,
22107 sekatakana: 0x30BB,
22108 sekatakanahalfwidth: 0xFF7E,
22110 semicolonarabic: 0x061B,
22111 semicolonmonospace: 0xFF1B,
22112 semicolonsmall: 0xFE54,
22113 semivoicedmarkkana: 0x309C,
22114 semivoicedmarkkanahalfwidth: 0xFF9F,
22115 sentisquare: 0x3322,
22116 sentosquare: 0x3323,
22118 sevenarabic: 0x0667,
22119 sevenbengali: 0x09ED,
22120 sevencircle: 0x2466,
22121 sevencircleinversesansserif: 0x2790,
22123 seveneighths: 0x215E,
22124 sevengujarati: 0x0AED,
22125 sevengurmukhi: 0x0A6D,
22126 sevenhackarabic: 0x0667,
22127 sevenhangzhou: 0x3027,
22128 sevenideographicparen: 0x3226,
22129 seveninferior: 0x2087,
22130 sevenmonospace: 0xFF17,
22131 sevenoldstyle: 0xF737,
22132 sevenparen: 0x247A,
22133 sevenperiod: 0x248E,
22134 sevenpersian: 0x06F7,
22135 sevenroman: 0x2176,
22136 sevensuperior: 0x2077,
22137 seventeencircle: 0x2470,
22138 seventeenparen: 0x2484,
22139 seventeenperiod: 0x2498,
22142 shaarmenian: 0x0577,
22143 shabengali: 0x09B6,
22144 shacyrillic: 0x0448,
22145 shaddaarabic: 0x0651,
22146 shaddadammaarabic: 0xFC61,
22147 shaddadammatanarabic: 0xFC5E,
22148 shaddafathaarabic: 0xFC60,
22149 shaddakasraarabic: 0xFC62,
22150 shaddakasratanarabic: 0xFC5F,
22153 shadelight: 0x2591,
22154 shademedium: 0x2592,
22156 shagujarati: 0x0AB6,
22157 shagurmukhi: 0x0A36,
22158 shalshelethebrew: 0x0593,
22159 shbopomofo: 0x3115,
22160 shchacyrillic: 0x0449,
22161 sheenarabic: 0x0634,
22162 sheenfinalarabic: 0xFEB6,
22163 sheeninitialarabic: 0xFEB7,
22164 sheenmedialarabic: 0xFEB8,
22165 sheicoptic: 0x03E3,
22167 sheqelhebrew: 0x20AA,
22173 shevahebrew: 0x05B0,
22174 shevanarrowhebrew: 0x05B0,
22175 shevaquarterhebrew: 0x05B0,
22176 shevawidehebrew: 0x05B0,
22177 shhacyrillic: 0x04BB,
22178 shimacoptic: 0x03ED,
22180 shindagesh: 0xFB49,
22181 shindageshhebrew: 0xFB49,
22182 shindageshshindot: 0xFB2C,
22183 shindageshshindothebrew: 0xFB2C,
22184 shindageshsindot: 0xFB2D,
22185 shindageshsindothebrew: 0xFB2D,
22186 shindothebrew: 0x05C1,
22187 shinhebrew: 0x05E9,
22188 shinshindot: 0xFB2A,
22189 shinshindothebrew: 0xFB2A,
22190 shinsindot: 0xFB2B,
22191 shinsindothebrew: 0xFB2B,
22195 sigmafinal: 0x03C2,
22196 sigmalunatesymbolgreek: 0x03F2,
22197 sihiragana: 0x3057,
22198 sikatakana: 0x30B7,
22199 sikatakanahalfwidth: 0xFF7C,
22200 siluqhebrew: 0x05BD,
22201 siluqlefthebrew: 0x05BD,
22203 sindothebrew: 0x05C2,
22204 siosacirclekorean: 0x3274,
22205 siosaparenkorean: 0x3214,
22206 sioscieuckorean: 0x317E,
22207 sioscirclekorean: 0x3266,
22208 sioskiyeokkorean: 0x317A,
22209 sioskorean: 0x3145,
22210 siosnieunkorean: 0x317B,
22211 siosparenkorean: 0x3206,
22212 siospieupkorean: 0x317D,
22213 siostikeutkorean: 0x317C,
22216 sixbengali: 0x09EC,
22218 sixcircleinversesansserif: 0x278F,
22220 sixgujarati: 0x0AEC,
22221 sixgurmukhi: 0x0A6C,
22222 sixhackarabic: 0x0666,
22223 sixhangzhou: 0x3026,
22224 sixideographicparen: 0x3225,
22225 sixinferior: 0x2086,
22226 sixmonospace: 0xFF16,
22227 sixoldstyle: 0xF736,
22230 sixpersian: 0x06F6,
22232 sixsuperior: 0x2076,
22233 sixteencircle: 0x246F,
22234 sixteencurrencydenominatorbengali: 0x09F9,
22235 sixteenparen: 0x2483,
22236 sixteenperiod: 0x2497,
22239 slashmonospace: 0xFF0F,
22241 slongdotaccent: 0x1E9B,
22243 smonospace: 0xFF53,
22244 sofpasuqhebrew: 0x05C3,
22245 softhyphen: 0x00AD,
22246 softsigncyrillic: 0x044C,
22247 sohiragana: 0x305D,
22248 sokatakana: 0x30BD,
22249 sokatakanahalfwidth: 0xFF7F,
22250 soliduslongoverlaycmb: 0x0338,
22251 solidusshortoverlaycmb: 0x0337,
22252 sorusithai: 0x0E29,
22253 sosalathai: 0x0E28,
22257 spacehackarabic: 0x0020,
22259 spadesuitblack: 0x2660,
22260 spadesuitwhite: 0x2664,
22262 squarebelowcmb: 0x033B,
22265 squarediagonalcrosshatchfill: 0x25A9,
22266 squarehorizontalfill: 0x25A4,
22269 squarekmcapital: 0x33CE,
22275 squaremsquared: 0x33A1,
22276 squareorthogonalcrosshatchfill: 0x25A6,
22277 squareupperlefttolowerrightfill: 0x25A7,
22278 squareupperrighttolowerleftfill: 0x25A8,
22279 squareverticalfill: 0x25A5,
22280 squarewhitewithsmallblack: 0x25A3,
22282 ssabengali: 0x09B7,
22284 ssagujarati: 0x0AB7,
22285 ssangcieuckorean: 0x3149,
22286 ssanghieuhkorean: 0x3185,
22287 ssangieungkorean: 0x3180,
22288 ssangkiyeokkorean: 0x3132,
22289 ssangnieunkorean: 0x3165,
22290 ssangpieupkorean: 0x3143,
22291 ssangsioskorean: 0x3146,
22292 ssangtikeutkorean: 0x3138,
22295 sterlingmonospace: 0xFFE1,
22296 strokelongoverlaycmb: 0x0336,
22297 strokeshortoverlaycmb: 0x0335,
22299 subsetnotequal: 0x228A,
22300 subsetorequal: 0x2286,
22303 suhiragana: 0x3059,
22304 sukatakana: 0x30B9,
22305 sukatakanahalfwidth: 0xFF7D,
22306 sukunarabic: 0x0652,
22310 supersetnotequal: 0x228B,
22311 supersetorequal: 0x2287,
22313 syouwaerasquare: 0x337C,
22319 tagujarati: 0x0AA4,
22320 tagurmukhi: 0x0A24,
22322 tahfinalarabic: 0xFEC2,
22323 tahinitialarabic: 0xFEC3,
22324 tahiragana: 0x305F,
22325 tahmedialarabic: 0xFEC4,
22326 taisyouerasquare: 0x337D,
22327 takatakana: 0x30BF,
22328 takatakanahalfwidth: 0xFF80,
22329 tatweelarabic: 0x0640,
22334 tavdageshhebrew: 0xFB4A,
22341 tcheharabic: 0x0686,
22342 tchehfinalarabic: 0xFB7B,
22343 tchehinitialarabic: 0xFB7C,
22344 tchehmedialarabic: 0xFB7D,
22346 tcircumflexbelow: 0x1E71,
22347 tcommaaccent: 0x0163,
22349 tdotaccent: 0x1E6B,
22351 tecyrillic: 0x0442,
22352 tedescendercyrillic: 0x04AD,
22354 tehfinalarabic: 0xFE96,
22355 tehhahinitialarabic: 0xFCA2,
22356 tehhahisolatedarabic: 0xFC0C,
22357 tehinitialarabic: 0xFE97,
22358 tehiragana: 0x3066,
22359 tehjeeminitialarabic: 0xFCA1,
22360 tehjeemisolatedarabic: 0xFC0B,
22361 tehmarbutaarabic: 0x0629,
22362 tehmarbutafinalarabic: 0xFE94,
22363 tehmedialarabic: 0xFE98,
22364 tehmeeminitialarabic: 0xFCA4,
22365 tehmeemisolatedarabic: 0xFC0E,
22366 tehnoonfinalarabic: 0xFC73,
22367 tekatakana: 0x30C6,
22368 tekatakanahalfwidth: 0xFF83,
22370 telephoneblack: 0x260E,
22371 telishagedolahebrew: 0x05A0,
22372 telishaqetanahebrew: 0x05A9,
22374 tenideographicparen: 0x3229,
22381 tetdageshhebrew: 0xFB38,
22383 tetsecyrillic: 0x04B5,
22384 tevirhebrew: 0x059B,
22385 tevirlefthebrew: 0x059B,
22386 thabengali: 0x09A5,
22388 thagujarati: 0x0AA5,
22389 thagurmukhi: 0x0A25,
22390 thalarabic: 0x0630,
22391 thalfinalarabic: 0xFEAC,
22392 thanthakhatlowleftthai: 0xF898,
22393 thanthakhatlowrightthai: 0xF897,
22394 thanthakhatthai: 0x0E4C,
22395 thanthakhatupperleftthai: 0xF896,
22396 theharabic: 0x062B,
22397 thehfinalarabic: 0xFE9A,
22398 thehinitialarabic: 0xFE9B,
22399 thehmedialarabic: 0xFE9C,
22400 thereexists: 0x2203,
22404 thetasymbolgreek: 0x03D1,
22405 thieuthacirclekorean: 0x3279,
22406 thieuthaparenkorean: 0x3219,
22407 thieuthcirclekorean: 0x326B,
22408 thieuthkorean: 0x314C,
22409 thieuthparenkorean: 0x320B,
22410 thirteencircle: 0x246C,
22411 thirteenparen: 0x2480,
22412 thirteenperiod: 0x2494,
22413 thonangmonthothai: 0x0E11,
22415 thophuthaothai: 0x0E12,
22417 thothahanthai: 0x0E17,
22418 thothanthai: 0x0E10,
22419 thothongthai: 0x0E18,
22420 thothungthai: 0x0E16,
22421 thousandcyrillic: 0x0482,
22422 thousandsseparatorarabic: 0x066C,
22423 thousandsseparatorpersian: 0x066C,
22425 threearabic: 0x0663,
22426 threebengali: 0x09E9,
22427 threecircle: 0x2462,
22428 threecircleinversesansserif: 0x278C,
22430 threeeighths: 0x215C,
22431 threegujarati: 0x0AE9,
22432 threegurmukhi: 0x0A69,
22433 threehackarabic: 0x0663,
22434 threehangzhou: 0x3023,
22435 threeideographicparen: 0x3222,
22436 threeinferior: 0x2083,
22437 threemonospace: 0xFF13,
22438 threenumeratorbengali: 0x09F6,
22439 threeoldstyle: 0xF733,
22440 threeparen: 0x2476,
22441 threeperiod: 0x248A,
22442 threepersian: 0x06F3,
22443 threequarters: 0x00BE,
22444 threequartersemdash: 0xF6DE,
22445 threeroman: 0x2172,
22446 threesuperior: 0x00B3,
22449 tihiragana: 0x3061,
22450 tikatakana: 0x30C1,
22451 tikatakanahalfwidth: 0xFF81,
22452 tikeutacirclekorean: 0x3270,
22453 tikeutaparenkorean: 0x3210,
22454 tikeutcirclekorean: 0x3262,
22455 tikeutkorean: 0x3137,
22456 tikeutparenkorean: 0x3202,
22458 tildebelowcmb: 0x0330,
22461 tildedoublecmb: 0x0360,
22462 tildeoperator: 0x223C,
22463 tildeoverlaycmb: 0x0334,
22464 tildeverticalcmb: 0x033E,
22465 timescircle: 0x2297,
22466 tipehahebrew: 0x0596,
22467 tipehalefthebrew: 0x0596,
22468 tippigurmukhi: 0x0A70,
22469 titlocyrilliccmb: 0x0483,
22470 tiwnarmenian: 0x057F,
22471 tlinebelow: 0x1E6F,
22472 tmonospace: 0xFF54,
22473 toarmenian: 0x0569,
22474 tohiragana: 0x3068,
22475 tokatakana: 0x30C8,
22476 tokatakanahalfwidth: 0xFF84,
22477 tonebarextrahighmod: 0x02E5,
22478 tonebarextralowmod: 0x02E9,
22479 tonebarhighmod: 0x02E6,
22480 tonebarlowmod: 0x02E8,
22481 tonebarmidmod: 0x02E7,
22487 topatakthai: 0x0E0F,
22488 tortoiseshellbracketleft: 0x3014,
22489 tortoiseshellbracketleftsmall: 0xFE5D,
22490 tortoiseshellbracketleftvertical: 0xFE39,
22491 tortoiseshellbracketright: 0x3015,
22492 tortoiseshellbracketrightsmall: 0xFE5E,
22493 tortoiseshellbracketrightvertical: 0xFE3A,
22495 tpalatalhook: 0x01AB,
22498 trademarksans: 0xF8EA,
22499 trademarkserif: 0xF6DB,
22500 tretroflexhook: 0x0288,
22507 tsadidagesh: 0xFB46,
22508 tsadidageshhebrew: 0xFB46,
22509 tsadihebrew: 0x05E6,
22510 tsecyrillic: 0x0446,
22515 tserehebrew: 0x05B5,
22516 tserenarrowhebrew: 0x05B5,
22517 tserequarterhebrew: 0x05B5,
22518 tserewidehebrew: 0x05B5,
22519 tshecyrillic: 0x045B,
22521 ttabengali: 0x099F,
22523 ttagujarati: 0x0A9F,
22524 ttagurmukhi: 0x0A1F,
22525 tteharabic: 0x0679,
22526 ttehfinalarabic: 0xFB67,
22527 ttehinitialarabic: 0xFB68,
22528 ttehmedialarabic: 0xFB69,
22529 tthabengali: 0x09A0,
22531 tthagujarati: 0x0AA0,
22532 tthagurmukhi: 0x0A20,
22534 tuhiragana: 0x3064,
22535 tukatakana: 0x30C4,
22536 tukatakanahalfwidth: 0xFF82,
22537 tusmallhiragana: 0x3063,
22538 tusmallkatakana: 0x30C3,
22539 tusmallkatakanahalfwidth: 0xFF6F,
22540 twelvecircle: 0x246B,
22541 twelveparen: 0x247F,
22542 twelveperiod: 0x2493,
22543 twelveroman: 0x217B,
22544 twentycircle: 0x2473,
22545 twentyhangzhou: 0x5344,
22546 twentyparen: 0x2487,
22547 twentyperiod: 0x249B,
22550 twobengali: 0x09E8,
22552 twocircleinversesansserif: 0x278B,
22554 twodotenleader: 0x2025,
22555 twodotleader: 0x2025,
22556 twodotleadervertical: 0xFE30,
22557 twogujarati: 0x0AE8,
22558 twogurmukhi: 0x0A68,
22559 twohackarabic: 0x0662,
22560 twohangzhou: 0x3022,
22561 twoideographicparen: 0x3221,
22562 twoinferior: 0x2082,
22563 twomonospace: 0xFF12,
22564 twonumeratorbengali: 0x09F5,
22565 twooldstyle: 0xF732,
22568 twopersian: 0x06F2,
22571 twosuperior: 0x00B2,
22582 ucircumflex: 0x00FB,
22583 ucircumflexbelow: 0x1E77,
22585 udattadeva: 0x0951,
22590 udieresisacute: 0x01D8,
22591 udieresisbelow: 0x1E73,
22592 udieresiscaron: 0x01DA,
22593 udieresiscyrillic: 0x04F1,
22594 udieresisgrave: 0x01DC,
22595 udieresismacron: 0x01D6,
22601 uhookabove: 0x1EE7,
22603 uhornacute: 0x1EE9,
22604 uhorndotbelow: 0x1EF1,
22605 uhorngrave: 0x1EEB,
22606 uhornhookabove: 0x1EED,
22607 uhorntilde: 0x1EEF,
22608 uhungarumlaut: 0x0171,
22609 uhungarumlautcyrillic: 0x04F3,
22610 uinvertedbreve: 0x0217,
22612 ukatakanahalfwidth: 0xFF73,
22613 ukcyrillic: 0x0479,
22616 umacroncyrillic: 0x04EF,
22617 umacrondieresis: 0x1E7B,
22618 umatragurmukhi: 0x0A41,
22619 umonospace: 0xFF55,
22620 underscore: 0x005F,
22621 underscoredbl: 0x2017,
22622 underscoremonospace: 0xFF3F,
22623 underscorevertical: 0xFE33,
22624 underscorewavy: 0xFE4F,
22630 upperdothebrew: 0x05C4,
22632 upsilondieresis: 0x03CB,
22633 upsilondieresistonos: 0x03B0,
22634 upsilonlatin: 0x028A,
22635 upsilontonos: 0x03CD,
22636 uptackbelowcmb: 0x031D,
22638 uragurmukhi: 0x0A73,
22640 ushortcyrillic: 0x045E,
22641 usmallhiragana: 0x3045,
22642 usmallkatakana: 0x30A5,
22643 usmallkatakanahalfwidth: 0xFF69,
22644 ustraightcyrillic: 0x04AF,
22645 ustraightstrokecyrillic: 0x04B1,
22647 utildeacute: 0x1E79,
22648 utildebelow: 0x1E75,
22651 uugujarati: 0x0A8A,
22652 uugurmukhi: 0x0A0A,
22653 uumatragurmukhi: 0x0A42,
22654 uuvowelsignbengali: 0x09C2,
22655 uuvowelsigndeva: 0x0942,
22656 uuvowelsigngujarati: 0x0AC2,
22657 uvowelsignbengali: 0x09C1,
22658 uvowelsigndeva: 0x0941,
22659 uvowelsigngujarati: 0x0AC1,
22662 vagujarati: 0x0AB5,
22663 vagurmukhi: 0x0A35,
22664 vakatakana: 0x30F7,
22667 vavdagesh65: 0xFB35,
22668 vavdageshhebrew: 0xFB35,
22671 vavholamhebrew: 0xFB4B,
22672 vavvavhebrew: 0x05F0,
22673 vavyodhebrew: 0x05F1,
22676 vecyrillic: 0x0432,
22678 vehfinalarabic: 0xFB6B,
22679 vehinitialarabic: 0xFB6C,
22680 vehmedialarabic: 0xFB6D,
22681 vekatakana: 0x30F9,
22683 verticalbar: 0x007C,
22684 verticallineabovecmb: 0x030D,
22685 verticallinebelowcmb: 0x0329,
22686 verticallinelowmod: 0x02CC,
22687 verticallinemod: 0x02C8,
22688 vewarmenian: 0x057E,
22690 vikatakana: 0x30F8,
22691 viramabengali: 0x09CD,
22692 viramadeva: 0x094D,
22693 viramagujarati: 0x0ACD,
22694 visargabengali: 0x0983,
22695 visargadeva: 0x0903,
22696 visargagujarati: 0x0A83,
22697 vmonospace: 0xFF56,
22698 voarmenian: 0x0578,
22699 voicediterationhiragana: 0x309E,
22700 voicediterationkatakana: 0x30FE,
22701 voicedmarkkana: 0x309B,
22702 voicedmarkkanahalfwidth: 0xFF9E,
22703 vokatakana: 0x30FA,
22707 vuhiragana: 0x3094,
22708 vukatakana: 0x30F4,
22712 wahiragana: 0x308F,
22713 wakatakana: 0x30EF,
22714 wakatakanahalfwidth: 0xFF9C,
22716 wasmallhiragana: 0x308E,
22717 wasmallkatakana: 0x30EE,
22718 wattosquare: 0x3357,
22720 wavyunderscorevertical: 0xFE34,
22722 wawfinalarabic: 0xFEEE,
22723 wawhamzaabovearabic: 0x0624,
22724 wawhamzaabovefinalarabic: 0xFE86,
22727 wcircumflex: 0x0175,
22729 wdotaccent: 0x1E87,
22731 wehiragana: 0x3091,
22732 weierstrass: 0x2118,
22733 wekatakana: 0x30F1,
22737 whitebullet: 0x25E6,
22738 whitecircle: 0x25CB,
22739 whitecircleinverse: 0x25D9,
22740 whitecornerbracketleft: 0x300E,
22741 whitecornerbracketleftvertical: 0xFE43,
22742 whitecornerbracketright: 0x300F,
22743 whitecornerbracketrightvertical: 0xFE44,
22744 whitediamond: 0x25C7,
22745 whitediamondcontainingblacksmalldiamond: 0x25C8,
22746 whitedownpointingsmalltriangle: 0x25BF,
22747 whitedownpointingtriangle: 0x25BD,
22748 whiteleftpointingsmalltriangle: 0x25C3,
22749 whiteleftpointingtriangle: 0x25C1,
22750 whitelenticularbracketleft: 0x3016,
22751 whitelenticularbracketright: 0x3017,
22752 whiterightpointingsmalltriangle: 0x25B9,
22753 whiterightpointingtriangle: 0x25B7,
22754 whitesmallsquare: 0x25AB,
22755 whitesmilingface: 0x263A,
22756 whitesquare: 0x25A1,
22758 whitetelephone: 0x260F,
22759 whitetortoiseshellbracketleft: 0x3018,
22760 whitetortoiseshellbracketright: 0x3019,
22761 whiteuppointingsmalltriangle: 0x25B5,
22762 whiteuppointingtriangle: 0x25B3,
22763 wihiragana: 0x3090,
22764 wikatakana: 0x30F0,
22766 wmonospace: 0xFF57,
22767 wohiragana: 0x3092,
22768 wokatakana: 0x30F2,
22769 wokatakanahalfwidth: 0xFF66,
22771 wonmonospace: 0xFFE6,
22772 wowaenthai: 0x0E27,
22783 xdotaccent: 0x1E8B,
22784 xeharmenian: 0x056D,
22786 xmonospace: 0xFF58,
22790 yaadosquare: 0x334E,
22795 yagujarati: 0x0AAF,
22796 yagurmukhi: 0x0A2F,
22797 yahiragana: 0x3084,
22798 yakatakana: 0x30E4,
22799 yakatakanahalfwidth: 0xFF94,
22801 yamakkanthai: 0x0E4E,
22802 yasmallhiragana: 0x3083,
22803 yasmallkatakana: 0x30E3,
22804 yasmallkatakanahalfwidth: 0xFF6C,
22805 yatcyrillic: 0x0463,
22807 ycircumflex: 0x0177,
22809 ydotaccent: 0x1E8F,
22812 yehbarreearabic: 0x06D2,
22813 yehbarreefinalarabic: 0xFBAF,
22814 yehfinalarabic: 0xFEF2,
22815 yehhamzaabovearabic: 0x0626,
22816 yehhamzaabovefinalarabic: 0xFE8A,
22817 yehhamzaaboveinitialarabic: 0xFE8B,
22818 yehhamzaabovemedialarabic: 0xFE8C,
22819 yehinitialarabic: 0xFEF3,
22820 yehmedialarabic: 0xFEF4,
22821 yehmeeminitialarabic: 0xFCDD,
22822 yehmeemisolatedarabic: 0xFC58,
22823 yehnoonfinalarabic: 0xFC94,
22824 yehthreedotsbelowarabic: 0x06D1,
22827 yenmonospace: 0xFFE5,
22829 yeorinhieuhkorean: 0x3186,
22830 yerahbenyomohebrew: 0x05AA,
22831 yerahbenyomolefthebrew: 0x05AA,
22832 yericyrillic: 0x044B,
22833 yerudieresiscyrillic: 0x04F9,
22834 yesieungkorean: 0x3181,
22835 yesieungpansioskorean: 0x3183,
22836 yesieungsioskorean: 0x3182,
22837 yetivhebrew: 0x059A,
22840 yhookabove: 0x1EF7,
22841 yiarmenian: 0x0575,
22842 yicyrillic: 0x0457,
22845 yiwnarmenian: 0x0582,
22846 ymonospace: 0xFF59,
22849 yoddageshhebrew: 0xFB39,
22851 yodyodhebrew: 0x05F2,
22852 yodyodpatahhebrew: 0xFB1F,
22853 yohiragana: 0x3088,
22855 yokatakana: 0x30E8,
22856 yokatakanahalfwidth: 0xFF96,
22858 yosmallhiragana: 0x3087,
22859 yosmallkatakana: 0x30E7,
22860 yosmallkatakanahalfwidth: 0xFF6E,
22862 yoyaekorean: 0x3188,
22863 yoyakorean: 0x3187,
22865 yoyingthai: 0x0E0D,
22867 ypogegrammeni: 0x037A,
22868 ypogegrammenigreekcmb: 0x0345,
22874 yuhiragana: 0x3086,
22876 yukatakana: 0x30E6,
22877 yukatakanahalfwidth: 0xFF95,
22879 yusbigcyrillic: 0x046B,
22880 yusbigiotifiedcyrillic: 0x046D,
22881 yuslittlecyrillic: 0x0467,
22882 yuslittleiotifiedcyrillic: 0x0469,
22883 yusmallhiragana: 0x3085,
22884 yusmallkatakana: 0x30E5,
22885 yusmallkatakanahalfwidth: 0xFF6D,
22886 yuyekorean: 0x318B,
22887 yuyeokorean: 0x318A,
22888 yyabengali: 0x09DF,
22891 zaarmenian: 0x0566,
22894 zagurmukhi: 0x0A5B,
22896 zahfinalarabic: 0xFEC6,
22897 zahinitialarabic: 0xFEC7,
22898 zahiragana: 0x3056,
22899 zahmedialarabic: 0xFEC8,
22900 zainarabic: 0x0632,
22901 zainfinalarabic: 0xFEB0,
22902 zakatakana: 0x30B6,
22903 zaqefgadolhebrew: 0x0595,
22904 zaqefqatanhebrew: 0x0594,
22905 zarqahebrew: 0x0598,
22907 zayindagesh: 0xFB36,
22908 zayindageshhebrew: 0xFB36,
22909 zayinhebrew: 0x05D6,
22913 zcircumflex: 0x1E91,
22916 zdotaccent: 0x017C,
22918 zecyrillic: 0x0437,
22919 zedescendercyrillic: 0x0499,
22920 zedieresiscyrillic: 0x04DF,
22921 zehiragana: 0x305C,
22922 zekatakana: 0x30BC,
22924 zeroarabic: 0x0660,
22925 zerobengali: 0x09E6,
22927 zerogujarati: 0x0AE6,
22928 zerogurmukhi: 0x0A66,
22929 zerohackarabic: 0x0660,
22930 zeroinferior: 0x2080,
22931 zeromonospace: 0xFF10,
22932 zerooldstyle: 0xF730,
22933 zeropersian: 0x06F0,
22934 zerosuperior: 0x2070,
22936 zerowidthjoiner: 0xFEFF,
22937 zerowidthnonjoiner: 0x200C,
22938 zerowidthspace: 0x200B,
22940 zhbopomofo: 0x3113,
22941 zhearmenian: 0x056A,
22942 zhebrevecyrillic: 0x04C2,
22943 zhecyrillic: 0x0436,
22944 zhedescendercyrillic: 0x0497,
22945 zhedieresiscyrillic: 0x04DD,
22946 zihiragana: 0x3058,
22947 zikatakana: 0x30B8,
22948 zinorhebrew: 0x05AE,
22949 zlinebelow: 0x1E95,
22950 zmonospace: 0xFF5A,
22951 zohiragana: 0x305E,
22952 zokatakana: 0x30BE,
22954 zretroflexhook: 0x0290,
22956 zuhiragana: 0x305A,
22957 zukatakana: 0x30BA,
22962 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
22963 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
22967 var PDFImage = (function PDFImageClosure() {
22969 * Decode the image in the main thread if it supported. Resovles the promise
22970 * when the image data is ready.
22972 function handleImageData(handler, xref, res, image, promise) {
22973 if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
22974 // For natively supported jpegs send them to the main thread for decoding.
22975 var dict = image.dict;
22976 var colorSpace = dict.get('ColorSpace', 'CS');
22977 colorSpace = ColorSpace.parse(colorSpace, xref, res);
22978 var numComps = colorSpace.numComps;
22979 handler.send('JpegDecode', [image.getIR(), numComps], function(message) {
22980 var data = message.data;
22981 var stream = new Stream(data, 0, data.length, image.dict);
22982 promise.resolve(stream);
22985 promise.resolve(image);
22989 * Decode and clamp a value. The formula is different from the spec because we
22990 * don't decode to float range [0,1], we decode it in the [0,max] range.
22992 function decodeAndClamp(value, addend, coefficient, max) {
22993 value = addend + value * coefficient;
22994 // Clamp the value to the range
22995 return value < 0 ? 0 : value > max ? max : value;
22997 function PDFImage(xref, res, image, inline, smask) {
22998 this.image = image;
22999 if (image.getParams) {
23000 // JPX/JPEG2000 streams directly contain bits per component
23001 // and color space mode information.
23002 TODO('get params from actual stream');
23004 // var colorspace = ...
23006 // TODO cache rendered images?
23008 var dict = image.dict;
23009 this.width = dict.get('Width', 'W');
23010 this.height = dict.get('Height', 'H');
23012 if (this.width < 1 || this.height < 1)
23013 error('Invalid image width: ' + this.width + ' or height: ' +
23016 this.interpolate = dict.get('Interpolate', 'I') || false;
23017 this.imageMask = dict.get('ImageMask', 'IM') || false;
23019 var bitsPerComponent = image.bitsPerComponent;
23020 if (!bitsPerComponent) {
23021 bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
23022 if (!bitsPerComponent) {
23023 if (this.imageMask)
23024 bitsPerComponent = 1;
23026 error('Bits per component missing in image: ' + this.imageMask);
23029 this.bpc = bitsPerComponent;
23031 if (!this.imageMask) {
23032 var colorSpace = dict.get('ColorSpace', 'CS');
23034 TODO('JPX images (which don"t require color spaces');
23035 colorSpace = new Name('DeviceRGB');
23037 this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
23038 this.numComps = this.colorSpace.numComps;
23041 this.decode = dict.get('Decode', 'D');
23042 this.needsDecode = false;
23043 if (this.decode && this.colorSpace &&
23044 !this.colorSpace.isDefaultDecode(this.decode)) {
23045 this.needsDecode = true;
23046 // Do some preprocessing to avoid more math.
23047 var max = (1 << bitsPerComponent) - 1;
23048 this.decodeCoefficients = [];
23049 this.decodeAddends = [];
23050 for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
23051 var dmin = this.decode[i];
23052 var dmax = this.decode[i + 1];
23053 this.decodeCoefficients[j] = dmax - dmin;
23054 this.decodeAddends[j] = max * dmin;
23058 var mask = dict.get('Mask');
23061 TODO('masked images');
23062 } else if (smask) {
23063 this.smask = new PDFImage(xref, res, smask, false);
23067 * Handles processing of image data and calls the callback with an argument
23068 * of a PDFImage when the image is ready to be used.
23070 PDFImage.buildImage = function PDFImage_buildImage(callback, handler, xref,
23071 res, image, inline) {
23072 var imageDataPromise = new Promise();
23073 var smaskPromise = new Promise();
23074 // The image data and smask data may not be ready yet, wait till both are
23076 Promise.all([imageDataPromise, smaskPromise]).then(function(results) {
23077 var imageData = results[0], smaskData = results[1];
23078 var image = new PDFImage(xref, res, imageData, inline, smaskData);
23082 handleImageData(handler, xref, res, image, imageDataPromise);
23084 var smask = image.dict.get('SMask');
23086 handleImageData(handler, xref, res, smask, smaskPromise);
23088 smaskPromise.resolve(null);
23092 * Resize an image using the nearest neighbor algorithm. Currently only
23093 * supports one and three component images.
23094 * @param {TypedArray} pixels The original image with one component.
23095 * @param {Number} bpc Number of bits per component.
23096 * @param {Number} components Number of color components, 1 or 3 is supported.
23097 * @param {Number} w1 Original width.
23098 * @param {Number} h1 Original height.
23099 * @param {Number} w2 New width.
23100 * @param {Number} h2 New height.
23101 * @return {TypedArray} Resized image data.
23103 PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
23105 var length = w2 * h2 * components;
23106 var temp = bpc <= 8 ? new Uint8Array(length) :
23107 bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
23108 var xRatio = w1 / w2;
23109 var yRatio = h1 / h2;
23110 var px, py, newIndex, oldIndex;
23111 for (var i = 0; i < h2; i++) {
23112 for (var j = 0; j < w2; j++) {
23113 px = Math.floor(j * xRatio);
23114 py = Math.floor(i * yRatio);
23115 newIndex = (i * w2) + j;
23116 oldIndex = ((py * w1) + px);
23117 if (components === 1) {
23118 temp[newIndex] = pixels[oldIndex];
23119 } else if (components === 3) {
23122 temp[newIndex] = pixels[oldIndex];
23123 temp[newIndex + 1] = pixels[oldIndex + 1];
23124 temp[newIndex + 2] = pixels[oldIndex + 2];
23131 PDFImage.prototype = {
23135 return Math.max(this.width, this.smask.width);
23139 return this.height;
23140 return Math.max(this.height, this.smask.height);
23142 getComponents: function PDFImage_getComponents(buffer) {
23143 var bpc = this.bpc;
23144 var needsDecode = this.needsDecode;
23145 var decodeMap = this.decode;
23147 // This image doesn't require any extra work.
23148 if (bpc == 8 && !needsDecode)
23151 var bufferLength = buffer.length;
23152 var width = this.width;
23153 var height = this.height;
23154 var numComps = this.numComps;
23156 var length = width * height * numComps;
23158 var output = bpc <= 8 ? new Uint8Array(length) :
23159 bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
23160 var rowComps = width * numComps;
23161 var decodeAddends, decodeCoefficients;
23163 decodeAddends = this.decodeAddends;
23164 decodeCoefficients = this.decodeCoefficients;
23166 var max = (1 << bpc) - 1;
23169 // Optimization for reading 8 bpc images that have a decode.
23170 for (var i = 0, ii = length; i < ii; ++i) {
23171 var compIndex = i % numComps;
23172 var value = buffer[i];
23173 value = decodeAndClamp(value, decodeAddends[compIndex],
23174 decodeCoefficients[compIndex], max);
23177 } else if (bpc == 1) {
23178 // Optimization for reading 1 bpc images.
23179 var valueZero = 0, valueOne = 1;
23181 valueZero = decodeMap[0] ? 1 : 0;
23182 valueOne = decodeMap[1] ? 1 : 0;
23187 for (var i = 0, ii = length; i < ii; ++i) {
23188 if (i % rowComps == 0) {
23196 buf = buffer[bufferPos++];
23200 output[i] = !(buf & mask) ? valueZero : valueOne;
23203 // The general case that handles all other bpc values.
23204 var bits = 0, buf = 0;
23205 for (var i = 0, ii = length; i < ii; ++i) {
23206 if (i % rowComps == 0) {
23211 while (bits < bpc) {
23212 buf = (buf << 8) | buffer[bufferPos++];
23216 var remainingBits = bits - bpc;
23217 var value = buf >> remainingBits;
23219 var compIndex = i % numComps;
23220 value = decodeAndClamp(value, decodeAddends[compIndex],
23221 decodeCoefficients[compIndex], max);
23224 buf = buf & ((1 << remainingBits) - 1);
23225 bits = remainingBits;
23230 getOpacity: function PDFImage_getOpacity(width, height) {
23231 var smask = this.smask;
23232 var originalWidth = this.width;
23233 var originalHeight = this.height;
23237 var sw = smask.width;
23238 var sh = smask.height;
23239 buf = new Uint8Array(sw * sh);
23240 smask.fillGrayBuffer(buf);
23241 if (sw != width || sh != height)
23242 buf = PDFImage.resize(buf, smask.bps, 1, sw, sh, width, height);
23244 buf = new Uint8Array(width * height);
23245 for (var i = 0, ii = width * height; i < ii; ++i)
23250 applyStencilMask: function PDFImage_applyStencilMask(buffer,
23252 var width = this.width, height = this.height;
23253 var bitStrideLength = (width + 7) >> 3;
23254 var imgArray = this.getImageBytes(bitStrideLength * height);
23255 var imgArrayPos = 0;
23256 var i, j, mask, buf;
23257 // removing making non-masked pixels transparent
23258 var bufferPos = 3; // alpha component offset
23259 for (i = 0; i < height; i++) {
23261 for (j = 0; j < width; j++) {
23263 buf = imgArray[imgArrayPos++];
23266 if (!(buf & mask) == inverseDecode) {
23267 buffer[bufferPos] = 0;
23274 fillRgbaBuffer: function PDFImage_fillRgbaBuffer(buffer, width, height) {
23275 var numComps = this.numComps;
23276 var originalWidth = this.width;
23277 var originalHeight = this.height;
23278 var bpc = this.bpc;
23280 // rows start at byte boundary;
23281 var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
23282 var imgArray = this.getImageBytes(originalHeight * rowBytes);
23284 var comps = this.colorSpace.getRgbBuffer(
23285 this.getComponents(imgArray), bpc);
23286 if (originalWidth != width || originalHeight != height)
23287 comps = PDFImage.resize(comps, this.bpc, 3, originalWidth,
23288 originalHeight, width, height);
23290 var opacity = this.getOpacity(width, height);
23291 var opacityPos = 0;
23292 var length = width * height * 4;
23294 for (var i = 0; i < length; i += 4) {
23295 buffer[i] = comps[compsPos++];
23296 buffer[i + 1] = comps[compsPos++];
23297 buffer[i + 2] = comps[compsPos++];
23298 buffer[i + 3] = opacity[opacityPos++];
23301 fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
23302 var numComps = this.numComps;
23304 error('Reading gray scale from a color image: ' + numComps);
23306 var width = this.width;
23307 var height = this.height;
23308 var bpc = this.bpc;
23310 // rows start at byte boundary;
23311 var rowBytes = (width * numComps * bpc + 7) >> 3;
23312 var imgArray = this.getImageBytes(height * rowBytes);
23314 var comps = this.getComponents(imgArray);
23315 var length = width * height;
23316 // we aren't using a colorspace so we need to scale the value
23317 var scale = 255 / ((1 << bpc) - 1);
23318 for (var i = 0; i < length; ++i)
23319 buffer[i] = (scale * comps[i]) | 0;
23321 getImageBytes: function PDFImage_getImageBytes(length) {
23322 this.image.reset();
23323 return this.image.getBytes(length);
23329 function loadJpegStream(id, imageData, objs) {
23330 var img = new Image();
23331 img.onload = (function loadJpegStream_onloadClosure() {
23332 objs.resolve(id, img);
23334 img.src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
23338 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
23339 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
23343 // The Metrics object contains glyph widths (in glyph space units).
23344 // As per PDF spec, for most fonts (Type 3 being an exception) a glyph
23345 // space unit corresponds to 1/1000th of text space unit.
23348 'Courier-Bold': 600,
23349 'Courier-BoldOblique': 600,
23350 'Courier-Oblique': 600,
23411 'bracketleft': 278,
23413 'bracketright': 278,
23414 'asciicircum': 469,
23455 'quotesingle': 191,
23456 'quotedblleft': 333,
23457 'guillemotleft': 556,
23458 'guilsinglleft': 333,
23459 'guilsinglright': 333,
23465 'periodcentered': 278,
23468 'quotesinglbase': 222,
23469 'quotedblbase': 333,
23470 'quotedblright': 333,
23471 'guillemotright': 556,
23473 'perthousand': 1000,
23474 'questiondown': 611,
23485 'hungarumlaut': 333,
23490 'ordfeminine': 370,
23494 'ordmasculine': 365,
23504 'uhungarumlaut': 556,
23509 'Acircumflex': 667,
23511 'Ucircumflex': 722,
23513 'scommaaccent': 500,
23514 'ecircumflex': 556,
23522 'commaaccent': 250,
23527 'Ncommaaccent': 722,
23530 'Tcommaaccent': 611,
23539 'Gcommaaccent': 778,
23540 'ucircumflex': 556,
23541 'acircumflex': 556,
23553 'threesuperior': 333,
23560 'partialdiff': 476,
23563 'icircumflex': 278,
23564 'Ecircumflex': 667,
23583 'greaterequal': 549,
23586 'lcommaaccent': 222,
23600 'Ocircumflex': 778,
23604 'twosuperior': 333,
23608 'ohungarumlaut': 556,
23611 'threequarters': 834,
23614 'Kcommaaccent': 667,
23623 'ocircumflex': 556,
23625 'Uhungarumlaut': 722,
23631 'Scommaaccent': 667,
23632 'Ohungarumlaut': 778,
23639 'rcommaaccent': 333,
23642 'Rcommaaccent': 722,
23643 'Lcommaaccent': 556,
23651 'kcommaaccent': 500,
23653 'Icircumflex': 278,
23655 'tcommaaccent': 278,
23660 'gcommaaccent': 556,
23663 'ncommaaccent': 556,
23664 'onesuperior': 333,
23668 'Helvetica-Bold': {
23728 'bracketleft': 333,
23730 'bracketright': 333,
23731 'asciicircum': 584,
23772 'quotesingle': 238,
23773 'quotedblleft': 500,
23774 'guillemotleft': 556,
23775 'guilsinglleft': 333,
23776 'guilsinglright': 333,
23782 'periodcentered': 278,
23785 'quotesinglbase': 278,
23786 'quotedblbase': 500,
23787 'quotedblright': 500,
23788 'guillemotright': 556,
23790 'perthousand': 1000,
23791 'questiondown': 611,
23802 'hungarumlaut': 333,
23807 'ordfeminine': 370,
23811 'ordmasculine': 365,
23821 'uhungarumlaut': 611,
23826 'Acircumflex': 722,
23828 'Ucircumflex': 722,
23830 'scommaaccent': 556,
23831 'ecircumflex': 556,
23839 'commaaccent': 250,
23844 'Ncommaaccent': 722,
23847 'Tcommaaccent': 611,
23856 'Gcommaaccent': 778,
23857 'ucircumflex': 611,
23858 'acircumflex': 556,
23870 'threesuperior': 333,
23877 'partialdiff': 494,
23880 'icircumflex': 278,
23881 'Ecircumflex': 667,
23900 'greaterequal': 549,
23903 'lcommaaccent': 278,
23917 'Ocircumflex': 778,
23921 'twosuperior': 333,
23925 'ohungarumlaut': 611,
23928 'threequarters': 834,
23931 'Kcommaaccent': 722,
23940 'ocircumflex': 611,
23942 'Uhungarumlaut': 722,
23948 'Scommaaccent': 667,
23949 'Ohungarumlaut': 778,
23956 'rcommaaccent': 389,
23959 'Rcommaaccent': 722,
23960 'Lcommaaccent': 611,
23968 'kcommaaccent': 556,
23970 'Icircumflex': 278,
23972 'tcommaaccent': 333,
23977 'gcommaaccent': 611,
23980 'ncommaaccent': 611,
23981 'onesuperior': 333,
23985 'Helvetica-BoldOblique': {
24045 'bracketleft': 333,
24047 'bracketright': 333,
24048 'asciicircum': 584,
24089 'quotesingle': 238,
24090 'quotedblleft': 500,
24091 'guillemotleft': 556,
24092 'guilsinglleft': 333,
24093 'guilsinglright': 333,
24099 'periodcentered': 278,
24102 'quotesinglbase': 278,
24103 'quotedblbase': 500,
24104 'quotedblright': 500,
24105 'guillemotright': 556,
24107 'perthousand': 1000,
24108 'questiondown': 611,
24119 'hungarumlaut': 333,
24124 'ordfeminine': 370,
24128 'ordmasculine': 365,
24138 'uhungarumlaut': 611,
24143 'Acircumflex': 722,
24145 'Ucircumflex': 722,
24147 'scommaaccent': 556,
24148 'ecircumflex': 556,
24156 'commaaccent': 250,
24161 'Ncommaaccent': 722,
24164 'Tcommaaccent': 611,
24173 'Gcommaaccent': 778,
24174 'ucircumflex': 611,
24175 'acircumflex': 556,
24187 'threesuperior': 333,
24194 'partialdiff': 494,
24197 'icircumflex': 278,
24198 'Ecircumflex': 667,
24217 'greaterequal': 549,
24220 'lcommaaccent': 278,
24234 'Ocircumflex': 778,
24238 'twosuperior': 333,
24242 'ohungarumlaut': 611,
24245 'threequarters': 834,
24248 'Kcommaaccent': 722,
24257 'ocircumflex': 611,
24259 'Uhungarumlaut': 722,
24265 'Scommaaccent': 667,
24266 'Ohungarumlaut': 778,
24273 'rcommaaccent': 389,
24276 'Rcommaaccent': 722,
24277 'Lcommaaccent': 611,
24285 'kcommaaccent': 556,
24287 'Icircumflex': 278,
24289 'tcommaaccent': 333,
24294 'gcommaaccent': 611,
24297 'ncommaaccent': 611,
24298 'onesuperior': 333,
24302 'Helvetica-Oblique' : {
24362 'bracketleft': 278,
24364 'bracketright': 278,
24365 'asciicircum': 469,
24406 'quotesingle': 191,
24407 'quotedblleft': 333,
24408 'guillemotleft': 556,
24409 'guilsinglleft': 333,
24410 'guilsinglright': 333,
24416 'periodcentered': 278,
24419 'quotesinglbase': 222,
24420 'quotedblbase': 333,
24421 'quotedblright': 333,
24422 'guillemotright': 556,
24424 'perthousand': 1000,
24425 'questiondown': 611,
24436 'hungarumlaut': 333,
24441 'ordfeminine': 370,
24445 'ordmasculine': 365,
24455 'uhungarumlaut': 556,
24460 'Acircumflex': 667,
24462 'Ucircumflex': 722,
24464 'scommaaccent': 500,
24465 'ecircumflex': 556,
24473 'commaaccent': 250,
24478 'Ncommaaccent': 722,
24481 'Tcommaaccent': 611,
24490 'Gcommaaccent': 778,
24491 'ucircumflex': 556,
24492 'acircumflex': 556,
24504 'threesuperior': 333,
24511 'partialdiff': 476,
24514 'icircumflex': 278,
24515 'Ecircumflex': 667,
24534 'greaterequal': 549,
24537 'lcommaaccent': 222,
24551 'Ocircumflex': 778,
24555 'twosuperior': 333,
24559 'ohungarumlaut': 556,
24562 'threequarters': 834,
24565 'Kcommaaccent': 667,
24574 'ocircumflex': 556,
24576 'Uhungarumlaut': 722,
24582 'Scommaaccent': 667,
24583 'Ohungarumlaut': 778,
24590 'rcommaaccent': 333,
24593 'Rcommaaccent': 722,
24594 'Lcommaaccent': 556,
24602 'kcommaaccent': 500,
24604 'Icircumflex': 278,
24606 'tcommaaccent': 278,
24611 'gcommaaccent': 556,
24614 'ncommaaccent': 556,
24615 'onesuperior': 333,
24624 'existential': 549,
24630 'asteriskmath': 500,
24679 'bracketleft': 333,
24681 'bracketright': 333,
24682 'perpendicular': 658,
24734 'greaterequal': 549,
24736 'proportional': 713,
24737 'partialdiff': 494,
24741 'equivalence': 549,
24742 'approxequal': 549,
24744 'arrowvertex': 603,
24745 'arrowhorizex': 1000,
24746 'carriagereturn': 658,
24750 'weierstrass': 987,
24751 'circlemultiply': 768,
24754 'intersection': 768,
24756 'propersuperset': 713,
24757 'reflexsuperset': 713,
24759 'propersubset': 713,
24760 'reflexsubset': 713,
24765 'registerserif': 790,
24766 'copyrightserif': 790,
24767 'trademarkserif': 890,
24774 'arrowdblboth': 1042,
24775 'arrowdblleft': 987,
24777 'arrowdblright': 987,
24778 'arrowdbldown': 603,
24781 'registersans': 790,
24782 'copyrightsans': 790,
24783 'trademarksans': 786,
24785 'parenlefttp': 384,
24786 'parenleftex': 384,
24787 'parenleftbt': 384,
24788 'bracketlefttp': 384,
24789 'bracketleftex': 384,
24790 'bracketleftbt': 384,
24791 'bracelefttp': 494,
24792 'braceleftmid': 494,
24793 'braceleftbt': 494,
24800 'parenrighttp': 384,
24801 'parenrightex': 384,
24802 'parenrightbt': 384,
24803 'bracketrighttp': 384,
24804 'bracketrightex': 384,
24805 'bracketrightbt': 384,
24806 'bracerighttp': 494,
24807 'bracerightmid': 494,
24808 'bracerightbt': 494,
24871 'bracketleft': 333,
24873 'bracketright': 333,
24874 'asciicircum': 469,
24915 'quotesingle': 180,
24916 'quotedblleft': 444,
24917 'guillemotleft': 500,
24918 'guilsinglleft': 333,
24919 'guilsinglright': 333,
24925 'periodcentered': 250,
24928 'quotesinglbase': 333,
24929 'quotedblbase': 444,
24930 'quotedblright': 444,
24931 'guillemotright': 500,
24933 'perthousand': 1000,
24934 'questiondown': 444,
24945 'hungarumlaut': 333,
24950 'ordfeminine': 276,
24954 'ordmasculine': 310,
24964 'uhungarumlaut': 500,
24969 'Acircumflex': 722,
24971 'Ucircumflex': 722,
24973 'scommaaccent': 389,
24974 'ecircumflex': 444,
24982 'commaaccent': 250,
24987 'Ncommaaccent': 722,
24990 'Tcommaaccent': 611,
24999 'Gcommaaccent': 722,
25000 'ucircumflex': 500,
25001 'acircumflex': 444,
25013 'threesuperior': 300,
25020 'partialdiff': 476,
25023 'icircumflex': 278,
25024 'Ecircumflex': 611,
25043 'greaterequal': 549,
25046 'lcommaaccent': 278,
25060 'Ocircumflex': 722,
25064 'twosuperior': 300,
25068 'ohungarumlaut': 500,
25071 'threequarters': 750,
25074 'Kcommaaccent': 722,
25083 'ocircumflex': 500,
25085 'Uhungarumlaut': 722,
25091 'Scommaaccent': 556,
25092 'Ohungarumlaut': 722,
25099 'rcommaaccent': 333,
25102 'Rcommaaccent': 667,
25103 'Lcommaaccent': 611,
25111 'kcommaaccent': 500,
25113 'Icircumflex': 333,
25115 'tcommaaccent': 278,
25120 'gcommaaccent': 500,
25123 'ncommaaccent': 500,
25124 'onesuperior': 300,
25188 'bracketleft': 333,
25190 'bracketright': 333,
25191 'asciicircum': 581,
25232 'quotesingle': 278,
25233 'quotedblleft': 500,
25234 'guillemotleft': 500,
25235 'guilsinglleft': 333,
25236 'guilsinglright': 333,
25242 'periodcentered': 250,
25245 'quotesinglbase': 333,
25246 'quotedblbase': 500,
25247 'quotedblright': 500,
25248 'guillemotright': 500,
25250 'perthousand': 1000,
25251 'questiondown': 500,
25262 'hungarumlaut': 333,
25267 'ordfeminine': 300,
25271 'ordmasculine': 330,
25281 'uhungarumlaut': 556,
25286 'Acircumflex': 722,
25288 'Ucircumflex': 722,
25290 'scommaaccent': 389,
25291 'ecircumflex': 444,
25299 'commaaccent': 250,
25304 'Ncommaaccent': 722,
25307 'Tcommaaccent': 667,
25316 'Gcommaaccent': 778,
25317 'ucircumflex': 556,
25318 'acircumflex': 500,
25330 'threesuperior': 300,
25337 'partialdiff': 494,
25340 'icircumflex': 278,
25341 'Ecircumflex': 667,
25360 'greaterequal': 549,
25363 'lcommaaccent': 278,
25377 'Ocircumflex': 778,
25381 'twosuperior': 300,
25385 'ohungarumlaut': 500,
25388 'threequarters': 750,
25391 'Kcommaaccent': 778,
25400 'ocircumflex': 500,
25402 'Uhungarumlaut': 722,
25408 'Scommaaccent': 556,
25409 'Ohungarumlaut': 778,
25416 'rcommaaccent': 444,
25419 'Rcommaaccent': 722,
25420 'Lcommaaccent': 667,
25428 'kcommaaccent': 556,
25430 'Icircumflex': 389,
25432 'tcommaaccent': 333,
25437 'gcommaaccent': 500,
25440 'ncommaaccent': 556,
25441 'onesuperior': 300,
25445 'Times-BoldItalic': {
25505 'bracketleft': 333,
25507 'bracketright': 333,
25508 'asciicircum': 570,
25549 'quotesingle': 278,
25550 'quotedblleft': 500,
25551 'guillemotleft': 500,
25552 'guilsinglleft': 333,
25553 'guilsinglright': 333,
25559 'periodcentered': 250,
25562 'quotesinglbase': 333,
25563 'quotedblbase': 500,
25564 'quotedblright': 500,
25565 'guillemotright': 500,
25567 'perthousand': 1000,
25568 'questiondown': 500,
25579 'hungarumlaut': 333,
25584 'ordfeminine': 266,
25588 'ordmasculine': 300,
25598 'uhungarumlaut': 556,
25603 'Acircumflex': 667,
25605 'Ucircumflex': 722,
25607 'scommaaccent': 389,
25608 'ecircumflex': 444,
25616 'commaaccent': 250,
25621 'Ncommaaccent': 722,
25624 'Tcommaaccent': 611,
25633 'Gcommaaccent': 722,
25634 'ucircumflex': 556,
25635 'acircumflex': 500,
25647 'threesuperior': 300,
25654 'partialdiff': 494,
25657 'icircumflex': 278,
25658 'Ecircumflex': 667,
25677 'greaterequal': 549,
25680 'lcommaaccent': 278,
25694 'Ocircumflex': 722,
25698 'twosuperior': 300,
25702 'ohungarumlaut': 500,
25705 'threequarters': 750,
25708 'Kcommaaccent': 667,
25717 'ocircumflex': 500,
25719 'Uhungarumlaut': 722,
25725 'Scommaaccent': 556,
25726 'Ohungarumlaut': 722,
25733 'rcommaaccent': 389,
25736 'Rcommaaccent': 667,
25737 'Lcommaaccent': 611,
25745 'kcommaaccent': 500,
25747 'Icircumflex': 389,
25749 'tcommaaccent': 278,
25754 'gcommaaccent': 500,
25757 'ncommaaccent': 556,
25758 'onesuperior': 300,
25822 'bracketleft': 389,
25824 'bracketright': 389,
25825 'asciicircum': 422,
25866 'quotesingle': 214,
25867 'quotedblleft': 556,
25868 'guillemotleft': 500,
25869 'guilsinglleft': 333,
25870 'guilsinglright': 333,
25876 'periodcentered': 250,
25879 'quotesinglbase': 333,
25880 'quotedblbase': 556,
25881 'quotedblright': 556,
25882 'guillemotright': 500,
25884 'perthousand': 1000,
25885 'questiondown': 500,
25896 'hungarumlaut': 333,
25901 'ordfeminine': 276,
25905 'ordmasculine': 310,
25915 'uhungarumlaut': 500,
25920 'Acircumflex': 611,
25922 'Ucircumflex': 722,
25924 'scommaaccent': 389,
25925 'ecircumflex': 444,
25933 'commaaccent': 250,
25938 'Ncommaaccent': 667,
25941 'Tcommaaccent': 556,
25950 'Gcommaaccent': 722,
25951 'ucircumflex': 500,
25952 'acircumflex': 500,
25964 'threesuperior': 300,
25971 'partialdiff': 476,
25974 'icircumflex': 278,
25975 'Ecircumflex': 611,
25994 'greaterequal': 549,
25997 'lcommaaccent': 278,
26011 'Ocircumflex': 722,
26015 'twosuperior': 300,
26019 'ohungarumlaut': 500,
26022 'threequarters': 750,
26025 'Kcommaaccent': 667,
26034 'ocircumflex': 500,
26036 'Uhungarumlaut': 722,
26042 'Scommaaccent': 500,
26043 'Ohungarumlaut': 722,
26050 'rcommaaccent': 389,
26053 'Rcommaaccent': 611,
26054 'Lcommaaccent': 556,
26062 'kcommaaccent': 444,
26064 'Icircumflex': 333,
26066 'tcommaaccent': 278,
26071 'gcommaaccent': 500,
26074 'ncommaaccent': 500,
26075 'onesuperior': 300,
26286 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
26287 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
26293 function isEOF(v) {
26297 var Parser = (function ParserClosure() {
26298 function Parser(lexer, allowStreams, xref) {
26299 this.lexer = lexer;
26300 this.allowStreams = allowStreams;
26302 this.inlineImg = 0;
26306 Parser.prototype = {
26307 refill: function Parser_refill() {
26308 this.buf1 = this.lexer.getObj();
26309 this.buf2 = this.lexer.getObj();
26311 shift: function Parser_shift() {
26312 if (isCmd(this.buf2, 'ID')) {
26313 this.buf1 = this.buf2;
26315 // skip byte after ID
26318 this.buf1 = this.buf2;
26319 this.buf2 = this.lexer.getObj();
26322 getObj: function Parser_getObj(cipherTransform) {
26323 if (isCmd(this.buf1, 'BI')) { // inline image
26325 return this.makeInlineImage(cipherTransform);
26327 if (isCmd(this.buf1, '[')) { // array
26330 while (!isCmd(this.buf1, ']') && !isEOF(this.buf1))
26331 array.push(this.getObj());
26332 if (isEOF(this.buf1))
26333 error('End of file inside array');
26337 if (isCmd(this.buf1, '<<')) { // dictionary or stream
26339 var dict = new Dict(this.xref);
26340 while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
26341 if (!isName(this.buf1))
26342 error('Dictionary key must be a name object');
26344 var key = this.buf1.name;
26346 if (isEOF(this.buf1))
26348 dict.set(key, this.getObj(cipherTransform));
26350 if (isEOF(this.buf1))
26351 error('End of file inside dictionary');
26353 // stream objects are not allowed inside content streams or
26355 if (isCmd(this.buf2, 'stream')) {
26356 return this.allowStreams ?
26357 this.makeStream(dict, cipherTransform) : dict;
26362 if (isInt(this.buf1)) { // indirect reference or integer
26363 var num = this.buf1;
26365 if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
26366 var ref = new Ref(num, this.buf1);
26373 if (isString(this.buf1)) { // string
26374 var str = this.buf1;
26376 if (cipherTransform)
26377 str = cipherTransform.decryptString(str);
26382 var obj = this.buf1;
26386 makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
26387 var lexer = this.lexer;
26388 var stream = lexer.stream;
26390 // parse dictionary
26391 var dict = new Dict();
26392 while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
26393 if (!isName(this.buf1))
26394 error('Dictionary key must be a name object');
26396 var key = this.buf1.name;
26398 if (isEOF(this.buf1))
26400 dict.set(key, this.getObj(cipherTransform));
26403 // parse image stream
26404 var startPos = stream.pos;
26406 // searching for the /EI\s/
26408 while (state != 4 && (ch = stream.getByte()) != null) {
26413 state = state === 3 ? 4 : 0;
26419 state = state === 2 ? 3 : 0;
26427 // TODO improve the small images performance to remove the limit
26428 var inlineImgLimit = 500;
26429 if (++this.inlineImg >= inlineImgLimit) {
26430 if (this.inlineImg === inlineImgLimit)
26431 warn('Too many inline images');
26436 var length = (stream.pos - 4) - startPos;
26437 var imageStream = stream.makeSubStream(startPos, length, dict);
26438 if (cipherTransform)
26439 imageStream = cipherTransform.createStream(imageStream);
26440 imageStream = this.filter(imageStream, dict, length);
26441 imageStream.parameters = dict;
26443 this.buf2 = Cmd.get('EI');
26446 return imageStream;
26448 fetchIfRef: function Parser_fetchIfRef(obj) {
26449 // not relying on the xref.fetchIfRef -- xref might not be set
26450 return isRef(obj) ? this.xref.fetch(obj) : obj;
26452 makeStream: function Parser_makeStream(dict, cipherTransform) {
26453 var lexer = this.lexer;
26454 var stream = lexer.stream;
26456 // get stream start position
26457 lexer.skipToNextLine();
26458 var pos = stream.pos;
26461 var length = this.fetchIfRef(dict.get('Length'));
26462 if (!isInt(length))
26463 error('Bad ' + length + ' attribute in stream');
26465 // skip over the stream data
26466 stream.pos = pos + length;
26467 this.shift(); // '>>'
26468 this.shift(); // 'stream'
26469 if (!isCmd(this.buf1, 'endstream'))
26470 error('Missing endstream');
26473 stream = stream.makeSubStream(pos, length, dict);
26474 if (cipherTransform)
26475 stream = cipherTransform.createStream(stream);
26476 stream = this.filter(stream, dict, length);
26477 stream.parameters = dict;
26480 filter: function Parser_filter(stream, dict, length) {
26481 var filter = this.fetchIfRef(dict.get('Filter', 'F'));
26482 var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
26483 if (isName(filter))
26484 return this.makeFilter(stream, filter.name, length, params);
26485 if (isArray(filter)) {
26486 var filterArray = filter;
26487 var paramsArray = params;
26488 for (var i = 0, ii = filterArray.length; i < ii; ++i) {
26489 filter = filterArray[i];
26490 if (!isName(filter))
26491 error('Bad filter name: ' + filter);
26494 if (isArray(paramsArray) && (i in paramsArray))
26495 params = paramsArray[i];
26496 stream = this.makeFilter(stream, filter.name, length, params);
26497 // after the first stream the length variable is invalid
26503 makeFilter: function Parser_makeFilter(stream, name, length, params) {
26504 if (name == 'FlateDecode' || name == 'Fl') {
26506 return new PredictorStream(new FlateStream(stream), params);
26508 return new FlateStream(stream);
26510 if (name == 'LZWDecode' || name == 'LZW') {
26511 var earlyChange = 1;
26513 if (params.has('EarlyChange'))
26514 earlyChange = params.get('EarlyChange');
26515 return new PredictorStream(
26516 new LZWStream(stream, earlyChange), params);
26518 return new LZWStream(stream, earlyChange);
26520 if (name == 'DCTDecode' || name == 'DCT') {
26521 var bytes = stream.getBytes(length);
26522 return new JpegStream(bytes, stream.dict, this.xref);
26524 if (name == 'JPXDecode' || name == 'JPX') {
26525 var bytes = stream.getBytes(length);
26526 return new JpxStream(bytes, stream.dict);
26528 if (name == 'ASCII85Decode' || name == 'A85') {
26529 return new Ascii85Stream(stream);
26531 if (name == 'ASCIIHexDecode' || name == 'AHx') {
26532 return new AsciiHexStream(stream);
26534 if (name == 'CCITTFaxDecode' || name == 'CCF') {
26535 return new CCITTFaxStream(stream, params);
26537 if (name == 'RunLengthDecode' || name == 'RL') {
26538 return new RunLengthStream(stream);
26540 if (name == 'JBIG2Decode') {
26541 error('JBIG2 image format is not currently supprted.');
26543 warn('filter "' + name + '" not supported yet');
26551 var Lexer = (function LexerClosure() {
26552 function Lexer(stream) {
26553 this.stream = stream;
26556 Lexer.isSpace = function Lexer_isSpace(ch) {
26557 return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
26560 // A '1' in this array means the character is white space. A '1' or
26561 // '2' means the character ends a name or command.
26562 var specialChars = [
26563 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
26564 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
26565 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
26566 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
26567 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
26568 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
26569 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
26570 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
26571 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
26572 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
26573 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
26574 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
26575 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
26576 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
26577 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
26578 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
26581 function toHexDigit(ch) {
26582 if (ch >= '0' && ch <= '9')
26583 return ch.charCodeAt(0) - 48;
26584 ch = ch.toUpperCase();
26585 if (ch >= 'A' && ch <= 'F')
26586 return ch.charCodeAt(0) - 55;
26590 Lexer.prototype = {
26591 getNumber: function Lexer_getNumber(ch) {
26592 var floating = false;
26594 var stream = this.stream;
26596 ch = stream.lookChar();
26597 if (ch == '.' && !floating) {
26600 } else if (ch == '-') {
26601 // ignore minus signs in the middle of numbers to match
26602 // Adobe's behavior
26603 warn('Badly formated number');
26604 } else if (ch >= '0' && ch <= '9') {
26606 } else if (ch == 'e' || ch == 'E') {
26609 // the last character doesn't belong to us
26614 var value = parseFloat(str);
26616 error('Invalid floating point number: ' + value);
26619 getString: function Lexer_getString() {
26623 var stream = this.stream;
26626 ch = stream.getChar();
26629 warn('Unterminated string');
26637 if (--numParen == 0) {
26644 ch = stream.getChar();
26647 warn('Unterminated string');
26670 case '0': case '1': case '2': case '3':
26671 case '4': case '5': case '6': case '7':
26673 ch = stream.lookChar();
26674 if (ch >= '0' && ch <= '7') {
26676 x = (x << 3) + (ch - '0');
26677 ch = stream.lookChar();
26678 if (ch >= '0' && ch <= '7') {
26680 x = (x << 3) + (ch - '0');
26684 str += String.fromCharCode(x);
26687 ch = stream.lookChar();
26703 getName: function Lexer_getName(ch) {
26705 var stream = this.stream;
26706 while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
26709 ch = stream.lookChar();
26710 var x = toHexDigit(ch);
26713 var x2 = toHexDigit(stream.getChar());
26715 error('Illegal digit in hex char in name: ' + x2);
26716 str += String.fromCharCode((x << 4) | x2);
26725 if (str.length > 128)
26726 error('Warning: name token is longer than allowed by the spec: ' +
26728 return new Name(str);
26730 getHexString: function Lexer_getHexString(ch) {
26732 var stream = this.stream;
26734 ch = stream.getChar();
26739 warn('Unterminated hex string');
26742 if (specialChars[ch.charCodeAt(0)] != 1) {
26744 if ((x = toHexDigit(ch)) == -1)
26745 error('Illegal character in hex string: ' + ch);
26747 ch = stream.getChar();
26748 while (specialChars[ch.charCodeAt(0)] == 1)
26749 ch = stream.getChar();
26751 if ((x2 = toHexDigit(ch)) == -1)
26752 error('Illegal character in hex string: ' + ch);
26754 str += String.fromCharCode((x << 4) | x2);
26759 getObj: function Lexer_getObj() {
26760 // skip whitespace and comments
26761 var comment = false;
26762 var stream = this.stream;
26765 if (!(ch = stream.getChar()))
26768 if (ch == '\r' || ch == '\n')
26770 } else if (ch == '%') {
26772 } else if (specialChars[ch.charCodeAt(0)] != 1) {
26777 // start reading token
26779 case '0': case '1': case '2': case '3': case '4':
26780 case '5': case '6': case '7': case '8': case '9':
26781 case '+': case '-': case '.':
26782 return this.getNumber(ch);
26784 return this.getString();
26786 return this.getName(ch);
26787 // array punctuation
26790 return Cmd.get(ch);
26791 // hex string or dict punctuation
26793 ch = stream.lookChar();
26795 // dict punctuation
26797 return Cmd.get('<<');
26799 return this.getHexString(ch);
26800 // dict punctuation
26802 ch = stream.lookChar();
26805 return Cmd.get('>>');
26809 return Cmd.get(ch);
26812 error('Illegal character: ' + ch);
26817 while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
26819 if (str.length == 128)
26820 error('Command token too long: ' + str.length);
26826 if (str == 'false')
26830 return Cmd.get(str);
26832 skipToNextLine: function Lexer_skipToNextLine() {
26833 var stream = this.stream;
26835 var ch = stream.getChar();
26836 if (!ch || ch == '\n')
26839 if ((ch = stream.lookChar()) == '\n')
26845 skip: function Lexer_skip() {
26846 this.stream.skip();
26853 var Linearization = (function LinearizationClosure() {
26854 function Linearization(stream) {
26855 this.parser = new Parser(new Lexer(stream), false, null);
26856 var obj1 = this.parser.getObj();
26857 var obj2 = this.parser.getObj();
26858 var obj3 = this.parser.getObj();
26859 this.linDict = this.parser.getObj();
26860 if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') &&
26861 isDict(this.linDict)) {
26862 var obj = this.linDict.get('Linearized');
26863 if (!(isNum(obj) && obj > 0))
26864 this.linDict = null;
26868 Linearization.prototype = {
26869 getInt: function Linearization_getInt(name) {
26870 var linDict = this.linDict;
26872 if (isDict(linDict) &&
26873 isInt(obj = linDict.get(name)) &&
26877 error('"' + name + '" field in linearization table is invalid');
26879 getHint: function Linearization_getHint(index) {
26880 var linDict = this.linDict;
26882 if (isDict(linDict) &&
26883 isArray(obj1 = linDict.get('H')) &&
26884 obj1.length >= 2 &&
26885 isInt(obj2 = obj1[index]) &&
26889 error('Hints table in linearization table is invalid: ' + index);
26892 if (!isDict(this.linDict))
26894 return this.getInt('L');
26896 get hintsOffset() {
26897 return this.getHint(0);
26899 get hintsLength() {
26900 return this.getHint(1);
26902 get hintsOffset2() {
26903 return this.getHint(2);
26905 get hintsLenth2() {
26906 return this.getHint(3);
26908 get objectNumberFirst() {
26909 return this.getInt('O');
26912 return this.getInt('E');
26915 return this.getInt('N');
26917 get mainXRefEntriesOffset() {
26918 return this.getInt('T');
26921 return this.getInt('P');
26925 return Linearization;
26929 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
26930 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
26934 var PatternType = {
26939 var Pattern = (function PatternClosure() {
26940 // Constructor should define this.getPattern
26941 function Pattern() {
26942 error('should not call Pattern constructor');
26945 Pattern.prototype = {
26946 // Input: current Canvas context
26947 // Output: the appropriate fillStyle or strokeStyle
26948 getPattern: function Pattern_getPattern(ctx) {
26949 error('Should not call Pattern.getStyle: ' + ctx);
26953 Pattern.shadingFromIR = function Pattern_shadingFromIR(raw) {
26954 return Shadings[raw[0]].fromIR(raw);
26957 Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
26960 var dict = isStream(shading) ? shading.dict : shading;
26961 var type = dict.get('ShadingType');
26964 case PatternType.AXIAL:
26965 case PatternType.RADIAL:
26966 // Both radial and axial shadings are handled by RadialAxial shading.
26967 return new Shadings.RadialAxial(dict, matrix, xref, res);
26969 return new Shadings.Dummy();
26977 // Radial and axial shading have very similar implementations
26978 // If needed, the implementations can be broken into two classes
26979 Shadings.RadialAxial = (function RadialAxialClosure() {
26980 function RadialAxial(dict, matrix, xref, res, ctx) {
26981 this.matrix = matrix;
26982 this.coordsArr = dict.get('Coords');
26983 this.shadingType = dict.get('ShadingType');
26984 this.type = 'Pattern';
26987 var cs = dict.get('ColorSpace', 'CS');
26988 cs = ColorSpace.parse(cs, xref, res);
26991 var t0 = 0.0, t1 = 1.0;
26992 if (dict.has('Domain')) {
26993 var domainArr = dict.get('Domain');
26998 var extendStart = false, extendEnd = false;
26999 if (dict.has('Extend')) {
27000 var extendArr = dict.get('Extend');
27001 extendStart = extendArr[0];
27002 extendEnd = extendArr[1];
27003 TODO('Support extend');
27006 this.extendStart = extendStart;
27007 this.extendEnd = extendEnd;
27009 var fnObj = dict.get('Function');
27010 if (isArray(fnObj))
27011 error('No support for array of functions');
27012 if (!isPDFFunction(fnObj))
27013 error('Invalid function');
27014 var fn = PDFFunction.parse(xref, fnObj);
27016 // 10 samples seems good enough for now, but probably won't work
27017 // if there are sharp color changes. Ideally, we would implement
27018 // the spec faithfully and add lossless optimizations.
27019 var step = (t1 - t0) / 10;
27020 var diff = t1 - t0;
27022 var colorStops = [];
27023 for (var i = t0; i <= t1; i += step) {
27024 var rgbColor = cs.getRgb(fn([i]));
27025 var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
27026 colorStops.push([(i - t0) / diff, cssColor]);
27029 this.colorStops = colorStops;
27032 RadialAxial.fromIR = function RadialAxial_fromIR(raw) {
27034 var colorStops = raw[2];
27041 getPattern: function RadialAxial_getPattern(ctx) {
27042 var curMatrix = ctx.mozCurrentTransform;
27044 var userMatrix = ctx.mozCurrentTransformInverse;
27046 p0 = Util.applyTransform(p0, curMatrix);
27047 p0 = Util.applyTransform(p0, userMatrix);
27049 p1 = Util.applyTransform(p1, curMatrix);
27050 p1 = Util.applyTransform(p1, userMatrix);
27054 if (type == PatternType.AXIAL)
27055 grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
27056 else if (type == PatternType.RADIAL)
27057 grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
27059 for (var i = 0, ii = colorStops.length; i < ii; ++i) {
27060 var c = colorStops[i];
27061 grad.addColorStop(c[0], c[1]);
27068 RadialAxial.prototype = {
27069 getIR: function RadialAxial_getIR() {
27070 var coordsArr = this.coordsArr;
27071 var type = this.shadingType;
27072 if (type == PatternType.AXIAL) {
27073 var p0 = [coordsArr[0], coordsArr[1]];
27074 var p1 = [coordsArr[2], coordsArr[3]];
27077 } else if (type == PatternType.RADIAL) {
27078 var p0 = [coordsArr[0], coordsArr[1]];
27079 var p1 = [coordsArr[3], coordsArr[4]];
27080 var r0 = coordsArr[2];
27081 var r1 = coordsArr[5];
27083 error('getPattern type unknown: ' + type);
27086 var matrix = this.matrix;
27088 p0 = Util.applyTransform(p0, matrix);
27089 p1 = Util.applyTransform(p1, matrix);
27092 return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
27096 return RadialAxial;
27099 Shadings.Dummy = (function DummyClosure() {
27101 this.type = 'Pattern';
27104 Dummy.fromIR = function Dummy_fromIR() {
27108 Dummy.prototype = {
27109 getIR: function Dummy_getIR() {
27116 var TilingPattern = (function TilingPatternClosure() {
27121 var MAX_PATTERN_SIZE = 512;
27123 function TilingPattern(IR, color, ctx, objs) {
27124 var operatorList = IR[2];
27125 this.matrix = IR[3];
27129 var paintType = IR[7];
27131 TODO('TilingType');
27133 this.curMatrix = ctx.mozCurrentTransform;
27134 this.invMatrix = ctx.mozCurrentTransformInverse;
27136 this.type = 'Pattern';
27138 var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
27140 var topLeft = [x0, y0];
27141 // we want the canvas to be as large as the step size
27142 var botRight = [x0 + xstep, y0 + ystep];
27144 var width = botRight[0] - topLeft[0];
27145 var height = botRight[1] - topLeft[1];
27147 // TODO: hack to avoid OOM, we would ideally compute the tiling
27148 // pattern to be only as large as the acual size in device space
27149 // This could be computed with .mozCurrentTransform, but still
27150 // needs to be implemented
27151 while (Math.abs(width) > MAX_PATTERN_SIZE ||
27152 Math.abs(height) > MAX_PATTERN_SIZE) {
27153 width = height = MAX_PATTERN_SIZE;
27156 var tmpCanvas = createScratchCanvas(width, height);
27158 // set the new canvas element context as the graphics context
27159 var tmpCtx = tmpCanvas.getContext('2d');
27160 var graphics = new CanvasGraphics(tmpCtx, objs);
27162 switch (paintType) {
27163 case PaintType.COLORED:
27164 tmpCtx.fillStyle = ctx.fillStyle;
27165 tmpCtx.strokeStyle = ctx.strokeStyle;
27167 case PaintType.UNCOLORED:
27168 var cssColor = Util.makeCssRgb(this, color[0], color[1], color[2]);
27169 tmpCtx.fillStyle = cssColor;
27170 tmpCtx.strokeStyle = cssColor;
27173 error('Unsupported paint type: ' + paintType);
27176 var scale = [width / xstep, height / ystep];
27177 this.scale = scale;
27179 // transform coordinates to pattern space
27180 var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
27181 var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
27182 graphics.transform.apply(graphics, tmpScale);
27183 graphics.transform.apply(graphics, tmpTranslate);
27185 if (bbox && isArray(bbox) && 4 == bbox.length) {
27186 var bboxWidth = x1 - x0;
27187 var bboxHeight = y1 - y0;
27188 graphics.rectangle(x0, y0, bboxWidth, bboxHeight);
27190 graphics.endPath();
27193 graphics.executeOperatorList(operatorList);
27195 this.canvas = tmpCanvas;
27198 TilingPattern.getIR = function TilingPattern_getIR(operatorList, dict, args) {
27199 var matrix = dict.get('Matrix');
27200 var bbox = dict.get('BBox');
27201 var xstep = dict.get('XStep');
27202 var ystep = dict.get('YStep');
27203 var paintType = dict.get('PaintType');
27206 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType
27210 TilingPattern.prototype = {
27211 getPattern: function TilingPattern_getPattern() {
27212 var matrix = this.matrix;
27213 var curMatrix = this.curMatrix;
27214 var ctx = this.ctx;
27217 ctx.setTransform.apply(ctx, curMatrix);
27220 ctx.transform.apply(ctx, matrix);
27222 var scale = this.scale;
27223 ctx.scale(1 / scale[0], 1 / scale[1]);
27225 return ctx.createPattern(this.canvas, 'repeat');
27229 return TilingPattern;
27233 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
27234 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
27238 var Stream = (function StreamClosure() {
27239 function Stream(arrayBuffer, start, length, dict) {
27240 this.bytes = new Uint8Array(arrayBuffer);
27241 this.start = start || 0;
27242 this.pos = this.start;
27243 this.end = (start + length) || this.bytes.length;
27247 // required methods for a stream. if a particular stream does not
27248 // implement these, an error should be thrown
27249 Stream.prototype = {
27251 return this.end - this.start;
27253 getByte: function Stream_getByte() {
27254 if (this.pos >= this.end)
27256 return this.bytes[this.pos++];
27258 // returns subarray of original buffer
27259 // should only be read
27260 getBytes: function Stream_getBytes(length) {
27261 var bytes = this.bytes;
27262 var pos = this.pos;
27263 var strEnd = this.end;
27266 return bytes.subarray(pos, strEnd);
27268 var end = pos + length;
27273 return bytes.subarray(pos, end);
27275 lookChar: function Stream_lookChar() {
27276 if (this.pos >= this.end)
27278 return String.fromCharCode(this.bytes[this.pos]);
27280 getChar: function Stream_getChar() {
27281 if (this.pos >= this.end)
27283 return String.fromCharCode(this.bytes[this.pos++]);
27285 skip: function Stream_skip(n) {
27290 reset: function Stream_reset() {
27291 this.pos = this.start;
27293 moveStart: function Stream_moveStart() {
27294 this.start = this.pos;
27296 makeSubStream: function Stream_makeSubStream(start, length, dict) {
27297 return new Stream(this.bytes.buffer, start, length, dict);
27305 var StringStream = (function StringStreamClosure() {
27306 function StringStream(str) {
27307 var length = str.length;
27308 var bytes = new Uint8Array(length);
27309 for (var n = 0; n < length; ++n)
27310 bytes[n] = str.charCodeAt(n);
27311 Stream.call(this, bytes);
27314 StringStream.prototype = Stream.prototype;
27316 return StringStream;
27319 // super class for the decoding streams
27320 var DecodeStream = (function DecodeStreamClosure() {
27321 function DecodeStream() {
27323 this.bufferLength = 0;
27325 this.buffer = null;
27328 DecodeStream.prototype = {
27329 ensureBuffer: function DecodeStream_ensureBuffer(requested) {
27330 var buffer = this.buffer;
27331 var current = buffer ? buffer.byteLength : 0;
27332 if (requested < current)
27335 while (size < requested)
27337 var buffer2 = new Uint8Array(size);
27338 for (var i = 0; i < current; ++i)
27339 buffer2[i] = buffer[i];
27340 return (this.buffer = buffer2);
27342 getByte: function DecodeStream_getByte() {
27343 var pos = this.pos;
27344 while (this.bufferLength <= pos) {
27349 return this.buffer[this.pos++];
27351 getBytes: function DecodeStream_getBytes(length) {
27352 var end, pos = this.pos;
27355 this.ensureBuffer(pos + length);
27356 end = pos + length;
27358 while (!this.eof && this.bufferLength < end)
27361 var bufEnd = this.bufferLength;
27368 end = this.bufferLength;
27370 // checking if bufferLength is still 0 then
27371 // the buffer has to be initialized
27373 this.buffer = new Uint8Array(0);
27377 return this.buffer.subarray(pos, end);
27379 lookChar: function DecodeStream_lookChar() {
27380 var pos = this.pos;
27381 while (this.bufferLength <= pos) {
27386 return String.fromCharCode(this.buffer[this.pos]);
27388 getChar: function DecodeStream_getChar() {
27389 var pos = this.pos;
27390 while (this.bufferLength <= pos) {
27395 return String.fromCharCode(this.buffer[this.pos++]);
27397 makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
27398 var end = start + length;
27399 while (this.bufferLength <= end && !this.eof)
27401 return new Stream(this.buffer, start, length, dict);
27403 skip: function DecodeStream_skip(n) {
27408 reset: function DecodeStream_reset() {
27413 return DecodeStream;
27416 var FakeStream = (function FakeStreamClosure() {
27417 function FakeStream(stream) {
27418 this.dict = stream.dict;
27419 DecodeStream.call(this);
27422 FakeStream.prototype = Object.create(DecodeStream.prototype);
27423 FakeStream.prototype.readBlock = function FakeStream_readBlock() {
27424 var bufferLength = this.bufferLength;
27425 bufferLength += 1024;
27426 var buffer = this.ensureBuffer(bufferLength);
27427 this.bufferLength = bufferLength;
27430 FakeStream.prototype.getBytes = function FakeStream_getBytes(length) {
27431 var end, pos = this.pos;
27434 this.ensureBuffer(pos + length);
27435 end = pos + length;
27437 while (!this.eof && this.bufferLength < end)
27440 var bufEnd = this.bufferLength;
27445 end = this.bufferLength;
27449 return this.buffer.subarray(pos, end);
27455 var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
27456 function StreamsSequenceStream(streams) {
27457 this.streams = streams;
27458 DecodeStream.call(this);
27461 StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
27463 StreamsSequenceStream.prototype.readBlock =
27464 function streamSequenceStreamReadBlock() {
27466 var streams = this.streams;
27467 if (streams.length == 0) {
27471 var stream = streams.shift();
27472 var chunk = stream.getBytes();
27473 var bufferLength = this.bufferLength;
27474 var newLength = bufferLength + chunk.length;
27475 var buffer = this.ensureBuffer(newLength);
27476 buffer.set(chunk, bufferLength);
27477 this.bufferLength = newLength;
27480 return StreamsSequenceStream;
27483 var FlateStream = (function FlateStreamClosure() {
27484 var codeLenCodeMap = new Uint32Array([
27485 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
27488 var lengthDecode = new Uint32Array([
27489 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
27490 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
27491 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
27492 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
27495 var distDecode = new Uint32Array([
27496 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
27497 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
27498 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
27499 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
27502 var fixedLitCodeTab = [new Uint32Array([
27503 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
27504 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
27505 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
27506 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
27507 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
27508 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
27509 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
27510 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
27511 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
27512 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
27513 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
27514 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
27515 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
27516 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
27517 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
27518 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
27519 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
27520 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
27521 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
27522 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
27523 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
27524 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
27525 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
27526 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
27527 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
27528 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
27529 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
27530 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
27531 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
27532 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
27533 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
27534 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
27535 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
27536 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
27537 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
27538 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
27539 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
27540 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
27541 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
27542 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
27543 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
27544 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
27545 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
27546 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
27547 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
27548 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
27549 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
27550 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
27551 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
27552 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
27553 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
27554 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
27555 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
27556 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
27557 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
27558 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
27559 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
27560 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
27561 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
27562 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
27563 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
27564 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
27565 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
27566 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
27569 var fixedDistCodeTab = [new Uint32Array([
27570 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
27571 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
27572 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
27573 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
27576 function FlateStream(stream) {
27577 var bytes = stream.getBytes();
27580 this.dict = stream.dict;
27581 var cmf = bytes[bytesPos++];
27582 var flg = bytes[bytesPos++];
27583 if (cmf == -1 || flg == -1)
27584 error('Invalid header in flate stream: ' + cmf + ', ' + flg);
27585 if ((cmf & 0x0f) != 0x08)
27586 error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
27587 if ((((cmf << 8) + flg) % 31) != 0)
27588 error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
27590 error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
27592 this.bytes = bytes;
27593 this.bytesPos = bytesPos;
27598 DecodeStream.call(this);
27601 FlateStream.prototype = Object.create(DecodeStream.prototype);
27603 FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
27604 var codeSize = this.codeSize;
27605 var codeBuf = this.codeBuf;
27606 var bytes = this.bytes;
27607 var bytesPos = this.bytesPos;
27610 while (codeSize < bits) {
27611 if (typeof (b = bytes[bytesPos++]) == 'undefined')
27612 error('Bad encoding in flate stream');
27613 codeBuf |= b << codeSize;
27616 b = codeBuf & ((1 << bits) - 1);
27617 this.codeBuf = codeBuf >> bits;
27618 this.codeSize = codeSize -= bits;
27619 this.bytesPos = bytesPos;
27623 FlateStream.prototype.getCode = function FlateStream_getCode(table) {
27624 var codes = table[0];
27625 var maxLen = table[1];
27626 var codeSize = this.codeSize;
27627 var codeBuf = this.codeBuf;
27628 var bytes = this.bytes;
27629 var bytesPos = this.bytesPos;
27631 while (codeSize < maxLen) {
27633 if (typeof (b = bytes[bytesPos++]) == 'undefined')
27634 error('Bad encoding in flate stream');
27635 codeBuf |= (b << codeSize);
27638 var code = codes[codeBuf & ((1 << maxLen) - 1)];
27639 var codeLen = code >> 16;
27640 var codeVal = code & 0xffff;
27641 if (codeSize == 0 || codeSize < codeLen || codeLen == 0)
27642 error('Bad encoding in flate stream');
27643 this.codeBuf = (codeBuf >> codeLen);
27644 this.codeSize = (codeSize - codeLen);
27645 this.bytesPos = bytesPos;
27649 FlateStream.prototype.generateHuffmanTable =
27650 function flateStreamGenerateHuffmanTable(lengths) {
27651 var n = lengths.length;
27653 // find max code length
27655 for (var i = 0; i < n; ++i) {
27656 if (lengths[i] > maxLen)
27657 maxLen = lengths[i];
27661 var size = 1 << maxLen;
27662 var codes = new Uint32Array(size);
27663 for (var len = 1, code = 0, skip = 2;
27665 ++len, code <<= 1, skip <<= 1) {
27666 for (var val = 0; val < n; ++val) {
27667 if (lengths[val] == len) {
27668 // bit-reverse the code
27671 for (var i = 0; i < len; ++i) {
27672 code2 = (code2 << 1) | (t & 1);
27676 // fill the table entries
27677 for (var i = code2; i < size; i += skip)
27678 codes[i] = (len << 16) | val;
27685 return [codes, maxLen];
27688 FlateStream.prototype.readBlock = function FlateStream_readBlock() {
27689 // read block header
27690 var hdr = this.getBits(3);
27695 if (hdr == 0) { // uncompressed block
27696 var bytes = this.bytes;
27697 var bytesPos = this.bytesPos;
27700 if (typeof (b = bytes[bytesPos++]) == 'undefined')
27701 error('Bad block header in flate stream');
27703 if (typeof (b = bytes[bytesPos++]) == 'undefined')
27704 error('Bad block header in flate stream');
27705 blockLen |= (b << 8);
27706 if (typeof (b = bytes[bytesPos++]) == 'undefined')
27707 error('Bad block header in flate stream');
27709 if (typeof (b = bytes[bytesPos++]) == 'undefined')
27710 error('Bad block header in flate stream');
27712 if (check != (~blockLen & 0xffff))
27713 error('Bad uncompressed block length in flate stream');
27718 var bufferLength = this.bufferLength;
27719 var buffer = this.ensureBuffer(bufferLength + blockLen);
27720 var end = bufferLength + blockLen;
27721 this.bufferLength = end;
27722 for (var n = bufferLength; n < end; ++n) {
27723 if (typeof (b = bytes[bytesPos++]) == 'undefined') {
27729 this.bytesPos = bytesPos;
27735 if (hdr == 1) { // compressed block, fixed codes
27736 litCodeTable = fixedLitCodeTab;
27737 distCodeTable = fixedDistCodeTab;
27738 } else if (hdr == 2) { // compressed block, dynamic codes
27739 var numLitCodes = this.getBits(5) + 257;
27740 var numDistCodes = this.getBits(5) + 1;
27741 var numCodeLenCodes = this.getBits(4) + 4;
27743 // build the code lengths code table
27744 var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
27746 for (var i = 0; i < numCodeLenCodes; ++i)
27747 codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
27748 var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
27750 // build the literal and distance code tables
27753 var codes = numLitCodes + numDistCodes;
27754 var codeLengths = new Uint8Array(codes);
27755 while (i < codes) {
27756 var code = this.getCode(codeLenCodeTab);
27758 var bitsLength = 2, bitsOffset = 3, what = len;
27759 } else if (code == 17) {
27760 var bitsLength = 3, bitsOffset = 3, what = (len = 0);
27761 } else if (code == 18) {
27762 var bitsLength = 7, bitsOffset = 11, what = (len = 0);
27764 codeLengths[i++] = len = code;
27768 var repeatLength = this.getBits(bitsLength) + bitsOffset;
27769 while (repeatLength-- > 0)
27770 codeLengths[i++] = what;
27774 this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
27776 this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
27778 error('Unknown block type in flate stream');
27781 var buffer = this.buffer;
27782 var limit = buffer ? buffer.length : 0;
27783 var pos = this.bufferLength;
27785 var code1 = this.getCode(litCodeTable);
27787 if (pos + 1 >= limit) {
27788 buffer = this.ensureBuffer(pos + 1);
27789 limit = buffer.length;
27791 buffer[pos++] = code1;
27794 if (code1 == 256) {
27795 this.bufferLength = pos;
27799 code1 = lengthDecode[code1];
27800 var code2 = code1 >> 16;
27802 code2 = this.getBits(code2);
27803 var len = (code1 & 0xffff) + code2;
27804 code1 = this.getCode(distCodeTable);
27805 code1 = distDecode[code1];
27806 code2 = code1 >> 16;
27808 code2 = this.getBits(code2);
27809 var dist = (code1 & 0xffff) + code2;
27810 if (pos + len >= limit) {
27811 buffer = this.ensureBuffer(pos + len);
27812 limit = buffer.length;
27814 for (var k = 0; k < len; ++k, ++pos)
27815 buffer[pos] = buffer[pos - dist];
27819 return FlateStream;
27822 var PredictorStream = (function PredictorStreamClosure() {
27823 function PredictorStream(stream, params) {
27824 var predictor = this.predictor = params.get('Predictor') || 1;
27826 if (predictor <= 1)
27827 return stream; // no prediction
27828 if (predictor !== 2 && (predictor < 10 || predictor > 15))
27829 error('Unsupported predictor: ' + predictor);
27831 if (predictor === 2)
27832 this.readBlock = this.readBlockTiff;
27834 this.readBlock = this.readBlockPng;
27836 this.stream = stream;
27837 this.dict = stream.dict;
27839 var colors = this.colors = params.get('Colors') || 1;
27840 var bits = this.bits = params.get('BitsPerComponent') || 8;
27841 var columns = this.columns = params.get('Columns') || 1;
27843 this.pixBytes = (colors * bits + 7) >> 3;
27844 this.rowBytes = (columns * colors * bits + 7) >> 3;
27846 DecodeStream.call(this);
27850 PredictorStream.prototype = Object.create(DecodeStream.prototype);
27852 PredictorStream.prototype.readBlockTiff =
27853 function predictorStreamReadBlockTiff() {
27854 var rowBytes = this.rowBytes;
27856 var bufferLength = this.bufferLength;
27857 var buffer = this.ensureBuffer(bufferLength + rowBytes);
27859 var bits = this.bits;
27860 var colors = this.colors;
27862 var rawBytes = this.stream.getBytes(rowBytes);
27864 var inbuf = 0, outbuf = 0;
27865 var inbits = 0, outbits = 0;
27866 var pos = bufferLength;
27869 for (var i = 0; i < rowBytes; ++i) {
27870 var c = rawBytes[i];
27871 inbuf = (inbuf << 8) | c;
27872 // bitwise addition is exclusive or
27873 // first shift inbuf and then add
27874 buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
27875 // truncate inbuf (assumes colors < 16)
27878 } else if (bits === 8) {
27879 for (var i = 0; i < colors; ++i)
27880 buffer[pos++] = rawBytes[i];
27881 for (; i < rowBytes; ++i) {
27882 buffer[pos] = buffer[pos - colors] + rawBytes[i];
27886 var compArray = new Uint8Array(colors + 1);
27887 var bitMask = (1 << bits) - 1;
27888 var j = 0, k = bufferLength;
27889 var columns = this.columns;
27890 for (var i = 0; i < columns; ++i) {
27891 for (var kk = 0; kk < colors; ++kk) {
27892 if (inbits < bits) {
27893 inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
27896 compArray[kk] = (compArray[kk] +
27897 (inbuf >> (inbits - bits))) & bitMask;
27899 outbuf = (outbuf << bits) | compArray[kk];
27901 if (outbits >= 8) {
27902 buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
27908 buffer[k++] = (outbuf << (8 - outbits)) +
27909 (inbuf & ((1 << (8 - outbits)) - 1));
27912 this.bufferLength += rowBytes;
27915 PredictorStream.prototype.readBlockPng =
27916 function predictorStreamReadBlockPng() {
27918 var rowBytes = this.rowBytes;
27919 var pixBytes = this.pixBytes;
27921 var predictor = this.stream.getByte();
27922 var rawBytes = this.stream.getBytes(rowBytes);
27924 var bufferLength = this.bufferLength;
27925 var buffer = this.ensureBuffer(bufferLength + rowBytes);
27927 var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
27928 if (prevRow.length == 0)
27929 prevRow = new Uint8Array(rowBytes);
27931 var j = bufferLength;
27932 switch (predictor) {
27934 for (var i = 0; i < rowBytes; ++i)
27935 buffer[j++] = rawBytes[i];
27938 for (var i = 0; i < pixBytes; ++i)
27939 buffer[j++] = rawBytes[i];
27940 for (; i < rowBytes; ++i) {
27941 buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
27946 for (var i = 0; i < rowBytes; ++i)
27947 buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
27950 for (var i = 0; i < pixBytes; ++i)
27951 buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
27952 for (; i < rowBytes; ++i) {
27953 buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
27954 rawBytes[i]) & 0xFF;
27959 // we need to save the up left pixels values. the simplest way
27960 // is to create a new buffer
27961 for (var i = 0; i < pixBytes; ++i) {
27962 var up = prevRow[i];
27963 var c = rawBytes[i];
27964 buffer[j++] = up + c;
27966 for (; i < rowBytes; ++i) {
27967 var up = prevRow[i];
27968 var upLeft = prevRow[i - pixBytes];
27969 var left = buffer[j - pixBytes];
27970 var p = left + up - upLeft;
27978 var pc = p - upLeft;
27982 var c = rawBytes[i];
27983 if (pa <= pb && pa <= pc)
27984 buffer[j++] = left + c;
27986 buffer[j++] = up + c;
27988 buffer[j++] = upLeft + c;
27992 error('Unsupported predictor: ' + predictor);
27994 this.bufferLength += rowBytes;
27997 return PredictorStream;
28001 * Depending on the type of JPEG a JpegStream is handled in different ways. For
28002 * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
28003 * data is stored and then loaded by the browser. For unsupported JPEG's we use
28004 * a library to decode these images and the stream behaves like all the other
28007 var JpegStream = (function JpegStreamClosure() {
28008 function isAdobeImage(bytes) {
28009 var maxBytesScanned = Math.max(bytes.length - 16, 1024);
28010 // Looking for APP14, 'Adobe'
28011 for (var i = 0; i < maxBytesScanned; ++i) {
28012 if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE &&
28013 bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E &&
28014 bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 &&
28015 bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 &&
28016 bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00)
28018 // scanning until frame tag
28019 if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
28025 function fixAdobeImage(bytes) {
28026 // Inserting 'EMBED' marker after JPEG signature
28027 var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
28029 var newBytes = new Uint8Array(bytes.length + embedMarker.length);
28030 newBytes.set(bytes, embedMarker.length);
28031 // copy JPEG header
28032 newBytes[0] = bytes[0];
28033 newBytes[1] = bytes[1];
28034 newBytes.set(embedMarker, 2);
28038 function JpegStream(bytes, dict, xref) {
28039 // TODO: per poppler, some images may have 'junk' before that
28040 // need to be removed
28043 this.isAdobeImage = false;
28044 this.colorTransform = dict.get('ColorTransform') || -1;
28046 if (isAdobeImage(bytes)) {
28047 this.isAdobeImage = true;
28048 bytes = fixAdobeImage(bytes);
28051 this.bytes = bytes;
28053 DecodeStream.call(this);
28056 JpegStream.prototype = Object.create(DecodeStream.prototype);
28058 JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
28059 if (this.bufferLength)
28062 var jpegImage = new JpegImage();
28063 if (this.colorTransform != -1)
28064 jpegImage.colorTransform = this.colorTransform;
28065 jpegImage.parse(this.bytes);
28066 var width = jpegImage.width;
28067 var height = jpegImage.height;
28068 var data = jpegImage.getData(width, height);
28069 this.buffer = data;
28070 this.bufferLength = data.length;
28072 error('JPEG error: ' + e);
28075 JpegStream.prototype.getIR = function JpegStream_getIR() {
28076 return bytesToString(this.bytes);
28078 JpegStream.prototype.getChar = function JpegStream_getChar() {
28079 error('internal error: getChar is not valid on JpegStream');
28082 * Checks if the image can be decoded and displayed by the browser without any
28083 * further processing such as color space conversions.
28085 JpegStream.prototype.isNativelySupported =
28086 function JpegStream_isNativelySupported(xref, res) {
28087 var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
28088 // when bug 674619 lands, let's check if browser can do
28089 // normal cmyk and then we won't need to decode in JS
28090 if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB')
28092 if (cs.name === 'DeviceCMYK' && !this.isAdobeImage &&
28093 this.colorTransform < 1)
28098 * Checks if the image can be decoded by the browser.
28100 JpegStream.prototype.isNativelyDecodable =
28101 function JpegStream_isNativelyDecodable(xref, res) {
28102 var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res);
28103 var numComps = cs.numComps;
28104 if (numComps == 1 || numComps == 3)
28114 * For JPEG 2000's we use a library to decode these images and
28115 * the stream behaves like all the other DecodeStreams.
28117 var JpxStream = (function JpxStreamClosure() {
28118 function JpxStream(bytes, dict) {
28120 this.bytes = bytes;
28122 DecodeStream.call(this);
28125 JpxStream.prototype = Object.create(DecodeStream.prototype);
28127 JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
28128 if (this.bufferLength)
28131 var jpxImage = new JpxImage();
28132 jpxImage.parse(this.bytes);
28134 var width = jpxImage.width;
28135 var height = jpxImage.height;
28136 var componentsCount = jpxImage.componentsCount;
28137 if (componentsCount != 1 && componentsCount != 3 && componentsCount != 4)
28138 error('JPX with ' + componentsCount + ' components is not supported');
28140 var data = new Uint8Array(width * height * componentsCount);
28142 for (var k = 0, kk = jpxImage.tiles.length; k < kk; k++) {
28143 var tileCompoments = jpxImage.tiles[k];
28144 var tileWidth = tileCompoments[0].width;
28145 var tileHeight = tileCompoments[0].height;
28146 var tileLeft = tileCompoments[0].left;
28147 var tileTop = tileCompoments[0].top;
28149 var dataPosition, sourcePosition, data0, data1, data2, data3, rowFeed;
28150 switch (componentsCount) {
28152 data0 = tileCompoments[0].items;
28154 dataPosition = width * tileTop + tileLeft;
28155 rowFeed = width - tileWidth;
28156 sourcePosition = 0;
28157 for (var j = 0; j < tileHeight; j++) {
28158 for (var i = 0; i < tileWidth; i++)
28159 data[dataPosition++] = data0[sourcePosition++];
28160 dataPosition += rowFeed;
28164 data0 = tileCompoments[0].items;
28165 data1 = tileCompoments[1].items;
28166 data2 = tileCompoments[2].items;
28168 dataPosition = (width * tileTop + tileLeft) * 3;
28169 rowFeed = (width - tileWidth) * 3;
28170 sourcePosition = 0;
28171 for (var j = 0; j < tileHeight; j++) {
28172 for (var i = 0; i < tileWidth; i++) {
28173 data[dataPosition++] = data0[sourcePosition];
28174 data[dataPosition++] = data1[sourcePosition];
28175 data[dataPosition++] = data2[sourcePosition];
28178 dataPosition += rowFeed;
28182 data0 = tileCompoments[0].items;
28183 data1 = tileCompoments[1].items;
28184 data2 = tileCompoments[2].items;
28185 data3 = tileCompoments[3].items;
28187 dataPosition = (width * tileTop + tileLeft) * 4;
28188 rowFeed = (width - tileWidth) * 4;
28189 sourcePosition = 0;
28190 for (var j = 0; j < tileHeight; j++) {
28191 for (var i = 0; i < tileWidth; i++) {
28192 data[dataPosition++] = data0[sourcePosition];
28193 data[dataPosition++] = data1[sourcePosition];
28194 data[dataPosition++] = data2[sourcePosition];
28195 data[dataPosition++] = data3[sourcePosition];
28198 dataPosition += rowFeed;
28204 this.buffer = data;
28205 this.bufferLength = data.length;
28207 JpxStream.prototype.getChar = function JpxStream_getChar() {
28208 error('internal error: getChar is not valid on JpxStream');
28214 var DecryptStream = (function DecryptStreamClosure() {
28215 function DecryptStream(str, decrypt) {
28217 this.dict = str.dict;
28218 this.decrypt = decrypt;
28220 DecodeStream.call(this);
28223 var chunkSize = 512;
28225 DecryptStream.prototype = Object.create(DecodeStream.prototype);
28227 DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
28228 var chunk = this.str.getBytes(chunkSize);
28229 if (!chunk || chunk.length == 0) {
28233 var decrypt = this.decrypt;
28234 chunk = decrypt(chunk);
28236 var bufferLength = this.bufferLength;
28237 var i, n = chunk.length;
28238 var buffer = this.ensureBuffer(bufferLength + n);
28239 for (i = 0; i < n; i++)
28240 buffer[bufferLength++] = chunk[i];
28241 this.bufferLength = bufferLength;
28244 return DecryptStream;
28247 var Ascii85Stream = (function Ascii85StreamClosure() {
28248 function Ascii85Stream(str) {
28250 this.dict = str.dict;
28251 this.input = new Uint8Array(5);
28253 DecodeStream.call(this);
28256 Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
28258 Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
28259 var tildaCode = '~'.charCodeAt(0);
28260 var zCode = 'z'.charCodeAt(0);
28261 var str = this.str;
28263 var c = str.getByte();
28264 while (Lexer.isSpace(String.fromCharCode(c)))
28267 if (!c || c === tildaCode) {
28272 var bufferLength = this.bufferLength, buffer;
28274 // special code for z
28276 buffer = this.ensureBuffer(bufferLength + 4);
28277 for (var i = 0; i < 4; ++i)
28278 buffer[bufferLength + i] = 0;
28279 this.bufferLength += 4;
28281 var input = this.input;
28283 for (var i = 1; i < 5; ++i) {
28285 while (Lexer.isSpace(String.fromCharCode(c)))
28290 if (!c || c == tildaCode)
28293 buffer = this.ensureBuffer(bufferLength + i - 1);
28294 this.bufferLength += i - 1;
28299 input[i] = 0x21 + 84;
28303 for (var i = 0; i < 5; ++i)
28304 t = t * 85 + (input[i] - 0x21);
28306 for (var i = 3; i >= 0; --i) {
28307 buffer[bufferLength + i] = t & 0xFF;
28313 return Ascii85Stream;
28316 var AsciiHexStream = (function AsciiHexStreamClosure() {
28317 function AsciiHexStream(str) {
28319 this.dict = str.dict;
28321 DecodeStream.call(this);
28324 var hexvalueMap = {
28351 AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
28353 AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
28354 var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n,
28355 decodeLength, buffer, bufferLength, i, length;
28357 decodeLength = (bytes.length + 1) >> 1;
28358 buffer = this.ensureBuffer(this.bufferLength + decodeLength);
28359 bufferLength = this.bufferLength;
28361 for (i = 0, length = bytes.length; i < length; i++) {
28362 c = hexvalueMap[bytes[i]];
28363 while (c == -1 && (i + 1) < length) {
28364 c = hexvalueMap[bytes[++i]];
28367 if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
28368 n = hexvalueMap[bytes[++i]];
28369 buffer[bufferLength++] = c * 16 + n;
28371 // EOD marker at an odd number, behave as if a 0 followed the last
28373 if (bytes[i] !== gtCode) {
28374 buffer[bufferLength++] = c * 16;
28379 this.bufferLength = bufferLength;
28383 return AsciiHexStream;
28386 var RunLengthStream = (function RunLengthStreamClosure() {
28387 function RunLengthStream(str) {
28389 this.dict = str.dict;
28391 DecodeStream.call(this);
28394 RunLengthStream.prototype = Object.create(DecodeStream.prototype);
28396 RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
28397 // The repeatHeader has following format. The first byte defines type of run
28398 // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
28399 // (in addition to the second byte from the header), n = 129 through 255 -
28400 // duplicate the second byte from the header (257 - n) times, n = 128 - end.
28401 var repeatHeader = this.str.getBytes(2);
28402 if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] == 128) {
28407 var bufferLength = this.bufferLength;
28408 var n = repeatHeader[0];
28411 var buffer = this.ensureBuffer(bufferLength + n + 1);
28412 buffer[bufferLength++] = repeatHeader[1];
28414 var source = this.str.getBytes(n);
28415 buffer.set(source, bufferLength);
28420 var b = repeatHeader[1];
28421 var buffer = this.ensureBuffer(bufferLength + n + 1);
28422 for (var i = 0; i < n; i++)
28423 buffer[bufferLength++] = b;
28425 this.bufferLength = bufferLength;
28428 return RunLengthStream;
28431 var CCITTFaxStream = (function CCITTFaxStreamClosure() {
28434 var twoDimPass = 0;
28435 var twoDimHoriz = 1;
28436 var twoDimVert0 = 2;
28437 var twoDimVertR1 = 3;
28438 var twoDimVertL1 = 4;
28439 var twoDimVertR2 = 5;
28440 var twoDimVertL2 = 6;
28441 var twoDimVertR3 = 7;
28442 var twoDimVertL3 = 8;
28444 var twoDimTable = [
28445 [-1, -1], [-1, -1], // 000000x
28446 [7, twoDimVertL3], // 0000010
28447 [7, twoDimVertR3], // 0000011
28448 [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
28449 [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
28450 [4, twoDimPass], [4, twoDimPass], // 0001xxx
28451 [4, twoDimPass], [4, twoDimPass],
28452 [4, twoDimPass], [4, twoDimPass],
28453 [4, twoDimPass], [4, twoDimPass],
28454 [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx
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, twoDimHoriz], [3, twoDimHoriz],
28462 [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
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, twoDimVertL1], [3, twoDimVertL1],
28470 [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
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 [3, twoDimVertR1], [3, twoDimVertR1],
28478 [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx
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 [1, twoDimVert0], [1, twoDimVert0]
28512 var whiteTable1 = [
28514 [12, ccittEOL], // 00001
28515 [-1, -1], [-1, -1], // 0001x
28516 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
28517 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
28518 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
28519 [11, 1792], [11, 1792], // 1000x
28520 [12, 1984], // 10010
28521 [12, 2048], // 10011
28522 [12, 2112], // 10100
28523 [12, 2176], // 10101
28524 [12, 2240], // 10110
28525 [12, 2304], // 10111
28526 [11, 1856], [11, 1856], // 1100x
28527 [11, 1920], [11, 1920], // 1101x
28528 [12, 2368], // 11100
28529 [12, 2432], // 11101
28530 [12, 2496], // 11110
28531 [12, 2560] // 11111
28534 var whiteTable2 = [
28535 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx
28536 [8, 29], [8, 29], // 00000010x
28537 [8, 30], [8, 30], // 00000011x
28538 [8, 45], [8, 45], // 00000100x
28539 [8, 46], [8, 46], // 00000101x
28540 [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx
28541 [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx
28542 [8, 47], [8, 47], // 00001010x
28543 [8, 48], [8, 48], // 00001011x
28544 [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx
28545 [6, 13], [6, 13], [6, 13], [6, 13],
28546 [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx
28547 [8, 33], [8, 33], // 00010010x
28548 [8, 34], [8, 34], // 00010011x
28549 [8, 35], [8, 35], // 00010100x
28550 [8, 36], [8, 36], // 00010101x
28551 [8, 37], [8, 37], // 00010110x
28552 [8, 38], [8, 38], // 00010111x
28553 [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx
28554 [8, 31], [8, 31], // 00011010x
28555 [8, 32], [8, 32], // 00011011x
28556 [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx
28557 [6, 1], [6, 1], [6, 1], [6, 1],
28558 [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx
28559 [6, 12], [6, 12], [6, 12], [6, 12],
28560 [8, 53], [8, 53], // 00100100x
28561 [8, 54], [8, 54], // 00100101x
28562 [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx
28563 [8, 39], [8, 39], // 00101000x
28564 [8, 40], [8, 40], // 00101001x
28565 [8, 41], [8, 41], // 00101010x
28566 [8, 42], [8, 42], // 00101011x
28567 [8, 43], [8, 43], // 00101100x
28568 [8, 44], [8, 44], // 00101101x
28569 [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx
28570 [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx
28571 [8, 61], [8, 61], // 00110010x
28572 [8, 62], [8, 62], // 00110011x
28573 [8, 63], [8, 63], // 00110100x
28574 [8, 0], [8, 0], // 00110101x
28575 [8, 320], [8, 320], // 00110110x
28576 [8, 384], [8, 384], // 00110111x
28577 [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx
28578 [5, 10], [5, 10], [5, 10], [5, 10],
28579 [5, 10], [5, 10], [5, 10], [5, 10],
28580 [5, 10], [5, 10], [5, 10], [5, 10],
28581 [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx
28582 [5, 11], [5, 11], [5, 11], [5, 11],
28583 [5, 11], [5, 11], [5, 11], [5, 11],
28584 [5, 11], [5, 11], [5, 11], [5, 11],
28585 [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx
28586 [8, 59], [8, 59], // 01001010x
28587 [8, 60], [8, 60], // 01001011x
28588 [9, 1472], // 010011000
28589 [9, 1536], // 010011001
28590 [9, 1600], // 010011010
28591 [9, 1728], // 010011011
28592 [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx
28593 [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx
28594 [8, 49], [8, 49], // 01010010x
28595 [8, 50], [8, 50], // 01010011x
28596 [8, 51], [8, 51], // 01010100x
28597 [8, 52], [8, 52], // 01010101x
28598 [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx
28599 [8, 55], [8, 55], // 01011000x
28600 [8, 56], [8, 56], // 01011001x
28601 [8, 57], [8, 57], // 01011010x
28602 [8, 58], [8, 58], // 01011011x
28603 [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx
28604 [6, 192], [6, 192], [6, 192], [6, 192],
28605 [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
28606 [6, 1664], [6, 1664], [6, 1664], [6, 1664],
28607 [8, 448], [8, 448], // 01100100x
28608 [8, 512], [8, 512], // 01100101x
28609 [9, 704], // 011001100
28610 [9, 768], // 011001101
28611 [8, 640], [8, 640], // 01100111x
28612 [8, 576], [8, 576], // 01101000x
28613 [9, 832], // 011010010
28614 [9, 896], // 011010011
28615 [9, 960], // 011010100
28616 [9, 1024], // 011010101
28617 [9, 1088], // 011010110
28618 [9, 1152], // 011010111
28619 [9, 1216], // 011011000
28620 [9, 1280], // 011011001
28621 [9, 1344], // 011011010
28622 [9, 1408], // 011011011
28623 [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx
28624 [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx
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, 2], [4, 2], [4, 2], [4, 2],
28632 [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx
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 [4, 3], [4, 3], [4, 3], [4, 3],
28640 [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx
28641 [5, 128], [5, 128], [5, 128], [5, 128],
28642 [5, 128], [5, 128], [5, 128], [5, 128],
28643 [5, 128], [5, 128], [5, 128], [5, 128],
28644 [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx
28645 [5, 8], [5, 8], [5, 8], [5, 8],
28646 [5, 8], [5, 8], [5, 8], [5, 8],
28647 [5, 8], [5, 8], [5, 8], [5, 8],
28648 [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx
28649 [5, 9], [5, 9], [5, 9], [5, 9],
28650 [5, 9], [5, 9], [5, 9], [5, 9],
28651 [5, 9], [5, 9], [5, 9], [5, 9],
28652 [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx
28653 [6, 16], [6, 16], [6, 16], [6, 16],
28654 [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx
28655 [6, 17], [6, 17], [6, 17], [6, 17],
28656 [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx
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, 4], [4, 4], [4, 4], [4, 4],
28664 [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx
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 [4, 5], [4, 5], [4, 5], [4, 5],
28672 [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx
28673 [6, 14], [6, 14], [6, 14], [6, 14],
28674 [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx
28675 [6, 15], [6, 15], [6, 15], [6, 15],
28676 [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx
28677 [5, 64], [5, 64], [5, 64], [5, 64],
28678 [5, 64], [5, 64], [5, 64], [5, 64],
28679 [5, 64], [5, 64], [5, 64], [5, 64],
28680 [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx
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, 6], [4, 6], [4, 6], [4, 6],
28688 [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx
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 [4, 7], [4, 7], [4, 7], [4, 7]
28698 var blackTable1 = [
28699 [-1, -1], [-1, -1], // 000000000000x
28700 [12, ccittEOL], [12, ccittEOL], // 000000000001x
28701 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx
28702 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx
28703 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx
28704 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx
28705 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx
28706 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx
28707 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx
28708 [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
28709 [12, 1984], [12, 1984], // 000000010010x
28710 [12, 2048], [12, 2048], // 000000010011x
28711 [12, 2112], [12, 2112], // 000000010100x
28712 [12, 2176], [12, 2176], // 000000010101x
28713 [12, 2240], [12, 2240], // 000000010110x
28714 [12, 2304], [12, 2304], // 000000010111x
28715 [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
28716 [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
28717 [12, 2368], [12, 2368], // 000000011100x
28718 [12, 2432], [12, 2432], // 000000011101x
28719 [12, 2496], [12, 2496], // 000000011110x
28720 [12, 2560], [12, 2560], // 000000011111x
28721 [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx
28722 [10, 18], [10, 18], [10, 18], [10, 18],
28723 [12, 52], [12, 52], // 000000100100x
28724 [13, 640], // 0000001001010
28725 [13, 704], // 0000001001011
28726 [13, 768], // 0000001001100
28727 [13, 832], // 0000001001101
28728 [12, 55], [12, 55], // 000000100111x
28729 [12, 56], [12, 56], // 000000101000x
28730 [13, 1280], // 0000001010010
28731 [13, 1344], // 0000001010011
28732 [13, 1408], // 0000001010100
28733 [13, 1472], // 0000001010101
28734 [12, 59], [12, 59], // 000000101011x
28735 [12, 60], [12, 60], // 000000101100x
28736 [13, 1536], // 0000001011010
28737 [13, 1600], // 0000001011011
28738 [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx
28739 [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx
28740 [13, 1664], // 0000001100100
28741 [13, 1728], // 0000001100101
28742 [12, 320], [12, 320], // 000000110011x
28743 [12, 384], [12, 384], // 000000110100x
28744 [12, 448], [12, 448], // 000000110101x
28745 [13, 512], // 0000001101100
28746 [13, 576], // 0000001101101
28747 [12, 53], [12, 53], // 000000110111x
28748 [12, 54], [12, 54], // 000000111000x
28749 [13, 896], // 0000001110010
28750 [13, 960], // 0000001110011
28751 [13, 1024], // 0000001110100
28752 [13, 1088], // 0000001110101
28753 [13, 1152], // 0000001110110
28754 [13, 1216], // 0000001110111
28755 [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx
28756 [10, 64], [10, 64], [10, 64], [10, 64]
28759 var blackTable2 = [
28760 [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx
28761 [8, 13], [8, 13], [8, 13], [8, 13],
28762 [8, 13], [8, 13], [8, 13], [8, 13],
28763 [8, 13], [8, 13], [8, 13], [8, 13],
28764 [11, 23], [11, 23], // 00000101000x
28765 [12, 50], // 000001010010
28766 [12, 51], // 000001010011
28767 [12, 44], // 000001010100
28768 [12, 45], // 000001010101
28769 [12, 46], // 000001010110
28770 [12, 47], // 000001010111
28771 [12, 57], // 000001011000
28772 [12, 58], // 000001011001
28773 [12, 61], // 000001011010
28774 [12, 256], // 000001011011
28775 [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
28776 [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
28777 [12, 48], // 000001100100
28778 [12, 49], // 000001100101
28779 [12, 62], // 000001100110
28780 [12, 63], // 000001100111
28781 [12, 30], // 000001101000
28782 [12, 31], // 000001101001
28783 [12, 32], // 000001101010
28784 [12, 33], // 000001101011
28785 [12, 40], // 000001101100
28786 [12, 41], // 000001101101
28787 [11, 22], [11, 22], // 00000110111x
28788 [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx
28789 [8, 14], [8, 14], [8, 14], [8, 14],
28790 [8, 14], [8, 14], [8, 14], [8, 14],
28791 [8, 14], [8, 14], [8, 14], [8, 14],
28792 [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx
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, 10], [7, 10], [7, 10], [7, 10],
28800 [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx
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 [7, 11], [7, 11], [7, 11], [7, 11],
28808 [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx
28809 [9, 15], [9, 15], [9, 15], [9, 15],
28810 [12, 128], // 000011001000
28811 [12, 192], // 000011001001
28812 [12, 26], // 000011001010
28813 [12, 27], // 000011001011
28814 [12, 28], // 000011001100
28815 [12, 29], // 000011001101
28816 [11, 19], [11, 19], // 00001100111x
28817 [11, 20], [11, 20], // 00001101000x
28818 [12, 34], // 000011010010
28819 [12, 35], // 000011010011
28820 [12, 36], // 000011010100
28821 [12, 37], // 000011010101
28822 [12, 38], // 000011010110
28823 [12, 39], // 000011010111
28824 [11, 21], [11, 21], // 00001101100x
28825 [12, 42], // 000011011010
28826 [12, 43], // 000011011011
28827 [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx
28828 [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx
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 [7, 12], [7, 12], [7, 12], [7, 12]
28838 var blackTable3 = [
28839 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
28842 [5, 7], [5, 7], // 00011x
28843 [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx
28844 [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx
28845 [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx
28846 [3, 1], [3, 1], [3, 1], [3, 1],
28847 [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx
28848 [3, 4], [3, 4], [3, 4], [3, 4],
28849 [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx
28850 [2, 3], [2, 3], [2, 3], [2, 3],
28851 [2, 3], [2, 3], [2, 3], [2, 3],
28852 [2, 3], [2, 3], [2, 3], [2, 3],
28853 [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx
28854 [2, 2], [2, 2], [2, 2], [2, 2],
28855 [2, 2], [2, 2], [2, 2], [2, 2],
28856 [2, 2], [2, 2], [2, 2], [2, 2]
28859 function CCITTFaxStream(str, params) {
28861 this.dict = str.dict;
28863 params = params || new Dict();
28865 this.encoding = params.get('K') || 0;
28866 this.eoline = params.get('EndOfLine') || false;
28867 this.byteAlign = params.get('EncodedByteAlign') || false;
28868 this.columns = params.get('Columns') || 1728;
28869 this.rows = params.get('Rows') || 0;
28870 var eoblock = params.get('EndOfBlock');
28871 if (eoblock == null)
28873 this.eoblock = eoblock;
28874 this.black = params.get('BlackIs1') || false;
28876 this.codingLine = new Uint32Array(this.columns + 1);
28877 this.refLine = new Uint32Array(this.columns + 2);
28879 this.codingLine[0] = this.columns;
28880 this.codingPos = 0;
28883 this.nextLine2D = this.encoding < 0;
28884 this.inputBits = 0;
28886 this.outputBits = 0;
28890 while ((code1 = this.lookBits(12)) == 0) {
28896 if (this.encoding > 0) {
28897 this.nextLine2D = !this.lookBits(1);
28901 DecodeStream.call(this);
28904 CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
28906 CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
28907 while (!this.eof) {
28908 var c = this.lookChar();
28910 this.ensureBuffer(this.bufferLength + 1);
28911 this.buffer[this.bufferLength++] = c;
28915 CCITTFaxStream.prototype.addPixels =
28916 function ccittFaxStreamAddPixels(a1, blackPixels) {
28917 var codingLine = this.codingLine;
28918 var codingPos = this.codingPos;
28920 if (a1 > codingLine[codingPos]) {
28921 if (a1 > this.columns) {
28922 warn('row is wrong length');
28926 if ((codingPos & 1) ^ blackPixels) {
28930 codingLine[codingPos] = a1;
28932 this.codingPos = codingPos;
28935 CCITTFaxStream.prototype.addPixelsNeg =
28936 function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
28937 var codingLine = this.codingLine;
28938 var codingPos = this.codingPos;
28940 if (a1 > codingLine[codingPos]) {
28941 if (a1 > this.columns) {
28942 warn('row is wrong length');
28946 if ((codingPos & 1) ^ blackPixels)
28949 codingLine[codingPos] = a1;
28950 } else if (a1 < codingLine[codingPos]) {
28952 warn('invalid code');
28956 while (codingPos > 0 && a1 < codingLine[codingPos - 1])
28958 codingLine[codingPos] = a1;
28961 this.codingPos = codingPos;
28964 CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
28965 if (this.buf != EOF)
28968 var refLine = this.refLine;
28969 var codingLine = this.codingLine;
28970 var columns = this.columns;
28972 var refPos, blackPixels, bits;
28974 if (this.outputBits == 0) {
28980 var code1, code2, code3;
28981 if (this.nextLine2D) {
28982 for (var i = 0; codingLine[i] < columns; ++i)
28983 refLine[i] = codingLine[i];
28985 refLine[i++] = columns;
28986 refLine[i] = columns;
28988 this.codingPos = 0;
28992 while (codingLine[this.codingPos] < columns) {
28993 code1 = this.getTwoDimCode();
28996 this.addPixels(refLine[refPos + 1], blackPixels);
28997 if (refLine[refPos + 1] < columns)
29004 code1 += (code3 = this.getBlackCode());
29005 } while (code3 >= 64);
29007 code2 += (code3 = this.getWhiteCode());
29008 } while (code3 >= 64);
29011 code1 += (code3 = this.getWhiteCode());
29012 } while (code3 >= 64);
29014 code2 += (code3 = this.getBlackCode());
29015 } while (code3 >= 64);
29017 this.addPixels(codingLine[this.codingPos] +
29018 code1, blackPixels);
29019 if (codingLine[this.codingPos] < columns) {
29020 this.addPixels(codingLine[this.codingPos] + code2,
29023 while (refLine[refPos] <= codingLine[this.codingPos] &&
29024 refLine[refPos] < columns) {
29029 this.addPixels(refLine[refPos] + 3, blackPixels);
29031 if (codingLine[this.codingPos] < columns) {
29033 while (refLine[refPos] <= codingLine[this.codingPos] &&
29034 refLine[refPos] < columns)
29039 this.addPixels(refLine[refPos] + 2, blackPixels);
29041 if (codingLine[this.codingPos] < columns) {
29043 while (refLine[refPos] <= codingLine[this.codingPos] &&
29044 refLine[refPos] < columns) {
29050 this.addPixels(refLine[refPos] + 1, blackPixels);
29052 if (codingLine[this.codingPos] < columns) {
29054 while (refLine[refPos] <= codingLine[this.codingPos] &&
29055 refLine[refPos] < columns)
29060 this.addPixels(refLine[refPos], blackPixels);
29062 if (codingLine[this.codingPos] < columns) {
29064 while (refLine[refPos] <= codingLine[this.codingPos] &&
29065 refLine[refPos] < columns)
29070 this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
29072 if (codingLine[this.codingPos] < columns) {
29077 while (refLine[refPos] <= codingLine[this.codingPos] &&
29078 refLine[refPos] < columns)
29083 this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
29085 if (codingLine[this.codingPos] < columns) {
29090 while (refLine[refPos] <= codingLine[this.codingPos] &&
29091 refLine[refPos] < columns)
29096 this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
29098 if (codingLine[this.codingPos] < columns) {
29104 while (refLine[refPos] <= codingLine[this.codingPos] &&
29105 refLine[refPos] < columns)
29110 this.addPixels(columns, 0);
29114 warn('bad 2d code');
29115 this.addPixels(columns, 0);
29121 this.codingPos = 0;
29123 while (codingLine[this.codingPos] < columns) {
29127 code1 += (code3 = this.getBlackCode());
29128 } while (code3 >= 64);
29131 code1 += (code3 = this.getWhiteCode());
29132 } while (code3 >= 64);
29134 this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
29139 if (this.byteAlign)
29140 this.inputBits &= ~7;
29142 var gotEOL = false;
29144 if (!this.eoblock && this.row == this.rows - 1) {
29147 code1 = this.lookBits(12);
29148 while (code1 == 0) {
29150 code1 = this.lookBits(12);
29155 } else if (code1 == EOF) {
29160 if (!this.eof && this.encoding > 0) {
29161 this.nextLine2D = !this.lookBits(1);
29165 if (this.eoblock && gotEOL) {
29166 code1 = this.lookBits(12);
29169 if (this.encoding > 0) {
29173 if (this.encoding >= 0) {
29174 for (var i = 0; i < 4; ++i) {
29175 code1 = this.lookBits(12);
29177 warn('bad rtc code: ' + code1);
29179 if (this.encoding > 0) {
29187 } else if (this.err && this.eoline) {
29189 code1 = this.lookBits(13);
29190 if (code1 == EOF) {
29194 if ((code1 >> 1) == 1) {
29200 if (this.encoding > 0) {
29202 this.nextLine2D = !(code1 & 1);
29206 if (codingLine[0] > 0)
29207 this.outputBits = codingLine[this.codingPos = 0];
29209 this.outputBits = codingLine[this.codingPos = 1];
29213 if (this.outputBits >= 8) {
29214 this.buf = (this.codingPos & 1) ? 0 : 0xFF;
29215 this.outputBits -= 8;
29216 if (this.outputBits == 0 && codingLine[this.codingPos] < columns) {
29218 this.outputBits = (codingLine[this.codingPos] -
29219 codingLine[this.codingPos - 1]);
29225 if (this.outputBits > bits) {
29227 if (!(this.codingPos & 1)) {
29228 this.buf |= 0xFF >> (8 - bits);
29230 this.outputBits -= bits;
29233 this.buf <<= this.outputBits;
29234 if (!(this.codingPos & 1)) {
29235 this.buf |= 0xFF >> (8 - this.outputBits);
29237 bits -= this.outputBits;
29238 this.outputBits = 0;
29239 if (codingLine[this.codingPos] < columns) {
29241 this.outputBits = (codingLine[this.codingPos] -
29242 codingLine[this.codingPos - 1]);
29243 } else if (bits > 0) {
29256 // This functions returns the code found from the table.
29257 // The start and end parameters set the boundaries for searching the table.
29258 // The limit parameter is optional. Function returns an array with three
29259 // values. The first array element indicates whether a valid code is being
29260 // returned. The second array element is the actual code. The third array
29261 // element indicates whether EOF was reached.
29262 CCITTFaxStream.prototype.findTableCode =
29263 function ccittFaxStreamFindTableCode(start, end, table, limit) {
29265 var limitValue = limit || 0;
29266 for (var i = start; i <= end; ++i) {
29267 var code = this.lookBits(i);
29269 return [true, 1, false];
29272 if (!limitValue || code >= limitValue) {
29273 var p = table[code - limitValue];
29276 return [true, p[1], true];
29280 return [false, 0, false];
29283 CCITTFaxStream.prototype.getTwoDimCode =
29284 function ccittFaxStreamGetTwoDimCode() {
29288 if (this.eoblock) {
29289 code = this.lookBits(7);
29290 p = twoDimTable[code];
29291 if (p && p[0] > 0) {
29292 this.eatBits(p[0]);
29296 var result = this.findTableCode(1, 7, twoDimTable);
29297 if (result[0] && result[2])
29300 warn('Bad two dim code');
29304 CCITTFaxStream.prototype.getWhiteCode =
29305 function ccittFaxStreamGetWhiteCode() {
29310 if (this.eoblock) {
29311 code = this.lookBits(12);
29315 if ((code >> 5) == 0)
29316 p = whiteTable1[code];
29318 p = whiteTable2[code >> 3];
29321 this.eatBits(p[0]);
29325 var result = this.findTableCode(1, 9, whiteTable2);
29329 result = this.findTableCode(11, 12, whiteTable1);
29333 warn('bad white code');
29338 CCITTFaxStream.prototype.getBlackCode =
29339 function ccittFaxStreamGetBlackCode() {
29342 if (this.eoblock) {
29343 code = this.lookBits(13);
29346 if ((code >> 7) == 0)
29347 p = blackTable1[code];
29348 else if ((code >> 9) == 0 && (code >> 7) != 0)
29349 p = blackTable2[(code >> 1) - 64];
29351 p = blackTable3[code >> 7];
29354 this.eatBits(p[0]);
29358 var result = this.findTableCode(2, 6, blackTable3);
29362 result = this.findTableCode(7, 12, blackTable2, 64);
29366 result = this.findTableCode(10, 13, blackTable1);
29370 warn('bad black code');
29375 CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
29377 while (this.inputBits < n) {
29378 if ((c = this.str.getByte()) == null) {
29379 if (this.inputBits == 0)
29381 return ((this.inputBuf << (n - this.inputBits)) &
29382 (0xFFFF >> (16 - n)));
29384 this.inputBuf = (this.inputBuf << 8) + c;
29385 this.inputBits += 8;
29387 return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
29390 CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
29391 if ((this.inputBits -= n) < 0)
29392 this.inputBits = 0;
29395 return CCITTFaxStream;
29398 var LZWStream = (function LZWStreamClosure() {
29399 function LZWStream(str, earlyChange) {
29401 this.dict = str.dict;
29402 this.cachedData = 0;
29403 this.bitsCached = 0;
29405 var maxLzwDictionarySize = 4096;
29407 earlyChange: earlyChange,
29410 dictionaryValues: new Uint8Array(maxLzwDictionarySize),
29411 dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
29412 dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
29413 currentSequence: new Uint8Array(maxLzwDictionarySize),
29414 currentSequenceLength: 0
29416 for (var i = 0; i < 256; ++i) {
29417 lzwState.dictionaryValues[i] = i;
29418 lzwState.dictionaryLengths[i] = 1;
29420 this.lzwState = lzwState;
29422 DecodeStream.call(this);
29425 LZWStream.prototype = Object.create(DecodeStream.prototype);
29427 LZWStream.prototype.readBits = function LZWStream_readBits(n) {
29428 var bitsCached = this.bitsCached;
29429 var cachedData = this.cachedData;
29430 while (bitsCached < n) {
29431 var c = this.str.getByte();
29436 cachedData = (cachedData << 8) | c;
29439 this.bitsCached = (bitsCached -= n);
29440 this.cachedData = cachedData;
29441 this.lastCode = null;
29442 return (cachedData >>> bitsCached) & ((1 << n) - 1);
29445 LZWStream.prototype.readBlock = function LZWStream_readBlock() {
29446 var blockSize = 512;
29447 var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
29450 var lzwState = this.lzwState;
29452 return; // eof was found
29454 var earlyChange = lzwState.earlyChange;
29455 var nextCode = lzwState.nextCode;
29456 var dictionaryValues = lzwState.dictionaryValues;
29457 var dictionaryLengths = lzwState.dictionaryLengths;
29458 var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
29459 var codeLength = lzwState.codeLength;
29460 var prevCode = lzwState.prevCode;
29461 var currentSequence = lzwState.currentSequence;
29462 var currentSequenceLength = lzwState.currentSequenceLength;
29464 var decodedLength = 0;
29465 var currentBufferLength = this.bufferLength;
29466 var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
29468 for (i = 0; i < blockSize; i++) {
29469 var code = this.readBits(codeLength);
29470 var hasPrev = currentSequenceLength > 0;
29472 currentSequence[0] = code;
29473 currentSequenceLength = 1;
29474 } else if (code >= 258) {
29475 if (code < nextCode) {
29476 currentSequenceLength = dictionaryLengths[code];
29477 for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
29478 currentSequence[j] = dictionaryValues[q];
29479 q = dictionaryPrevCodes[q];
29482 currentSequence[currentSequenceLength++] = currentSequence[0];
29484 } else if (code == 256) {
29487 currentSequenceLength = 0;
29491 delete this.lzwState;
29496 dictionaryPrevCodes[nextCode] = prevCode;
29497 dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
29498 dictionaryValues[nextCode] = currentSequence[0];
29500 codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
29501 codeLength : Math.min(Math.log(nextCode + earlyChange) /
29502 0.6931471805599453 + 1, 12) | 0;
29506 decodedLength += currentSequenceLength;
29507 if (estimatedDecodedSize < decodedLength) {
29509 estimatedDecodedSize += decodedSizeDelta;
29510 } while (estimatedDecodedSize < decodedLength);
29511 buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
29513 for (j = 0; j < currentSequenceLength; j++)
29514 buffer[currentBufferLength++] = currentSequence[j];
29516 lzwState.nextCode = nextCode;
29517 lzwState.codeLength = codeLength;
29518 lzwState.prevCode = prevCode;
29519 lzwState.currentSequenceLength = currentSequenceLength;
29521 this.bufferLength = currentBufferLength;
29528 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
29529 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
29533 function MessageHandler(name, comObj) {
29535 this.comObj = comObj;
29536 this.callbackIndex = 1;
29537 var callbacks = this.callbacks = {};
29538 var ah = this.actionHandler = {};
29540 ah['console_log'] = [function ahConsoleLog(data) {
29541 PdfJS_window.console.log.apply(PdfJS_window.console, data);
29543 ah['console_error'] = [function ahConsoleError(data) {
29544 PdfJS_window.console.error.apply(PdfJS_window.console, data);
29547 comObj.onmessage = function messageHandlerComObjOnMessage(event) {
29548 var data = event.data;
29549 if (data.isReply) {
29550 var callbackId = data.callbackId;
29551 if (data.callbackId in callbacks) {
29552 var callback = callbacks[callbackId];
29553 delete callbacks[callbackId];
29554 callback(data.data);
29556 error('Cannot resolve callback ' + callbackId);
29558 } else if (data.action in ah) {
29559 var action = ah[data.action];
29560 if (data.callbackId) {
29561 var promise = new Promise();
29562 promise.then(function(resolvedData) {
29563 comObj.postMessage({
29565 callbackId: data.callbackId,
29569 action[0].call(action[1], data.data, promise);
29571 action[0].call(action[1], data.data);
29574 error('Unkown action from worker: ' + data.action);
29579 MessageHandler.prototype = {
29580 on: function messageHandlerOn(actionName, handler, scope) {
29581 var ah = this.actionHandler;
29582 if (ah[actionName]) {
29583 error('There is already an actionName called "' + actionName + '"');
29585 ah[actionName] = [handler, scope];
29588 * Sends a message to the comObj to invoke the action with the supplied data.
29589 * @param {String} actionName Action to call.
29590 * @param {JSON} data JSON data to send.
29591 * @param {function} [callback] Optional callback that will handle a reply.
29593 send: function messageHandlerSend(actionName, data, callback) {
29595 action: actionName,
29599 var callbackId = this.callbackIndex++;
29600 this.callbacks[callbackId] = callback;
29601 message.callbackId = callbackId;
29603 this.comObj.postMessage(message);
29607 var WorkerMessageHandler = {
29608 setup: function wphSetup(handler) {
29609 var pdfModel = null;
29611 handler.on('test', function wphSetupTest(data) {
29612 handler.send('test', data instanceof Uint8Array);
29615 handler.on('GetDocRequest', function wphSetupDoc(data) {
29616 // Create only the model of the PDFDoc, which is enough for
29617 // processing the content of the pdf.
29618 pdfModel = new PDFDocument(new Stream(data));
29620 numPages: pdfModel.numPages,
29621 fingerprint: pdfModel.getFingerprint(),
29622 destinations: pdfModel.catalog.destinations,
29623 outline: pdfModel.catalog.documentOutline,
29624 info: pdfModel.getDocumentInfo(),
29625 metadata: pdfModel.catalog.metadata
29627 handler.send('GetDoc', {pdfInfo: doc});
29630 handler.on('GetPageRequest', function wphSetupGetPage(data) {
29631 var pageNumber = data.pageIndex + 1;
29632 var pdfPage = pdfModel.getPage(pageNumber);
29634 pageIndex: data.pageIndex,
29635 rotate: pdfPage.rotate,
29639 handler.send('GetPage', {pageInfo: page});
29642 handler.on('GetAnnotationsRequest', function wphSetupGetAnnotations(data) {
29643 var pdfPage = pdfModel.getPage(data.pageIndex + 1);
29644 handler.send('GetAnnotations', {
29645 pageIndex: data.pageIndex,
29646 annotations: pdfPage.getAnnotations()
29650 handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
29651 var pageNum = data.pageIndex + 1;
29654 // The following code does quite the same as
29655 // Page.prototype.startRendering, but stops at one point and sends the
29656 // result back to the main thread.
29657 var gfx = new CanvasGraphics(null);
29659 var start = Date.now();
29661 var dependency = [];
29662 var operatorList = null;
29664 var page = pdfModel.getPage(pageNum);
29665 // Pre compile the pdf page and fetch the fonts/images.
29666 operatorList = page.getOperatorList(handler, dependency);
29668 var minimumStackMessage =
29669 'worker.js: while trying to getPage() and getOperatorList()';
29671 // Turn the error into an obj that can be serialized
29672 if (typeof e === 'string') {
29675 stack: minimumStackMessage
29677 } else if (typeof e === 'object') {
29679 message: e.message || e.toString(),
29680 stack: e.stack || minimumStackMessage
29684 message: 'Unknown exception type: ' + (typeof e),
29685 stack: minimumStackMessage
29689 handler.send('PageError', {
29696 // Filter the dependecies for fonts.
29698 for (var i = 0, ii = dependency.length; i < ii; i++) {
29699 var dep = dependency[i];
29700 if (dep.indexOf('font_') == 0) {
29704 handler.send('RenderPage', {
29705 pageIndex: data.pageIndex,
29706 operatorList: operatorList,
29707 depFonts: Object.keys(fonts)
29713 var consoleTimer = {};
29715 var workerConsole = {
29716 log: function log() {
29717 var args = Array.prototype.slice.call(arguments);
29719 action: 'console_log',
29724 error: function error() {
29725 var args = Array.prototype.slice.call(arguments);
29727 action: 'console_error',
29730 throw 'pdf.js execution error';
29733 time: function time(name) {
29734 consoleTimer[name] = Date.now();
29737 timeEnd: function timeEnd(name) {
29738 var time = consoleTimer[name];
29739 if (time == null) {
29740 error('Unkown timer name ' + name);
29742 this.log('Timer:', name, Date.now() - time);
29747 if (typeof PdfJS_window.window === 'undefined') {
29748 globalScope.console = workerConsole;
29750 var handler = new MessageHandler('worker_processor', this);
29751 WorkerMessageHandler.setup(handler);
29755 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
29756 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
29758 // - The JPEG specification can be found in the ITU CCITT Recommendation T.81
29759 // (www.w3.org/Graphics/JPEG/itu-t81.pdf)
29760 // - The JFIF specification can be found in the JPEG File Interchange Format
29761 // (www.w3.org/Graphics/JPEG/jfif3.pdf)
29762 // - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
29763 // in PostScript Level 2, Technical Note #5116
29764 // (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
29766 var JpegImage = (function jpegImage() {
29768 var dctZigZag = new Int32Array([
29774 5, 12, 19, 26, 33, 40,
29775 48, 41, 34, 27, 20, 13, 6,
29776 7, 14, 21, 28, 35, 42, 49, 56,
29777 57, 50, 43, 36, 29, 22, 15,
29778 23, 30, 37, 44, 51, 58,
29779 59, 52, 45, 38, 31,
29786 var dctCos1 = 4017 // cos(pi/16)
29787 var dctSin1 = 799 // sin(pi/16)
29788 var dctCos3 = 3406 // cos(3*pi/16)
29789 var dctSin3 = 2276 // sin(3*pi/16)
29790 var dctCos6 = 1567 // cos(6*pi/16)
29791 var dctSin6 = 3784 // sin(6*pi/16)
29792 var dctSqrt2 = 5793 // sqrt(2)
29793 var dctSqrt1d2 = 2896 // sqrt(2) / 2
29795 function constructor() {
29798 function buildHuffmanTable(codeLengths, values) {
29799 var k = 0, code = [], i, j, length = 16;
29800 while (length > 0 && !codeLengths[length - 1])
29802 code.push({children: [], index: 0});
29803 var p = code[0], q;
29804 for (i = 0; i < length; i++) {
29805 for (j = 0; j < codeLengths[i]; j++) {
29807 p.children[p.index] = values[k];
29808 while (p.index > 0) {
29813 while (code.length <= i) {
29814 code.push(q = {children: [], index: 0});
29815 p.children[p.index] = q.children;
29820 if (i + 1 < length) {
29821 // p here points to last code
29822 code.push(q = {children: [], index: 0});
29823 p.children[p.index] = q.children;
29827 return code[0].children;
29830 function decodeScan(data, offset,
29831 frame, components, resetInterval,
29832 spectralStart, spectralEnd,
29833 successivePrev, successive) {
29834 var precision = frame.precision;
29835 var samplesPerLine = frame.samplesPerLine;
29836 var scanLines = frame.scanLines;
29837 var mcusPerLine = frame.mcusPerLine;
29838 var progressive = frame.progressive;
29839 var maxH = frame.maxH, maxV = frame.maxV;
29841 var startOffset = offset, bitsData = 0, bitsCount = 0;
29842 function readBit() {
29843 if (bitsCount > 0) {
29845 return (bitsData >> bitsCount) & 1;
29847 bitsData = data[offset++];
29848 if (bitsData == 0xFF) {
29849 var nextByte = data[offset++];
29851 throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
29856 return bitsData >>> 7;
29858 function decodeHuffman(tree) {
29859 var node = tree, bit;
29860 while ((bit = readBit()) !== null) {
29862 if (typeof node === 'number')
29864 if (typeof node !== 'object')
29865 throw "invalid huffman sequence";
29869 function receive(length) {
29871 while (length > 0) {
29872 var bit = readBit();
29873 if (bit === null) return;
29874 n = (n << 1) | bit;
29879 function receiveAndExtend(length) {
29880 var n = receive(length);
29881 if (n >= 1 << (length - 1))
29883 return n + (-1 << length) + 1;
29885 function decodeBaseline(component, zz) {
29886 var t = decodeHuffman(component.huffmanTableDC);
29887 var diff = t === 0 ? 0 : receiveAndExtend(t);
29888 zz[0]= (component.pred += diff);
29891 var rs = decodeHuffman(component.huffmanTableAC);
29892 var s = rs & 15, r = rs >> 4;
29900 var z = dctZigZag[k];
29901 zz[z] = receiveAndExtend(s);
29905 function decodeDCFirst(component, zz) {
29906 var t = decodeHuffman(component.huffmanTableDC);
29907 var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
29908 zz[0] = (component.pred += diff);
29910 function decodeDCSuccessive(component, zz) {
29911 zz[0] |= readBit() << successive;
29914 function decodeACFirst(component, zz) {
29919 var k = spectralStart, e = spectralEnd;
29921 var rs = decodeHuffman(component.huffmanTableAC);
29922 var s = rs & 15, r = rs >> 4;
29925 eobrun = receive(r) + (1 << r) - 1;
29932 var z = dctZigZag[k];
29933 zz[z] = receiveAndExtend(s) * (1 << successive);
29937 var successiveACState = 0, successiveACNextValue;
29938 function decodeACSuccessive(component, zz) {
29939 var k = spectralStart, e = spectralEnd, r = 0;
29941 var z = dctZigZag[k];
29942 switch (successiveACState) {
29943 case 0: // initial state
29944 var rs = decodeHuffman(component.huffmanTableAC);
29945 var s = rs & 15, r = rs >> 4;
29948 eobrun = receive(r) + (1 << r);
29949 successiveACState = 4;
29952 successiveACState = 1;
29956 throw "invalid ACn encoding";
29957 successiveACNextValue = receiveAndExtend(s);
29958 successiveACState = r ? 2 : 3;
29961 case 1: // skipping r zero items
29964 zz[z] += (readBit() << successive);
29968 successiveACState = successiveACState == 2 ? 3 : 0;
29971 case 3: // set value for a zero item
29973 zz[z] += (readBit() << successive);
29975 zz[z] = successiveACNextValue << successive;
29976 successiveACState = 0;
29981 zz[z] += (readBit() << successive);
29986 if (successiveACState === 4) {
29989 successiveACState = 0;
29992 function decodeMcu(component, decode, mcu, row, col) {
29993 var mcuRow = (mcu / mcusPerLine) | 0;
29994 var mcuCol = mcu % mcusPerLine;
29995 var blockRow = mcuRow * component.v + row;
29996 var blockCol = mcuCol * component.h + col;
29997 decode(component, component.blocks[blockRow][blockCol]);
29999 function decodeBlock(component, decode, mcu) {
30000 var blockRow = (mcu / component.blocksPerLine) | 0;
30001 var blockCol = mcu % component.blocksPerLine;
30002 decode(component, component.blocks[blockRow][blockCol]);
30005 var componentsLength = components.length;
30006 var component, i, j, k, n;
30009 if (spectralStart === 0)
30010 decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
30012 decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
30014 decodeFn = decodeBaseline;
30017 var mcu = 0, marker;
30019 if (componentsLength == 1) {
30020 mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
30022 mcuExpected = mcusPerLine * frame.mcusPerColumn;
30024 if (!resetInterval) resetInterval = mcuExpected;
30027 while (mcu < mcuExpected) {
30028 // reset interval stuff
30029 for (i = 0; i < componentsLength; i++)
30030 components[i].pred = 0;
30033 if (componentsLength == 1) {
30034 component = components[0];
30035 for (n = 0; n < resetInterval; n++) {
30036 decodeBlock(component, decodeFn, mcu);
30040 for (n = 0; n < resetInterval; n++) {
30041 for (i = 0; i < componentsLength; i++) {
30042 component = components[i];
30045 for (j = 0; j < v; j++) {
30046 for (k = 0; k < h; k++) {
30047 decodeMcu(component, decodeFn, mcu, j, k);
30057 marker = (data[offset] << 8) | data[offset + 1];
30058 if (marker <= 0xFF00) {
30059 throw "marker was not found";
30062 if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
30069 return offset - startOffset;
30072 function buildComponentData(frame, component) {
30074 var blocksPerLine = component.blocksPerLine;
30075 var blocksPerColumn = component.blocksPerColumn;
30076 var samplesPerLine = blocksPerLine << 3;
30077 var R = new Int32Array(64), r = new Uint8Array(64);
30079 // A port of poppler's IDCT method which in turn is taken from:
30080 // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
30081 // "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
30082 // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
30084 function quantizeAndInverse(zz, dataOut, dataIn) {
30085 var qt = component.quantizationTable;
30086 var v0, v1, v2, v3, v4, v5, v6, v7, t;
30091 for (i = 0; i < 64; i++)
30092 p[i] = zz[i] * qt[i];
30094 // inverse DCT on rows
30095 for (i = 0; i < 8; ++i) {
30098 // check for all-zero AC coefficients
30099 if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 &&
30100 p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 &&
30102 t = (dctSqrt2 * p[0 + row] + 512) >> 10;
30115 v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
30116 v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
30119 v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8;
30120 v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8;
30121 v5 = p[3 + row] << 4;
30122 v6 = p[5 + row] << 4;
30125 t = (v0 - v1+ 1) >> 1;
30126 v0 = (v0 + v1 + 1) >> 1;
30128 t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
30129 v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
30131 t = (v4 - v6 + 1) >> 1;
30132 v4 = (v4 + v6 + 1) >> 1;
30134 t = (v7 + v5 + 1) >> 1;
30135 v5 = (v7 - v5 + 1) >> 1;
30139 t = (v0 - v3 + 1) >> 1;
30140 v0 = (v0 + v3 + 1) >> 1;
30142 t = (v1 - v2 + 1) >> 1;
30143 v1 = (v1 + v2 + 1) >> 1;
30145 t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
30146 v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
30148 t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
30149 v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
30153 p[0 + row] = v0 + v7;
30154 p[7 + row] = v0 - v7;
30155 p[1 + row] = v1 + v6;
30156 p[6 + row] = v1 - v6;
30157 p[2 + row] = v2 + v5;
30158 p[5 + row] = v2 - v5;
30159 p[3 + row] = v3 + v4;
30160 p[4 + row] = v3 - v4;
30163 // inverse DCT on columns
30164 for (i = 0; i < 8; ++i) {
30167 // check for all-zero AC coefficients
30168 if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 &&
30169 p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 &&
30170 p[7*8 + col] == 0) {
30171 t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;
30184 v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
30185 v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
30188 v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12;
30189 v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12;
30194 t = (v0 - v1 + 1) >> 1;
30195 v0 = (v0 + v1 + 1) >> 1;
30197 t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
30198 v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
30200 t = (v4 - v6 + 1) >> 1;
30201 v4 = (v4 + v6 + 1) >> 1;
30203 t = (v7 + v5 + 1) >> 1;
30204 v5 = (v7 - v5 + 1) >> 1;
30208 t = (v0 - v3 + 1) >> 1;
30209 v0 = (v0 + v3 + 1) >> 1;
30211 t = (v1 - v2 + 1) >> 1;
30212 v1 = (v1 + v2 + 1) >> 1;
30214 t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
30215 v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
30217 t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
30218 v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
30222 p[0*8 + col] = v0 + v7;
30223 p[7*8 + col] = v0 - v7;
30224 p[1*8 + col] = v1 + v6;
30225 p[6*8 + col] = v1 - v6;
30226 p[2*8 + col] = v2 + v5;
30227 p[5*8 + col] = v2 - v5;
30228 p[3*8 + col] = v3 + v4;
30229 p[4*8 + col] = v3 - v4;
30232 // convert to 8-bit integers
30233 for (i = 0; i < 64; ++i) {
30234 var sample = 128 + ((p[i] + 8) >> 4);
30235 dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample;
30240 for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
30241 var scanLine = blockRow << 3;
30242 for (i = 0; i < 8; i++)
30243 lines.push(new Uint8Array(samplesPerLine));
30244 for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
30245 quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
30247 var offset = 0, sample = blockCol << 3;
30248 for (j = 0; j < 8; j++) {
30249 var line = lines[scanLine + j];
30250 for (i = 0; i < 8; i++)
30251 line[sample + i] = r[offset++];
30258 constructor.prototype = {
30259 load: function load(path) {
30260 var xhr = new PdfJS_window.XMLHttpRequest();
30261 xhr.open("GET", path, true);
30262 xhr.responseType = "arraybuffer";
30263 xhr.onload = (function() {
30264 // TODO catch parse error
30265 var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
30272 parse: function parse(data) {
30273 var offset = 0, length = data.length;
30274 function readUint16() {
30275 var value = (data[offset] << 8) | data[offset + 1];
30279 function readDataBlock() {
30280 var length = readUint16();
30281 var array = data.subarray(offset, offset + length - 2);
30282 offset += array.length;
30285 function prepareComponents(frame) {
30286 var maxH = 0, maxV = 0;
30287 var component, componentId;
30288 for (componentId in frame.components) {
30289 if (frame.components.hasOwnProperty(componentId)) {
30290 component = frame.components[componentId];
30291 if (maxH < component.h) maxH = component.h;
30292 if (maxV < component.v) maxV = component.v;
30295 var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
30296 var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
30297 for (componentId in frame.components) {
30298 if (frame.components.hasOwnProperty(componentId)) {
30299 component = frame.components[componentId];
30300 var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
30301 var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);
30302 var blocksPerLineForMcu = mcusPerLine * component.h;
30303 var blocksPerColumnForMcu = mcusPerColumn * component.v;
30305 for (var i = 0; i < blocksPerColumnForMcu; i++) {
30307 for (var j = 0; j < blocksPerLineForMcu; j++)
30308 row.push(new Int32Array(64));
30311 component.blocksPerLine = blocksPerLine;
30312 component.blocksPerColumn = blocksPerColumn;
30313 component.blocks = blocks;
30318 frame.mcusPerLine = mcusPerLine;
30319 frame.mcusPerColumn = mcusPerColumn;
30324 var frame, resetInterval;
30325 var quantizationTables = [], frames = [];
30326 var huffmanTablesAC = [], huffmanTablesDC = [];
30327 var fileMarker = readUint16();
30328 if (fileMarker != 0xFFD8) { // SOI (Start of Image)
30329 throw "SOI not found";
30332 fileMarker = readUint16();
30333 while (fileMarker != 0xFFD9) { // EOI (End of image)
30335 switch(fileMarker) {
30336 case 0xFFE0: // APP0 (Application Specific)
30337 case 0xFFE1: // APP1
30338 case 0xFFE2: // APP2
30339 case 0xFFE3: // APP3
30340 case 0xFFE4: // APP4
30341 case 0xFFE5: // APP5
30342 case 0xFFE6: // APP6
30343 case 0xFFE7: // APP7
30344 case 0xFFE8: // APP8
30345 case 0xFFE9: // APP9
30346 case 0xFFEA: // APP10
30347 case 0xFFEB: // APP11
30348 case 0xFFEC: // APP12
30349 case 0xFFED: // APP13
30350 case 0xFFEE: // APP14
30351 case 0xFFEF: // APP15
30352 case 0xFFFE: // COM (Comment)
30353 var appData = readDataBlock();
30355 if (fileMarker === 0xFFE0) {
30356 if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 &&
30357 appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00'
30359 version: { major: appData[5], minor: appData[6] },
30360 densityUnits: appData[7],
30361 xDensity: (appData[8] << 8) | appData[9],
30362 yDensity: (appData[10] << 8) | appData[11],
30363 thumbWidth: appData[12],
30364 thumbHeight: appData[13],
30365 thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
30369 // TODO APP1 - Exif
30370 if (fileMarker === 0xFFEE) {
30371 if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F &&
30372 appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
30374 version: appData[6],
30375 flags0: (appData[7] << 8) | appData[8],
30376 flags1: (appData[9] << 8) | appData[10],
30377 transformCode: appData[11]
30383 case 0xFFDB: // DQT (Define Quantization Tables)
30384 var quantizationTableCount = Math.floor((readUint16() - 2) / 65);
30385 for (i = 0; i < quantizationTableCount; i++) {
30386 var quantizationTableSpec = data[offset++];
30387 var tableData = new Int32Array(64);
30388 if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
30389 for (j = 0; j < 64; j++) {
30390 var z = dctZigZag[j];
30391 tableData[z] = data[offset++];
30393 } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
30394 for (j = 0; j < 64; j++) {
30395 var z = dctZigZag[j];
30396 tableData[z] = readUint16();
30399 throw "DQT: invalid table spec";
30400 quantizationTables[quantizationTableSpec & 15] = tableData;
30404 case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
30405 case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
30406 readUint16(); // skip data length
30408 frame.progressive = (fileMarker === 0xFFC2);
30409 frame.precision = data[offset++];
30410 frame.scanLines = readUint16();
30411 frame.samplesPerLine = readUint16();
30412 frame.components = {};
30413 frame.componentsOrder = [];
30414 var componentsCount = data[offset++], componentId;
30415 var maxH = 0, maxV = 0;
30416 for (i = 0; i < componentsCount; i++) {
30417 componentId = data[offset];
30418 var h = data[offset + 1] >> 4;
30419 var v = data[offset + 1] & 15;
30420 var qId = data[offset + 2];
30421 frame.componentsOrder.push(componentId);
30422 frame.components[componentId] = {
30425 quantizationTable: quantizationTables[qId]
30429 prepareComponents(frame);
30430 frames.push(frame);
30433 case 0xFFC4: // DHT (Define Huffman Tables)
30434 var huffmanLength = readUint16();
30435 for (i = 2; i < huffmanLength;) {
30436 var huffmanTableSpec = data[offset++];
30437 var codeLengths = new Uint8Array(16);
30438 var codeLengthSum = 0;
30439 for (j = 0; j < 16; j++, offset++)
30440 codeLengthSum += (codeLengths[j] = data[offset]);
30441 var huffmanValues = new Uint8Array(codeLengthSum);
30442 for (j = 0; j < codeLengthSum; j++, offset++)
30443 huffmanValues[j] = data[offset];
30444 i += 17 + codeLengthSum;
30446 ((huffmanTableSpec >> 4) === 0 ?
30447 huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
30448 buildHuffmanTable(codeLengths, huffmanValues);
30452 case 0xFFDD: // DRI (Define Restart Interval)
30453 readUint16(); // skip data length
30454 resetInterval = readUint16();
30457 case 0xFFDA: // SOS (Start of Scan)
30458 var scanLength = readUint16();
30459 var selectorsCount = data[offset++];
30460 var components = [], component;
30461 for (i = 0; i < selectorsCount; i++) {
30462 component = frame.components[data[offset++]];
30463 var tableSpec = data[offset++];
30464 component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
30465 component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
30466 components.push(component);
30468 var spectralStart = data[offset++];
30469 var spectralEnd = data[offset++];
30470 var successiveApproximation = data[offset++];
30471 var processed = decodeScan(data, offset,
30472 frame, components, resetInterval,
30473 spectralStart, spectralEnd,
30474 successiveApproximation >> 4, successiveApproximation & 15);
30475 offset += processed;
30478 throw "unknown JPEG marker " + fileMarker.toString(16);
30480 fileMarker = readUint16();
30482 if (frames.length != 1)
30483 throw "only single frame JPEGs supported";
30485 this.width = frame.samplesPerLine;
30486 this.height = frame.scanLines;
30488 this.adobe = adobe;
30489 this.components = [];
30490 for (var i = 0; i < frame.componentsOrder.length; i++) {
30491 var component = frame.components[frame.componentsOrder[i]];
30492 this.components.push({
30493 lines: buildComponentData(frame, component),
30494 scaleX: component.h / frame.maxH,
30495 scaleY: component.v / frame.maxV
30499 getData: function getData(width, height) {
30500 function clampTo8bit(a) {
30501 return a < 0 ? 0 : a > 255 ? 255 : a;
30503 var scaleX = this.width / width, scaleY = this.height / height;
30505 var component1, component2, component3, component4;
30506 var component1Line, component2Line, component3Line, component4Line;
30509 var Y, Cb, Cr, K, C, M, Ye, R, G, B;
30510 var colorTransform;
30511 var dataLength = width * height * this.components.length;
30512 var data = new Uint8Array(dataLength);
30513 switch (this.components.length) {
30515 component1 = this.components[0];
30516 for (y = 0; y < height; y++) {
30517 component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
30518 for (x = 0; x < width; x++) {
30519 Y = component1Line[0 | (x * component1.scaleX * scaleX)];
30521 data[offset++] = Y;
30526 // The default transform for three components is true
30527 colorTransform = true;
30528 // The adobe transform marker overrides any previous setting
30529 if (this.adobe && this.adobe.transformCode)
30530 colorTransform = true;
30531 else if (typeof this.colorTransform !== 'undefined')
30532 colorTransform = !!this.colorTransform;
30534 component1 = this.components[0];
30535 component2 = this.components[1];
30536 component3 = this.components[2];
30537 for (y = 0; y < height; y++) {
30538 component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
30539 component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
30540 component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
30541 for (x = 0; x < width; x++) {
30542 if (!colorTransform) {
30543 R = component1Line[0 | (x * component1.scaleX * scaleX)];
30544 G = component2Line[0 | (x * component2.scaleX * scaleX)];
30545 B = component3Line[0 | (x * component3.scaleX * scaleX)];
30547 Y = component1Line[0 | (x * component1.scaleX * scaleX)];
30548 Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
30549 Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
30551 R = clampTo8bit(Y + 1.402 * (Cr - 128));
30552 G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
30553 B = clampTo8bit(Y + 1.772 * (Cb - 128));
30556 data[offset++] = R;
30557 data[offset++] = G;
30558 data[offset++] = B;
30564 throw 'Unsupported color mode (4 components)';
30565 // The default transform for four components is false
30566 colorTransform = false;
30567 // The adobe transform marker overrides any previous setting
30568 if (this.adobe && this.adobe.transformCode)
30569 colorTransform = true;
30570 else if (typeof this.colorTransform !== 'undefined')
30571 colorTransform = !!this.colorTransform;
30573 component1 = this.components[0];
30574 component2 = this.components[1];
30575 component3 = this.components[2];
30576 component4 = this.components[3];
30577 for (y = 0; y < height; y++) {
30578 component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)];
30579 component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)];
30580 component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)];
30581 component4Line = component4.lines[0 | (y * component4.scaleY * scaleY)];
30582 for (x = 0; x < width; x++) {
30583 if (!colorTransform) {
30584 C = component1Line[0 | (x * component1.scaleX * scaleX)];
30585 M = component2Line[0 | (x * component2.scaleX * scaleX)];
30586 Ye = component3Line[0 | (x * component3.scaleX * scaleX)];
30587 K = component4Line[0 | (x * component4.scaleX * scaleX)];
30589 Y = component1Line[0 | (x * component1.scaleX * scaleX)];
30590 Cb = component2Line[0 | (x * component2.scaleX * scaleX)];
30591 Cr = component3Line[0 | (x * component3.scaleX * scaleX)];
30592 K = component4Line[0 | (x * component4.scaleX * scaleX)];
30594 C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
30595 M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
30596 Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
30598 data[offset++] = C;
30599 data[offset++] = M;
30600 data[offset++] = Ye;
30601 data[offset++] = K;
30606 throw 'Unsupported color mode';
30610 copyToImageData: function copyToImageData(imageData) {
30611 var width = imageData.width, height = imageData.height;
30612 var imageDataArray = imageData.data;
30613 var data = this.getData(width, height);
30614 var i = 0, j = 0, x, y;
30615 var Y, K, C, M, R, G, B;
30616 switch (this.components.length) {
30618 for (y = 0; y < height; y++) {
30619 for (x = 0; x < width; x++) {
30622 imageDataArray[j++] = Y;
30623 imageDataArray[j++] = Y;
30624 imageDataArray[j++] = Y;
30625 imageDataArray[j++] = 255;
30630 for (y = 0; y < height; y++) {
30631 for (x = 0; x < width; x++) {
30636 imageDataArray[j++] = R;
30637 imageDataArray[j++] = G;
30638 imageDataArray[j++] = B;
30639 imageDataArray[j++] = 255;
30644 for (y = 0; y < height; y++) {
30645 for (x = 0; x < width; x++) {
30651 R = 255 - clampTo8bit(C * (1 - K / 255) + K);
30652 G = 255 - clampTo8bit(M * (1 - K / 255) + K);
30653 B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
30655 imageDataArray[j++] = R;
30656 imageDataArray[j++] = G;
30657 imageDataArray[j++] = B;
30658 imageDataArray[j++] = 255;
30663 throw 'Unsupported color mode';
30668 return constructor;
30670 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
30671 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
30675 var JpxImage = (function JpxImageClosure() {
30677 var SubbandsGainLog2 = {
30683 function JpxImage() {
30684 this.failOnCorruptedImage = false;
30686 JpxImage.prototype = {
30687 load: function JpxImage_load(url) {
30688 var xhr = new PdfJS_window.XMLHttpRequest();
30689 xhr.open('GET', url, true);
30690 xhr.responseType = 'arraybuffer';
30691 xhr.onload = (function() {
30692 // TODO catch parse error
30693 var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
30700 parse: function JpxImage_parse(data) {
30701 function ReadUint(data, offset, bytes) {
30703 for (var i = 0; i < bytes; i++)
30704 n = n * 256 + (data[offset + i] & 0xFF);
30707 var position = 0, length = data.length;
30708 while (position < length) {
30709 var headerSize = 8;
30710 var lbox = ReadUint(data, position, 4);
30711 var tbox = ReadUint(data, position + 4, 4);
30712 position += headerSize;
30714 lbox = ReadUint(data, position, 8);
30719 lbox = length - position + headerSize;
30720 if (lbox < headerSize)
30721 error('JPX error: Invalid box field size');
30722 var dataLength = lbox - headerSize;
30723 var jumpDataLength = true;
30725 case 0x6A501A1A: // 'jP\032\032'
30728 case 0x6A703268: // 'jp2h'
30729 jumpDataLength = false; // parsing child boxes
30731 case 0x636F6C72: // 'colr'
30734 case 0x6A703263: // 'jp2c'
30735 this.parseCodestream(data, position, position + dataLength);
30738 if (jumpDataLength)
30739 position += dataLength;
30742 parseCodestream: function JpxImage_parseCodestream(data, start, end) {
30745 var position = start;
30746 while (position < end) {
30747 var code = readUint16(data, position);
30752 case 0xFF4F: // Start of codestream (SOC)
30753 context.mainHeader = true;
30755 case 0xFFD9: // End of codestream (EOC)
30757 case 0xFF51: // Image and tile size (SIZ)
30758 length = readUint16(data, position);
30760 siz.Xsiz = readUint32(data, position + 4);
30761 siz.Ysiz = readUint32(data, position + 8);
30762 siz.XOsiz = readUint32(data, position + 12);
30763 siz.YOsiz = readUint32(data, position + 16);
30764 siz.XTsiz = readUint32(data, position + 20);
30765 siz.YTsiz = readUint32(data, position + 24);
30766 siz.XTOsiz = readUint32(data, position + 28);
30767 siz.YTOsiz = readUint32(data, position + 32);
30768 var componentsCount = readUint16(data, position + 36);
30769 siz.Csiz = componentsCount;
30770 var components = [];
30772 for (var i = 0; i < componentsCount; i++) {
30774 precision: (data[j] & 0x7F) + 1,
30775 isSigned: !!(data[j] & 0x80),
30776 XRsiz: data[j + 1],
30779 calculateComponentDimensions(component, siz);
30780 components.push(component);
30783 context.components = components;
30784 calculateTileGrids(context, components);
30788 case 0xFF5C: // Quantization default (QCD)
30789 length = readUint16(data, position);
30792 var sqcd = data[j++];
30793 var spqcdSize, scalarExpounded;
30794 switch (sqcd & 0x1F) {
30797 scalarExpounded = true;
30801 scalarExpounded = false;
30805 scalarExpounded = true;
30808 throw 'Invalid SQcd value ' + sqcd;
30810 qcd.noQuantization = spqcdSize == 8;
30811 qcd.scalarExpounded = scalarExpounded;
30812 qcd.guardBits = sqcd >> 5;
30814 while (j < length + position) {
30816 if (spqcdSize == 8) {
30817 spqcd.epsilon = data[j++] >> 3;
30820 spqcd.epsilon = data[j] >> 3;
30821 spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
30824 spqcds.push(spqcd);
30826 qcd.SPqcds = spqcds;
30827 if (context.mainHeader)
30830 context.currentTile.QCD = qcd;
30831 context.currentTile.QCC = [];
30834 case 0xFF5D: // Quantization component (QCC)
30835 length = readUint16(data, position);
30839 if (context.SIZ.Csiz < 257)
30842 cqcc = readUint16(data, j);
30845 var sqcd = data[j++];
30846 var spqcdSize, scalarExpounded;
30847 switch (sqcd & 0x1F) {
30850 scalarExpounded = true;
30854 scalarExpounded = false;
30858 scalarExpounded = true;
30861 throw 'Invalid SQcd value ' + sqcd;
30863 qcc.noQuantization = spqcdSize == 8;
30864 qcc.scalarExpounded = scalarExpounded;
30865 qcc.guardBits = sqcd >> 5;
30867 while (j < length + position) {
30869 if (spqcdSize == 8) {
30870 spqcd.epsilon = data[j++] >> 3;
30873 spqcd.epsilon = data[j] >> 3;
30874 spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
30877 spqcds.push(spqcd);
30879 qcc.SPqcds = spqcds;
30880 if (context.mainHeader)
30881 context.QCC[cqcc] = qcc;
30883 context.currentTile.QCC[cqcc] = qcc;
30885 case 0xFF52: // Coding style default (COD)
30886 length = readUint16(data, position);
30889 var scod = data[j++];
30890 cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
30891 cod.sopMarkerUsed = !!(scod & 2);
30892 cod.ephMarkerUsed = !!(scod & 4);
30893 var codingStyle = {};
30894 cod.progressionOrder = data[j++];
30895 cod.layersCount = readUint16(data, j);
30897 cod.multipleComponentTransform = data[j++];
30899 cod.decompositionLevelsCount = data[j++];
30900 cod.xcb = (data[j++] & 0xF) + 2;
30901 cod.ycb = (data[j++] & 0xF) + 2;
30902 var blockStyle = data[j++];
30903 cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
30904 cod.resetContextProbabilities = !!(blockStyle & 2);
30905 cod.terminationOnEachCodingPass = !!(blockStyle & 4);
30906 cod.verticalyStripe = !!(blockStyle & 8);
30907 cod.predictableTermination = !!(blockStyle & 16);
30908 cod.segmentationSymbolUsed = !!(blockStyle & 32);
30909 cod.transformation = data[j++];
30910 if (cod.entropyCoderWithCustomPrecincts) {
30911 var precinctsSizes = {};
30912 while (j < length + position) {
30913 var precinctsSize = data[j];
30914 precinctsSizes.push({
30915 PPx: precinctsSize & 0xF,
30916 PPy: precinctsSize >> 4
30919 cod.precinctsSizes = precinctsSizes;
30922 if (cod.sopMarkerUsed || cod.ephMarkerUsed ||
30923 cod.selectiveArithmeticCodingBypass ||
30924 cod.resetContextProbabilities ||
30925 cod.terminationOnEachCodingPass ||
30926 cod.verticalyStripe || cod.predictableTermination ||
30927 cod.segmentationSymbolUsed)
30928 throw 'Unsupported COD options: ' + uneval(cod);
30930 if (context.mainHeader)
30933 context.currentTile.COD = cod;
30934 context.currentTile.COC = [];
30937 case 0xFF90: // Start of tile-part (SOT)
30938 length = readUint16(data, position);
30940 tile.index = readUint16(data, position + 2);
30941 tile.length = readUint32(data, position + 4);
30942 tile.dataEnd = tile.length + position - 2;
30943 tile.partIndex = data[position + 8];
30944 tile.partsCount = data[position + 9];
30946 context.mainHeader = false;
30947 if (tile.partIndex == 0) {
30948 // reset component specific settings
30949 tile.COD = context.COD;
30950 tile.COC = context.COC.slice(0); // clone of the global COC
30951 tile.QCD = context.QCD;
30952 tile.QCC = context.QCC.slice(0); // clone of the global COC
30954 context.currentTile = tile;
30956 case 0xFF93: // Start of data (SOD)
30957 var tile = context.currentTile;
30958 if (tile.partIndex == 0) {
30959 initializeTile(context, tile.index);
30960 buildPackets(context);
30963 // moving to the end of the data
30964 length = tile.dataEnd - position;
30966 parseTilePackets(context, data, position, length);
30968 case 0xFF64: // Comment (COM)
30969 length = readUint16(data, position);
30970 // skipping content
30973 throw 'Unknown codestream code: ' + code.toString(16);
30975 position += length;
30978 if (this.failOnCorruptedImage)
30979 error('JPX error: ' + e);
30981 warn('JPX error: ' + e + '. Trying to recover');
30983 this.tiles = transformComponents(context);
30984 this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
30985 this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
30986 this.componentsCount = context.SIZ.Csiz;
30989 function readUint32(data, offset) {
30990 return (data[offset] << 24) | (data[offset + 1] << 16) |
30991 (data[offset + 2] << 8) | data[offset + 3];
30993 function readUint16(data, offset) {
30994 return (data[offset] << 8) | data[offset + 1];
31004 function calculateComponentDimensions(component, siz) {
31005 // Section B.2 Component mapping
31006 component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
31007 component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
31008 component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
31009 component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
31010 component.width = component.x1 - component.x0;
31011 component.height = component.y1 - component.y0;
31013 function calculateTileGrids(context, components) {
31014 var siz = context.SIZ;
31015 // Section B.3 Division into tile and tile-components
31017 var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
31018 var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
31019 for (var q = 0; q < numYtiles; q++) {
31020 for (var p = 0; p < numXtiles; p++) {
31022 tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
31023 tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
31024 tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
31025 tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
31026 tile.width = tile.tx1 - tile.tx0;
31027 tile.height = tile.ty1 - tile.ty0;
31028 tile.components = [];
31032 context.tiles = tiles;
31034 var componentsCount = siz.Csiz;
31035 for (var i = 0, ii = componentsCount; i < ii; i++) {
31036 var component = components[i];
31037 var tileComponents = [];
31038 for (var j = 0, jj = tiles.length; j < jj; j++) {
31039 var tileComponent = {}, tile = tiles[j];
31040 tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
31041 tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
31042 tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
31043 tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
31044 tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
31045 tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
31046 tile.components[i] = tileComponent;
31050 function getBlocksDimensions(context, component, r) {
31051 var codOrCoc = component.codingStyleParameters;
31053 if (!codOrCoc.entropyCoderWithCustomPrecincts) {
31057 result.PPx = codOrCoc.precinctsSizes[r].PPx;
31058 result.PPy = codOrCoc.precinctsSizes[r].PPy;
31060 // calculate codeblock size as described in section B.7
31061 result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
31062 Math.min(codOrCoc.xcb, result.PPx);
31063 result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
31064 Math.min(codOrCoc.ycb, result.PPy);
31067 function buildPrecincts(context, resolution, dimensions) {
31068 // Section B.6 Division resolution to precincts
31069 var precinctWidth = 1 << dimensions.PPx;
31070 var precinctHeight = 1 << dimensions.PPy;
31071 var numprecinctswide = resolution.trx1 > resolution.trx0 ?
31072 Math.ceil(resolution.trx1 / precinctWidth) -
31073 Math.floor(resolution.trx0 / precinctWidth) : 0;
31074 var numprecinctshigh = resolution.try1 > resolution.try0 ?
31075 Math.ceil(resolution.try1 / precinctHeight) -
31076 Math.floor(resolution.try0 / precinctHeight) : 0;
31077 var numprecincts = numprecinctswide * numprecinctshigh;
31078 var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) *
31080 var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
31082 resolution.precinctParameters = {
31083 precinctXOffset: precinctXOffset,
31084 precinctYOffset: precinctYOffset,
31085 precinctWidth: precinctWidth,
31086 precinctHeight: precinctHeight,
31087 numprecinctswide: numprecinctswide,
31088 numprecinctshigh: numprecinctshigh,
31089 numprecincts: numprecincts
31092 function buildCodeblocks(context, subband, dimensions) {
31093 // Section B.7 Division sub-band into code-blocks
31094 var xcb_ = dimensions.xcb_;
31095 var ycb_ = dimensions.ycb_;
31096 var codeblockWidth = 1 << xcb_;
31097 var codeblockHeight = 1 << ycb_;
31098 var cbx0 = Math.floor(subband.tbx0 / codeblockWidth);
31099 var cby0 = Math.floor(subband.tby0 / codeblockHeight);
31100 var cbx1 = Math.ceil(subband.tbx1 / codeblockWidth);
31101 var cby1 = Math.ceil(subband.tby1 / codeblockHeight);
31102 var precinctParameters = subband.resolution.precinctParameters;
31103 var codeblocks = [];
31104 var precincts = [];
31105 for (var j = cby0; j < cby1; j++) {
31106 for (var i = cbx0; i < cbx1; i++) {
31110 tbx0: codeblockWidth * i,
31111 tby0: codeblockHeight * j,
31112 tbx1: codeblockWidth * (i + 1),
31113 tby1: codeblockHeight * (j + 1)
31115 // calculate precinct number
31116 var pi = Math.floor((codeblock.tbx0 -
31117 precinctParameters.precinctXOffset) /
31118 precinctParameters.precinctWidth);
31119 var pj = Math.floor((codeblock.tby0 -
31120 precinctParameters.precinctYOffset) /
31121 precinctParameters.precinctHeight);
31122 var precinctNumber = pj +
31123 pi * precinctParameters.numprecinctswide;
31124 codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
31125 codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
31126 codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
31127 codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
31128 codeblock.precinctNumber = precinctNumber;
31129 codeblock.subbandType = subband.type;
31130 var coefficientsLength = (codeblock.tbx1_ - codeblock.tbx0_) *
31131 (codeblock.tby1_ - codeblock.tby0_);
31132 codeblock.Lblock = 3;
31133 codeblocks.push(codeblock);
31134 // building precinct for the sub-band
31136 if (precinctNumber in precincts) {
31137 precinct = precincts[precinctNumber];
31138 precinct.cbxMin = Math.min(precinct.cbxMin, i);
31139 precinct.cbyMin = Math.min(precinct.cbyMin, j);
31140 precinct.cbxMax = Math.max(precinct.cbxMax, i);
31141 precinct.cbyMax = Math.max(precinct.cbyMax, j);
31143 precincts[precinctNumber] = precinct = {
31150 codeblock.precinct = precinct;
31153 subband.codeblockParameters = {
31154 codeblockWidth: xcb_,
31155 codeblockHeight: ycb_,
31156 numcodeblockwide: cbx1 - cbx0 + 1,
31157 numcodeblockhigh: cby1 - cby1 + 1
31159 subband.codeblocks = codeblocks;
31160 for (var i = 0, ii = codeblocks.length; i < ii; i++) {
31161 var codeblock = codeblocks[i];
31162 var precinctNumber = codeblock.precinctNumber;
31164 subband.precincts = precincts;
31166 function createPacket(resolution, precinctNumber, layerNumber) {
31167 var precinctCodeblocks = [];
31168 // Section B.10.8 Order of info in packet
31169 var subbands = resolution.subbands;
31170 // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
31171 for (var i = 0, ii = subbands.length; i < ii; i++) {
31172 var subband = subbands[i];
31173 var codeblocks = subband.codeblocks;
31174 for (var j = 0, jj = codeblocks.length; j < jj; j++) {
31175 var codeblock = codeblocks[j];
31176 if (codeblock.precinctNumber != precinctNumber)
31178 precinctCodeblocks.push(codeblock);
31182 layerNumber: layerNumber,
31183 codeblocks: precinctCodeblocks
31186 function LayerResolutionComponentPositionIterator(context) {
31187 var siz = context.SIZ;
31188 var tileIndex = context.currentTile.index;
31189 var tile = context.tiles[tileIndex];
31190 var layersCount = tile.codingStyleDefaultParameters.layersCount;
31191 var componentsCount = siz.Csiz;
31192 var maxDecompositionLevelsCount = 0;
31193 for (var q = 0; q < componentsCount; q++) {
31194 maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
31195 tile.components[q].codingStyleParameters.decompositionLevelsCount);
31198 var l = 0, r = 0, i = 0, k = 0;
31200 this.nextPacket = function JpxImage_nextPacket() {
31201 // Section B.12.1.1 Layer-resolution-component-position
31202 for (; l < layersCount; l++) {
31203 for (; r <= maxDecompositionLevelsCount; r++) {
31204 for (; i < componentsCount; i++) {
31205 var component = tile.components[i];
31206 if (r > component.codingStyleParameters.decompositionLevelsCount)
31209 var resolution = component.resolutions[r];
31210 var numprecincts = resolution.precinctParameters.numprecincts;
31211 for (; k < numprecincts;) {
31212 var packet = createPacket(resolution, k, l);
31222 throw 'Out of packets';
31225 function ResolutionLayerComponentPositionIterator(context) {
31226 var siz = context.SIZ;
31227 var tileIndex = context.currentTile.index;
31228 var tile = context.tiles[tileIndex];
31229 var layersCount = tile.codingStyleDefaultParameters.layersCount;
31230 var componentsCount = siz.Csiz;
31231 var maxDecompositionLevelsCount = 0;
31232 for (var q = 0; q < componentsCount; q++) {
31233 maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
31234 tile.components[q].codingStyleParameters.decompositionLevelsCount);
31237 var r = 0, l = 0, i = 0, k = 0;
31239 this.nextPacket = function JpxImage_nextPacket() {
31240 // Section B.12.1.2 Resolution-layer-component-position
31241 for (; r <= maxDecompositionLevelsCount; r++) {
31242 for (; l < layersCount; l++) {
31243 for (; i < componentsCount; i++) {
31244 var component = tile.components[i];
31245 if (r > component.codingStyleParameters.decompositionLevelsCount)
31248 var resolution = component.resolutions[r];
31249 var numprecincts = resolution.precinctParameters.numprecincts;
31250 for (; k < numprecincts;) {
31251 var packet = createPacket(resolution, k, l);
31261 throw 'Out of packets';
31264 function buildPackets(context) {
31265 var siz = context.SIZ;
31266 var tileIndex = context.currentTile.index;
31267 var tile = context.tiles[tileIndex];
31268 var componentsCount = siz.Csiz;
31269 // Creating resolutions and sub-bands for each component
31270 for (var c = 0; c < componentsCount; c++) {
31271 var component = tile.components[c];
31272 var decompositionLevelsCount =
31273 component.codingStyleParameters.decompositionLevelsCount;
31274 // Section B.5 Resolution levels and sub-bands
31275 var resolutions = [];
31277 for (var r = 0; r <= decompositionLevelsCount; r++) {
31278 var blocksDimensions = getBlocksDimensions(context, component, r);
31279 var resolution = {};
31280 var scale = 1 << (decompositionLevelsCount - r);
31281 resolution.trx0 = Math.ceil(component.tcx0 / scale);
31282 resolution.try0 = Math.ceil(component.tcy0 / scale);
31283 resolution.trx1 = Math.ceil(component.tcx1 / scale);
31284 resolution.try1 = Math.ceil(component.tcy1 / scale);
31285 buildPrecincts(context, resolution, blocksDimensions);
31286 resolutions.push(resolution);
31290 // one sub-band (LL) with last decomposition
31292 subband.type = 'LL';
31293 subband.tbx0 = Math.ceil(component.tcx0 / scale);
31294 subband.tby0 = Math.ceil(component.tcy0 / scale);
31295 subband.tbx1 = Math.ceil(component.tcx1 / scale);
31296 subband.tby1 = Math.ceil(component.tcy1 / scale);
31297 subband.resolution = resolution;
31298 buildCodeblocks(context, subband, blocksDimensions);
31299 subbands.push(subband);
31300 resolution.subbands = [subband];
31302 var bscale = 1 << (decompositionLevelsCount - r + 1);
31303 var resolutionSubbands = [];
31304 // three sub-bands (HL, LH and HH) with rest of decompositions
31306 subband.type = 'HL';
31307 subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
31308 subband.tby0 = Math.ceil(component.tcy0 / bscale);
31309 subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
31310 subband.tby1 = Math.ceil(component.tcy1 / bscale);
31311 subband.resolution = resolution;
31312 buildCodeblocks(context, subband, blocksDimensions);
31313 subbands.push(subband);
31314 resolutionSubbands.push(subband);
31317 subband.type = 'LH';
31318 subband.tbx0 = Math.ceil(component.tcx0 / bscale);
31319 subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
31320 subband.tbx1 = Math.ceil(component.tcx1 / bscale);
31321 subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
31322 subband.resolution = resolution;
31323 buildCodeblocks(context, subband, blocksDimensions);
31324 subbands.push(subband);
31325 resolutionSubbands.push(subband);
31328 subband.type = 'HH';
31329 subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
31330 subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
31331 subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
31332 subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
31333 subband.resolution = resolution;
31334 buildCodeblocks(context, subband, blocksDimensions);
31335 subbands.push(subband);
31336 resolutionSubbands.push(subband);
31338 resolution.subbands = resolutionSubbands;
31341 component.resolutions = resolutions;
31342 component.subbands = subbands;
31344 // Generate the packets sequence
31345 var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
31346 var packetsIterator;
31347 switch (progressionOrder) {
31349 tile.packetsIterator =
31350 new LayerResolutionComponentPositionIterator(context);
31353 tile.packetsIterator =
31354 new ResolutionLayerComponentPositionIterator(context);
31357 throw 'Unsupported progression order ' + progressionOrder;
31360 function parseTilePackets(context, data, offset, dataLength) {
31362 var buffer, bufferSize = 0, skipNextBit = false;
31363 function readBits(count) {
31364 while (bufferSize < count) {
31365 var b = data[offset + position];
31368 buffer = (buffer << 7) | b;
31370 skipNextBit = false;
31372 buffer = (buffer << 8) | b;
31376 skipNextBit = true;
31379 bufferSize -= count;
31380 return (buffer >>> bufferSize) & ((1 << count) - 1);
31382 function alignToByte() {
31386 skipNextBit = false;
31389 function readCodingpasses() {
31390 var value = readBits(1);
31393 value = (value << 1) | readBits(1);
31396 value = (value << 2) | readBits(2);
31398 return (value & 0x03) + 3;
31399 value = (value << 5) | readBits(5);
31400 if (value <= 0x1FE)
31401 return (value & 0x1F) + 6;
31402 value = (value << 7) | readBits(7);
31403 return (value & 0x7F) + 37;
31405 var tileIndex = context.currentTile.index;
31406 var tile = context.tiles[tileIndex];
31407 var packetsIterator = tile.packetsIterator;
31408 while (position < dataLength) {
31409 var packet = packetsIterator.nextPacket();
31410 if (!readBits(1)) {
31414 var layerNumber = packet.layerNumber;
31416 for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
31417 var codeblock = packet.codeblocks[i];
31418 var precinct = codeblock.precinct;
31419 var codeblockColumn = codeblock.cbx - precinct.cbxMin;
31420 var codeblockRow = codeblock.cby - precinct.cbyMin;
31421 var codeblockIncluded = false;
31422 var firstTimeInclusion = false;
31423 if ('included' in codeblock) {
31424 codeblockIncluded = !!readBits(1);
31426 // reading inclusion tree
31427 var precinct = codeblock.precinct;
31428 var inclusionTree, zeroBitPlanesTree;
31429 if ('inclusionTree' in precinct) {
31430 inclusionTree = precinct.inclusionTree;
31432 // building inclusion and zero bit-planes trees
31433 var width = precinct.cbxMax - precinct.cbxMin + 1;
31434 var height = precinct.cbyMax - precinct.cbyMin + 1;
31435 inclusionTree = new InclusionTree(width, height, layerNumber);
31436 zeroBitPlanesTree = new TagTree(width, height);
31437 precinct.inclusionTree = inclusionTree;
31438 precinct.zeroBitPlanesTree = zeroBitPlanesTree;
31441 if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
31444 var valueReady = !inclusionTree.nextLevel();
31446 codeblock.included = true;
31447 codeblockIncluded = firstTimeInclusion = true;
31451 inclusionTree.incrementValue(layerNumber);
31457 if (!codeblockIncluded)
31459 if (firstTimeInclusion) {
31460 zeroBitPlanesTree = precinct.zeroBitPlanesTree;
31461 zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
31464 var valueReady = !zeroBitPlanesTree.nextLevel();
31468 zeroBitPlanesTree.incrementValue();
31470 codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
31472 var codingpasses = readCodingpasses();
31473 while (readBits(1))
31474 codeblock.Lblock++;
31475 var codingpassesLog2 = log2(codingpasses);
31476 // rounding down log2
31477 var bits = ((codingpasses < (1 << codingpassesLog2)) ?
31478 codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
31479 var codedDataLength = readBits(bits);
31481 codeblock: codeblock,
31482 codingpasses: codingpasses,
31483 dataLength: codedDataLength
31487 while (queue.length > 0) {
31488 var packetItem = queue.shift();
31489 var codeblock = packetItem.codeblock;
31490 if (!('data' in codeblock))
31491 codeblock.data = [];
31492 codeblock.data.push({
31494 start: offset + position,
31495 end: offset + position + packetItem.dataLength,
31496 codingpasses: packetItem.codingpasses
31498 position += packetItem.dataLength;
31503 function copyCoefficients(coefficients, x0, y0, width, height,
31504 delta, mb, codeblocks, transformation) {
31505 var r = 0.5; // formula (E-6)
31506 for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
31507 var codeblock = codeblocks[i];
31508 var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
31509 var blockHeight = codeblock.tby1_ - codeblock.tby0_;
31510 if (blockWidth == 0 || blockHeight == 0)
31512 if (!('data' in codeblock))
31515 var bitModel, currentCodingpassType;
31516 bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
31517 codeblock.zeroBitPlanes);
31518 currentCodingpassType = 2; // first bit plane starts from cleanup
31521 var data = codeblock.data, totalLength = 0, codingpasses = 0;
31522 for (var q = 0, qq = data.length; q < qq; q++) {
31523 var dataItem = data[q];
31524 totalLength += dataItem.end - dataItem.start;
31525 codingpasses += dataItem.codingpasses;
31527 var encodedData = new Uint8Array(totalLength), k = 0;
31528 for (var q = 0, qq = data.length; q < qq; q++) {
31529 var dataItem = data[q];
31530 var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
31531 encodedData.set(chunk, k);
31534 // decoding the item
31535 var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
31536 bitModel.setDecoder(decoder);
31538 for (var q = 0; q < codingpasses; q++) {
31539 switch (currentCodingpassType) {
31541 bitModel.runSignificancePropogationPass();
31544 bitModel.runMagnitudeRefinementPass();
31547 bitModel.runCleanupPass();
31550 currentCodingpassType = (currentCodingpassType + 1) % 3;
31553 var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
31555 for (var j = 0; j < blockHeight; j++) {
31556 for (var k = 0; k < blockWidth; k++) {
31557 var n = (bitModel.coefficentsSign[position] ? -1 : 1) *
31558 bitModel.coefficentsMagnitude[position];
31559 var nb = bitModel.bitsDecoded[position], correction;
31560 if (transformation == 0 || mb > nb) {
31561 // use r only if transformation is irreversible or
31562 // not all bitplanes were decoded for reversible transformation
31563 n += n < 0 ? n - r : n > 0 ? n + r : 0;
31564 correction = 1 << (mb - nb);
31567 coefficients[offset++] = n * correction * delta;
31570 offset += width - blockWidth;
31574 function transformTile(context, tile, c) {
31575 var component = tile.components[c];
31576 var codingStyleParameters = component.codingStyleParameters;
31577 var quantizationParameters = component.quantizationParameters;
31578 var decompositionLevelsCount =
31579 codingStyleParameters.decompositionLevelsCount;
31580 var spqcds = quantizationParameters.SPqcds;
31581 var scalarExpounded = quantizationParameters.scalarExpounded;
31582 var guardBits = quantizationParameters.guardBits;
31583 var transformation = codingStyleParameters.transformation;
31584 var precision = context.components[c].precision;
31586 var subbandCoefficients = [];
31588 for (var i = 0; i <= decompositionLevelsCount; i++) {
31589 var resolution = component.resolutions[i];
31591 for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
31593 if (!scalarExpounded) {
31596 epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
31599 epsilon = spqcds[b].epsilon;
31602 var subband = resolution.subbands[j];
31603 var width = subband.tbx1 - subband.tbx0;
31604 var height = subband.tby1 - subband.tby0;
31605 var gainLog2 = SubbandsGainLog2[subband.type];
31607 // calulate quantization coefficient (Section E.1.1.1)
31608 var delta = Math.pow(2, (precision + gainLog2) - epsilon) *
31610 var mb = (guardBits + epsilon - 1);
31612 var coefficients = new Float32Array(width * height);
31613 copyCoefficients(coefficients, subband.tbx0, subband.tby0,
31614 width, height, delta, mb, subband.codeblocks, transformation);
31616 subbandCoefficients.push({
31619 items: coefficients
31626 var transformation = codingStyleParameters.transformation;
31627 var transform = transformation == 0 ? new IrreversibleTransform() :
31628 new ReversibleTransform();
31629 var result = transform.calculate(subbandCoefficients,
31630 component.tcx0, component.tcy0);
31632 left: component.tcx0,
31633 top: component.tcy0,
31634 width: result.width,
31635 height: result.height,
31636 items: result.items
31639 function transformComponents(context) {
31640 var siz = context.SIZ;
31641 var components = context.components;
31642 var componentsCount = siz.Csiz;
31643 var resultImages = [];
31644 for (var i = 0, ii = context.tiles.length; i < ii; i++) {
31645 var tile = context.tiles[i];
31647 for (var c = 0; c < componentsCount; c++) {
31648 var image = transformTile(context, tile, c);
31649 result.push(image);
31652 // Section G.2.2 Inverse multi component transform
31653 if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
31654 var y0items = result[0].items;
31655 var y1items = result[1].items;
31656 var y2items = result[2].items;
31657 for (var j = 0, jj = y0items.length; j < jj; j++) {
31658 var y0 = y0items[j], y1 = y1items[j], y2 = y2items[j];
31659 var i1 = y0 - ((y2 + y1) >> 2);
31661 y0items[j] = y2 + i1;
31662 y2items[j] = y1 + i1;
31666 // Section G.1 DC level shifting to unsigned component values
31667 for (var c = 0; c < componentsCount; c++) {
31668 var component = components[c];
31669 if (component.isSigned)
31672 var offset = 1 << (component.precision - 1);
31673 var tileImage = result[c];
31674 var items = tileImage.items;
31675 for (var j = 0, jj = items.length; j < jj; j++)
31676 items[j] += offset;
31679 // To simplify things: shift and clamp output to 8 bit unsigned
31680 for (var c = 0; c < componentsCount; c++) {
31681 var component = components[c];
31682 var offset = component.isSigned ? 128 : 0;
31683 var shift = component.precision - 8;
31684 var tileImage = result[c];
31685 var items = tileImage.items;
31686 var data = new Uint8Array(items.length);
31687 for (var j = 0, jj = items.length; j < jj; j++) {
31688 var value = (items[j] >> shift) + offset;
31689 data[j] = value < 0 ? 0 : value > 255 ? 255 : value;
31691 result[c].items = data;
31694 resultImages.push(result);
31696 return resultImages;
31698 function initializeTile(context, tileIndex) {
31699 var siz = context.SIZ;
31700 var componentsCount = siz.Csiz;
31701 var tile = context.tiles[tileIndex];
31702 var resultTiles = [];
31703 for (var c = 0; c < componentsCount; c++) {
31704 var component = tile.components[c];
31705 var qcdOrQcc = c in context.currentTile.QCC ?
31706 context.currentTile.QCC[c] : context.currentTile.QCD;
31707 component.quantizationParameters = qcdOrQcc;
31708 var codOrCoc = c in context.currentTile.COC ?
31709 context.currentTile.COC[c] : context.currentTile.COD;
31710 component.codingStyleParameters = codOrCoc;
31712 tile.codingStyleDefaultParameters = context.currentTile.COD;
31715 // Section B.10.2 Tag trees
31716 var TagTree = (function TagTreeClosure() {
31717 function TagTree(width, height) {
31718 var levelsLength = log2(Math.max(width, height)) + 1;
31720 for (var i = 0; i < levelsLength; i++) {
31726 this.levels.push(level);
31727 width = Math.ceil(width / 2);
31728 height = Math.ceil(height / 2);
31731 TagTree.prototype = {
31732 reset: function TagTree_reset(i, j) {
31733 var currentLevel = 0, value = 0;
31734 while (currentLevel < this.levels.length) {
31735 var level = this.levels[currentLevel];
31736 var index = i + j * level.width;
31737 if (index in level.items) {
31738 value = level.items[index];
31741 level.index = index;
31747 var level = this.levels[currentLevel];
31748 level.items[level.index] = value;
31749 this.currentLevel = currentLevel;
31752 incrementValue: function TagTree_incrementValue() {
31753 var level = this.levels[this.currentLevel];
31754 level.items[level.index]++;
31756 nextLevel: function TagTree_nextLevel() {
31757 var currentLevel = this.currentLevel;
31758 var level = this.levels[currentLevel];
31759 var value = level.items[level.index];
31761 if (currentLevel < 0) {
31762 this.value = value;
31766 this.currentLevel = currentLevel;
31767 var level = this.levels[currentLevel];
31768 level.items[level.index] = value;
31775 var InclusionTree = (function InclusionTreeClosure() {
31776 function InclusionTree(width, height, defaultValue) {
31777 var levelsLength = log2(Math.max(width, height)) + 1;
31779 for (var i = 0; i < levelsLength; i++) {
31780 var items = new Uint8Array(width * height);
31781 for (var j = 0, jj = items.length; j < jj; j++)
31782 items[j] = defaultValue;
31789 this.levels.push(level);
31791 width = Math.ceil(width / 2);
31792 height = Math.ceil(height / 2);
31795 InclusionTree.prototype = {
31796 reset: function InclusionTree_reset(i, j, stopValue) {
31797 var currentLevel = 0;
31798 while (currentLevel < this.levels.length) {
31799 var level = this.levels[currentLevel];
31800 var index = i + j * level.width;
31801 level.index = index;
31802 var value = level.items[index];
31807 if (value > stopValue) {
31808 this.currentLevel = currentLevel;
31809 // already know about this one, propagating the value to top levels
31810 this.propagateValues();
31818 this.currentLevel = currentLevel - 1;
31821 incrementValue: function InclusionTree_incrementValue(stopValue) {
31822 var level = this.levels[this.currentLevel];
31823 level.items[level.index] = stopValue + 1;
31824 this.propagateValues();
31826 propagateValues: function InclusionTree_propagateValues() {
31827 var levelIndex = this.currentLevel;
31828 var level = this.levels[levelIndex];
31829 var currentValue = level.items[level.index];
31830 while (--levelIndex >= 0) {
31831 var level = this.levels[levelIndex];
31832 level.items[level.index] = currentValue;
31835 nextLevel: function InclusionTree_nextLevel() {
31836 var currentLevel = this.currentLevel;
31837 var level = this.levels[currentLevel];
31838 var value = level.items[level.index];
31839 level.items[level.index] = 0xFF;
31841 if (currentLevel < 0)
31844 this.currentLevel = currentLevel;
31845 var level = this.levels[currentLevel];
31846 level.items[level.index] = value;
31850 return InclusionTree;
31853 // Implements C.3. Arithmetic decoding procedures
31854 var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
31856 {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
31857 {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
31858 {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
31859 {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
31860 {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
31861 {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
31862 {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
31863 {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
31864 {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
31865 {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
31866 {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
31867 {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
31868 {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
31869 {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
31870 {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
31871 {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
31872 {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
31873 {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
31874 {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
31875 {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
31876 {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
31877 {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
31878 {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
31879 {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
31880 {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
31881 {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
31882 {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
31883 {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
31884 {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
31885 {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
31886 {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
31887 {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
31888 {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
31889 {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
31890 {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
31891 {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
31892 {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
31893 {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
31894 {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
31895 {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
31896 {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
31897 {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
31898 {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
31899 {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
31900 {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
31901 {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
31902 {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
31905 function ArithmeticDecoder(data, start, end) {
31908 this.dataEnd = end;
31910 this.chigh = data[start];
31915 this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
31916 this.clow = (this.clow << 7) & 0xFFFF;
31921 ArithmeticDecoder.prototype = {
31922 byteIn: function ArithmeticDecoder_byteIn() {
31923 var data = this.data;
31925 if (data[bp] == 0xFF) {
31926 var b1 = data[bp + 1];
31928 this.clow += 0xFF00;
31932 this.clow += (data[bp] << 9);
31938 this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
31942 if (this.clow > 0xFFFF) {
31943 this.chigh += (this.clow >> 16);
31944 this.clow &= 0xFFFF;
31947 readBit: function ArithmeticDecoder_readBit(cx) {
31948 var qeIcx = QeTable[cx.index].qe;
31951 if (this.chigh < qeIcx) {
31952 var d = this.exchangeLps(cx);
31956 this.chigh -= qeIcx;
31957 if ((this.a & 0x8000) == 0) {
31958 var d = this.exchangeMps(cx);
31966 renormD: function ArithmeticDecoder_renormD() {
31972 this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
31973 this.clow = (this.clow << 1) & 0xFFFF;
31975 } while ((this.a & 0x8000) == 0);
31977 exchangeMps: function ArithmeticDecoder_exchangeMps(cx) {
31979 var qeTableIcx = QeTable[cx.index];
31980 if (this.a < qeTableIcx.qe) {
31983 if (qeTableIcx.switchFlag == 1) {
31984 cx.mps = 1 - cx.mps;
31986 cx.index = qeTableIcx.nlps;
31989 cx.index = qeTableIcx.nmps;
31993 exchangeLps: function ArithmeticDecoder_exchangeLps(cx) {
31995 var qeTableIcx = QeTable[cx.index];
31996 if (this.a < qeTableIcx.qe) {
31997 this.a = qeTableIcx.qe;
31999 cx.index = qeTableIcx.nmps;
32001 this.a = qeTableIcx.qe;
32004 if (qeTableIcx.switchFlag == 1) {
32005 cx.mps = 1 - cx.mps;
32007 cx.index = qeTableIcx.nlps;
32013 return ArithmeticDecoder;
32016 // Section D. Coefficient bit modeling
32017 var BitModel = (function BitModelClosure() {
32019 // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
32020 // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
32021 var LLAndLHContextsLabel = new Uint8Array([
32022 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,
32023 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,
32024 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
32026 var HLContextLabel = new Uint8Array([
32027 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,
32028 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,
32029 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
32031 var HHContextLabel = new Uint8Array([
32032 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,
32033 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,
32034 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 function calcSignContribution(significance0, sign0, significance1, sign1) {
32039 if (significance1) {
32041 return significance0 ? (!sign0 ? 1 : 0) : 1;
32043 return significance0 ? (!sign0 ? 0 : -1) : -1;
32045 return significance0 ? (!sign0 ? 1 : -1) : 0;
32048 var SignContextLabels = [
32049 {contextLabel: 13, xorBit: 0},
32050 {contextLabel: 12, xorBit: 0},
32051 {contextLabel: 11, xorBit: 0},
32052 {contextLabel: 10, xorBit: 0},
32053 {contextLabel: 9, xorBit: 0},
32054 {contextLabel: 10, xorBit: 1},
32055 {contextLabel: 11, xorBit: 1},
32056 {contextLabel: 12, xorBit: 1},
32057 {contextLabel: 13, xorBit: 1}
32060 function BitModel(width, height, subband, zeroBitPlanes) {
32061 this.width = width;
32062 this.height = height;
32064 this.contextLabelTable = subband == 'HH' ? HHContextLabel :
32065 subband == 'HL' ? HLContextLabel : LLAndLHContextsLabel;
32067 var coefficientCount = width * height;
32069 // coefficients outside the encoding region treated as insignificant
32070 // add border state cells for significanceState
32071 this.neighborsSignificance = new Uint8Array(coefficientCount);
32072 this.coefficentsSign = new Uint8Array(coefficientCount);
32073 this.coefficentsMagnitude = new Uint32Array(coefficientCount);
32074 this.processingFlags = new Uint8Array(coefficientCount);
32076 var bitsDecoded = new Uint8Array(this.width * this.height);
32077 for (var i = 0, ii = bitsDecoded.length; i < ii; i++)
32078 bitsDecoded[i] = zeroBitPlanes;
32079 this.bitsDecoded = bitsDecoded;
32084 BitModel.prototype = {
32085 setDecoder: function BitModel_setDecoder(decoder) {
32086 this.decoder = decoder;
32088 reset: function BitModel_reset() {
32089 this.uniformContext = {index: 46, mps: 0};
32090 this.runLengthContext = {index: 3, mps: 0};
32091 this.contexts = [];
32092 this.contexts.push({index: 4, mps: 0});
32093 for (var i = 1; i <= 16; i++)
32094 this.contexts.push({index: 0, mps: 0});
32096 setNeighborsSignificance:
32097 function BitModel_setNeighborsSignificance(row, column) {
32098 var neighborsSignificance = this.neighborsSignificance;
32099 var width = this.width, height = this.height;
32100 var index = row * width + column;
32103 neighborsSignificance[index - width - 1] += 0x10;
32104 if (column + 1 < width)
32105 neighborsSignificance[index - width + 1] += 0x10;
32106 neighborsSignificance[index - width] += 0x04;
32108 if (row + 1 < height) {
32110 neighborsSignificance[index + width - 1] += 0x10;
32111 if (column + 1 < width)
32112 neighborsSignificance[index + width + 1] += 0x10;
32113 neighborsSignificance[index + width] += 0x04;
32116 neighborsSignificance[index - 1] += 0x01;
32117 if (column + 1 < width)
32118 neighborsSignificance[index + 1] += 0x01;
32119 neighborsSignificance[index] |= 0x80;
32121 runSignificancePropogationPass:
32122 function BitModel_runSignificancePropogationPass() {
32123 var decoder = this.decoder;
32124 var width = this.width, height = this.height;
32125 var coefficentsMagnitude = this.coefficentsMagnitude;
32126 var coefficentsSign = this.coefficentsSign;
32127 var contextLabels = this.contextLabels;
32128 var neighborsSignificance = this.neighborsSignificance;
32129 var processingFlags = this.processingFlags;
32130 var contexts = this.contexts;
32131 var labels = this.contextLabelTable;
32132 var bitsDecoded = this.bitsDecoded;
32133 // clear processed flag
32134 var processedInverseMask = ~1;
32135 var processedMask = 1;
32136 var firstMagnitudeBitMask = 2;
32137 for (var q = 0, qq = width * height; q < qq; q++)
32138 processingFlags[q] &= processedInverseMask;
32140 for (var i0 = 0; i0 < height; i0 += 4) {
32141 for (var j = 0; j < width; j++) {
32142 var index = i0 * width + j;
32143 for (var i1 = 0; i1 < 4; i1++, index += width) {
32148 if (coefficentsMagnitude[index] || !neighborsSignificance[index])
32151 var contextLabel = labels[neighborsSignificance[index]];
32152 var cx = contexts[contextLabel];
32153 var decision = decoder.readBit(cx);
32155 var sign = this.decodeSignBit(i, j);
32156 coefficentsSign[index] = sign;
32157 coefficentsMagnitude[index] = 1;
32158 this.setNeighborsSignificance(i, j);
32159 processingFlags[index] |= firstMagnitudeBitMask;
32161 bitsDecoded[index]++;
32162 processingFlags[index] |= processedMask;
32167 decodeSignBit: function BitModel_decodeSignBit(row, column) {
32168 var width = this.width, height = this.height;
32169 var index = row * width + column;
32170 var coefficentsMagnitude = this.coefficentsMagnitude;
32171 var coefficentsSign = this.coefficentsSign;
32172 var horizontalContribution = calcSignContribution(
32173 column > 0 && coefficentsMagnitude[index - 1],
32174 coefficentsSign[index - 1],
32175 column + 1 < width && coefficentsMagnitude[index + 1],
32176 coefficentsSign[index + 1]);
32177 var verticalContribution = calcSignContribution(
32178 row > 0 && coefficentsMagnitude[index - width],
32179 coefficentsSign[index - width],
32180 row + 1 < height && coefficentsMagnitude[index + width],
32181 coefficentsSign[index + width]);
32183 var contextLabelAndXor = SignContextLabels[
32184 3 * (1 - horizontalContribution) + (1 - verticalContribution)];
32185 var contextLabel = contextLabelAndXor.contextLabel;
32186 var cx = this.contexts[contextLabel];
32187 var decoded = this.decoder.readBit(cx);
32188 return decoded ^ contextLabelAndXor.xorBit;
32190 runMagnitudeRefinementPass:
32191 function BitModel_runMagnitudeRefinementPass() {
32192 var decoder = this.decoder;
32193 var width = this.width, height = this.height;
32194 var coefficentsMagnitude = this.coefficentsMagnitude;
32195 var neighborsSignificance = this.neighborsSignificance;
32196 var contexts = this.contexts;
32197 var bitsDecoded = this.bitsDecoded;
32198 var processingFlags = this.processingFlags;
32199 var processedMask = 1;
32200 var firstMagnitudeBitMask = 2;
32201 for (var i0 = 0; i0 < height; i0 += 4) {
32202 for (var j = 0; j < width; j++) {
32203 for (var i1 = 0; i1 < 4; i1++) {
32207 var index = i * width + j;
32209 // significant but not those that have just become
32210 if (!coefficentsMagnitude[index] ||
32211 (processingFlags[index] & processedMask) != 0)
32214 var contextLabel = 16;
32215 if ((processingFlags[index] &
32216 firstMagnitudeBitMask) != 0) {
32217 processingFlags[i * width + j] ^= firstMagnitudeBitMask;
32218 // first refinement
32219 var significance = neighborsSignificance[index];
32220 var sumOfSignificance = (significance & 3) +
32221 ((significance >> 2) & 3) + ((significance >> 4) & 7);
32222 contextLabel = sumOfSignificance >= 1 ? 15 : 14;
32225 var cx = contexts[contextLabel];
32226 var bit = decoder.readBit(cx);
32227 coefficentsMagnitude[index] =
32228 (coefficentsMagnitude[index] << 1) | bit;
32229 bitsDecoded[index]++;
32230 processingFlags[index] |= processedMask;
32235 runCleanupPass: function BitModel_runCleanupPass() {
32236 var decoder = this.decoder;
32237 var width = this.width, height = this.height;
32238 var neighborsSignificance = this.neighborsSignificance;
32239 var significanceState = this.significanceState;
32240 var coefficentsMagnitude = this.coefficentsMagnitude;
32241 var coefficentsSign = this.coefficentsSign;
32242 var contexts = this.contexts;
32243 var labels = this.contextLabelTable;
32244 var bitsDecoded = this.bitsDecoded;
32245 var processingFlags = this.processingFlags;
32246 var processedMask = 1;
32247 var firstMagnitudeBitMask = 2;
32248 var oneRowDown = width;
32249 var twoRowsDown = width * 2;
32250 var threeRowsDown = width * 3;
32251 for (var i0 = 0; i0 < height; i0 += 4) {
32252 for (var j = 0; j < width; j++) {
32253 var index0 = i0 * width + j;
32254 // using the property: labels[neighborsSignificance[index]] == 0
32255 // when neighborsSignificance[index] == 0
32256 var allEmpty = i0 + 3 < height &&
32257 processingFlags[index0] == 0 &&
32258 processingFlags[index0 + oneRowDown] == 0 &&
32259 processingFlags[index0 + twoRowsDown] == 0 &&
32260 processingFlags[index0 + threeRowsDown] == 0 &&
32261 neighborsSignificance[index0] == 0 &&
32262 neighborsSignificance[index0 + oneRowDown] == 0 &&
32263 neighborsSignificance[index0 + twoRowsDown] == 0 &&
32264 neighborsSignificance[index0 + threeRowsDown] == 0;
32265 var i1 = 0, index = index0;
32268 cx = this.runLengthContext;
32269 var hasSignificantCoefficent = decoder.readBit(cx);
32270 if (!hasSignificantCoefficent) {
32271 bitsDecoded[index0]++;
32272 bitsDecoded[index0 + oneRowDown]++;
32273 bitsDecoded[index0 + twoRowsDown]++;
32274 bitsDecoded[index0 + threeRowsDown]++;
32275 continue; // next column
32277 cx = this.uniformContext;
32278 i1 = (decoder.readBit(cx) << 1) | decoder.readBit(cx);
32280 index += i1 * width;
32282 var sign = this.decodeSignBit(i, j);
32283 coefficentsSign[index] = sign;
32284 coefficentsMagnitude[index] = 1;
32285 this.setNeighborsSignificance(i, j);
32286 processingFlags[index] |= firstMagnitudeBitMask;
32289 for (var i2 = i0; i2 <= i; i2++, index += width)
32290 bitsDecoded[index]++;
32294 for (; i1 < 4; i1++, index += width) {
32299 if (coefficentsMagnitude[index] ||
32300 (processingFlags[index] & processedMask) != 0)
32303 var contextLabel = labels[neighborsSignificance[index]];
32304 cx = contexts[contextLabel];
32305 var decision = decoder.readBit(cx);
32306 if (decision == 1) {
32307 var sign = this.decodeSignBit(i, j);
32308 coefficentsSign[index] = sign;
32309 coefficentsMagnitude[index] = 1;
32310 this.setNeighborsSignificance(i, j);
32311 processingFlags[index] |= firstMagnitudeBitMask;
32313 bitsDecoded[index]++;
32323 // Section F, Discrete wavelet transofrmation
32324 var Transform = (function TransformClosure() {
32325 function Transform() {
32327 Transform.prototype.calculate =
32328 function transformCalculate(subbands, u0, v0) {
32329 var ll = subbands[0];
32330 for (var i = 1, ii = subbands.length, j = 1; i < ii; i += 3, j++) {
32331 ll = this.iterate(ll, subbands[i], subbands[i + 1],
32332 subbands[i + 2], u0, v0);
32336 Transform.prototype.iterate = function Transform_iterate(ll, hl, lh, hh,
32338 var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
32339 var hlWidth = hl.width, hlHeight = hl.height, hlItems = hl.items;
32340 var lhWidth = lh.width, lhHeight = lh.height, lhItems = lh.items;
32341 var hhWidth = hh.width, hhHeight = hh.height, hhItems = hh.items;
32343 // Section F.3.3 interleave
32344 var width = llWidth + hlWidth;
32345 var height = llHeight + lhHeight;
32346 var items = new Float32Array(width * height);
32347 for (var i = 0, ii = llHeight; i < ii; i++) {
32348 var k = i * llWidth, l = i * 2 * width;
32349 for (var j = 0, jj = llWidth; j < jj; j++, k++, l += 2)
32350 items[l] = llItems[k];
32352 for (var i = 0, ii = hlHeight; i < ii; i++) {
32353 var k = i * hlWidth, l = i * 2 * width + 1;
32354 for (var j = 0, jj = hlWidth; j < jj; j++, k++, l += 2)
32355 items[l] = hlItems[k];
32357 for (var i = 0, ii = lhHeight; i < ii; i++) {
32358 var k = i * lhWidth, l = (i * 2 + 1) * width;
32359 for (var j = 0, jj = lhWidth; j < jj; j++, k++, l += 2)
32360 items[l] = lhItems[k];
32362 for (var i = 0, ii = hhHeight; i < ii; i++) {
32363 var k = i * hhWidth, l = (i * 2 + 1) * width + 1;
32364 for (var j = 0, jj = hhWidth; j < jj; j++, k++, l += 2)
32365 items[l] = hhItems[k];
32368 var bufferPadding = 4;
32369 var bufferLength = new Float32Array(Math.max(width, height) +
32370 2 * bufferPadding);
32371 var buffer = new Float32Array(bufferLength);
32372 var bufferOut = new Float32Array(bufferLength);
32374 // Section F.3.4 HOR_SR
32375 for (var v = 0; v < height; v++) {
32377 // if width = 1, when u0 even keep items as is, when odd divide by 2
32378 if ((u0 % 1) != 0) {
32379 items[v * width] /= 2;
32385 var l = bufferPadding;
32386 for (var u = 0; u < width; u++, k++, l++)
32387 buffer[l] = items[k];
32389 // Section F.3.7 extending... using max extension of 4
32390 var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
32391 var i2 = bufferPadding + width - 2, j2 = bufferPadding + width;
32392 buffer[i1--] = buffer[j1++];
32393 buffer[j2++] = buffer[i2--];
32394 buffer[i1--] = buffer[j1++];
32395 buffer[j2++] = buffer[i2--];
32396 buffer[i1--] = buffer[j1++];
32397 buffer[j2++] = buffer[i2--];
32398 buffer[i1--] = buffer[j1++];
32399 buffer[j2++] = buffer[i2--];
32401 this.filter(buffer, bufferPadding, width, u0, bufferOut);
32405 for (var u = 0; u < width; u++, k++, l++)
32406 items[k] = bufferOut[l];
32409 // Section F.3.5 VER_SR
32410 for (var u = 0; u < width; u++) {
32412 // if height = 1, when v0 even keep items as is, when odd divide by 2
32413 if ((v0 % 1) != 0) {
32420 var l = bufferPadding;
32421 for (var v = 0; v < height; v++, k += width, l++)
32422 buffer[l] = items[k];
32424 // Section F.3.7 extending... using max extension of 4
32425 var i1 = bufferPadding - 1, j1 = bufferPadding + 1;
32426 var i2 = bufferPadding + height - 2, j2 = bufferPadding + height;
32427 buffer[i1--] = buffer[j1++];
32428 buffer[j2++] = buffer[i2--];
32429 buffer[i1--] = buffer[j1++];
32430 buffer[j2++] = buffer[i2--];
32431 buffer[i1--] = buffer[j1++];
32432 buffer[j2++] = buffer[i2--];
32433 buffer[i1--] = buffer[j1++];
32434 buffer[j2++] = buffer[i2--];
32436 this.filter(buffer, bufferPadding, height, v0, bufferOut);
32440 for (var v = 0; v < height; v++, k += width, l++)
32441 items[k] = bufferOut[l];
32452 // Section 3.8.2 Irreversible 9-7 filter
32453 var IrreversibleTransform = (function IrreversibleTransformClosure() {
32454 function IrreversibleTransform() {
32455 Transform.call(this);
32458 IrreversibleTransform.prototype = Object.create(Transform.prototype);
32459 IrreversibleTransform.prototype.filter =
32460 function irreversibleTransformFilter(y, offset, length, i0, x) {
32461 var i0_ = Math.floor(i0 / 2);
32462 var i1_ = Math.floor((i0 + length) / 2);
32463 var offset_ = offset - (i0 % 1);
32465 var alpha = -1.586134342059924;
32466 var beta = -0.052980118572961;
32467 var gamma = 0.882911075530934;
32468 var delta = 0.443506852043971;
32469 var K = 1.230174104914001;
32473 var j = offset_ - 2;
32474 for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
32478 var j = offset_ - 3;
32479 for (var n = i0_ - 2, nn = i1_ + 2; n < nn; n++, j += 2)
32483 var j = offset_ - 2;
32484 for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
32485 x[j] -= delta * (x[j - 1] + x[j + 1]);
32488 var j = offset_ - 1;
32489 for (var n = i0_ - 1, nn = i1_ + 1; n < nn; n++, j += 2)
32490 x[j] -= gamma * (x[j - 1] + x[j + 1]);
32494 for (var n = i0_, nn = i1_ + 1; n < nn; n++, j += 2)
32495 x[j] -= beta * (x[j - 1] + x[j + 1]);
32498 var j = offset_ + 1;
32499 for (var n = i0_, nn = i1_; n < nn; n++, j += 2)
32500 x[j] -= alpha * (x[j - 1] + x[j + 1]);
32503 return IrreversibleTransform;
32506 // Section 3.8.1 Reversible 5-3 filter
32507 var ReversibleTransform = (function ReversibleTransformClosure() {
32508 function ReversibleTransform() {
32509 Transform.call(this);
32512 ReversibleTransform.prototype = Object.create(Transform.prototype);
32513 ReversibleTransform.prototype.filter =
32514 function reversibleTransformFilter(y, offset, length, i0, x) {
32515 var i0_ = Math.floor(i0 / 2);
32516 var i1_ = Math.floor((i0 + length) / 2);
32517 var offset_ = offset - (i0 % 1);
32519 for (var n = i0_, nn = i1_ + 1, j = offset_; n < nn; n++, j += 2)
32520 x[j] = y[j] - Math.floor((y[j - 1] + y[j + 1] + 2) / 4);
32522 for (var n = i0_, nn = i1_, j = offset_ + 1; n < nn; n++, j += 2)
32523 x[j] = y[j] + Math.floor((x[j - 1] + x[j + 1]) / 2);
32526 return ReversibleTransform;
32533 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
32534 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
32538 var bidi = PDFJS.bidi = (function bidiClosure() {
32539 // Character types for symbols from 0000 to 00FF.
32541 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
32542 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
32543 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
32544 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
32545 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
32546 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32547 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
32548 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32549 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32550 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
32551 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
32552 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
32553 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
32554 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
32555 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32556 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32557 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32558 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
32559 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
32562 // Character types for symbols from 0600 to 06FF
32563 var arabicTypes = [
32564 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32565 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
32566 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32567 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32568 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32569 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32570 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
32571 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
32572 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
32573 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
32574 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32575 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32576 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', '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', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
32583 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
32584 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
32585 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
32588 function isOdd(i) {
32589 return (i & 1) != 0;
32592 function isEven(i) {
32593 return (i & 1) == 0;
32596 function findUnequal(arr, start, value) {
32598 for (var j = start, jj = arr.length; j < jj; ++j) {
32599 if (arr[j] != value)
32605 function setValues(arr, start, end, value) {
32606 for (var j = start; j < end; ++j) {
32611 function reverseValues(arr, start, end) {
32612 for (var i = start, j = end - 1; i < j; ++i, --j) {
32619 function mirrorGlyphs(c) {
32621 # BidiMirroring-1.txt
32622 0028; 0029 # LEFT PARENTHESIS
32623 0029; 0028 # RIGHT PARENTHESIS
32624 003C; 003E # LESS-THAN SIGN
32625 003E; 003C # GREATER-THAN SIGN
32626 005B; 005D # LEFT SQUARE BRACKET
32627 005D; 005B # RIGHT SQUARE BRACKET
32628 007B; 007D # LEFT CURLY BRACKET
32629 007D; 007B # RIGHT CURLY BRACKET
32630 00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
32631 00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
32659 function bidi(text, startLevel) {
32660 var str = text.str;
32661 var strLength = str.length;
32662 if (strLength == 0)
32665 // get types, fill arrays
32672 for (var i = 0; i < strLength; ++i) {
32673 chars[i] = str.charAt(i);
32675 var charCode = str.charCodeAt(i);
32676 var charType = 'L';
32677 if (charCode <= 0x00ff)
32678 charType = baseTypes[charCode];
32679 else if (0x0590 <= charCode && charCode <= 0x05f4)
32681 else if (0x0600 <= charCode && charCode <= 0x06ff)
32682 charType = arabicTypes[charCode & 0xff];
32683 else if (0x0700 <= charCode && charCode <= 0x08AC)
32686 if (charType == 'R' || charType == 'AL' || charType == 'AN')
32689 oldtypes[i] = types[i] = charType;
32692 // detect the bidi method
32693 // if there are no rtl characters then no bidi needed
32694 // if less than 30% chars are rtl then string is primarily ltr
32695 // if more than 30% chars are rtl then string is primarily rtl
32696 if (numBidi == 0) {
32697 text.direction = 'ltr';
32701 if (startLevel == -1) {
32702 if ((strLength / numBidi) < 0.3) {
32703 text.direction = 'ltr';
32706 text.direction = 'rtl';
32713 for (var i = 0; i < strLength; ++i) {
32714 levels[i] = startLevel;
32718 X1-X10: skip most of this, since we are NOT doing the embeddings.
32721 var e = isOdd(startLevel) ? 'R' : 'L';
32726 W1. Examine each non-spacing mark (NSM) in the level run, and change the
32727 type of the NSM to the type of the previous character. If the NSM is at the
32728 start of the level run, it will get the type of sor.
32731 var lastType = sor;
32732 for (var i = 0; i < strLength; ++i) {
32733 if (types[i] == 'NSM')
32734 types[i] = lastType;
32736 lastType = types[i];
32740 W2. Search backwards from each instance of a European number until the
32741 first strong type (R, L, AL, or sor) is found. If an AL is found, change
32742 the type of the European number to Arabic number.
32745 var lastType = sor;
32746 for (var i = 0; i < strLength; ++i) {
32749 types[i] = (lastType == 'AL') ? 'AN' : 'EN';
32750 else if (t == 'R' || t == 'L' || t == 'AL')
32755 W3. Change all ALs to R.
32758 for (var i = 0; i < strLength; ++i) {
32765 W4. A single European separator between two European numbers changes to a
32766 European number. A single common separator between two numbers of the same
32767 type changes to that type:
32770 for (var i = 1; i < strLength - 1; ++i) {
32771 if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN')
32773 if (types[i] == 'CS' && (types[i - 1] == 'EN' || types[i - 1] == 'AN') &&
32774 types[i + 1] == types[i - 1])
32775 types[i] = types[i - 1];
32779 W5. A sequence of European terminators adjacent to European numbers changes
32780 to all European numbers:
32783 for (var i = 0; i < strLength; ++i) {
32784 if (types[i] == 'EN') {
32786 for (var j = i - 1; j >= 0; --j) {
32787 if (types[j] != 'ET')
32792 for (var j = i + 1; j < strLength; --j) {
32793 if (types[j] != 'ET')
32801 W6. Otherwise, separators and terminators change to Other Neutral:
32804 for (var i = 0; i < strLength; ++i) {
32806 if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS')
32811 W7. Search backwards from each instance of a European number until the
32812 first strong type (R, L, or sor) is found. If an L is found, then change
32813 the type of the European number to L.
32816 var lastType = sor;
32817 for (var i = 0; i < strLength; ++i) {
32820 types[i] = (lastType == 'L') ? 'L' : 'EN';
32821 else if (t == 'R' || t == 'L')
32826 N1. A sequence of neutrals takes the direction of the surrounding strong
32827 text if the text on both sides has the same direction. European and Arabic
32828 numbers are treated as though they were R. Start-of-level-run (sor) and
32829 end-of-level-run (eor) are used at level run boundaries.
32832 for (var i = 0; i < strLength; ++i) {
32833 if (types[i] == 'ON') {
32834 var end = findUnequal(types, i + 1, 'ON');
32837 before = types[i - 1];
32839 if (end + 1 < strLength)
32840 after = types[end + 1];
32845 if (before == after)
32846 setValues(types, i, end, before);
32847 i = end - 1; // reset to end (-1 so next iteration is ok)
32852 N2. Any remaining neutrals take the embedding direction.
32855 for (var i = 0; i < strLength; ++i) {
32856 if (types[i] == 'ON')
32861 I1. For all characters with an even (left-to-right) embedding direction,
32862 those of type R go up one level and those of type AN or EN go up two
32864 I2. For all characters with an odd (right-to-left) embedding direction,
32865 those of type L, EN or AN go up one level.
32868 for (var i = 0; i < strLength; ++i) {
32870 if (isEven(levels[i])) {
32873 } else if (t == 'AN' || t == 'EN') {
32876 } else { // isOdd, so
32877 if (t == 'L' || t == 'AN' || t == 'EN') {
32884 L1. On each line, reset the embedding level of the following characters to
32885 the paragraph embedding level:
32887 segment separators,
32888 paragraph separators,
32889 any sequence of whitespace characters preceding a segment separator or
32890 paragraph separator, and any sequence of white space characters at the end
32894 // don't bother as text is only single line
32897 L2. From the highest level found in the text to the lowest odd level on
32898 each line, reverse any contiguous sequence of characters that are at that
32902 // find highest level & lowest odd level
32904 var highestLevel = -1;
32905 var lowestOddLevel = 99;
32906 for (var i = 0, ii = levels.length; i < ii; ++i) {
32907 var level = levels[i];
32908 if (highestLevel < level)
32909 highestLevel = level;
32910 if (lowestOddLevel > level && isOdd(level))
32911 lowestOddLevel = level;
32914 // now reverse between those limits
32916 for (var level = highestLevel; level >= lowestOddLevel; --level) {
32917 // find segments to reverse
32919 for (var i = 0, ii = levels.length; i < ii; ++i) {
32920 if (levels[i] < level) {
32922 reverseValues(chars, start, i);
32925 } else if (start < 0) {
32930 reverseValues(chars, start, levels.length);
32935 L3. Combining marks applied to a right-to-left base character will at this
32936 point precede their base character. If the rendering engine expects them to
32937 follow the base characters in the final display process, then the ordering
32938 of the marks and the base character must be reversed.
32941 // don't bother for now
32944 L4. A character that possesses the mirrored property as specified by
32945 Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
32946 directionality of that character is R.
32949 // don't mirror as characters are already mirrored in the pdf
32951 // Finally, return string
32954 for (var i = 0, ii = chars.length; i < ii; ++i) {
32956 if (ch != '<' && ch != '>')
32966 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
32967 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
32971 var Metadata = PDFJS.Metadata = (function MetadataClosure() {
32972 function fixMetadata(meta) {
32973 return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {
32974 var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,
32975 function(code, d1, d2, d3) {
32976 return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
32979 for (var i = 0; i < bytes.length; i += 2) {
32980 var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
32981 chars += code >= 32 && code < 127 && code != 60 && code != 62 &&
32982 code != 38 && false ? String.fromCharCode(code) :
32983 '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
32985 return '>' + chars;
32989 function Metadata(meta) {
32990 if (typeof meta === 'string') {
32991 // Ghostscript produces invalid metadata
32992 meta = fixMetadata(meta);
32994 var parser = new DOMParser();
32995 meta = parser.parseFromString(meta, 'application/xml');
32996 } else if (!(meta instanceof Document)) {
32997 error('Metadata: Invalid metadata object');
33000 this.metaDocument = meta;
33001 this.metadata = {};
33005 Metadata.prototype = {
33006 parse: function Metadata_parse() {
33007 var doc = this.metaDocument;
33008 var rdf = doc.documentElement;
33010 if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
33011 rdf = rdf.firstChild;
33012 while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf')
33013 rdf = rdf.nextSibling;
33016 var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
33017 if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes())
33020 var childNodes = rdf.childNodes, desc, namespace, entries, entry;
33022 for (var i = 0, length = childNodes.length; i < length; i++) {
33023 desc = childNodes[i];
33024 if (desc.nodeName.toLowerCase() !== 'rdf:description')
33028 for (var ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
33029 if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text')
33030 entries.push(desc.childNodes[ii]);
33033 for (ii = 0, iLength = entries.length; ii < iLength; ii++) {
33034 var entry = entries[ii];
33035 var name = entry.nodeName.toLowerCase();
33036 this.metadata[name] = entry.textContent.trim();
33041 get: function Metadata_get(name) {
33042 return this.metadata[name] || null;
33045 has: function Metadata_has(name) {
33046 return typeof this.metadata[name] !== 'undefined';
33053 }).call((typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window);