no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD CLOSED TREE
[gecko.git] / js / src / octane / pdfjs.js
blob79537541df8523c8f3cec94dc2cdd6ecee3e45b1
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.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
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";
27 var canvas_logs = [];
29 var PdfJS = new BenchmarkSuite("PdfJS", [10124921], [
30   new Benchmark("PdfJS", false, false, 24,
31     runPdfJS, setupPdfJS, tearDownPdfJS, null, 4)
32 ]);
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";
40     }
42   PdfJS_window.__resources__[pdf_file] = buffer(PdfJS_window.atob(getPDF()));
45 function runPdfJS() {
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) {
54       if (i > j) return;
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));
61       });
62     }
63     renderPages(1, pdf.numPages);
64   });
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");
82       throw message;
83     }
84   }
85   // Allow GC of global state.
86   delete this.PDFJS;
87   delete this.PdfJS_window;
90 function buffer(s) {
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);
94   return b;
97 function hash(s) {
98   var up = Math.floor((s.length + 3) / 4);
99   var h = 0;
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;
103   }
104   return h;
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")
125       next({data: "{}"});
126     else
127       eval(next);
128   }
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) {
147   var result = "";
148   if (data.length > 0) {
149     var i = 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] + "==";
157       } else {
158         result += PdfJS_window.__to64__[((b1 & 0x3) << 4) | (b2 >> 4)];
159         if (i === data.length + 1) {
160           result += PdfJS_window.__to64__[(b2 & 0xF) << 2] + "=";
161         } else {
162           result += PdfJS_window.__to64__[((b2 & 0xF) << 2) | (b3 >> 6)] +
163               PdfJS_window.__to64__[b3 & 0x3F];
164         }
165       }
166     }
167   }
168   return result;
171 PdfJS_window.__from64__ =
172   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
174 PdfJS_windowInstall("atob", function(data) {
175   var result = "";
176   var i = 0;
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));
183     if (x3 != 0x40) {
184        result += String.fromCharCode(((x2 & 0x0F) << 4) | (x3 >> 2));
185        if (x4 != 0x40) {
186          result += String.fromCharCode(((x3 & 0x03) << 6) | x4);
187       }
188     }
189   }
190   return result;
194 PdfJS_windowInstall("XMLHttpRequest", function() {
195   this.open = function(type, url, some_bool) {
196     this.url = url;
197   }
198   this.overrideMimeType = function() {}
199   this.send = function() {
200     this.response = PdfJS_window.__resources__[this.url];
201     this.readyState = 4;
202     this.status = 0;
203     this.onreadystatechange();
204   }
207 PdfJS_windowInstall("console", this.console ? this.console : {
208   log: function(s) {
209     // To verify that the test produces the right results,
210     // uncomment this code.
211     /*
212     var re = new RegExp("%d", "g");
213     var args = arguments;
214     var i = 0;
215     print(s.replace(re, function() { return args[++i] }));
216     */
217   }
220 PdfJS_windowInstall("location", {
221   protocol: ""
224 PdfJS_windowInstall("Event", function() {
225   this.initEvent = function(name) {
226     this.name = name;
227   }
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;
236   };
237   this.removeEventListener = function(name) {
238     delete this.__listeners__[name];
239   };
240   this.dispatchEvent = function(event) {
241     this.__listeners__[event.name](event)
242   };
243   this.getElementsByTagName = function(name) {
244     if (name === "head") {
245       return [{appendChild: function() {}}]
246     }
247   };
248   this.appendChild = function() {};
249   this.setAttribute = function() {};
250   this.sheet = {
251     cssRules: [],
252     insertRule: function() {}
253   };
256 PdfJS_windowInstall("Context", function() {
257   this.__log__ = [];
258   this.save = function() {
259     this.__log__.push("save","\n");
260   }
261   this.restore = function() {
262     this.__log__.push("restore","\n");
263   }
264   this.transform = function(a,b,c,d,e,f) {
265     this.__log__.push("transform",a,b,c,d,e,f,"\n");
266   }
267   this.translate = function(x,y) {
268     this.__log__.push("translate",x,y,"\n");
269   }
270   this.scale = function(x,y) {
271     this.__log__.push("scale",x,y,"\n");
272   }
273   this.rect = function(x,y,w,h) {
274     this.__log__.push("rect",x,y,w,h,"\n");
275   }
276   this.clip = function() {
277     this.__log__.push("clip","\n");
278   }
279   this.fill = function() {
280     this.__log__.push("fill","\n");
281   }
282   this.stroke = function() {
283     this.__log__.push("stroke","\n");
284   }
285   this.beginPath = function() {
286     this.__log__.push("beginPath","\n");
287   }
288   this.closePath = function() {
289     this.__log__.push("closePath","\n");
290   }
291   this.moveTo = function(x,y) {
292     this.__log__.push("moveTo",x,y,"\n");
293   }
294   this.lineTo = function(x,y) {
295     this.__log__.push("lineTo",x,y,"\n");
296   }
297   this.fillRect = function(x,y,w,h) {
298     this.__log__.push("fillRect",x,y,w,h,"\n");
299   }
300   this.fillText = function(s,x,y,w) {
301     this.__log__.push("fillText",s,x,y,"\n");
302   }
303   this.strokeText = function(s,x,y,w) {
304     this.__log__.push("strokeText",s,x,y,"\n");
305   }
306   this.getImageData = function(x,y,w,h) {
307     this.__log__.push("getImageData",x,y,w,h,"\n");
308     return {data: []};
309   }
310   this.putImageData = function(data,x,y) {
311     this.__log__.push("putImageData","{...}",x,y,"\n");
312   }
313   this.drawImage = function(image,x,y) {
314     this.__log__.push("drawImage","<elem>",x,y,"\n");
315   }
316   this.getParameter = function(name) {
317     this.__log__.push("getParameter",name,"\n");
318     return null;
319   }
320   this.enable = function() {
321     this.__log__.push("enable","\n");
322   }
323   this.disable = function() {
324     this.__log__.push("disable","\n");
325   }
326   this.depthFunc = function(param) {
327     this.__log__.push("depthFunc",param,"\n");
328   }
329   this.clearColor = function(r,g,b,a) {
330     this.__log__.push("clearColor",r,g,b,a,"\n");
331   }
332   this.clear = function(m) {
333     this.__log__.push("clear",m,"\n");
334   }
335   this.clearRect = function(x,y,w,h) {
336     this.__log__.push("createRect",x,y,w,h,"\n");
337   }
340 PdfJS_windowInstall("Canvas", function() {
341   this.getContext = function() {
342     return new PdfJS_window.Context();
343   }
344   this.width = 100;
345   this.height = 100;
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) {
353     var element;
354     if (element_type === "canvas") {
355       element = new PdfJS_window.Canvas();
356     } else {
357       element = new PdfJS_window.Element(element_type);
358     }
359     element.parentNode = new PdfJS_window.Element("dummy_parent");
360     return element;
361   },
362   getElementById : function(name) {
363     if (name === "canvas") {
364       return new PdfJS_window.Canvas();
365     } else {
366       return undefined;
367     }
368   },
369   getElementsByTagName : function(element) {
370     if (element === "script") {
371       return new Array(new this.createElement(element));
372     }
373   },
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. ////////
386 function getPDF() {
387   return "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NyAzOTkuNyA1MTMuOSA3OTkuNCAyODUuNSAzNDIuNiAyODUuNSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSAyODUuNSAyODUuNSAyODUuNSA3OTkuNCA0ODUuMyA0ODUuMyA3OTkuNCA3NzAuNyA3MjcuOSA3NDIuMyA3ODUgNjk5LjQgNjcwLjggODA2LjUgNzcwLjcgMzcxIDUyOC4xIDc5OS4yIDY0Mi4zIDk0MiA3NzAuNyA3OTkuNCA2OTkuNCA3OTkuNCA3NTYuNSA1NzEgNzQyLjMgNzcwLjcgNzcwLjcgMTA1Ni4yIDc3MC43IDc3MC43IDYyOC4xIDI4NS41IDUxMy45IDI4NS41IDUxMy45IDI4NS41IDI4NS41IDUxMy45IDU3MSA0NTYuOCA1NzEgNDU3LjIgMzE0IDUxMy45IDU3MSAyODUuNSAzMTQgNTQyLjQgMjg1LjUgODU2LjUgNTcxIDUxMy45IDU3MSA1NDIuNCA0MDIgNDA1LjQgMzk5LjcgNTcxIDU0Mi40IDc0Mi4zIDU0Mi40IDU0Mi40XQplbmRvYmoKMTYgMCBvYmoKWzYzOC45XQplbmRvYmoKMTcgMCBvYmoKWzU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDMxMi41IDMxMi41IDM0Mi42IDg3NSA1MzEuMiA1MzEuMiA4NzUgODQ5LjUgNzk5LjggODEyLjUgODYyLjMgNzM4LjQgNzA3LjIgODg0LjMgODc5LjYgNDE5IDU4MSA4ODAuOCA2NzUuOSAxMDY3LjEgODc5LjYgODQ0LjkgNzY4LjUgODQ0LjkgODM5LjEgNjI1IDc4Mi40IDg2NC42IDg0OS41IDExNjIgODQ5LjUgODQ5LjUgNjg3LjUgMzEyLjUgNTgxIDMxMi41IDU2Mi41IDMxMi41IDMxMi41IDU0Ni45IDYyNSA1MDAgNjI1IDUxMy4zIDM0My43IDU2Mi41IDYyNSAzMTIuNSAzNDMuNyA1OTMuNyAzMTIuNSA5MzcuNSA2MjUgNTYyLjUgNjI1IDU5My43IDQ1OS41IDQ0My44IDQzNy41IDYyNV0KZW5kb2JqCjE4IDAgb2JqCls1ODMuMyA1NTUuNiA1NTUuNiA4MzMuMyA4MzMuMyAyNzcuOCAzMDUuNiA1MDAgNTAwIDUwMCA1MDAgNTAwIDc1MCA0NDQuNCA1MDAgNzIyLjIgNzc3LjggNTAwIDkwMi44IDEwMTMuOSA3NzcuOCAyNzcuOCAyNzcuOCA1MDAgODMzLjMgNTAwIDgzMy4zIDc3Ny44IDI3Ny44IDM4OC45IDM4OC45IDUwMCA3NzcuOCAyNzcuOCAzMzMuMyAyNzcuOCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDI3Ny44IDI3Ny44IDI3Ny44IDc3Ny44IDQ3Mi4yIDQ3Mi4yIDc3Ny44IDc1MCA3MDguMyA3MjIuMiA3NjMuOSA2ODAuNiA2NTIuOCA3ODQuNyA3NTAgMzYxLjEgNTEzLjkgNzc3LjggNjI1IDkxNi43IDc1MCA3NzcuOCA2ODAuNiA3NzcuOCA3MzYuMSA1NTUuNiA3MjIuMiA3NTAgNzUwIDEwMjcuOCA3NTAgNzUwIDYxMS4xIDI3Ny44IDUwMCAyNzcuOCA1MDAgMjc3LjggMjc3LjggNTAwIDU1NS42IDQ0NC40IDU1NS42IDQ0NC40IDMwNS42IDUwMCA1NTUuNiAyNzcuOCAzMDUuNiA1MjcuOCAyNzcuOCA4MzMuMyA1NTUuNiA1MDAgNTU1LjYgNTI3LjggMzkxLjcgMzk0LjQgMzg4LjkgNTU1LjYgNTI3LjggNzIyLjIgNTI3LjggNTI3LjggNDQ0LjRdCmVuZG9iagoxOSAwIG9iagpbODY5LjQgODE4LjEgODMwLjYgODgxLjkgNzU1LjYgNzIzLjYgOTA0LjIgOTAwIDQzNi4xIDU5NC40IDkwMS40IDY5MS43IDEwOTEuNyA5MDAgODYzLjkgNzg2LjEgODYzLjkgODYyLjUgNjM4LjkgODAwIDg4NC43IDg2OS40IDExODguOSA4NjkuNCA4NjkuNCA3MDIuOCAzMTkuNCA2MDIuOCAzMTkuNCA1NzUgMzE5LjQgMzE5LjQgNTU5IDYzOC45IDUxMS4xIDYzOC45IDUyNy4xIDM1MS40IDU3NSA2MzguOSAzMTkuNCAzNTEuNCA2MDYuOSAzMTkuNCA5NTguMyA2MzguOSA1NzUgNjM4LjkgNjA2LjkgNDczLjYgNDUzLjYgNDQ3LjJdCmVuZG9iagoyMCAwIG9iagpbMjcyIDMyNi40IDI3MiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiAyNzIgMjcyIDI3MiA3NjEuNiA0NjIuNCA0NjIuNCA3NjEuNiA3MzQgNjkzLjQgNzA3LjIgNzQ3LjggNjY2LjIgNjM5IDc2OC4zIDczNCAzNTMuMiA1MDMgNzYxLjIgNjExLjggODk3LjIgNzM0IDc2MS42IDY2Ni4yIDc2MS42IDcyMC42IDU0NCA3MDcuMiA3MzQgNzM0IDEwMDYgNzM0IDczNCA1OTguNCAyNzIgNDg5LjYgMjcyIDQ4OS42IDI3MiAyNzIgNDg5LjYgNTQ0IDQzNS4yIDU0NCA0MzUuMiAyOTkuMiA0ODkuNiA1NDQgMjcyIDI5OS4yIDUxNi44IDI3MiA4MTYgNTQ0IDQ4OS42IDU0NCA1MTYuOCAzODAuOCAzODYuMiAzODAuOCA1NDQgNTE2LjggNzA3LjIgNTE2LjggNTE2LjggNDM1LjIgNDg5LjYgOTc5LjIgNDg5LjYgNDg5LjYgNDg5LjZdCmVuZG9iagoyMSAwIG9iagpbNTAwXQplbmRvYmoKMjIgMCBvYmoKWzYwMi4xIDcyNi4zIDY5My4zIDMyNy42IDQ3MS41IDcxOS40IDU3NiA4NTAgNjkzLjMgNzE5LjggNjI4LjIgNzE5LjggNjgwLjUgNTEwLjkgNjY3LjYgNjkzLjMgNjkzLjMgOTU0LjUgNjkzLjMgNjkzLjMgNTYzLjEgMjQ5LjYgNDU4LjYgMjQ5LjYgNDU4LjYgMjQ5LjYgMjQ5LjYgNDU4LjYgNTEwLjkgNDA2LjQgNTEwLjkgNDA2LjQgMjc1LjggNDU4LjYgNTEwLjkgMjQ5LjYgMjc1LjggNDg0LjcgMjQ5LjYgNzcyLjEgNTEwLjkgNDU4LjYgNTEwLjkgNDg0LjcgMzU0LjEgMzU5LjQgMzU0LjEgNTEwLjkgNDg0LjcgNjY3LjYgNDg0LjcgNDg0LjddCmVuZG9iagoyMyAwIG9iaiA8PAovTGVuZ3RoMSAxNDc4Ci9MZW5ndGgyIDg1MTgKL0xlbmd0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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: */
399 var PDFJS = {};
401 (function pdfjsWrapper() {
402   // Use strict in our context only - users might not want it
403   'use strict';
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: */
411 'use strict';
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 = {};
427 // getPdf()
428 // Convenience function to perform binary Ajax GET
429 // Usage: getPdf('http://...', callback)
430 //        getPdf({
431 //                 url:String ,
432 //                 [,progress:Function, error:Function]
433 //               },
434 //               callback)
435 function getPdf(arg, callback) {
436   var params = arg;
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);
458         callback(data);
459       } else if (params.error) {
460         params.error(e);
461       }
462     }
463   };
464   xhr.send(null);
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;
473     this.xref = xref;
474     this.ref = ref;
476     this.displayReadyPromise = null;
477   }
479   Page.prototype = {
480     getPageProp: function Page_getPageProp(key) {
481       return this.pageDict.get(key);
482     },
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');
488         if (!dict)
489           break;
490         obj = dict.get(key);
491       }
492       return obj;
493     },
494     get content() {
495       return shadow(this, 'content', this.getPageProp('Contents'));
496     },
497     get resources() {
498       return shadow(this, 'resources', this.inheritPageProp('Resources'));
499     },
500     get mediaBox() {
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);
506     },
507     get view() {
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);
518       if (!cropBox)
519         return shadow(this, 'view', mediaBox);
521       return shadow(this, 'view', cropBox);
522     },
523     get annotations() {
524       return shadow(this, 'annotations', this.inheritPageProp('Annots'));
525     },
526     get rotate() {
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) {
530         rotate = 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;
537       }
538       return shadow(this, 'rotate', rotate);
539     },
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)) {
546         // fetching items
547         var streams = [];
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)) {
553         content.reset();
554       } else if (!content) {
555         // replacing non-existent page content with empty one
556         content = new Stream(new Uint8Array(0));
557       }
559       var pe = this.pe = new PartialEvaluator(
560                                 xref, handler, 'p' + this.pageNumber + '_');
562       return pe.getOperatorList(content, resources, dependency);
563     },
565     getLinks: function Page_getLinks() {
566       var links = [];
567       var annotations = pageGetAnnotations();
568       var i, n = annotations.length;
569       for (i = 0; i < n; ++i) {
570         if (annotations[i].type != 'Link')
571           continue;
572         links.push(annotations[i]);
573       }
574       return links;
575     },
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');
582         }
583         if (!item)
584           return null;
585         return item.get(name);
586       }
587       function isValidUrl(url) {
588         if (!url)
589           return false;
590         var colon = url.indexOf(':');
591         if (colon < 0)
592           return false;
593         var protocol = url.substr(0, colon);
594         switch (protocol) {
595           case 'http':
596           case 'https':
597           case 'ftp':
598           case 'mailto':
599             return true;
600           default:
601             return false;
602         }
603       }
605       var annotations = this.annotations || [];
606       var i, n = annotations.length;
607       var items = [];
608       for (i = 0; i < n; ++i) {
609         var annotationRef = annotations[i];
610         var annotation = xref.fetch(annotationRef);
611         if (!isDict(annotation))
612           continue;
613         var subtype = annotation.get('Subtype');
614         if (!isName(subtype))
615           continue;
616         var rect = annotation.get('Rect');
618         var item = {};
619         item.type = subtype.name;
620         item.rect = rect;
621         switch (subtype.name) {
622           case 'Link':
623             var a = annotation.get('A');
624             if (a) {
625               switch (a.get('S').name) {
626                 case 'URI':
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))
631                     url = '';
632                   item.url = url;
633                   break;
634                 case 'GoTo':
635                   item.dest = a.get('D');
636                   break;
637                 default:
638                   TODO('other link types');
639               }
640             } else if (annotation.has('Dest')) {
641               // simple destination link
642               var dest = annotation.get('Dest');
643               item.dest = isName(dest) ? dest.name : dest;
644             }
645             break;
646           case 'Widget':
647             var fieldType = getInheritableProperty(annotation, 'FT');
648             if (!isName(fieldType))
649               break;
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 '.'.
653             var fieldName = [];
654             var namedItem = annotation, ref = annotationRef;
655             while (namedItem) {
656               var parent = namedItem.get('Parent');
657               var parentRef = namedItem.getRaw('Parent');
658               var name = namedItem.get('T');
659               if (name) {
660                 fieldName.unshift(stringToPDFString(name));
661               } else {
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');
668                 var j, jj;
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)
672                     break;
673                 }
674                 fieldName.unshift('`' + j);
675               }
676               namedItem = parent;
677               ref = parentRef;
678             }
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);
684             if (m)
685               item.fontSize = parseFloat(m[1]);
686             item.textAlignment = getInheritableProperty(annotation, 'Q');
687             item.flags = getInheritableProperty(annotation, 'Ff') || 0;
688             break;
689           case 'Text':
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;
696             break;
697           default:
698             TODO('unimplemented annotation type: ' + subtype.name);
699             break;
700         }
701         items.push(item);
702       }
703       return items;
704     }
705   };
707   return Page;
708 })();
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.
716  */
717 var PDFDocument = (function PDFDocumentClosure() {
718   function PDFDocument(arg, callback) {
719     if (isStream(arg))
720       init.call(this, arg);
721     else if (isArrayBuffer(arg))
722       init.call(this, new Stream(arg));
723     else
724       error('PDFDocument: Unknown argument type');
725   }
727   function init(stream) {
728     assertWellFormed(stream.length > 0, 'stream must have data');
729     this.stream = stream;
730     this.setup();
731     this.acroForm = this.catalog.catDict.get('AcroForm');
732   }
734   function find(stream, needle, limit, backwards) {
735     var pos = stream.pos;
736     var end = stream.end;
737     var str = '';
738     if (pos + limit > end)
739       limit = end - pos;
740     for (var n = 0; n < limit; ++n)
741       str += stream.getChar();
742     stream.pos = pos;
743     var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
744     if (index == -1)
745       return false; /* not found */
746     stream.pos += index;
747     return true; /* found */
748   }
750   PDFDocument.prototype = {
751     get linearization() {
752       var length = this.stream.length;
753       var linearization = false;
754       if (length) {
755         linearization = new Linearization(this.stream);
756         if (linearization.length != length)
757           linearization = false;
758       }
759       // shadow the prototype getter with a data property
760       return shadow(this, 'linearization', linearization);
761     },
762     get startXRef() {
763       var stream = this.stream;
764       var startXRef = 0;
765       var linearization = this.linearization;
766       if (linearization) {
767         // Find end of first obj.
768         stream.reset();
769         if (find(stream, 'endobj', 1024))
770           startXRef = stream.pos + 6;
771       } else {
772         // Find startxref by jumping backward from the end of the file.
773         var step = 1024;
774         var found = false, pos = stream.end;
775         while (!found && pos > 0) {
776           pos -= step - 'startxref'.length;
777           if (pos < 0)
778             pos = 0;
779           stream.pos = pos;
780           found = find(stream, 'startxref', step, true);
781         }
782         if (found) {
783           stream.skip(9);
784           var ch;
785           do {
786             ch = stream.getChar();
787           } while (Lexer.isSpace(ch));
788           var str = '';
789           while ((ch - '0') <= 9) {
790             str += ch;
791             ch = stream.getChar();
792           }
793           startXRef = parseInt(str, 10);
794           if (isNaN(startXRef))
795             startXRef = 0;
796         }
797       }
798       // shadow the prototype getter with a data property
799       return shadow(this, 'startXRef', startXRef);
800     },
801     get mainXRefEntriesOffset() {
802       var mainXRefEntriesOffset = 0;
803       var linearization = this.linearization;
804       if (linearization)
805         mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
806       // shadow the prototype getter with a data property
807       return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
808     },
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;
813       stream.reset();
814       if (find(stream, '%PDF-', 1024)) {
815         // Found the header, trim off any garbage before it.
816         stream.moveStart();
817         return;
818       }
819       // May not be a PDF file, continue anyway.
820     },
821     setup: function PDFDocument_setup(ownerPassword, userPassword) {
822       this.checkHeader();
823       var xref = new XRef(this.stream,
824                           this.startXRef,
825                           this.mainXRefEntriesOffset);
826       this.xref = xref;
827       this.catalog = new Catalog(xref);
828     },
829     get numPages() {
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);
834     },
835     getDocumentInfo: function PDFDocument_getDocumentInfo() {
836       var info;
837       if (this.xref.trailer.has('Info')) {
838         var infoDict = this.xref.trailer.get('Info');
840         info = {};
841         infoDict.forEach(function(key, value) {
842           info[key] = typeof value !== 'string' ? value :
843             stringToPDFString(value);
844         });
845       }
847       return shadow(this, 'getDocumentInfo', info);
848     },
849     getFingerprint: function PDFDocument_getFingerprint() {
850       var xref = this.xref, fileID;
851       if (xref.trailer.has('ID')) {
852         fileID = '';
853         var id = xref.trailer.get('ID')[0];
854         id.split('').forEach(function(el) {
855           fileID += Number(el.charCodeAt(0)).toString(16);
856         });
857       } else {
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);
862         fileID = '';
863         for (var i = 0, length = hash.length; i < length; i++) {
864           fileID += Number(hash[i]).toString(16);
865         }
866       }
868       return shadow(this, 'getFingerprint', fileID);
869     },
870     getPage: function PDFDocument_getPage(n) {
871       return this.catalog.getPage(n);
872     }
873   };
875   return PDFDocument;
876 })();
878 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
879 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
881 'use strict';
883 function log(msg) {
884   if (PdfJS_window.console && PdfJS_window.console.log)
885     PdfJS_window.console.log(msg);
886   else if (print)
887     print(msg);
890 function warn(msg) {
891   if (verbosity >= WARNINGS)
892     log('Warning: ' + msg);
895 function backtrace() {
896   try {
897     throw new Error();
898   } catch (e) {
899     return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
900   }
903 function error(msg) {
904   log('Error: ' + msg);
905   log(backtrace());
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) {
919   if (!cond)
920     error(msg);
923 // In a well-formed PDF, |cond| holds.  If it doesn't, subsequent
924 // behavior is undefined.
925 function assertWellFormed(cond, msg) {
926   if (!cond)
927     malformed(msg);
930 function shadow(obj, prop, value) {
931   Object.defineProperty(obj, prop, { value: value,
932                                      enumerable: true,
933                                      configurable: true,
934                                      writable: false });
935   return value;
938 function bytesToString(bytes) {
939   var str = '';
940   var length = bytes.length;
941   for (var n = 0; n < length; ++n)
942     str += String.fromCharCode(bytes[n]);
943   return str;
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;
951   return bytes;
954 var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
956 var Util = PDFJS.Util = (function UtilClosure() {
957   function Util() {}
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 + ')';
962   };
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 + ')';
968   };
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];
974     return [xt, yt];
975   };
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;
981     return [xt, yt];
982   };
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];
988   };
990   // Apply a generic 3d matrix M on a 3-vector v:
991   //   | a b c |   | X |
992   //   | d e f | x | Y |
993   //   | g h i |   | Z |
994   // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
995   // with v as [X,Y,Z]
996   Util.apply3dTransform = function Util_apply3dTransform(m, v) {
997     return [
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]
1001     ];
1002   }
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]) {
1011       r[0] = rect[2];
1012       r[2] = rect[0];
1013     }
1014     if (rect[1] > rect[3]) {
1015       r[1] = rect[3];
1016       r[3] = rect[1];
1017     }
1018     return r;
1019   }
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) {
1026       return a - b;
1027     };
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),
1032         result = [];
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];
1043     } else {
1044       return false;
1045     }
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];
1053     } else {
1054       return false;
1055     }
1057     return result;
1058   };
1060   Util.sign = function Util_sign(num) {
1061     return num < 0 ? -1 : 1;
1062   };
1064   return Util;
1065 })();
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;
1074     switch (rotate) {
1075       case -180:
1076       case 180:
1077         rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
1078         break;
1079       case -270:
1080       case 90:
1081         rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
1082         break;
1083       case -90:
1084       case 270:
1085         rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
1086         break;
1087       case 360:
1088       case 0:
1089       default:
1090         rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
1091         break;
1092     }
1093     var offsetCanvasX, offsetCanvasY;
1094     var width, height;
1095     if (rotateA == 0) {
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;
1100     } else {
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;
1105     }
1106     // creating transform for the following operations:
1107     // translate(-centerX, -centerY), rotate and flip vertically,
1108     // scale, and translate(offsetCanvasX, offsetCanvasY)
1109     this.transform = [
1110       rotateA * scale,
1111       rotateB * scale,
1112       rotateC * scale,
1113       rotateD * scale,
1114       offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
1115       offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
1116     ];
1118     this.offsetX = offsetX;
1119     this.offsetY = offsetY;
1120     this.width = width;
1121     this.height = height;
1122     this.fontScale = scale;
1123   }
1124   PageViewport.prototype = {
1125     convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
1126       return Util.applyTransform([x, y], this.transform);
1127     },
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]];
1133     },
1134     convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
1135       return Util.applyInverseTransform([x, y], this.transform);
1136     }
1137   };
1138   return PageViewport;
1139 })();
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') {
1156     // UTF16BE BOM
1157     for (i = 2; i < n; i += 2)
1158       str2 += String.fromCharCode(
1159         (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1));
1160   } else {
1161     for (i = 0; i < n; ++i) {
1162       var code = PDFStringTranslateTable[str.charCodeAt(i)];
1163       str2 += code ? String.fromCharCode(code) : str.charAt(i);
1164     }
1165   }
1166   return str2;
1169 function isBool(v) {
1170   return typeof v == 'boolean';
1173 function isInt(v) {
1174   return typeof v == 'number' && ((v | 0) == v);
1177 function isNum(v) {
1178   return typeof v == 'number';
1181 function isString(v) {
1182   return typeof v == 'string';
1185 function isNull(v) {
1186   return v === null;
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);
1213 function isRef(v) {
1214   return v instanceof Ref;
1217 function isPDFFunction(v) {
1218   var fnDict;
1219   if (typeof v != 'object')
1220     return false;
1221   else if (isDict(v))
1222     fnDict = v;
1223   else if (isStream(v))
1224     fnDict = v.dict;
1225   else
1226     return false;
1227   return fnDict.has('FunctionType');
1231  * 'Promise' object.
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.
1241  */
1242 var Promise = PDFJS.Promise = (function PromiseClosure() {
1243   var EMPTY_PROMISE = {};
1245   /**
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.
1248    */
1249   function Promise(name, data) {
1250     this.name = name;
1251     this.isRejected = false;
1252     this.error = null;
1253     // If you build a promise and pass in some data it's already resolved.
1254     if (data != null) {
1255       this.isResolved = true;
1256       this._data = data;
1257       this.hasData = true;
1258     } else {
1259       this.isResolved = false;
1260       this._data = EMPTY_PROMISE;
1261     }
1262     this.callbacks = [];
1263     this.errbacks = [];
1264     this.progressbacks = [];
1265   };
1266   /**
1267    * Builds a promise that is resolved when all the passed in promises are
1268    * resolved.
1269    * @param {Promise[]} promises Array of promises to wait for.
1270    * @return {Promise} New dependant promise.
1271    */
1272   Promise.all = function Promise_all(promises) {
1273     var deferred = new Promise();
1274     var unresolved = promises.length;
1275     var results = [];
1276     if (unresolved === 0) {
1277       deferred.resolve(results);
1278       return deferred;
1279     }
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) {
1284           results[i] = value;
1285           unresolved--;
1286           if (unresolved === 0)
1287             deferred.resolve(results);
1288         };
1289       })(i));
1290     }
1291     return deferred;
1292   };
1293   Promise.prototype = {
1294     hasData: false,
1296     set data(value) {
1297       if (value === undefined) {
1298         return;
1299       }
1300       if (this._data !== EMPTY_PROMISE) {
1301         error('Promise ' + this.name +
1302               ': Cannot set the data of a promise twice');
1303       }
1304       this._data = value;
1305       this.hasData = true;
1307       if (this.onDataCallback) {
1308         this.onDataCallback(value);
1309       }
1310     },
1312     get data() {
1313       if (this._data === EMPTY_PROMISE) {
1314         error('Promise ' + this.name + ': Cannot get data that isn\'t set');
1315       }
1316       return this._data;
1317     },
1319     onData: function Promise_onData(callback) {
1320       if (this._data !== EMPTY_PROMISE) {
1321         callback(this._data);
1322       } else {
1323         this.onDataCallback = callback;
1324       }
1325     },
1327     resolve: function Promise_resolve(data) {
1328       if (this.isResolved) {
1329         error('A Promise can be resolved only once ' + this.name);
1330       }
1331       if (this.isRejected) {
1332         error('The Promise was already rejected ' + this.name);
1333       }
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);
1341       }
1342     },
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);
1348       }
1349     },
1351     reject: function Promise_reject(reason) {
1352       if (this.isRejected) {
1353         error('A Promise can be rejected only once ' + this.name);
1354       }
1355       if (this.isResolved) {
1356         error('The Promise was already resolved ' + this.name);
1357       }
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);
1365       }
1366     },
1368     then: function Promise_then(callback, errback, progressback) {
1369       if (!callback) {
1370         error('Requiring callback' + this.name);
1371       }
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);
1380       } else {
1381         this.callbacks.push(callback);
1382         if (errback)
1383           this.errbacks.push(errback);
1384       }
1386       if (progressback)
1387         this.progressbacks.push(progressback);
1388     }
1389   };
1391   return Promise;
1392 })();
1394 var StatTimer = (function StatTimerClosure() {
1395   function rpad(str, pad, length) {
1396     while (str.length < length)
1397       str += pad;
1398     return str;
1399   }
1400   function StatTimer() {
1401     this.started = {};
1402     this.times = [];
1403     this.enabled = true;
1404   }
1405   StatTimer.prototype = {
1406     time: function StatTimer_time(name) {
1407       if (!this.enabled)
1408         return;
1409       if (name in this.started)
1410         throw 'Timer is already running for ' + name;
1411       this.started[name] = Date.now();
1412     },
1413     timeEnd: function StatTimer_timeEnd(name) {
1414       if (!this.enabled)
1415         return;
1416       if (!(name in this.started))
1417         throw 'Timer has not been started for ' + name;
1418       this.times.push({
1419         'name': name,
1420         'start': this.started[name],
1421         'end': Date.now()
1422       });
1423       // Remove timer from started so it can be called again.
1424       delete this.started[name];
1425     },
1426     toString: function StatTimer_toString() {
1427       var times = this.times;
1428       var out = '';
1429       // Find the longest name for padding purposes.
1430       var longest = 0;
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;
1435       }
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';
1440       }
1441       return out;
1442     }
1443   };
1444   return StatTimer;
1445 })();
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.
1459  */
1460 PDFJS.getDocument = function getDocument(source) {
1461   var promise = new PDFJS.Promise();
1462   var transport = new WorkerTransport(promise);
1463   if (typeof source === 'string') {
1464     // fetch url
1465     PDFJS.getPdf(
1466       {
1467         url: source,
1468         progress: function getPDFProgress(evt) {
1469           if (evt.lengthComputable)
1470             promise.progress({
1471               loaded: evt.loaded,
1472               total: evt.total
1473             });
1474         },
1475         error: function getPDFError(e) {
1476           promise.reject('Unexpected server response of ' +
1477             e.target.status + '.');
1478         }
1479       },
1480       function getPDFLoad(data) {
1481         transport.sendData(data);
1482       });
1483   } else {
1484     // assuming the source is array, instantiating directly from it
1485     transport.sendData(source);
1486   }
1487   return promise;
1491  * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
1492  * properties that can be read synchronously.
1493  */
1494 var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
1495   function PDFDocumentProxy(pdfInfo, transport) {
1496     this.pdfInfo = pdfInfo;
1497     this.transport = transport;
1498   }
1499   PDFDocumentProxy.prototype = {
1500     /**
1501      * @return {number} Total number of pages the PDF contains.
1502      */
1503     get numPages() {
1504       return this.pdfInfo.numPages;
1505     },
1506     /**
1507      * @return {string} A unique ID to identify a PDF. Not guaranteed to be
1508      * unique.
1509      */
1510     get fingerprint() {
1511       return this.pdfInfo.fingerprint;
1512     },
1513     /**
1514      * @param {number} The page number to get. The first page is 1.
1515      * @return {Promise} A promise that is resolved with a {PDFPageProxy}
1516      * object.
1517      */
1518     getPage: function PDFDocumentProxy_getPage(number) {
1519       return this.transport.getPage(number);
1520     },
1521     /**
1522      * @return {Promise} A promise that is resolved with a lookup table for
1523      * mapping named destinations to reference numbers.
1524      */
1525     getDestinations: function PDFDocumentProxy_getDestinations() {
1526       var promise = new PDFJS.Promise();
1527       var destinations = this.pdfInfo.destinations;
1528       promise.resolve(destinations);
1529       return promise;
1530     },
1531     /**
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:
1534      * [
1535      *  {
1536      *   title: string,
1537      *   bold: boolean,
1538      *   italic: boolean,
1539      *   color: rgb array,
1540      *   dest: dest obj,
1541      *   items: array of more items like this
1542      *  },
1543      *  ...
1544      * ].
1545      */
1546     getOutline: function PDFDocumentProxy_getOutline() {
1547       var promise = new PDFJS.Promise();
1548       var outline = this.pdfInfo.outline;
1549       promise.resolve(outline);
1550       return promise;
1551     },
1552     /**
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.
1557      */
1558     getMetadata: function PDFDocumentProxy_getMetadata() {
1559       var promise = new PDFJS.Promise();
1560       var info = this.pdfInfo.info;
1561       var metadata = this.pdfInfo.metadata;
1562       promise.resolve({
1563         info: info,
1564         metadata: metadata ? new PDFJS.Metadata(metadata) : null
1565       });
1566       return promise;
1567     },
1568     destroy: function PDFDocumentProxy_destroy() {
1569       this.transport.destroy();
1570     }
1571   };
1572   return PDFDocumentProxy;
1573 })();
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;
1583   }
1584   PDFPageProxy.prototype = {
1585     /**
1586      * @return {number} Page number of the page. First page is 1.
1587      */
1588     get pageNumber() {
1589       return this.pageInfo.pageIndex + 1;
1590     },
1591     /**
1592      * @return {number} The number of degrees the page is rotated clockwise.
1593      */
1594     get rotate() {
1595       return this.pageInfo.rotate;
1596     },
1597     /**
1598      * @return {object} The reference that points to this page. It has 'num' and
1599      * 'gen' properties.
1600      */
1601     get ref() {
1602       return this.pageInfo.ref;
1603     },
1604     /**
1605      * @return {array} An array of the visible portion of the PDF page in the
1606      * user space units - [x1, y1, x2, y2].
1607      */
1608     get view() {
1609       return this.pageInfo.view;
1610     },
1611     /**
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.
1617      */
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);
1622     },
1623     /**
1624      * @return {Promise} A promise that is resolved with an {array} of the
1625      * annotation objects.
1626      */
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);
1634       return promise;
1635     },
1636     /**
1637      * Begins the process of rendering a page to the desired context.
1638      * @param {object} params A parameter object that supports:
1639      * {
1640      *   canvasContext(required): A 2D context of a DOM Canvas object.,
1641      *   textLayer(optional): An object that has beginLayout, endLayout, and
1642      *                        appendText functions.
1643      * }.
1644      * @return {Promise} A promise that is resolved when the page finishes
1645      * rendering.
1646      */
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
1662         });
1663       }
1665       var self = this;
1666       function complete(error) {
1667         self.renderInProgress = false;
1668         if (self.destroyed) {
1669           delete self.operatorList;
1670           delete self.displayReadyPromise;
1671         }
1673         if (error)
1674           promise.reject(error);
1675         else
1676           promise.resolve();
1677       };
1679       // Once the operatorList and fonts are loaded, do the actual rendering.
1680       this.displayReadyPromise.then(
1681         function pageDisplayReadyPromise() {
1682           if (self.destroyed) {
1683             complete();
1684             return;
1685           }
1687           var gfx = new CanvasGraphics(params.canvasContext,
1688             this.objs, params.textLayer);
1689           try {
1690            this.display(gfx, params.viewport, complete);
1691           } catch (e) {
1692             complete(e);
1693           }
1694         }.bind(this),
1695         function pageDisplayReadPromiseError(reason) {
1696           complete(reason);
1697         }
1698       );
1700       return promise;
1701     },
1702     /**
1703      * For internal use only.
1704      */
1705     startRenderingFromOperatorList:
1706       function PDFPageProxy_startRenderingFromOperatorList(operatorList,
1707                                                            fonts) {
1708       var self = this;
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();
1716         });
1717       };
1719       this.ensureFonts(fonts,
1720         function pageStartRenderingFromOperatorListEnsureFonts() {
1721           displayContinuation();
1722         }
1723       );
1724     },
1725     /**
1726      * For internal use only.
1727      */
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;
1733       }
1735       // Load all the fonts
1736       FontLoader.bind(
1737         fonts,
1738         function pageEnsureFontsFontObjs(fontObjs) {
1739           this.stats.timeEnd('Font Loading');
1741           callback.call(this);
1742         }.bind(this)
1743       );
1744     },
1745     /**
1746      * For internal use only.
1747      */
1748     display: function PDFPageProxy_display(gfx, viewport, callback) {
1749       var stats = this.stats;
1750       stats.time('Rendering');
1752       gfx.beginDrawing(viewport);
1754       var startIdx = 0;
1755       var length = this.operatorList.fnArray.length;
1756       var operatorList = this.operatorList;
1757       var stepper = null;
1758       if (PDFJS.pdfBug && StepperManager.enabled) {
1759         stepper = StepperManager.create(this.pageNumber - 1);
1760         stepper.init(operatorList);
1761         stepper.nextBreakPoint = stepper.getNextBreakPoint();
1762       }
1764       var self = this;
1765       function next() {
1766         startIdx =
1767           gfx.executeOperatorList(operatorList, startIdx, next, stepper);
1768         if (startIdx == length) {
1769           gfx.endDrawing();
1770           stats.timeEnd('Rendering');
1771           stats.timeEnd('Overall');
1772           if (callback) callback();
1773         }
1774       }
1775       next();
1776     },
1777     /**
1778      * Stub for future feature.
1779      */
1780     getTextContent: function PDFPageProxy_getTextContent() {
1781       var promise = new PDFJS.Promise();
1782       var textContent = 'page text'; // not implemented
1783       promise.resolve(textContent);
1784       return promise;
1785     },
1786     /**
1787      * Stub for future feature.
1788      */
1789     getOperationList: function PDFPageProxy_getOperationList() {
1790       var promise = new PDFJS.Promise();
1791       var operationList = { // not implemented
1792         dependencyFontsID: null,
1793         operatorList: null
1794       };
1795       promise.resolve(operationList);
1796       return promise;
1797     },
1798     /**
1799      * Destroys resources allocated by the page.
1800      */
1801     destroy: function PDFPageProxy_destroy() {
1802       this.destroyed = true;
1804       if (!this.renderInProgress) {
1805         delete this.operatorList;
1806         delete this.displayReadyPromise;
1807       }
1808     }
1809   };
1810   return PDFPageProxy;
1811 })();
1813  * For internal use only.
1814  */
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');
1833       }
1835       try {
1836         var worker;
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);
1844         } else {
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);
1848         }
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);
1857           } else {
1858             globalScope.PDFJS.disableWorker = true;
1859             this.setupFakeWorker();
1860           }
1861         }.bind(this));
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);
1867         return;
1868       } catch (e) {
1869         warn('The worker has been disabled.');
1870       }
1871     }
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();
1876   }
1877   WorkerTransport.prototype = {
1878     destroy: function WorkerTransport_destroy() {
1879       if (this.worker)
1880         this.worker.terminate();
1882       this.pageCache = [];
1883       this.pagePromises = [];
1884     },
1885     setupFakeWorker: function WorkerTransport_setupFakeWorker() {
1886       // If we don't use a worker, just post/sendMessage to the main thread.
1887       var fakeWorker = {
1888         postMessage: function WorkerTransport_postMessage(obj) {
1889           fakeWorker.onmessage({data: obj});
1890         },
1891         terminate: function WorkerTransport_terminate() {}
1892       };
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);
1900     },
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);
1911       }, this);
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);
1919       }, this);
1921       messageHandler.on('GetAnnotations', function transportAnnotations(data) {
1922         var annotations = data.annotations;
1923         var promise = this.pageCache[data.pageIndex].annotationsPromise;
1924         promise.resolve(annotations);
1925       }, this);
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);
1933       }, this);
1935       messageHandler.on('obj', function transportObj(data) {
1936         var id = data[0];
1937         var type = data[1];
1938         if (this.objs.hasData(id))
1939           return;
1941         switch (type) {
1942           case 'JpegStream':
1943             var imageData = data[2];
1944             loadJpegStream(id, imageData, this.objs);
1945             break;
1946           case 'Image':
1947             var imageData = data[2];
1948             this.objs.resolve(id, imageData);
1949             break;
1950           case 'Font':
1951             var name = data[2];
1952             var file = data[3];
1953             var properties = data[4];
1955             if (file) {
1956               // Rewrap the ArrayBuffer in a stream.
1957               var fontFileDict = new Dict();
1958               file = new Stream(file, 0, file.length, fontFileDict);
1959             }
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);
1965             break;
1966           default:
1967             error('Got unkown object type ' + type);
1968         }
1969       }, this);
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);
1975         else
1976           error(data.error);
1977       }, this);
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) {
1999               buf[j] = data[i];
2000               buf[j + 1] = data[i + 1];
2001               buf[j + 2] = data[i + 2];
2002             }
2003           } else if (components == 1) {
2004             for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) {
2005               buf[j] = data[i];
2006             }
2007           }
2008           promise.resolve({ data: buf, width: width, height: height});
2009         }).bind(this);
2010         var src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData);
2011         img.src = src;
2012       });
2013     },
2015     sendData: function WorkerTransport_sendData(data) {
2016       this.messageHandler.send('GetDocRequest', data);
2017     },
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 });
2026       return promise;
2027     },
2029     getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
2030       this.messageHandler.send('GetAnnotationsRequest',
2031         { pageIndex: pageIndex });
2032     }
2033   };
2034   return WorkerTransport;
2036 })();
2038 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2039 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
2041 'use strict';
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 = {
2047   FILL: 0,
2048   STROKE: 1,
2049   FILL_STROKE: 2,
2050   INVISIBLE: 3,
2051   FILL_ADD_TO_PATH: 4,
2052   STROKE_ADD_TO_PATH: 5,
2053   FILL_STROKE_ADD_TO_PATH: 6,
2054   ADD_TO_PATH: 7
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;
2064   return canvas;
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;
2084       }
2085     });
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;
2099         return [
2100           d / ad_bc,
2101           b / bc_ad,
2102           c / bc_ad,
2103           a / ad_bc,
2104           (d * e - c * f) / bc_ad,
2105           (b * e - a * f) / ad_bc
2106         ];
2107       }
2108     });
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();
2116     };
2118     ctx.restore = function ctxRestore() {
2119       var prev = this._transformStack.pop();
2120       if (prev) {
2121         this._transformMatrix = prev;
2122         this._originalRestore();
2123       }
2124     };
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);
2132     };
2134     ctx.scale = function ctxScale(x, y) {
2135       var m = this._transformMatrix;
2136       m[0] = m[0] * x;
2137       m[1] = m[1] * x;
2138       m[2] = m[2] * y;
2139       m[3] = m[3] * y;
2141       this._originalScale(x, y);
2142     };
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]
2153       ];
2155       ctx._originalTransform(a, b, c, d, e, f);
2156     };
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,
2168         m[4],
2169         m[5]
2170       ];
2172       this._originalRotate(angle);
2173     };
2174   }
2177 var CanvasExtraState = (function CanvasExtraStateClosure() {
2178   function CanvasExtraState(old) {
2179     // Are soft masks and alpha values shapes or opacities?
2180     this.alphaIsShape = false;
2181     this.fontSize = 0;
2182     this.fontSizeScale = 1;
2183     this.textMatrix = IDENTITY_MATRIX;
2184     this.fontMatrix = IDENTITY_MATRIX;
2185     this.leading = 0;
2186     // Current point (in user coordinates)
2187     this.x = 0;
2188     this.y = 0;
2189     // Start of text line (in text coordinates)
2190     this.lineX = 0;
2191     this.lineY = 0;
2192     // Character and word spacing
2193     this.charSpacing = 0;
2194     this.wordSpacing = 0;
2195     this.textHScale = 1;
2196     this.textRenderingMode = TextRenderingMode.FILL;
2197     // Color spaces
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
2208     this.fillAlpha = 1;
2209     this.strokeAlpha = 1;
2210     this.lineWidth = 1;
2212     this.old = old;
2213   }
2215   CanvasExtraState.prototype = {
2216     clone: function CanvasExtraState_clone() {
2217       return Object.create(this);
2218     },
2219     setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
2220       this.x = x;
2221       this.y = y;
2222     }
2223   };
2224   return CanvasExtraState;
2225 })();
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;
2237     this.res = null;
2238     this.xobjs = null;
2239     this.objs = objs;
2240     this.textLayer = textLayer;
2241     if (canvasCtx) {
2242       addContextCurrentTransform(canvasCtx);
2243     }
2244   }
2246   var LINE_CAP_STYLES = ['butt', 'round', 'square'];
2247   var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
2248   var NORMAL_CLIP = {};
2249   var EO_CLIP = {};
2251   CanvasGraphics.prototype = {
2252     slowCommands: {
2253       'stroke': true,
2254       'closeStroke': true,
2255       'fill': true,
2256       'eoFill': true,
2257       'fillStroke': true,
2258       'eoFillStroke': true,
2259       'closeFillStroke': true,
2260       'closeEOFillStroke': true,
2261       'showText': 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,
2278       'shadingFill': true
2279     },
2281     beginDrawing: function CanvasGraphics_beginDrawing(viewport) {
2282       var transform = viewport.transform;
2283       this.ctx.save();
2284       this.ctx.transform.apply(this.ctx, transform);
2286       if (this.textLayer)
2287         this.textLayer.beginLayout();
2288     },
2290     executeOperatorList: function CanvasGraphics_executeOperatorList(
2291                                     operatorList,
2292                                     executionStartIdx, continueCallback,
2293                                     stepper) {
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) {
2301         return i;
2302       }
2304       var executionEndIdx;
2305       var endTime = Date.now() + kExecutionTime;
2307       var objs = this.objs;
2308       var fnName;
2309       var slowCommands = this.slowCommands;
2311       while (true) {
2312         if (stepper && i === stepper.nextBreakPoint) {
2313           stepper.breakIt(i, continueCallback);
2314           return i;
2315         }
2317         fnName = fnArray[i];
2319         if (fnName !== 'dependency') {
2320           this[fnName].apply(this, argsArray[i]);
2321         } else {
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);
2330               return i;
2331             }
2332           }
2333         }
2335         i++;
2337         // If the entire operatorList was executed, stop as were done.
2338         if (i == argsArrayLen) {
2339           return i;
2340         }
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);
2347           return i;
2348         }
2350         // If the operatorList isn't executed completely yet OR the execution
2351         // time was short enough, do another execution round.
2352       }
2353     },
2355     endDrawing: function CanvasGraphics_endDrawing() {
2356       this.ctx.restore();
2358       if (this.textLayer)
2359         this.textLayer.endLayout();
2360     },
2362     // Graphics state
2363     setLineWidth: function CanvasGraphics_setLineWidth(width) {
2364       this.current.lineWidth = width;
2365       this.ctx.lineWidth = width;
2366     },
2367     setLineCap: function CanvasGraphics_setLineCap(style) {
2368       this.ctx.lineCap = LINE_CAP_STYLES[style];
2369     },
2370     setLineJoin: function CanvasGraphics_setLineJoin(style) {
2371       this.ctx.lineJoin = LINE_JOIN_STYLES[style];
2372     },
2373     setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
2374       this.ctx.miterLimit = limit;
2375     },
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;
2381     },
2382     setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
2383       TODO('set rendering intent: ' + intent);
2384     },
2385     setFlatness: function CanvasGraphics_setFlatness(flatness) {
2386       TODO('set flatness: ' + flatness);
2387     },
2388     setGState: function CanvasGraphics_setGState(states) {
2389       for (var i = 0, ii = states.length; i < ii; i++) {
2390         var state = states[i];
2391         var key = state[0];
2392         var value = state[1];
2394         switch (key) {
2395           case 'LW':
2396             this.setLineWidth(value);
2397             break;
2398           case 'LC':
2399             this.setLineCap(value);
2400             break;
2401           case 'LJ':
2402             this.setLineJoin(value);
2403             break;
2404           case 'ML':
2405             this.setMiterLimit(value);
2406             break;
2407           case 'D':
2408             this.setDash(value[0], value[1]);
2409             break;
2410           case 'RI':
2411             this.setRenderingIntent(value);
2412             break;
2413           case 'FL':
2414             this.setFlatness(value);
2415             break;
2416           case 'Font':
2417             this.setFont(state[1], state[2]);
2418             break;
2419           case 'CA':
2420             this.current.strokeAlpha = state[1];
2421             break;
2422           case 'ca':
2423             this.current.fillAlpha = state[1];
2424             this.ctx.globalAlpha = state[1];
2425             break;
2426         }
2427       }
2428     },
2429     save: function CanvasGraphics_save() {
2430       this.ctx.save();
2431       var old = this.current;
2432       this.stateStack.push(old);
2433       this.current = old.clone();
2434     },
2435     restore: function CanvasGraphics_restore() {
2436       var prev = this.stateStack.pop();
2437       if (prev) {
2438         this.current = prev;
2439         this.ctx.restore();
2440       }
2441     },
2442     transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
2443       this.ctx.transform(a, b, c, d, e, f);
2444     },
2446     // Path
2447     moveTo: function CanvasGraphics_moveTo(x, y) {
2448       this.ctx.moveTo(x, y);
2449       this.current.setCurrentPoint(x, y);
2450     },
2451     lineTo: function CanvasGraphics_lineTo(x, y) {
2452       this.ctx.lineTo(x, y);
2453       this.current.setCurrentPoint(x, y);
2454     },
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);
2458     },
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);
2463     },
2464     curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) {
2465       this.curveTo(x1, y1, x3, y3, x3, y3);
2466       this.current.setCurrentPoint(x3, y3);
2467     },
2468     closePath: function CanvasGraphics_closePath() {
2469       this.ctx.closePath();
2470     },
2471     rectangle: function CanvasGraphics_rectangle(x, y, width, height) {
2472       this.ctx.rect(x, y, width, height);
2473     },
2474     stroke: function CanvasGraphics_stroke(consumePath) {
2475       consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
2476       var ctx = this.ctx;
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
2481       // stroking alpha.
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
2487         ctx.save();
2488         ctx.strokeStyle = strokeColor.getPattern(ctx);
2489         ctx.stroke();
2490         ctx.restore();
2491       } else {
2492         ctx.stroke();
2493       }
2494       if (consumePath)
2495         this.consumePath();
2496       // Restore the global alpha to the fill alpha
2497       ctx.globalAlpha = this.current.fillAlpha;
2498     },
2499     closeStroke: function CanvasGraphics_closeStroke() {
2500       this.closePath();
2501       this.stroke();
2502     },
2503     fill: function CanvasGraphics_fill(consumePath) {
2504       consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
2505       var ctx = this.ctx;
2506       var fillColor = this.current.fillColor;
2508       if (fillColor && fillColor.hasOwnProperty('type') &&
2509           fillColor.type === 'Pattern') {
2510         ctx.save();
2511         ctx.fillStyle = fillColor.getPattern(ctx);
2512         ctx.fill();
2513         ctx.restore();
2514       } else {
2515         ctx.fill();
2516       }
2517       if (consumePath)
2518         this.consumePath();
2519     },
2520     eoFill: function CanvasGraphics_eoFill() {
2521       var savedFillRule = this.setEOFillRule();
2522       this.fill();
2523       this.restoreFillRule(savedFillRule);
2524     },
2525     fillStroke: function CanvasGraphics_fillStroke() {
2526       this.fill(false);
2527       this.stroke(false);
2529       this.consumePath();
2530     },
2531     eoFillStroke: function CanvasGraphics_eoFillStroke() {
2532       var savedFillRule = this.setEOFillRule();
2533       this.fillStroke();
2534       this.restoreFillRule(savedFillRule);
2535     },
2536     closeFillStroke: function CanvasGraphics_closeFillStroke() {
2537       this.closePath();
2538       this.fillStroke();
2539     },
2540     closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
2541       var savedFillRule = this.setEOFillRule();
2542       this.closePath();
2543       this.fillStroke();
2544       this.restoreFillRule(savedFillRule);
2545     },
2546     endPath: function CanvasGraphics_endPath() {
2547       this.consumePath();
2548     },
2550     // Clipping
2551     clip: function CanvasGraphics_clip() {
2552       this.pendingClip = NORMAL_CLIP;
2553     },
2554     eoClip: function CanvasGraphics_eoClip() {
2555       this.pendingClip = EO_CLIP;
2556     },
2558     // Text
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;
2563     },
2564     endText: function CanvasGraphics_endText() {
2565     },
2566     setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
2567       this.current.charSpacing = spacing;
2568     },
2569     setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
2570       this.current.wordSpacing = spacing;
2571     },
2572     setHScale: function CanvasGraphics_setHScale(scale) {
2573       this.current.textHScale = scale / 100;
2574     },
2575     setLeading: function CanvasGraphics_setLeading(leading) {
2576       this.current.leading = -leading;
2577     },
2578     setFont: function CanvasGraphics_setFont(fontRefName, size) {
2579       var fontObj = this.objs.get(fontRefName);
2580       var current = this.current;
2582       if (!fontObj)
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);
2588       else
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);
2596       }
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.
2601       if (size < 0) {
2602         size = -size;
2603         current.fontMatrix[0] *= -1;
2604         current.fontMatrix[3] *= -1;
2605       }
2607       this.current.font = fontObj;
2608       this.current.fontSize = size;
2610       if (fontObj.coded)
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;
2631     },
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;
2636     },
2637     setTextRise: function CanvasGraphics_setTextRise(rise) {
2638       TODO('text rise: ' + rise);
2639     },
2640     moveText: function CanvasGraphics_moveText(x, y) {
2641       this.current.x = this.current.lineX += x;
2642       this.current.y = this.current.lineY += y;
2643     },
2644     setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
2645       this.setLeading(-y);
2646       this.moveText(x, y);
2647     },
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;
2653     },
2654     nextLine: function CanvasGraphics_nextLine() {
2655       this.moveText(0, this.current.leading);
2656     },
2657     applyTextTransforms: function CanvasGraphics_applyTextTransforms() {
2658       var ctx = this.ctx;
2659       var current = this.current;
2660       var textHScale = current.textHScale;
2661       var fontMatrix = current.fontMatrix || IDENTITY_MATRIX;
2663       ctx.transform.apply(ctx, current.textMatrix);
2664       ctx.scale(1, -1);
2665       ctx.translate(current.x, -1 * current.y);
2666       ctx.transform.apply(ctx, fontMatrix);
2667       ctx.scale(textHScale, 1);
2668     },
2669     getTextGeometry: function CanvasGraphics_getTextGeometry() {
2670       var geometry = {};
2671       var ctx = this.ctx;
2672       var font = this.current.font;
2673       var ctxMatrix = ctx.mozCurrentTransform;
2674       if (ctxMatrix) {
2675         var bl = Util.applyTransform([0, 0], ctxMatrix);
2676         var tr = Util.applyTransform([1, 1], ctxMatrix);
2677         geometry.x = bl[0];
2678         geometry.y = bl[1];
2679         geometry.hScale = tr[0] - bl[0];
2680         geometry.vScale = tr[1] - bl[1];
2681       }
2682       geometry.spaceWidth = font.spaceWidth;
2683       return geometry;
2684     },
2686     showText: function CanvasGraphics_showText(str, skipTextSelection) {
2687       var ctx = this.ctx;
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"
2705       if (font.coded) {
2706         ctx.save();
2707         ctx.transform.apply(ctx, current.textMatrix);
2708         ctx.translate(current.x, current.y);
2710         ctx.scale(textHScale, 1);
2712         if (textSelection) {
2713           this.save();
2714           ctx.scale(1, -1);
2715           text.geom = this.getTextGeometry();
2716           this.restore();
2717         }
2718         for (var i = 0; i < glyphsLength; ++i) {
2720           var glyph = glyphs[i];
2721           if (glyph === null) {
2722             // word break
2723             this.ctx.translate(wordSpacing, 0);
2724             continue;
2725           }
2727           this.save();
2728           ctx.scale(fontSize, fontSize);
2729           ctx.transform.apply(ctx, fontMatrix);
2730           this.executeOperatorList(glyph.operatorList);
2731           this.restore();
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;
2741           text.length++;
2742           text.canvasWidth += width;
2743         }
2744         ctx.restore();
2745       } else {
2746         ctx.save();
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();
2753         else
2754           lineWidth /= scale;
2756         if (textSelection)
2757           text.geom = this.getTextGeometry();
2759         if (fontSizeScale != 1.0) {
2760           ctx.scale(fontSizeScale, fontSizeScale);
2761           lineWidth /= fontSizeScale;
2762         }
2764         ctx.lineWidth = lineWidth;
2766         var x = 0;
2767         for (var i = 0; i < glyphsLength; ++i) {
2768           var glyph = glyphs[i];
2769           if (glyph === null) {
2770             // word break
2771             x += Util.sign(current.fontMatrix[0]) * wordSpacing;
2772             continue;
2773           }
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);
2786                 break;
2787               case TextRenderingMode.STROKE:
2788               case TextRenderingMode.STROKE_ADD_TO_PATH:
2789                 ctx.strokeText(character, scaledX, 0);
2790                 break;
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);
2795                 break;
2796               case TextRenderingMode.INVISIBLE:
2797                 break;
2798             }
2799           }
2801           x += charWidth;
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];
2810           } else
2811             text.str += glyphUnicode;
2812           text.length += glyphUnicodeLength;
2813           text.canvasWidth += charWidth;
2814         }
2815         current.x += x * textHScale2;
2816         ctx.restore();
2817       }
2819       if (textSelection)
2820         this.textLayer.appendText(text, font.loadedName, fontSize);
2822       return text;
2823     },
2824     showSpacedText: function CanvasGraphics_showSpacedText(arr) {
2825       var ctx = this.ctx;
2826       var current = this.current;
2827       var font = current.font;
2828       var fontSize = current.fontSize;
2829       var textHScale = current.textHScale;
2830       if (!font.coded)
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) {
2838         ctx.save();
2839         // Type3 fonts - each glyph is a "mini-PDF" (see also showText)
2840         if (font.coded) {
2841           ctx.transform.apply(ctx, current.textMatrix);
2842           ctx.scale(1, -1);
2843           ctx.translate(current.x, -1 * current.y);
2844           ctx.scale(textHScale, 1);
2845         } else
2846           this.applyTextTransforms();
2847         text.geom = this.getTextGeometry();
2848         ctx.restore();
2849       }
2851       for (var i = 0; i < arrLength; ++i) {
2852         var e = arr[i];
2853         if (isNum(e)) {
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';
2864                 text.length++;
2865               }
2866             }
2867           }
2868         } else if (isString(e)) {
2869           var shownText = this.showText(e, true);
2871           if (textSelection) {
2872             if (shownText.str === ' ') {
2873               text.str += '\u00A0';
2874             } else {
2875               text.str += shownText.str;
2876             }
2877             text.canvasWidth += shownText.canvasWidth;
2878             text.length += shownText.length;
2879           }
2880         } else {
2881           malformed('TJ array element ' + e + ' is not string or num');
2882         }
2883       }
2885       if (textSelection)
2886         this.textLayer.appendText(text, font.loadedName, fontSize);
2887     },
2888     nextLineShowText: function CanvasGraphics_nextLineShowText(text) {
2889       this.nextLine();
2890       this.showText(text);
2891     },
2892     nextLineSetSpacingShowText:
2893       function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing,
2894                                                          charSpacing,
2895                                                          text) {
2896       this.setWordSpacing(wordSpacing);
2897       this.setCharSpacing(charSpacing);
2898       this.nextLineShowText(text);
2899     },
2901     // Type3 fonts
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.
2905     },
2906     setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
2907                                                                         yWidth,
2908                                                                         llx,
2909                                                                         lly,
2910                                                                         urx,
2911                                                                         ury) {
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);
2915       this.clip();
2916       this.endPath();
2917     },
2919     // Color
2920     setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) {
2921       this.current.strokeColorSpace = ColorSpace.fromIR(raw);
2922     },
2923     setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) {
2924       this.current.fillColorSpace = ColorSpace.fromIR(raw);
2925     },
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;
2932     },
2933     getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) {
2934       if (IR[0] == 'TilingPattern') {
2935         var args = IR[1];
2936         var base = cs.base;
2937         var color;
2938         if (base) {
2939           var baseComps = base.numComps;
2941           color = [];
2942           for (var i = 0; i < baseComps; ++i)
2943             color.push(args[i]);
2945           color = base.getRgb(color);
2946         }
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);
2950       } else {
2951         error('Unkown IR type ' + IR[0]);
2952       }
2953       return pattern;
2954     },
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);
2960       } else {
2961         this.setStrokeColor.apply(this, arguments);
2962       }
2963     },
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;
2970     },
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);
2976       } else {
2977         this.setFillColor.apply(this, arguments);
2978       }
2979     },
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;
2987     },
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;
2995     },
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;
3003     },
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;
3011     },
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;
3019     },
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;
3027     },
3029     shadingFill: function CanvasGraphics_shadingFill(patternIR) {
3030       var ctx = this.ctx;
3032       this.save();
3033       var pattern = Pattern.shadingFromIR(patternIR);
3034       ctx.fillStyle = pattern.getPattern(ctx);
3036       var inv = ctx.mozCurrentTransformInverse;
3037       if (inv) {
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);
3053       } else {
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);
3061       }
3063       this.restore();
3064     },
3066     // Images
3067     beginInlineImage: function CanvasGraphics_beginInlineImage() {
3068       error('Should not call beginInlineImage');
3069     },
3070     beginImageData: function CanvasGraphics_beginImageData() {
3071       error('Should not call beginImageData');
3072     },
3074     paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
3075                                                                         bbox) {
3076       this.save();
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);
3085         this.clip();
3086         this.endPath();
3087       }
3088     },
3090     paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
3091       this.restore();
3092     },
3094     paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
3095       var domImage = this.objs.get(objId);
3096       if (!domImage) {
3097         error('Dependent image isn\'t ready yet');
3098       }
3100       this.save();
3102       var ctx = this.ctx;
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,
3107                     0, -h, w, h);
3109       this.restore();
3110     },
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++) {
3120           mask = 0;
3121           for (j = 0; j < width; j++) {
3122             if (!mask) {
3123               buf = imgArray[imgArrayPos++];
3124               mask = 128;
3125             }
3126             if (!(buf & mask) == inverseDecode) {
3127               buffer[bufferPos] = 0;
3128             }
3129             bufferPos += 4;
3130             mask >>= 1;
3131           }
3132         }
3133       }
3135       this.save();
3137       var ctx = this.ctx;
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);
3158       this.restore();
3159     },
3161     paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
3162       var imgData = this.objs.get(objId);
3163       if (!imgData)
3164         error('Dependent image isn\'t ready yet');
3166       this.save();
3167       var ctx = this.ctx;
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);
3178       this.restore();
3179     },
3181     putBinaryImageData: function CanvasGraphics_putBinaryImageData() {
3182       //
3183     },
3185     // Marked content
3187     markPoint: function CanvasGraphics_markPoint(tag) {
3188       TODO('Marked content');
3189     },
3190     markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
3191       TODO('Marked content');
3192     },
3193     beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
3194       TODO('Marked content');
3195     },
3196     beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
3197                                         tag, properties) {
3198       TODO('Marked content');
3199     },
3200     endMarkedContent: function CanvasGraphics_endMarkedContent() {
3201       TODO('Marked content');
3202     },
3204     // Compatibility
3206     beginCompat: function CanvasGraphics_beginCompat() {
3207       TODO('ignore undefined operators (should we do that anyway?)');
3208     },
3209     endCompat: function CanvasGraphics_endCompat() {
3210       TODO('stop ignoring undefined operators');
3211     },
3213     // Helper functions
3215     consumePath: function CanvasGraphics_consumePath() {
3216       if (this.pendingClip) {
3217         var savedFillRule = null;
3218         if (this.pendingClip == EO_CLIP)
3219           savedFillRule = this.setEOFillRule();
3221         this.ctx.clip();
3223         this.pendingClip = null;
3224         if (savedFillRule !== null)
3225           this.restoreFillRule(savedFillRule);
3226       }
3227       this.ctx.beginPath();
3228     },
3229     // We generally keep the canvas context set for
3230     // nonzero-winding, and just set evenodd for the operations
3231     // that need them.
3232     setEOFillRule: function CanvasGraphics_setEOFillRule() {
3233       var savedFillRule = this.ctx.mozFillRule;
3234       this.ctx.mozFillRule = 'evenodd';
3235       return savedFillRule;
3236     },
3237     restoreFillRule: function CanvasGraphics_restoreFillRule(rule) {
3238       this.ctx.mozFillRule = rule;
3239     },
3240     getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
3241       var inverse = this.ctx.mozCurrentTransformInverse;
3242       return Math.abs(inverse[0] + inverse[2]);
3243     }
3244   };
3246   return CanvasGraphics;
3247 })();
3249 if (!isWorker) {
3250   // Feature detection if the browser can use an Uint8Array directly as imgData.
3251   var canvas = PdfJS_window.document.createElement('canvas');
3252   canvas.width = 1;
3253   canvas.height = 1;
3254   var ctx = canvas.getContext('2d');
3256   try {
3257     ctx.putImageData({
3258       width: 1,
3259       height: 1,
3260       data: new Uint8Array(4)
3261     }, 0, 0);
3263     CanvasGraphics.prototype.putBinaryImageData =
3264       function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) {
3265         ctx.putImageData(imgData, 0, 0);
3266       };
3267   } catch (e) {
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;
3276         while (len--) {
3277           tmpImgDataPixels[len] = imgData.data[len];
3278         }
3280         ctx.putImageData(tmpImgData, 0, 0);
3281       };
3282   }
3285 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
3286 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
3288 'use strict';
3290 var Name = (function NameClosure() {
3291   function Name(name) {
3292     this.name = name;
3293   }
3295   Name.prototype = {};
3297   return Name;
3298 })();
3300 var Cmd = (function CmdClosure() {
3301   function Cmd(cmd) {
3302     this.cmd = cmd;
3303   }
3305   Cmd.prototype = {};
3307   var cmdCache = {};
3309   Cmd.get = function Cmd_get(cmd) {
3310     var cmdValue = cmdCache[cmd];
3311     if (cmdValue)
3312       return cmdValue;
3314     return cmdCache[cmd] = new Cmd(cmd);
3315   };
3317   return Cmd;
3318 })();
3320 var Dict = (function DictClosure() {
3321   // xref is optional
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) {
3327       xref = newXref;
3328     };
3330     // automatically dereferences Ref objects
3331     this.get = function Dict_get(key1, key2, key3) {
3332       var value;
3333       if (typeof (value = map[key1]) != 'undefined' || key1 in map ||
3334           typeof key2 == 'undefined') {
3335         return xref ? xref.fetchIfRef(value) : value;
3336       }
3337       if (typeof (value = map[key2]) != 'undefined' || key2 in map ||
3338           typeof key3 == 'undefined') {
3339         return xref ? xref.fetchIfRef(value) : value;
3340       }
3341       value = map[key3] || null;
3342       return xref ? xref.fetchIfRef(value) : value;
3343     };
3345     // no dereferencing
3346     this.getRaw = function Dict_getRaw(key) {
3347       return map[key];
3348     };
3350     // creates new map and dereferences all Refs
3351     this.getAll = function Dict_getAll() {
3352       var all = {};
3353       for (var key in map) {
3354         var obj = this.get(key);
3355         all[key] = obj instanceof Dict ? obj.getAll() : obj;
3356       }
3357       return all;
3358     };
3360     this.set = function Dict_set(key, value) {
3361       map[key] = value;
3362     };
3364     this.has = function Dict_has(key) {
3365       return key in map;
3366     };
3368     this.forEach = function Dict_forEach(callback) {
3369       for (var key in map) {
3370         callback(key, this.get(key));
3371       }
3372     };
3373   };
3375   return Dict;
3376 })();
3378 var Ref = (function RefClosure() {
3379   function Ref(num, gen) {
3380     this.num = num;
3381     this.gen = gen;
3382   }
3384   Ref.prototype = {};
3386   return Ref;
3387 })();
3389 // The reference is identified by number and generation,
3390 // this structure stores only one instance of the reference.
3391 var RefSet = (function RefSetClosure() {
3392   function RefSet() {
3393     this.dict = {};
3394   }
3396   RefSet.prototype = {
3397     has: function RefSet_has(ref) {
3398       return !!this.dict['R' + ref.num + '.' + ref.gen];
3399     },
3401     put: function RefSet_put(ref) {
3402       this.dict['R' + ref.num + '.' + ref.gen] = ref;
3403     }
3404   };
3406   return RefSet;
3407 })();
3409 var Catalog = (function CatalogClosure() {
3410   function Catalog(xref) {
3411     this.xref = xref;
3412     var obj = xref.getCatalogObj();
3413     assertWellFormed(isDict(obj), 'catalog object is not a dictionary');
3414     this.catDict = obj;
3415   }
3417   Catalog.prototype = {
3418     get metadata() {
3419       var stream = this.catDict.get('Metadata');
3420       var 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()));
3428         }
3429       }
3431       return shadow(this, 'metadata', metadata);
3432     },
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);
3438     },
3439     get documentOutline() {
3440       var xref = this.xref;
3441       var obj = this.catDict.get('Outlines');
3442       var root = { items: [] };
3443       if (isDict(obj)) {
3444         obj = obj.getRaw('First');
3445         var processed = new RefSet();
3446         if (isRef(obj)) {
3447           var queue = [{obj: obj, parent: root}];
3448           // to avoid recursion keeping track of the items
3449           // in the processed dictionary
3450           processed.put(obj);
3451           while (queue.length > 0) {
3452             var i = queue.shift();
3453             var outlineDict = xref.fetchIfRef(i.obj);
3454             if (outlineDict === null)
3455               continue;
3456             if (!outlineDict.has('Title'))
3457               error('Invalid outline item');
3458             var dest = outlineDict.get('A');
3459             if (dest)
3460               dest = dest.get('D');
3461             else if (outlineDict.has('Dest')) {
3462               dest = outlineDict.getRaw('Dest');
3463               if (isName(dest))
3464                 dest = dest.name;
3465             }
3466             var title = outlineDict.get('Title');
3467             var outlineItem = {
3468               dest: dest,
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),
3474               items: []
3475             };
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});
3480               processed.put(obj);
3481             }
3482             obj = outlineDict.getRaw('Next');
3483             if (isRef(obj) && !processed.has(obj)) {
3484               queue.push({obj: obj, parent: i.parent});
3485               processed.put(obj);
3486             }
3487           }
3488         }
3489       }
3490       obj = root.items.length > 0 ? root.items : null;
3491       return shadow(this, 'documentOutline', obj);
3492     },
3493     get numPages() {
3494       var obj = this.toplevelPagesDict.get('Count');
3495       assertWellFormed(
3496         isInt(obj),
3497         'page count in top level pages object is not an integer'
3498       );
3499       // shadow the prototype getter
3500       return shadow(this, 'num', obj);
3501     },
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) {
3508         var kid = kids[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
3515           assertWellFormed(
3516             isDict(obj),
3517             'page dictionary kid reference points to wrong type of object'
3518           );
3519           this.traverseKids(obj);
3520         }
3521       }
3522     },
3523     get destinations() {
3524       function fetchDestination(dest) {
3525         return isDict(dest) ? dest.get('D') : dest;
3526       }
3528       var xref = this.xref;
3529       var dests = {}, nameTreeRef, nameDictionaryRef;
3530       var obj = this.catDict.get('Names');
3531       if (obj)
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) {
3540           if (!value) return;
3541           dests[key] = fetchDestination(value);
3542         });
3543       }
3544       if (nameTreeRef) {
3545         // reading name tree
3546         var processed = new RefSet();
3547         processed.put(nameTreeRef);
3548         var queue = [nameTreeRef];
3549         while (queue.length > 0) {
3550           var i, n;
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++) {
3555               var kid = kids[i];
3556               if (processed.has(kid))
3557                 error('invalid destinations');
3558               queue.push(kid);
3559               processed.put(kid);
3560             }
3561             continue;
3562           }
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]));
3566           }
3567         }
3568       }
3569       return shadow(this, 'destinations', dests);
3570     },
3571     getPage: function Catalog_getPage(n) {
3572       var pageCache = this.pageCache;
3573       if (!pageCache) {
3574         pageCache = this.pageCache = [];
3575         this.traverseKids(this.toplevelPagesDict);
3576       }
3577       return this.pageCache[n - 1];
3578     }
3579   };
3581   return Catalog;
3582 })();
3584 var XRef = (function XRefClosure() {
3585   function XRef(stream, startXRef, mainXRefEntriesOffset) {
3586     this.stream = stream;
3587     this.entries = [];
3588     this.xrefstms = {};
3589     var trailerDict = this.readXRef(startXRef);
3590     trailerDict.assignXref(this);
3591     this.trailer = trailerDict;
3592     // prepare the XRef cache
3593     this.cache = [];
3595     var encrypt = trailerDict.get('Encrypt');
3596     if (encrypt) {
3597       var fileId = trailerDict.get('ID');
3598       this.encrypt = new CipherTransformFactory(encrypt,
3599                                                 fileId[0] /*, password */);
3600     }
3602     // get the root dictionary (catalog) object
3603     if (!(this.root = trailerDict.get('Root')))
3604       error('Invalid root reference');
3605   }
3607   XRef.prototype = {
3608     readXRefTable: function XRef_readXRefTable(parser) {
3609       // Example of cross-reference table:
3610       // xref
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
3616       // trailer
3617       // ...
3619       // Outer loop is over subsection headers
3620       var obj;
3621       while (!isCmd(obj = parser.getObj(), 'trailer')) {
3622         var first = obj,
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++) {
3630           var entry = {};
3631           entry.offset = parser.getObj();
3632           entry.gen = parser.getObj();
3633           var type = parser.getObj();
3635           if (isCmd(type, 'f'))
3636             entry.free = true;
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);
3644           }
3646           if (!this.entries[i + first])
3647             this.entries[i + first] = entry;
3648         }
3649       }
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');
3655       // Sanity check
3656       if (!isCmd(obj, 'trailer'))
3657         error('Invalid XRef table: could not find trailer dictionary');
3659       // Read trailer dictionary, e.g.
3660       // trailer
3661       //    << /Size 22
3662       //      /Root 20R
3663       //      /Info 10R
3664       //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
3665       //    >>
3666       // The parser goes through the entire stream << ... >> and provides
3667       // a getter interface for the key-value table
3668       var dict = parser.getObj();
3669       if (!isDict(dict))
3670         error('Invalid XRef table: could not parse trailer dictionary');
3672       return dict;
3673     },
3674     readXRefStream: function XRef_readXRefStream(stream) {
3675       var streamParameters = stream.parameters;
3676       var byteWidths = streamParameters.get('W');
3677       var range = streamParameters.get('Index');
3678       if (!range)
3679         range = [0, streamParameters.get('Size')];
3680       var i, j;
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);
3691         }
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)
3698             type = 1;
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();
3703           var entry = {};
3704           entry.offset = offset;
3705           entry.gen = generation;
3706           switch (type) {
3707             case 0:
3708               entry.free = true;
3709               break;
3710             case 1:
3711               entry.uncompressed = true;
3712               break;
3713             case 2:
3714               break;
3715             default:
3716               error('Invalid XRef entry type: ' + type);
3717           }
3718           if (!this.entries[first + i])
3719             this.entries[first + i] = entry;
3720         }
3721         range.splice(0, 2);
3722       }
3723       return streamParameters;
3724     },
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)
3732             break;
3733           token += String.fromCharCode(ch);
3734           ch = data[offset];
3735         }
3736         return token;
3737       }
3738       function skipUntil(data, offset, what) {
3739         var length = what.length, dataLength = data.length;
3740         var skipped = 0;
3741         // finding byte sequence
3742         while (offset < dataLength) {
3743           var i = 0;
3744           while (i < length && data[offset + i] == what[i])
3745             ++i;
3746           if (i >= length)
3747             break; // sequence found
3749           offset++;
3750           skipped++;
3751         }
3752         return skipped;
3753       }
3754       var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
3755       var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
3756                                           101, 102]);
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;
3761       stream.pos = 0;
3762       var buffer = stream.getBytes();
3763       var position = stream.start, length = buffer.length;
3764       var trailers = [], xrefStms = [];
3765       var state = 0;
3766       var currentToken;
3767       while (position < length) {
3768         var ch = buffer[position];
3769         if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
3770           ++position;
3771           continue;
3772         }
3773         if (ch === 37) { // %-comment
3774           do {
3775             ++position;
3776             ch = buffer[position];
3777           } while (ch !== 13 && ch !== 10);
3778           continue;
3779         }
3780         var token = readToken(buffer, position);
3781         var m;
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]] = {
3788             offset: position,
3789             gen: m[2] | 0,
3790             uncompressed: true
3791           };
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
3803           }
3805           position += contentLength;
3806         } else
3807           position += token.length + 1;
3808       }
3809       // reading XRef streams
3810       for (var i = 0, ii = xrefStms.length; i < ii; ++i) {
3811           this.readXRef(xrefStms[i], true);
3812       }
3813       // finding main trailer
3814       var dict;
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'))
3820           continue;
3821         // read the trailer dictionary
3822         if (!isDict(dict = parser.getObj()))
3823           continue;
3824         // taking the first one with 'ID'
3825         if (dict.has('ID'))
3826           return dict;
3827       }
3828       // no tailer with 'ID', taking last one (if exists)
3829       if (dict)
3830         return dict;
3831       // nothing helps
3832       error('Invalid PDF structure');
3833     },
3834     readXRef: function XRef_readXRef(startXRef, recoveryMode) {
3835       var stream = this.stream;
3836       stream.pos = startXRef;
3838       try {
3839         var parser = new Parser(new Lexer(stream), true, null);
3840         var obj = parser.getObj();
3841         var dict;
3843         // Get dictionary
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');
3850           if (isInt(obj)) {
3851             var pos = obj;
3852             // ignore previously loaded xref streams
3853             // (possible infinite recursion)
3854             if (!(pos in this.xrefstms)) {
3855               this.xrefstms[pos] = 1;
3856               this.readXRef(pos);
3857             }
3858           }
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');
3865           }
3866           dict = this.readXRefStream(obj);
3867           if (!dict)
3868             error('Failed to read XRef stream');
3869         }
3871         // Recursively get previous dictionary, if any
3872         obj = dict.get('Prev');
3873         if (isInt(obj))
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);
3879         }
3881         return dict;
3882       } catch (e) {
3883         log('(while reading XRef): ' + e);
3884       }
3886       if (recoveryMode)
3887         return;
3889       warn('Indexing all PDF objects');
3890       return this.indexObjects();
3891     },
3892     getEntry: function XRef_getEntry(i) {
3893       var e = this.entries[i];
3894       if (e === null)
3895         return null;
3896       return e.free ? null : e; // returns null is the entry is free
3897     },
3898     fetchIfRef: function XRef_fetchIfRef(obj) {
3899       if (!isRef(obj))
3900         return obj;
3901       return this.fetch(obj);
3902     },
3903     fetch: function XRef_fetch(ref, suppressEncryption) {
3904       assertWellFormed(isRef(ref), 'ref object is not a reference');
3905       var num = ref.num;
3906       if (num in this.cache)
3907         return this.cache[num];
3909       var e = this.getEntry(num);
3911       // the referenced entry can be free
3912       if (e === null)
3913         return (this.cache[num] = e);
3915       var gen = ref.gen;
3916       var stream, parser;
3917       if (e.uncompressed) {
3918         if (e.gen != gen)
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 ||
3927             !isCmd(obj3)) {
3928           error('bad XRef entry');
3929         }
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);
3934             if (!isNaN(num))
3935               return num;
3936           }
3937           error('bad XRef entry');
3938         }
3939         if (this.encrypt && !suppressEncryption) {
3940           try {
3941             e = parser.getObj(this.encrypt.createCipherTransform(num, gen));
3942           } catch (ex) {
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);
3947           }
3948         } else {
3949           e = parser.getObj();
3950         }
3951         // Don't cache streams since they are mutable (except images).
3952         if (!isStream(e) || e instanceof JpegStream)
3953           this.cache[num] = e;
3954         return e;
3955       }
3957       // compressed entry
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');
3965       }
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();
3971         if (!isInt(num)) {
3972           error('invalid object number in the ObjStm stream: ' + num);
3973         }
3974         nums.push(num);
3975         var offset = parser.getObj();
3976         if (!isInt(offset)) {
3977           error('invalid object offset in the ObjStm stream: ' + offset);
3978         }
3979       }
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];
3984       }
3985       e = entries[e.gen];
3986       if (!e) {
3987         error('bad XRef entry for compressed object');
3988       }
3989       return e;
3990     },
3991     getCatalogObj: function XRef_getCatalogObj() {
3992       return this.root;
3993     }
3994   };
3996   return XRef;
3997 })();
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.
4004  */
4005 var PDFObjects = (function PDFObjectsClosure() {
4006   function PDFObjects() {
4007     this.objs = {};
4008   }
4010   PDFObjects.prototype = {
4011     objs: null,
4013     /**
4014      * Internal function.
4015      * Ensures there is an object defined for `objId`. Stores `data` on the
4016      * object *if* it is created.
4017      */
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);
4022     },
4024     /**
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.
4027      *
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
4031      * right away.
4032      */
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
4036       if (callback) {
4037         this.ensureObj(objId).then(callback);
4038         return null;
4039       }
4041       // If there isn't a callback, the user expects to get the resolved data
4042       // directly.
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);
4050       return obj.data;
4051     },
4053     /**
4054      * Resolves the object `objId` with optional `data`.
4055      */
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.
4060       if (objs[objId]) {
4061         objs[objId].resolve(data);
4062       } else {
4063         this.ensureObj(objId, data);
4064       }
4065     },
4067     onData: function PDFObjects_onData(objId, callback) {
4068       this.ensureObj(objId).onData(callback);
4069     },
4071     isResolved: function PDFObjects_isResolved(objId) {
4072       var objs = this.objs;
4073       if (!objs[objId]) {
4074         return false;
4075       } else {
4076         return objs[objId].isResolved;
4077       }
4078     },
4080     hasData: function PDFObjects_hasData(objId) {
4081       var objs = this.objs;
4082       if (!objs[objId]) {
4083         return false;
4084       } else {
4085         return objs[objId].hasData;
4086       }
4087     },
4089     /**
4090      * Sets the data of an object but *doesn't* resolve it.
4091      */
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;
4096     }
4097   };
4098   return PDFObjects;
4099 })();
4102 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
4103 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
4105 'use strict';
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;
4113   return {
4114     getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
4115                                                        str) {
4116       var length = 1;
4117       for (var i = 0, ii = size.length; i < ii; i++)
4118         length *= size[i];
4119       length *= outputSize;
4121       var array = [];
4122       var codeSize = 0;
4123       var codeBuf = 0;
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);
4128       var strIdx = 0;
4129       for (var i = 0; i < length; i++) {
4130         while (codeSize < bps) {
4131           codeBuf <<= 8;
4132           codeBuf |= strBytes[strIdx++];
4133           codeSize += 8;
4134         }
4135         codeSize -= bps;
4136         array.push((codeBuf >> codeSize) * sampleMul);
4137         codeBuf &= (1 << codeSize) - 1;
4138       }
4139       return array;
4140     },
4142     getIR: function PDFFunction_getIR(xref, fn) {
4143       var dict = fn.dict;
4144       if (!dict)
4145         dict = fn;
4147       var types = [this.constructSampled,
4148                    null,
4149                    this.constructInterpolated,
4150                    this.constructStiched,
4151                    this.constructPostScript];
4153       var typeNum = dict.get('FunctionType');
4154       var typeFn = types[typeNum];
4155       if (!typeFn)
4156         error('Unknown type of function');
4158       return typeFn.call(this, fn, dict, xref);
4159     },
4161     fromIR: function PDFFunction_fromIR(IR) {
4162       var type = IR[0];
4163       switch (type) {
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:
4171         default:
4172           return this.constructPostScriptFromIR(IR);
4173       }
4174     },
4176     parse: function PDFFunction_parse(xref, fn) {
4177       var IR = this.getIR(xref, fn);
4178       return this.fromIR(IR);
4179     },
4181     constructSampled: function PDFFunction_constructSampled(str, dict) {
4182       function toMultiArray(arr) {
4183         var inputLength = arr.length;
4184         var outputLength = arr.length / 2;
4185         var out = [];
4186         var index = 0;
4187         for (var i = 0; i < inputLength; i += 2) {
4188           out[index] = [arr[i], arr[i + 1]];
4189           ++index;
4190         }
4191         return out;
4192       }
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');
4208       if (!order)
4209         order = 1;
4210       if (order !== 1)
4211         error('No support for cubic spline interpolation: ' + order);
4213       var encode = dict.get('Encode');
4214       if (!encode) {
4215         encode = [];
4216         for (var i = 0; i < inputSize; ++i) {
4217           encode.push(0);
4218           encode.push(size[i] - 1);
4219         }
4220       }
4221       encode = toMultiArray(encode);
4223       var decode = dict.get('Decode');
4224       if (!decode)
4225         decode = range;
4226       else
4227         decode = toMultiArray(decode);
4229       var samples = this.getSampleArray(size, outputSize, bps, str);
4231       return [
4232         CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
4233         outputSize, Math.pow(2, bps) - 1, range
4234       ];
4235     },
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)));
4241       }
4243       return function constructSampledFromIRResult(args) {
4244         // See chapter 3, page 110 of the PDF reference.
4245         var m = IR[1];
4246         var domain = IR[2];
4247         var encode = IR[3];
4248         var decode = IR[4];
4249         var samples = IR[5];
4250         var size = IR[6];
4251         var n = IR[7];
4252         var mask = IR[8];
4253         var range = IR[9];
4255         if (m != args.length)
4256           error('Incorrect number of arguments: ' + inputSize + ' != ' +
4257                 args.length);
4259         var x = args;
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++)
4267           cubeN[j] = 1;
4269         var k = n, pos = 1;
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++) {
4293             if (j & pos) {
4294               cubeN[j] *= n1;
4295               cubeVertex[j] += offset1;
4296             } else {
4297               cubeN[j] *= n0;
4298               cubeVertex[j] += offset0;
4299             }
4300           }
4302           k *= size_i;
4303           pos <<= 1;
4304         }
4306         var y = new Float64Array(n);
4307         for (var j = 0; j < n; ++j) {
4308           // Sum all cube vertices' samples portions
4309           var rj = 0;
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]);
4319         }
4321         return y;
4322       }
4323     },
4325     constructInterpolated: function PDFFunction_constructInterpolated(str,
4326                                                                       dict) {
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;
4335       var diff = [];
4336       for (var i = 0; i < length; ++i)
4337         diff.push(c1[i] - c0[i]);
4339       return [CONSTRUCT_INTERPOLATED, c0, diff, n];
4340     },
4342     constructInterpolatedFromIR:
4343       function PDFFunction_constructInterpolatedFromIR(IR) {
4344       var c0 = IR[1];
4345       var diff = IR[2];
4346       var n = IR[3];
4348       var length = diff.length;
4350       return function constructInterpolatedFromIRResult(args) {
4351         var x = n == 1 ? args[0] : Math.pow(args[0], n);
4353         var out = [];
4354         for (var j = 0; j < length; ++j)
4355           out.push(c0[j] + (x * diff[j]));
4357         return out;
4359       }
4360     },
4362     constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
4363       var domain = dict.get('Domain');
4365       if (!domain)
4366         error('No domain');
4368       var inputSize = domain.length / 2;
4369       if (inputSize != 1)
4370         error('Bad domain for stiched function');
4372       var fnRefs = dict.get('Functions');
4373       var fns = [];
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];
4381     },
4383     constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
4384       var domain = IR[1];
4385       var bounds = IR[2];
4386       var encode = IR[3];
4387       var fnsIR = IR[4];
4388       var fns = [];
4390       for (var i = 0, ii = fnsIR.length; i < ii; i++) {
4391         fns.push(PDFFunction.fromIR(fnsIR[i]));
4392       }
4394       return function constructStichedFromIRResult(args) {
4395         var clip = function constructStichedFromIRClip(v, min, max) {
4396           if (v > max)
4397             v = max;
4398           else if (v < min)
4399             v = min;
4400           return v;
4401         };
4403         // clip to domain
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) {
4407           if (v < bounds[i])
4408             break;
4409         }
4411         // encode value into domain of function
4412         var dmin = domain[0];
4413         if (i > 0)
4414           dmin = bounds[i - 1];
4415         var dmax = domain[1];
4416         if (i < bounds.length)
4417           dmax = bounds[i];
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]);
4426       };
4427     },
4429     constructPostScript: function PDFFunction_constructPostScript(fn, dict,
4430                                                                   xref) {
4431       var domain = dict.get('Domain');
4432       var range = dict.get('Range');
4434       if (!domain)
4435         error('No domain.');
4437       if (!range)
4438         error('No range.');
4440       var lexer = new PostScriptLexer(fn);
4441       var parser = new PostScriptParser(lexer);
4442       var code = parser.parse();
4444       return [CONSTRUCT_POSTSCRIPT, domain, range, code];
4445     },
4447     constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
4448                                           IR) {
4449       var domain = IR[1];
4450       var range = IR[2];
4451       var code = IR[3];
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]);
4461         }
4463         var key = initialStack.join('_');
4464         if (cache.has(key))
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;
4477         }
4478         cache.set(key, transformed);
4479         return transformed;
4480       };
4481     }
4482   };
4483 })();
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() {
4490     this.cache = {};
4491     this.total = 0;
4492   }
4493   FunctionCache.prototype = {
4494     has: function FunctionCache_has(key) {
4495       return key in this.cache;
4496     },
4497     get: function FunctionCache_get(key) {
4498       return this.cache[key];
4499     },
4500     set: function FunctionCache_set(key, value) {
4501       if (this.total < MAX_CACHE_SIZE) {
4502         this.cache[key] = value;
4503         this.total++;
4504       }
4505     }
4506   };
4507   return FunctionCache;
4508 })();
4510 var PostScriptStack = (function PostScriptStackClosure() {
4511   var MAX_STACK_SIZE = 100;
4512   function PostScriptStack(initialStack) {
4513     this.stack = initialStack || [];
4514   }
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);
4521     },
4522     pop: function PostScriptStack_pop() {
4523       if (this.stack.length <= 0)
4524         error('PostScript function stack underflow.');
4525       return this.stack.pop();
4526     },
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]);
4533     },
4534     index: function PostScriptStack_index(n) {
4535       this.push(this.stack[this.stack.length - n - 1]);
4536     },
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;
4544       }
4545       for (i = l, j = c - 1; i < j; i++, j--) {
4546         t = stack[i]; stack[i] = stack[j]; stack[j] = t;
4547       }
4548       for (i = c, j = r; i < j; i++, j--) {
4549         t = stack[i]; stack[i] = stack[j]; stack[j] = t;
4550       }
4551     }
4552   };
4553   return PostScriptStack;
4554 })();
4555 var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
4556   function PostScriptEvaluator(operators, operands) {
4557     this.operators = operators;
4558     this.operands = operands;
4559   }
4560   PostScriptEvaluator.prototype = {
4561     execute: function PostScriptEvaluator_execute(initialStack) {
4562       var stack = new PostScriptStack(initialStack);
4563       var counter = 0;
4564       var operators = this.operators;
4565       var length = operators.length;
4566       var operator, a, b;
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);
4572           continue;
4573         }
4574         switch (operator) {
4575           // non standard ps operators
4576           case 'jz': // jump if false
4577             b = stack.pop();
4578             a = stack.pop();
4579             if (!a)
4580               counter = b;
4581             break;
4582           case 'j': // jump
4583             a = stack.pop();
4584             counter = a;
4585             break;
4587           // all ps operators in alphabetical order (excluding if/ifelse)
4588           case 'abs':
4589             a = stack.pop();
4590             stack.push(Math.abs(a));
4591             break;
4592           case 'add':
4593             b = stack.pop();
4594             a = stack.pop();
4595             stack.push(a + b);
4596             break;
4597           case 'and':
4598             b = stack.pop();
4599             a = stack.pop();
4600             if (isBool(a) && isBool(b))
4601               stack.push(a && b);
4602             else
4603               stack.push(a & b);
4604             break;
4605           case 'atan':
4606             a = stack.pop();
4607             stack.push(Math.atan(a));
4608             break;
4609           case 'bitshift':
4610             b = stack.pop();
4611             a = stack.pop();
4612             if (a > 0)
4613               stack.push(a << b);
4614             else
4615               stack.push(a >> b);
4616             break;
4617           case 'ceiling':
4618             a = stack.pop();
4619             stack.push(Math.ceil(a));
4620             break;
4621           case 'copy':
4622             a = stack.pop();
4623             stack.copy(a);
4624             break;
4625           case 'cos':
4626             a = stack.pop();
4627             stack.push(Math.cos(a));
4628             break;
4629           case 'cvi':
4630             a = stack.pop() | 0;
4631             stack.push(a);
4632             break;
4633           case 'cvr':
4634             // noop
4635             break;
4636           case 'div':
4637             b = stack.pop();
4638             a = stack.pop();
4639             stack.push(a / b);
4640             break;
4641           case 'dup':
4642             stack.copy(1);
4643             break;
4644           case 'eq':
4645             b = stack.pop();
4646             a = stack.pop();
4647             stack.push(a == b);
4648             break;
4649           case 'exch':
4650             stack.roll(2, 1);
4651             break;
4652           case 'exp':
4653             b = stack.pop();
4654             a = stack.pop();
4655             stack.push(Math.pow(a, b));
4656             break;
4657           case 'false':
4658             stack.push(false);
4659             break;
4660           case 'floor':
4661             a = stack.pop();
4662             stack.push(Math.floor(a));
4663             break;
4664           case 'ge':
4665             b = stack.pop();
4666             a = stack.pop();
4667             stack.push(a >= b);
4668             break;
4669           case 'gt':
4670             b = stack.pop();
4671             a = stack.pop();
4672             stack.push(a > b);
4673             break;
4674           case 'idiv':
4675             b = stack.pop();
4676             a = stack.pop();
4677             stack.push((a / b) | 0);
4678             break;
4679           case 'index':
4680             a = stack.pop();
4681             stack.index(a);
4682             break;
4683           case 'le':
4684             b = stack.pop();
4685             a = stack.pop();
4686             stack.push(a <= b);
4687             break;
4688           case 'ln':
4689             a = stack.pop();
4690             stack.push(Math.log(a));
4691             break;
4692           case 'log':
4693             a = stack.pop();
4694             stack.push(Math.log(a) / Math.LN10);
4695             break;
4696           case 'lt':
4697             b = stack.pop();
4698             a = stack.pop();
4699             stack.push(a < b);
4700             break;
4701           case 'mod':
4702             b = stack.pop();
4703             a = stack.pop();
4704             stack.push(a % b);
4705             break;
4706           case 'mul':
4707             b = stack.pop();
4708             a = stack.pop();
4709             stack.push(a * b);
4710             break;
4711           case 'ne':
4712             b = stack.pop();
4713             a = stack.pop();
4714             stack.push(a != b);
4715             break;
4716           case 'neg':
4717             a = stack.pop();
4718             stack.push(-b);
4719             break;
4720           case 'not':
4721             a = stack.pop();
4722             if (isBool(a) && isBool(b))
4723               stack.push(a && b);
4724             else
4725               stack.push(a & b);
4726             break;
4727           case 'or':
4728             b = stack.pop();
4729             a = stack.pop();
4730             if (isBool(a) && isBool(b))
4731               stack.push(a || b);
4732             else
4733               stack.push(a | b);
4734             break;
4735           case 'pop':
4736             stack.pop();
4737             break;
4738           case 'roll':
4739             b = stack.pop();
4740             a = stack.pop();
4741             stack.roll(a, b);
4742             break;
4743           case 'round':
4744             a = stack.pop();
4745             stack.push(Math.round(a));
4746             break;
4747           case 'sin':
4748             a = stack.pop();
4749             stack.push(Math.sin(a));
4750             break;
4751           case 'sqrt':
4752             a = stack.pop();
4753             stack.push(Math.sqrt(a));
4754             break;
4755           case 'sub':
4756             b = stack.pop();
4757             a = stack.pop();
4758             stack.push(a - b);
4759             break;
4760           case 'true':
4761             stack.push(true);
4762             break;
4763           case 'truncate':
4764             a = stack.pop();
4765             a = a < 0 ? Math.ceil(a) : Math.floor(a);
4766             stack.push(a);
4767             break;
4768           case 'xor':
4769             b = stack.pop();
4770             a = stack.pop();
4771             if (isBool(a) && isBool(b))
4772               stack.push(a != b);
4773             else
4774               stack.push(a ^ b);
4775             break;
4776           default:
4777             error('Unknown operator ' + operator);
4778             break;
4779         }
4780       }
4781       return stack.stack;
4782     }
4783   };
4784   return PostScriptEvaluator;
4785 })();
4787 var PostScriptParser = (function PostScriptParserClosure() {
4788   function PostScriptParser(lexer) {
4789     this.lexer = lexer;
4790     this.operators = [];
4791     this.token;
4792     this.prev;
4793   }
4794   PostScriptParser.prototype = {
4795     nextToken: function PostScriptParser_nextToken() {
4796       this.prev = this.token;
4797       this.token = this.lexer.getToken();
4798     },
4799     accept: function PostScriptParser_accept(type) {
4800       if (this.token.type == type) {
4801         this.nextToken();
4802         return true;
4803       }
4804       return false;
4805     },
4806     expect: function PostScriptParser_expect(type) {
4807       if (this.accept(type))
4808         return true;
4809       error('Unexpected symbol: found ' + this.token.type + ' expected ' +
4810             type + '.');
4811     },
4812     parse: function PostScriptParser_parse() {
4813       this.nextToken();
4814       this.expect(PostScriptTokenTypes.LBRACE);
4815       this.parseBlock();
4816       this.expect(PostScriptTokenTypes.RBRACE);
4817       return this.operators;
4818     },
4819     parseBlock: function PostScriptParser_parseBlock() {
4820       while (true) {
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();
4827         } else {
4828           return;
4829         }
4830       }
4831     },
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);
4837       this.parseBlock();
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;
4848         this.parseBlock();
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
4852         // block.
4853         this.operators[jumpLocation] = this.operators.length;
4854         this.operators[jumpLocation + 1] = 'j';
4856         this.operators[conditionLocation] = endOfTrue;
4857         this.operators[conditionLocation + 1] = 'jz';
4858       } else {
4859         error('PS Function: error parsing conditional.');
4860       }
4861     }
4862   };
4863   return PostScriptParser;
4864 })();
4866 var PostScriptTokenTypes = {
4867   LBRACE: 0,
4868   RBRACE: 1,
4869   NUMBER: 2,
4870   OPERATOR: 3,
4871   IF: 4,
4872   IFELSE: 5
4875 var PostScriptToken = (function PostScriptTokenClosure() {
4876   function PostScriptToken(type, value) {
4877     this.type = type;
4878     this.value = value;
4879   }
4881   var opCache = {};
4883   PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
4884     var opValue = opCache[op];
4885     if (opValue)
4886       return opValue;
4888     return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
4889   };
4891   PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
4892                                                 '{');
4893   PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
4894                                                 '}');
4895   PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
4896   PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
4897                                                 'IFELSE');
4898   return PostScriptToken;
4899 })();
4901 var PostScriptLexer = (function PostScriptLexerClosure() {
4902   function PostScriptLexer(stream) {
4903     this.stream = stream;
4904   }
4905   PostScriptLexer.prototype = {
4906     getToken: function PostScriptLexer_getToken() {
4907       var s = '';
4908       var ch;
4909       var comment = false;
4910       var stream = this.stream;
4912       // skip comments
4913       while (true) {
4914         if (!(ch = stream.getChar()))
4915           return EOF;
4917         if (comment) {
4918           if (ch == '\x0a' || ch == '\x0d')
4919             comment = false;
4920         } else if (ch == '%') {
4921           comment = true;
4922         } else if (!Lexer.isSpace(ch)) {
4923           break;
4924         }
4925       }
4926       switch (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));
4932         case '{':
4933           return PostScriptToken.LBRACE;
4934         case '}':
4935           return PostScriptToken.RBRACE;
4936       }
4937       // operator
4938       var str = ch.toLowerCase();
4939       while (true) {
4940         ch = stream.lookChar();
4941         if (ch === null)
4942           break;
4943         ch = ch.toLowerCase();
4944         if (ch >= 'a' && ch <= 'z')
4945           str += ch;
4946         else
4947           break;
4948         stream.skip();
4949       }
4950       switch (str) {
4951         case 'if':
4952           return PostScriptToken.IF;
4953         case 'ifelse':
4954           return PostScriptToken.IFELSE;
4955         default:
4956           return PostScriptToken.getOperator(str);
4957       }
4958     },
4959     getNumber: function PostScriptLexer_getNumber(ch) {
4960       var str = ch;
4961       var stream = this.stream;
4962       while (true) {
4963         ch = stream.lookChar();
4964         if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.')
4965           str += ch;
4966         else
4967           break;
4968         stream.skip();
4969       }
4970       var value = parseFloat(str);
4971       if (isNaN(value))
4972         error('Invalid floating point number: ' + value);
4973       return value;
4974     }
4975   };
4976   return PostScriptLexer;
4977 })();
4980 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
4981 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
4983 'use strict';
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',
5059   'Ydieresissmall'
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: */
5089 'use strict';
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,
7578     {f: 6, c: 55198}],
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},
12016     {f: 7, c: 19887}]
12020 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
12021 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
12023 'use strict';
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');
12029   }
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);
12036     },
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);
12041     }
12042   };
12044   ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
12045     var IR = ColorSpace.parseToIR(cs, xref, res);
12046     if (IR instanceof AlternateCS)
12047       return IR;
12049     return ColorSpace.fromIR(IR);
12050   };
12052   ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
12053     var name = isArray(IR) ? IR[0] : IR;
12055     switch (name) {
12056       case 'DeviceGrayCS':
12057         return new DeviceGrayCS();
12058       case 'DeviceRgbCS':
12059         return new DeviceRgbCS();
12060       case 'DeviceCmykCS':
12061         return new DeviceCmykCS();
12062       case 'PatternCS':
12063         var basePatternCS = IR[1];
12064         if (basePatternCS)
12065           basePatternCS = ColorSpace.fromIR(basePatternCS);
12066         return new PatternCS(basePatternCS);
12067       case 'IndexedCS':
12068         var baseIndexedCS = IR[1];
12069         var hiVal = IR[2];
12070         var lookup = IR[3];
12071         return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
12072       case 'AlternateCS':
12073         var numComps = IR[1];
12074         var alt = IR[2];
12075         var tintFnIR = IR[3];
12077         return new AlternateCS(numComps, ColorSpace.fromIR(alt),
12078                                 PDFFunction.fromIR(tintFnIR));
12079       case 'LabCS':
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);
12084       default:
12085         error('Unkown name ' + name);
12086     }
12087     return null;
12088   };
12090   ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
12091     if (isName(cs)) {
12092       var colorSpaces = res.get('ColorSpace');
12093       if (isDict(colorSpaces)) {
12094         var refcs = colorSpaces.get(cs.name);
12095         if (refcs)
12096           cs = refcs;
12097       }
12098     }
12100     cs = xref.fetchIfRef(cs);
12101     var mode;
12103     if (isName(cs)) {
12104       mode = cs.name;
12105       this.mode = mode;
12107       switch (mode) {
12108         case 'DeviceGray':
12109         case 'G':
12110           return 'DeviceGrayCS';
12111         case 'DeviceRGB':
12112         case 'RGB':
12113           return 'DeviceRgbCS';
12114         case 'DeviceCMYK':
12115         case 'CMYK':
12116           return 'DeviceCmykCS';
12117         case 'Pattern':
12118           return ['PatternCS', null];
12119         default:
12120           error('unrecognized colorspace ' + mode);
12121       }
12122     } else if (isArray(cs)) {
12123       mode = cs[0].name;
12124       this.mode = mode;
12126       switch (mode) {
12127         case 'DeviceGray':
12128         case 'G':
12129           return 'DeviceGrayCS';
12130         case 'DeviceRGB':
12131         case 'RGB':
12132           return 'DeviceRgbCS';
12133         case 'DeviceCMYK':
12134         case 'CMYK':
12135           return 'DeviceCmykCS';
12136         case 'CalGray':
12137           return 'DeviceGrayCS';
12138         case 'CalRGB':
12139           return 'DeviceRgbCS';
12140         case 'ICCBased':
12141           var stream = xref.fetchIfRef(cs[1]);
12142           var dict = stream.dict;
12143           var numComps = dict.get('N');
12144           if (numComps == 1)
12145             return 'DeviceGrayCS';
12146           if (numComps == 3)
12147             return 'DeviceRgbCS';
12148           if (numComps == 4)
12149             return 'DeviceCmykCS';
12150           break;
12151         case 'Pattern':
12152           var basePatternCS = cs[1];
12153           if (basePatternCS)
12154             basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
12155           return ['PatternCS', basePatternCS];
12156         case 'Indexed':
12157         case 'I':
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];
12162         case 'Separation':
12163         case 'DeviceN':
12164           var name = cs[1];
12165           var numComps = 1;
12166           if (isName(name))
12167             numComps = 1;
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];
12173         case 'Lab':
12174           var params = cs[1].getAll();
12175           return ['LabCS', params];
12176         default:
12177           error('unimplemented color space object "' + mode + '"');
12178       }
12179     } else {
12180       error('unrecognized color space object: "' + cs + '"');
12181     }
12182     return null;
12183   };
12184   /**
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.
12192    */
12193   ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
12194     if (!decode)
12195       return true;
12197     if (n * 2 !== decode.length) {
12198       warning('The decode map is not the correct length');
12199       return true;
12200     }
12201     for (var i = 0, ii = decode.length; i < ii; i += 2) {
12202       if (decode[i] != 0 || decode[i + 1] != 1)
12203         return false;
12204     }
12205     return true;
12206   };
12208   return ColorSpace;
12209 })();
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
12215  * space.
12216  */
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);
12224     this.base = base;
12225     this.tintFn = tintFn;
12226   }
12228   AlternateCS.prototype = {
12229     getRgb: function AlternateCS_getRgb(color) {
12230       var tinted = this.tintFn(color);
12231       return this.base.getRgb(tinted);
12232     },
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;
12238       var pos = 0;
12239       var baseNumComps = base.numComps;
12240       var baseBuf = new Uint8Array(baseNumComps * length);
12241       var numComps = this.numComps;
12242       var scaled = [];
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];
12251       }
12252       return base.getRgbBuffer(baseBuf, 8);
12253     },
12254     isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
12255       return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12256     }
12257   };
12259   return AlternateCS;
12260 })();
12262 var PatternCS = (function PatternCSClosure() {
12263   function PatternCS(baseCS) {
12264     this.name = 'Pattern';
12265     this.base = baseCS;
12266   }
12267   PatternCS.prototype = {};
12269   return PatternCS;
12270 })();
12272 var IndexedCS = (function IndexedCSClosure() {
12273   function IndexedCS(base, highVal, lookup) {
12274     this.name = 'Indexed';
12275     this.numComps = 1;
12276     this.defaultColor = [0];
12277     this.base = base;
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);
12290     } else {
12291       error('Unrecognized lookup table: ' + lookup);
12292     }
12293     this.lookup = lookupArray;
12294   }
12296   IndexedCS.prototype = {
12297     getRgb: function IndexedCS_getRgb(color) {
12298       var numComps = this.base.numComps;
12299       var start = color[0] * numComps;
12300       var c = [];
12302       for (var i = start, ii = start + numComps; i < ii; ++i)
12303         c.push(this.lookup[i]);
12305       return this.base.getRgb(c);
12306     },
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];
12319         }
12320       }
12322       return base.getRgbBuffer(baseBuf, 8);
12323     },
12324     isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
12325       // indexed color maps shouldn't be changed
12326       return true;
12327     }
12328   };
12329   return IndexedCS;
12330 })();
12332 var DeviceGrayCS = (function DeviceGrayCSClosure() {
12333   function DeviceGrayCS() {
12334     this.name = 'DeviceGray';
12335     this.numComps = 1;
12336     this.defaultColor = [0];
12337   }
12339   DeviceGrayCS.prototype = {
12340     getRgb: function DeviceGrayCS_getRgb(color) {
12341       var c = color[0];
12342       return [c, c, c];
12343     },
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;
12350         rgbBuf[j++] = c;
12351         rgbBuf[j++] = c;
12352         rgbBuf[j++] = c;
12353       }
12354       return rgbBuf;
12355     },
12356     isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
12357       return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12358     }
12359   };
12360   return DeviceGrayCS;
12361 })();
12363 var DeviceRgbCS = (function DeviceRgbCSClosure() {
12364   function DeviceRgbCS() {
12365     this.name = 'DeviceRGB';
12366     this.numComps = 3;
12367     this.defaultColor = [0, 0, 0];
12368   }
12369   DeviceRgbCS.prototype = {
12370     getRgb: function DeviceRgbCS_getRgb(color) {
12371       return color;
12372     },
12373     getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) {
12374       if (bits == 8)
12375         return input;
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;
12381       return rgbBuf;
12382     },
12383     isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
12384       return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12385     }
12386   };
12387   return DeviceRgbCS;
12388 })();
12390 var DeviceCmykCS = (function DeviceCmykCSClosure() {
12391   function DeviceCmykCS() {
12392     this.name = 'DeviceCMYK';
12393     this.numComps = 4;
12394     this.defaultColor = [0, 0, 0, 1];
12395   }
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
12406       var r = (1 - c);
12407       var g = (1 - m);
12408       var b = (1 - y);
12410       return [r, g, b];
12411     },
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);
12416       var rgbBufPos = 0;
12417       var colorBufPos = 0;
12419       for (var i = 0; i < length; i++) {
12420         var cmyk = [];
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);
12427       }
12429       return rgbBuf;
12430     },
12431     isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
12432       return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
12433     }
12434   };
12436   return DeviceCmykCS;
12437 })();
12440 // LabCS: Based on "PDF Reference, Sixth Ed", p.250
12442 var LabCS = (function LabCSClosure() {
12443   function LabCS(whitePoint, blackPoint, range) {
12444     this.name = 'Lab';
12445     this.numComps = 3;
12446     this.defaultColor = [0, 0, 0];
12448     if (!whitePoint)
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;
12475     }
12477     if (this.amin > this.amax || this.bmin > this.bmax) {
12478       warn('Invalid Range, falling back to defaults');
12479       this.amin = -100;
12480       this.amax = 100;
12481       this.bmin = -100;
12482       this.bmax = 100;
12483     }
12484   };
12486   // Function g(x) from spec
12487   function g(x) {
12488     if (x >= 6 / 29)
12489       return x * x * x;
12490     else
12491       return (108 / 841) * (x - 4 / 29);
12492   }
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]);
12520     },
12521     getRgbBuffer: function LabCS_getRgbBuffer(input, bits) {
12522       if (bits == 8)
12523         return input;
12524       var scale = 255 / ((1 << bits) - 1);
12525       var i, length = input.length / 3;
12526       var rgbBuf = new Uint8Array(length);
12528       var j = 0;
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];
12535       }
12537       return rgbBuf;
12538     },
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)
12545         return true;
12546       else
12547         return false;
12548     }
12549   };
12550   return LabCS;
12551 })();
12553 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
12554 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
12556 'use strict';
12558 var ARCFourCipher = (function ARCFourCipherClosure() {
12559   function ARCFourCipher(key) {
12560     this.a = 0;
12561     this.b = 0;
12562     var s = new Uint8Array(256);
12563     var i, j = 0, tmp, keyLength = key.length;
12564     for (i = 0; i < 256; ++i)
12565       s[i] = i;
12566     for (i = 0; i < 256; ++i) {
12567       tmp = s[i];
12568       j = (j + tmp + key[i % keyLength]) & 0xFF;
12569       s[i] = s[j];
12570       s[j] = tmp;
12571     }
12572     this.s = s;
12573   }
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;
12582         tmp = s[a];
12583         b = (b + tmp) & 0xFF;
12584         tmp2 = s[b];
12585         s[a] = tmp2;
12586         s[b] = tmp;
12587         output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
12588       }
12589       this.a = a;
12590       this.b = b;
12591       return output;
12592     }
12593   };
12594   ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
12596   return ARCFourCipher;
12597 })();
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;
12621     // pre-processing
12622     var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
12623     var padded = new Uint8Array(paddedLength);
12624     var i, j, n;
12625     for (i = 0; i < length; ++i)
12626       padded[i] = data[offset++];
12627     padded[i++] = 0x80;
12628     n = paddedLength - 8;
12629     while (i < n)
12630       padded[i++] = 0;
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;
12636     padded[i++] = 0;
12637     padded[i++] = 0;
12638     padded[i++] = 0;
12639     // chunking
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));
12646       }
12647       var a = h0, b = h1, c = h2, d = h3, f, g;
12648       for (j = 0; j < 64; ++j) {
12649         if (j < 16) {
12650           f = (b & c) | ((~b) & d);
12651           g = j;
12652         } else if (j < 32) {
12653           f = (d & b) | ((~d) & c);
12654           g = (5 * j + 1) & 15;
12655         } else if (j < 48) {
12656           f = b ^ c ^ d;
12657           g = (3 * j + 5) & 15;
12658         } else {
12659           f = c ^ (b | (~d));
12660           g = (7 * j) & 15;
12661         }
12662         var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
12663         d = c;
12664         c = b;
12665         b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
12666         a = tmp;
12667       }
12668       h0 = (h0 + a) | 0;
12669       h1 = (h1 + b) | 0;
12670       h2 = (h2 + c) | 0;
12671       h3 = (h3 + d) | 0;
12672     }
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
12678     ]);
12679   }
12680   return hash;
12681 })();
12683 var NullCipher = (function NullCipherClosure() {
12684   function NullCipher() {
12685   }
12687   NullCipher.prototype = {
12688     decryptBlock: function NullCipher_decryptBlock(data) {
12689       return data;
12690     }
12691   };
12693   return NullCipher;
12694 })();
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) {
12818       // RotWord
12819       var t1 = result[j - 3], t2 = result[j - 2],
12820           t3 = result[j - 1], t4 = result[j - 4];
12821       // SubWord
12822       t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4];
12823       // Rcon
12824       t1 = t1 ^ rcon[i];
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++;
12830       }
12831     }
12832     return result;
12833   }
12835   function decrypt128(input, key) {
12836     var state = new Uint8Array(16);
12837     state.set(input);
12838     var i, j, k;
12839     var t, u, v;
12840     // AddRoundKey
12841     for (j = 0, k = 160; j < 16; ++j, ++k)
12842       state[j] ^= key[k];
12843     for (i = 9; i >= 1; --i) {
12844       // InvShiftRows
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;
12851       // InvSubBytes
12852       for (j = 0; j < 16; ++j)
12853         state[j] = inv_s[state[j]];
12854       // AddRoundKey
12855       for (j = 0, k = i * 16; j < 16; ++j, ++k)
12856         state[j] ^= key[k];
12857       // InvMixColumns
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;
12867       }
12868     }
12869     // InvShiftRows
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) {
12877       // InvSubBytes
12878       state[j] = inv_s[state[j]];
12879       // AddRoundKey
12880       state[j] ^= key[j];
12881     }
12882     return state;
12883   }
12885   function AES128Cipher(key) {
12886     this.key = expandKey128(key);
12887     this.buffer = new Uint8Array(16);
12888     this.bufferPosition = 0;
12889   }
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];
12897       ++bufferLength;
12898       if (bufferLength < 16)
12899         continue;
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)
12904         plain[j] ^= iv[j];
12905       iv = buffer;
12906       result.push(plain);
12907       buffer = new Uint8Array(16);
12908       bufferLength = 0;
12909     }
12910     // saving incomplete buffer
12911     this.buffer = buffer;
12912     this.bufferLength = bufferLength;
12913     this.iv = iv;
12914     if (result.length == 0)
12915       return new Uint8Array([]);
12916     if (result.length == 1)
12917       return result[0];
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);
12922     return output;
12923   }
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) {
12933         // need more data
12934         this.bufferLength = bufferLength;
12935         return new Uint8Array([]);
12936       }
12937       this.iv = buffer;
12938       this.buffer = new Uint8Array(16);
12939       this.bufferLength = 0;
12940       // starting decryption
12941       this.decryptBlock = decryptBlock2;
12942       return this.decryptBlock(data.subarray(16));
12943     }
12944   };
12946   return AES128Cipher;
12947 })();
12949 var CipherTransform = (function CipherTransformClosure() {
12950   function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
12951     this.stringCipherConstructor = stringCipherConstructor;
12952     this.streamCipherConstructor = streamCipherConstructor;
12953   }
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);
12960         }
12961       );
12962     },
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);
12968     }
12969   };
12970   return CipherTransform;
12971 })();
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;
12982     if (password) {
12983       n = Math.min(32, password.length);
12984       for (; i < n; ++i)
12985         hashData[i] = password[i];
12986     }
12987     j = 0;
12988     while (i < 32) {
12989       hashData[i++] = defaultPasswordBytes[j++];
12990     }
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;
13005     }
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);
13011       }
13012     }
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
13018       // password check
13019       i = 32;
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);
13031       }
13032     } else {
13033       cipher = new ARCFourCipher(encryptionKey);
13034       checkData = cipher.encryptBlock(hashData.subarray(0, 32));
13035     }
13036     for (j = 0, n = checkData.length; j < n; ++j) {
13037       if (userPassword[j] != checkData[j])
13038         error('incorrect password');
13039     }
13040     return encryptionKey;
13041   }
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');
13049     this.dict = dict;
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');
13059     // prepare keys
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);
13067     var passwordBytes;
13068     if (password)
13069       passwordBytes = stringToBytes(password);
13071     this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
13072                                         ownerPassword, userPassword,
13073                                         flags, revision,
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;
13080     }
13081   }
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;
13092     if (isAes) {
13093       key[i++] = 0x73;
13094       key[i++] = 0x41;
13095       key[i++] = 0x6C;
13096       key[i++] = 0x54;
13097     }
13098     var hash = calculateMD5(key, 0, i);
13099     return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
13100   }
13102   function buildCipherConstructor(cf, name, num, gen, key) {
13103     var cryptFilter = cf.get(name.name);
13104     var cfm;
13105     if (cryptFilter != null)
13106       cfm = cryptFilter.get('CFM');
13107     if (!cfm || cfm.name == 'None') {
13108       return function cipherTransformFactoryBuildCipherConstructorNone() {
13109         return new NullCipher();
13110       };
13111     }
13112     if ('V2' == cfm.name) {
13113       return function cipherTransformFactoryBuildCipherConstructorV2() {
13114         return new ARCFourCipher(
13115           buildObjectKey(num, gen, key, false));
13116       };
13117     }
13118     if ('AESV2' == cfm.name) {
13119       return function cipherTransformFactoryBuildCipherConstructorAESV2() {
13120         return new AES128Cipher(
13121           buildObjectKey(num, gen, key, true));
13122       };
13123     }
13124     error('Unknown crypto method');
13125   }
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));
13136       }
13137       // algorithms 1 and 2
13138       var key = buildObjectKey(num, gen, this.encryptionKey, false);
13139       var cipherConstructor = function buildCipherCipherConstructor() {
13140         return new ARCFourCipher(key);
13141       };
13142       return new CipherTransform(cipherConstructor, cipherConstructor);
13143     }
13144   };
13146   return CipherTransformFactory;
13147 })();
13150 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
13151 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
13153 'use strict';
13155 var PartialEvaluator = (function PartialEvaluatorClosure() {
13156   function PartialEvaluator(xref, handler, uniquePrefix) {
13157     this.state = new EvalState();
13158     this.stateStack = [];
13160     this.xref = xref;
13161     this.handler = handler;
13162     this.uniquePrefix = uniquePrefix;
13163     this.objIdCounter = 0;
13164   }
13166   var OP_MAP = {
13167     // Graphics state
13168     w: 'setLineWidth',
13169     J: 'setLineCap',
13170     j: 'setLineJoin',
13171     M: 'setMiterLimit',
13172     d: 'setDash',
13173     ri: 'setRenderingIntent',
13174     i: 'setFlatness',
13175     gs: 'setGState',
13176     q: 'save',
13177     Q: 'restore',
13178     cm: 'transform',
13180     // Path
13181     m: 'moveTo',
13182     l: 'lineTo',
13183     c: 'curveTo',
13184     v: 'curveTo2',
13185     y: 'curveTo3',
13186     h: 'closePath',
13187     re: 'rectangle',
13188     S: 'stroke',
13189     s: 'closeStroke',
13190     f: 'fill',
13191     F: 'fill',
13192     'f*': 'eoFill',
13193     B: 'fillStroke',
13194     'B*': 'eoFillStroke',
13195     b: 'closeFillStroke',
13196     'b*': 'closeEOFillStroke',
13197     n: 'endPath',
13199     // Clipping
13200     W: 'clip',
13201     'W*': 'eoClip',
13203     // Text
13204     BT: 'beginText',
13205     ET: 'endText',
13206     Tc: 'setCharSpacing',
13207     Tw: 'setWordSpacing',
13208     Tz: 'setHScale',
13209     TL: 'setLeading',
13210     Tf: 'setFont',
13211     Tr: 'setTextRenderingMode',
13212     Ts: 'setTextRise',
13213     Td: 'moveText',
13214     TD: 'setLeadingMoveText',
13215     Tm: 'setTextMatrix',
13216     'T*': 'nextLine',
13217     Tj: 'showText',
13218     TJ: 'showSpacedText',
13219     "'": 'nextLineShowText',
13220     '"': 'nextLineSetSpacingShowText',
13222     // Type3 fonts
13223     d0: 'setCharWidth',
13224     d1: 'setCharWidthAndBounds',
13226     // Color
13227     CS: 'setStrokeColorSpace',
13228     cs: 'setFillColorSpace',
13229     SC: 'setStrokeColor',
13230     SCN: 'setStrokeColorN',
13231     sc: 'setFillColor',
13232     scn: 'setFillColorN',
13233     G: 'setStrokeGray',
13234     g: 'setFillGray',
13235     RG: 'setStrokeRGBColor',
13236     rg: 'setFillRGBColor',
13237     K: 'setStrokeCMYKColor',
13238     k: 'setFillCMYKColor',
13240     // Shading
13241     sh: 'shadingFill',
13243     // Images
13244     BI: 'beginInlineImage',
13245     ID: 'beginImageData',
13246     EI: 'endInlineImage',
13248     // XObjects
13249     Do: 'paintXObject',
13251     // Marked content
13252     MP: 'markPoint',
13253     DP: 'markPointProps',
13254     BMC: 'beginMarkedContent',
13255     BDC: 'beginMarkedContentProps',
13256     EMC: 'endMarkedContent',
13258     // Compatibility
13259     BX: 'beginCompat',
13260     EX: 'endCompat'
13261   };
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
13270     }
13271     return null;
13272   }
13274   PartialEvaluator.prototype = {
13275     getOperatorList: function PartialEvaluator_getOperatorList(stream,
13276                                                                resources,
13277                                                                dependency,
13278                                                                queue) {
13280       var self = this;
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]);
13292           }
13293         }
13294       }
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,
13308                                                dependency);
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();
13324             }
13326             handler.send('obj', [
13327                 loadedName,
13328                 'Font',
13329                 translated.name,
13330                 translated.file,
13331                 translated.properties
13332             ]);
13333           }
13334         }
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
13340         // page.
13341         insertDependency([loadedName]);
13342         return loadedName;
13343       }
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;
13351         if (imageMask) {
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
13356           // for later.
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];
13367           return;
13368         }
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()]);
13382           return;
13383         }
13385         fn = 'paintImageXObject';
13387         PDFImage.buildImage(function(imageObj) {
13388             var drawWidth = imageObj.drawWidth;
13389             var drawHeight = imageObj.drawHeight;
13390             var imgData = {
13391               width: drawWidth,
13392               height: drawHeight,
13393               data: new Uint8Array(drawWidth * drawHeight * 4)
13394             };
13395             var pixels = imgData.data;
13396             imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight);
13397             handler.send('obj', [objId, 'Image', imgData]);
13398           }, handler, xref, resources, image, inline);
13399       }
13401       if (!queue)
13402         queue = {};
13404       if (!queue.argsArray) {
13405         queue.argsArray = [];
13406       }
13407       if (!queue.fnArray) {
13408         queue.fnArray = [];
13409       }
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;
13423       while (true) {
13424         if (hasNextObj) {
13425           obj = nextObj;
13426           hasNextObj = false;
13427         } else {
13428           obj = parser.getObj();
13429           if (isEOF(obj))
13430             break;
13431         }
13433         if (isCmd(obj)) {
13434           var cmd = obj.cmd;
13435           var fn = OP_MAP[cmd];
13436           if (!fn) {
13437             // invalid content command, trying to recover
13438             var cmds = splitCombinedOperations(cmd);
13439             if (cmds) {
13440               cmd = cmds[0];
13441               fn = OP_MAP[cmd];
13442               // feeding other command on the next interation
13443               hasNextObj = true;
13444               nextObj = Cmd.get(cmds[1]);
13445             }
13446           }
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);
13456               if (pattern) {
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
13467                   // operatorList.
13468                   insertDependency(dependencyArray.slice(depIdx));
13470                   args = TilingPattern.getIR(operatorList, dict, args);
13471                 }
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,
13476                                                      res);
13477                   args = pattern.getIR();
13478                 } else {
13479                   error('Unkown PatternType ' + typeNum);
13480                 }
13481               }
13482             }
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);
13487             if (xobj) {
13488               assertWellFormed(isStream(xobj), 'XObject should be a stream');
13490               var type = xobj.dict.get('Subtype');
13491               assertWellFormed(
13492                 isName(type),
13493                 'XObject should have a Name subtype'
13494               );
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
13514                // operatorList.
13515                insertDependency(dependencyArray.slice(depIdx));
13517                 fn = 'paintFormXObjectEnd';
13518                 args = [];
13519               } else if ('Image' == type.name) {
13520                 buildPaintImageXObject(xobj, false);
13521               } else {
13522                 error('Unhandled XObject subtype ' + type.name);
13523               }
13524             }
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);
13529           }
13531           switch (fn) {
13532             // Parse the ColorSpace data to a raw format.
13533             case 'setFillColorSpace':
13534             case 'setStrokeColorSpace':
13535               args = [ColorSpace.parseToIR(args[0], xref, resources)];
13536               break;
13537             case 'shadingFill':
13538               var shadingRes = res.get('Shading');
13539               if (!shadingRes)
13540                 error('No shading resource found');
13542               var shading = shadingRes.get(args[0].name);
13543               if (!shading)
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';
13550               break;
13551             case 'setGState':
13552               var dictName = args[0];
13553               var extGState = resources.get('ExtGState');
13555               if (!isDict(extGState) || !extGState.has(dictName.name))
13556                 break;
13558               var gsState = extGState.get(dictName.name);
13560               // This array holds the converted/processed state data.
13561               var gsStateObj = [];
13563               gsState.forEach(
13564                 function canvasGraphicsSetGStateForEach(key, value) {
13565                   switch (key) {
13566                     case 'Type':
13567                       break;
13568                     case 'LW':
13569                     case 'LC':
13570                     case 'LJ':
13571                     case 'ML':
13572                     case 'D':
13573                     case 'RI':
13574                     case 'FL':
13575                     case 'CA':
13576                     case 'ca':
13577                       gsStateObj.push([key, value]);
13578                       break;
13579                     case 'Font':
13580                       gsStateObj.push([
13581                         'Font',
13582                         handleSetFont(null, value[0]),
13583                         value[1]
13584                       ]);
13585                       break;
13586                     case 'OP':
13587                     case 'op':
13588                     case 'OPM':
13589                     case 'BG':
13590                     case 'BG2':
13591                     case 'UCR':
13592                     case 'UCR2':
13593                     case 'TR':
13594                     case 'TR2':
13595                     case 'HT':
13596                     case 'SM':
13597                     case 'SA':
13598                     case 'BM':
13599                     case 'SMask':
13600                     case 'AIS':
13601                     case 'TK':
13602                       TODO('graphic state operator ' + key);
13603                       break;
13604                     default:
13605                       warn('Unknown graphic state operator ' + key);
13606                       break;
13607                   }
13608                 }
13609               );
13610               args = [gsStateObj];
13611               break;
13612           } // switch
13614           fnArray.push(fn);
13615           argsArray.push(args);
13616           args = [];
13617         } else if (obj != null) {
13618           assertWellFormed(args.length <= 33, 'Too many arguments');
13619           args.push(obj instanceof Dict ? obj.getAll() : obj);
13620         }
13621       }
13623       return queue;
13624     },
13626     extractDataStructures: function
13627       partialEvaluatorExtractDataStructures(dict, baseDict,
13628                                             xref, properties) {
13629       // 9.10.2
13630       var toUnicode = dict.get('ToUnicode') ||
13631         baseDict.get('ToUnicode');
13632       if (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')
13643           };
13644         }
13646         var cidToGidMap = dict.get('CIDToGIDMap');
13647         if (isStream(cidToGidMap))
13648           properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
13649       }
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');
13656       if (hasEncoding) {
13657         var encoding = dict.get('Encoding');
13658         if (isDict(encoding)) {
13659           var baseName = encoding.get('BaseEncoding');
13660           if (baseName)
13661             baseEncoding = Encodings[baseName.name];
13662           else
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');
13668             var index = 0;
13669             for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
13670               var data = diffEncoding[j];
13671               if (isNum(data))
13672                 index = data;
13673               else
13674                 differences[index++] = data.name;
13675             }
13676           }
13677         } else if (isName(encoding)) {
13678           baseEncoding = Encodings[encoding.name];
13679         } else {
13680           error('Encoding is not a Name nor a Dict');
13681         }
13682       }
13684       properties.differences = differences;
13685       properties.baseEncoding = baseEncoding;
13686       properties.hasEncoding = hasEncoding;
13687     },
13689     readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref,
13690                                                            properties) {
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)) {
13698         var tokens = [];
13699         var token = '';
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) {
13707             switch (token) {
13708               case 'usecmap':
13709                 error('usecmap is not implemented');
13710                 break;
13712               case 'beginbfchar':
13713               case 'beginbfrange':
13714               case 'begincidchar':
13715               case 'begincidrange':
13716                 token = '';
13717                 tokens = [];
13718                 break;
13720               case 'endcidrange':
13721               case 'endbfrange':
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
13728                     code = startRange;
13729                   }
13730                   if (isArray(code)) {
13731                     var codeindex = 0;
13732                     while (startRange <= endRange) {
13733                       charToUnicode[startRange] = code[codeindex++];
13734                       ++startRange;
13735                     }
13736                   } else {
13737                     while (startRange <= endRange) {
13738                       charToUnicode[startRange] = code++;
13739                       ++startRange;
13740                     }
13741                   }
13742                 }
13743                 break;
13745               case 'endcidchar':
13746               case 'endbfchar':
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;
13751                 }
13752                 break;
13754               case '':
13755                 break;
13757               default:
13758                 if (token[0] >= '0' && token[0] <= '9')
13759                   token = parseInt(token, 10); // a number
13760                 tokens.push(token);
13761                 token = '';
13762             }
13763             switch (octet) {
13764               case 0x5B:
13765                 // begin list parsing
13766                 tokens.push(beginArrayToken);
13767                 break;
13768               case 0x5D:
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);
13775                 break;
13776             }
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));
13786                 token = '';
13787               } else {
13788                 // parsing hex UTF-16BE numbers
13789                 var str = [];
13790                 for (var k = 0, kk = token.length; k < kk; k += 4) {
13791                   var b = parseInt(token.substr(k, 4), 16);
13792                   if (b <= 0x10) {
13793                     k += 4;
13794                     b = (b << 16) | parseInt(token.substr(k, 4), 16);
13795                     b -= 0x10000;
13796                     str.push(0xD800 | (b >> 10));
13797                     str.push(0xDC00 | (b & 0x3FF));
13798                     break;
13799                   }
13800                   str.push(b);
13801                 }
13802                 tokens.push(String.fromCharCode.apply(String, str));
13803                 token = '';
13804               }
13805             }
13806           } else {
13807             token += String.fromCharCode(octet);
13808           }
13809         }
13810       }
13811       return charToUnicode;
13812     },
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
13818       var result = [];
13819       for (var j = 0, jj = glyphsData.length; j < jj; j++) {
13820         var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
13821         if (glyphID == 0)
13822           continue;
13824         var code = j >> 1;
13825         result[code] = glyphID;
13826       }
13827       return result;
13828     },
13830     extractWidths: function PartialEvaluator_extractWidths(dict,
13831                                                    xref,
13832                                                    descriptor,
13833                                                    properties) {
13834       var glyphsWidths = [];
13835       var defaultWidth = 0;
13836       if (properties.composite) {
13837         defaultWidth = dict.get('DW') || 1000;
13839         var widths = dict.get('W');
13840         if (widths) {
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];
13847               start = 0;
13848             } else if (start) {
13849               var width = widths[++i];
13850               for (var j = start; j <= code; j++)
13851                 glyphsWidths[j] = width;
13852               start = 0;
13853             } else {
13854               start = code;
13855             }
13856           }
13857         }
13858       } else {
13859         var firstChar = properties.firstChar;
13860         var widths = dict.get('Widths');
13861         if (widths) {
13862           var j = firstChar;
13863           for (var i = 0, ii = widths.length; i < ii; i++)
13864             glyphsWidths[j++] = widths[i];
13865           defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
13866         } else {
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;
13874           }
13875         }
13876       }
13878       properties.defaultWidth = defaultWidth;
13879       properties.widths = glyphsWidths;
13880     },
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;
13887       } else {
13888         widths = glyphWidths;
13889       }
13891       return {
13892         defaultWidth: defaultWidth,
13893         widths: widths
13894       };
13895     },
13897     translateFont: function PartialEvaluator_translateFont(dict,
13898                                                            xref,
13899                                                            resources,
13900                                                            dependency) {
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');
13912         if (!df)
13913           return null;
13915         dict = isArray(df) ? xref.fetchIfRef(df[0]) : df;
13917         type = dict.get('Subtype');
13918         assertWellFormed(isName(type), 'invalid font Subtype');
13919         composite = true;
13920       }
13921       var maxCharIndex = composite ? 0xFFFF : 0xFF;
13923       var descriptor = dict.get('FontDescriptor');
13924       if (!descriptor) {
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));
13930         } else {
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))
13936             return null;
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);
13949           var properties = {
13950             type: type.name,
13951             widths: metrics.widths,
13952             defaultWidth: metrics.defaultWidth,
13953             flags: flags,
13954             firstChar: 0,
13955             lastChar: maxCharIndex
13956           };
13957           this.extractDataStructures(dict, dict, xref, properties);
13959           return {
13960             name: baseFontName,
13961             dict: baseDict,
13962             properties: properties
13963           };
13964         }
13965       }
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
13971       // a variant.
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');
13981       if (fontFile) {
13982         if (fontFile.dict) {
13983           var subtype = fontFile.dict.get('Subtype');
13984           if (subtype)
13985             subtype = subtype.name;
13987           var length1 = fontFile.dict.get('Length1');
13989           var length2 = fontFile.dict.get('Length2');
13990         }
13991       }
13993       var properties = {
13994         type: type.name,
13995         subtype: subtype,
13996         file: fontFile,
13997         length1: length1,
13998         length2: length2,
13999         composite: composite,
14000         wideChars: composite,
14001         fixedPitch: false,
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'),
14012         coded: false
14013       };
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);
14026         }
14027       }
14029       return {
14030         name: fontName.name,
14031         dict: baseDict,
14032         file: fontFile,
14033         properties: properties
14034       };
14035     }
14036   };
14038   return PartialEvaluator;
14039 })();
14041 var EvalState = (function EvalStateClosure() {
14042   function EvalState() {
14043     // Are soft masks and alpha values shapes or opacities?
14044     this.alphaIsShape = false;
14045     this.fontSize = 0;
14046     this.textMatrix = IDENTITY_MATRIX;
14047     this.leading = 0;
14048     // Start of text line (in text coordinates)
14049     this.lineX = 0;
14050     this.lineY = 0;
14051     // Character and word spacing
14052     this.charSpacing = 0;
14053     this.wordSpacing = 0;
14054     this.textHScale = 1;
14055     // Color spaces
14056     this.fillColorSpace = null;
14057     this.strokeColorSpace = null;
14058   }
14059   EvalState.prototype = {
14060   };
14061   return EvalState;
14062 })();
14065 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
14066 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
14068 'use strict';
14071  * Maximum time to wait for a font to be loaded by font-face rules.
14072  */
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;
14087 var FontFlags = {
14088   FixedPitch: 1,
14089   Serif: 2,
14090   Symbolic: 4,
14091   Script: 8,
14092   Nonsymbolic: 32,
14093   Italic: 64,
14094   AllCap: 65536,
14095   SmallCap: 131072,
14096   ForceBold: 262144
14099 var Encodings = {
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',
14140     'Ydieresissmall'],
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',
14273     'ydieresis'],
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',
14309     'bracerightbt'],
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.
14339  */
14340 var stdFontMap = {
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.
14394  */
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'
14406 var serifFonts = {
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) {
14461   switch (code) {
14462     case 0xF8E9: // copyrightsans
14463     case 0xF6D9: // copyrightserif
14464       return 0x00A9; // copyright
14465     default:
14466       return code;
14467   }
14470 var FontLoader = {
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) {
14478           return false;
14479         }
14480       }
14482       PdfJS_window.document.documentElement.removeEventListener(
14483         'pdfjsFontLoad', checkFontsLoaded, false);
14485       callback();
14486       return true;
14487     }
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) {
14498         continue;
14499       }
14500       font.attached = true;
14502       fontsToLoad.push(font);
14504       var str = '';
14505       var data = font.data;
14506       if (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);
14512         if (rule) {
14513           rules.push(rule);
14514           names.push(font.loadedName);
14515         }
14516       }
14517     }
14519     this.listeningForFontLoad = false;
14520     if (!isWorker && rules.length) {
14521       FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad);
14522     }
14524     if (!checkFontsLoaded()) {
14525       PdfJS_window.document.documentElement.addEventListener(
14526         'pdfjsFontLoad', checkFontsLoaded, false);
14527     }
14528   },
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,
14535                                                                 fonts) {
14536       /** Hack begin */
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.
14540       //
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.
14555       //
14556       // The postMessage() hackery was added to work around chrome bug
14557       // 82402.
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.
14565         return;
14566       }
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;');
14573       var html = '';
14574       for (var i = 0, ii = names.length; i < ii; ++i) {
14575         html += '<span style="font-family:' + names[i] + '">Hi</span>';
14576       }
14577       div.innerHTML = html;
14578       PdfJS_window.document.body.appendChild(div);
14580       if (!this.listeningForFontLoad) {
14581         PdfJS_window.window.addEventListener(
14582           'message',
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;
14588             }
14589             var evt = PdfJS_window.document.createEvent('Events');
14590             evt.initEvent('pdfjsFontLoad', true, false);
14591             PdfJS_window.document.documentElement.dispatchEvent(evt);
14592           },
14593           false);
14594         this.listeningForFontLoad = true;
14595       }
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) {
14602         src += rules[i];
14603       }
14604       src += '</style>';
14605       src += '<script type="application/javascript">';
14606       var fontNamesArray = '';
14607       for (var i = 0, ii = names.length; i < ii; ++i) {
14608         fontNamesArray += '"' + names[i] + '", ';
14609       }
14610       src += '  var fontNames=[' + fontNamesArray + '];\n';
14611       src += '  PdfJS_window.window.onload = function fontLoaderOnload() {\n';
14612       src += '    parent.postMessage(JSON.stringify(fontNames), "*");\n';
14613       src += '  }';
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>';
14618       }
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);
14627       /** Hack end */
14628   }
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)
14799       return i;
14800   }
14801   return -1;
14804 function isRTLRangeFor(value) {
14805   var range = UnicodeRanges[13];
14806   if (value >= range.begin && value < range.end)
14807     return true;
14808   range = UnicodeRanges[11];
14809   if (value >= range.begin && value < range.end)
14810     return true;
14811   return false;
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();
14827  */
14828 var Font = (function FontClosure() {
14829   function Font(name, file, properties) {
14830     this.name = name;
14831     this.coded = properties.coded;
14832     this.charProcOperatorList = properties.charProcOperatorList;
14833     this.sizes = [];
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;
14842     this.type = 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;
14849       return;
14850     }
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;
14863       return;
14864     }
14866     // Trying to fix encoding using glyph CIDSystemInfo.
14867     this.loadCidToUnicode(properties);
14869     if (properties.toUnicode)
14870       this.toUnicode = properties.toUnicode;
14871     else
14872       this.rebuildToUnicode(properties);
14874     this.toFontChar = this.buildToFontChar(this.toUnicode);
14876     if (!file) {
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;
14894       return;
14895     }
14897     var data;
14898     switch (type) {
14899       case 'Type1':
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);
14909         break;
14911       case 'TrueType':
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);
14918         break;
14920       default:
14921         warn('Font ' + properties.type + ' is not supported');
14922         break;
14923     }
14925     this.data = data;
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;
14932   };
14934   var numFonts = 0;
14935   function getUniqueName() {
14936     return 'pdfFont' + numFonts++;
14937   }
14939   function stringToArray(str) {
14940     var array = [];
14941     for (var i = 0, ii = str.length; i < ii; ++i)
14942       array[i] = str.charCodeAt(i);
14944     return array;
14945   };
14947   function arrayToString(arr) {
14948     var str = '';
14949     for (var i = 0, ii = arr.length; i < ii; ++i)
14950       str += String.fromCharCode(arr[i]);
14952     return str;
14953   };
14955   function int16(bytes) {
14956     return (bytes[0] << 8) + (bytes[1] & 0xff);
14957   };
14959   function int32(bytes) {
14960     return (bytes[0] << 24) + (bytes[1] << 16) +
14961            (bytes[2] << 8) + (bytes[3] & 0xff);
14962   };
14964   function getMaxPower2(number) {
14965     var maxPower = 0;
14966     var value = number;
14967     while (value >= 2) {
14968       value /= 2;
14969       maxPower++;
14970     }
14972     value = 2;
14973     for (var i = 1; i < maxPower; i++)
14974       value *= 2;
14975     return value;
14976   };
14978   function string16(value) {
14979     return String.fromCharCode((value >> 8) & 0xff) +
14980            String.fromCharCode(value & 0xff);
14981   };
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);
14988   };
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);
14995   };
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)
15003     var header = sfnt;
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;
15021   };
15023   function createTableEntry(file, tag, data) {
15024     // offset
15025     var offset = file.virtualOffset;
15027     // length
15028     var length = data.length;
15030     // Per spec tables must be 4-bytes align so add padding as needed
15031     while (data.length & 3)
15032       data.push(0x00);
15034     while (file.virtualOffset & 3)
15035       file.virtualOffset++;
15037     // checksum
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;
15047   };
15049   function getRanges(glyphs) {
15050     // Array.sort() sorts by characters, not numerically, so convert to an
15051     // array of characters.
15052     var codes = [];
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;
15058     });
15060     // Split the sorted codes into ranges.
15061     var ranges = [];
15062     for (var n = 0; n < length; ) {
15063       var start = codes[n].unicode;
15064       var codeIndices = [codes[n].code];
15065       ++n;
15066       var end = start;
15067       while (n < length && end + 1 == codes[n].unicode) {
15068         codeIndices.push(codes[n].code);
15069         ++end;
15070         ++n;
15071       }
15072       ranges.push([start, end, codeIndices]);
15073     }
15075     return ranges;
15076   };
15078   function createCMapTable(glyphs, deltas) {
15079     var ranges = getRanges(glyphs);
15081     var numTables = 1;
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 = '';
15096     var endCount = '';
15097     var idDeltas = '';
15098     var idRangeOffsets = '';
15099     var glyphsIds = '';
15100     var bias = 0;
15102     if (deltas) {
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]]);
15118       }
15119     } else {
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);
15130       }
15131     }
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
15149                          format314);
15150   };
15152   function createOS2Table(properties, charstrings, override) {
15153     override = override || {
15154       unitsPerEm: 0,
15155       yMax: 0,
15156       yMin: 0,
15157       ascent: 0,
15158       descent: 0
15159     };
15161     var ulUnicodeRange1 = 0;
15162     var ulUnicodeRange2 = 0;
15163     var ulUnicodeRange3 = 0;
15164     var ulUnicodeRange4 = 0;
15166     var firstCharIndex = null;
15167     var lastCharIndex = 0;
15169     if (charstrings) {
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;
15186         } else {
15187           error('Unicode ranges Bits > 123 are reserved for internal usage');
15188         }
15189       }
15190     } else {
15191       // TODO
15192       firstCharIndex = 0;
15193       lastCharIndex = 255;
15194     }
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;
15212     }
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
15230            '\x00\x00\x06' +
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
15254   };
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
15267   };
15269   function createNameTable(name) {
15270     var strings = [
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
15281     ];
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);
15293     }
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;
15301     var nameTable =
15302       '\x00\x00' +                           // format
15303       string16(namesRecordCount) +           // Number of names Record
15304       string16(namesRecordCount * 12 + 6);   // Storage
15306     // Build the name records field
15307     var strOffset = 0;
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++) {
15311         var str = strs[j];
15312         var nameRecord =
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;
15321       }
15322     }
15324     nameTable += strings.join('') + stringsUnicode.join('');
15325     return nameTable;
15326   }
15328   Font.prototype = {
15329     name: null,
15330     font: null,
15331     mimetype: null,
15332     encoding: null,
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;
15349         file.skip(offset);
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
15357         }
15359         return {
15360           tag: tag,
15361           checksum: checksum,
15362           length: length,
15363           offset: offset,
15364           data: data
15365         };
15366       };
15368       function readOpenTypeHeader(ttf) {
15369         return {
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))
15375         };
15376       };
15378       function createGlyphNameMap(glyphs, ids, properties) {
15379         var glyphNames = properties.glyphNames;
15380         if (!glyphNames) {
15381           properties.glyphNameMap = {};
15382           return;
15383         }
15384         var glyphsLength = glyphs.length;
15385         var glyphNameMap = {};
15386         var encoding = [];
15387         for (var i = 0; i < glyphsLength; ++i) {
15388           var glyphName = glyphNames[ids[i]];
15389           if (!glyphName)
15390             continue;
15391           var unicode = glyphs[i].unicode;
15392           glyphNameMap[glyphName] = unicode;
15393           var code = glyphs[i].code;
15394           encoding[code] = glyphName;
15395         }
15396         properties.glyphNameMap = glyphNameMap;
15397         if (!properties.hasEncoding)
15398           properties.baseEncoding = encoding;
15399       }
15401       function readCMapTable(cmap, font) {
15402         var start = (font.start ? font.start : 0) + cmap.offset;
15403         font.pos = start;
15405         var version = int16(font.getBytes(2));
15406         var numRecords = int16(font.getBytes(2));
15408         var records = [];
15409         for (var i = 0; i < numRecords; i++) {
15410           records.push({
15411             platformID: int16(font.getBytes(2)),
15412             encodingID: int16(font.getBytes(2)),
15413             offset: int32(font.getBytes(4))
15414           });
15415         }
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);
15421         });
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))
15435                 continue;
15436           tables.push(current);
15437         }
15439         var missing = numRecords - tables.length;
15440         if (missing) {
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);
15449           }
15451           for (var i = 0, ii = data.length; i < ii; i++)
15452             cmap.data[i] = data.charCodeAt(i);
15453         }
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));
15463           if (format == 0) {
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
15467             // CMap.
15468             var glyphs = [];
15469             var ids = [];
15470             for (var j = 0; j < 256; j++) {
15471               var index = font.getByte();
15472               if (index) {
15473                 glyphs.push({ unicode: j, code: j });
15474                 ids.push(index);
15475               }
15476             }
15477             return {
15478               glyphs: glyphs,
15479               ids: ids,
15480               hasShortCmap: true
15481             };
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)) });
15490             }
15491             font.getBytes(2);
15492             for (segIndex = 0; segIndex < segCount; segIndex++) {
15493               segments[segIndex].start = int16(font.getBytes(2));
15494             }
15496             for (segIndex = 0; segIndex < segCount; segIndex++) {
15497               segments[segIndex].delta = int16(font.getBytes(2));
15498             }
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;
15506                 continue;
15507               }
15509               var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
15510               segment.offsetIndex = offsetIndex;
15511               offsetsCount = Math.max(offsetsCount, offsetIndex +
15512                 segment.end - segment.start + 1);
15513             }
15515             var offsets = [];
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++) {
15527                 if (j == 0xFFFF)
15528                   continue;
15530                 var glyphCode = offsetIndex < 0 ? j :
15531                   offsets[offsetIndex + j - start];
15532                 glyphCode = (glyphCode + delta) & 0xFFFF;
15533                 if (glyphCode == 0)
15534                   continue;
15536                 glyphs.push({ unicode: j, code: j });
15537                 ids.push(glyphCode);
15538               }
15539             }
15541             return {
15542               glyphs: glyphs,
15543               ids: ids
15544             };
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));
15554             var glyphs = [];
15555             var ids = [];
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);
15562             }
15564             return {
15565               glyphs: glyphs,
15566               ids: ids
15567             };
15568           }
15569         }
15570         error('Unsupported cmap table format');
15571       };
15573       function sanitizeMetrics(font, header, metrics, numGlyphs) {
15574         if (!header && !metrics)
15575           return;
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;
15585           return;
15586         }
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;
15597           var entries = '';
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);
15603         }
15604       };
15606       function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) {
15607         if (sourceEnd - sourceStart <= 12) {
15608           // glyph with data less than 12 is invalid one
15609           return 0;
15610         }
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;
15617         }
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;
15623           j += 2;
15624         }
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++];
15632           if (flag & 0xC0) {
15633             // reserved flags must be zero, rejecting
15634             return 0;
15635           }
15636           var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
15637                          ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
15638           coordinatesLength += xyLength;
15639           if (flag & 8) {
15640             var repeat = glyf[j++];
15641             i += repeat;
15642             coordinatesLength += repeat * xyLength;
15643           }
15644         }
15645         var glyphDataLength = j + coordinatesLength;
15646         if (glyphDataLength > glyf.length) {
15647           // not enough data for coordinates
15648           return 0;
15649         }
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;
15655         }
15656         // glyph data is fine
15657         dest.set(glyf, destStart);
15658         return glyf.length;
15659       }
15661       function sanitizeGlyphLocations(loca, glyf, numGlyphs,
15662                                       isGlyphLocationsLong) {
15663         var itemSize, itemDecode, itemEncode;
15664         if (isGlyphLocationsLong) {
15665           itemSize = 4;
15666           itemDecode = function fontItemDecodeLong(data, offset) {
15667             return (data[offset] << 24) | (data[offset + 1] << 16) |
15668                    (data[offset + 2] << 8) | data[offset + 3];
15669           };
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;
15675           };
15676         } else {
15677           itemSize = 2;
15678           itemDecode = function fontItemDecode(data, offset) {
15679             return (data[offset] << 9) | (data[offset + 1] << 1);
15680           };
15681           itemEncode = function fontItemEncode(data, offset, value) {
15682             data[offset] = (value >> 9) & 0xFF;
15683             data[offset + 1] = (value >> 1) & 0xFF;
15684           };
15685         }
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;
15700             continue;
15701           }
15703           var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
15704                                         newGlyfData, writeOffset);
15705           writeOffset += newLength;
15706           itemEncode(locaData, j, writeOffset);
15707           startOffset = endOffset;
15708         }
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;
15718           return;
15719         }
15721         glyf.data = newGlyfData.subarray(0, writeOffset);
15722       }
15724       function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) {
15725         var itemSize, itemDecode;
15726         if (isGlyphLocationsLong) {
15727           itemSize = 4;
15728           itemDecode = function fontItemDecodeLong(data, offset) {
15729             return (data[offset] << 24) | (data[offset + 1] << 16) |
15730                    (data[offset + 2] << 8) | data[offset + 3];
15731           };
15732         } else {
15733           itemSize = 2;
15734           itemDecode = function fontItemDecode(data, offset) {
15735             return (data[offset] << 9) | (data[offset + 1] << 1);
15736           };
15737         }
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;
15745         }
15746       }
15748       function readGlyphNameMap(post, properties) {
15749         var start = (font.start ? font.start : 0) + post.offset;
15750         font.pos = start;
15752         var length = post.length, end = start + length;
15753         var version = int32(font.getBytes(4));
15754         // skip rest to the tables
15755         font.getBytes(28);
15757         var glyphNames;
15758         switch (version) {
15759           case 0x00010000:
15760             glyphNames = MacStandardGlyphOrdering;
15761             break;
15762           case 0x00020000:
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();
15770               var string = '';
15771               for (var i = 0; i < stringLength; ++i)
15772                 string += font.getChar();
15773               customNames.push(string);
15774             }
15775             glyphNames = [];
15776             for (var i = 0; i < numGlyphs; ++i) {
15777               var j = glyphNameIndexes[i];
15778               if (j < 258) {
15779                 glyphNames.push(MacStandardGlyphOrdering[j]);
15780                 continue;
15781               }
15782               glyphNames.push(customNames[j - 258]);
15783             }
15784             break;
15785           case 0x00030000:
15786             break;
15787           default:
15788             warn('Unknown/unsupported post table version ' + version);
15789             break;
15790         }
15791         properties.glyphNames = glyphNames;
15792       }
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)
15799           return false;
15801         return true;
15802       }
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;
15812       var tables = [];
15813       for (var i = 0; i < numTables; i++) {
15814         var table = readTableEntry(font);
15815         var index = requiredTables.indexOf(table.tag);
15816         if (index != -1) {
15817           if (table.tag == 'cmap')
15818             cmap = table;
15819           else if (table.tag == 'post')
15820             post = table;
15821           else if (table.tag == 'maxp')
15822             maxp = table;
15823           else if (table.tag == 'hhea')
15824             hhea = table;
15825           else if (table.tag == 'hmtx')
15826             hmtx = table;
15827           else if (table.tag == 'head')
15828             head = table;
15829           else if (table.tag == 'OS/2')
15830             os2 = table;
15832           requiredTables.splice(index, 1);
15833         } else {
15834           if (table.tag == 'vmtx')
15835             vmtx = table;
15836           else if (table.tag == 'vhea')
15837             vhea = table;
15838           else if (table.tag == 'loca')
15839             loca = table;
15840           else if (table.tag == 'glyf')
15841             glyf = table;
15842         }
15843         tables.push(table);
15844       }
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;
15851       var ttf = {
15852         file: '',
15853         virtualOffset: numTables * (4 * 4)
15854       };
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);
15863         os2 = null;
15864       }
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);
15878       }
15880       var emptyGlyphIds = [];
15881       if (glyf)
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;
15889       }
15891       // The 'post' table has glyphs names.
15892       if (post) {
15893         readGlyphNameMap(post, properties);
15894       }
15896       var glyphs, ids;
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
15906         if (!cmap) {
15907           cmap = {
15908             tag: 'cmap',
15909             data: null
15910           };
15911           tables.push(cmap);
15912         }
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];
15919             if (gid)
15920               gidToCidMap[gid] = j;
15921           }
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++;
15927           }
15928         }
15930         glyphs = [];
15931         ids = [];
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);
15941             continue;
15942           }
15943           usedUnicodes[unicode] = true;
15944           glyphs.push({ unicode: unicode, code: cid });
15945           ids.push(i);
15946         }
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)
15954             unusedUnicode++;
15955           if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea)
15956             break;
15957           var unicode = unusedUnicode++;
15958           this.toFontChar[cid] = unicode;
15959           usedUnicodes[unicode] = true;
15960           glyphs.push({ unicode: unicode, code: cid });
15961           ids.push(i);
15962         }
15963       } else {
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
15974           // glyph id.
15975           for (var i = 0, ii = ids.length; i < ii; i++)
15976             ids[i] = i;
15977         }
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;
15989               break;
15990             }
15991           }
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);
16000                 continue;
16001               }
16002               glyphs[i].unicode = unicode;
16003               usedUnicodes[unicode] = true;
16004             }
16005             for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) {
16006               var i = unassignedUnicodeItems[j];
16007               while (unusedUnicode in usedUnicodes)
16008                 unusedUnicode++;
16009               var cid = i + 1;
16010               // override only if unicode mapping is not specified
16011               if (!(cid in toFontChar))
16012                 toFontChar[cid] = unusedUnicode;
16013               glyphs[i].unicode = unusedUnicode++;
16014             }
16015             this.useToFontChar = true;
16016           }
16017         }
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))
16024             continue;
16025           ids.splice(i, 1);
16026           glyphs.splice(i, 1);
16027           glyphsRemoved++;
16028         }
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);
16037           }
16038           // high byte must be the same for min and max unicodes
16039           if ((maxUnicode & 0xFF00) != (minUnicode & 0xFF00))
16040             this.isSymbolicFont = false;
16041         }
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;
16049         }
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;
16059             var gid = ids[i];
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)
16067                 continue;
16069               usedUnicodes[unicode] = true;
16070               glyphs.push({
16071                 unicode: unicode,
16072                 code: glyphs[i].code
16073               });
16074               ids.push(gid);
16075               toFontChar[code] = unicode;
16076             }
16077           }
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;
16091             var gid = ids[i];
16093             var glyphName = glyphNames[gid];
16094             if (!glyphName) {
16095               glyphName = differences[code] || encoding[code];
16096               changeCode = true;
16097             }
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;
16104               if (changeCode)
16105                 toFontChar[code] = unicode;
16106               delete reverseMap[code];
16107             }
16108           }
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++;
16114               continue;
16115             }
16116             glyphs[index].unicode = unicode;
16117             reverseMap[unicode] = index;
16118           }
16119           this.useToFontChar = true;
16120         }
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;
16128           }
16129           this.useToFontChar = true;
16130         }
16132         createGlyphNameMap(glyphs, ids, properties);
16133         this.glyphNameMap = properties.glyphNameMap;
16134       }
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;
16141       }
16142       this.unicodeIsEnabled = unicodeIsEnabled;
16144       if (!os2) {
16145         // extract some more font properties from the OpenType head and
16146         // hhea tables; yMin and descent value are always negative
16147         var override = {
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
16153         };
16155         tables.push({
16156           tag: 'OS/2',
16157           data: stringToArray(createOS2Table(properties, glyphs, override))
16158         });
16159       }
16161       // Rewrite the 'post' table if needed
16162       if (requiredTables.indexOf('post') != -1) {
16163         tables.push({
16164           tag: 'post',
16165           data: stringToArray(createPostTable(properties))
16166         });
16167       }
16169       // Rewrite the 'name' table if needed
16170       if (requiredTables.indexOf('name') != -1) {
16171         tables.push({
16172           tag: 'name',
16173           data: stringToArray(createNameTable(this.name))
16174         });
16175       }
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);
16180       });
16182       // rewrite the tables but tweak offsets
16183       for (var i = 0, ii = tables.length; i < ii; i++) {
16184         var table = tables[i];
16185         var data = [];
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);
16191       }
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);
16202       }
16204       return stringToArray(ttf.file);
16205     },
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])
16211             return false;
16212         }
16213         return true;
16214       }
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
16219       // table
16220       var kRequiredTablesCount = 9;
16222       var otf = {
16223         file: '',
16224         virtualOffset: 9 * (4 * 4)
16225       };
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;
16236       }
16237       this.glyphNameMap = glyphNameMap;
16239       if (!properties.hasEncoding && (properties.subtype == 'Type1C' ||
16240           properties.subtype == 'CIDFontType0C')) {
16241         var encoding = [];
16242         for (var i = 0; i < charstrings.length; ++i) {
16243           var charstring = charstrings[i];
16244           encoding[charstring.code] = charstring.glyph;
16245         }
16246         properties.baseEncoding = encoding;
16247       }
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;
16253         }
16254         this.toFontChar = toFontChar;
16255       }
16257       var fields = {
16258         // PostScript Font Program
16259         'CFF ': font.data,
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),
16268         // Font header
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
16288         })(),
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
16311         })(),
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);
16320           }
16321           return stringToArray(hmtx);
16322         })(),
16324         // Maximum profile
16325         'maxp': (function fontFieldsMaxp() {
16326           return stringToArray(
16327               '\x00\x00\x50\x00' + // Version number
16328              string16(charstrings.length + 1)); // Num of glyphs
16329         })(),
16331         // Naming tables
16332         'name': stringToArray(createNameTable(fontName)),
16334         // PostScript informations
16335         'post': stringToArray(createPostTable(properties))
16336       };
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);
16344       }
16346       return stringToArray(otf.file);
16347     },
16349     buildToFontChar: function Font_buildToFontChar(toUnicode) {
16350       var result = [];
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++ :
16355           unicode;
16356         if (typeof unicode !== 'undefined')
16357           result[i] = fontCharCode;
16358       }
16359       return result;
16360     },
16362     rebuildToUnicode: function Font_rebuildToUnicode(properties) {
16363       var firstChar = properties.firstChar, lastChar = properties.lastChar;
16364       var map = [];
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
16369           var cid = i;
16370           map[i] = isIdentityMap ? cid : this.cidToUnicode[cid];
16371         }
16372       } else {
16373         for (var i = firstChar, ii = lastChar; i <= ii; i++) {
16374           var glyph = properties.differences[i];
16375           if (!glyph)
16376             glyph = properties.baseEncoding[i];
16377           if (!!glyph && (glyph in GlyphsUnicode))
16378             map[i] = GlyphsUnicode[glyph];
16379         }
16380       }
16381       this.toUnicode = map;
16382     },
16384     loadCidToUnicode: function Font_loadCidToUnicode(properties) {
16385       if (!properties.cidSystemInfo)
16386         return;
16388       var cidToUnicodeMap = [], unicodeToCIDMap = [];
16389       this.cidToUnicode = cidToUnicodeMap;
16390       this.unicodeToCID = unicodeToCIDMap;
16392       var cidSystemInfo = properties.cidSystemInfo;
16393       var cidToUnicode;
16394       if (cidSystemInfo) {
16395         cidToUnicode = CIDToUnicodeMaps[
16396           cidSystemInfo.registry + '-' + cidSystemInfo.ordering];
16397       }
16399       if (!cidToUnicode)
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;
16410           }
16411           cid++;
16412         } else if (typeof unicode === 'object') {
16413           var fillLength = unicode.f;
16414           if (fillLength) {
16415             k = unicode.c;
16416             for (j = 0; j < fillLength; ++j) {
16417               cidToUnicodeMap[cid] = k;
16418               unicodeToCIDMap[k] = cid;
16419               cid++;
16420               k++;
16421             }
16422           } else
16423             cid += unicode.s;
16424         } else if (unicode) {
16425           cidToUnicodeMap[cid] = unicode;
16426           unicodeToCIDMap[unicode] = cid;
16427           cid++;
16428         } else
16429           cid++;
16430       }
16431     },
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(
16443         styleElement);
16445       var styleSheet = styleElement.sheet;
16446       styleSheet.insertRule(rule, styleSheet.cssRules.length);
16448       if (PDFJS.pdfBug && FontInspector.enabled)
16449         FontInspector.fontAdded(this, url);
16451       return rule;
16452     },
16454     get spaceWidth() {
16455       // trying to estimate space character width
16456       var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
16457       var width;
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];
16463           break;
16464         }
16465         var glyphUnicode = GlyphsUnicode[glyphName];
16466         // finding the charcode via unicodeToCID map
16467         var charcode = 0;
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];
16478         if (width)
16479           break; // the non-zero width found
16480       }
16481       width = (width || this.defaultWidth) * this.widthMultiplier;
16482       return shadow(this, 'spaceWidth', width);
16483     },
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);
16495             break;
16496           }
16497           fontCharCode = this.toFontChar[charcode] || charcode;
16498           break;
16499         case 'CIDFontType2':
16500           if (this.noUnicodeAdaptation) {
16501             width = this.widths[this.unicodeToCID[charcode] || charcode];
16502             fontCharCode = mapPrivateUseChars(charcode);
16503             break;
16504           }
16505           fontCharCode = this.toFontChar[charcode] || charcode;
16506           break;
16507         case 'Type1':
16508           var glyphName = this.differences[charcode] || this.encoding[charcode];
16509           if (!isNum(width))
16510             width = this.widths[glyphName];
16511           if (this.noUnicodeAdaptation) {
16512             fontCharCode = mapPrivateUseChars(GlyphsUnicode[glyphName] ||
16513               charcode);
16514             break;
16515           }
16516           fontCharCode = this.glyphNameMap[glyphName] ||
16517             GlyphsUnicode[glyphName] || charcode;
16518           break;
16519         case 'Type3':
16520           var glyphName = this.differences[charcode] || this.encoding[charcode];
16521           operatorList = this.charProcOperatorList[glyphName];
16522           fontCharCode = charcode;
16523           break;
16524         case 'TrueType':
16525           if (this.useToFontChar) {
16526             fontCharCode = this.toFontChar[charcode] || charcode;
16527             break;
16528           }
16529           var glyphName = this.differences[charcode] || this.encoding[charcode];
16530           if (!glyphName)
16531             glyphName = Encodings.StandardEncoding[charcode];
16532           if (!isNum(width))
16533             width = this.widths[glyphName];
16534           if (this.noUnicodeAdaptation) {
16535             fontCharCode = GlyphsUnicode[glyphName] || charcode;
16536             break;
16537           }
16538           if (!this.hasEncoding || this.isSymbolicFont) {
16539             fontCharCode = this.useToFontChar ? this.toFontChar[charcode] :
16540               charcode;
16541             break;
16542           }
16544           // MacRoman encoding address by re-encoding the cmap table
16545           fontCharCode = glyphName in this.glyphNameMap ?
16546             this.glyphNameMap[glyphName] : GlyphsUnicode[glyphName];
16547           break;
16548         default:
16549           warn('Unsupported font type: ' + this.type);
16550           break;
16551       }
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;
16562       return {
16563         fontChar: String.fromCharCode(fontCharCode),
16564         unicode: unicodeChars,
16565         width: width,
16566         disabled: disabled,
16567         operatorList: operatorList
16568       };
16569     },
16571     charsToGlyphs: function Font_charsToGlyphs(chars) {
16572       var charsCache = this.charsCache;
16573       var glyphs;
16575       // if we translated this string before, just grab it from the cache
16576       if (charsCache) {
16577         glyphs = charsCache[chars];
16578         if (glyphs)
16579           return glyphs;
16580       }
16582       // lazily create the translation cache
16583       if (!charsCache)
16584         charsCache = this.charsCache = Object.create(null);
16586       glyphs = [];
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)
16601             glyphs.push(null);
16602         }
16603       }
16604       else {
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)
16610             glyphs.push(null);
16611         }
16612       }
16614       // Enter the translated string into the cache
16615       return (charsCache[chars] = glyphs);
16616     }
16617   };
16619   return Font;
16620 })();
16623  * Type1Parser encapsulate the needed code for parsing a Type1 font
16624  * program. Some of its logic depends on the Type2 charstrings
16625  * structure.
16626  */
16627 var Type1Parser = function type1Parser() {
16628   /*
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.
16632    */
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 = [];
16640     var value = '';
16641     var count = stream.length;
16642     for (var i = 0; i < count; i++) {
16643       value = stream[i];
16644       decryptedString[i] = value ^ (r >> 8);
16645       r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
16646     }
16647     return decryptedString.slice(discardNumber);
16648   }
16650   /*
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.
16655    *
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.
16659    *
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.
16663    *
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
16667    *
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
16671    *
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.
16676    *
16677    *
16678    * CharString Command Encoding:
16679    *  CharStrings commands are encoded in 1 or 2 bytes.
16680    *
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
16686    * the charStrings.
16687    */
16688   var charStringDictionary = {
16689     '1': 'hstem',
16690     '3': 'vstem',
16691     '4': 'vmoveto',
16692     '5': 'rlineto',
16693     '6': 'hlineto',
16694     '7': 'vlineto',
16695     '8': 'rrcurveto',
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
16701     '10': 'callsubr',
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.
16708     '11': 'return',
16710     '12': {
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.
16718       '1': 'vstem',
16719       '2': 'hstem',
16721       // Type1 only command with command not (yet) built-in ,throw an error
16722       '6': -1, // seac
16723       '7': -1, // sbw
16725       '11': 'sub',
16726       '12': 'div',
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',
16733       '17': 'pop',
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
16741     },
16742     '13': 'hsbw',
16743     '14': 'endchar',
16744     '21': 'rmoveto',
16745     '22': 'hmoveto',
16746     '30': 'vhcurveto',
16747     '31': 'hvcurveto'
16748   };
16750   var kEscapeCommand = 12;
16752   function decodeCharString(array) {
16753     var charstring = [];
16754     var lsb = 0;
16755     var width = 0;
16756     var flexState = 0;
16758     var value = '';
16759     var count = array.length;
16760     for (var i = 0; i < count; i++) {
16761       value = array[i];
16763       if (value < 32) {
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.
16778             if (index < 3) {
16779               continue;
16780             }
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
16785             if (index == 3) {
16786               charstring.push(3);
16787               i++;
16788               continue;
16789             }
16790           } else if (escape == 17 || escape == 33) {
16791             // pop or setcurrentpoint commands can be ignored
16792             // since we are not doing callothersubr
16793             continue;
16794           } else if (!kHintingEnabled && (escape == 1 || escape == 2)) {
16795             charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop');
16796             continue;
16797           }
16799           command = charStringDictionary['12'][escape];
16800         } else {
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);
16815             } else {
16816               error('Unsupported hsbw format: ' + charstring);
16817             }
16819             charstring.push(lsb, 'hmoveto');
16820             continue;
16821           } else if (value == 10) { // callsubr
16822             if (charstring[charstring.length - 1] < 3) { // subr #0..2
16823               var subrNumber = charstring.pop();
16824               switch (subrNumber) {
16825                 case 1:
16826                   flexState = 1; // prepare for flex coordinates
16827                   break;
16828                 case 2:
16829                   flexState = 2; // flex in progress
16830                   break;
16831                 case 0:
16832                   // type2 flex command does not need final coords
16833                   charstring.push('exch', 'drop', 'exch', 'drop');
16834                   charstring.push('flex');
16835                   flexState = 0;
16836                   break;
16837               }
16838               continue;
16839             }
16840           } else if (value == 21 && flexState > 0) {
16841             if (flexState > 1)
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');
16846             continue;
16847           }
16848           command = charStringDictionary[value];
16849         }
16851         // Some charstring commands are meaningless in Type2 and will return
16852         // a null, let's just ignored them
16853         if (!command && i < count) {
16854           continue;
16855         } else if (!command) {
16856           break;
16857         } else if (command == -1) {
16858           warn('Support for Type1 command ' + value +
16859                 ' (' + escape + ') is not implemented in charstring: ' +
16860                 charstring);
16861           if (value == 12) {
16862             // we know how to ignore only some the Type1 commands
16863             switch (escape) {
16864               case 7:
16865                 charstring.push('drop', 'drop', 'drop', 'drop');
16866                 continue;
16867               case 8:
16868                 charstring.push('drop');
16869                 continue;
16870             }
16871           }
16872         }
16874         value = command;
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;
16881       } else {
16882         value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 |
16883                 (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0;
16884       }
16886       charstring.push(value);
16887     }
16889     return { charstring: charstring, width: width, lsb: lsb };
16890   }
16892   /*
16893    * Returns an object containing a Subrs array and a CharStrings
16894    * array extracted from and eexec encrypted block of data
16895    */
16896   function readNumberArray(str, index) {
16897     var start = index;
16898     while (str[index++] != '[')
16899       start++;
16900     start++;
16902     var count = 0;
16903     while (str[index++] != ']')
16904       count++;
16906     str = str.substr(start, count);
16908     str = str.trim();
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);
16915     return array;
16916   }
16918   function readNumber(str, index) {
16919     while (str[index] == ' ')
16920       index++;
16922     var start = index;
16924     var count = 0;
16925     while (str[index++] != ' ')
16926       count++;
16928     return parseFloat(str.substr(start, count) || 0);
16929   }
16931   function isSeparator(c) {
16932     return c == ' ' || c == '\n' || c == '\x0d';
16933   }
16935   this.extractFontProgram = function Type1Parser_extractFontProgram(stream) {
16936     var eexec = decrypt(stream, kEexecEncryptionKey, 4);
16937     var eexecStr = '';
16938     for (var i = 0, ii = eexec.length; i < ii; i++)
16939       eexecStr += String.fromCharCode(eexec[i]);
16941     var glyphsSection = false, subrsSection = false;
16942     var program = {
16943       subrs: [],
16944       charstrings: [],
16945       properties: {
16946         'privateData': {
16947           'lenIV': 4
16948         }
16949       }
16950     };
16952     var glyph = '';
16953     var token = '';
16954     var length = 0;
16956     var c = '';
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]))
16961           ++i;
16963         var token = '';
16964         while (i < count && !isSeparator(eexecStr[i]))
16965           token += eexecStr[i++];
16967         return token;
16968       };
16969       var c = eexecStr[i];
16971       if ((glyphsSection || subrsSection) &&
16972           (token == 'RD' || token == '-|')) {
16973         i++;
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({
16981             glyph: glyph,
16982             data: str.charstring,
16983             lsb: str.lsb,
16984             width: str.width
16985           });
16986         } else {
16987           program.subrs.push(str.charstring);
16988         }
16989         i += length;
16990         token = '';
16991       } else if (isSeparator(c)) {
16992         length = parseInt(token, 10);
16993         token = '';
16994       } else {
16995         token += c;
16996         if (!glyphsSection) {
16997           switch (token) {
16998             case '/CharString':
16999               glyphsSection = true;
17000               break;
17001             case '/Subrs':
17002               ++i;
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')
17008                   break;
17009                 var index = parseInt(getToken(), 10);
17010                 if (index > j)
17011                   j = index;
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;
17023               }
17024               break;
17025             case '/BlueValues':
17026             case '/OtherBlues':
17027             case '/FamilyBlues':
17028             case '/FamilyOtherBlues':
17029             case '/StemSnapH':
17030             case '/StemSnapV':
17031               program.properties.privateData[token.substring(1)] =
17032                 readNumberArray(eexecStr, i + 1);
17033               break;
17034             case '/StdHW':
17035             case '/StdVW':
17036               program.properties.privateData[token.substring(1)] =
17037                 readNumberArray(eexecStr, i + 2)[0];
17038               break;
17039             case '/BlueShift':
17040             case '/lenIV':
17041             case '/BlueFuzz':
17042             case '/BlueScale':
17043             case '/LanguageGroup':
17044             case '/ExpansionFactor':
17045               program.properties.privateData[token.substring(1)] =
17046                 readNumber(eexecStr, i + 1);
17047               break;
17048           }
17049         } else if (c == '/') {
17050           token = glyph = '';
17051           while ((c = eexecStr[++i]) != ' ')
17052             glyph += c;
17053         }
17054       }
17055     }
17057     return program;
17058   };
17060   this.extractFontHeader = function Type1Parser_extractFontHeader(stream,
17061                                                                   properties) {
17062     var headerString = '';
17063     for (var i = 0, ii = stream.length; i < ii; i++)
17064       headerString += String.fromCharCode(stream[i]);
17066     var token = '';
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];
17074         var token = '';
17075         while (i < count && !(isSeparator(character) || character == '/')) {
17076           token += character;
17077           character = headerString[++i];
17078         }
17080         return token;
17081       };
17083       var c = headerString[i];
17084       if (isSeparator(c)) {
17085         switch (token) {
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++)
17091               matrix[j] *= 1000;
17093             // Make the angle into the right direction
17094             matrix[2] *= -1;
17096             properties.fontMatrix = matrix;
17097             break;
17098           case '/Encoding':
17099             var encodingArg = getToken();
17100             var encoding;
17101             if (!/^\d+$/.test(encodingArg)) {
17102               // encoding name is specified
17103               encoding = Encodings[encodingArg];
17104             } else {
17105               encoding = [];
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'
17116                 }
17117               }
17118             }
17119             if (!properties.hasEncoding && encoding) {
17120               properties.baseEncoding = encoding;
17121               break;
17122             }
17123             break;
17124         }
17125         token = '';
17126       } else {
17127         token += c;
17128       }
17129     }
17130   };
17134  * The CFF class takes a Type1 file and wrap it into a
17135  * 'Compact Font Format' which itself embed Type2 charstrings.
17136  */
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,
17230                                                                 isByte) {
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
17235     // offset byte.
17236     if (count == 0)
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.
17244     data += '\x04';
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);
17254       if (objects[i])
17255         relativeOffset += objects[i].length;
17256     }
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) :
17261                 objects[i][j];
17262     }
17263     return data;
17264   },
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
17270     value |= 0;
17271     if (value >= -32768 && value <= 32767) {
17272       return '\x1c' +
17273              String.fromCharCode((value >> 8) & 0xFF) +
17274              String.fromCharCode(value & 0xFF);
17275     } else {
17276       return '\x1d' +
17277              String.fromCharCode((value >> 24) & 0xFF) +
17278              String.fromCharCode((value >> 16) & 0xFF) +
17279              String.fromCharCode((value >> 8) & 0xFF) +
17280              String.fromCharCode(value & 0xFF);
17281     }
17282   },
17284   getOrderedCharStrings: function Type1Font_getOrderedCharStrings(glyphs,
17285                                                             properties) {
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++;
17294       charstrings.push({
17295         glyph: glyphName,
17296         unicode: unicode,
17297         gid: i,
17298         charstring: item.data,
17299         width: item.width,
17300         lsb: item.lsb
17301       });
17302     }
17304     charstrings.sort(function charstrings_sort(a, b) {
17305       return a.unicode - b.unicode;
17306     });
17307     return charstrings;
17308   },
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));
17318     }
17319     return type2Charstrings;
17320   },
17322   getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
17323     var bias = 0;
17324     var count = type1Subrs.length;
17325     if (count < 1240)
17326       bias = 107;
17327     else if (count < 33900)
17328       bias = 1131;
17329     else
17330       bias = 32768;
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];
17339       if (!subr)
17340         subr = [0x0B];
17342       type2Subrs.push(this.flattenCharstring(subr, this.commandsMap));
17343     }
17345     return type2Subrs;
17346   },
17348   /*
17349    * Flatten the commands by interpreting the postscript code and replacing
17350    * every 'callsubr', 'callothersubr' by the real commands.
17351    */
17352   commandsMap: {
17353     'hstem': 1,
17354     'vstem': 3,
17355     'vmoveto': 4,
17356     'rlineto': 5,
17357     'hlineto': 6,
17358     'vlineto': 7,
17359     'rrcurveto': 8,
17360     'callsubr': 10,
17361     'return': 11,
17362     'sub': [12, 11],
17363     'div': [12, 12],
17364     'exch': [12, 28],
17365     'flex': [12, 35],
17366     'drop' : [12, 18],
17367     'endchar': 14,
17368     'rmoveto': 21,
17369     'hmoveto': 22,
17370     'vhcurveto': 30,
17371     'hvcurveto': 31
17372   },
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);
17382         if (isArray(cmd))
17383           charstring.splice(i++, 1, cmd[0], cmd[1]);
17384         else
17385           charstring[i] = cmd;
17386       } else {
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);
17392         } else {
17393           charstring.splice(i, 1, 28, command >> 8, command & 0xff);
17394         }
17395         i += 2;
17396       }
17397     }
17398     return charstring;
17399   },
17401   wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
17402     var fields = {
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';
17411           var dict =
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) {
17434             offset += 9;
17435           } else {
17436             offset += 7;
17437           }
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;
17449         };
17450       })(this),
17452       'strings': (function strings(self) {
17453         var strings = [
17454           'Version 0.11',         // Version
17455           'See original notice',  // Notice
17456           name,                   // FullName
17457           name,                   // FamilyName
17458           'Medium'                // Weight
17459         ];
17460         return self.createCFFIndexHeader(strings);
17461       })(this),
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
17474           // problems
17475           if (index == -1)
17476             index = 0;
17478           charsetString += String.fromCharCode(index >> 8, index & 0xff);
17479         }
17480         return charsetString;
17481       })(this),
17483       'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs),
17484                                                true),
17486       'privateData': (function cffWrapPrivate(self) {
17487         var data =
17488             '\x8b\x14' + // defaultWidth
17489             '\x8b\x15';  // nominalWidth
17490         var fieldMap = {
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'
17502         };
17503         for (var field in fieldMap) {
17504           if (!properties.privateData.hasOwnProperty(field))
17505             continue;
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]);
17512           } else {
17513             data += self.encodeNumber(value);
17514           }
17515           data += fieldMap[field];
17516         }
17518         data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset
17520         return data;
17521       })(this),
17523       'localSubrs': this.createCFFIndexHeader(subrs, true)
17524     };
17525     fields.topDict = fields.topDict();
17528     var cff = [];
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));
17533     }
17535     return cff;
17536   }
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);
17547     try {
17548       this.data = compiler.compile();
17549     } catch (e) {
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.
17553       this.data = file;
17554     }
17555   }
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
17566       var glyphIds = [];
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;
17572     },
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;
17582       else
17583         inverseEncoding = charsets;
17584       for (var i = 0, ii = charsets.length; i < ii; i++) {
17585         var glyph = charsets[i];
17586         if (glyph == '.notdef')
17587           continue;
17589         var code = inverseEncoding[i];
17590         if (!code || isSpecialUnicode(code)) {
17591           unassignedUnicodeItems.push(i);
17592           continue;
17593         }
17594         charstrings.push({
17595           unicode: code,
17596           code: code,
17597           gid: i,
17598           glyph: glyph
17599         });
17600         unicodeUsed[code] = true;
17601       }
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++;
17610         charstrings.push({
17611           unicode: unicode,
17612           code: inverseEncoding[i] || 0,
17613           gid: i,
17614           glyph: charsets[i]
17615         });
17616       }
17618       // sort the array by the unicode value (again)
17619       charstrings.sort(function getCharStringsSort(a, b) {
17620         return a.unicode - b.unicode;
17621       });
17622       return charstrings;
17623     }
17624   };
17626   return CFFFont;
17627 })();
17629 var CFFParser = (function CFFParserClosure() {
17630   function CFFParser(file, properties) {
17631     this.bytes = file.getBytes();
17632     this.properties = properties;
17633   }
17634   CFFParser.prototype = {
17635     parse: function CFFParser_parse() {
17636       var properties = this.properties;
17637       var cff = new CFF();
17638       this.cff = 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),
17670                                          cff.strings);
17671           this.parsePrivateDict(fontDict);
17672           cff.fdArray.push(fontDict);
17673         }
17674         // cid fonts don't have an encoding
17675         encoding = null;
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);
17680       } else {
17681         charset = this.parseCharsets(topDict.getByName('charset'),
17682                                      cff.charStrings.count, cff.strings, false);
17683         encoding = this.parseEncoding(topDict.getByName('Encoding'),
17684                                       properties,
17685                                       cff.strings, charset.charset);
17686       }
17687       cff.charset = charset;
17688       cff.encoding = encoding;
17690       return cff;
17691     },
17692     parseHeader: function CFFParser_parseHeader() {
17693       var bytes = this.bytes;
17694       var offset = 0;
17696       while (bytes[offset] != 1)
17697         ++offset;
17699       if (offset != 0) {
17700         warn('cff data is shifted');
17701         bytes = bytes.subarray(offset);
17702         this.bytes = bytes;
17703       }
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};
17710     },
17711     parseDict: function CFFParser_parseDict(dict) {
17712       var pos = 0;
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++];
17721           return value;
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++];
17727           return value;
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;
17734         } else {
17735           error('255 is not a valid DICT command');
17736         }
17737         return -1;
17738       }
17740       function parseFloatOperand() {
17741         var str = '';
17742         var eof = 15;
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++];
17748           var b1 = b >> 4;
17749           var b2 = b & 15;
17751           if (b1 == eof)
17752             break;
17753           str += lookup[b1];
17755           if (b2 == eof)
17756             break;
17757           str += lookup[b2];
17758         }
17759         return parseFloat(str);
17760       }
17762       var operands = [];
17763       var entries = [];
17765       var pos = 0;
17766       var end = dict.length;
17767       while (pos < end) {
17768         var b = dict[pos];
17769         if (b <= 21) {
17770           if (b === 12)
17771             b = (b << 8) | dict[++pos];
17772           entries.push([b, operands]);
17773           operands = [];
17774           ++pos;
17775         } else {
17776           operands.push(parseOperand());
17777         }
17778       }
17779       return entries;
17780     },
17781     parseIndex: function CFFParser_parseIndex(pos) {
17782       var cffIndex = new CFFIndex();
17783       var bytes = this.bytes;
17784       var count = (bytes[pos++] << 8) | bytes[pos++];
17785       var offsets = [];
17786       var start = pos;
17787       var end = pos;
17789       if (count != 0) {
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) {
17795           var offset = 0;
17796           for (var j = 0; j < offsetSize; ++j) {
17797             offset <<= 8;
17798             offset += bytes[pos++];
17799           }
17800           offsets.push(startPos + offset);
17801         }
17802         end = offsets[count];
17803       }
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));
17808       }
17809       return {obj: cffIndex, endPos: end};
17810     },
17811     parseNameIndex: function CFFParser_parseNameIndex(index) {
17812       var names = [];
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);
17817         var data = [];
17818         // OTS also only permits certain characters in the name.
17819         for (var j = 0; j < length; ++j) {
17820           var c = name[j];
17821           if (j === 0 && c === 0) {
17822             data[j] = c;
17823             continue;
17824           }
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 /* % */) {
17829             data[j] = 95;
17830             continue;
17831           }
17832           data[j] = c;
17833         }
17834         names.push(String.fromCharCode.apply(null, data));
17835       }
17836       return names;
17837     },
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));
17843       }
17844       return strings;
17845     },
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];
17852         var key = pair[0];
17853         var value = pair[1];
17854         cffDict.setByKey(key, value);
17855       }
17856       return cffDict;
17857     },
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) {
17874               data[j - 2] = 139;
17875               data[j - 1] = 22;
17876           } else if (value === 28) {
17877             j += 2;
17878           } else if (value >= 247 && value <= 254) {
17879             j++;
17880           } else if (value == 255) {
17881             j += 4;
17882           }
17883         }
17884       }
17885       return charStrings;
17886     },
17887     parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
17888       // no private dict, do nothing
17889       if (!parentDict.hasName('Private'))
17890         return;
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');
17895         return;
17896       }
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');
17902         return;
17903       }
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'))
17914         return;
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');
17920         return;
17921       }
17922       var subrsIndex = this.parseIndex(relativeOffset);
17923       privateDict.subrsIndex = subrsIndex.obj;
17924     },
17925     parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
17926       if (pos == 0) {
17927         return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
17928                               ISOAdobeCharset);
17929       } else if (pos == 1) {
17930         return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
17931                               ExpertCharset);
17932       } else if (pos == 2) {
17933         return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
17934                               ExpertSubsetCharset);
17935       }
17937       var bytes = this.bytes;
17938       var start = pos;
17939       var format = bytes[pos++];
17940       var charset = ['.notdef'];
17942       // subtract 1 for the .notdef glyph
17943       length -= 1;
17945       switch (format) {
17946         case 0:
17947           for (var i = 0; i < length; i++) {
17948             var id = (bytes[pos++] << 8) | bytes[pos++];
17949             charset.push(cid ? id : strings.get(id));
17950           }
17951           break;
17952         case 1:
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++));
17958           }
17959           break;
17960         case 2:
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++));
17966           }
17967           break;
17968         default:
17969           error('Unknown charset format');
17970       }
17971       // Raw won't be needed if we actually compile the charset.
17972       var end = pos;
17973       var raw = bytes.subarray(start, end);
17975       return new CFFCharset(false, format, charset, raw);
17976     },
17977     parseEncoding: function CFFParser_parseEncoding(pos,
17978                                                     properties,
17979                                                     strings,
17980                                                     charset) {
17981       var encoding = {};
17982       var bytes = this.bytes;
17983       var predefined = false;
17984       var hasSupplement = false;
17985       var format;
17986       var raw = null;
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));
17994         }
17995       }
17997       if (pos == 0 || pos == 1) {
17998         predefined = true;
17999         format = pos;
18000         var gid = 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]);
18005           if (index != -1)
18006             encoding[index] = gid++;
18007         }
18008       } else {
18009         var dataStart = pos;
18010         var format = bytes[pos++];
18011         switch (format & 0x7f) {
18012           case 0:
18013             var glyphsCount = bytes[pos++];
18014             for (var i = 1; i <= glyphsCount; i++)
18015               encoding[bytes[pos++]] = i;
18016             break;
18018           case 1:
18019             var rangesCount = bytes[pos++];
18020             var gid = 1;
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++;
18026             }
18027             break;
18029           default:
18030             error('Unknow encoding format: ' + format + ' in CFF');
18031             break;
18032         }
18033         var dataEnd = pos;
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;
18041           readSupplement();
18042           hasSupplement = true;
18043         }
18044         raw = bytes.subarray(dataStart, dataEnd);
18045       }
18046       format = format & 0x7f;
18047       return new CFFEncoding(predefined, format, encoding, raw);
18048     },
18049     parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
18050       var start = pos;
18051       var bytes = this.bytes;
18052       var format = bytes[pos++];
18053       var fdSelect = [];
18054       switch (format) {
18055         case 0:
18056           for (var i = 0; i < length; ++i) {
18057             var id = bytes[pos++];
18058             fdSelect.push(id);
18059           }
18060           break;
18061         case 3:
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);
18069           }
18070           // Advance past the sentinel(next).
18071           pos += 2;
18072           break;
18073         default:
18074           error('Unknown fdselect format ' + format);
18075           break;
18076       }
18077       var end = pos;
18078       return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
18079     }
18080   };
18081   return CFFParser;
18082 })();
18084 // Compact Font Format
18085 var CFF = (function CFFClosure() {
18086   function CFF() {
18087     this.header = null;
18088     this.names = [];
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;
18098     this.fdArray = [];
18099     this.fdSelect = null;
18101     this.isCIDFont = false;
18102   }
18103   return CFF;
18104 })();
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;
18112   }
18113   return CFFHeader;
18114 })();
18116 var CFFStrings = (function CFFStringsClosure() {
18117   function CFFStrings() {
18118     this.strings = [];
18119   }
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];
18127     },
18128     add: function CFFStrings_add(value) {
18129       this.strings.push(value);
18130     },
18131     get count() {
18132       return this.strings.length;
18133     }
18134   };
18135   return CFFStrings;
18136 })();
18138 var CFFIndex = (function CFFIndexClosure() {
18139   function CFFIndex() {
18140     this.objects = [];
18141     this.length = 0;
18142   }
18143   CFFIndex.prototype = {
18144     add: function CFFIndex_add(data) {
18145       this.length += data.length;
18146       this.objects.push(data);
18147     },
18148     get: function CFFIndex_get(index) {
18149       return this.objects[index];
18150     },
18151     get count() {
18152       return this.objects.length;
18153     }
18154   };
18155   return CFFIndex;
18156 })();
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;
18167     this.values = {};
18168   }
18169   CFFDict.prototype = {
18170     // value should always be an array
18171     setByKey: function CFFDict_setByKey(key, value) {
18172       if (!(key in this.keyToNameMap))
18173         return false;
18174       // ignore empty values
18175       if (value.length === 0)
18176         return true;
18177       var type = this.types[key];
18178       // remove the array wrapping these types of values
18179       if (type === 'num' || type === 'sid' || type === 'offset')
18180         value = value[0];
18181       this.values[key] = value;
18182       return true;
18183     },
18184     hasName: function CFFDict_hasName(name) {
18185       return this.nameToKeyMap[name] in this.values;
18186     },
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];
18194     },
18195     removeByName: function CFFDict_removeByName(name) {
18196       delete this.values[this.nameToKeyMap[name]];
18197     }
18198   };
18199   CFFDict.createTables = function CFFDict_createTables(layout) {
18200     var tables = {
18201       keyToNameMap: {},
18202       nameToKeyMap: {},
18203       defaults: {},
18204       types: {},
18205       opcodes: {},
18206       order: []
18207     };
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);
18217     }
18218     return tables;
18219   };
18220   return CFFDict;
18221 })();
18223 var CFFTopDict = (function CFFTopDictClosure() {
18224   var layout = [
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]];
18260   var tables = null;
18261   function CFFTopDict(strings) {
18262     if (tables === null)
18263       tables = CFFDict.createTables(layout);
18264     CFFDict.call(this, tables, strings);
18265     this.privateDict = null;
18266   }
18267   CFFTopDict.prototype = Object.create(CFFDict.prototype);
18268   return CFFTopDict;
18269 })();
18271 var CFFPrivateDict = (function CFFPrivateDictClosure() {
18272   var layout = [
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]
18291   ];
18292   var tables = null;
18293   function CFFPrivateDict(strings) {
18294     if (tables === null)
18295       tables = CFFDict.createTables(layout);
18296     CFFDict.call(this, tables, strings);
18297     this.subrsIndex = null;
18298   }
18299   CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
18300   return CFFPrivateDict;
18301 })();
18303 var CFFCharsetPredefinedTypes = {
18304   ISO_ADOBE: 0,
18305   EXPERT: 1,
18306   EXPERT_SUBSET: 2
18308 var CFFCharsetEmbeddedTypes = {
18309   FORMAT0: 0,
18310   FORMAT1: 1,
18311   FORMAT2: 2
18313 var CFFCharset = (function CFFCharsetClosure() {
18314   function CFFCharset(predefined, format, charset, raw) {
18315     this.predefined = predefined;
18316     this.format = format;
18317     this.charset = charset;
18318     this.raw = raw;
18319   }
18320   return CFFCharset;
18321 })();
18323 var CFFEncodingPredefinedTypes = {
18324   STANDARD: 0,
18325   EXPERT: 1
18327 var CFFCharsetEmbeddedTypes = {
18328   FORMAT0: 0,
18329   FORMAT1: 1
18331 var CFFEncoding = (function CFFEncodingClosure() {
18332   function CFFEncoding(predefined, format, encoding, raw) {
18333     this.predefined = predefined;
18334     this.format = format;
18335     this.encoding = encoding;
18336     this.raw = raw;
18337   }
18338   return CFFEncoding;
18339 })();
18341 var CFFFDSelect = (function CFFFDSelectClosure() {
18342   function CFFFDSelect(fdSelect, raw) {
18343     this.fdSelect = fdSelect;
18344     this.raw = raw;
18345   }
18346   return CFFFDSelect;
18347 })();
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() {
18353     this.offsets = {};
18354   }
18355   CFFOffsetTracker.prototype = {
18356     isTracking: function CFFOffsetTracker_isTracking(key) {
18357       return key in this.offsets;
18358     },
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;
18363     },
18364     offset: function CFFOffsetTracker_offset(value) {
18365       for (var key in this.offsets) {
18366         this.offsets[key] += value;
18367       }
18368     },
18369     setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
18370                                                                  values,
18371                                                                  output) {
18372       if (!(key in this.offsets))
18373         error('Not tracking location of ' + key);
18374       var data = output.data;
18375       var dataOffset = this.offsets[key];
18376       var size = 5;
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;
18393       }
18394     }
18395   };
18396   return CFFOffsetTracker;
18397 })();
18399 // Takes a CFF and converts it to the binary representation.
18400 var CFFCompiler = (function CFFCompilerClosure() {
18401   function stringToArray(str) {
18402     var array = [];
18403     for (var i = 0, ii = str.length; i < ii; ++i)
18404       array[i] = str.charCodeAt(i);
18406     return array;
18407   };
18408   function CFFCompiler(cff) {
18409     this.cff = cff;
18410   }
18411   CFFCompiler.prototype = {
18412     compile: function CFFCompiler_compile() {
18413       var cff = this.cff;
18414       var output = {
18415         data: [],
18416         length: 0,
18417         add: function CFFCompiler_add(data) {
18418           this.data = this.data.concat(data);
18419           this.length = this.data.length;
18420         }
18421       };
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],
18444                                           output);
18445         } else {
18446           var encoding = this.compileEncoding(cff.encoding);
18447           topDictTracker.setEntryLocation('Encoding', [output.length], output);
18448           output.add(encoding);
18449         }
18450       }
18452       if (cff.charset && cff.topDict.hasName('charset')) {
18453         if (cff.charset.predefined) {
18454           topDictTracker.setEntryLocation('charset', [cff.charset.format],
18455                                           output);
18456         } else {
18457           var charset = this.compileCharset(cff.charset);
18458           topDictTracker.setEntryLocation('charset', [output.length], output);
18459           output.add(charset);
18460         }
18461       }
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);
18480       }
18482       this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
18484       return output.data;
18485     },
18486     encodeNumber: function CFFCompiler_encodeNumber(value) {
18487       if (parseFloat(value) == parseInt(value) && !isNaN(value)) // isInt
18488         return this.encodeInteger(value);
18489       else
18490         return this.encodeFloat(value);
18491     },
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);
18499       var nibbles = [];
18500       for (var i = 0, ii = value.length; i < ii; ++i) {
18501         var a = value.charAt(i), b = value.charAt(i + 1);
18502         var nibble;
18503         if (a === 'e' && b === '-') {
18504           nibble = 0xc;
18505           ++i;
18506         } else if (a === '.') {
18507           nibble = 0xa;
18508         } else if (a === 'E') {
18509           nibble = 0xb;
18510         } else if (a === '-') {
18511           nibble = 0xe;
18512         } else {
18513           nibble = a;
18514         }
18515         nibbles.push(nibble);
18516       }
18517       nibbles.push(0xf);
18518       if (nibbles.length % 2)
18519         nibbles.push(0xf);
18520       var out = [30];
18521       for (var i = 0, ii = nibbles.length; i < ii; i += 2)
18522         out.push(nibbles[i] << 4 | nibbles[i + 1]);
18523       return out;
18524     },
18525     encodeInteger: function CFFCompiler_encodeInteger(value) {
18526       var code;
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];
18537       } else {
18538         code = [0x1d,
18539                 (value >> 24) & 0xFF,
18540                 (value >> 16) & 0xFF,
18541                 (value >> 8) & 0xFF,
18542                  value & 0xFF];
18543       }
18544       return code;
18545     },
18546     compileHeader: function CFFCompiler_compileHeader(header) {
18547       return [
18548         header.major,
18549         header.minor,
18550         header.hdrSize,
18551         header.offSize
18552       ];
18553     },
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);
18559     },
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);
18570       }
18571       fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
18572       return {
18573         trackers: fontDictTrackers,
18574         output: fdArrayIndex
18575       };
18576     },
18577     compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
18578                                                                   trackers,
18579                                                                   output) {
18580       for (var i = 0, ii = dicts.length; i < ii; ++i) {
18581         var fontDict = dicts[i];
18582         if (!fontDict.privateDict || !fontDict.hasName('Private'))
18583           continue;
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],
18591                                      output);
18592         output.add(privateDictData);
18594         if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
18595           var subrs = this.compileIndex(privateDict.subrsIndex);
18596           privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
18597                                               output);
18598           output.add(subrs);
18599         }
18600       }
18601     },
18602     compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
18603       var out = [];
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))
18609           continue;
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)
18617           continue;
18619         for (var j = 0, jj = types.length; j < jj; ++j) {
18620           var type = types[j];
18621           var value = values[j];
18622           switch (type) {
18623             case 'num':
18624             case 'sid':
18625               out = out.concat(this.encodeNumber(value));
18626               break;
18627             case 'offset':
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]);
18637               break;
18638             case 'array':
18639             case 'delta':
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]));
18643               break;
18644             default:
18645               error('Unknown data type of ' + type);
18646               break;
18647           }
18648         }
18649         out = out.concat(dict.opcodes[key]);
18650       }
18651       return out;
18652     },
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);
18658     },
18659     compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
18660       var globalSubrIndex = this.cff.globalSubrIndex;
18661       this.out.writeByteArray(this.compileIndex(globalSubrIndex));
18662     },
18663     compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
18664       return this.compileIndex(charStrings);
18665     },
18666     compileCharset: function CFFCompiler_compileCharset(charset) {
18667       return this.compileTypedArray(charset.raw);
18668     },
18669     compileEncoding: function CFFCompiler_compileEncoding(encoding) {
18670       return this.compileTypedArray(encoding.raw);
18671     },
18672     compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
18673       return this.compileTypedArray(fdSelect);
18674     },
18675     compileTypedArray: function CFFCompiler_compileTypedArray(data) {
18676       var out = [];
18677       for (var i = 0, ii = data.length; i < ii; ++i)
18678         out[i] = data[i];
18679       return out;
18680     },
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.
18689       if (count == 0)
18690         return [0, 0, 0];
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;
18698       var offsetSize;
18699       if (lastOffset < 0x100)
18700         offsetSize = 1;
18701       else if (lastOffset < 0x10000)
18702         offsetSize = 2;
18703       else if (lastOffset < 0x1000000)
18704         offsetSize = 3;
18705       else
18706         offsetSize = 4;
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);
18723         } else {
18724           data.push((relativeOffset >>> 24) & 0xFF,
18725                     (relativeOffset >> 16) & 0xFF,
18726                     (relativeOffset >> 8) & 0xFF,
18727                      relativeOffset & 0xFF);
18728         }
18730         if (objects[i])
18731           relativeOffset += objects[i].length;
18732       }
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.
18737         if (trackers[i])
18738           trackers[i].offset(data.length);
18739         for (var j = 0, jj = objects[i].length; j < jj; j++)
18740           data.push(objects[i][j]);
18741       }
18742       return data;
18743     }
18744   };
18745   return CFFCompiler;
18746 })();
18749 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
18750 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
18752 'use strict';
18754 var GlyphsUnicode = {
18755   A: 0x0041,
18756   AE: 0x00C6,
18757   AEacute: 0x01FC,
18758   AEmacron: 0x01E2,
18759   AEsmall: 0xF7E6,
18760   Aacute: 0x00C1,
18761   Aacutesmall: 0xF7E1,
18762   Abreve: 0x0102,
18763   Abreveacute: 0x1EAE,
18764   Abrevecyrillic: 0x04D0,
18765   Abrevedotbelow: 0x1EB6,
18766   Abrevegrave: 0x1EB0,
18767   Abrevehookabove: 0x1EB2,
18768   Abrevetilde: 0x1EB4,
18769   Acaron: 0x01CD,
18770   Acircle: 0x24B6,
18771   Acircumflex: 0x00C2,
18772   Acircumflexacute: 0x1EA4,
18773   Acircumflexdotbelow: 0x1EAC,
18774   Acircumflexgrave: 0x1EA6,
18775   Acircumflexhookabove: 0x1EA8,
18776   Acircumflexsmall: 0xF7E2,
18777   Acircumflextilde: 0x1EAA,
18778   Acute: 0xF6C9,
18779   Acutesmall: 0xF7B4,
18780   Acyrillic: 0x0410,
18781   Adblgrave: 0x0200,
18782   Adieresis: 0x00C4,
18783   Adieresiscyrillic: 0x04D2,
18784   Adieresismacron: 0x01DE,
18785   Adieresissmall: 0xF7E4,
18786   Adotbelow: 0x1EA0,
18787   Adotmacron: 0x01E0,
18788   Agrave: 0x00C0,
18789   Agravesmall: 0xF7E0,
18790   Ahookabove: 0x1EA2,
18791   Aiecyrillic: 0x04D4,
18792   Ainvertedbreve: 0x0202,
18793   Alpha: 0x0391,
18794   Alphatonos: 0x0386,
18795   Amacron: 0x0100,
18796   Amonospace: 0xFF21,
18797   Aogonek: 0x0104,
18798   Aring: 0x00C5,
18799   Aringacute: 0x01FA,
18800   Aringbelow: 0x1E00,
18801   Aringsmall: 0xF7E5,
18802   Asmall: 0xF761,
18803   Atilde: 0x00C3,
18804   Atildesmall: 0xF7E3,
18805   Aybarmenian: 0x0531,
18806   B: 0x0042,
18807   Bcircle: 0x24B7,
18808   Bdotaccent: 0x1E02,
18809   Bdotbelow: 0x1E04,
18810   Becyrillic: 0x0411,
18811   Benarmenian: 0x0532,
18812   Beta: 0x0392,
18813   Bhook: 0x0181,
18814   Blinebelow: 0x1E06,
18815   Bmonospace: 0xFF22,
18816   Brevesmall: 0xF6F4,
18817   Bsmall: 0xF762,
18818   Btopbar: 0x0182,
18819   C: 0x0043,
18820   Caarmenian: 0x053E,
18821   Cacute: 0x0106,
18822   Caron: 0xF6CA,
18823   Caronsmall: 0xF6F5,
18824   Ccaron: 0x010C,
18825   Ccedilla: 0x00C7,
18826   Ccedillaacute: 0x1E08,
18827   Ccedillasmall: 0xF7E7,
18828   Ccircle: 0x24B8,
18829   Ccircumflex: 0x0108,
18830   Cdot: 0x010A,
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,
18842   Chi: 0x03A7,
18843   Chook: 0x0187,
18844   Circumflexsmall: 0xF6F6,
18845   Cmonospace: 0xFF23,
18846   Coarmenian: 0x0551,
18847   Csmall: 0xF763,
18848   D: 0x0044,
18849   DZ: 0x01F1,
18850   DZcaron: 0x01C4,
18851   Daarmenian: 0x0534,
18852   Dafrican: 0x0189,
18853   Dcaron: 0x010E,
18854   Dcedilla: 0x1E10,
18855   Dcircle: 0x24B9,
18856   Dcircumflexbelow: 0x1E12,
18857   Dcroat: 0x0110,
18858   Ddotaccent: 0x1E0A,
18859   Ddotbelow: 0x1E0C,
18860   Decyrillic: 0x0414,
18861   Deicoptic: 0x03EE,
18862   Delta: 0x2206,
18863   Deltagreek: 0x0394,
18864   Dhook: 0x018A,
18865   Dieresis: 0xF6CB,
18866   DieresisAcute: 0xF6CC,
18867   DieresisGrave: 0xF6CD,
18868   Dieresissmall: 0xF7A8,
18869   Digammagreek: 0x03DC,
18870   Djecyrillic: 0x0402,
18871   Dlinebelow: 0x1E0E,
18872   Dmonospace: 0xFF24,
18873   Dotaccentsmall: 0xF6F7,
18874   Dslash: 0x0110,
18875   Dsmall: 0xF764,
18876   Dtopbar: 0x018B,
18877   Dz: 0x01F2,
18878   Dzcaron: 0x01C5,
18879   Dzeabkhasiancyrillic: 0x04E0,
18880   Dzecyrillic: 0x0405,
18881   Dzhecyrillic: 0x040F,
18882   E: 0x0045,
18883   Eacute: 0x00C9,
18884   Eacutesmall: 0xF7E9,
18885   Ebreve: 0x0114,
18886   Ecaron: 0x011A,
18887   Ecedillabreve: 0x1E1C,
18888   Echarmenian: 0x0535,
18889   Ecircle: 0x24BA,
18890   Ecircumflex: 0x00CA,
18891   Ecircumflexacute: 0x1EBE,
18892   Ecircumflexbelow: 0x1E18,
18893   Ecircumflexdotbelow: 0x1EC6,
18894   Ecircumflexgrave: 0x1EC0,
18895   Ecircumflexhookabove: 0x1EC2,
18896   Ecircumflexsmall: 0xF7EA,
18897   Ecircumflextilde: 0x1EC4,
18898   Ecyrillic: 0x0404,
18899   Edblgrave: 0x0204,
18900   Edieresis: 0x00CB,
18901   Edieresissmall: 0xF7EB,
18902   Edot: 0x0116,
18903   Edotaccent: 0x0116,
18904   Edotbelow: 0x1EB8,
18905   Efcyrillic: 0x0424,
18906   Egrave: 0x00C8,
18907   Egravesmall: 0xF7E8,
18908   Eharmenian: 0x0537,
18909   Ehookabove: 0x1EBA,
18910   Eightroman: 0x2167,
18911   Einvertedbreve: 0x0206,
18912   Eiotifiedcyrillic: 0x0464,
18913   Elcyrillic: 0x041B,
18914   Elevenroman: 0x216A,
18915   Emacron: 0x0112,
18916   Emacronacute: 0x1E16,
18917   Emacrongrave: 0x1E14,
18918   Emcyrillic: 0x041C,
18919   Emonospace: 0xFF25,
18920   Encyrillic: 0x041D,
18921   Endescendercyrillic: 0x04A2,
18922   Eng: 0x014A,
18923   Enghecyrillic: 0x04A4,
18924   Enhookcyrillic: 0x04C7,
18925   Eogonek: 0x0118,
18926   Eopen: 0x0190,
18927   Epsilon: 0x0395,
18928   Epsilontonos: 0x0388,
18929   Ercyrillic: 0x0420,
18930   Ereversed: 0x018E,
18931   Ereversedcyrillic: 0x042D,
18932   Escyrillic: 0x0421,
18933   Esdescendercyrillic: 0x04AA,
18934   Esh: 0x01A9,
18935   Esmall: 0xF765,
18936   Eta: 0x0397,
18937   Etarmenian: 0x0538,
18938   Etatonos: 0x0389,
18939   Eth: 0x00D0,
18940   Ethsmall: 0xF7F0,
18941   Etilde: 0x1EBC,
18942   Etildebelow: 0x1E1A,
18943   Euro: 0x20AC,
18944   Ezh: 0x01B7,
18945   Ezhcaron: 0x01EE,
18946   Ezhreversed: 0x01B8,
18947   F: 0x0046,
18948   Fcircle: 0x24BB,
18949   Fdotaccent: 0x1E1E,
18950   Feharmenian: 0x0556,
18951   Feicoptic: 0x03E4,
18952   Fhook: 0x0191,
18953   Fitacyrillic: 0x0472,
18954   Fiveroman: 0x2164,
18955   Fmonospace: 0xFF26,
18956   Fourroman: 0x2163,
18957   Fsmall: 0xF766,
18958   G: 0x0047,
18959   GBsquare: 0x3387,
18960   Gacute: 0x01F4,
18961   Gamma: 0x0393,
18962   Gammaafrican: 0x0194,
18963   Gangiacoptic: 0x03EA,
18964   Gbreve: 0x011E,
18965   Gcaron: 0x01E6,
18966   Gcedilla: 0x0122,
18967   Gcircle: 0x24BC,
18968   Gcircumflex: 0x011C,
18969   Gcommaaccent: 0x0122,
18970   Gdot: 0x0120,
18971   Gdotaccent: 0x0120,
18972   Gecyrillic: 0x0413,
18973   Ghadarmenian: 0x0542,
18974   Ghemiddlehookcyrillic: 0x0494,
18975   Ghestrokecyrillic: 0x0492,
18976   Gheupturncyrillic: 0x0490,
18977   Ghook: 0x0193,
18978   Gimarmenian: 0x0533,
18979   Gjecyrillic: 0x0403,
18980   Gmacron: 0x1E20,
18981   Gmonospace: 0xFF27,
18982   Grave: 0xF6CE,
18983   Gravesmall: 0xF760,
18984   Gsmall: 0xF767,
18985   Gsmallhook: 0x029B,
18986   Gstroke: 0x01E4,
18987   H: 0x0048,
18988   H18533: 0x25CF,
18989   H18543: 0x25AA,
18990   H18551: 0x25AB,
18991   H22073: 0x25A1,
18992   HPsquare: 0x33CB,
18993   Haabkhasiancyrillic: 0x04A8,
18994   Hadescendercyrillic: 0x04B2,
18995   Hardsigncyrillic: 0x042A,
18996   Hbar: 0x0126,
18997   Hbrevebelow: 0x1E2A,
18998   Hcedilla: 0x1E28,
18999   Hcircle: 0x24BD,
19000   Hcircumflex: 0x0124,
19001   Hdieresis: 0x1E26,
19002   Hdotaccent: 0x1E22,
19003   Hdotbelow: 0x1E24,
19004   Hmonospace: 0xFF28,
19005   Hoarmenian: 0x0540,
19006   Horicoptic: 0x03E8,
19007   Hsmall: 0xF768,
19008   Hungarumlaut: 0xF6CF,
19009   Hungarumlautsmall: 0xF6F8,
19010   Hzsquare: 0x3390,
19011   I: 0x0049,
19012   IAcyrillic: 0x042F,
19013   IJ: 0x0132,
19014   IUcyrillic: 0x042E,
19015   Iacute: 0x00CD,
19016   Iacutesmall: 0xF7ED,
19017   Ibreve: 0x012C,
19018   Icaron: 0x01CF,
19019   Icircle: 0x24BE,
19020   Icircumflex: 0x00CE,
19021   Icircumflexsmall: 0xF7EE,
19022   Icyrillic: 0x0406,
19023   Idblgrave: 0x0208,
19024   Idieresis: 0x00CF,
19025   Idieresisacute: 0x1E2E,
19026   Idieresiscyrillic: 0x04E4,
19027   Idieresissmall: 0xF7EF,
19028   Idot: 0x0130,
19029   Idotaccent: 0x0130,
19030   Idotbelow: 0x1ECA,
19031   Iebrevecyrillic: 0x04D6,
19032   Iecyrillic: 0x0415,
19033   Ifraktur: 0x2111,
19034   Igrave: 0x00CC,
19035   Igravesmall: 0xF7EC,
19036   Ihookabove: 0x1EC8,
19037   Iicyrillic: 0x0418,
19038   Iinvertedbreve: 0x020A,
19039   Iishortcyrillic: 0x0419,
19040   Imacron: 0x012A,
19041   Imacroncyrillic: 0x04E2,
19042   Imonospace: 0xFF29,
19043   Iniarmenian: 0x053B,
19044   Iocyrillic: 0x0401,
19045   Iogonek: 0x012E,
19046   Iota: 0x0399,
19047   Iotaafrican: 0x0196,
19048   Iotadieresis: 0x03AA,
19049   Iotatonos: 0x038A,
19050   Ismall: 0xF769,
19051   Istroke: 0x0197,
19052   Itilde: 0x0128,
19053   Itildebelow: 0x1E2C,
19054   Izhitsacyrillic: 0x0474,
19055   Izhitsadblgravecyrillic: 0x0476,
19056   J: 0x004A,
19057   Jaarmenian: 0x0541,
19058   Jcircle: 0x24BF,
19059   Jcircumflex: 0x0134,
19060   Jecyrillic: 0x0408,
19061   Jheharmenian: 0x054B,
19062   Jmonospace: 0xFF2A,
19063   Jsmall: 0xF76A,
19064   K: 0x004B,
19065   KBsquare: 0x3385,
19066   KKsquare: 0x33CD,
19067   Kabashkircyrillic: 0x04A0,
19068   Kacute: 0x1E30,
19069   Kacyrillic: 0x041A,
19070   Kadescendercyrillic: 0x049A,
19071   Kahookcyrillic: 0x04C3,
19072   Kappa: 0x039A,
19073   Kastrokecyrillic: 0x049E,
19074   Kaverticalstrokecyrillic: 0x049C,
19075   Kcaron: 0x01E8,
19076   Kcedilla: 0x0136,
19077   Kcircle: 0x24C0,
19078   Kcommaaccent: 0x0136,
19079   Kdotbelow: 0x1E32,
19080   Keharmenian: 0x0554,
19081   Kenarmenian: 0x053F,
19082   Khacyrillic: 0x0425,
19083   Kheicoptic: 0x03E6,
19084   Khook: 0x0198,
19085   Kjecyrillic: 0x040C,
19086   Klinebelow: 0x1E34,
19087   Kmonospace: 0xFF2B,
19088   Koppacyrillic: 0x0480,
19089   Koppagreek: 0x03DE,
19090   Ksicyrillic: 0x046E,
19091   Ksmall: 0xF76B,
19092   L: 0x004C,
19093   LJ: 0x01C7,
19094   LL: 0xF6BF,
19095   Lacute: 0x0139,
19096   Lambda: 0x039B,
19097   Lcaron: 0x013D,
19098   Lcedilla: 0x013B,
19099   Lcircle: 0x24C1,
19100   Lcircumflexbelow: 0x1E3C,
19101   Lcommaaccent: 0x013B,
19102   Ldot: 0x013F,
19103   Ldotaccent: 0x013F,
19104   Ldotbelow: 0x1E36,
19105   Ldotbelowmacron: 0x1E38,
19106   Liwnarmenian: 0x053C,
19107   Lj: 0x01C8,
19108   Ljecyrillic: 0x0409,
19109   Llinebelow: 0x1E3A,
19110   Lmonospace: 0xFF2C,
19111   Lslash: 0x0141,
19112   Lslashsmall: 0xF6F9,
19113   Lsmall: 0xF76C,
19114   M: 0x004D,
19115   MBsquare: 0x3386,
19116   Macron: 0xF6D0,
19117   Macronsmall: 0xF7AF,
19118   Macute: 0x1E3E,
19119   Mcircle: 0x24C2,
19120   Mdotaccent: 0x1E40,
19121   Mdotbelow: 0x1E42,
19122   Menarmenian: 0x0544,
19123   Mmonospace: 0xFF2D,
19124   Msmall: 0xF76D,
19125   Mturned: 0x019C,
19126   Mu: 0x039C,
19127   N: 0x004E,
19128   NJ: 0x01CA,
19129   Nacute: 0x0143,
19130   Ncaron: 0x0147,
19131   Ncedilla: 0x0145,
19132   Ncircle: 0x24C3,
19133   Ncircumflexbelow: 0x1E4A,
19134   Ncommaaccent: 0x0145,
19135   Ndotaccent: 0x1E44,
19136   Ndotbelow: 0x1E46,
19137   Nhookleft: 0x019D,
19138   Nineroman: 0x2168,
19139   Nj: 0x01CB,
19140   Njecyrillic: 0x040A,
19141   Nlinebelow: 0x1E48,
19142   Nmonospace: 0xFF2E,
19143   Nowarmenian: 0x0546,
19144   Nsmall: 0xF76E,
19145   Ntilde: 0x00D1,
19146   Ntildesmall: 0xF7F1,
19147   Nu: 0x039D,
19148   O: 0x004F,
19149   OE: 0x0152,
19150   OEsmall: 0xF6FA,
19151   Oacute: 0x00D3,
19152   Oacutesmall: 0xF7F3,
19153   Obarredcyrillic: 0x04E8,
19154   Obarreddieresiscyrillic: 0x04EA,
19155   Obreve: 0x014E,
19156   Ocaron: 0x01D1,
19157   Ocenteredtilde: 0x019F,
19158   Ocircle: 0x24C4,
19159   Ocircumflex: 0x00D4,
19160   Ocircumflexacute: 0x1ED0,
19161   Ocircumflexdotbelow: 0x1ED8,
19162   Ocircumflexgrave: 0x1ED2,
19163   Ocircumflexhookabove: 0x1ED4,
19164   Ocircumflexsmall: 0xF7F4,
19165   Ocircumflextilde: 0x1ED6,
19166   Ocyrillic: 0x041E,
19167   Odblacute: 0x0150,
19168   Odblgrave: 0x020C,
19169   Odieresis: 0x00D6,
19170   Odieresiscyrillic: 0x04E6,
19171   Odieresissmall: 0xF7F6,
19172   Odotbelow: 0x1ECC,
19173   Ogoneksmall: 0xF6FB,
19174   Ograve: 0x00D2,
19175   Ogravesmall: 0xF7F2,
19176   Oharmenian: 0x0555,
19177   Ohm: 0x2126,
19178   Ohookabove: 0x1ECE,
19179   Ohorn: 0x01A0,
19180   Ohornacute: 0x1EDA,
19181   Ohorndotbelow: 0x1EE2,
19182   Ohorngrave: 0x1EDC,
19183   Ohornhookabove: 0x1EDE,
19184   Ohorntilde: 0x1EE0,
19185   Ohungarumlaut: 0x0150,
19186   Oi: 0x01A2,
19187   Oinvertedbreve: 0x020E,
19188   Omacron: 0x014C,
19189   Omacronacute: 0x1E52,
19190   Omacrongrave: 0x1E50,
19191   Omega: 0x2126,
19192   Omegacyrillic: 0x0460,
19193   Omegagreek: 0x03A9,
19194   Omegaroundcyrillic: 0x047A,
19195   Omegatitlocyrillic: 0x047C,
19196   Omegatonos: 0x038F,
19197   Omicron: 0x039F,
19198   Omicrontonos: 0x038C,
19199   Omonospace: 0xFF2F,
19200   Oneroman: 0x2160,
19201   Oogonek: 0x01EA,
19202   Oogonekmacron: 0x01EC,
19203   Oopen: 0x0186,
19204   Oslash: 0x00D8,
19205   Oslashacute: 0x01FE,
19206   Oslashsmall: 0xF7F8,
19207   Osmall: 0xF76F,
19208   Ostrokeacute: 0x01FE,
19209   Otcyrillic: 0x047E,
19210   Otilde: 0x00D5,
19211   Otildeacute: 0x1E4C,
19212   Otildedieresis: 0x1E4E,
19213   Otildesmall: 0xF7F5,
19214   P: 0x0050,
19215   Pacute: 0x1E54,
19216   Pcircle: 0x24C5,
19217   Pdotaccent: 0x1E56,
19218   Pecyrillic: 0x041F,
19219   Peharmenian: 0x054A,
19220   Pemiddlehookcyrillic: 0x04A6,
19221   Phi: 0x03A6,
19222   Phook: 0x01A4,
19223   Pi: 0x03A0,
19224   Piwrarmenian: 0x0553,
19225   Pmonospace: 0xFF30,
19226   Psi: 0x03A8,
19227   Psicyrillic: 0x0470,
19228   Psmall: 0xF770,
19229   Q: 0x0051,
19230   Qcircle: 0x24C6,
19231   Qmonospace: 0xFF31,
19232   Qsmall: 0xF771,
19233   R: 0x0052,
19234   Raarmenian: 0x054C,
19235   Racute: 0x0154,
19236   Rcaron: 0x0158,
19237   Rcedilla: 0x0156,
19238   Rcircle: 0x24C7,
19239   Rcommaaccent: 0x0156,
19240   Rdblgrave: 0x0210,
19241   Rdotaccent: 0x1E58,
19242   Rdotbelow: 0x1E5A,
19243   Rdotbelowmacron: 0x1E5C,
19244   Reharmenian: 0x0550,
19245   Rfraktur: 0x211C,
19246   Rho: 0x03A1,
19247   Ringsmall: 0xF6FC,
19248   Rinvertedbreve: 0x0212,
19249   Rlinebelow: 0x1E5E,
19250   Rmonospace: 0xFF32,
19251   Rsmall: 0xF772,
19252   Rsmallinverted: 0x0281,
19253   Rsmallinvertedsuperior: 0x02B6,
19254   S: 0x0053,
19255   SF010000: 0x250C,
19256   SF020000: 0x2514,
19257   SF030000: 0x2510,
19258   SF040000: 0x2518,
19259   SF050000: 0x253C,
19260   SF060000: 0x252C,
19261   SF070000: 0x2534,
19262   SF080000: 0x251C,
19263   SF090000: 0x2524,
19264   SF100000: 0x2500,
19265   SF110000: 0x2502,
19266   SF190000: 0x2561,
19267   SF200000: 0x2562,
19268   SF210000: 0x2556,
19269   SF220000: 0x2555,
19270   SF230000: 0x2563,
19271   SF240000: 0x2551,
19272   SF250000: 0x2557,
19273   SF260000: 0x255D,
19274   SF270000: 0x255C,
19275   SF280000: 0x255B,
19276   SF360000: 0x255E,
19277   SF370000: 0x255F,
19278   SF380000: 0x255A,
19279   SF390000: 0x2554,
19280   SF400000: 0x2569,
19281   SF410000: 0x2566,
19282   SF420000: 0x2560,
19283   SF430000: 0x2550,
19284   SF440000: 0x256C,
19285   SF450000: 0x2567,
19286   SF460000: 0x2568,
19287   SF470000: 0x2564,
19288   SF480000: 0x2565,
19289   SF490000: 0x2559,
19290   SF500000: 0x2558,
19291   SF510000: 0x2552,
19292   SF520000: 0x2553,
19293   SF530000: 0x256B,
19294   SF540000: 0x256A,
19295   Sacute: 0x015A,
19296   Sacutedotaccent: 0x1E64,
19297   Sampigreek: 0x03E0,
19298   Scaron: 0x0160,
19299   Scarondotaccent: 0x1E66,
19300   Scaronsmall: 0xF6FD,
19301   Scedilla: 0x015E,
19302   Schwa: 0x018F,
19303   Schwacyrillic: 0x04D8,
19304   Schwadieresiscyrillic: 0x04DA,
19305   Scircle: 0x24C8,
19306   Scircumflex: 0x015C,
19307   Scommaaccent: 0x0218,
19308   Sdotaccent: 0x1E60,
19309   Sdotbelow: 0x1E62,
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,
19319   Sigma: 0x03A3,
19320   Sixroman: 0x2165,
19321   Smonospace: 0xFF33,
19322   Softsigncyrillic: 0x042C,
19323   Ssmall: 0xF773,
19324   Stigmagreek: 0x03DA,
19325   T: 0x0054,
19326   Tau: 0x03A4,
19327   Tbar: 0x0166,
19328   Tcaron: 0x0164,
19329   Tcedilla: 0x0162,
19330   Tcircle: 0x24C9,
19331   Tcircumflexbelow: 0x1E70,
19332   Tcommaaccent: 0x0162,
19333   Tdotaccent: 0x1E6A,
19334   Tdotbelow: 0x1E6C,
19335   Tecyrillic: 0x0422,
19336   Tedescendercyrillic: 0x04AC,
19337   Tenroman: 0x2169,
19338   Tetsecyrillic: 0x04B4,
19339   Theta: 0x0398,
19340   Thook: 0x01AC,
19341   Thorn: 0x00DE,
19342   Thornsmall: 0xF7FE,
19343   Threeroman: 0x2162,
19344   Tildesmall: 0xF6FE,
19345   Tiwnarmenian: 0x054F,
19346   Tlinebelow: 0x1E6E,
19347   Tmonospace: 0xFF34,
19348   Toarmenian: 0x0539,
19349   Tonefive: 0x01BC,
19350   Tonesix: 0x0184,
19351   Tonetwo: 0x01A7,
19352   Tretroflexhook: 0x01AE,
19353   Tsecyrillic: 0x0426,
19354   Tshecyrillic: 0x040B,
19355   Tsmall: 0xF774,
19356   Twelveroman: 0x216B,
19357   Tworoman: 0x2161,
19358   U: 0x0055,
19359   Uacute: 0x00DA,
19360   Uacutesmall: 0xF7FA,
19361   Ubreve: 0x016C,
19362   Ucaron: 0x01D3,
19363   Ucircle: 0x24CA,
19364   Ucircumflex: 0x00DB,
19365   Ucircumflexbelow: 0x1E76,
19366   Ucircumflexsmall: 0xF7FB,
19367   Ucyrillic: 0x0423,
19368   Udblacute: 0x0170,
19369   Udblgrave: 0x0214,
19370   Udieresis: 0x00DC,
19371   Udieresisacute: 0x01D7,
19372   Udieresisbelow: 0x1E72,
19373   Udieresiscaron: 0x01D9,
19374   Udieresiscyrillic: 0x04F0,
19375   Udieresisgrave: 0x01DB,
19376   Udieresismacron: 0x01D5,
19377   Udieresissmall: 0xF7FC,
19378   Udotbelow: 0x1EE4,
19379   Ugrave: 0x00D9,
19380   Ugravesmall: 0xF7F9,
19381   Uhookabove: 0x1EE6,
19382   Uhorn: 0x01AF,
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,
19392   Umacron: 0x016A,
19393   Umacroncyrillic: 0x04EE,
19394   Umacrondieresis: 0x1E7A,
19395   Umonospace: 0xFF35,
19396   Uogonek: 0x0172,
19397   Upsilon: 0x03A5,
19398   Upsilon1: 0x03D2,
19399   Upsilonacutehooksymbolgreek: 0x03D3,
19400   Upsilonafrican: 0x01B1,
19401   Upsilondieresis: 0x03AB,
19402   Upsilondieresishooksymbolgreek: 0x03D4,
19403   Upsilonhooksymbol: 0x03D2,
19404   Upsilontonos: 0x038E,
19405   Uring: 0x016E,
19406   Ushortcyrillic: 0x040E,
19407   Usmall: 0xF775,
19408   Ustraightcyrillic: 0x04AE,
19409   Ustraightstrokecyrillic: 0x04B0,
19410   Utilde: 0x0168,
19411   Utildeacute: 0x1E78,
19412   Utildebelow: 0x1E74,
19413   V: 0x0056,
19414   Vcircle: 0x24CB,
19415   Vdotbelow: 0x1E7E,
19416   Vecyrillic: 0x0412,
19417   Vewarmenian: 0x054E,
19418   Vhook: 0x01B2,
19419   Vmonospace: 0xFF36,
19420   Voarmenian: 0x0548,
19421   Vsmall: 0xF776,
19422   Vtilde: 0x1E7C,
19423   W: 0x0057,
19424   Wacute: 0x1E82,
19425   Wcircle: 0x24CC,
19426   Wcircumflex: 0x0174,
19427   Wdieresis: 0x1E84,
19428   Wdotaccent: 0x1E86,
19429   Wdotbelow: 0x1E88,
19430   Wgrave: 0x1E80,
19431   Wmonospace: 0xFF37,
19432   Wsmall: 0xF777,
19433   X: 0x0058,
19434   Xcircle: 0x24CD,
19435   Xdieresis: 0x1E8C,
19436   Xdotaccent: 0x1E8A,
19437   Xeharmenian: 0x053D,
19438   Xi: 0x039E,
19439   Xmonospace: 0xFF38,
19440   Xsmall: 0xF778,
19441   Y: 0x0059,
19442   Yacute: 0x00DD,
19443   Yacutesmall: 0xF7FD,
19444   Yatcyrillic: 0x0462,
19445   Ycircle: 0x24CE,
19446   Ycircumflex: 0x0176,
19447   Ydieresis: 0x0178,
19448   Ydieresissmall: 0xF7FF,
19449   Ydotaccent: 0x1E8E,
19450   Ydotbelow: 0x1EF4,
19451   Yericyrillic: 0x042B,
19452   Yerudieresiscyrillic: 0x04F8,
19453   Ygrave: 0x1EF2,
19454   Yhook: 0x01B3,
19455   Yhookabove: 0x1EF6,
19456   Yiarmenian: 0x0545,
19457   Yicyrillic: 0x0407,
19458   Yiwnarmenian: 0x0552,
19459   Ymonospace: 0xFF39,
19460   Ysmall: 0xF779,
19461   Ytilde: 0x1EF8,
19462   Yusbigcyrillic: 0x046A,
19463   Yusbigiotifiedcyrillic: 0x046C,
19464   Yuslittlecyrillic: 0x0466,
19465   Yuslittleiotifiedcyrillic: 0x0468,
19466   Z: 0x005A,
19467   Zaarmenian: 0x0536,
19468   Zacute: 0x0179,
19469   Zcaron: 0x017D,
19470   Zcaronsmall: 0xF6FF,
19471   Zcircle: 0x24CF,
19472   Zcircumflex: 0x1E90,
19473   Zdot: 0x017B,
19474   Zdotaccent: 0x017B,
19475   Zdotbelow: 0x1E92,
19476   Zecyrillic: 0x0417,
19477   Zedescendercyrillic: 0x0498,
19478   Zedieresiscyrillic: 0x04DE,
19479   Zeta: 0x0396,
19480   Zhearmenian: 0x053A,
19481   Zhebrevecyrillic: 0x04C1,
19482   Zhecyrillic: 0x0416,
19483   Zhedescendercyrillic: 0x0496,
19484   Zhedieresiscyrillic: 0x04DC,
19485   Zlinebelow: 0x1E94,
19486   Zmonospace: 0xFF3A,
19487   Zsmall: 0xF77A,
19488   Zstroke: 0x01B5,
19489   a: 0x0061,
19490   aabengali: 0x0986,
19491   aacute: 0x00E1,
19492   aadeva: 0x0906,
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,
19502   abengali: 0x0985,
19503   abopomofo: 0x311A,
19504   abreve: 0x0103,
19505   abreveacute: 0x1EAF,
19506   abrevecyrillic: 0x04D1,
19507   abrevedotbelow: 0x1EB7,
19508   abrevegrave: 0x1EB1,
19509   abrevehookabove: 0x1EB3,
19510   abrevetilde: 0x1EB5,
19511   acaron: 0x01CE,
19512   acircle: 0x24D0,
19513   acircumflex: 0x00E2,
19514   acircumflexacute: 0x1EA5,
19515   acircumflexdotbelow: 0x1EAD,
19516   acircumflexgrave: 0x1EA7,
19517   acircumflexhookabove: 0x1EA9,
19518   acircumflextilde: 0x1EAB,
19519   acute: 0x00B4,
19520   acutebelowcmb: 0x0317,
19521   acutecmb: 0x0301,
19522   acutecomb: 0x0301,
19523   acutedeva: 0x0954,
19524   acutelowmod: 0x02CF,
19525   acutetonecmb: 0x0341,
19526   acyrillic: 0x0430,
19527   adblgrave: 0x0201,
19528   addakgurmukhi: 0x0A71,
19529   adeva: 0x0905,
19530   adieresis: 0x00E4,
19531   adieresiscyrillic: 0x04D3,
19532   adieresismacron: 0x01DF,
19533   adotbelow: 0x1EA1,
19534   adotmacron: 0x01E1,
19535   ae: 0x00E6,
19536   aeacute: 0x01FD,
19537   aekorean: 0x3150,
19538   aemacron: 0x01E3,
19539   afii00208: 0x2015,
19540   afii08941: 0x20A4,
19541   afii10017: 0x0410,
19542   afii10018: 0x0411,
19543   afii10019: 0x0412,
19544   afii10020: 0x0413,
19545   afii10021: 0x0414,
19546   afii10022: 0x0415,
19547   afii10023: 0x0401,
19548   afii10024: 0x0416,
19549   afii10025: 0x0417,
19550   afii10026: 0x0418,
19551   afii10027: 0x0419,
19552   afii10028: 0x041A,
19553   afii10029: 0x041B,
19554   afii10030: 0x041C,
19555   afii10031: 0x041D,
19556   afii10032: 0x041E,
19557   afii10033: 0x041F,
19558   afii10034: 0x0420,
19559   afii10035: 0x0421,
19560   afii10036: 0x0422,
19561   afii10037: 0x0423,
19562   afii10038: 0x0424,
19563   afii10039: 0x0425,
19564   afii10040: 0x0426,
19565   afii10041: 0x0427,
19566   afii10042: 0x0428,
19567   afii10043: 0x0429,
19568   afii10044: 0x042A,
19569   afii10045: 0x042B,
19570   afii10046: 0x042C,
19571   afii10047: 0x042D,
19572   afii10048: 0x042E,
19573   afii10049: 0x042F,
19574   afii10050: 0x0490,
19575   afii10051: 0x0402,
19576   afii10052: 0x0403,
19577   afii10053: 0x0404,
19578   afii10054: 0x0405,
19579   afii10055: 0x0406,
19580   afii10056: 0x0407,
19581   afii10057: 0x0408,
19582   afii10058: 0x0409,
19583   afii10059: 0x040A,
19584   afii10060: 0x040B,
19585   afii10061: 0x040C,
19586   afii10062: 0x040E,
19587   afii10063: 0xF6C4,
19588   afii10064: 0xF6C5,
19589   afii10065: 0x0430,
19590   afii10066: 0x0431,
19591   afii10067: 0x0432,
19592   afii10068: 0x0433,
19593   afii10069: 0x0434,
19594   afii10070: 0x0435,
19595   afii10071: 0x0451,
19596   afii10072: 0x0436,
19597   afii10073: 0x0437,
19598   afii10074: 0x0438,
19599   afii10075: 0x0439,
19600   afii10076: 0x043A,
19601   afii10077: 0x043B,
19602   afii10078: 0x043C,
19603   afii10079: 0x043D,
19604   afii10080: 0x043E,
19605   afii10081: 0x043F,
19606   afii10082: 0x0440,
19607   afii10083: 0x0441,
19608   afii10084: 0x0442,
19609   afii10085: 0x0443,
19610   afii10086: 0x0444,
19611   afii10087: 0x0445,
19612   afii10088: 0x0446,
19613   afii10089: 0x0447,
19614   afii10090: 0x0448,
19615   afii10091: 0x0449,
19616   afii10092: 0x044A,
19617   afii10093: 0x044B,
19618   afii10094: 0x044C,
19619   afii10095: 0x044D,
19620   afii10096: 0x044E,
19621   afii10097: 0x044F,
19622   afii10098: 0x0491,
19623   afii10099: 0x0452,
19624   afii10100: 0x0453,
19625   afii10101: 0x0454,
19626   afii10102: 0x0455,
19627   afii10103: 0x0456,
19628   afii10104: 0x0457,
19629   afii10105: 0x0458,
19630   afii10106: 0x0459,
19631   afii10107: 0x045A,
19632   afii10108: 0x045B,
19633   afii10109: 0x045C,
19634   afii10110: 0x045E,
19635   afii10145: 0x040F,
19636   afii10146: 0x0462,
19637   afii10147: 0x0472,
19638   afii10148: 0x0474,
19639   afii10192: 0xF6C6,
19640   afii10193: 0x045F,
19641   afii10194: 0x0463,
19642   afii10195: 0x0473,
19643   afii10196: 0x0475,
19644   afii10831: 0xF6C7,
19645   afii10832: 0xF6C8,
19646   afii10846: 0x04D9,
19647   afii299: 0x200E,
19648   afii300: 0x200F,
19649   afii301: 0x200D,
19650   afii57381: 0x066A,
19651   afii57388: 0x060C,
19652   afii57392: 0x0660,
19653   afii57393: 0x0661,
19654   afii57394: 0x0662,
19655   afii57395: 0x0663,
19656   afii57396: 0x0664,
19657   afii57397: 0x0665,
19658   afii57398: 0x0666,
19659   afii57399: 0x0667,
19660   afii57400: 0x0668,
19661   afii57401: 0x0669,
19662   afii57403: 0x061B,
19663   afii57407: 0x061F,
19664   afii57409: 0x0621,
19665   afii57410: 0x0622,
19666   afii57411: 0x0623,
19667   afii57412: 0x0624,
19668   afii57413: 0x0625,
19669   afii57414: 0x0626,
19670   afii57415: 0x0627,
19671   afii57416: 0x0628,
19672   afii57417: 0x0629,
19673   afii57418: 0x062A,
19674   afii57419: 0x062B,
19675   afii57420: 0x062C,
19676   afii57421: 0x062D,
19677   afii57422: 0x062E,
19678   afii57423: 0x062F,
19679   afii57424: 0x0630,
19680   afii57425: 0x0631,
19681   afii57426: 0x0632,
19682   afii57427: 0x0633,
19683   afii57428: 0x0634,
19684   afii57429: 0x0635,
19685   afii57430: 0x0636,
19686   afii57431: 0x0637,
19687   afii57432: 0x0638,
19688   afii57433: 0x0639,
19689   afii57434: 0x063A,
19690   afii57440: 0x0640,
19691   afii57441: 0x0641,
19692   afii57442: 0x0642,
19693   afii57443: 0x0643,
19694   afii57444: 0x0644,
19695   afii57445: 0x0645,
19696   afii57446: 0x0646,
19697   afii57448: 0x0648,
19698   afii57449: 0x0649,
19699   afii57450: 0x064A,
19700   afii57451: 0x064B,
19701   afii57452: 0x064C,
19702   afii57453: 0x064D,
19703   afii57454: 0x064E,
19704   afii57455: 0x064F,
19705   afii57456: 0x0650,
19706   afii57457: 0x0651,
19707   afii57458: 0x0652,
19708   afii57470: 0x0647,
19709   afii57505: 0x06A4,
19710   afii57506: 0x067E,
19711   afii57507: 0x0686,
19712   afii57508: 0x0698,
19713   afii57509: 0x06AF,
19714   afii57511: 0x0679,
19715   afii57512: 0x0688,
19716   afii57513: 0x0691,
19717   afii57514: 0x06BA,
19718   afii57519: 0x06D2,
19719   afii57534: 0x06D5,
19720   afii57636: 0x20AA,
19721   afii57645: 0x05BE,
19722   afii57658: 0x05C3,
19723   afii57664: 0x05D0,
19724   afii57665: 0x05D1,
19725   afii57666: 0x05D2,
19726   afii57667: 0x05D3,
19727   afii57668: 0x05D4,
19728   afii57669: 0x05D5,
19729   afii57670: 0x05D6,
19730   afii57671: 0x05D7,
19731   afii57672: 0x05D8,
19732   afii57673: 0x05D9,
19733   afii57674: 0x05DA,
19734   afii57675: 0x05DB,
19735   afii57676: 0x05DC,
19736   afii57677: 0x05DD,
19737   afii57678: 0x05DE,
19738   afii57679: 0x05DF,
19739   afii57680: 0x05E0,
19740   afii57681: 0x05E1,
19741   afii57682: 0x05E2,
19742   afii57683: 0x05E3,
19743   afii57684: 0x05E4,
19744   afii57685: 0x05E5,
19745   afii57686: 0x05E6,
19746   afii57687: 0x05E7,
19747   afii57688: 0x05E8,
19748   afii57689: 0x05E9,
19749   afii57690: 0x05EA,
19750   afii57694: 0xFB2A,
19751   afii57695: 0xFB2B,
19752   afii57700: 0xFB4B,
19753   afii57705: 0xFB1F,
19754   afii57716: 0x05F0,
19755   afii57717: 0x05F1,
19756   afii57718: 0x05F2,
19757   afii57723: 0xFB35,
19758   afii57793: 0x05B4,
19759   afii57794: 0x05B5,
19760   afii57795: 0x05B6,
19761   afii57796: 0x05BB,
19762   afii57797: 0x05B8,
19763   afii57798: 0x05B7,
19764   afii57799: 0x05B0,
19765   afii57800: 0x05B2,
19766   afii57801: 0x05B1,
19767   afii57802: 0x05B3,
19768   afii57803: 0x05C2,
19769   afii57804: 0x05C1,
19770   afii57806: 0x05B9,
19771   afii57807: 0x05BC,
19772   afii57839: 0x05BD,
19773   afii57841: 0x05BF,
19774   afii57842: 0x05C0,
19775   afii57929: 0x02BC,
19776   afii61248: 0x2105,
19777   afii61289: 0x2113,
19778   afii61352: 0x2116,
19779   afii61573: 0x202C,
19780   afii61574: 0x202D,
19781   afii61575: 0x202E,
19782   afii61664: 0x200C,
19783   afii63167: 0x066D,
19784   afii64937: 0x02BD,
19785   agrave: 0x00E0,
19786   agujarati: 0x0A85,
19787   agurmukhi: 0x0A05,
19788   ahiragana: 0x3042,
19789   ahookabove: 0x1EA3,
19790   aibengali: 0x0990,
19791   aibopomofo: 0x311E,
19792   aideva: 0x0910,
19793   aiecyrillic: 0x04D5,
19794   aigujarati: 0x0A90,
19795   aigurmukhi: 0x0A10,
19796   aimatragurmukhi: 0x0A48,
19797   ainarabic: 0x0639,
19798   ainfinalarabic: 0xFECA,
19799   aininitialarabic: 0xFECB,
19800   ainmedialarabic: 0xFECC,
19801   ainvertedbreve: 0x0203,
19802   aivowelsignbengali: 0x09C8,
19803   aivowelsigndeva: 0x0948,
19804   aivowelsigngujarati: 0x0AC8,
19805   akatakana: 0x30A2,
19806   akatakanahalfwidth: 0xFF71,
19807   akorean: 0x314F,
19808   alef: 0x05D0,
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,
19826   aleph: 0x2135,
19827   allequal: 0x224C,
19828   alpha: 0x03B1,
19829   alphatonos: 0x03AC,
19830   amacron: 0x0101,
19831   amonospace: 0xFF41,
19832   ampersand: 0x0026,
19833   ampersandmonospace: 0xFF06,
19834   ampersandsmall: 0xF726,
19835   amsquare: 0x33C2,
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,
19841   angle: 0x2220,
19842   anglebracketleft: 0x3008,
19843   anglebracketleftvertical: 0xFE3F,
19844   anglebracketright: 0x3009,
19845   anglebracketrightvertical: 0xFE40,
19846   angleleft: 0x2329,
19847   angleright: 0x232A,
19848   angstrom: 0x212B,
19849   anoteleia: 0x0387,
19850   anudattadeva: 0x0952,
19851   anusvarabengali: 0x0982,
19852   anusvaradeva: 0x0902,
19853   anusvaragujarati: 0x0A82,
19854   aogonek: 0x0105,
19855   apaatosquare: 0x3300,
19856   aparen: 0x249C,
19857   apostrophearmenian: 0x055A,
19858   apostrophemod: 0x02BC,
19859   apple: 0xF8FF,
19860   approaches: 0x2250,
19861   approxequal: 0x2248,
19862   approxequalorimage: 0x2252,
19863   approximatelyequal: 0x2245,
19864   araeaekorean: 0x318E,
19865   araeakorean: 0x318D,
19866   arc: 0x2312,
19867   arighthalfring: 0x1E9A,
19868   aring: 0x00E5,
19869   aringacute: 0x01FB,
19870   aringbelow: 0x1E01,
19871   arrowboth: 0x2194,
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,
19881   arrowdown: 0x2193,
19882   arrowdownleft: 0x2199,
19883   arrowdownright: 0x2198,
19884   arrowdownwhite: 0x21E9,
19885   arrowheaddownmod: 0x02C5,
19886   arrowheadleftmod: 0x02C2,
19887   arrowheadrightmod: 0x02C3,
19888   arrowheadupmod: 0x02C4,
19889   arrowhorizex: 0xF8E7,
19890   arrowleft: 0x2190,
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,
19902   arrowup: 0x2191,
19903   arrowupdn: 0x2195,
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,
19915   ascript: 0x0251,
19916   ascriptturned: 0x0252,
19917   asmallhiragana: 0x3041,
19918   asmallkatakana: 0x30A1,
19919   asmallkatakanahalfwidth: 0xFF67,
19920   asterisk: 0x002A,
19921   asteriskaltonearabic: 0x066D,
19922   asteriskarabic: 0x066D,
19923   asteriskmath: 0x2217,
19924   asteriskmonospace: 0xFF0A,
19925   asterisksmall: 0xFE61,
19926   asterism: 0x2042,
19927   asuperior: 0xF6E9,
19928   asymptoticallyequal: 0x2243,
19929   at: 0x0040,
19930   atilde: 0x00E3,
19931   atmonospace: 0xFF20,
19932   atsmall: 0xFE6B,
19933   aturned: 0x0250,
19934   aubengali: 0x0994,
19935   aubopomofo: 0x3120,
19936   audeva: 0x0914,
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,
19946   ayin: 0x05E2,
19947   ayinaltonehebrew: 0xFB20,
19948   ayinhebrew: 0x05E2,
19949   b: 0x0062,
19950   babengali: 0x09AC,
19951   backslash: 0x005C,
19952   backslashmonospace: 0xFF3C,
19953   badeva: 0x092C,
19954   bagujarati: 0x0AAC,
19955   bagurmukhi: 0x0A2C,
19956   bahiragana: 0x3070,
19957   bahtthai: 0x0E3F,
19958   bakatakana: 0x30D0,
19959   bar: 0x007C,
19960   barmonospace: 0xFF5C,
19961   bbopomofo: 0x3105,
19962   bcircle: 0x24D1,
19963   bdotaccent: 0x1E03,
19964   bdotbelow: 0x1E05,
19965   beamedsixteenthnotes: 0x266C,
19966   because: 0x2235,
19967   becyrillic: 0x0431,
19968   beharabic: 0x0628,
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,
19978   bet: 0x05D1,
19979   beta: 0x03B2,
19980   betasymbolgreek: 0x03D0,
19981   betdagesh: 0xFB31,
19982   betdageshhebrew: 0xFB31,
19983   bethebrew: 0x05D1,
19984   betrafehebrew: 0xFB4C,
19985   bhabengali: 0x09AD,
19986   bhadeva: 0x092D,
19987   bhagujarati: 0x0AAD,
19988   bhagurmukhi: 0x0A2D,
19989   bhook: 0x0253,
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,
20012   blackstar: 0x2605,
20013   blackupperlefttriangle: 0x25E4,
20014   blackupperrighttriangle: 0x25E5,
20015   blackuppointingsmalltriangle: 0x25B4,
20016   blackuppointingtriangle: 0x25B2,
20017   blank: 0x2423,
20018   blinebelow: 0x1E07,
20019   block: 0x2588,
20020   bmonospace: 0xFF42,
20021   bobaimaithai: 0x0E1A,
20022   bohiragana: 0x307C,
20023   bokatakana: 0x30DC,
20024   bparen: 0x249D,
20025   bqsquare: 0x33C3,
20026   braceex: 0xF8F4,
20027   braceleft: 0x007B,
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,
20051   breve: 0x02D8,
20052   brevebelowcmb: 0x032E,
20053   brevecmb: 0x0306,
20054   breveinvertedbelowcmb: 0x032F,
20055   breveinvertedcmb: 0x0311,
20056   breveinverteddoublecmb: 0x0361,
20057   bridgebelowcmb: 0x032A,
20058   bridgeinvertedbelowcmb: 0x033A,
20059   brokenbar: 0x00A6,
20060   bstroke: 0x0180,
20061   bsuperior: 0xF6EA,
20062   btopbar: 0x0183,
20063   buhiragana: 0x3076,
20064   bukatakana: 0x30D6,
20065   bullet: 0x2022,
20066   bulletinverse: 0x25D8,
20067   bulletoperator: 0x2219,
20068   bullseye: 0x25CE,
20069   c: 0x0063,
20070   caarmenian: 0x056E,
20071   cabengali: 0x099A,
20072   cacute: 0x0107,
20073   cadeva: 0x091A,
20074   cagujarati: 0x0A9A,
20075   cagurmukhi: 0x0A1A,
20076   calsquare: 0x3388,
20077   candrabindubengali: 0x0981,
20078   candrabinducmb: 0x0310,
20079   candrabindudeva: 0x0901,
20080   candrabindugujarati: 0x0A81,
20081   capslock: 0x21EA,
20082   careof: 0x2105,
20083   caron: 0x02C7,
20084   caronbelowcmb: 0x032C,
20085   caroncmb: 0x030C,
20086   carriagereturn: 0x21B5,
20087   cbopomofo: 0x3118,
20088   ccaron: 0x010D,
20089   ccedilla: 0x00E7,
20090   ccedillaacute: 0x1E09,
20091   ccircle: 0x24D2,
20092   ccircumflex: 0x0109,
20093   ccurl: 0x0255,
20094   cdot: 0x010B,
20095   cdotaccent: 0x010B,
20096   cdsquare: 0x33C5,
20097   cedilla: 0x00B8,
20098   cedillacmb: 0x0327,
20099   cent: 0x00A2,
20100   centigrade: 0x2103,
20101   centinferior: 0xF6DF,
20102   centmonospace: 0xFFE0,
20103   centoldstyle: 0xF7A2,
20104   centsuperior: 0xF6E0,
20105   chaarmenian: 0x0579,
20106   chabengali: 0x099B,
20107   chadeva: 0x091B,
20108   chagujarati: 0x0A9B,
20109   chagurmukhi: 0x0A1B,
20110   chbopomofo: 0x3114,
20111   cheabkhasiancyrillic: 0x04BD,
20112   checkmark: 0x2713,
20113   checyrillic: 0x0447,
20114   chedescenderabkhasiancyrillic: 0x04BF,
20115   chedescendercyrillic: 0x04B7,
20116   chedieresiscyrillic: 0x04F5,
20117   cheharmenian: 0x0573,
20118   chekhakassiancyrillic: 0x04CC,
20119   cheverticalstrokecyrillic: 0x04B9,
20120   chi: 0x03C7,
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,
20130   chook: 0x0188,
20131   cieucacirclekorean: 0x3276,
20132   cieucaparenkorean: 0x3216,
20133   cieuccirclekorean: 0x3268,
20134   cieuckorean: 0x3148,
20135   cieucparenkorean: 0x3208,
20136   cieucuparenkorean: 0x321C,
20137   circle: 0x25CB,
20138   circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
20139   circlemultiply: 0x2297,
20140   circleot: 0x2299,
20141   circleplus: 0x2295,
20142   circlepostalmark: 0x3036,
20143   circlewithlefthalfblack: 0x25D0,
20144   circlewithrighthalfblack: 0x25D1,
20145   circumflex: 0x02C6,
20146   circumflexbelowcmb: 0x032D,
20147   circumflexcmb: 0x0302,
20148   clear: 0x2327,
20149   clickalveolar: 0x01C2,
20150   clickdental: 0x01C0,
20151   clicklateral: 0x01C1,
20152   clickretroflex: 0x01C3,
20153   club: 0x2663,
20154   clubsuitblack: 0x2663,
20155   clubsuitwhite: 0x2667,
20156   cmcubedsquare: 0x33A4,
20157   cmonospace: 0xFF43,
20158   cmsquaredsquare: 0x33A0,
20159   coarmenian: 0x0581,
20160   colon: 0x003A,
20161   colonmonetary: 0x20A1,
20162   colonmonospace: 0xFF1A,
20163   colonsign: 0x20A1,
20164   colonsmall: 0xFE55,
20165   colontriangularhalfmod: 0x02D1,
20166   colontriangularmod: 0x02D0,
20167   comma: 0x002C,
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,
20181   compass: 0x263C,
20182   congruent: 0x2245,
20183   contourintegral: 0x222E,
20184   control: 0x2303,
20185   controlACK: 0x0006,
20186   controlBEL: 0x0007,
20187   controlBS: 0x0008,
20188   controlCAN: 0x0018,
20189   controlCR: 0x000D,
20190   controlDC1: 0x0011,
20191   controlDC2: 0x0012,
20192   controlDC3: 0x0013,
20193   controlDC4: 0x0014,
20194   controlDEL: 0x007F,
20195   controlDLE: 0x0010,
20196   controlEM: 0x0019,
20197   controlENQ: 0x0005,
20198   controlEOT: 0x0004,
20199   controlESC: 0x001B,
20200   controlETB: 0x0017,
20201   controlETX: 0x0003,
20202   controlFF: 0x000C,
20203   controlFS: 0x001C,
20204   controlGS: 0x001D,
20205   controlHT: 0x0009,
20206   controlLF: 0x000A,
20207   controlNAK: 0x0015,
20208   controlRS: 0x001E,
20209   controlSI: 0x000F,
20210   controlSO: 0x000E,
20211   controlSOT: 0x0002,
20212   controlSTX: 0x0001,
20213   controlSUB: 0x001A,
20214   controlSYN: 0x0016,
20215   controlUS: 0x001F,
20216   controlVT: 0x000B,
20217   copyright: 0x00A9,
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,
20227   cosquare: 0x33C7,
20228   coverkgsquare: 0x33C6,
20229   cparen: 0x249E,
20230   cruzeiro: 0x20A2,
20231   cstretched: 0x0297,
20232   curlyand: 0x22CF,
20233   curlyor: 0x22CE,
20234   currency: 0x00A4,
20235   cyrBreve: 0xF6D1,
20236   cyrFlex: 0xF6D2,
20237   cyrbreve: 0xF6D4,
20238   cyrflex: 0xF6D5,
20239   d: 0x0064,
20240   daarmenian: 0x0564,
20241   dabengali: 0x09A6,
20242   dadarabic: 0x0636,
20243   dadeva: 0x0926,
20244   dadfinalarabic: 0xFEBE,
20245   dadinitialarabic: 0xFEBF,
20246   dadmedialarabic: 0xFEC0,
20247   dagesh: 0x05BC,
20248   dageshhebrew: 0x05BC,
20249   dagger: 0x2020,
20250   daggerdbl: 0x2021,
20251   dagujarati: 0x0AA6,
20252   dagurmukhi: 0x0A26,
20253   dahiragana: 0x3060,
20254   dakatakana: 0x30C0,
20255   dalarabic: 0x062F,
20256   dalet: 0x05D3,
20257   daletdagesh: 0xFB33,
20258   daletdageshhebrew: 0xFB33,
20259   dalethebrew: 0x05D3,
20260   dalfinalarabic: 0xFEAA,
20261   dammaarabic: 0x064F,
20262   dammalowarabic: 0x064F,
20263   dammatanaltonearabic: 0x064C,
20264   dammatanarabic: 0x064C,
20265   danda: 0x0964,
20266   dargahebrew: 0x05A7,
20267   dargalefthebrew: 0x05A7,
20268   dasiapneumatacyrilliccmb: 0x0485,
20269   dblGrave: 0xF6D3,
20270   dblanglebracketleft: 0x300A,
20271   dblanglebracketleftvertical: 0xFE3D,
20272   dblanglebracketright: 0x300B,
20273   dblanglebracketrightvertical: 0xFE3E,
20274   dblarchinvertedbelowcmb: 0x032B,
20275   dblarrowleft: 0x21D4,
20276   dblarrowright: 0x21D2,
20277   dbldanda: 0x0965,
20278   dblgrave: 0xF6D6,
20279   dblgravecmb: 0x030F,
20280   dblintegral: 0x222C,
20281   dbllowline: 0x2017,
20282   dbllowlinecmb: 0x0333,
20283   dbloverlinecmb: 0x033F,
20284   dblprimemod: 0x02BA,
20285   dblverticalbar: 0x2016,
20286   dblverticallineabovecmb: 0x030E,
20287   dbopomofo: 0x3109,
20288   dbsquare: 0x33C8,
20289   dcaron: 0x010F,
20290   dcedilla: 0x1E11,
20291   dcircle: 0x24D3,
20292   dcircumflexbelow: 0x1E13,
20293   dcroat: 0x0111,
20294   ddabengali: 0x09A1,
20295   ddadeva: 0x0921,
20296   ddagujarati: 0x0AA1,
20297   ddagurmukhi: 0x0A21,
20298   ddalarabic: 0x0688,
20299   ddalfinalarabic: 0xFB89,
20300   dddhadeva: 0x095C,
20301   ddhabengali: 0x09A2,
20302   ddhadeva: 0x0922,
20303   ddhagujarati: 0x0AA2,
20304   ddhagurmukhi: 0x0A22,
20305   ddotaccent: 0x1E0B,
20306   ddotbelow: 0x1E0D,
20307   decimalseparatorarabic: 0x066B,
20308   decimalseparatorpersian: 0x066B,
20309   decyrillic: 0x0434,
20310   degree: 0x00B0,
20311   dehihebrew: 0x05AD,
20312   dehiragana: 0x3067,
20313   deicoptic: 0x03EF,
20314   dekatakana: 0x30C7,
20315   deleteleft: 0x232B,
20316   deleteright: 0x2326,
20317   delta: 0x03B4,
20318   deltaturned: 0x018D,
20319   denominatorminusonenumeratorbengali: 0x09F8,
20320   dezh: 0x02A4,
20321   dhabengali: 0x09A7,
20322   dhadeva: 0x0927,
20323   dhagujarati: 0x0AA7,
20324   dhagurmukhi: 0x0A27,
20325   dhook: 0x0257,
20326   dialytikatonos: 0x0385,
20327   dialytikatonoscmb: 0x0344,
20328   diamond: 0x2666,
20329   diamondsuitwhite: 0x2662,
20330   dieresis: 0x00A8,
20331   dieresisacute: 0xF6D7,
20332   dieresisbelowcmb: 0x0324,
20333   dieresiscmb: 0x0308,
20334   dieresisgrave: 0xF6D8,
20335   dieresistonos: 0x0385,
20336   dihiragana: 0x3062,
20337   dikatakana: 0x30C2,
20338   dittomark: 0x3003,
20339   divide: 0x00F7,
20340   divides: 0x2223,
20341   divisionslash: 0x2215,
20342   djecyrillic: 0x0452,
20343   dkshade: 0x2593,
20344   dlinebelow: 0x1E0F,
20345   dlsquare: 0x3397,
20346   dmacron: 0x0111,
20347   dmonospace: 0xFF44,
20348   dnblock: 0x2584,
20349   dochadathai: 0x0E0E,
20350   dodekthai: 0x0E14,
20351   dohiragana: 0x3069,
20352   dokatakana: 0x30C9,
20353   dollar: 0x0024,
20354   dollarinferior: 0xF6E3,
20355   dollarmonospace: 0xFF04,
20356   dollaroldstyle: 0xF724,
20357   dollarsmall: 0xFE69,
20358   dollarsuperior: 0xF6E4,
20359   dong: 0x20AB,
20360   dorusquare: 0x3326,
20361   dotaccent: 0x02D9,
20362   dotaccentcmb: 0x0307,
20363   dotbelowcmb: 0x0323,
20364   dotbelowcomb: 0x0323,
20365   dotkatakana: 0x30FB,
20366   dotlessi: 0x0131,
20367   dotlessj: 0xF6BE,
20368   dotlessjstrokehook: 0x0284,
20369   dotmath: 0x22C5,
20370   dottedcircle: 0x25CC,
20371   doubleyodpatah: 0xFB1F,
20372   doubleyodpatahhebrew: 0xFB1F,
20373   downtackbelowcmb: 0x031E,
20374   downtackmod: 0x02D5,
20375   dparen: 0x249F,
20376   dsuperior: 0xF6EB,
20377   dtail: 0x0256,
20378   dtopbar: 0x018C,
20379   duhiragana: 0x3065,
20380   dukatakana: 0x30C5,
20381   dz: 0x01F3,
20382   dzaltone: 0x02A3,
20383   dzcaron: 0x01C6,
20384   dzcurl: 0x02A5,
20385   dzeabkhasiancyrillic: 0x04E1,
20386   dzecyrillic: 0x0455,
20387   dzhecyrillic: 0x045F,
20388   e: 0x0065,
20389   eacute: 0x00E9,
20390   earth: 0x2641,
20391   ebengali: 0x098F,
20392   ebopomofo: 0x311C,
20393   ebreve: 0x0115,
20394   ecandradeva: 0x090D,
20395   ecandragujarati: 0x0A8D,
20396   ecandravowelsigndeva: 0x0945,
20397   ecandravowelsigngujarati: 0x0AC5,
20398   ecaron: 0x011B,
20399   ecedillabreve: 0x1E1D,
20400   echarmenian: 0x0565,
20401   echyiwnarmenian: 0x0587,
20402   ecircle: 0x24D4,
20403   ecircumflex: 0x00EA,
20404   ecircumflexacute: 0x1EBF,
20405   ecircumflexbelow: 0x1E19,
20406   ecircumflexdotbelow: 0x1EC7,
20407   ecircumflexgrave: 0x1EC1,
20408   ecircumflexhookabove: 0x1EC3,
20409   ecircumflextilde: 0x1EC5,
20410   ecyrillic: 0x0454,
20411   edblgrave: 0x0205,
20412   edeva: 0x090F,
20413   edieresis: 0x00EB,
20414   edot: 0x0117,
20415   edotaccent: 0x0117,
20416   edotbelow: 0x1EB9,
20417   eegurmukhi: 0x0A0F,
20418   eematragurmukhi: 0x0A47,
20419   efcyrillic: 0x0444,
20420   egrave: 0x00E8,
20421   egujarati: 0x0A8F,
20422   eharmenian: 0x0567,
20423   ehbopomofo: 0x311D,
20424   ehiragana: 0x3048,
20425   ehookabove: 0x1EBB,
20426   eibopomofo: 0x311F,
20427   eight: 0x0038,
20428   eightarabic: 0x0668,
20429   eightbengali: 0x09EE,
20430   eightcircle: 0x2467,
20431   eightcircleinversesansserif: 0x2791,
20432   eightdeva: 0x096E,
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,
20450   eightthai: 0x0E58,
20451   einvertedbreve: 0x0207,
20452   eiotifiedcyrillic: 0x0465,
20453   ekatakana: 0x30A8,
20454   ekatakanahalfwidth: 0xFF74,
20455   ekonkargurmukhi: 0x0A74,
20456   ekorean: 0x3154,
20457   elcyrillic: 0x043B,
20458   element: 0x2208,
20459   elevencircle: 0x246A,
20460   elevenparen: 0x247E,
20461   elevenperiod: 0x2492,
20462   elevenroman: 0x217A,
20463   ellipsis: 0x2026,
20464   ellipsisvertical: 0x22EE,
20465   emacron: 0x0113,
20466   emacronacute: 0x1E17,
20467   emacrongrave: 0x1E15,
20468   emcyrillic: 0x043C,
20469   emdash: 0x2014,
20470   emdashvertical: 0xFE31,
20471   emonospace: 0xFF45,
20472   emphasismarkarmenian: 0x055B,
20473   emptyset: 0x2205,
20474   enbopomofo: 0x3123,
20475   encyrillic: 0x043D,
20476   endash: 0x2013,
20477   endashvertical: 0xFE32,
20478   endescendercyrillic: 0x04A3,
20479   eng: 0x014B,
20480   engbopomofo: 0x3125,
20481   enghecyrillic: 0x04A5,
20482   enhookcyrillic: 0x04C8,
20483   enspace: 0x2002,
20484   eogonek: 0x0119,
20485   eokorean: 0x3153,
20486   eopen: 0x025B,
20487   eopenclosed: 0x029A,
20488   eopenreversed: 0x025C,
20489   eopenreversedclosed: 0x025E,
20490   eopenreversedhook: 0x025D,
20491   eparen: 0x24A0,
20492   epsilon: 0x03B5,
20493   epsilontonos: 0x03AD,
20494   equal: 0x003D,
20495   equalmonospace: 0xFF1D,
20496   equalsmall: 0xFE66,
20497   equalsuperior: 0x207C,
20498   equivalence: 0x2261,
20499   erbopomofo: 0x3126,
20500   ercyrillic: 0x0440,
20501   ereversed: 0x0258,
20502   ereversedcyrillic: 0x044D,
20503   escyrillic: 0x0441,
20504   esdescendercyrillic: 0x04AB,
20505   esh: 0x0283,
20506   eshcurl: 0x0286,
20507   eshortdeva: 0x090E,
20508   eshortvowelsigndeva: 0x0946,
20509   eshreversedloop: 0x01AA,
20510   eshsquatreversed: 0x0285,
20511   esmallhiragana: 0x3047,
20512   esmallkatakana: 0x30A7,
20513   esmallkatakanahalfwidth: 0xFF6A,
20514   estimated: 0x212E,
20515   esuperior: 0xF6EC,
20516   eta: 0x03B7,
20517   etarmenian: 0x0568,
20518   etatonos: 0x03AE,
20519   eth: 0x00F0,
20520   etilde: 0x1EBD,
20521   etildebelow: 0x1E1B,
20522   etnahtafoukhhebrew: 0x0591,
20523   etnahtafoukhlefthebrew: 0x0591,
20524   etnahtahebrew: 0x0591,
20525   etnahtalefthebrew: 0x0591,
20526   eturned: 0x01DD,
20527   eukorean: 0x3161,
20528   euro: 0x20AC,
20529   evowelsignbengali: 0x09C7,
20530   evowelsigndeva: 0x0947,
20531   evowelsigngujarati: 0x0AC7,
20532   exclam: 0x0021,
20533   exclamarmenian: 0x055C,
20534   exclamdbl: 0x203C,
20535   exclamdown: 0x00A1,
20536   exclamdownsmall: 0xF7A1,
20537   exclammonospace: 0xFF01,
20538   exclamsmall: 0xF721,
20539   existential: 0x2203,
20540   ezh: 0x0292,
20541   ezhcaron: 0x01EF,
20542   ezhcurl: 0x0293,
20543   ezhreversed: 0x01B9,
20544   ezhtail: 0x01BA,
20545   f: 0x0066,
20546   fadeva: 0x095E,
20547   fagurmukhi: 0x0A5E,
20548   fahrenheit: 0x2109,
20549   fathaarabic: 0x064E,
20550   fathalowarabic: 0x064E,
20551   fathatanarabic: 0x064B,
20552   fbopomofo: 0x3108,
20553   fcircle: 0x24D5,
20554   fdotaccent: 0x1E1F,
20555   feharabic: 0x0641,
20556   feharmenian: 0x0586,
20557   fehfinalarabic: 0xFED2,
20558   fehinitialarabic: 0xFED3,
20559   fehmedialarabic: 0xFED4,
20560   feicoptic: 0x03E5,
20561   female: 0x2640,
20562   ff: 0xFB00,
20563   ffi: 0xFB03,
20564   ffl: 0xFB04,
20565   fi: 0xFB01,
20566   fifteencircle: 0x246E,
20567   fifteenparen: 0x2482,
20568   fifteenperiod: 0x2496,
20569   figuredash: 0x2012,
20570   filledbox: 0x25A0,
20571   filledrect: 0x25AC,
20572   finalkaf: 0x05DA,
20573   finalkafdagesh: 0xFB3A,
20574   finalkafdageshhebrew: 0xFB3A,
20575   finalkafhebrew: 0x05DA,
20576   finalmem: 0x05DD,
20577   finalmemhebrew: 0x05DD,
20578   finalnun: 0x05DF,
20579   finalnunhebrew: 0x05DF,
20580   finalpe: 0x05E3,
20581   finalpehebrew: 0x05E3,
20582   finaltsadi: 0x05E5,
20583   finaltsadihebrew: 0x05E5,
20584   firsttonechinese: 0x02C9,
20585   fisheye: 0x25C9,
20586   fitacyrillic: 0x0473,
20587   five: 0x0035,
20588   fivearabic: 0x0665,
20589   fivebengali: 0x09EB,
20590   fivecircle: 0x2464,
20591   fivecircleinversesansserif: 0x278E,
20592   fivedeva: 0x096B,
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,
20602   fiveparen: 0x2478,
20603   fiveperiod: 0x248C,
20604   fivepersian: 0x06F5,
20605   fiveroman: 0x2174,
20606   fivesuperior: 0x2075,
20607   fivethai: 0x0E55,
20608   fl: 0xFB02,
20609   florin: 0x0192,
20610   fmonospace: 0xFF46,
20611   fmsquare: 0x3399,
20612   fofanthai: 0x0E1F,
20613   fofathai: 0x0E1D,
20614   fongmanthai: 0x0E4F,
20615   forall: 0x2200,
20616   four: 0x0034,
20617   fourarabic: 0x0664,
20618   fourbengali: 0x09EA,
20619   fourcircle: 0x2463,
20620   fourcircleinversesansserif: 0x278D,
20621   fourdeva: 0x096A,
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,
20631   fourparen: 0x2477,
20632   fourperiod: 0x248B,
20633   fourpersian: 0x06F4,
20634   fourroman: 0x2173,
20635   foursuperior: 0x2074,
20636   fourteencircle: 0x246D,
20637   fourteenparen: 0x2481,
20638   fourteenperiod: 0x2495,
20639   fourthai: 0x0E54,
20640   fourthtonechinese: 0x02CB,
20641   fparen: 0x24A1,
20642   fraction: 0x2044,
20643   franc: 0x20A3,
20644   g: 0x0067,
20645   gabengali: 0x0997,
20646   gacute: 0x01F5,
20647   gadeva: 0x0917,
20648   gafarabic: 0x06AF,
20649   gaffinalarabic: 0xFB93,
20650   gafinitialarabic: 0xFB94,
20651   gafmedialarabic: 0xFB95,
20652   gagujarati: 0x0A97,
20653   gagurmukhi: 0x0A17,
20654   gahiragana: 0x304C,
20655   gakatakana: 0x30AC,
20656   gamma: 0x03B3,
20657   gammalatinsmall: 0x0263,
20658   gammasuperior: 0x02E0,
20659   gangiacoptic: 0x03EB,
20660   gbopomofo: 0x310D,
20661   gbreve: 0x011F,
20662   gcaron: 0x01E7,
20663   gcedilla: 0x0123,
20664   gcircle: 0x24D6,
20665   gcircumflex: 0x011D,
20666   gcommaaccent: 0x0123,
20667   gdot: 0x0121,
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,
20679   getamark: 0x3013,
20680   ghabengali: 0x0998,
20681   ghadarmenian: 0x0572,
20682   ghadeva: 0x0918,
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,
20692   ghhadeva: 0x095A,
20693   ghhagurmukhi: 0x0A5A,
20694   ghook: 0x0260,
20695   ghzsquare: 0x3393,
20696   gihiragana: 0x304E,
20697   gikatakana: 0x30AE,
20698   gimarmenian: 0x0563,
20699   gimel: 0x05D2,
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,
20713   gmacron: 0x1E21,
20714   gmonospace: 0xFF47,
20715   gohiragana: 0x3054,
20716   gokatakana: 0x30B4,
20717   gparen: 0x24A2,
20718   gpasquare: 0x33AC,
20719   gradient: 0x2207,
20720   grave: 0x0060,
20721   gravebelowcmb: 0x0316,
20722   gravecmb: 0x0300,
20723   gravecomb: 0x0300,
20724   gravedeva: 0x0953,
20725   gravelowmod: 0x02CE,
20726   gravemonospace: 0xFF40,
20727   gravetonecmb: 0x0340,
20728   greater: 0x003E,
20729   greaterequal: 0x2265,
20730   greaterequalorless: 0x22DB,
20731   greatermonospace: 0xFF1E,
20732   greaterorequivalent: 0x2273,
20733   greaterorless: 0x2277,
20734   greateroverequal: 0x2267,
20735   greatersmall: 0xFE65,
20736   gscript: 0x0261,
20737   gstroke: 0x01E5,
20738   guhiragana: 0x3050,
20739   guillemotleft: 0x00AB,
20740   guillemotright: 0x00BB,
20741   guilsinglleft: 0x2039,
20742   guilsinglright: 0x203A,
20743   gukatakana: 0x30B0,
20744   guramusquare: 0x3318,
20745   gysquare: 0x33C9,
20746   h: 0x0068,
20747   haabkhasiancyrillic: 0x04A9,
20748   haaltonearabic: 0x06C1,
20749   habengali: 0x09B9,
20750   hadescendercyrillic: 0x04B3,
20751   hadeva: 0x0939,
20752   hagujarati: 0x0AB9,
20753   hagurmukhi: 0x0A39,
20754   haharabic: 0x062D,
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,
20769   hasquare: 0x33CA,
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,
20794   hbar: 0x0127,
20795   hbopomofo: 0x310F,
20796   hbrevebelow: 0x1E2B,
20797   hcedilla: 0x1E29,
20798   hcircle: 0x24D7,
20799   hcircumflex: 0x0125,
20800   hdieresis: 0x1E27,
20801   hdotaccent: 0x1E23,
20802   hdotbelow: 0x1E25,
20803   he: 0x05D4,
20804   heart: 0x2665,
20805   heartsuitblack: 0x2665,
20806   heartsuitwhite: 0x2661,
20807   hedagesh: 0xFB34,
20808   hedageshhebrew: 0xFB34,
20809   hehaltonearabic: 0x06C1,
20810   heharabic: 0x0647,
20811   hehebrew: 0x05D4,
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,
20826   henghook: 0x0267,
20827   herutusquare: 0x3339,
20828   het: 0x05D7,
20829   hethebrew: 0x05D7,
20830   hhook: 0x0266,
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,
20840   hiriq: 0x05B4,
20841   hiriq14: 0x05B4,
20842   hiriq21: 0x05B4,
20843   hiriq2d: 0x05B4,
20844   hiriqhebrew: 0x05B4,
20845   hiriqnarrowhebrew: 0x05B4,
20846   hiriqquarterhebrew: 0x05B4,
20847   hiriqwidehebrew: 0x05B4,
20848   hlinebelow: 0x1E96,
20849   hmonospace: 0xFF48,
20850   hoarmenian: 0x0570,
20851   hohipthai: 0x0E2B,
20852   hohiragana: 0x307B,
20853   hokatakana: 0x30DB,
20854   hokatakanahalfwidth: 0xFF8E,
20855   holam: 0x05B9,
20856   holam19: 0x05B9,
20857   holam26: 0x05B9,
20858   holam32: 0x05B9,
20859   holamhebrew: 0x05B9,
20860   holamnarrowhebrew: 0x05B9,
20861   holamquarterhebrew: 0x05B9,
20862   holamwidehebrew: 0x05B9,
20863   honokhukthai: 0x0E2E,
20864   hookabovecomb: 0x0309,
20865   hookcmb: 0x0309,
20866   hookpalatalizedbelowcmb: 0x0321,
20867   hookretroflexbelowcmb: 0x0322,
20868   hoonsquare: 0x3342,
20869   horicoptic: 0x03E9,
20870   horizontalbar: 0x2015,
20871   horncmb: 0x031B,
20872   hotsprings: 0x2668,
20873   house: 0x2302,
20874   hparen: 0x24A3,
20875   hsuperior: 0x02B0,
20876   hturned: 0x0265,
20877   huhiragana: 0x3075,
20878   huiitosquare: 0x3333,
20879   hukatakana: 0x30D5,
20880   hukatakanahalfwidth: 0xFF8C,
20881   hungarumlaut: 0x02DD,
20882   hungarumlautcmb: 0x030B,
20883   hv: 0x0195,
20884   hyphen: 0x002D,
20885   hypheninferior: 0xF6E5,
20886   hyphenmonospace: 0xFF0D,
20887   hyphensmall: 0xFE63,
20888   hyphensuperior: 0xF6E6,
20889   hyphentwo: 0x2010,
20890   i: 0x0069,
20891   iacute: 0x00ED,
20892   iacyrillic: 0x044F,
20893   ibengali: 0x0987,
20894   ibopomofo: 0x3127,
20895   ibreve: 0x012D,
20896   icaron: 0x01D0,
20897   icircle: 0x24D8,
20898   icircumflex: 0x00EE,
20899   icyrillic: 0x0456,
20900   idblgrave: 0x0209,
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,
20953   ideva: 0x0907,
20954   idieresis: 0x00EF,
20955   idieresisacute: 0x1E2F,
20956   idieresiscyrillic: 0x04E5,
20957   idotbelow: 0x1ECB,
20958   iebrevecyrillic: 0x04D7,
20959   iecyrillic: 0x0435,
20960   ieungacirclekorean: 0x3275,
20961   ieungaparenkorean: 0x3215,
20962   ieungcirclekorean: 0x3267,
20963   ieungkorean: 0x3147,
20964   ieungparenkorean: 0x3207,
20965   igrave: 0x00EC,
20966   igujarati: 0x0A87,
20967   igurmukhi: 0x0A07,
20968   ihiragana: 0x3044,
20969   ihookabove: 0x1EC9,
20970   iibengali: 0x0988,
20971   iicyrillic: 0x0438,
20972   iideva: 0x0908,
20973   iigujarati: 0x0A88,
20974   iigurmukhi: 0x0A08,
20975   iimatragurmukhi: 0x0A40,
20976   iinvertedbreve: 0x020B,
20977   iishortcyrillic: 0x0439,
20978   iivowelsignbengali: 0x09C0,
20979   iivowelsigndeva: 0x0940,
20980   iivowelsigngujarati: 0x0AC0,
20981   ij: 0x0133,
20982   ikatakana: 0x30A4,
20983   ikatakanahalfwidth: 0xFF72,
20984   ikorean: 0x3163,
20985   ilde: 0x02DC,
20986   iluyhebrew: 0x05AC,
20987   imacron: 0x012B,
20988   imacroncyrillic: 0x04E3,
20989   imageorapproximatelyequal: 0x2253,
20990   imatragurmukhi: 0x0A3F,
20991   imonospace: 0xFF49,
20992   increment: 0x2206,
20993   infinity: 0x221E,
20994   iniarmenian: 0x056B,
20995   integral: 0x222B,
20996   integralbottom: 0x2321,
20997   integralbt: 0x2321,
20998   integralex: 0xF8F5,
20999   integraltop: 0x2320,
21000   integraltp: 0x2320,
21001   intersection: 0x2229,
21002   intisquare: 0x3305,
21003   invbullet: 0x25D8,
21004   invcircle: 0x25D9,
21005   invsmileface: 0x263B,
21006   iocyrillic: 0x0451,
21007   iogonek: 0x012F,
21008   iota: 0x03B9,
21009   iotadieresis: 0x03CA,
21010   iotadieresistonos: 0x0390,
21011   iotalatin: 0x0269,
21012   iotatonos: 0x03AF,
21013   iparen: 0x24A4,
21014   irigurmukhi: 0x0A72,
21015   ismallhiragana: 0x3043,
21016   ismallkatakana: 0x30A3,
21017   ismallkatakanahalfwidth: 0xFF68,
21018   issharbengali: 0x09FA,
21019   istroke: 0x0268,
21020   isuperior: 0xF6ED,
21021   iterationhiragana: 0x309D,
21022   iterationkatakana: 0x30FD,
21023   itilde: 0x0129,
21024   itildebelow: 0x1E2D,
21025   iubopomofo: 0x3129,
21026   iucyrillic: 0x044E,
21027   ivowelsignbengali: 0x09BF,
21028   ivowelsigndeva: 0x093F,
21029   ivowelsigngujarati: 0x0ABF,
21030   izhitsacyrillic: 0x0475,
21031   izhitsadblgravecyrillic: 0x0477,
21032   j: 0x006A,
21033   jaarmenian: 0x0571,
21034   jabengali: 0x099C,
21035   jadeva: 0x091C,
21036   jagujarati: 0x0A9C,
21037   jagurmukhi: 0x0A1C,
21038   jbopomofo: 0x3110,
21039   jcaron: 0x01F0,
21040   jcircle: 0x24D9,
21041   jcircumflex: 0x0135,
21042   jcrossedtail: 0x029D,
21043   jdotlessstroke: 0x025F,
21044   jecyrillic: 0x0458,
21045   jeemarabic: 0x062C,
21046   jeemfinalarabic: 0xFE9E,
21047   jeeminitialarabic: 0xFE9F,
21048   jeemmedialarabic: 0xFEA0,
21049   jeharabic: 0x0698,
21050   jehfinalarabic: 0xFB8B,
21051   jhabengali: 0x099D,
21052   jhadeva: 0x091D,
21053   jhagujarati: 0x0A9D,
21054   jhagurmukhi: 0x0A1D,
21055   jheharmenian: 0x057B,
21056   jis: 0x3004,
21057   jmonospace: 0xFF4A,
21058   jparen: 0x24A5,
21059   jsuperior: 0x02B2,
21060   k: 0x006B,
21061   kabashkircyrillic: 0x04A1,
21062   kabengali: 0x0995,
21063   kacute: 0x1E31,
21064   kacyrillic: 0x043A,
21065   kadescendercyrillic: 0x049B,
21066   kadeva: 0x0915,
21067   kaf: 0x05DB,
21068   kafarabic: 0x0643,
21069   kafdagesh: 0xFB3B,
21070   kafdageshhebrew: 0xFB3B,
21071   kaffinalarabic: 0xFEDA,
21072   kafhebrew: 0x05DB,
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,
21082   kappa: 0x03BA,
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,
21092   kasquare: 0x3384,
21093   kasraarabic: 0x0650,
21094   kasratanarabic: 0x064D,
21095   kastrokecyrillic: 0x049F,
21096   katahiraprolongmarkhalfwidth: 0xFF70,
21097   kaverticalstrokecyrillic: 0x049D,
21098   kbopomofo: 0x310E,
21099   kcalsquare: 0x3389,
21100   kcaron: 0x01E9,
21101   kcedilla: 0x0137,
21102   kcircle: 0x24DA,
21103   kcommaaccent: 0x0137,
21104   kdotbelow: 0x1E33,
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,
21114   khadeva: 0x0916,
21115   khagujarati: 0x0A96,
21116   khagurmukhi: 0x0A16,
21117   khaharabic: 0x062E,
21118   khahfinalarabic: 0xFEA6,
21119   khahinitialarabic: 0xFEA7,
21120   khahmedialarabic: 0xFEA8,
21121   kheicoptic: 0x03E7,
21122   khhadeva: 0x0959,
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,
21134   khook: 0x0199,
21135   khorakhangthai: 0x0E06,
21136   khzsquare: 0x3391,
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,
21151   klsquare: 0x3398,
21152   kmcubedsquare: 0x33A6,
21153   kmonospace: 0xFF4B,
21154   kmsquaredsquare: 0x33A2,
21155   kohiragana: 0x3053,
21156   kohmsquare: 0x33C0,
21157   kokaithai: 0x0E01,
21158   kokatakana: 0x30B3,
21159   kokatakanahalfwidth: 0xFF7A,
21160   kooposquare: 0x331E,
21161   koppacyrillic: 0x0481,
21162   koreanstandardsymbol: 0x327F,
21163   koroniscmb: 0x0343,
21164   kparen: 0x24A6,
21165   kpasquare: 0x33AA,
21166   ksicyrillic: 0x046F,
21167   ktsquare: 0x33CF,
21168   kturned: 0x029E,
21169   kuhiragana: 0x304F,
21170   kukatakana: 0x30AF,
21171   kukatakanahalfwidth: 0xFF78,
21172   kvsquare: 0x33B8,
21173   kwsquare: 0x33BE,
21174   l: 0x006C,
21175   labengali: 0x09B2,
21176   lacute: 0x013A,
21177   ladeva: 0x0932,
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,
21189   lamarabic: 0x0644,
21190   lambda: 0x03BB,
21191   lambdastroke: 0x019B,
21192   lamed: 0x05DC,
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,
21206   lbar: 0x019A,
21207   lbelt: 0x026C,
21208   lbopomofo: 0x310C,
21209   lcaron: 0x013E,
21210   lcedilla: 0x013C,
21211   lcircle: 0x24DB,
21212   lcircumflexbelow: 0x1E3D,
21213   lcommaaccent: 0x013C,
21214   ldot: 0x0140,
21215   ldotaccent: 0x0140,
21216   ldotbelow: 0x1E37,
21217   ldotbelowmacron: 0x1E39,
21218   leftangleabovecmb: 0x031A,
21219   lefttackbelowcmb: 0x0318,
21220   less: 0x003C,
21221   lessequal: 0x2264,
21222   lessequalorgreater: 0x22DA,
21223   lessmonospace: 0xFF1C,
21224   lessorequivalent: 0x2272,
21225   lessorgreater: 0x2276,
21226   lessoverequal: 0x2266,
21227   lesssmall: 0xFE64,
21228   lezh: 0x026E,
21229   lfblock: 0x258C,
21230   lhookretroflex: 0x026D,
21231   lira: 0x20A4,
21232   liwnarmenian: 0x056C,
21233   lj: 0x01C9,
21234   ljecyrillic: 0x0459,
21235   ll: 0xF6C0,
21236   lladeva: 0x0933,
21237   llagujarati: 0x0AB3,
21238   llinebelow: 0x1E3B,
21239   llladeva: 0x0934,
21240   llvocalicbengali: 0x09E1,
21241   llvocalicdeva: 0x0961,
21242   llvocalicvowelsignbengali: 0x09E3,
21243   llvocalicvowelsigndeva: 0x0963,
21244   lmiddletilde: 0x026B,
21245   lmonospace: 0xFF4C,
21246   lmsquare: 0x33D0,
21247   lochulathai: 0x0E2C,
21248   logicaland: 0x2227,
21249   logicalnot: 0x00AC,
21250   logicalnotreversed: 0x2310,
21251   logicalor: 0x2228,
21252   lolingthai: 0x0E25,
21253   longs: 0x017F,
21254   lowlinecenterline: 0xFE4E,
21255   lowlinecmb: 0x0332,
21256   lowlinedashed: 0xFE4D,
21257   lozenge: 0x25CA,
21258   lparen: 0x24A7,
21259   lslash: 0x0142,
21260   lsquare: 0x2113,
21261   lsuperior: 0xF6EE,
21262   ltshade: 0x2591,
21263   luthai: 0x0E26,
21264   lvocalicbengali: 0x098C,
21265   lvocalicdeva: 0x090C,
21266   lvocalicvowelsignbengali: 0x09E2,
21267   lvocalicvowelsigndeva: 0x0962,
21268   lxsquare: 0x33D3,
21269   m: 0x006D,
21270   mabengali: 0x09AE,
21271   macron: 0x00AF,
21272   macronbelowcmb: 0x0331,
21273   macroncmb: 0x0304,
21274   macronlowmod: 0x02CD,
21275   macronmonospace: 0xFFE3,
21276   macute: 0x1E3F,
21277   madeva: 0x092E,
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,
21289   maiekthai: 0x0E48,
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,
21306   male: 0x2642,
21307   mansyonsquare: 0x3347,
21308   maqafhebrew: 0x05BE,
21309   mars: 0x2642,
21310   masoracirclehebrew: 0x05AF,
21311   masquare: 0x3383,
21312   mbopomofo: 0x3107,
21313   mbsquare: 0x33D4,
21314   mcircle: 0x24DC,
21315   mcubedsquare: 0x33A5,
21316   mdotaccent: 0x1E41,
21317   mdotbelow: 0x1E43,
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,
21329   mem: 0x05DE,
21330   memdagesh: 0xFB3E,
21331   memdageshhebrew: 0xFB3E,
21332   memhebrew: 0x05DE,
21333   menarmenian: 0x0574,
21334   merkhahebrew: 0x05A5,
21335   merkhakefulahebrew: 0x05A6,
21336   merkhakefulalefthebrew: 0x05A6,
21337   merkhalefthebrew: 0x05A5,
21338   mhook: 0x0271,
21339   mhzsquare: 0x3392,
21340   middledotkatakanahalfwidth: 0xFF65,
21341   middot: 0x00B7,
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,
21353   minus: 0x2212,
21354   minusbelowcmb: 0x0320,
21355   minuscircle: 0x2296,
21356   minusmod: 0x02D7,
21357   minusplus: 0x2213,
21358   minute: 0x2032,
21359   miribaarusquare: 0x334A,
21360   mirisquare: 0x3349,
21361   mlonglegturned: 0x0270,
21362   mlsquare: 0x3396,
21363   mmcubedsquare: 0x33A3,
21364   mmonospace: 0xFF4D,
21365   mmsquaredsquare: 0x339F,
21366   mohiragana: 0x3082,
21367   mohmsquare: 0x33C1,
21368   mokatakana: 0x30E2,
21369   mokatakanahalfwidth: 0xFF93,
21370   molsquare: 0x33D6,
21371   momathai: 0x0E21,
21372   moverssquare: 0x33A7,
21373   moverssquaredsquare: 0x33A8,
21374   mparen: 0x24A8,
21375   mpasquare: 0x33AB,
21376   mssquare: 0x33B3,
21377   msuperior: 0xF6EF,
21378   mturned: 0x026F,
21379   mu: 0x00B5,
21380   mu1: 0x00B5,
21381   muasquare: 0x3382,
21382   muchgreater: 0x226B,
21383   muchless: 0x226A,
21384   mufsquare: 0x338C,
21385   mugreek: 0x03BC,
21386   mugsquare: 0x338D,
21387   muhiragana: 0x3080,
21388   mukatakana: 0x30E0,
21389   mukatakanahalfwidth: 0xFF91,
21390   mulsquare: 0x3395,
21391   multiply: 0x00D7,
21392   mumsquare: 0x339B,
21393   munahhebrew: 0x05A3,
21394   munahlefthebrew: 0x05A3,
21395   musicalnote: 0x266A,
21396   musicalnotedbl: 0x266B,
21397   musicflatsign: 0x266D,
21398   musicsharpsign: 0x266F,
21399   mussquare: 0x33B2,
21400   muvsquare: 0x33B6,
21401   muwsquare: 0x33BC,
21402   mvmegasquare: 0x33B9,
21403   mvsquare: 0x33B7,
21404   mwmegasquare: 0x33BF,
21405   mwsquare: 0x33BD,
21406   n: 0x006E,
21407   nabengali: 0x09A8,
21408   nabla: 0x2207,
21409   nacute: 0x0144,
21410   nadeva: 0x0928,
21411   nagujarati: 0x0AA8,
21412   nagurmukhi: 0x0A28,
21413   nahiragana: 0x306A,
21414   nakatakana: 0x30CA,
21415   nakatakanahalfwidth: 0xFF85,
21416   napostrophe: 0x0149,
21417   nasquare: 0x3381,
21418   nbopomofo: 0x310B,
21419   nbspace: 0x00A0,
21420   ncaron: 0x0148,
21421   ncedilla: 0x0146,
21422   ncircle: 0x24DD,
21423   ncircumflexbelow: 0x1E4B,
21424   ncommaaccent: 0x0146,
21425   ndotaccent: 0x1E45,
21426   ndotbelow: 0x1E47,
21427   nehiragana: 0x306D,
21428   nekatakana: 0x30CD,
21429   nekatakanahalfwidth: 0xFF88,
21430   newsheqelsign: 0x20AA,
21431   nfsquare: 0x338B,
21432   ngabengali: 0x0999,
21433   ngadeva: 0x0919,
21434   ngagujarati: 0x0A99,
21435   ngagurmukhi: 0x0A19,
21436   ngonguthai: 0x0E07,
21437   nhiragana: 0x3093,
21438   nhookleft: 0x0272,
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,
21455   nine: 0x0039,
21456   ninearabic: 0x0669,
21457   ninebengali: 0x09EF,
21458   ninecircle: 0x2468,
21459   ninecircleinversesansserif: 0x2792,
21460   ninedeva: 0x096F,
21461   ninegujarati: 0x0AEF,
21462   ninegurmukhi: 0x0A6F,
21463   ninehackarabic: 0x0669,
21464   ninehangzhou: 0x3029,
21465   nineideographicparen: 0x3228,
21466   nineinferior: 0x2089,
21467   ninemonospace: 0xFF19,
21468   nineoldstyle: 0xF739,
21469   nineparen: 0x247C,
21470   nineperiod: 0x2490,
21471   ninepersian: 0x06F9,
21472   nineroman: 0x2178,
21473   ninesuperior: 0x2079,
21474   nineteencircle: 0x2472,
21475   nineteenparen: 0x2486,
21476   nineteenperiod: 0x249A,
21477   ninethai: 0x0E59,
21478   nj: 0x01CC,
21479   njecyrillic: 0x045A,
21480   nkatakana: 0x30F3,
21481   nkatakanahalfwidth: 0xFF9D,
21482   nlegrightlong: 0x019E,
21483   nlinebelow: 0x1E49,
21484   nmonospace: 0xFF4E,
21485   nmsquare: 0x339A,
21486   nnabengali: 0x09A3,
21487   nnadeva: 0x0923,
21488   nnagujarati: 0x0AA3,
21489   nnagurmukhi: 0x0A23,
21490   nnnadeva: 0x0929,
21491   nohiragana: 0x306E,
21492   nokatakana: 0x30CE,
21493   nokatakanahalfwidth: 0xFF89,
21494   nonbreakingspace: 0x00A0,
21495   nonenthai: 0x0E13,
21496   nonuthai: 0x0E19,
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,
21511   notequal: 0x2260,
21512   notgreater: 0x226F,
21513   notgreaternorequal: 0x2271,
21514   notgreaternorless: 0x2279,
21515   notidentical: 0x2262,
21516   notless: 0x226E,
21517   notlessnorequal: 0x2270,
21518   notparallel: 0x2226,
21519   notprecedes: 0x2280,
21520   notsubset: 0x2284,
21521   notsucceeds: 0x2281,
21522   notsuperset: 0x2285,
21523   nowarmenian: 0x0576,
21524   nparen: 0x24A9,
21525   nssquare: 0x33B1,
21526   nsuperior: 0x207F,
21527   ntilde: 0x00F1,
21528   nu: 0x03BD,
21529   nuhiragana: 0x306C,
21530   nukatakana: 0x30CC,
21531   nukatakanahalfwidth: 0xFF87,
21532   nuktabengali: 0x09BC,
21533   nuktadeva: 0x093C,
21534   nuktagujarati: 0x0ABC,
21535   nuktagurmukhi: 0x0A3C,
21536   numbersign: 0x0023,
21537   numbersignmonospace: 0xFF03,
21538   numbersignsmall: 0xFE5F,
21539   numeralsigngreek: 0x0374,
21540   numeralsignlowergreek: 0x0375,
21541   numero: 0x2116,
21542   nun: 0x05E0,
21543   nundagesh: 0xFB40,
21544   nundageshhebrew: 0xFB40,
21545   nunhebrew: 0x05E0,
21546   nvsquare: 0x33B5,
21547   nwsquare: 0x33BB,
21548   nyabengali: 0x099E,
21549   nyadeva: 0x091E,
21550   nyagujarati: 0x0A9E,
21551   nyagurmukhi: 0x0A1E,
21552   o: 0x006F,
21553   oacute: 0x00F3,
21554   oangthai: 0x0E2D,
21555   obarred: 0x0275,
21556   obarredcyrillic: 0x04E9,
21557   obarreddieresiscyrillic: 0x04EB,
21558   obengali: 0x0993,
21559   obopomofo: 0x311B,
21560   obreve: 0x014F,
21561   ocandradeva: 0x0911,
21562   ocandragujarati: 0x0A91,
21563   ocandravowelsigndeva: 0x0949,
21564   ocandravowelsigngujarati: 0x0AC9,
21565   ocaron: 0x01D2,
21566   ocircle: 0x24DE,
21567   ocircumflex: 0x00F4,
21568   ocircumflexacute: 0x1ED1,
21569   ocircumflexdotbelow: 0x1ED9,
21570   ocircumflexgrave: 0x1ED3,
21571   ocircumflexhookabove: 0x1ED5,
21572   ocircumflextilde: 0x1ED7,
21573   ocyrillic: 0x043E,
21574   odblacute: 0x0151,
21575   odblgrave: 0x020D,
21576   odeva: 0x0913,
21577   odieresis: 0x00F6,
21578   odieresiscyrillic: 0x04E7,
21579   odotbelow: 0x1ECD,
21580   oe: 0x0153,
21581   oekorean: 0x315A,
21582   ogonek: 0x02DB,
21583   ogonekcmb: 0x0328,
21584   ograve: 0x00F2,
21585   ogujarati: 0x0A93,
21586   oharmenian: 0x0585,
21587   ohiragana: 0x304A,
21588   ohookabove: 0x1ECF,
21589   ohorn: 0x01A1,
21590   ohornacute: 0x1EDB,
21591   ohorndotbelow: 0x1EE3,
21592   ohorngrave: 0x1EDD,
21593   ohornhookabove: 0x1EDF,
21594   ohorntilde: 0x1EE1,
21595   ohungarumlaut: 0x0151,
21596   oi: 0x01A3,
21597   oinvertedbreve: 0x020F,
21598   okatakana: 0x30AA,
21599   okatakanahalfwidth: 0xFF75,
21600   okorean: 0x3157,
21601   olehebrew: 0x05AB,
21602   omacron: 0x014D,
21603   omacronacute: 0x1E53,
21604   omacrongrave: 0x1E51,
21605   omdeva: 0x0950,
21606   omega: 0x03C9,
21607   omega1: 0x03D6,
21608   omegacyrillic: 0x0461,
21609   omegalatinclosed: 0x0277,
21610   omegaroundcyrillic: 0x047B,
21611   omegatitlocyrillic: 0x047D,
21612   omegatonos: 0x03CE,
21613   omgujarati: 0x0AD0,
21614   omicron: 0x03BF,
21615   omicrontonos: 0x03CC,
21616   omonospace: 0xFF4F,
21617   one: 0x0031,
21618   onearabic: 0x0661,
21619   onebengali: 0x09E7,
21620   onecircle: 0x2460,
21621   onecircleinversesansserif: 0x278A,
21622   onedeva: 0x0967,
21623   onedotenleader: 0x2024,
21624   oneeighth: 0x215B,
21625   onefitted: 0xF6DC,
21626   onegujarati: 0x0AE7,
21627   onegurmukhi: 0x0A67,
21628   onehackarabic: 0x0661,
21629   onehalf: 0x00BD,
21630   onehangzhou: 0x3021,
21631   oneideographicparen: 0x3220,
21632   oneinferior: 0x2081,
21633   onemonospace: 0xFF11,
21634   onenumeratorbengali: 0x09F4,
21635   oneoldstyle: 0xF731,
21636   oneparen: 0x2474,
21637   oneperiod: 0x2488,
21638   onepersian: 0x06F1,
21639   onequarter: 0x00BC,
21640   oneroman: 0x2170,
21641   onesuperior: 0x00B9,
21642   onethai: 0x0E51,
21643   onethird: 0x2153,
21644   oogonek: 0x01EB,
21645   oogonekmacron: 0x01ED,
21646   oogurmukhi: 0x0A13,
21647   oomatragurmukhi: 0x0A4B,
21648   oopen: 0x0254,
21649   oparen: 0x24AA,
21650   openbullet: 0x25E6,
21651   option: 0x2325,
21652   ordfeminine: 0x00AA,
21653   ordmasculine: 0x00BA,
21654   orthogonal: 0x221F,
21655   oshortdeva: 0x0912,
21656   oshortvowelsigndeva: 0x094A,
21657   oslash: 0x00F8,
21658   oslashacute: 0x01FF,
21659   osmallhiragana: 0x3049,
21660   osmallkatakana: 0x30A9,
21661   osmallkatakanahalfwidth: 0xFF6B,
21662   ostrokeacute: 0x01FF,
21663   osuperior: 0xF6F0,
21664   otcyrillic: 0x047F,
21665   otilde: 0x00F5,
21666   otildeacute: 0x1E4D,
21667   otildedieresis: 0x1E4F,
21668   oubopomofo: 0x3121,
21669   overline: 0x203E,
21670   overlinecenterline: 0xFE4A,
21671   overlinecmb: 0x0305,
21672   overlinedashed: 0xFE49,
21673   overlinedblwavy: 0xFE4C,
21674   overlinewavy: 0xFE4B,
21675   overscore: 0x00AF,
21676   ovowelsignbengali: 0x09CB,
21677   ovowelsigndeva: 0x094B,
21678   ovowelsigngujarati: 0x0ACB,
21679   p: 0x0070,
21680   paampssquare: 0x3380,
21681   paasentosquare: 0x332B,
21682   pabengali: 0x09AA,
21683   pacute: 0x1E55,
21684   padeva: 0x092A,
21685   pagedown: 0x21DF,
21686   pageup: 0x21DE,
21687   pagujarati: 0x0AAA,
21688   pagurmukhi: 0x0A2A,
21689   pahiragana: 0x3071,
21690   paiyannoithai: 0x0E2F,
21691   pakatakana: 0x30D1,
21692   palatalizationcyrilliccmb: 0x0484,
21693   palochkacyrillic: 0x04C0,
21694   pansioskorean: 0x317F,
21695   paragraph: 0x00B6,
21696   parallel: 0x2225,
21697   parenleft: 0x0028,
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,
21720   pasquare: 0x33A9,
21721   patah: 0x05B7,
21722   patah11: 0x05B7,
21723   patah1d: 0x05B7,
21724   patah2a: 0x05B7,
21725   patahhebrew: 0x05B7,
21726   patahnarrowhebrew: 0x05B7,
21727   patahquarterhebrew: 0x05B7,
21728   patahwidehebrew: 0x05B7,
21729   pazerhebrew: 0x05A1,
21730   pbopomofo: 0x3106,
21731   pcircle: 0x24DF,
21732   pdotaccent: 0x1E57,
21733   pe: 0x05E4,
21734   pecyrillic: 0x043F,
21735   pedagesh: 0xFB44,
21736   pedageshhebrew: 0xFB44,
21737   peezisquare: 0x333B,
21738   pefinaldageshhebrew: 0xFB43,
21739   peharabic: 0x067E,
21740   peharmenian: 0x057A,
21741   pehebrew: 0x05E4,
21742   pehfinalarabic: 0xFB57,
21743   pehinitialarabic: 0xFB58,
21744   pehiragana: 0x307A,
21745   pehmedialarabic: 0xFB59,
21746   pekatakana: 0x30DA,
21747   pemiddlehookcyrillic: 0x04A7,
21748   perafehebrew: 0xFB4E,
21749   percent: 0x0025,
21750   percentarabic: 0x066A,
21751   percentmonospace: 0xFF05,
21752   percentsmall: 0xFE6A,
21753   period: 0x002E,
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,
21764   peseta: 0x20A7,
21765   pfsquare: 0x338A,
21766   phabengali: 0x09AB,
21767   phadeva: 0x092B,
21768   phagujarati: 0x0AAB,
21769   phagurmukhi: 0x0A2B,
21770   phi: 0x03C6,
21771   phi1: 0x03D5,
21772   phieuphacirclekorean: 0x327A,
21773   phieuphaparenkorean: 0x321A,
21774   phieuphcirclekorean: 0x326C,
21775   phieuphkorean: 0x314D,
21776   phieuphparenkorean: 0x320C,
21777   philatin: 0x0278,
21778   phinthuthai: 0x0E3A,
21779   phisymbolgreek: 0x03D5,
21780   phook: 0x01A5,
21781   phophanthai: 0x0E1E,
21782   phophungthai: 0x0E1C,
21783   phosamphaothai: 0x0E20,
21784   pi: 0x03C0,
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,
21801   plus: 0x002B,
21802   plusbelowcmb: 0x031F,
21803   pluscircle: 0x2295,
21804   plusminus: 0x00B1,
21805   plusmod: 0x02D6,
21806   plusmonospace: 0xFF0B,
21807   plussmall: 0xFE62,
21808   plussuperior: 0x207A,
21809   pmonospace: 0xFF50,
21810   pmsquare: 0x33D8,
21811   pohiragana: 0x307D,
21812   pointingindexdownwhite: 0x261F,
21813   pointingindexleftwhite: 0x261C,
21814   pointingindexrightwhite: 0x261E,
21815   pointingindexupwhite: 0x261D,
21816   pokatakana: 0x30DD,
21817   poplathai: 0x0E1B,
21818   postalmark: 0x3012,
21819   postalmarkface: 0x3020,
21820   pparen: 0x24AB,
21821   precedes: 0x227A,
21822   prescription: 0x211E,
21823   primemod: 0x02B9,
21824   primereversed: 0x2035,
21825   product: 0x220F,
21826   projective: 0x2305,
21827   prolongedkana: 0x30FC,
21828   propellor: 0x2318,
21829   propersubset: 0x2282,
21830   propersuperset: 0x2283,
21831   proportion: 0x2237,
21832   proportional: 0x221D,
21833   psi: 0x03C8,
21834   psicyrillic: 0x0471,
21835   psilipneumatacyrilliccmb: 0x0486,
21836   pssquare: 0x33B0,
21837   puhiragana: 0x3077,
21838   pukatakana: 0x30D7,
21839   pvsquare: 0x33B4,
21840   pwsquare: 0x33BA,
21841   q: 0x0071,
21842   qadeva: 0x0958,
21843   qadmahebrew: 0x05A8,
21844   qafarabic: 0x0642,
21845   qaffinalarabic: 0xFED6,
21846   qafinitialarabic: 0xFED7,
21847   qafmedialarabic: 0xFED8,
21848   qamats: 0x05B8,
21849   qamats10: 0x05B8,
21850   qamats1a: 0x05B8,
21851   qamats1c: 0x05B8,
21852   qamats27: 0x05B8,
21853   qamats29: 0x05B8,
21854   qamats33: 0x05B8,
21855   qamatsde: 0x05B8,
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,
21865   qbopomofo: 0x3111,
21866   qcircle: 0x24E0,
21867   qhook: 0x02A0,
21868   qmonospace: 0xFF51,
21869   qof: 0x05E7,
21870   qofdagesh: 0xFB47,
21871   qofdageshhebrew: 0xFB47,
21872   qofhebrew: 0x05E7,
21873   qparen: 0x24AC,
21874   quarternote: 0x2669,
21875   qubuts: 0x05BB,
21876   qubuts18: 0x05BB,
21877   qubuts25: 0x05BB,
21878   qubuts31: 0x05BB,
21879   qubutshebrew: 0x05BB,
21880   qubutsnarrowhebrew: 0x05BB,
21881   qubutsquarterhebrew: 0x05BB,
21882   qubutswidehebrew: 0x05BB,
21883   question: 0x003F,
21884   questionarabic: 0x061F,
21885   questionarmenian: 0x055E,
21886   questiondown: 0x00BF,
21887   questiondownsmall: 0xF7BF,
21888   questiongreek: 0x037E,
21889   questionmonospace: 0xFF1F,
21890   questionsmall: 0xF73F,
21891   quotedbl: 0x0022,
21892   quotedblbase: 0x201E,
21893   quotedblleft: 0x201C,
21894   quotedblmonospace: 0xFF02,
21895   quotedblprime: 0x301E,
21896   quotedblprimereversed: 0x301D,
21897   quotedblright: 0x201D,
21898   quoteleft: 0x2018,
21899   quoteleftreversed: 0x201B,
21900   quotereversed: 0x201B,
21901   quoteright: 0x2019,
21902   quoterightn: 0x0149,
21903   quotesinglbase: 0x201A,
21904   quotesingle: 0x0027,
21905   quotesinglemonospace: 0xFF07,
21906   r: 0x0072,
21907   raarmenian: 0x057C,
21908   rabengali: 0x09B0,
21909   racute: 0x0155,
21910   radeva: 0x0930,
21911   radical: 0x221A,
21912   radicalex: 0xF8E5,
21913   radoverssquare: 0x33AE,
21914   radoverssquaredsquare: 0x33AF,
21915   radsquare: 0x33AD,
21916   rafe: 0x05BF,
21917   rafehebrew: 0x05BF,
21918   ragujarati: 0x0AB0,
21919   ragurmukhi: 0x0A30,
21920   rahiragana: 0x3089,
21921   rakatakana: 0x30E9,
21922   rakatakanahalfwidth: 0xFF97,
21923   ralowerdiagonalbengali: 0x09F1,
21924   ramiddlediagonalbengali: 0x09F0,
21925   ramshorn: 0x0264,
21926   ratio: 0x2236,
21927   rbopomofo: 0x3116,
21928   rcaron: 0x0159,
21929   rcedilla: 0x0157,
21930   rcircle: 0x24E1,
21931   rcommaaccent: 0x0157,
21932   rdblgrave: 0x0211,
21933   rdotaccent: 0x1E59,
21934   rdotbelow: 0x1E5B,
21935   rdotbelowmacron: 0x1E5D,
21936   referencemark: 0x203B,
21937   reflexsubset: 0x2286,
21938   reflexsuperset: 0x2287,
21939   registered: 0x00AE,
21940   registersans: 0xF8E8,
21941   registerserif: 0xF6DA,
21942   reharabic: 0x0631,
21943   reharmenian: 0x0580,
21944   rehfinalarabic: 0xFEAE,
21945   rehiragana: 0x308C,
21946   rekatakana: 0x30EC,
21947   rekatakanahalfwidth: 0xFF9A,
21948   resh: 0x05E8,
21949   reshdageshhebrew: 0xFB48,
21950   reshhebrew: 0x05E8,
21951   reversedtilde: 0x223D,
21952   reviahebrew: 0x0597,
21953   reviamugrashhebrew: 0x0597,
21954   revlogicalnot: 0x2310,
21955   rfishhook: 0x027E,
21956   rfishhookreversed: 0x027F,
21957   rhabengali: 0x09DD,
21958   rhadeva: 0x095D,
21959   rho: 0x03C1,
21960   rhook: 0x027D,
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,
21988   ring: 0x02DA,
21989   ringbelowcmb: 0x0325,
21990   ringcmb: 0x030A,
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,
22001   rlongleg: 0x027C,
22002   rlonglegturned: 0x027A,
22003   rmonospace: 0xFF52,
22004   rohiragana: 0x308D,
22005   rokatakana: 0x30ED,
22006   rokatakanahalfwidth: 0xFF9B,
22007   roruathai: 0x0E23,
22008   rparen: 0x24AD,
22009   rrabengali: 0x09DC,
22010   rradeva: 0x0931,
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,
22020   rsuperior: 0xF6F1,
22021   rtblock: 0x2590,
22022   rturned: 0x0279,
22023   rturnedsuperior: 0x02B4,
22024   ruhiragana: 0x308B,
22025   rukatakana: 0x30EB,
22026   rukatakanahalfwidth: 0xFF99,
22027   rupeemarkbengali: 0x09F2,
22028   rupeesignbengali: 0x09F3,
22029   rupiah: 0xF6DD,
22030   ruthai: 0x0E24,
22031   rvocalicbengali: 0x098B,
22032   rvocalicdeva: 0x090B,
22033   rvocalicgujarati: 0x0A8B,
22034   rvocalicvowelsignbengali: 0x09C3,
22035   rvocalicvowelsigndeva: 0x0943,
22036   rvocalicvowelsigngujarati: 0x0AC3,
22037   s: 0x0073,
22038   sabengali: 0x09B8,
22039   sacute: 0x015B,
22040   sacutedotaccent: 0x1E65,
22041   sadarabic: 0x0635,
22042   sadeva: 0x0938,
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,
22052   samekh: 0x05E1,
22053   samekhdagesh: 0xFB41,
22054   samekhdageshhebrew: 0xFB41,
22055   samekhhebrew: 0x05E1,
22056   saraaathai: 0x0E32,
22057   saraaethai: 0x0E41,
22058   saraaimaimalaithai: 0x0E44,
22059   saraaimaimuanthai: 0x0E43,
22060   saraamthai: 0x0E33,
22061   saraathai: 0x0E30,
22062   saraethai: 0x0E40,
22063   saraiileftthai: 0xF886,
22064   saraiithai: 0x0E35,
22065   saraileftthai: 0xF885,
22066   saraithai: 0x0E34,
22067   saraothai: 0x0E42,
22068   saraueeleftthai: 0xF888,
22069   saraueethai: 0x0E37,
22070   saraueleftthai: 0xF887,
22071   sarauethai: 0x0E36,
22072   sarauthai: 0x0E38,
22073   sarauuthai: 0x0E39,
22074   sbopomofo: 0x3119,
22075   scaron: 0x0161,
22076   scarondotaccent: 0x1E67,
22077   scedilla: 0x015F,
22078   schwa: 0x0259,
22079   schwacyrillic: 0x04D9,
22080   schwadieresiscyrillic: 0x04DB,
22081   schwahook: 0x025A,
22082   scircle: 0x24E2,
22083   scircumflex: 0x015D,
22084   scommaaccent: 0x0219,
22085   sdotaccent: 0x1E61,
22086   sdotbelow: 0x1E63,
22087   sdotbelowdotaccent: 0x1E69,
22088   seagullbelowcmb: 0x033C,
22089   second: 0x2033,
22090   secondtonechinese: 0x02CA,
22091   section: 0x00A7,
22092   seenarabic: 0x0633,
22093   seenfinalarabic: 0xFEB2,
22094   seeninitialarabic: 0xFEB3,
22095   seenmedialarabic: 0xFEB4,
22096   segol: 0x05B6,
22097   segol13: 0x05B6,
22098   segol1f: 0x05B6,
22099   segol2c: 0x05B6,
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,
22109   semicolon: 0x003B,
22110   semicolonarabic: 0x061B,
22111   semicolonmonospace: 0xFF1B,
22112   semicolonsmall: 0xFE54,
22113   semivoicedmarkkana: 0x309C,
22114   semivoicedmarkkanahalfwidth: 0xFF9F,
22115   sentisquare: 0x3322,
22116   sentosquare: 0x3323,
22117   seven: 0x0037,
22118   sevenarabic: 0x0667,
22119   sevenbengali: 0x09ED,
22120   sevencircle: 0x2466,
22121   sevencircleinversesansserif: 0x2790,
22122   sevendeva: 0x096D,
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,
22140   seventhai: 0x0E57,
22141   sfthyphen: 0x00AD,
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,
22151   shade: 0x2592,
22152   shadedark: 0x2593,
22153   shadelight: 0x2591,
22154   shademedium: 0x2592,
22155   shadeva: 0x0936,
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,
22166   sheqel: 0x20AA,
22167   sheqelhebrew: 0x20AA,
22168   sheva: 0x05B0,
22169   sheva115: 0x05B0,
22170   sheva15: 0x05B0,
22171   sheva22: 0x05B0,
22172   sheva2e: 0x05B0,
22173   shevahebrew: 0x05B0,
22174   shevanarrowhebrew: 0x05B0,
22175   shevaquarterhebrew: 0x05B0,
22176   shevawidehebrew: 0x05B0,
22177   shhacyrillic: 0x04BB,
22178   shimacoptic: 0x03ED,
22179   shin: 0x05E9,
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,
22192   shook: 0x0282,
22193   sigma: 0x03C3,
22194   sigma1: 0x03C2,
22195   sigmafinal: 0x03C2,
22196   sigmalunatesymbolgreek: 0x03F2,
22197   sihiragana: 0x3057,
22198   sikatakana: 0x30B7,
22199   sikatakanahalfwidth: 0xFF7C,
22200   siluqhebrew: 0x05BD,
22201   siluqlefthebrew: 0x05BD,
22202   similar: 0x223C,
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,
22214   six: 0x0036,
22215   sixarabic: 0x0666,
22216   sixbengali: 0x09EC,
22217   sixcircle: 0x2465,
22218   sixcircleinversesansserif: 0x278F,
22219   sixdeva: 0x096C,
22220   sixgujarati: 0x0AEC,
22221   sixgurmukhi: 0x0A6C,
22222   sixhackarabic: 0x0666,
22223   sixhangzhou: 0x3026,
22224   sixideographicparen: 0x3225,
22225   sixinferior: 0x2086,
22226   sixmonospace: 0xFF16,
22227   sixoldstyle: 0xF736,
22228   sixparen: 0x2479,
22229   sixperiod: 0x248D,
22230   sixpersian: 0x06F6,
22231   sixroman: 0x2175,
22232   sixsuperior: 0x2076,
22233   sixteencircle: 0x246F,
22234   sixteencurrencydenominatorbengali: 0x09F9,
22235   sixteenparen: 0x2483,
22236   sixteenperiod: 0x2497,
22237   sixthai: 0x0E56,
22238   slash: 0x002F,
22239   slashmonospace: 0xFF0F,
22240   slong: 0x017F,
22241   slongdotaccent: 0x1E9B,
22242   smileface: 0x263A,
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,
22254   sosothai: 0x0E0B,
22255   sosuathai: 0x0E2A,
22256   space: 0x0020,
22257   spacehackarabic: 0x0020,
22258   spade: 0x2660,
22259   spadesuitblack: 0x2660,
22260   spadesuitwhite: 0x2664,
22261   sparen: 0x24AE,
22262   squarebelowcmb: 0x033B,
22263   squarecc: 0x33C4,
22264   squarecm: 0x339D,
22265   squarediagonalcrosshatchfill: 0x25A9,
22266   squarehorizontalfill: 0x25A4,
22267   squarekg: 0x338F,
22268   squarekm: 0x339E,
22269   squarekmcapital: 0x33CE,
22270   squareln: 0x33D1,
22271   squarelog: 0x33D2,
22272   squaremg: 0x338E,
22273   squaremil: 0x33D5,
22274   squaremm: 0x339C,
22275   squaremsquared: 0x33A1,
22276   squareorthogonalcrosshatchfill: 0x25A6,
22277   squareupperlefttolowerrightfill: 0x25A7,
22278   squareupperrighttolowerleftfill: 0x25A8,
22279   squareverticalfill: 0x25A5,
22280   squarewhitewithsmallblack: 0x25A3,
22281   srsquare: 0x33DB,
22282   ssabengali: 0x09B7,
22283   ssadeva: 0x0937,
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,
22293   ssuperior: 0xF6F2,
22294   sterling: 0x00A3,
22295   sterlingmonospace: 0xFFE1,
22296   strokelongoverlaycmb: 0x0336,
22297   strokeshortoverlaycmb: 0x0335,
22298   subset: 0x2282,
22299   subsetnotequal: 0x228A,
22300   subsetorequal: 0x2286,
22301   succeeds: 0x227B,
22302   suchthat: 0x220B,
22303   suhiragana: 0x3059,
22304   sukatakana: 0x30B9,
22305   sukatakanahalfwidth: 0xFF7D,
22306   sukunarabic: 0x0652,
22307   summation: 0x2211,
22308   sun: 0x263C,
22309   superset: 0x2283,
22310   supersetnotequal: 0x228B,
22311   supersetorequal: 0x2287,
22312   svsquare: 0x33DC,
22313   syouwaerasquare: 0x337C,
22314   t: 0x0074,
22315   tabengali: 0x09A4,
22316   tackdown: 0x22A4,
22317   tackleft: 0x22A3,
22318   tadeva: 0x0924,
22319   tagujarati: 0x0AA4,
22320   tagurmukhi: 0x0A24,
22321   taharabic: 0x0637,
22322   tahfinalarabic: 0xFEC2,
22323   tahinitialarabic: 0xFEC3,
22324   tahiragana: 0x305F,
22325   tahmedialarabic: 0xFEC4,
22326   taisyouerasquare: 0x337D,
22327   takatakana: 0x30BF,
22328   takatakanahalfwidth: 0xFF80,
22329   tatweelarabic: 0x0640,
22330   tau: 0x03C4,
22331   tav: 0x05EA,
22332   tavdages: 0xFB4A,
22333   tavdagesh: 0xFB4A,
22334   tavdageshhebrew: 0xFB4A,
22335   tavhebrew: 0x05EA,
22336   tbar: 0x0167,
22337   tbopomofo: 0x310A,
22338   tcaron: 0x0165,
22339   tccurl: 0x02A8,
22340   tcedilla: 0x0163,
22341   tcheharabic: 0x0686,
22342   tchehfinalarabic: 0xFB7B,
22343   tchehinitialarabic: 0xFB7C,
22344   tchehmedialarabic: 0xFB7D,
22345   tcircle: 0x24E3,
22346   tcircumflexbelow: 0x1E71,
22347   tcommaaccent: 0x0163,
22348   tdieresis: 0x1E97,
22349   tdotaccent: 0x1E6B,
22350   tdotbelow: 0x1E6D,
22351   tecyrillic: 0x0442,
22352   tedescendercyrillic: 0x04AD,
22353   teharabic: 0x062A,
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,
22369   telephone: 0x2121,
22370   telephoneblack: 0x260E,
22371   telishagedolahebrew: 0x05A0,
22372   telishaqetanahebrew: 0x05A9,
22373   tencircle: 0x2469,
22374   tenideographicparen: 0x3229,
22375   tenparen: 0x247D,
22376   tenperiod: 0x2491,
22377   tenroman: 0x2179,
22378   tesh: 0x02A7,
22379   tet: 0x05D8,
22380   tetdagesh: 0xFB38,
22381   tetdageshhebrew: 0xFB38,
22382   tethebrew: 0x05D8,
22383   tetsecyrillic: 0x04B5,
22384   tevirhebrew: 0x059B,
22385   tevirlefthebrew: 0x059B,
22386   thabengali: 0x09A5,
22387   thadeva: 0x0925,
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,
22401   therefore: 0x2234,
22402   theta: 0x03B8,
22403   theta1: 0x03D1,
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,
22414   thook: 0x01AD,
22415   thophuthaothai: 0x0E12,
22416   thorn: 0x00FE,
22417   thothahanthai: 0x0E17,
22418   thothanthai: 0x0E10,
22419   thothongthai: 0x0E18,
22420   thothungthai: 0x0E16,
22421   thousandcyrillic: 0x0482,
22422   thousandsseparatorarabic: 0x066C,
22423   thousandsseparatorpersian: 0x066C,
22424   three: 0x0033,
22425   threearabic: 0x0663,
22426   threebengali: 0x09E9,
22427   threecircle: 0x2462,
22428   threecircleinversesansserif: 0x278C,
22429   threedeva: 0x0969,
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,
22447   threethai: 0x0E53,
22448   thzsquare: 0x3394,
22449   tihiragana: 0x3061,
22450   tikatakana: 0x30C1,
22451   tikatakanahalfwidth: 0xFF81,
22452   tikeutacirclekorean: 0x3270,
22453   tikeutaparenkorean: 0x3210,
22454   tikeutcirclekorean: 0x3262,
22455   tikeutkorean: 0x3137,
22456   tikeutparenkorean: 0x3202,
22457   tilde: 0x02DC,
22458   tildebelowcmb: 0x0330,
22459   tildecmb: 0x0303,
22460   tildecomb: 0x0303,
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,
22482   tonefive: 0x01BD,
22483   tonesix: 0x0185,
22484   tonetwo: 0x01A8,
22485   tonos: 0x0384,
22486   tonsquare: 0x3327,
22487   topatakthai: 0x0E0F,
22488   tortoiseshellbracketleft: 0x3014,
22489   tortoiseshellbracketleftsmall: 0xFE5D,
22490   tortoiseshellbracketleftvertical: 0xFE39,
22491   tortoiseshellbracketright: 0x3015,
22492   tortoiseshellbracketrightsmall: 0xFE5E,
22493   tortoiseshellbracketrightvertical: 0xFE3A,
22494   totaothai: 0x0E15,
22495   tpalatalhook: 0x01AB,
22496   tparen: 0x24AF,
22497   trademark: 0x2122,
22498   trademarksans: 0xF8EA,
22499   trademarkserif: 0xF6DB,
22500   tretroflexhook: 0x0288,
22501   triagdn: 0x25BC,
22502   triaglf: 0x25C4,
22503   triagrt: 0x25BA,
22504   triagup: 0x25B2,
22505   ts: 0x02A6,
22506   tsadi: 0x05E6,
22507   tsadidagesh: 0xFB46,
22508   tsadidageshhebrew: 0xFB46,
22509   tsadihebrew: 0x05E6,
22510   tsecyrillic: 0x0446,
22511   tsere: 0x05B5,
22512   tsere12: 0x05B5,
22513   tsere1e: 0x05B5,
22514   tsere2b: 0x05B5,
22515   tserehebrew: 0x05B5,
22516   tserenarrowhebrew: 0x05B5,
22517   tserequarterhebrew: 0x05B5,
22518   tserewidehebrew: 0x05B5,
22519   tshecyrillic: 0x045B,
22520   tsuperior: 0xF6F3,
22521   ttabengali: 0x099F,
22522   ttadeva: 0x091F,
22523   ttagujarati: 0x0A9F,
22524   ttagurmukhi: 0x0A1F,
22525   tteharabic: 0x0679,
22526   ttehfinalarabic: 0xFB67,
22527   ttehinitialarabic: 0xFB68,
22528   ttehmedialarabic: 0xFB69,
22529   tthabengali: 0x09A0,
22530   tthadeva: 0x0920,
22531   tthagujarati: 0x0AA0,
22532   tthagurmukhi: 0x0A20,
22533   tturned: 0x0287,
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,
22548   two: 0x0032,
22549   twoarabic: 0x0662,
22550   twobengali: 0x09E8,
22551   twocircle: 0x2461,
22552   twocircleinversesansserif: 0x278B,
22553   twodeva: 0x0968,
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,
22566   twoparen: 0x2475,
22567   twoperiod: 0x2489,
22568   twopersian: 0x06F2,
22569   tworoman: 0x2171,
22570   twostroke: 0x01BB,
22571   twosuperior: 0x00B2,
22572   twothai: 0x0E52,
22573   twothirds: 0x2154,
22574   u: 0x0075,
22575   uacute: 0x00FA,
22576   ubar: 0x0289,
22577   ubengali: 0x0989,
22578   ubopomofo: 0x3128,
22579   ubreve: 0x016D,
22580   ucaron: 0x01D4,
22581   ucircle: 0x24E4,
22582   ucircumflex: 0x00FB,
22583   ucircumflexbelow: 0x1E77,
22584   ucyrillic: 0x0443,
22585   udattadeva: 0x0951,
22586   udblacute: 0x0171,
22587   udblgrave: 0x0215,
22588   udeva: 0x0909,
22589   udieresis: 0x00FC,
22590   udieresisacute: 0x01D8,
22591   udieresisbelow: 0x1E73,
22592   udieresiscaron: 0x01DA,
22593   udieresiscyrillic: 0x04F1,
22594   udieresisgrave: 0x01DC,
22595   udieresismacron: 0x01D6,
22596   udotbelow: 0x1EE5,
22597   ugrave: 0x00F9,
22598   ugujarati: 0x0A89,
22599   ugurmukhi: 0x0A09,
22600   uhiragana: 0x3046,
22601   uhookabove: 0x1EE7,
22602   uhorn: 0x01B0,
22603   uhornacute: 0x1EE9,
22604   uhorndotbelow: 0x1EF1,
22605   uhorngrave: 0x1EEB,
22606   uhornhookabove: 0x1EED,
22607   uhorntilde: 0x1EEF,
22608   uhungarumlaut: 0x0171,
22609   uhungarumlautcyrillic: 0x04F3,
22610   uinvertedbreve: 0x0217,
22611   ukatakana: 0x30A6,
22612   ukatakanahalfwidth: 0xFF73,
22613   ukcyrillic: 0x0479,
22614   ukorean: 0x315C,
22615   umacron: 0x016B,
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,
22625   union: 0x222A,
22626   universal: 0x2200,
22627   uogonek: 0x0173,
22628   uparen: 0x24B0,
22629   upblock: 0x2580,
22630   upperdothebrew: 0x05C4,
22631   upsilon: 0x03C5,
22632   upsilondieresis: 0x03CB,
22633   upsilondieresistonos: 0x03B0,
22634   upsilonlatin: 0x028A,
22635   upsilontonos: 0x03CD,
22636   uptackbelowcmb: 0x031D,
22637   uptackmod: 0x02D4,
22638   uragurmukhi: 0x0A73,
22639   uring: 0x016F,
22640   ushortcyrillic: 0x045E,
22641   usmallhiragana: 0x3045,
22642   usmallkatakana: 0x30A5,
22643   usmallkatakanahalfwidth: 0xFF69,
22644   ustraightcyrillic: 0x04AF,
22645   ustraightstrokecyrillic: 0x04B1,
22646   utilde: 0x0169,
22647   utildeacute: 0x1E79,
22648   utildebelow: 0x1E75,
22649   uubengali: 0x098A,
22650   uudeva: 0x090A,
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,
22660   v: 0x0076,
22661   vadeva: 0x0935,
22662   vagujarati: 0x0AB5,
22663   vagurmukhi: 0x0A35,
22664   vakatakana: 0x30F7,
22665   vav: 0x05D5,
22666   vavdagesh: 0xFB35,
22667   vavdagesh65: 0xFB35,
22668   vavdageshhebrew: 0xFB35,
22669   vavhebrew: 0x05D5,
22670   vavholam: 0xFB4B,
22671   vavholamhebrew: 0xFB4B,
22672   vavvavhebrew: 0x05F0,
22673   vavyodhebrew: 0x05F1,
22674   vcircle: 0x24E5,
22675   vdotbelow: 0x1E7F,
22676   vecyrillic: 0x0432,
22677   veharabic: 0x06A4,
22678   vehfinalarabic: 0xFB6B,
22679   vehinitialarabic: 0xFB6C,
22680   vehmedialarabic: 0xFB6D,
22681   vekatakana: 0x30F9,
22682   venus: 0x2640,
22683   verticalbar: 0x007C,
22684   verticallineabovecmb: 0x030D,
22685   verticallinebelowcmb: 0x0329,
22686   verticallinelowmod: 0x02CC,
22687   verticallinemod: 0x02C8,
22688   vewarmenian: 0x057E,
22689   vhook: 0x028B,
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,
22704   vparen: 0x24B1,
22705   vtilde: 0x1E7D,
22706   vturned: 0x028C,
22707   vuhiragana: 0x3094,
22708   vukatakana: 0x30F4,
22709   w: 0x0077,
22710   wacute: 0x1E83,
22711   waekorean: 0x3159,
22712   wahiragana: 0x308F,
22713   wakatakana: 0x30EF,
22714   wakatakanahalfwidth: 0xFF9C,
22715   wakorean: 0x3158,
22716   wasmallhiragana: 0x308E,
22717   wasmallkatakana: 0x30EE,
22718   wattosquare: 0x3357,
22719   wavedash: 0x301C,
22720   wavyunderscorevertical: 0xFE34,
22721   wawarabic: 0x0648,
22722   wawfinalarabic: 0xFEEE,
22723   wawhamzaabovearabic: 0x0624,
22724   wawhamzaabovefinalarabic: 0xFE86,
22725   wbsquare: 0x33DD,
22726   wcircle: 0x24E6,
22727   wcircumflex: 0x0175,
22728   wdieresis: 0x1E85,
22729   wdotaccent: 0x1E87,
22730   wdotbelow: 0x1E89,
22731   wehiragana: 0x3091,
22732   weierstrass: 0x2118,
22733   wekatakana: 0x30F1,
22734   wekorean: 0x315E,
22735   weokorean: 0x315D,
22736   wgrave: 0x1E81,
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,
22757   whitestar: 0x2606,
22758   whitetelephone: 0x260F,
22759   whitetortoiseshellbracketleft: 0x3018,
22760   whitetortoiseshellbracketright: 0x3019,
22761   whiteuppointingsmalltriangle: 0x25B5,
22762   whiteuppointingtriangle: 0x25B3,
22763   wihiragana: 0x3090,
22764   wikatakana: 0x30F0,
22765   wikorean: 0x315F,
22766   wmonospace: 0xFF57,
22767   wohiragana: 0x3092,
22768   wokatakana: 0x30F2,
22769   wokatakanahalfwidth: 0xFF66,
22770   won: 0x20A9,
22771   wonmonospace: 0xFFE6,
22772   wowaenthai: 0x0E27,
22773   wparen: 0x24B2,
22774   wring: 0x1E98,
22775   wsuperior: 0x02B7,
22776   wturned: 0x028D,
22777   wynn: 0x01BF,
22778   x: 0x0078,
22779   xabovecmb: 0x033D,
22780   xbopomofo: 0x3112,
22781   xcircle: 0x24E7,
22782   xdieresis: 0x1E8D,
22783   xdotaccent: 0x1E8B,
22784   xeharmenian: 0x056D,
22785   xi: 0x03BE,
22786   xmonospace: 0xFF58,
22787   xparen: 0x24B3,
22788   xsuperior: 0x02E3,
22789   y: 0x0079,
22790   yaadosquare: 0x334E,
22791   yabengali: 0x09AF,
22792   yacute: 0x00FD,
22793   yadeva: 0x092F,
22794   yaekorean: 0x3152,
22795   yagujarati: 0x0AAF,
22796   yagurmukhi: 0x0A2F,
22797   yahiragana: 0x3084,
22798   yakatakana: 0x30E4,
22799   yakatakanahalfwidth: 0xFF94,
22800   yakorean: 0x3151,
22801   yamakkanthai: 0x0E4E,
22802   yasmallhiragana: 0x3083,
22803   yasmallkatakana: 0x30E3,
22804   yasmallkatakanahalfwidth: 0xFF6C,
22805   yatcyrillic: 0x0463,
22806   ycircle: 0x24E8,
22807   ycircumflex: 0x0177,
22808   ydieresis: 0x00FF,
22809   ydotaccent: 0x1E8F,
22810   ydotbelow: 0x1EF5,
22811   yeharabic: 0x064A,
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,
22825   yekorean: 0x3156,
22826   yen: 0x00A5,
22827   yenmonospace: 0xFFE5,
22828   yeokorean: 0x3155,
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,
22838   ygrave: 0x1EF3,
22839   yhook: 0x01B4,
22840   yhookabove: 0x1EF7,
22841   yiarmenian: 0x0575,
22842   yicyrillic: 0x0457,
22843   yikorean: 0x3162,
22844   yinyang: 0x262F,
22845   yiwnarmenian: 0x0582,
22846   ymonospace: 0xFF59,
22847   yod: 0x05D9,
22848   yoddagesh: 0xFB39,
22849   yoddageshhebrew: 0xFB39,
22850   yodhebrew: 0x05D9,
22851   yodyodhebrew: 0x05F2,
22852   yodyodpatahhebrew: 0xFB1F,
22853   yohiragana: 0x3088,
22854   yoikorean: 0x3189,
22855   yokatakana: 0x30E8,
22856   yokatakanahalfwidth: 0xFF96,
22857   yokorean: 0x315B,
22858   yosmallhiragana: 0x3087,
22859   yosmallkatakana: 0x30E7,
22860   yosmallkatakanahalfwidth: 0xFF6E,
22861   yotgreek: 0x03F3,
22862   yoyaekorean: 0x3188,
22863   yoyakorean: 0x3187,
22864   yoyakthai: 0x0E22,
22865   yoyingthai: 0x0E0D,
22866   yparen: 0x24B4,
22867   ypogegrammeni: 0x037A,
22868   ypogegrammenigreekcmb: 0x0345,
22869   yr: 0x01A6,
22870   yring: 0x1E99,
22871   ysuperior: 0x02B8,
22872   ytilde: 0x1EF9,
22873   yturned: 0x028E,
22874   yuhiragana: 0x3086,
22875   yuikorean: 0x318C,
22876   yukatakana: 0x30E6,
22877   yukatakanahalfwidth: 0xFF95,
22878   yukorean: 0x3160,
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,
22889   yyadeva: 0x095F,
22890   z: 0x007A,
22891   zaarmenian: 0x0566,
22892   zacute: 0x017A,
22893   zadeva: 0x095B,
22894   zagurmukhi: 0x0A5B,
22895   zaharabic: 0x0638,
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,
22906   zayin: 0x05D6,
22907   zayindagesh: 0xFB36,
22908   zayindageshhebrew: 0xFB36,
22909   zayinhebrew: 0x05D6,
22910   zbopomofo: 0x3117,
22911   zcaron: 0x017E,
22912   zcircle: 0x24E9,
22913   zcircumflex: 0x1E91,
22914   zcurl: 0x0291,
22915   zdot: 0x017C,
22916   zdotaccent: 0x017C,
22917   zdotbelow: 0x1E93,
22918   zecyrillic: 0x0437,
22919   zedescendercyrillic: 0x0499,
22920   zedieresiscyrillic: 0x04DF,
22921   zehiragana: 0x305C,
22922   zekatakana: 0x30BC,
22923   zero: 0x0030,
22924   zeroarabic: 0x0660,
22925   zerobengali: 0x09E6,
22926   zerodeva: 0x0966,
22927   zerogujarati: 0x0AE6,
22928   zerogurmukhi: 0x0A66,
22929   zerohackarabic: 0x0660,
22930   zeroinferior: 0x2080,
22931   zeromonospace: 0xFF10,
22932   zerooldstyle: 0xF730,
22933   zeropersian: 0x06F0,
22934   zerosuperior: 0x2070,
22935   zerothai: 0x0E50,
22936   zerowidthjoiner: 0xFEFF,
22937   zerowidthnonjoiner: 0x200C,
22938   zerowidthspace: 0x200B,
22939   zeta: 0x03B6,
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,
22953   zparen: 0x24B5,
22954   zretroflexhook: 0x0290,
22955   zstroke: 0x01B6,
22956   zuhiragana: 0x305A,
22957   zukatakana: 0x30BA,
22958   '.notdef': 0x0000
22962 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
22963 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
22965 'use strict';
22967 var PDFImage = (function PDFImageClosure() {
22968   /**
22969    * Decode the image in the main thread if it supported. Resovles the promise
22970    * when the image data is ready.
22971    */
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);
22983       });
22984     } else {
22985       promise.resolve(image);
22986     }
22987   }
22988   /**
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.
22991    */
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;
22996   }
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');
23003       // var bits = ...
23004       // var colorspace = ...
23005     }
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: ' +
23014             this.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;
23025         else
23026           error('Bits per component missing in image: ' + this.imageMask);
23027       }
23028     }
23029     this.bpc = bitsPerComponent;
23031     if (!this.imageMask) {
23032       var colorSpace = dict.get('ColorSpace', 'CS');
23033       if (!colorSpace) {
23034         TODO('JPX images (which don"t require color spaces');
23035         colorSpace = new Name('DeviceRGB');
23036       }
23037       this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
23038       this.numComps = this.colorSpace.numComps;
23039     }
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;
23055       }
23056     }
23058     var mask = dict.get('Mask');
23060     if (mask) {
23061       TODO('masked images');
23062     } else if (smask) {
23063       this.smask = new PDFImage(xref, res, smask, false);
23064     }
23065   }
23066   /**
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.
23069    */
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
23075     // resolved.
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);
23079       callback(image);
23080     });
23082     handleImageData(handler, xref, res, image, imageDataPromise);
23084     var smask = image.dict.get('SMask');
23085     if (smask)
23086       handleImageData(handler, xref, res, smask, smaskPromise);
23087     else
23088       smaskPromise.resolve(null);
23089   };
23091   /**
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.
23102    */
23103   PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
23104                                              w1, h1, w2, h2) {
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) {
23120           newIndex *= 3;
23121           oldIndex *= 3;
23122           temp[newIndex] = pixels[oldIndex];
23123           temp[newIndex + 1] = pixels[oldIndex + 1];
23124           temp[newIndex + 2] = pixels[oldIndex + 2];
23125         }
23126       }
23127     }
23128     return temp;
23129   };
23131   PDFImage.prototype = {
23132     get drawWidth() {
23133       if (!this.smask)
23134         return this.width;
23135       return Math.max(this.width, this.smask.width);
23136     },
23137     get drawHeight() {
23138       if (!this.smask)
23139         return this.height;
23140       return Math.max(this.height, this.smask.height);
23141     },
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)
23149         return buffer;
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;
23157       var bufferPos = 0;
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;
23162       if (needsDecode) {
23163         decodeAddends = this.decodeAddends;
23164         decodeCoefficients = this.decodeCoefficients;
23165       }
23166       var max = (1 << bpc) - 1;
23168       if (bpc == 8) {
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);
23175           output[i] = value;
23176         }
23177       } else if (bpc == 1) {
23178         // Optimization for reading 1 bpc images.
23179         var valueZero = 0, valueOne = 1;
23180         if (decodeMap) {
23181           valueZero = decodeMap[0] ? 1 : 0;
23182           valueOne = decodeMap[1] ? 1 : 0;
23183         }
23184         var mask = 0;
23185         var buf = 0;
23187         for (var i = 0, ii = length; i < ii; ++i) {
23188           if (i % rowComps == 0) {
23189             mask = 0;
23190             buf = 0;
23191           } else {
23192             mask >>= 1;
23193           }
23195           if (mask <= 0) {
23196             buf = buffer[bufferPos++];
23197             mask = 128;
23198           }
23200           output[i] = !(buf & mask) ? valueZero : valueOne;
23201         }
23202       } else {
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) {
23207             buf = 0;
23208             bits = 0;
23209           }
23211           while (bits < bpc) {
23212             buf = (buf << 8) | buffer[bufferPos++];
23213             bits += 8;
23214           }
23216           var remainingBits = bits - bpc;
23217           var value = buf >> remainingBits;
23218           if (needsDecode) {
23219             var compIndex = i % numComps;
23220             value = decodeAndClamp(value, decodeAddends[compIndex],
23221                             decodeCoefficients[compIndex], max);
23222           }
23223           output[i] = value;
23224           buf = buf & ((1 << remainingBits) - 1);
23225           bits = remainingBits;
23226         }
23227       }
23228       return output;
23229     },
23230     getOpacity: function PDFImage_getOpacity(width, height) {
23231       var smask = this.smask;
23232       var originalWidth = this.width;
23233       var originalHeight = this.height;
23234       var buf;
23236       if (smask) {
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);
23243       } else {
23244         buf = new Uint8Array(width * height);
23245         for (var i = 0, ii = width * height; i < ii; ++i)
23246           buf[i] = 255;
23247       }
23248       return buf;
23249     },
23250     applyStencilMask: function PDFImage_applyStencilMask(buffer,
23251                                                          inverseDecode) {
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++) {
23260         mask = 0;
23261         for (j = 0; j < width; j++) {
23262           if (!mask) {
23263             buf = imgArray[imgArrayPos++];
23264             mask = 128;
23265           }
23266           if (!(buf & mask) == inverseDecode) {
23267             buffer[bufferPos] = 0;
23268           }
23269           bufferPos += 4;
23270           mask >>= 1;
23271         }
23272       }
23273     },
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);
23289       var compsPos = 0;
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++];
23299       }
23300     },
23301     fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
23302       var numComps = this.numComps;
23303       if (numComps != 1)
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;
23320     },
23321     getImageBytes: function PDFImage_getImageBytes(length) {
23322       this.image.reset();
23323       return this.image.getBytes(length);
23324     }
23325   };
23326   return PDFImage;
23327 })();
23329 function loadJpegStream(id, imageData, objs) {
23330   var img = new Image();
23331   img.onload = (function loadJpegStream_onloadClosure() {
23332     objs.resolve(id, img);
23333   });
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: */
23341 'use strict';
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.
23346 var Metrics = {
23347   'Courier': 600,
23348   'Courier-Bold': 600,
23349   'Courier-BoldOblique': 600,
23350   'Courier-Oblique': 600,
23351   'Helvetica' : {
23352     'space': 278,
23353     'exclam': 278,
23354     'quotedbl': 355,
23355     'numbersign': 556,
23356     'dollar': 556,
23357     'percent': 889,
23358     'ampersand': 667,
23359     'quoteright': 222,
23360     'parenleft': 333,
23361     'parenright': 333,
23362     'asterisk': 389,
23363     'plus': 584,
23364     'comma': 278,
23365     'hyphen': 333,
23366     'period': 278,
23367     'slash': 278,
23368     'zero': 556,
23369     'one': 556,
23370     'two': 556,
23371     'three': 556,
23372     'four': 556,
23373     'five': 556,
23374     'six': 556,
23375     'seven': 556,
23376     'eight': 556,
23377     'nine': 556,
23378     'colon': 278,
23379     'semicolon': 278,
23380     'less': 584,
23381     'equal': 584,
23382     'greater': 584,
23383     'question': 556,
23384     'at': 1015,
23385     'A': 667,
23386     'B': 667,
23387     'C': 722,
23388     'D': 722,
23389     'E': 667,
23390     'F': 611,
23391     'G': 778,
23392     'H': 722,
23393     'I': 278,
23394     'J': 500,
23395     'K': 667,
23396     'L': 556,
23397     'M': 833,
23398     'N': 722,
23399     'O': 778,
23400     'P': 667,
23401     'Q': 778,
23402     'R': 722,
23403     'S': 667,
23404     'T': 611,
23405     'U': 722,
23406     'V': 667,
23407     'W': 944,
23408     'X': 667,
23409     'Y': 667,
23410     'Z': 611,
23411     'bracketleft': 278,
23412     'backslash': 278,
23413     'bracketright': 278,
23414     'asciicircum': 469,
23415     'underscore': 556,
23416     'quoteleft': 222,
23417     'a': 556,
23418     'b': 556,
23419     'c': 500,
23420     'd': 556,
23421     'e': 556,
23422     'f': 278,
23423     'g': 556,
23424     'h': 556,
23425     'i': 222,
23426     'j': 222,
23427     'k': 500,
23428     'l': 222,
23429     'm': 833,
23430     'n': 556,
23431     'o': 556,
23432     'p': 556,
23433     'q': 556,
23434     'r': 333,
23435     's': 500,
23436     't': 278,
23437     'u': 556,
23438     'v': 500,
23439     'w': 722,
23440     'x': 500,
23441     'y': 500,
23442     'z': 500,
23443     'braceleft': 334,
23444     'bar': 260,
23445     'braceright': 334,
23446     'asciitilde': 584,
23447     'exclamdown': 333,
23448     'cent': 556,
23449     'sterling': 556,
23450     'fraction': 167,
23451     'yen': 556,
23452     'florin': 556,
23453     'section': 556,
23454     'currency': 556,
23455     'quotesingle': 191,
23456     'quotedblleft': 333,
23457     'guillemotleft': 556,
23458     'guilsinglleft': 333,
23459     'guilsinglright': 333,
23460     'fi': 500,
23461     'fl': 500,
23462     'endash': 556,
23463     'dagger': 556,
23464     'daggerdbl': 556,
23465     'periodcentered': 278,
23466     'paragraph': 537,
23467     'bullet': 350,
23468     'quotesinglbase': 222,
23469     'quotedblbase': 333,
23470     'quotedblright': 333,
23471     'guillemotright': 556,
23472     'ellipsis': 1000,
23473     'perthousand': 1000,
23474     'questiondown': 611,
23475     'grave': 333,
23476     'acute': 333,
23477     'circumflex': 333,
23478     'tilde': 333,
23479     'macron': 333,
23480     'breve': 333,
23481     'dotaccent': 333,
23482     'dieresis': 333,
23483     'ring': 333,
23484     'cedilla': 333,
23485     'hungarumlaut': 333,
23486     'ogonek': 333,
23487     'caron': 333,
23488     'emdash': 1000,
23489     'AE': 1000,
23490     'ordfeminine': 370,
23491     'Lslash': 556,
23492     'Oslash': 778,
23493     'OE': 1000,
23494     'ordmasculine': 365,
23495     'ae': 889,
23496     'dotlessi': 278,
23497     'lslash': 222,
23498     'oslash': 611,
23499     'oe': 944,
23500     'germandbls': 611,
23501     'Idieresis': 278,
23502     'eacute': 556,
23503     'abreve': 556,
23504     'uhungarumlaut': 556,
23505     'ecaron': 556,
23506     'Ydieresis': 667,
23507     'divide': 584,
23508     'Yacute': 667,
23509     'Acircumflex': 667,
23510     'aacute': 556,
23511     'Ucircumflex': 722,
23512     'yacute': 500,
23513     'scommaaccent': 500,
23514     'ecircumflex': 556,
23515     'Uring': 722,
23516     'Udieresis': 722,
23517     'aogonek': 556,
23518     'Uacute': 722,
23519     'uogonek': 556,
23520     'Edieresis': 667,
23521     'Dcroat': 722,
23522     'commaaccent': 250,
23523     'copyright': 737,
23524     'Emacron': 667,
23525     'ccaron': 500,
23526     'aring': 556,
23527     'Ncommaaccent': 722,
23528     'lacute': 222,
23529     'agrave': 556,
23530     'Tcommaaccent': 611,
23531     'Cacute': 722,
23532     'atilde': 556,
23533     'Edotaccent': 667,
23534     'scaron': 500,
23535     'scedilla': 500,
23536     'iacute': 278,
23537     'lozenge': 471,
23538     'Rcaron': 722,
23539     'Gcommaaccent': 778,
23540     'ucircumflex': 556,
23541     'acircumflex': 556,
23542     'Amacron': 667,
23543     'rcaron': 333,
23544     'ccedilla': 500,
23545     'Zdotaccent': 611,
23546     'Thorn': 667,
23547     'Omacron': 778,
23548     'Racute': 722,
23549     'Sacute': 667,
23550     'dcaron': 643,
23551     'Umacron': 722,
23552     'uring': 556,
23553     'threesuperior': 333,
23554     'Ograve': 778,
23555     'Agrave': 667,
23556     'Abreve': 667,
23557     'multiply': 584,
23558     'uacute': 556,
23559     'Tcaron': 611,
23560     'partialdiff': 476,
23561     'ydieresis': 500,
23562     'Nacute': 722,
23563     'icircumflex': 278,
23564     'Ecircumflex': 667,
23565     'adieresis': 556,
23566     'edieresis': 556,
23567     'cacute': 500,
23568     'nacute': 556,
23569     'umacron': 556,
23570     'Ncaron': 722,
23571     'Iacute': 278,
23572     'plusminus': 584,
23573     'brokenbar': 260,
23574     'registered': 737,
23575     'Gbreve': 778,
23576     'Idotaccent': 278,
23577     'summation': 600,
23578     'Egrave': 667,
23579     'racute': 333,
23580     'omacron': 556,
23581     'Zacute': 611,
23582     'Zcaron': 611,
23583     'greaterequal': 549,
23584     'Eth': 722,
23585     'Ccedilla': 722,
23586     'lcommaaccent': 222,
23587     'tcaron': 317,
23588     'eogonek': 556,
23589     'Uogonek': 722,
23590     'Aacute': 667,
23591     'Adieresis': 667,
23592     'egrave': 556,
23593     'zacute': 500,
23594     'iogonek': 222,
23595     'Oacute': 778,
23596     'oacute': 556,
23597     'amacron': 556,
23598     'sacute': 500,
23599     'idieresis': 278,
23600     'Ocircumflex': 778,
23601     'Ugrave': 722,
23602     'Delta': 612,
23603     'thorn': 556,
23604     'twosuperior': 333,
23605     'Odieresis': 778,
23606     'mu': 556,
23607     'igrave': 278,
23608     'ohungarumlaut': 556,
23609     'Eogonek': 667,
23610     'dcroat': 556,
23611     'threequarters': 834,
23612     'Scedilla': 667,
23613     'lcaron': 299,
23614     'Kcommaaccent': 667,
23615     'Lacute': 556,
23616     'trademark': 1000,
23617     'edotaccent': 556,
23618     'Igrave': 278,
23619     'Imacron': 278,
23620     'Lcaron': 556,
23621     'onehalf': 834,
23622     'lessequal': 549,
23623     'ocircumflex': 556,
23624     'ntilde': 556,
23625     'Uhungarumlaut': 722,
23626     'Eacute': 667,
23627     'emacron': 556,
23628     'gbreve': 556,
23629     'onequarter': 834,
23630     'Scaron': 667,
23631     'Scommaaccent': 667,
23632     'Ohungarumlaut': 778,
23633     'degree': 400,
23634     'ograve': 556,
23635     'Ccaron': 722,
23636     'ugrave': 556,
23637     'radical': 453,
23638     'Dcaron': 722,
23639     'rcommaaccent': 333,
23640     'Ntilde': 722,
23641     'otilde': 556,
23642     'Rcommaaccent': 722,
23643     'Lcommaaccent': 556,
23644     'Atilde': 667,
23645     'Aogonek': 667,
23646     'Aring': 667,
23647     'Otilde': 778,
23648     'zdotaccent': 500,
23649     'Ecaron': 667,
23650     'Iogonek': 278,
23651     'kcommaaccent': 500,
23652     'minus': 584,
23653     'Icircumflex': 278,
23654     'ncaron': 556,
23655     'tcommaaccent': 278,
23656     'logicalnot': 584,
23657     'odieresis': 556,
23658     'udieresis': 556,
23659     'notequal': 549,
23660     'gcommaaccent': 556,
23661     'eth': 556,
23662     'zcaron': 500,
23663     'ncommaaccent': 556,
23664     'onesuperior': 333,
23665     'imacron': 278,
23666     'Euro': 556
23667   },
23668   'Helvetica-Bold': {
23669     'space': 278,
23670     'exclam': 333,
23671     'quotedbl': 474,
23672     'numbersign': 556,
23673     'dollar': 556,
23674     'percent': 889,
23675     'ampersand': 722,
23676     'quoteright': 278,
23677     'parenleft': 333,
23678     'parenright': 333,
23679     'asterisk': 389,
23680     'plus': 584,
23681     'comma': 278,
23682     'hyphen': 333,
23683     'period': 278,
23684     'slash': 278,
23685     'zero': 556,
23686     'one': 556,
23687     'two': 556,
23688     'three': 556,
23689     'four': 556,
23690     'five': 556,
23691     'six': 556,
23692     'seven': 556,
23693     'eight': 556,
23694     'nine': 556,
23695     'colon': 333,
23696     'semicolon': 333,
23697     'less': 584,
23698     'equal': 584,
23699     'greater': 584,
23700     'question': 611,
23701     'at': 975,
23702     'A': 722,
23703     'B': 722,
23704     'C': 722,
23705     'D': 722,
23706     'E': 667,
23707     'F': 611,
23708     'G': 778,
23709     'H': 722,
23710     'I': 278,
23711     'J': 556,
23712     'K': 722,
23713     'L': 611,
23714     'M': 833,
23715     'N': 722,
23716     'O': 778,
23717     'P': 667,
23718     'Q': 778,
23719     'R': 722,
23720     'S': 667,
23721     'T': 611,
23722     'U': 722,
23723     'V': 667,
23724     'W': 944,
23725     'X': 667,
23726     'Y': 667,
23727     'Z': 611,
23728     'bracketleft': 333,
23729     'backslash': 278,
23730     'bracketright': 333,
23731     'asciicircum': 584,
23732     'underscore': 556,
23733     'quoteleft': 278,
23734     'a': 556,
23735     'b': 611,
23736     'c': 556,
23737     'd': 611,
23738     'e': 556,
23739     'f': 333,
23740     'g': 611,
23741     'h': 611,
23742     'i': 278,
23743     'j': 278,
23744     'k': 556,
23745     'l': 278,
23746     'm': 889,
23747     'n': 611,
23748     'o': 611,
23749     'p': 611,
23750     'q': 611,
23751     'r': 389,
23752     's': 556,
23753     't': 333,
23754     'u': 611,
23755     'v': 556,
23756     'w': 778,
23757     'x': 556,
23758     'y': 556,
23759     'z': 500,
23760     'braceleft': 389,
23761     'bar': 280,
23762     'braceright': 389,
23763     'asciitilde': 584,
23764     'exclamdown': 333,
23765     'cent': 556,
23766     'sterling': 556,
23767     'fraction': 167,
23768     'yen': 556,
23769     'florin': 556,
23770     'section': 556,
23771     'currency': 556,
23772     'quotesingle': 238,
23773     'quotedblleft': 500,
23774     'guillemotleft': 556,
23775     'guilsinglleft': 333,
23776     'guilsinglright': 333,
23777     'fi': 611,
23778     'fl': 611,
23779     'endash': 556,
23780     'dagger': 556,
23781     'daggerdbl': 556,
23782     'periodcentered': 278,
23783     'paragraph': 556,
23784     'bullet': 350,
23785     'quotesinglbase': 278,
23786     'quotedblbase': 500,
23787     'quotedblright': 500,
23788     'guillemotright': 556,
23789     'ellipsis': 1000,
23790     'perthousand': 1000,
23791     'questiondown': 611,
23792     'grave': 333,
23793     'acute': 333,
23794     'circumflex': 333,
23795     'tilde': 333,
23796     'macron': 333,
23797     'breve': 333,
23798     'dotaccent': 333,
23799     'dieresis': 333,
23800     'ring': 333,
23801     'cedilla': 333,
23802     'hungarumlaut': 333,
23803     'ogonek': 333,
23804     'caron': 333,
23805     'emdash': 1000,
23806     'AE': 1000,
23807     'ordfeminine': 370,
23808     'Lslash': 611,
23809     'Oslash': 778,
23810     'OE': 1000,
23811     'ordmasculine': 365,
23812     'ae': 889,
23813     'dotlessi': 278,
23814     'lslash': 278,
23815     'oslash': 611,
23816     'oe': 944,
23817     'germandbls': 611,
23818     'Idieresis': 278,
23819     'eacute': 556,
23820     'abreve': 556,
23821     'uhungarumlaut': 611,
23822     'ecaron': 556,
23823     'Ydieresis': 667,
23824     'divide': 584,
23825     'Yacute': 667,
23826     'Acircumflex': 722,
23827     'aacute': 556,
23828     'Ucircumflex': 722,
23829     'yacute': 556,
23830     'scommaaccent': 556,
23831     'ecircumflex': 556,
23832     'Uring': 722,
23833     'Udieresis': 722,
23834     'aogonek': 556,
23835     'Uacute': 722,
23836     'uogonek': 611,
23837     'Edieresis': 667,
23838     'Dcroat': 722,
23839     'commaaccent': 250,
23840     'copyright': 737,
23841     'Emacron': 667,
23842     'ccaron': 556,
23843     'aring': 556,
23844     'Ncommaaccent': 722,
23845     'lacute': 278,
23846     'agrave': 556,
23847     'Tcommaaccent': 611,
23848     'Cacute': 722,
23849     'atilde': 556,
23850     'Edotaccent': 667,
23851     'scaron': 556,
23852     'scedilla': 556,
23853     'iacute': 278,
23854     'lozenge': 494,
23855     'Rcaron': 722,
23856     'Gcommaaccent': 778,
23857     'ucircumflex': 611,
23858     'acircumflex': 556,
23859     'Amacron': 722,
23860     'rcaron': 389,
23861     'ccedilla': 556,
23862     'Zdotaccent': 611,
23863     'Thorn': 667,
23864     'Omacron': 778,
23865     'Racute': 722,
23866     'Sacute': 667,
23867     'dcaron': 743,
23868     'Umacron': 722,
23869     'uring': 611,
23870     'threesuperior': 333,
23871     'Ograve': 778,
23872     'Agrave': 722,
23873     'Abreve': 722,
23874     'multiply': 584,
23875     'uacute': 611,
23876     'Tcaron': 611,
23877     'partialdiff': 494,
23878     'ydieresis': 556,
23879     'Nacute': 722,
23880     'icircumflex': 278,
23881     'Ecircumflex': 667,
23882     'adieresis': 556,
23883     'edieresis': 556,
23884     'cacute': 556,
23885     'nacute': 611,
23886     'umacron': 611,
23887     'Ncaron': 722,
23888     'Iacute': 278,
23889     'plusminus': 584,
23890     'brokenbar': 280,
23891     'registered': 737,
23892     'Gbreve': 778,
23893     'Idotaccent': 278,
23894     'summation': 600,
23895     'Egrave': 667,
23896     'racute': 389,
23897     'omacron': 611,
23898     'Zacute': 611,
23899     'Zcaron': 611,
23900     'greaterequal': 549,
23901     'Eth': 722,
23902     'Ccedilla': 722,
23903     'lcommaaccent': 278,
23904     'tcaron': 389,
23905     'eogonek': 556,
23906     'Uogonek': 722,
23907     'Aacute': 722,
23908     'Adieresis': 722,
23909     'egrave': 556,
23910     'zacute': 500,
23911     'iogonek': 278,
23912     'Oacute': 778,
23913     'oacute': 611,
23914     'amacron': 556,
23915     'sacute': 556,
23916     'idieresis': 278,
23917     'Ocircumflex': 778,
23918     'Ugrave': 722,
23919     'Delta': 612,
23920     'thorn': 611,
23921     'twosuperior': 333,
23922     'Odieresis': 778,
23923     'mu': 611,
23924     'igrave': 278,
23925     'ohungarumlaut': 611,
23926     'Eogonek': 667,
23927     'dcroat': 611,
23928     'threequarters': 834,
23929     'Scedilla': 667,
23930     'lcaron': 400,
23931     'Kcommaaccent': 722,
23932     'Lacute': 611,
23933     'trademark': 1000,
23934     'edotaccent': 556,
23935     'Igrave': 278,
23936     'Imacron': 278,
23937     'Lcaron': 611,
23938     'onehalf': 834,
23939     'lessequal': 549,
23940     'ocircumflex': 611,
23941     'ntilde': 611,
23942     'Uhungarumlaut': 722,
23943     'Eacute': 667,
23944     'emacron': 556,
23945     'gbreve': 611,
23946     'onequarter': 834,
23947     'Scaron': 667,
23948     'Scommaaccent': 667,
23949     'Ohungarumlaut': 778,
23950     'degree': 400,
23951     'ograve': 611,
23952     'Ccaron': 722,
23953     'ugrave': 611,
23954     'radical': 549,
23955     'Dcaron': 722,
23956     'rcommaaccent': 389,
23957     'Ntilde': 722,
23958     'otilde': 611,
23959     'Rcommaaccent': 722,
23960     'Lcommaaccent': 611,
23961     'Atilde': 722,
23962     'Aogonek': 722,
23963     'Aring': 722,
23964     'Otilde': 778,
23965     'zdotaccent': 500,
23966     'Ecaron': 667,
23967     'Iogonek': 278,
23968     'kcommaaccent': 556,
23969     'minus': 584,
23970     'Icircumflex': 278,
23971     'ncaron': 611,
23972     'tcommaaccent': 333,
23973     'logicalnot': 584,
23974     'odieresis': 611,
23975     'udieresis': 611,
23976     'notequal': 549,
23977     'gcommaaccent': 611,
23978     'eth': 611,
23979     'zcaron': 500,
23980     'ncommaaccent': 611,
23981     'onesuperior': 333,
23982     'imacron': 278,
23983     'Euro': 556
23984   },
23985   'Helvetica-BoldOblique': {
23986     'space': 278,
23987     'exclam': 333,
23988     'quotedbl': 474,
23989     'numbersign': 556,
23990     'dollar': 556,
23991     'percent': 889,
23992     'ampersand': 722,
23993     'quoteright': 278,
23994     'parenleft': 333,
23995     'parenright': 333,
23996     'asterisk': 389,
23997     'plus': 584,
23998     'comma': 278,
23999     'hyphen': 333,
24000     'period': 278,
24001     'slash': 278,
24002     'zero': 556,
24003     'one': 556,
24004     'two': 556,
24005     'three': 556,
24006     'four': 556,
24007     'five': 556,
24008     'six': 556,
24009     'seven': 556,
24010     'eight': 556,
24011     'nine': 556,
24012     'colon': 333,
24013     'semicolon': 333,
24014     'less': 584,
24015     'equal': 584,
24016     'greater': 584,
24017     'question': 611,
24018     'at': 975,
24019     'A': 722,
24020     'B': 722,
24021     'C': 722,
24022     'D': 722,
24023     'E': 667,
24024     'F': 611,
24025     'G': 778,
24026     'H': 722,
24027     'I': 278,
24028     'J': 556,
24029     'K': 722,
24030     'L': 611,
24031     'M': 833,
24032     'N': 722,
24033     'O': 778,
24034     'P': 667,
24035     'Q': 778,
24036     'R': 722,
24037     'S': 667,
24038     'T': 611,
24039     'U': 722,
24040     'V': 667,
24041     'W': 944,
24042     'X': 667,
24043     'Y': 667,
24044     'Z': 611,
24045     'bracketleft': 333,
24046     'backslash': 278,
24047     'bracketright': 333,
24048     'asciicircum': 584,
24049     'underscore': 556,
24050     'quoteleft': 278,
24051     'a': 556,
24052     'b': 611,
24053     'c': 556,
24054     'd': 611,
24055     'e': 556,
24056     'f': 333,
24057     'g': 611,
24058     'h': 611,
24059     'i': 278,
24060     'j': 278,
24061     'k': 556,
24062     'l': 278,
24063     'm': 889,
24064     'n': 611,
24065     'o': 611,
24066     'p': 611,
24067     'q': 611,
24068     'r': 389,
24069     's': 556,
24070     't': 333,
24071     'u': 611,
24072     'v': 556,
24073     'w': 778,
24074     'x': 556,
24075     'y': 556,
24076     'z': 500,
24077     'braceleft': 389,
24078     'bar': 280,
24079     'braceright': 389,
24080     'asciitilde': 584,
24081     'exclamdown': 333,
24082     'cent': 556,
24083     'sterling': 556,
24084     'fraction': 167,
24085     'yen': 556,
24086     'florin': 556,
24087     'section': 556,
24088     'currency': 556,
24089     'quotesingle': 238,
24090     'quotedblleft': 500,
24091     'guillemotleft': 556,
24092     'guilsinglleft': 333,
24093     'guilsinglright': 333,
24094     'fi': 611,
24095     'fl': 611,
24096     'endash': 556,
24097     'dagger': 556,
24098     'daggerdbl': 556,
24099     'periodcentered': 278,
24100     'paragraph': 556,
24101     'bullet': 350,
24102     'quotesinglbase': 278,
24103     'quotedblbase': 500,
24104     'quotedblright': 500,
24105     'guillemotright': 556,
24106     'ellipsis': 1000,
24107     'perthousand': 1000,
24108     'questiondown': 611,
24109     'grave': 333,
24110     'acute': 333,
24111     'circumflex': 333,
24112     'tilde': 333,
24113     'macron': 333,
24114     'breve': 333,
24115     'dotaccent': 333,
24116     'dieresis': 333,
24117     'ring': 333,
24118     'cedilla': 333,
24119     'hungarumlaut': 333,
24120     'ogonek': 333,
24121     'caron': 333,
24122     'emdash': 1000,
24123     'AE': 1000,
24124     'ordfeminine': 370,
24125     'Lslash': 611,
24126     'Oslash': 778,
24127     'OE': 1000,
24128     'ordmasculine': 365,
24129     'ae': 889,
24130     'dotlessi': 278,
24131     'lslash': 278,
24132     'oslash': 611,
24133     'oe': 944,
24134     'germandbls': 611,
24135     'Idieresis': 278,
24136     'eacute': 556,
24137     'abreve': 556,
24138     'uhungarumlaut': 611,
24139     'ecaron': 556,
24140     'Ydieresis': 667,
24141     'divide': 584,
24142     'Yacute': 667,
24143     'Acircumflex': 722,
24144     'aacute': 556,
24145     'Ucircumflex': 722,
24146     'yacute': 556,
24147     'scommaaccent': 556,
24148     'ecircumflex': 556,
24149     'Uring': 722,
24150     'Udieresis': 722,
24151     'aogonek': 556,
24152     'Uacute': 722,
24153     'uogonek': 611,
24154     'Edieresis': 667,
24155     'Dcroat': 722,
24156     'commaaccent': 250,
24157     'copyright': 737,
24158     'Emacron': 667,
24159     'ccaron': 556,
24160     'aring': 556,
24161     'Ncommaaccent': 722,
24162     'lacute': 278,
24163     'agrave': 556,
24164     'Tcommaaccent': 611,
24165     'Cacute': 722,
24166     'atilde': 556,
24167     'Edotaccent': 667,
24168     'scaron': 556,
24169     'scedilla': 556,
24170     'iacute': 278,
24171     'lozenge': 494,
24172     'Rcaron': 722,
24173     'Gcommaaccent': 778,
24174     'ucircumflex': 611,
24175     'acircumflex': 556,
24176     'Amacron': 722,
24177     'rcaron': 389,
24178     'ccedilla': 556,
24179     'Zdotaccent': 611,
24180     'Thorn': 667,
24181     'Omacron': 778,
24182     'Racute': 722,
24183     'Sacute': 667,
24184     'dcaron': 743,
24185     'Umacron': 722,
24186     'uring': 611,
24187     'threesuperior': 333,
24188     'Ograve': 778,
24189     'Agrave': 722,
24190     'Abreve': 722,
24191     'multiply': 584,
24192     'uacute': 611,
24193     'Tcaron': 611,
24194     'partialdiff': 494,
24195     'ydieresis': 556,
24196     'Nacute': 722,
24197     'icircumflex': 278,
24198     'Ecircumflex': 667,
24199     'adieresis': 556,
24200     'edieresis': 556,
24201     'cacute': 556,
24202     'nacute': 611,
24203     'umacron': 611,
24204     'Ncaron': 722,
24205     'Iacute': 278,
24206     'plusminus': 584,
24207     'brokenbar': 280,
24208     'registered': 737,
24209     'Gbreve': 778,
24210     'Idotaccent': 278,
24211     'summation': 600,
24212     'Egrave': 667,
24213     'racute': 389,
24214     'omacron': 611,
24215     'Zacute': 611,
24216     'Zcaron': 611,
24217     'greaterequal': 549,
24218     'Eth': 722,
24219     'Ccedilla': 722,
24220     'lcommaaccent': 278,
24221     'tcaron': 389,
24222     'eogonek': 556,
24223     'Uogonek': 722,
24224     'Aacute': 722,
24225     'Adieresis': 722,
24226     'egrave': 556,
24227     'zacute': 500,
24228     'iogonek': 278,
24229     'Oacute': 778,
24230     'oacute': 611,
24231     'amacron': 556,
24232     'sacute': 556,
24233     'idieresis': 278,
24234     'Ocircumflex': 778,
24235     'Ugrave': 722,
24236     'Delta': 612,
24237     'thorn': 611,
24238     'twosuperior': 333,
24239     'Odieresis': 778,
24240     'mu': 611,
24241     'igrave': 278,
24242     'ohungarumlaut': 611,
24243     'Eogonek': 667,
24244     'dcroat': 611,
24245     'threequarters': 834,
24246     'Scedilla': 667,
24247     'lcaron': 400,
24248     'Kcommaaccent': 722,
24249     'Lacute': 611,
24250     'trademark': 1000,
24251     'edotaccent': 556,
24252     'Igrave': 278,
24253     'Imacron': 278,
24254     'Lcaron': 611,
24255     'onehalf': 834,
24256     'lessequal': 549,
24257     'ocircumflex': 611,
24258     'ntilde': 611,
24259     'Uhungarumlaut': 722,
24260     'Eacute': 667,
24261     'emacron': 556,
24262     'gbreve': 611,
24263     'onequarter': 834,
24264     'Scaron': 667,
24265     'Scommaaccent': 667,
24266     'Ohungarumlaut': 778,
24267     'degree': 400,
24268     'ograve': 611,
24269     'Ccaron': 722,
24270     'ugrave': 611,
24271     'radical': 549,
24272     'Dcaron': 722,
24273     'rcommaaccent': 389,
24274     'Ntilde': 722,
24275     'otilde': 611,
24276     'Rcommaaccent': 722,
24277     'Lcommaaccent': 611,
24278     'Atilde': 722,
24279     'Aogonek': 722,
24280     'Aring': 722,
24281     'Otilde': 778,
24282     'zdotaccent': 500,
24283     'Ecaron': 667,
24284     'Iogonek': 278,
24285     'kcommaaccent': 556,
24286     'minus': 584,
24287     'Icircumflex': 278,
24288     'ncaron': 611,
24289     'tcommaaccent': 333,
24290     'logicalnot': 584,
24291     'odieresis': 611,
24292     'udieresis': 611,
24293     'notequal': 549,
24294     'gcommaaccent': 611,
24295     'eth': 611,
24296     'zcaron': 500,
24297     'ncommaaccent': 611,
24298     'onesuperior': 333,
24299     'imacron': 278,
24300     'Euro': 556
24301   },
24302   'Helvetica-Oblique' : {
24303     'space': 278,
24304     'exclam': 278,
24305     'quotedbl': 355,
24306     'numbersign': 556,
24307     'dollar': 556,
24308     'percent': 889,
24309     'ampersand': 667,
24310     'quoteright': 222,
24311     'parenleft': 333,
24312     'parenright': 333,
24313     'asterisk': 389,
24314     'plus': 584,
24315     'comma': 278,
24316     'hyphen': 333,
24317     'period': 278,
24318     'slash': 278,
24319     'zero': 556,
24320     'one': 556,
24321     'two': 556,
24322     'three': 556,
24323     'four': 556,
24324     'five': 556,
24325     'six': 556,
24326     'seven': 556,
24327     'eight': 556,
24328     'nine': 556,
24329     'colon': 278,
24330     'semicolon': 278,
24331     'less': 584,
24332     'equal': 584,
24333     'greater': 584,
24334     'question': 556,
24335     'at': 1015,
24336     'A': 667,
24337     'B': 667,
24338     'C': 722,
24339     'D': 722,
24340     'E': 667,
24341     'F': 611,
24342     'G': 778,
24343     'H': 722,
24344     'I': 278,
24345     'J': 500,
24346     'K': 667,
24347     'L': 556,
24348     'M': 833,
24349     'N': 722,
24350     'O': 778,
24351     'P': 667,
24352     'Q': 778,
24353     'R': 722,
24354     'S': 667,
24355     'T': 611,
24356     'U': 722,
24357     'V': 667,
24358     'W': 944,
24359     'X': 667,
24360     'Y': 667,
24361     'Z': 611,
24362     'bracketleft': 278,
24363     'backslash': 278,
24364     'bracketright': 278,
24365     'asciicircum': 469,
24366     'underscore': 556,
24367     'quoteleft': 222,
24368     'a': 556,
24369     'b': 556,
24370     'c': 500,
24371     'd': 556,
24372     'e': 556,
24373     'f': 278,
24374     'g': 556,
24375     'h': 556,
24376     'i': 222,
24377     'j': 222,
24378     'k': 500,
24379     'l': 222,
24380     'm': 833,
24381     'n': 556,
24382     'o': 556,
24383     'p': 556,
24384     'q': 556,
24385     'r': 333,
24386     's': 500,
24387     't': 278,
24388     'u': 556,
24389     'v': 500,
24390     'w': 722,
24391     'x': 500,
24392     'y': 500,
24393     'z': 500,
24394     'braceleft': 334,
24395     'bar': 260,
24396     'braceright': 334,
24397     'asciitilde': 584,
24398     'exclamdown': 333,
24399     'cent': 556,
24400     'sterling': 556,
24401     'fraction': 167,
24402     'yen': 556,
24403     'florin': 556,
24404     'section': 556,
24405     'currency': 556,
24406     'quotesingle': 191,
24407     'quotedblleft': 333,
24408     'guillemotleft': 556,
24409     'guilsinglleft': 333,
24410     'guilsinglright': 333,
24411     'fi': 500,
24412     'fl': 500,
24413     'endash': 556,
24414     'dagger': 556,
24415     'daggerdbl': 556,
24416     'periodcentered': 278,
24417     'paragraph': 537,
24418     'bullet': 350,
24419     'quotesinglbase': 222,
24420     'quotedblbase': 333,
24421     'quotedblright': 333,
24422     'guillemotright': 556,
24423     'ellipsis': 1000,
24424     'perthousand': 1000,
24425     'questiondown': 611,
24426     'grave': 333,
24427     'acute': 333,
24428     'circumflex': 333,
24429     'tilde': 333,
24430     'macron': 333,
24431     'breve': 333,
24432     'dotaccent': 333,
24433     'dieresis': 333,
24434     'ring': 333,
24435     'cedilla': 333,
24436     'hungarumlaut': 333,
24437     'ogonek': 333,
24438     'caron': 333,
24439     'emdash': 1000,
24440     'AE': 1000,
24441     'ordfeminine': 370,
24442     'Lslash': 556,
24443     'Oslash': 778,
24444     'OE': 1000,
24445     'ordmasculine': 365,
24446     'ae': 889,
24447     'dotlessi': 278,
24448     'lslash': 222,
24449     'oslash': 611,
24450     'oe': 944,
24451     'germandbls': 611,
24452     'Idieresis': 278,
24453     'eacute': 556,
24454     'abreve': 556,
24455     'uhungarumlaut': 556,
24456     'ecaron': 556,
24457     'Ydieresis': 667,
24458     'divide': 584,
24459     'Yacute': 667,
24460     'Acircumflex': 667,
24461     'aacute': 556,
24462     'Ucircumflex': 722,
24463     'yacute': 500,
24464     'scommaaccent': 500,
24465     'ecircumflex': 556,
24466     'Uring': 722,
24467     'Udieresis': 722,
24468     'aogonek': 556,
24469     'Uacute': 722,
24470     'uogonek': 556,
24471     'Edieresis': 667,
24472     'Dcroat': 722,
24473     'commaaccent': 250,
24474     'copyright': 737,
24475     'Emacron': 667,
24476     'ccaron': 500,
24477     'aring': 556,
24478     'Ncommaaccent': 722,
24479     'lacute': 222,
24480     'agrave': 556,
24481     'Tcommaaccent': 611,
24482     'Cacute': 722,
24483     'atilde': 556,
24484     'Edotaccent': 667,
24485     'scaron': 500,
24486     'scedilla': 500,
24487     'iacute': 278,
24488     'lozenge': 471,
24489     'Rcaron': 722,
24490     'Gcommaaccent': 778,
24491     'ucircumflex': 556,
24492     'acircumflex': 556,
24493     'Amacron': 667,
24494     'rcaron': 333,
24495     'ccedilla': 500,
24496     'Zdotaccent': 611,
24497     'Thorn': 667,
24498     'Omacron': 778,
24499     'Racute': 722,
24500     'Sacute': 667,
24501     'dcaron': 643,
24502     'Umacron': 722,
24503     'uring': 556,
24504     'threesuperior': 333,
24505     'Ograve': 778,
24506     'Agrave': 667,
24507     'Abreve': 667,
24508     'multiply': 584,
24509     'uacute': 556,
24510     'Tcaron': 611,
24511     'partialdiff': 476,
24512     'ydieresis': 500,
24513     'Nacute': 722,
24514     'icircumflex': 278,
24515     'Ecircumflex': 667,
24516     'adieresis': 556,
24517     'edieresis': 556,
24518     'cacute': 500,
24519     'nacute': 556,
24520     'umacron': 556,
24521     'Ncaron': 722,
24522     'Iacute': 278,
24523     'plusminus': 584,
24524     'brokenbar': 260,
24525     'registered': 737,
24526     'Gbreve': 778,
24527     'Idotaccent': 278,
24528     'summation': 600,
24529     'Egrave': 667,
24530     'racute': 333,
24531     'omacron': 556,
24532     'Zacute': 611,
24533     'Zcaron': 611,
24534     'greaterequal': 549,
24535     'Eth': 722,
24536     'Ccedilla': 722,
24537     'lcommaaccent': 222,
24538     'tcaron': 317,
24539     'eogonek': 556,
24540     'Uogonek': 722,
24541     'Aacute': 667,
24542     'Adieresis': 667,
24543     'egrave': 556,
24544     'zacute': 500,
24545     'iogonek': 222,
24546     'Oacute': 778,
24547     'oacute': 556,
24548     'amacron': 556,
24549     'sacute': 500,
24550     'idieresis': 278,
24551     'Ocircumflex': 778,
24552     'Ugrave': 722,
24553     'Delta': 612,
24554     'thorn': 556,
24555     'twosuperior': 333,
24556     'Odieresis': 778,
24557     'mu': 556,
24558     'igrave': 278,
24559     'ohungarumlaut': 556,
24560     'Eogonek': 667,
24561     'dcroat': 556,
24562     'threequarters': 834,
24563     'Scedilla': 667,
24564     'lcaron': 299,
24565     'Kcommaaccent': 667,
24566     'Lacute': 556,
24567     'trademark': 1000,
24568     'edotaccent': 556,
24569     'Igrave': 278,
24570     'Imacron': 278,
24571     'Lcaron': 556,
24572     'onehalf': 834,
24573     'lessequal': 549,
24574     'ocircumflex': 556,
24575     'ntilde': 556,
24576     'Uhungarumlaut': 722,
24577     'Eacute': 667,
24578     'emacron': 556,
24579     'gbreve': 556,
24580     'onequarter': 834,
24581     'Scaron': 667,
24582     'Scommaaccent': 667,
24583     'Ohungarumlaut': 778,
24584     'degree': 400,
24585     'ograve': 556,
24586     'Ccaron': 722,
24587     'ugrave': 556,
24588     'radical': 453,
24589     'Dcaron': 722,
24590     'rcommaaccent': 333,
24591     'Ntilde': 722,
24592     'otilde': 556,
24593     'Rcommaaccent': 722,
24594     'Lcommaaccent': 556,
24595     'Atilde': 667,
24596     'Aogonek': 667,
24597     'Aring': 667,
24598     'Otilde': 778,
24599     'zdotaccent': 500,
24600     'Ecaron': 667,
24601     'Iogonek': 278,
24602     'kcommaaccent': 500,
24603     'minus': 584,
24604     'Icircumflex': 278,
24605     'ncaron': 556,
24606     'tcommaaccent': 278,
24607     'logicalnot': 584,
24608     'odieresis': 556,
24609     'udieresis': 556,
24610     'notequal': 549,
24611     'gcommaaccent': 556,
24612     'eth': 556,
24613     'zcaron': 500,
24614     'ncommaaccent': 556,
24615     'onesuperior': 333,
24616     'imacron': 278,
24617     'Euro': 556
24618   },
24619   'Symbol': {
24620     'space': 250,
24621     'exclam': 333,
24622     'universal': 713,
24623     'numbersign': 500,
24624     'existential': 549,
24625     'percent': 833,
24626     'ampersand': 778,
24627     'suchthat': 439,
24628     'parenleft': 333,
24629     'parenright': 333,
24630     'asteriskmath': 500,
24631     'plus': 549,
24632     'comma': 250,
24633     'minus': 549,
24634     'period': 250,
24635     'slash': 278,
24636     'zero': 500,
24637     'one': 500,
24638     'two': 500,
24639     'three': 500,
24640     'four': 500,
24641     'five': 500,
24642     'six': 500,
24643     'seven': 500,
24644     'eight': 500,
24645     'nine': 500,
24646     'colon': 278,
24647     'semicolon': 278,
24648     'less': 549,
24649     'equal': 549,
24650     'greater': 549,
24651     'question': 444,
24652     'congruent': 549,
24653     'Alpha': 722,
24654     'Beta': 667,
24655     'Chi': 722,
24656     'Delta': 612,
24657     'Epsilon': 611,
24658     'Phi': 763,
24659     'Gamma': 603,
24660     'Eta': 722,
24661     'Iota': 333,
24662     'theta1': 631,
24663     'Kappa': 722,
24664     'Lambda': 686,
24665     'Mu': 889,
24666     'Nu': 722,
24667     'Omicron': 722,
24668     'Pi': 768,
24669     'Theta': 741,
24670     'Rho': 556,
24671     'Sigma': 592,
24672     'Tau': 611,
24673     'Upsilon': 690,
24674     'sigma1': 439,
24675     'Omega': 768,
24676     'Xi': 645,
24677     'Psi': 795,
24678     'Zeta': 611,
24679     'bracketleft': 333,
24680     'therefore': 863,
24681     'bracketright': 333,
24682     'perpendicular': 658,
24683     'underscore': 500,
24684     'radicalex': 500,
24685     'alpha': 631,
24686     'beta': 549,
24687     'chi': 549,
24688     'delta': 494,
24689     'epsilon': 439,
24690     'phi': 521,
24691     'gamma': 411,
24692     'eta': 603,
24693     'iota': 329,
24694     'phi1': 603,
24695     'kappa': 549,
24696     'lambda': 549,
24697     'mu': 576,
24698     'nu': 521,
24699     'omicron': 549,
24700     'pi': 549,
24701     'theta': 521,
24702     'rho': 549,
24703     'sigma': 603,
24704     'tau': 439,
24705     'upsilon': 576,
24706     'omega1': 713,
24707     'omega': 686,
24708     'xi': 493,
24709     'psi': 686,
24710     'zeta': 494,
24711     'braceleft': 480,
24712     'bar': 200,
24713     'braceright': 480,
24714     'similar': 549,
24715     'Euro': 750,
24716     'Upsilon1': 620,
24717     'minute': 247,
24718     'lessequal': 549,
24719     'fraction': 167,
24720     'infinity': 713,
24721     'florin': 500,
24722     'club': 753,
24723     'diamond': 753,
24724     'heart': 753,
24725     'spade': 753,
24726     'arrowboth': 1042,
24727     'arrowleft': 987,
24728     'arrowup': 603,
24729     'arrowright': 987,
24730     'arrowdown': 603,
24731     'degree': 400,
24732     'plusminus': 549,
24733     'second': 411,
24734     'greaterequal': 549,
24735     'multiply': 549,
24736     'proportional': 713,
24737     'partialdiff': 494,
24738     'bullet': 460,
24739     'divide': 549,
24740     'notequal': 549,
24741     'equivalence': 549,
24742     'approxequal': 549,
24743     'ellipsis': 1000,
24744     'arrowvertex': 603,
24745     'arrowhorizex': 1000,
24746     'carriagereturn': 658,
24747     'aleph': 823,
24748     'Ifraktur': 686,
24749     'Rfraktur': 795,
24750     'weierstrass': 987,
24751     'circlemultiply': 768,
24752     'circleplus': 768,
24753     'emptyset': 823,
24754     'intersection': 768,
24755     'union': 768,
24756     'propersuperset': 713,
24757     'reflexsuperset': 713,
24758     'notsubset': 713,
24759     'propersubset': 713,
24760     'reflexsubset': 713,
24761     'element': 713,
24762     'notelement': 713,
24763     'angle': 768,
24764     'gradient': 713,
24765     'registerserif': 790,
24766     'copyrightserif': 790,
24767     'trademarkserif': 890,
24768     'product': 823,
24769     'radical': 549,
24770     'dotmath': 250,
24771     'logicalnot': 713,
24772     'logicaland': 603,
24773     'logicalor': 603,
24774     'arrowdblboth': 1042,
24775     'arrowdblleft': 987,
24776     'arrowdblup': 603,
24777     'arrowdblright': 987,
24778     'arrowdbldown': 603,
24779     'lozenge': 494,
24780     'angleleft': 329,
24781     'registersans': 790,
24782     'copyrightsans': 790,
24783     'trademarksans': 786,
24784     'summation': 713,
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,
24794     'braceex': 494,
24795     'angleright': 329,
24796     'integral': 274,
24797     'integraltp': 686,
24798     'integralex': 686,
24799     'integralbt': 686,
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,
24809     'apple': 790
24810   },
24811   'Times-Roman': {
24812     'space': 250,
24813     'exclam': 333,
24814     'quotedbl': 408,
24815     'numbersign': 500,
24816     'dollar': 500,
24817     'percent': 833,
24818     'ampersand': 778,
24819     'quoteright': 333,
24820     'parenleft': 333,
24821     'parenright': 333,
24822     'asterisk': 500,
24823     'plus': 564,
24824     'comma': 250,
24825     'hyphen': 333,
24826     'period': 250,
24827     'slash': 278,
24828     'zero': 500,
24829     'one': 500,
24830     'two': 500,
24831     'three': 500,
24832     'four': 500,
24833     'five': 500,
24834     'six': 500,
24835     'seven': 500,
24836     'eight': 500,
24837     'nine': 500,
24838     'colon': 278,
24839     'semicolon': 278,
24840     'less': 564,
24841     'equal': 564,
24842     'greater': 564,
24843     'question': 444,
24844     'at': 921,
24845     'A': 722,
24846     'B': 667,
24847     'C': 667,
24848     'D': 722,
24849     'E': 611,
24850     'F': 556,
24851     'G': 722,
24852     'H': 722,
24853     'I': 333,
24854     'J': 389,
24855     'K': 722,
24856     'L': 611,
24857     'M': 889,
24858     'N': 722,
24859     'O': 722,
24860     'P': 556,
24861     'Q': 722,
24862     'R': 667,
24863     'S': 556,
24864     'T': 611,
24865     'U': 722,
24866     'V': 722,
24867     'W': 944,
24868     'X': 722,
24869     'Y': 722,
24870     'Z': 611,
24871     'bracketleft': 333,
24872     'backslash': 278,
24873     'bracketright': 333,
24874     'asciicircum': 469,
24875     'underscore': 500,
24876     'quoteleft': 333,
24877     'a': 444,
24878     'b': 500,
24879     'c': 444,
24880     'd': 500,
24881     'e': 444,
24882     'f': 333,
24883     'g': 500,
24884     'h': 500,
24885     'i': 278,
24886     'j': 278,
24887     'k': 500,
24888     'l': 278,
24889     'm': 778,
24890     'n': 500,
24891     'o': 500,
24892     'p': 500,
24893     'q': 500,
24894     'r': 333,
24895     's': 389,
24896     't': 278,
24897     'u': 500,
24898     'v': 500,
24899     'w': 722,
24900     'x': 500,
24901     'y': 500,
24902     'z': 444,
24903     'braceleft': 480,
24904     'bar': 200,
24905     'braceright': 480,
24906     'asciitilde': 541,
24907     'exclamdown': 333,
24908     'cent': 500,
24909     'sterling': 500,
24910     'fraction': 167,
24911     'yen': 500,
24912     'florin': 500,
24913     'section': 500,
24914     'currency': 500,
24915     'quotesingle': 180,
24916     'quotedblleft': 444,
24917     'guillemotleft': 500,
24918     'guilsinglleft': 333,
24919     'guilsinglright': 333,
24920     'fi': 556,
24921     'fl': 556,
24922     'endash': 500,
24923     'dagger': 500,
24924     'daggerdbl': 500,
24925     'periodcentered': 250,
24926     'paragraph': 453,
24927     'bullet': 350,
24928     'quotesinglbase': 333,
24929     'quotedblbase': 444,
24930     'quotedblright': 444,
24931     'guillemotright': 500,
24932     'ellipsis': 1000,
24933     'perthousand': 1000,
24934     'questiondown': 444,
24935     'grave': 333,
24936     'acute': 333,
24937     'circumflex': 333,
24938     'tilde': 333,
24939     'macron': 333,
24940     'breve': 333,
24941     'dotaccent': 333,
24942     'dieresis': 333,
24943     'ring': 333,
24944     'cedilla': 333,
24945     'hungarumlaut': 333,
24946     'ogonek': 333,
24947     'caron': 333,
24948     'emdash': 1000,
24949     'AE': 889,
24950     'ordfeminine': 276,
24951     'Lslash': 611,
24952     'Oslash': 722,
24953     'OE': 889,
24954     'ordmasculine': 310,
24955     'ae': 667,
24956     'dotlessi': 278,
24957     'lslash': 278,
24958     'oslash': 500,
24959     'oe': 722,
24960     'germandbls': 500,
24961     'Idieresis': 333,
24962     'eacute': 444,
24963     'abreve': 444,
24964     'uhungarumlaut': 500,
24965     'ecaron': 444,
24966     'Ydieresis': 722,
24967     'divide': 564,
24968     'Yacute': 722,
24969     'Acircumflex': 722,
24970     'aacute': 444,
24971     'Ucircumflex': 722,
24972     'yacute': 500,
24973     'scommaaccent': 389,
24974     'ecircumflex': 444,
24975     'Uring': 722,
24976     'Udieresis': 722,
24977     'aogonek': 444,
24978     'Uacute': 722,
24979     'uogonek': 500,
24980     'Edieresis': 611,
24981     'Dcroat': 722,
24982     'commaaccent': 250,
24983     'copyright': 760,
24984     'Emacron': 611,
24985     'ccaron': 444,
24986     'aring': 444,
24987     'Ncommaaccent': 722,
24988     'lacute': 278,
24989     'agrave': 444,
24990     'Tcommaaccent': 611,
24991     'Cacute': 667,
24992     'atilde': 444,
24993     'Edotaccent': 611,
24994     'scaron': 389,
24995     'scedilla': 389,
24996     'iacute': 278,
24997     'lozenge': 471,
24998     'Rcaron': 667,
24999     'Gcommaaccent': 722,
25000     'ucircumflex': 500,
25001     'acircumflex': 444,
25002     'Amacron': 722,
25003     'rcaron': 333,
25004     'ccedilla': 444,
25005     'Zdotaccent': 611,
25006     'Thorn': 556,
25007     'Omacron': 722,
25008     'Racute': 667,
25009     'Sacute': 556,
25010     'dcaron': 588,
25011     'Umacron': 722,
25012     'uring': 500,
25013     'threesuperior': 300,
25014     'Ograve': 722,
25015     'Agrave': 722,
25016     'Abreve': 722,
25017     'multiply': 564,
25018     'uacute': 500,
25019     'Tcaron': 611,
25020     'partialdiff': 476,
25021     'ydieresis': 500,
25022     'Nacute': 722,
25023     'icircumflex': 278,
25024     'Ecircumflex': 611,
25025     'adieresis': 444,
25026     'edieresis': 444,
25027     'cacute': 444,
25028     'nacute': 500,
25029     'umacron': 500,
25030     'Ncaron': 722,
25031     'Iacute': 333,
25032     'plusminus': 564,
25033     'brokenbar': 200,
25034     'registered': 760,
25035     'Gbreve': 722,
25036     'Idotaccent': 333,
25037     'summation': 600,
25038     'Egrave': 611,
25039     'racute': 333,
25040     'omacron': 500,
25041     'Zacute': 611,
25042     'Zcaron': 611,
25043     'greaterequal': 549,
25044     'Eth': 722,
25045     'Ccedilla': 667,
25046     'lcommaaccent': 278,
25047     'tcaron': 326,
25048     'eogonek': 444,
25049     'Uogonek': 722,
25050     'Aacute': 722,
25051     'Adieresis': 722,
25052     'egrave': 444,
25053     'zacute': 444,
25054     'iogonek': 278,
25055     'Oacute': 722,
25056     'oacute': 500,
25057     'amacron': 444,
25058     'sacute': 389,
25059     'idieresis': 278,
25060     'Ocircumflex': 722,
25061     'Ugrave': 722,
25062     'Delta': 612,
25063     'thorn': 500,
25064     'twosuperior': 300,
25065     'Odieresis': 722,
25066     'mu': 500,
25067     'igrave': 278,
25068     'ohungarumlaut': 500,
25069     'Eogonek': 611,
25070     'dcroat': 500,
25071     'threequarters': 750,
25072     'Scedilla': 556,
25073     'lcaron': 344,
25074     'Kcommaaccent': 722,
25075     'Lacute': 611,
25076     'trademark': 980,
25077     'edotaccent': 444,
25078     'Igrave': 333,
25079     'Imacron': 333,
25080     'Lcaron': 611,
25081     'onehalf': 750,
25082     'lessequal': 549,
25083     'ocircumflex': 500,
25084     'ntilde': 500,
25085     'Uhungarumlaut': 722,
25086     'Eacute': 611,
25087     'emacron': 444,
25088     'gbreve': 500,
25089     'onequarter': 750,
25090     'Scaron': 556,
25091     'Scommaaccent': 556,
25092     'Ohungarumlaut': 722,
25093     'degree': 400,
25094     'ograve': 500,
25095     'Ccaron': 667,
25096     'ugrave': 500,
25097     'radical': 453,
25098     'Dcaron': 722,
25099     'rcommaaccent': 333,
25100     'Ntilde': 722,
25101     'otilde': 500,
25102     'Rcommaaccent': 667,
25103     'Lcommaaccent': 611,
25104     'Atilde': 722,
25105     'Aogonek': 722,
25106     'Aring': 722,
25107     'Otilde': 722,
25108     'zdotaccent': 444,
25109     'Ecaron': 611,
25110     'Iogonek': 333,
25111     'kcommaaccent': 500,
25112     'minus': 564,
25113     'Icircumflex': 333,
25114     'ncaron': 500,
25115     'tcommaaccent': 278,
25116     'logicalnot': 564,
25117     'odieresis': 500,
25118     'udieresis': 500,
25119     'notequal': 549,
25120     'gcommaaccent': 500,
25121     'eth': 500,
25122     'zcaron': 444,
25123     'ncommaaccent': 500,
25124     'onesuperior': 300,
25125     'imacron': 278,
25126     'Euro': 500
25127   },
25128   'Times-Bold': {
25129     'space': 250,
25130     'exclam': 333,
25131     'quotedbl': 555,
25132     'numbersign': 500,
25133     'dollar': 500,
25134     'percent': 1000,
25135     'ampersand': 833,
25136     'quoteright': 333,
25137     'parenleft': 333,
25138     'parenright': 333,
25139     'asterisk': 500,
25140     'plus': 570,
25141     'comma': 250,
25142     'hyphen': 333,
25143     'period': 250,
25144     'slash': 278,
25145     'zero': 500,
25146     'one': 500,
25147     'two': 500,
25148     'three': 500,
25149     'four': 500,
25150     'five': 500,
25151     'six': 500,
25152     'seven': 500,
25153     'eight': 500,
25154     'nine': 500,
25155     'colon': 333,
25156     'semicolon': 333,
25157     'less': 570,
25158     'equal': 570,
25159     'greater': 570,
25160     'question': 500,
25161     'at': 930,
25162     'A': 722,
25163     'B': 667,
25164     'C': 722,
25165     'D': 722,
25166     'E': 667,
25167     'F': 611,
25168     'G': 778,
25169     'H': 778,
25170     'I': 389,
25171     'J': 500,
25172     'K': 778,
25173     'L': 667,
25174     'M': 944,
25175     'N': 722,
25176     'O': 778,
25177     'P': 611,
25178     'Q': 778,
25179     'R': 722,
25180     'S': 556,
25181     'T': 667,
25182     'U': 722,
25183     'V': 722,
25184     'W': 1000,
25185     'X': 722,
25186     'Y': 722,
25187     'Z': 667,
25188     'bracketleft': 333,
25189     'backslash': 278,
25190     'bracketright': 333,
25191     'asciicircum': 581,
25192     'underscore': 500,
25193     'quoteleft': 333,
25194     'a': 500,
25195     'b': 556,
25196     'c': 444,
25197     'd': 556,
25198     'e': 444,
25199     'f': 333,
25200     'g': 500,
25201     'h': 556,
25202     'i': 278,
25203     'j': 333,
25204     'k': 556,
25205     'l': 278,
25206     'm': 833,
25207     'n': 556,
25208     'o': 500,
25209     'p': 556,
25210     'q': 556,
25211     'r': 444,
25212     's': 389,
25213     't': 333,
25214     'u': 556,
25215     'v': 500,
25216     'w': 722,
25217     'x': 500,
25218     'y': 500,
25219     'z': 444,
25220     'braceleft': 394,
25221     'bar': 220,
25222     'braceright': 394,
25223     'asciitilde': 520,
25224     'exclamdown': 333,
25225     'cent': 500,
25226     'sterling': 500,
25227     'fraction': 167,
25228     'yen': 500,
25229     'florin': 500,
25230     'section': 500,
25231     'currency': 500,
25232     'quotesingle': 278,
25233     'quotedblleft': 500,
25234     'guillemotleft': 500,
25235     'guilsinglleft': 333,
25236     'guilsinglright': 333,
25237     'fi': 556,
25238     'fl': 556,
25239     'endash': 500,
25240     'dagger': 500,
25241     'daggerdbl': 500,
25242     'periodcentered': 250,
25243     'paragraph': 540,
25244     'bullet': 350,
25245     'quotesinglbase': 333,
25246     'quotedblbase': 500,
25247     'quotedblright': 500,
25248     'guillemotright': 500,
25249     'ellipsis': 1000,
25250     'perthousand': 1000,
25251     'questiondown': 500,
25252     'grave': 333,
25253     'acute': 333,
25254     'circumflex': 333,
25255     'tilde': 333,
25256     'macron': 333,
25257     'breve': 333,
25258     'dotaccent': 333,
25259     'dieresis': 333,
25260     'ring': 333,
25261     'cedilla': 333,
25262     'hungarumlaut': 333,
25263     'ogonek': 333,
25264     'caron': 333,
25265     'emdash': 1000,
25266     'AE': 1000,
25267     'ordfeminine': 300,
25268     'Lslash': 667,
25269     'Oslash': 778,
25270     'OE': 1000,
25271     'ordmasculine': 330,
25272     'ae': 722,
25273     'dotlessi': 278,
25274     'lslash': 278,
25275     'oslash': 500,
25276     'oe': 722,
25277     'germandbls': 556,
25278     'Idieresis': 389,
25279     'eacute': 444,
25280     'abreve': 500,
25281     'uhungarumlaut': 556,
25282     'ecaron': 444,
25283     'Ydieresis': 722,
25284     'divide': 570,
25285     'Yacute': 722,
25286     'Acircumflex': 722,
25287     'aacute': 500,
25288     'Ucircumflex': 722,
25289     'yacute': 500,
25290     'scommaaccent': 389,
25291     'ecircumflex': 444,
25292     'Uring': 722,
25293     'Udieresis': 722,
25294     'aogonek': 500,
25295     'Uacute': 722,
25296     'uogonek': 556,
25297     'Edieresis': 667,
25298     'Dcroat': 722,
25299     'commaaccent': 250,
25300     'copyright': 747,
25301     'Emacron': 667,
25302     'ccaron': 444,
25303     'aring': 500,
25304     'Ncommaaccent': 722,
25305     'lacute': 278,
25306     'agrave': 500,
25307     'Tcommaaccent': 667,
25308     'Cacute': 722,
25309     'atilde': 500,
25310     'Edotaccent': 667,
25311     'scaron': 389,
25312     'scedilla': 389,
25313     'iacute': 278,
25314     'lozenge': 494,
25315     'Rcaron': 722,
25316     'Gcommaaccent': 778,
25317     'ucircumflex': 556,
25318     'acircumflex': 500,
25319     'Amacron': 722,
25320     'rcaron': 444,
25321     'ccedilla': 444,
25322     'Zdotaccent': 667,
25323     'Thorn': 611,
25324     'Omacron': 778,
25325     'Racute': 722,
25326     'Sacute': 556,
25327     'dcaron': 672,
25328     'Umacron': 722,
25329     'uring': 556,
25330     'threesuperior': 300,
25331     'Ograve': 778,
25332     'Agrave': 722,
25333     'Abreve': 722,
25334     'multiply': 570,
25335     'uacute': 556,
25336     'Tcaron': 667,
25337     'partialdiff': 494,
25338     'ydieresis': 500,
25339     'Nacute': 722,
25340     'icircumflex': 278,
25341     'Ecircumflex': 667,
25342     'adieresis': 500,
25343     'edieresis': 444,
25344     'cacute': 444,
25345     'nacute': 556,
25346     'umacron': 556,
25347     'Ncaron': 722,
25348     'Iacute': 389,
25349     'plusminus': 570,
25350     'brokenbar': 220,
25351     'registered': 747,
25352     'Gbreve': 778,
25353     'Idotaccent': 389,
25354     'summation': 600,
25355     'Egrave': 667,
25356     'racute': 444,
25357     'omacron': 500,
25358     'Zacute': 667,
25359     'Zcaron': 667,
25360     'greaterequal': 549,
25361     'Eth': 722,
25362     'Ccedilla': 722,
25363     'lcommaaccent': 278,
25364     'tcaron': 416,
25365     'eogonek': 444,
25366     'Uogonek': 722,
25367     'Aacute': 722,
25368     'Adieresis': 722,
25369     'egrave': 444,
25370     'zacute': 444,
25371     'iogonek': 278,
25372     'Oacute': 778,
25373     'oacute': 500,
25374     'amacron': 500,
25375     'sacute': 389,
25376     'idieresis': 278,
25377     'Ocircumflex': 778,
25378     'Ugrave': 722,
25379     'Delta': 612,
25380     'thorn': 556,
25381     'twosuperior': 300,
25382     'Odieresis': 778,
25383     'mu': 556,
25384     'igrave': 278,
25385     'ohungarumlaut': 500,
25386     'Eogonek': 667,
25387     'dcroat': 556,
25388     'threequarters': 750,
25389     'Scedilla': 556,
25390     'lcaron': 394,
25391     'Kcommaaccent': 778,
25392     'Lacute': 667,
25393     'trademark': 1000,
25394     'edotaccent': 444,
25395     'Igrave': 389,
25396     'Imacron': 389,
25397     'Lcaron': 667,
25398     'onehalf': 750,
25399     'lessequal': 549,
25400     'ocircumflex': 500,
25401     'ntilde': 556,
25402     'Uhungarumlaut': 722,
25403     'Eacute': 667,
25404     'emacron': 444,
25405     'gbreve': 500,
25406     'onequarter': 750,
25407     'Scaron': 556,
25408     'Scommaaccent': 556,
25409     'Ohungarumlaut': 778,
25410     'degree': 400,
25411     'ograve': 500,
25412     'Ccaron': 722,
25413     'ugrave': 556,
25414     'radical': 549,
25415     'Dcaron': 722,
25416     'rcommaaccent': 444,
25417     'Ntilde': 722,
25418     'otilde': 500,
25419     'Rcommaaccent': 722,
25420     'Lcommaaccent': 667,
25421     'Atilde': 722,
25422     'Aogonek': 722,
25423     'Aring': 722,
25424     'Otilde': 778,
25425     'zdotaccent': 444,
25426     'Ecaron': 667,
25427     'Iogonek': 389,
25428     'kcommaaccent': 556,
25429     'minus': 570,
25430     'Icircumflex': 389,
25431     'ncaron': 556,
25432     'tcommaaccent': 333,
25433     'logicalnot': 570,
25434     'odieresis': 500,
25435     'udieresis': 556,
25436     'notequal': 549,
25437     'gcommaaccent': 500,
25438     'eth': 500,
25439     'zcaron': 444,
25440     'ncommaaccent': 556,
25441     'onesuperior': 300,
25442     'imacron': 278,
25443     'Euro': 500
25444   },
25445   'Times-BoldItalic': {
25446     'space': 250,
25447     'exclam': 389,
25448     'quotedbl': 555,
25449     'numbersign': 500,
25450     'dollar': 500,
25451     'percent': 833,
25452     'ampersand': 778,
25453     'quoteright': 333,
25454     'parenleft': 333,
25455     'parenright': 333,
25456     'asterisk': 500,
25457     'plus': 570,
25458     'comma': 250,
25459     'hyphen': 333,
25460     'period': 250,
25461     'slash': 278,
25462     'zero': 500,
25463     'one': 500,
25464     'two': 500,
25465     'three': 500,
25466     'four': 500,
25467     'five': 500,
25468     'six': 500,
25469     'seven': 500,
25470     'eight': 500,
25471     'nine': 500,
25472     'colon': 333,
25473     'semicolon': 333,
25474     'less': 570,
25475     'equal': 570,
25476     'greater': 570,
25477     'question': 500,
25478     'at': 832,
25479     'A': 667,
25480     'B': 667,
25481     'C': 667,
25482     'D': 722,
25483     'E': 667,
25484     'F': 667,
25485     'G': 722,
25486     'H': 778,
25487     'I': 389,
25488     'J': 500,
25489     'K': 667,
25490     'L': 611,
25491     'M': 889,
25492     'N': 722,
25493     'O': 722,
25494     'P': 611,
25495     'Q': 722,
25496     'R': 667,
25497     'S': 556,
25498     'T': 611,
25499     'U': 722,
25500     'V': 667,
25501     'W': 889,
25502     'X': 667,
25503     'Y': 611,
25504     'Z': 611,
25505     'bracketleft': 333,
25506     'backslash': 278,
25507     'bracketright': 333,
25508     'asciicircum': 570,
25509     'underscore': 500,
25510     'quoteleft': 333,
25511     'a': 500,
25512     'b': 500,
25513     'c': 444,
25514     'd': 500,
25515     'e': 444,
25516     'f': 333,
25517     'g': 500,
25518     'h': 556,
25519     'i': 278,
25520     'j': 278,
25521     'k': 500,
25522     'l': 278,
25523     'm': 778,
25524     'n': 556,
25525     'o': 500,
25526     'p': 500,
25527     'q': 500,
25528     'r': 389,
25529     's': 389,
25530     't': 278,
25531     'u': 556,
25532     'v': 444,
25533     'w': 667,
25534     'x': 500,
25535     'y': 444,
25536     'z': 389,
25537     'braceleft': 348,
25538     'bar': 220,
25539     'braceright': 348,
25540     'asciitilde': 570,
25541     'exclamdown': 389,
25542     'cent': 500,
25543     'sterling': 500,
25544     'fraction': 167,
25545     'yen': 500,
25546     'florin': 500,
25547     'section': 500,
25548     'currency': 500,
25549     'quotesingle': 278,
25550     'quotedblleft': 500,
25551     'guillemotleft': 500,
25552     'guilsinglleft': 333,
25553     'guilsinglright': 333,
25554     'fi': 556,
25555     'fl': 556,
25556     'endash': 500,
25557     'dagger': 500,
25558     'daggerdbl': 500,
25559     'periodcentered': 250,
25560     'paragraph': 500,
25561     'bullet': 350,
25562     'quotesinglbase': 333,
25563     'quotedblbase': 500,
25564     'quotedblright': 500,
25565     'guillemotright': 500,
25566     'ellipsis': 1000,
25567     'perthousand': 1000,
25568     'questiondown': 500,
25569     'grave': 333,
25570     'acute': 333,
25571     'circumflex': 333,
25572     'tilde': 333,
25573     'macron': 333,
25574     'breve': 333,
25575     'dotaccent': 333,
25576     'dieresis': 333,
25577     'ring': 333,
25578     'cedilla': 333,
25579     'hungarumlaut': 333,
25580     'ogonek': 333,
25581     'caron': 333,
25582     'emdash': 1000,
25583     'AE': 944,
25584     'ordfeminine': 266,
25585     'Lslash': 611,
25586     'Oslash': 722,
25587     'OE': 944,
25588     'ordmasculine': 300,
25589     'ae': 722,
25590     'dotlessi': 278,
25591     'lslash': 278,
25592     'oslash': 500,
25593     'oe': 722,
25594     'germandbls': 500,
25595     'Idieresis': 389,
25596     'eacute': 444,
25597     'abreve': 500,
25598     'uhungarumlaut': 556,
25599     'ecaron': 444,
25600     'Ydieresis': 611,
25601     'divide': 570,
25602     'Yacute': 611,
25603     'Acircumflex': 667,
25604     'aacute': 500,
25605     'Ucircumflex': 722,
25606     'yacute': 444,
25607     'scommaaccent': 389,
25608     'ecircumflex': 444,
25609     'Uring': 722,
25610     'Udieresis': 722,
25611     'aogonek': 500,
25612     'Uacute': 722,
25613     'uogonek': 556,
25614     'Edieresis': 667,
25615     'Dcroat': 722,
25616     'commaaccent': 250,
25617     'copyright': 747,
25618     'Emacron': 667,
25619     'ccaron': 444,
25620     'aring': 500,
25621     'Ncommaaccent': 722,
25622     'lacute': 278,
25623     'agrave': 500,
25624     'Tcommaaccent': 611,
25625     'Cacute': 667,
25626     'atilde': 500,
25627     'Edotaccent': 667,
25628     'scaron': 389,
25629     'scedilla': 389,
25630     'iacute': 278,
25631     'lozenge': 494,
25632     'Rcaron': 667,
25633     'Gcommaaccent': 722,
25634     'ucircumflex': 556,
25635     'acircumflex': 500,
25636     'Amacron': 667,
25637     'rcaron': 389,
25638     'ccedilla': 444,
25639     'Zdotaccent': 611,
25640     'Thorn': 611,
25641     'Omacron': 722,
25642     'Racute': 667,
25643     'Sacute': 556,
25644     'dcaron': 608,
25645     'Umacron': 722,
25646     'uring': 556,
25647     'threesuperior': 300,
25648     'Ograve': 722,
25649     'Agrave': 667,
25650     'Abreve': 667,
25651     'multiply': 570,
25652     'uacute': 556,
25653     'Tcaron': 611,
25654     'partialdiff': 494,
25655     'ydieresis': 444,
25656     'Nacute': 722,
25657     'icircumflex': 278,
25658     'Ecircumflex': 667,
25659     'adieresis': 500,
25660     'edieresis': 444,
25661     'cacute': 444,
25662     'nacute': 556,
25663     'umacron': 556,
25664     'Ncaron': 722,
25665     'Iacute': 389,
25666     'plusminus': 570,
25667     'brokenbar': 220,
25668     'registered': 747,
25669     'Gbreve': 722,
25670     'Idotaccent': 389,
25671     'summation': 600,
25672     'Egrave': 667,
25673     'racute': 389,
25674     'omacron': 500,
25675     'Zacute': 611,
25676     'Zcaron': 611,
25677     'greaterequal': 549,
25678     'Eth': 722,
25679     'Ccedilla': 667,
25680     'lcommaaccent': 278,
25681     'tcaron': 366,
25682     'eogonek': 444,
25683     'Uogonek': 722,
25684     'Aacute': 667,
25685     'Adieresis': 667,
25686     'egrave': 444,
25687     'zacute': 389,
25688     'iogonek': 278,
25689     'Oacute': 722,
25690     'oacute': 500,
25691     'amacron': 500,
25692     'sacute': 389,
25693     'idieresis': 278,
25694     'Ocircumflex': 722,
25695     'Ugrave': 722,
25696     'Delta': 612,
25697     'thorn': 500,
25698     'twosuperior': 300,
25699     'Odieresis': 722,
25700     'mu': 576,
25701     'igrave': 278,
25702     'ohungarumlaut': 500,
25703     'Eogonek': 667,
25704     'dcroat': 500,
25705     'threequarters': 750,
25706     'Scedilla': 556,
25707     'lcaron': 382,
25708     'Kcommaaccent': 667,
25709     'Lacute': 611,
25710     'trademark': 1000,
25711     'edotaccent': 444,
25712     'Igrave': 389,
25713     'Imacron': 389,
25714     'Lcaron': 611,
25715     'onehalf': 750,
25716     'lessequal': 549,
25717     'ocircumflex': 500,
25718     'ntilde': 556,
25719     'Uhungarumlaut': 722,
25720     'Eacute': 667,
25721     'emacron': 444,
25722     'gbreve': 500,
25723     'onequarter': 750,
25724     'Scaron': 556,
25725     'Scommaaccent': 556,
25726     'Ohungarumlaut': 722,
25727     'degree': 400,
25728     'ograve': 500,
25729     'Ccaron': 667,
25730     'ugrave': 556,
25731     'radical': 549,
25732     'Dcaron': 722,
25733     'rcommaaccent': 389,
25734     'Ntilde': 722,
25735     'otilde': 500,
25736     'Rcommaaccent': 667,
25737     'Lcommaaccent': 611,
25738     'Atilde': 667,
25739     'Aogonek': 667,
25740     'Aring': 667,
25741     'Otilde': 722,
25742     'zdotaccent': 389,
25743     'Ecaron': 667,
25744     'Iogonek': 389,
25745     'kcommaaccent': 500,
25746     'minus': 606,
25747     'Icircumflex': 389,
25748     'ncaron': 556,
25749     'tcommaaccent': 278,
25750     'logicalnot': 606,
25751     'odieresis': 500,
25752     'udieresis': 556,
25753     'notequal': 549,
25754     'gcommaaccent': 500,
25755     'eth': 500,
25756     'zcaron': 389,
25757     'ncommaaccent': 556,
25758     'onesuperior': 300,
25759     'imacron': 278,
25760     'Euro': 500
25761   },
25762   'Times-Italic': {
25763     'space': 250,
25764     'exclam': 333,
25765     'quotedbl': 420,
25766     'numbersign': 500,
25767     'dollar': 500,
25768     'percent': 833,
25769     'ampersand': 778,
25770     'quoteright': 333,
25771     'parenleft': 333,
25772     'parenright': 333,
25773     'asterisk': 500,
25774     'plus': 675,
25775     'comma': 250,
25776     'hyphen': 333,
25777     'period': 250,
25778     'slash': 278,
25779     'zero': 500,
25780     'one': 500,
25781     'two': 500,
25782     'three': 500,
25783     'four': 500,
25784     'five': 500,
25785     'six': 500,
25786     'seven': 500,
25787     'eight': 500,
25788     'nine': 500,
25789     'colon': 333,
25790     'semicolon': 333,
25791     'less': 675,
25792     'equal': 675,
25793     'greater': 675,
25794     'question': 500,
25795     'at': 920,
25796     'A': 611,
25797     'B': 611,
25798     'C': 667,
25799     'D': 722,
25800     'E': 611,
25801     'F': 611,
25802     'G': 722,
25803     'H': 722,
25804     'I': 333,
25805     'J': 444,
25806     'K': 667,
25807     'L': 556,
25808     'M': 833,
25809     'N': 667,
25810     'O': 722,
25811     'P': 611,
25812     'Q': 722,
25813     'R': 611,
25814     'S': 500,
25815     'T': 556,
25816     'U': 722,
25817     'V': 611,
25818     'W': 833,
25819     'X': 611,
25820     'Y': 556,
25821     'Z': 556,
25822     'bracketleft': 389,
25823     'backslash': 278,
25824     'bracketright': 389,
25825     'asciicircum': 422,
25826     'underscore': 500,
25827     'quoteleft': 333,
25828     'a': 500,
25829     'b': 500,
25830     'c': 444,
25831     'd': 500,
25832     'e': 444,
25833     'f': 278,
25834     'g': 500,
25835     'h': 500,
25836     'i': 278,
25837     'j': 278,
25838     'k': 444,
25839     'l': 278,
25840     'm': 722,
25841     'n': 500,
25842     'o': 500,
25843     'p': 500,
25844     'q': 500,
25845     'r': 389,
25846     's': 389,
25847     't': 278,
25848     'u': 500,
25849     'v': 444,
25850     'w': 667,
25851     'x': 444,
25852     'y': 444,
25853     'z': 389,
25854     'braceleft': 400,
25855     'bar': 275,
25856     'braceright': 400,
25857     'asciitilde': 541,
25858     'exclamdown': 389,
25859     'cent': 500,
25860     'sterling': 500,
25861     'fraction': 167,
25862     'yen': 500,
25863     'florin': 500,
25864     'section': 500,
25865     'currency': 500,
25866     'quotesingle': 214,
25867     'quotedblleft': 556,
25868     'guillemotleft': 500,
25869     'guilsinglleft': 333,
25870     'guilsinglright': 333,
25871     'fi': 500,
25872     'fl': 500,
25873     'endash': 500,
25874     'dagger': 500,
25875     'daggerdbl': 500,
25876     'periodcentered': 250,
25877     'paragraph': 523,
25878     'bullet': 350,
25879     'quotesinglbase': 333,
25880     'quotedblbase': 556,
25881     'quotedblright': 556,
25882     'guillemotright': 500,
25883     'ellipsis': 889,
25884     'perthousand': 1000,
25885     'questiondown': 500,
25886     'grave': 333,
25887     'acute': 333,
25888     'circumflex': 333,
25889     'tilde': 333,
25890     'macron': 333,
25891     'breve': 333,
25892     'dotaccent': 333,
25893     'dieresis': 333,
25894     'ring': 333,
25895     'cedilla': 333,
25896     'hungarumlaut': 333,
25897     'ogonek': 333,
25898     'caron': 333,
25899     'emdash': 889,
25900     'AE': 889,
25901     'ordfeminine': 276,
25902     'Lslash': 556,
25903     'Oslash': 722,
25904     'OE': 944,
25905     'ordmasculine': 310,
25906     'ae': 667,
25907     'dotlessi': 278,
25908     'lslash': 278,
25909     'oslash': 500,
25910     'oe': 667,
25911     'germandbls': 500,
25912     'Idieresis': 333,
25913     'eacute': 444,
25914     'abreve': 500,
25915     'uhungarumlaut': 500,
25916     'ecaron': 444,
25917     'Ydieresis': 556,
25918     'divide': 675,
25919     'Yacute': 556,
25920     'Acircumflex': 611,
25921     'aacute': 500,
25922     'Ucircumflex': 722,
25923     'yacute': 444,
25924     'scommaaccent': 389,
25925     'ecircumflex': 444,
25926     'Uring': 722,
25927     'Udieresis': 722,
25928     'aogonek': 500,
25929     'Uacute': 722,
25930     'uogonek': 500,
25931     'Edieresis': 611,
25932     'Dcroat': 722,
25933     'commaaccent': 250,
25934     'copyright': 760,
25935     'Emacron': 611,
25936     'ccaron': 444,
25937     'aring': 500,
25938     'Ncommaaccent': 667,
25939     'lacute': 278,
25940     'agrave': 500,
25941     'Tcommaaccent': 556,
25942     'Cacute': 667,
25943     'atilde': 500,
25944     'Edotaccent': 611,
25945     'scaron': 389,
25946     'scedilla': 389,
25947     'iacute': 278,
25948     'lozenge': 471,
25949     'Rcaron': 611,
25950     'Gcommaaccent': 722,
25951     'ucircumflex': 500,
25952     'acircumflex': 500,
25953     'Amacron': 611,
25954     'rcaron': 389,
25955     'ccedilla': 444,
25956     'Zdotaccent': 556,
25957     'Thorn': 611,
25958     'Omacron': 722,
25959     'Racute': 611,
25960     'Sacute': 500,
25961     'dcaron': 544,
25962     'Umacron': 722,
25963     'uring': 500,
25964     'threesuperior': 300,
25965     'Ograve': 722,
25966     'Agrave': 611,
25967     'Abreve': 611,
25968     'multiply': 675,
25969     'uacute': 500,
25970     'Tcaron': 556,
25971     'partialdiff': 476,
25972     'ydieresis': 444,
25973     'Nacute': 667,
25974     'icircumflex': 278,
25975     'Ecircumflex': 611,
25976     'adieresis': 500,
25977     'edieresis': 444,
25978     'cacute': 444,
25979     'nacute': 500,
25980     'umacron': 500,
25981     'Ncaron': 667,
25982     'Iacute': 333,
25983     'plusminus': 675,
25984     'brokenbar': 275,
25985     'registered': 760,
25986     'Gbreve': 722,
25987     'Idotaccent': 333,
25988     'summation': 600,
25989     'Egrave': 611,
25990     'racute': 389,
25991     'omacron': 500,
25992     'Zacute': 556,
25993     'Zcaron': 556,
25994     'greaterequal': 549,
25995     'Eth': 722,
25996     'Ccedilla': 667,
25997     'lcommaaccent': 278,
25998     'tcaron': 300,
25999     'eogonek': 444,
26000     'Uogonek': 722,
26001     'Aacute': 611,
26002     'Adieresis': 611,
26003     'egrave': 444,
26004     'zacute': 389,
26005     'iogonek': 278,
26006     'Oacute': 722,
26007     'oacute': 500,
26008     'amacron': 500,
26009     'sacute': 389,
26010     'idieresis': 278,
26011     'Ocircumflex': 722,
26012     'Ugrave': 722,
26013     'Delta': 612,
26014     'thorn': 500,
26015     'twosuperior': 300,
26016     'Odieresis': 722,
26017     'mu': 500,
26018     'igrave': 278,
26019     'ohungarumlaut': 500,
26020     'Eogonek': 611,
26021     'dcroat': 500,
26022     'threequarters': 750,
26023     'Scedilla': 500,
26024     'lcaron': 300,
26025     'Kcommaaccent': 667,
26026     'Lacute': 556,
26027     'trademark': 980,
26028     'edotaccent': 444,
26029     'Igrave': 333,
26030     'Imacron': 333,
26031     'Lcaron': 611,
26032     'onehalf': 750,
26033     'lessequal': 549,
26034     'ocircumflex': 500,
26035     'ntilde': 500,
26036     'Uhungarumlaut': 722,
26037     'Eacute': 611,
26038     'emacron': 444,
26039     'gbreve': 500,
26040     'onequarter': 750,
26041     'Scaron': 500,
26042     'Scommaaccent': 500,
26043     'Ohungarumlaut': 722,
26044     'degree': 400,
26045     'ograve': 500,
26046     'Ccaron': 667,
26047     'ugrave': 500,
26048     'radical': 453,
26049     'Dcaron': 722,
26050     'rcommaaccent': 389,
26051     'Ntilde': 667,
26052     'otilde': 500,
26053     'Rcommaaccent': 611,
26054     'Lcommaaccent': 556,
26055     'Atilde': 611,
26056     'Aogonek': 611,
26057     'Aring': 611,
26058     'Otilde': 722,
26059     'zdotaccent': 389,
26060     'Ecaron': 611,
26061     'Iogonek': 333,
26062     'kcommaaccent': 444,
26063     'minus': 675,
26064     'Icircumflex': 333,
26065     'ncaron': 500,
26066     'tcommaaccent': 278,
26067     'logicalnot': 675,
26068     'odieresis': 500,
26069     'udieresis': 500,
26070     'notequal': 549,
26071     'gcommaaccent': 500,
26072     'eth': 500,
26073     'zcaron': 389,
26074     'ncommaaccent': 500,
26075     'onesuperior': 300,
26076     'imacron': 278,
26077     'Euro': 500
26078   },
26079   'ZapfDingbats': {
26080     'space': 278,
26081     'a1': 974,
26082     'a2': 961,
26083     'a202': 974,
26084     'a3': 980,
26085     'a4': 719,
26086     'a5': 789,
26087     'a119': 790,
26088     'a118': 791,
26089     'a117': 690,
26090     'a11': 960,
26091     'a12': 939,
26092     'a13': 549,
26093     'a14': 855,
26094     'a15': 911,
26095     'a16': 933,
26096     'a105': 911,
26097     'a17': 945,
26098     'a18': 974,
26099     'a19': 755,
26100     'a20': 846,
26101     'a21': 762,
26102     'a22': 761,
26103     'a23': 571,
26104     'a24': 677,
26105     'a25': 763,
26106     'a26': 760,
26107     'a27': 759,
26108     'a28': 754,
26109     'a6': 494,
26110     'a7': 552,
26111     'a8': 537,
26112     'a9': 577,
26113     'a10': 692,
26114     'a29': 786,
26115     'a30': 788,
26116     'a31': 788,
26117     'a32': 790,
26118     'a33': 793,
26119     'a34': 794,
26120     'a35': 816,
26121     'a36': 823,
26122     'a37': 789,
26123     'a38': 841,
26124     'a39': 823,
26125     'a40': 833,
26126     'a41': 816,
26127     'a42': 831,
26128     'a43': 923,
26129     'a44': 744,
26130     'a45': 723,
26131     'a46': 749,
26132     'a47': 790,
26133     'a48': 792,
26134     'a49': 695,
26135     'a50': 776,
26136     'a51': 768,
26137     'a52': 792,
26138     'a53': 759,
26139     'a54': 707,
26140     'a55': 708,
26141     'a56': 682,
26142     'a57': 701,
26143     'a58': 826,
26144     'a59': 815,
26145     'a60': 789,
26146     'a61': 789,
26147     'a62': 707,
26148     'a63': 687,
26149     'a64': 696,
26150     'a65': 689,
26151     'a66': 786,
26152     'a67': 787,
26153     'a68': 713,
26154     'a69': 791,
26155     'a70': 785,
26156     'a71': 791,
26157     'a72': 873,
26158     'a73': 761,
26159     'a74': 762,
26160     'a203': 762,
26161     'a75': 759,
26162     'a204': 759,
26163     'a76': 892,
26164     'a77': 892,
26165     'a78': 788,
26166     'a79': 784,
26167     'a81': 438,
26168     'a82': 138,
26169     'a83': 277,
26170     'a84': 415,
26171     'a97': 392,
26172     'a98': 392,
26173     'a99': 668,
26174     'a100': 668,
26175     'a89': 390,
26176     'a90': 390,
26177     'a93': 317,
26178     'a94': 317,
26179     'a91': 276,
26180     'a92': 276,
26181     'a205': 509,
26182     'a85': 509,
26183     'a206': 410,
26184     'a86': 410,
26185     'a87': 234,
26186     'a88': 234,
26187     'a95': 334,
26188     'a96': 334,
26189     'a101': 732,
26190     'a102': 544,
26191     'a103': 544,
26192     'a104': 910,
26193     'a106': 667,
26194     'a107': 760,
26195     'a108': 760,
26196     'a112': 776,
26197     'a111': 595,
26198     'a110': 694,
26199     'a109': 626,
26200     'a120': 788,
26201     'a121': 788,
26202     'a122': 788,
26203     'a123': 788,
26204     'a124': 788,
26205     'a125': 788,
26206     'a126': 788,
26207     'a127': 788,
26208     'a128': 788,
26209     'a129': 788,
26210     'a130': 788,
26211     'a131': 788,
26212     'a132': 788,
26213     'a133': 788,
26214     'a134': 788,
26215     'a135': 788,
26216     'a136': 788,
26217     'a137': 788,
26218     'a138': 788,
26219     'a139': 788,
26220     'a140': 788,
26221     'a141': 788,
26222     'a142': 788,
26223     'a143': 788,
26224     'a144': 788,
26225     'a145': 788,
26226     'a146': 788,
26227     'a147': 788,
26228     'a148': 788,
26229     'a149': 788,
26230     'a150': 788,
26231     'a151': 788,
26232     'a152': 788,
26233     'a153': 788,
26234     'a154': 788,
26235     'a155': 788,
26236     'a156': 788,
26237     'a157': 788,
26238     'a158': 788,
26239     'a159': 788,
26240     'a160': 894,
26241     'a161': 838,
26242     'a163': 1016,
26243     'a164': 458,
26244     'a196': 748,
26245     'a165': 924,
26246     'a192': 748,
26247     'a166': 918,
26248     'a167': 927,
26249     'a168': 928,
26250     'a169': 928,
26251     'a170': 834,
26252     'a171': 873,
26253     'a172': 828,
26254     'a173': 924,
26255     'a162': 924,
26256     'a174': 917,
26257     'a175': 930,
26258     'a176': 931,
26259     'a177': 463,
26260     'a178': 883,
26261     'a179': 836,
26262     'a193': 836,
26263     'a180': 867,
26264     'a199': 867,
26265     'a181': 696,
26266     'a200': 696,
26267     'a182': 874,
26268     'a201': 874,
26269     'a183': 760,
26270     'a184': 946,
26271     'a197': 771,
26272     'a185': 865,
26273     'a194': 771,
26274     'a198': 888,
26275     'a186': 967,
26276     'a195': 888,
26277     'a187': 831,
26278     'a188': 873,
26279     'a189': 927,
26280     'a190': 970,
26281     'a191': 918
26282   }
26286 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
26287 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
26289 'use strict';
26291 var EOF = {};
26293 function isEOF(v) {
26294   return v == EOF;
26297 var Parser = (function ParserClosure() {
26298   function Parser(lexer, allowStreams, xref) {
26299     this.lexer = lexer;
26300     this.allowStreams = allowStreams;
26301     this.xref = xref;
26302     this.inlineImg = 0;
26303     this.refill();
26304   }
26306   Parser.prototype = {
26307     refill: function Parser_refill() {
26308       this.buf1 = this.lexer.getObj();
26309       this.buf2 = this.lexer.getObj();
26310     },
26311     shift: function Parser_shift() {
26312       if (isCmd(this.buf2, 'ID')) {
26313         this.buf1 = this.buf2;
26314         this.buf2 = null;
26315         // skip byte after ID
26316         this.lexer.skip();
26317       } else {
26318         this.buf1 = this.buf2;
26319         this.buf2 = this.lexer.getObj();
26320       }
26321     },
26322     getObj: function Parser_getObj(cipherTransform) {
26323       if (isCmd(this.buf1, 'BI')) { // inline image
26324         this.shift();
26325         return this.makeInlineImage(cipherTransform);
26326       }
26327       if (isCmd(this.buf1, '[')) { // array
26328         this.shift();
26329         var 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');
26334         this.shift();
26335         return array;
26336       }
26337       if (isCmd(this.buf1, '<<')) { // dictionary or stream
26338         this.shift();
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;
26345           this.shift();
26346           if (isEOF(this.buf1))
26347             break;
26348           dict.set(key, this.getObj(cipherTransform));
26349         }
26350         if (isEOF(this.buf1))
26351           error('End of file inside dictionary');
26353         // stream objects are not allowed inside content streams or
26354         // object streams
26355         if (isCmd(this.buf2, 'stream')) {
26356           return this.allowStreams ?
26357             this.makeStream(dict, cipherTransform) : dict;
26358         }
26359         this.shift();
26360         return dict;
26361       }
26362       if (isInt(this.buf1)) { // indirect reference or integer
26363         var num = this.buf1;
26364         this.shift();
26365         if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
26366           var ref = new Ref(num, this.buf1);
26367           this.shift();
26368           this.shift();
26369           return ref;
26370         }
26371         return num;
26372       }
26373       if (isString(this.buf1)) { // string
26374         var str = this.buf1;
26375         this.shift();
26376         if (cipherTransform)
26377           str = cipherTransform.decryptString(str);
26378         return str;
26379       }
26381       // simple object
26382       var obj = this.buf1;
26383       this.shift();
26384       return obj;
26385     },
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;
26397         this.shift();
26398         if (isEOF(this.buf1))
26399           break;
26400         dict.set(key, this.getObj(cipherTransform));
26401       }
26403       // parse image stream
26404       var startPos = stream.pos;
26406       // searching for the /EI\s/
26407       var state = 0, ch;
26408       while (state != 4 && (ch = stream.getByte()) != null) {
26409         switch (ch) {
26410           case 0x20:
26411           case 0x0D:
26412           case 0x0A:
26413             state = state === 3 ? 4 : 0;
26414             break;
26415           case 0x45:
26416             state = 2;
26417             break;
26418           case 0x49:
26419             state = state === 2 ? 3 : 0;
26420             break;
26421           default:
26422             state = 0;
26423             break;
26424         }
26425       }
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');
26432         this.shift();
26433         return null;
26434       }
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');
26444       this.shift();
26446       return imageStream;
26447     },
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;
26451     },
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;
26460       // get length
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');
26471       this.shift();
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;
26478       return stream;
26479     },
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);
26493           params = null;
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
26498           length = null;
26499         }
26500       }
26501       return stream;
26502     },
26503     makeFilter: function Parser_makeFilter(stream, name, length, params) {
26504       if (name == 'FlateDecode' || name == 'Fl') {
26505         if (params) {
26506           return new PredictorStream(new FlateStream(stream), params);
26507         }
26508         return new FlateStream(stream);
26509       }
26510       if (name == 'LZWDecode' || name == 'LZW') {
26511         var earlyChange = 1;
26512         if (params) {
26513           if (params.has('EarlyChange'))
26514             earlyChange = params.get('EarlyChange');
26515           return new PredictorStream(
26516             new LZWStream(stream, earlyChange), params);
26517         }
26518         return new LZWStream(stream, earlyChange);
26519       }
26520       if (name == 'DCTDecode' || name == 'DCT') {
26521         var bytes = stream.getBytes(length);
26522         return new JpegStream(bytes, stream.dict, this.xref);
26523       }
26524       if (name == 'JPXDecode' || name == 'JPX') {
26525         var bytes = stream.getBytes(length);
26526         return new JpxStream(bytes, stream.dict);
26527       }
26528       if (name == 'ASCII85Decode' || name == 'A85') {
26529         return new Ascii85Stream(stream);
26530       }
26531       if (name == 'ASCIIHexDecode' || name == 'AHx') {
26532         return new AsciiHexStream(stream);
26533       }
26534       if (name == 'CCITTFaxDecode' || name == 'CCF') {
26535         return new CCITTFaxStream(stream, params);
26536       }
26537       if (name == 'RunLengthDecode' || name == 'RL') {
26538         return new RunLengthStream(stream);
26539       }
26540       if (name == 'JBIG2Decode') {
26541         error('JBIG2 image format is not currently supprted.');
26542       }
26543       warn('filter "' + name + '" not supported yet');
26544       return stream;
26545     }
26546   };
26548   return Parser;
26549 })();
26551 var Lexer = (function LexerClosure() {
26552   function Lexer(stream) {
26553     this.stream = stream;
26554   }
26556   Lexer.isSpace = function Lexer_isSpace(ch) {
26557     return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a';
26558   };
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
26579   ];
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;
26587     return -1;
26588   }
26590   Lexer.prototype = {
26591     getNumber: function Lexer_getNumber(ch) {
26592       var floating = false;
26593       var str = ch;
26594       var stream = this.stream;
26595       for (;;) {
26596         ch = stream.lookChar();
26597         if (ch == '.' && !floating) {
26598           str += ch;
26599           floating = true;
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') {
26605           str += ch;
26606         } else if (ch == 'e' || ch == 'E') {
26607           floating = true;
26608         } else {
26609           // the last character doesn't belong to us
26610           break;
26611         }
26612         stream.skip();
26613       }
26614       var value = parseFloat(str);
26615       if (isNaN(value))
26616         error('Invalid floating point number: ' + value);
26617       return value;
26618     },
26619     getString: function Lexer_getString() {
26620       var numParen = 1;
26621       var done = false;
26622       var str = '';
26623       var stream = this.stream;
26624       var ch;
26625       do {
26626         ch = stream.getChar();
26627         switch (ch) {
26628           case undefined:
26629             warn('Unterminated string');
26630             done = true;
26631             break;
26632           case '(':
26633             ++numParen;
26634             str += ch;
26635             break;
26636           case ')':
26637             if (--numParen == 0) {
26638               done = true;
26639             } else {
26640               str += ch;
26641             }
26642             break;
26643           case '\\':
26644             ch = stream.getChar();
26645             switch (ch) {
26646               case undefined:
26647                 warn('Unterminated string');
26648                 done = true;
26649                 break;
26650               case 'n':
26651                 str += '\n';
26652                 break;
26653               case 'r':
26654                 str += '\r';
26655                 break;
26656               case 't':
26657                 str += '\t';
26658                 break;
26659               case 'b':
26660                 str += '\b';
26661                 break;
26662               case 'f':
26663                 str += '\f';
26664                 break;
26665               case '\\':
26666               case '(':
26667               case ')':
26668                 str += ch;
26669                 break;
26670               case '0': case '1': case '2': case '3':
26671               case '4': case '5': case '6': case '7':
26672                 var x = ch - '0';
26673                 ch = stream.lookChar();
26674                 if (ch >= '0' && ch <= '7') {
26675                   stream.skip();
26676                   x = (x << 3) + (ch - '0');
26677                   ch = stream.lookChar();
26678                   if (ch >= '0' && ch <= '7') {
26679                     stream.skip();
26680                     x = (x << 3) + (ch - '0');
26681                   }
26682                 }
26684                 str += String.fromCharCode(x);
26685                 break;
26686               case '\r':
26687                 ch = stream.lookChar();
26688                 if (ch == '\n')
26689                   stream.skip();
26690                 break;
26691               case '\n':
26692                 break;
26693               default:
26694                 str += ch;
26695             }
26696             break;
26697           default:
26698             str += ch;
26699         }
26700       } while (!done);
26701       return str;
26702     },
26703     getName: function Lexer_getName(ch) {
26704       var str = '';
26705       var stream = this.stream;
26706       while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
26707         stream.skip();
26708         if (ch == '#') {
26709           ch = stream.lookChar();
26710           var x = toHexDigit(ch);
26711           if (x != -1) {
26712             stream.skip();
26713             var x2 = toHexDigit(stream.getChar());
26714             if (x2 == -1)
26715               error('Illegal digit in hex char in name: ' + x2);
26716             str += String.fromCharCode((x << 4) | x2);
26717           } else {
26718             str += '#';
26719             str += ch;
26720           }
26721         } else {
26722           str += ch;
26723         }
26724       }
26725       if (str.length > 128)
26726         error('Warning: name token is longer than allowed by the spec: ' +
26727               str.length);
26728       return new Name(str);
26729     },
26730     getHexString: function Lexer_getHexString(ch) {
26731       var str = '';
26732       var stream = this.stream;
26733       for (;;) {
26734         ch = stream.getChar();
26735         if (ch == '>') {
26736           break;
26737         }
26738         if (!ch) {
26739           warn('Unterminated hex string');
26740           break;
26741         }
26742         if (specialChars[ch.charCodeAt(0)] != 1) {
26743           var x, x2;
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);
26755         }
26756       }
26757       return str;
26758     },
26759     getObj: function Lexer_getObj() {
26760       // skip whitespace and comments
26761       var comment = false;
26762       var stream = this.stream;
26763       var ch;
26764       while (true) {
26765         if (!(ch = stream.getChar()))
26766           return EOF;
26767         if (comment) {
26768           if (ch == '\r' || ch == '\n')
26769             comment = false;
26770         } else if (ch == '%') {
26771           comment = true;
26772         } else if (specialChars[ch.charCodeAt(0)] != 1) {
26773           break;
26774         }
26775       }
26777       // start reading token
26778       switch (ch) {
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);
26783         case '(':
26784           return this.getString();
26785         case '/':
26786           return this.getName(ch);
26787         // array punctuation
26788         case '[':
26789         case ']':
26790           return Cmd.get(ch);
26791         // hex string or dict punctuation
26792         case '<':
26793           ch = stream.lookChar();
26794           if (ch == '<') {
26795             // dict punctuation
26796             stream.skip();
26797             return Cmd.get('<<');
26798           }
26799           return this.getHexString(ch);
26800         // dict punctuation
26801         case '>':
26802           ch = stream.lookChar();
26803           if (ch == '>') {
26804             stream.skip();
26805             return Cmd.get('>>');
26806           }
26807         case '{':
26808         case '}':
26809           return Cmd.get(ch);
26810         // fall through
26811         case ')':
26812           error('Illegal character: ' + ch);
26813       }
26815       // command
26816       var str = ch;
26817       while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) {
26818         stream.skip();
26819         if (str.length == 128)
26820           error('Command token too long: ' + str.length);
26822         str += ch;
26823       }
26824       if (str == 'true')
26825         return true;
26826       if (str == 'false')
26827         return false;
26828       if (str == 'null')
26829         return null;
26830       return Cmd.get(str);
26831     },
26832     skipToNextLine: function Lexer_skipToNextLine() {
26833       var stream = this.stream;
26834       while (true) {
26835         var ch = stream.getChar();
26836         if (!ch || ch == '\n')
26837           return;
26838         if (ch == '\r') {
26839           if ((ch = stream.lookChar()) == '\n')
26840             stream.skip();
26841           return;
26842         }
26843       }
26844     },
26845     skip: function Lexer_skip() {
26846       this.stream.skip();
26847     }
26848   };
26850   return Lexer;
26851 })();
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;
26865     }
26866   }
26868   Linearization.prototype = {
26869     getInt: function Linearization_getInt(name) {
26870       var linDict = this.linDict;
26871       var obj;
26872       if (isDict(linDict) &&
26873           isInt(obj = linDict.get(name)) &&
26874           obj > 0) {
26875         return obj;
26876       }
26877       error('"' + name + '" field in linearization table is invalid');
26878     },
26879     getHint: function Linearization_getHint(index) {
26880       var linDict = this.linDict;
26881       var obj1, obj2;
26882       if (isDict(linDict) &&
26883           isArray(obj1 = linDict.get('H')) &&
26884           obj1.length >= 2 &&
26885           isInt(obj2 = obj1[index]) &&
26886           obj2 > 0) {
26887         return obj2;
26888       }
26889       error('Hints table in linearization table is invalid: ' + index);
26890     },
26891     get length() {
26892       if (!isDict(this.linDict))
26893         return 0;
26894       return this.getInt('L');
26895     },
26896     get hintsOffset() {
26897       return this.getHint(0);
26898     },
26899     get hintsLength() {
26900       return this.getHint(1);
26901     },
26902     get hintsOffset2() {
26903       return this.getHint(2);
26904     },
26905     get hintsLenth2() {
26906       return this.getHint(3);
26907     },
26908     get objectNumberFirst() {
26909       return this.getInt('O');
26910     },
26911     get endFirst() {
26912       return this.getInt('E');
26913     },
26914     get numPages() {
26915       return this.getInt('N');
26916     },
26917     get mainXRefEntriesOffset() {
26918       return this.getInt('T');
26919     },
26920     get pageFirst() {
26921       return this.getInt('P');
26922     }
26923   };
26925   return Linearization;
26926 })();
26929 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
26930 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
26932 'use strict';
26934 var PatternType = {
26935   AXIAL: 2,
26936   RADIAL: 3
26939 var Pattern = (function PatternClosure() {
26940   // Constructor should define this.getPattern
26941   function Pattern() {
26942     error('should not call Pattern constructor');
26943   }
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);
26950     }
26951   };
26953   Pattern.shadingFromIR = function Pattern_shadingFromIR(raw) {
26954     return Shadings[raw[0]].fromIR(raw);
26955   };
26957   Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
26958                                                        res) {
26960     var dict = isStream(shading) ? shading.dict : shading;
26961     var type = dict.get('ShadingType');
26963     switch (type) {
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);
26968       default:
26969         return new Shadings.Dummy();
26970     }
26971   };
26972   return Pattern;
26973 })();
26975 var Shadings = {};
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';
26986     this.ctx = ctx;
26987     var cs = dict.get('ColorSpace', 'CS');
26988     cs = ColorSpace.parse(cs, xref, res);
26989     this.cs = cs;
26991     var t0 = 0.0, t1 = 1.0;
26992     if (dict.has('Domain')) {
26993       var domainArr = dict.get('Domain');
26994       t0 = domainArr[0];
26995       t1 = domainArr[1];
26996     }
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');
27004     }
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]);
27027     }
27029     this.colorStops = colorStops;
27030   }
27032   RadialAxial.fromIR = function RadialAxial_fromIR(raw) {
27033     var type = raw[1];
27034     var colorStops = raw[2];
27035     var p0 = raw[3];
27036     var p1 = raw[4];
27037     var r0 = raw[5];
27038     var r1 = raw[6];
27039     return {
27040       type: 'Pattern',
27041       getPattern: function RadialAxial_getPattern(ctx) {
27042         var curMatrix = ctx.mozCurrentTransform;
27043         if (curMatrix) {
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);
27051         }
27053         var grad;
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]);
27062         }
27063         return grad;
27064       }
27065     };
27066   };
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]];
27075         var r0 = null;
27076         var r1 = null;
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];
27082       } else {
27083         error('getPattern type unknown: ' + type);
27084       }
27086       var matrix = this.matrix;
27087       if (matrix) {
27088         p0 = Util.applyTransform(p0, matrix);
27089         p1 = Util.applyTransform(p1, matrix);
27090       }
27092       return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
27093     }
27094   };
27096   return RadialAxial;
27097 })();
27099 Shadings.Dummy = (function DummyClosure() {
27100   function Dummy() {
27101     this.type = 'Pattern';
27102   }
27104   Dummy.fromIR = function Dummy_fromIR() {
27105     return 'hotpink';
27106   };
27108   Dummy.prototype = {
27109     getIR: function Dummy_getIR() {
27110       return ['Dummy'];
27111     }
27112   };
27113   return Dummy;
27114 })();
27116 var TilingPattern = (function TilingPatternClosure() {
27117   var PaintType = {
27118     COLORED: 1,
27119     UNCOLORED: 2
27120   };
27121   var MAX_PATTERN_SIZE = 512;
27123   function TilingPattern(IR, color, ctx, objs) {
27124     var operatorList = IR[2];
27125     this.matrix = IR[3];
27126     var bbox = IR[4];
27127     var xstep = IR[5];
27128     var ystep = IR[6];
27129     var paintType = IR[7];
27131     TODO('TilingType');
27133     this.curMatrix = ctx.mozCurrentTransform;
27134     this.invMatrix = ctx.mozCurrentTransformInverse;
27135     this.ctx = ctx;
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;
27154     }
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;
27166         break;
27167       case PaintType.UNCOLORED:
27168         var cssColor = Util.makeCssRgb(this, color[0], color[1], color[2]);
27169         tmpCtx.fillStyle = cssColor;
27170         tmpCtx.strokeStyle = cssColor;
27171         break;
27172       default:
27173         error('Unsupported paint type: ' + paintType);
27174     }
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);
27189       graphics.clip();
27190       graphics.endPath();
27191     }
27193     graphics.executeOperatorList(operatorList);
27195     this.canvas = tmpCanvas;
27196   }
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');
27205     return [
27206       'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType
27207     ];
27208   };
27210   TilingPattern.prototype = {
27211     getPattern: function TilingPattern_getPattern() {
27212       var matrix = this.matrix;
27213       var curMatrix = this.curMatrix;
27214       var ctx = this.ctx;
27216       if (curMatrix)
27217         ctx.setTransform.apply(ctx, curMatrix);
27219       if (matrix)
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');
27226     }
27227   };
27229   return TilingPattern;
27230 })();
27233 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
27234 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
27236 'use strict';
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;
27244     this.dict = dict;
27245   }
27247   // required methods for a stream. if a particular stream does not
27248   // implement these, an error should be thrown
27249   Stream.prototype = {
27250     get length() {
27251       return this.end - this.start;
27252     },
27253     getByte: function Stream_getByte() {
27254       if (this.pos >= this.end)
27255         return null;
27256       return this.bytes[this.pos++];
27257     },
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;
27265       if (!length)
27266         return bytes.subarray(pos, strEnd);
27268       var end = pos + length;
27269       if (end > strEnd)
27270         end = strEnd;
27272       this.pos = end;
27273       return bytes.subarray(pos, end);
27274     },
27275     lookChar: function Stream_lookChar() {
27276       if (this.pos >= this.end)
27277         return null;
27278       return String.fromCharCode(this.bytes[this.pos]);
27279     },
27280     getChar: function Stream_getChar() {
27281       if (this.pos >= this.end)
27282         return null;
27283       return String.fromCharCode(this.bytes[this.pos++]);
27284     },
27285     skip: function Stream_skip(n) {
27286       if (!n)
27287         n = 1;
27288       this.pos += n;
27289     },
27290     reset: function Stream_reset() {
27291       this.pos = this.start;
27292     },
27293     moveStart: function Stream_moveStart() {
27294       this.start = this.pos;
27295     },
27296     makeSubStream: function Stream_makeSubStream(start, length, dict) {
27297       return new Stream(this.bytes.buffer, start, length, dict);
27298     },
27299     isStream: true
27300   };
27302   return Stream;
27303 })();
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);
27312   }
27314   StringStream.prototype = Stream.prototype;
27316   return StringStream;
27317 })();
27319 // super class for the decoding streams
27320 var DecodeStream = (function DecodeStreamClosure() {
27321   function DecodeStream() {
27322     this.pos = 0;
27323     this.bufferLength = 0;
27324     this.eof = false;
27325     this.buffer = null;
27326   }
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)
27333         return buffer;
27334       var size = 512;
27335       while (size < requested)
27336         size <<= 1;
27337       var buffer2 = new Uint8Array(size);
27338       for (var i = 0; i < current; ++i)
27339         buffer2[i] = buffer[i];
27340       return (this.buffer = buffer2);
27341     },
27342     getByte: function DecodeStream_getByte() {
27343       var pos = this.pos;
27344       while (this.bufferLength <= pos) {
27345         if (this.eof)
27346           return null;
27347         this.readBlock();
27348       }
27349       return this.buffer[this.pos++];
27350     },
27351     getBytes: function DecodeStream_getBytes(length) {
27352       var end, pos = this.pos;
27354       if (length) {
27355         this.ensureBuffer(pos + length);
27356         end = pos + length;
27358         while (!this.eof && this.bufferLength < end)
27359           this.readBlock();
27361         var bufEnd = this.bufferLength;
27362         if (end > bufEnd)
27363           end = bufEnd;
27364       } else {
27365         while (!this.eof)
27366           this.readBlock();
27368         end = this.bufferLength;
27370         // checking if bufferLength is still 0 then
27371         // the buffer has to be initialized
27372         if (!end)
27373           this.buffer = new Uint8Array(0);
27374       }
27376       this.pos = end;
27377       return this.buffer.subarray(pos, end);
27378     },
27379     lookChar: function DecodeStream_lookChar() {
27380       var pos = this.pos;
27381       while (this.bufferLength <= pos) {
27382         if (this.eof)
27383           return null;
27384         this.readBlock();
27385       }
27386       return String.fromCharCode(this.buffer[this.pos]);
27387     },
27388     getChar: function DecodeStream_getChar() {
27389       var pos = this.pos;
27390       while (this.bufferLength <= pos) {
27391         if (this.eof)
27392           return null;
27393         this.readBlock();
27394       }
27395       return String.fromCharCode(this.buffer[this.pos++]);
27396     },
27397     makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
27398       var end = start + length;
27399       while (this.bufferLength <= end && !this.eof)
27400         this.readBlock();
27401       return new Stream(this.buffer, start, length, dict);
27402     },
27403     skip: function DecodeStream_skip(n) {
27404       if (!n)
27405         n = 1;
27406       this.pos += n;
27407     },
27408     reset: function DecodeStream_reset() {
27409       this.pos = 0;
27410     }
27411   };
27413   return DecodeStream;
27414 })();
27416 var FakeStream = (function FakeStreamClosure() {
27417   function FakeStream(stream) {
27418     this.dict = stream.dict;
27419     DecodeStream.call(this);
27420   }
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;
27428   };
27430   FakeStream.prototype.getBytes = function FakeStream_getBytes(length) {
27431     var end, pos = this.pos;
27433     if (length) {
27434       this.ensureBuffer(pos + length);
27435       end = pos + length;
27437       while (!this.eof && this.bufferLength < end)
27438         this.readBlock();
27440       var bufEnd = this.bufferLength;
27441       if (end > bufEnd)
27442         end = bufEnd;
27443     } else {
27444       this.eof = true;
27445       end = this.bufferLength;
27446     }
27448     this.pos = end;
27449     return this.buffer.subarray(pos, end);
27450   };
27452   return FakeStream;
27453 })();
27455 var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
27456   function StreamsSequenceStream(streams) {
27457     this.streams = streams;
27458     DecodeStream.call(this);
27459   }
27461   StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
27463   StreamsSequenceStream.prototype.readBlock =
27464     function streamSequenceStreamReadBlock() {
27466     var streams = this.streams;
27467     if (streams.length == 0) {
27468       this.eof = true;
27469       return;
27470     }
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;
27478   };
27480   return StreamsSequenceStream;
27481 })();
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
27486   ]);
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
27493   ]);
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
27500   ]);
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
27567   ]), 9];
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
27574   ]), 5];
27576   function FlateStream(stream) {
27577     var bytes = stream.getBytes();
27578     var bytesPos = 0;
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);
27589     if (flg & 0x20)
27590       error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
27592     this.bytes = bytes;
27593     this.bytesPos = bytesPos;
27595     this.codeSize = 0;
27596     this.codeBuf = 0;
27598     DecodeStream.call(this);
27599   }
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;
27609     var b;
27610     while (codeSize < bits) {
27611       if (typeof (b = bytes[bytesPos++]) == 'undefined')
27612         error('Bad encoding in flate stream');
27613       codeBuf |= b << codeSize;
27614       codeSize += 8;
27615     }
27616     b = codeBuf & ((1 << bits) - 1);
27617     this.codeBuf = codeBuf >> bits;
27618     this.codeSize = codeSize -= bits;
27619     this.bytesPos = bytesPos;
27620     return b;
27621   };
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) {
27632       var b;
27633       if (typeof (b = bytes[bytesPos++]) == 'undefined')
27634         error('Bad encoding in flate stream');
27635       codeBuf |= (b << codeSize);
27636       codeSize += 8;
27637     }
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;
27646     return codeVal;
27647   };
27649   FlateStream.prototype.generateHuffmanTable =
27650     function flateStreamGenerateHuffmanTable(lengths) {
27651     var n = lengths.length;
27653     // find max code length
27654     var maxLen = 0;
27655     for (var i = 0; i < n; ++i) {
27656       if (lengths[i] > maxLen)
27657         maxLen = lengths[i];
27658     }
27660     // build the table
27661     var size = 1 << maxLen;
27662     var codes = new Uint32Array(size);
27663     for (var len = 1, code = 0, skip = 2;
27664          len <= maxLen;
27665          ++len, code <<= 1, skip <<= 1) {
27666       for (var val = 0; val < n; ++val) {
27667         if (lengths[val] == len) {
27668           // bit-reverse the code
27669           var code2 = 0;
27670           var t = code;
27671           for (var i = 0; i < len; ++i) {
27672             code2 = (code2 << 1) | (t & 1);
27673             t >>= 1;
27674           }
27676           // fill the table entries
27677           for (var i = code2; i < size; i += skip)
27678             codes[i] = (len << 16) | val;
27680           ++code;
27681         }
27682       }
27683     }
27685     return [codes, maxLen];
27686   };
27688   FlateStream.prototype.readBlock = function FlateStream_readBlock() {
27689     // read block header
27690     var hdr = this.getBits(3);
27691     if (hdr & 1)
27692       this.eof = true;
27693     hdr >>= 1;
27695     if (hdr == 0) { // uncompressed block
27696       var bytes = this.bytes;
27697       var bytesPos = this.bytesPos;
27698       var b;
27700       if (typeof (b = bytes[bytesPos++]) == 'undefined')
27701         error('Bad block header in flate stream');
27702       var blockLen = b;
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');
27708       var check = b;
27709       if (typeof (b = bytes[bytesPos++]) == 'undefined')
27710         error('Bad block header in flate stream');
27711       check |= (b << 8);
27712       if (check != (~blockLen & 0xffff))
27713         error('Bad uncompressed block length in flate stream');
27715       this.codeBuf = 0;
27716       this.codeSize = 0;
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') {
27724           this.eof = true;
27725           break;
27726         }
27727         buffer[n] = b;
27728       }
27729       this.bytesPos = bytesPos;
27730       return;
27731     }
27733     var litCodeTable;
27734     var distCodeTable;
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
27751       var len = 0;
27752       var i = 0;
27753       var codes = numLitCodes + numDistCodes;
27754       var codeLengths = new Uint8Array(codes);
27755       while (i < codes) {
27756         var code = this.getCode(codeLenCodeTab);
27757         if (code == 16) {
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);
27763         } else {
27764           codeLengths[i++] = len = code;
27765           continue;
27766         }
27768         var repeatLength = this.getBits(bitsLength) + bitsOffset;
27769         while (repeatLength-- > 0)
27770           codeLengths[i++] = what;
27771       }
27773       litCodeTable =
27774         this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
27775       distCodeTable =
27776         this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
27777     } else {
27778       error('Unknown block type in flate stream');
27779     }
27781     var buffer = this.buffer;
27782     var limit = buffer ? buffer.length : 0;
27783     var pos = this.bufferLength;
27784     while (true) {
27785       var code1 = this.getCode(litCodeTable);
27786       if (code1 < 256) {
27787         if (pos + 1 >= limit) {
27788           buffer = this.ensureBuffer(pos + 1);
27789           limit = buffer.length;
27790         }
27791         buffer[pos++] = code1;
27792         continue;
27793       }
27794       if (code1 == 256) {
27795         this.bufferLength = pos;
27796         return;
27797       }
27798       code1 -= 257;
27799       code1 = lengthDecode[code1];
27800       var code2 = code1 >> 16;
27801       if (code2 > 0)
27802         code2 = this.getBits(code2);
27803       var len = (code1 & 0xffff) + code2;
27804       code1 = this.getCode(distCodeTable);
27805       code1 = distDecode[code1];
27806       code2 = code1 >> 16;
27807       if (code2 > 0)
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;
27813       }
27814       for (var k = 0; k < len; ++k, ++pos)
27815         buffer[pos] = buffer[pos - dist];
27816     }
27817   };
27819   return FlateStream;
27820 })();
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;
27833     else
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);
27847     return this;
27848   }
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;
27868     if (bits === 1) {
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)
27876         inbuf &= 0xFFFF;
27877       }
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];
27883         pos++;
27884       }
27885     } else {
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);
27894             inbits += 8;
27895           }
27896           compArray[kk] = (compArray[kk] +
27897                            (inbuf >> (inbits - bits))) & bitMask;
27898           inbits -= bits;
27899           outbuf = (outbuf << bits) | compArray[kk];
27900           outbits += bits;
27901           if (outbits >= 8) {
27902             buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
27903             outbits -= 8;
27904           }
27905         }
27906       }
27907       if (outbits > 0) {
27908         buffer[k++] = (outbuf << (8 - outbits)) +
27909         (inbuf & ((1 << (8 - outbits)) - 1));
27910       }
27911     }
27912     this.bufferLength += rowBytes;
27913   };
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) {
27933       case 0:
27934         for (var i = 0; i < rowBytes; ++i)
27935           buffer[j++] = rawBytes[i];
27936         break;
27937       case 1:
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;
27942           j++;
27943         }
27944         break;
27945       case 2:
27946         for (var i = 0; i < rowBytes; ++i)
27947           buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
27948         break;
27949       case 3:
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;
27955           j++;
27956         }
27957         break;
27958       case 4:
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;
27965         }
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;
27972           var pa = p - left;
27973           if (pa < 0)
27974             pa = -pa;
27975           var pb = p - up;
27976           if (pb < 0)
27977             pb = -pb;
27978           var pc = p - upLeft;
27979           if (pc < 0)
27980             pc = -pc;
27982           var c = rawBytes[i];
27983           if (pa <= pb && pa <= pc)
27984             buffer[j++] = left + c;
27985           else if (pb <= pc)
27986             buffer[j++] = up + c;
27987           else
27988             buffer[j++] = upLeft + c;
27989         }
27990         break;
27991       default:
27992         error('Unsupported predictor: ' + predictor);
27993     }
27994     this.bufferLength += rowBytes;
27995   };
27997   return PredictorStream;
27998 })();
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
28005  * DecodeStreams.
28006  */
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)
28017           return true;
28018       // scanning until frame tag
28019       if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0)
28020         break;
28021     }
28022     return false;
28023   }
28025   function fixAdobeImage(bytes) {
28026     // Inserting 'EMBED' marker after JPEG signature
28027     var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45,
28028                                       0x44, 0]);
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);
28035     return newBytes;
28036   }
28038   function JpegStream(bytes, dict, xref) {
28039     // TODO: per poppler, some images may have 'junk' before that
28040     // need to be removed
28041     this.dict = dict;
28043     this.isAdobeImage = false;
28044     this.colorTransform = dict.get('ColorTransform') || -1;
28046     if (isAdobeImage(bytes)) {
28047       this.isAdobeImage = true;
28048       bytes = fixAdobeImage(bytes);
28049     }
28051     this.bytes = bytes;
28053     DecodeStream.call(this);
28054   }
28056   JpegStream.prototype = Object.create(DecodeStream.prototype);
28058   JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
28059     if (this.bufferLength)
28060       return;
28061     try {
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;
28071     } catch (e) {
28072       error('JPEG error: ' + e);
28073     }
28074   };
28075   JpegStream.prototype.getIR = function JpegStream_getIR() {
28076     return bytesToString(this.bytes);
28077   };
28078   JpegStream.prototype.getChar = function JpegStream_getChar() {
28079     error('internal error: getChar is not valid on JpegStream');
28080   };
28081   /**
28082    * Checks if the image can be decoded and displayed by the browser without any
28083    * further processing such as color space conversions.
28084    */
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')
28091       return true;
28092     if (cs.name === 'DeviceCMYK' && !this.isAdobeImage &&
28093         this.colorTransform < 1)
28094       return true;
28095     return false;
28096   };
28097   /**
28098    * Checks if the image can be decoded by the browser.
28099    */
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)
28105       return true;
28107     return false;
28108   };
28110   return JpegStream;
28111 })();
28114  * For JPEG 2000's we use a library to decode these images and
28115  * the stream behaves like all the other DecodeStreams.
28116  */
28117 var JpxStream = (function JpxStreamClosure() {
28118   function JpxStream(bytes, dict) {
28119     this.dict = dict;
28120     this.bytes = bytes;
28122     DecodeStream.call(this);
28123   }
28125   JpxStream.prototype = Object.create(DecodeStream.prototype);
28127   JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
28128     if (this.bufferLength)
28129       return;
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) {
28151         case 1:
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;
28161           }
28162           break;
28163         case 3:
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];
28176               sourcePosition++;
28177             }
28178             dataPosition += rowFeed;
28179           }
28180           break;
28181         case 4:
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];
28196               sourcePosition++;
28197             }
28198             dataPosition += rowFeed;
28199           }
28200           break;
28201       }
28202     }
28204     this.buffer = data;
28205     this.bufferLength = data.length;
28206   };
28207   JpxStream.prototype.getChar = function JpxStream_getChar() {
28208     error('internal error: getChar is not valid on JpxStream');
28209   };
28211   return JpxStream;
28212 })();
28214 var DecryptStream = (function DecryptStreamClosure() {
28215   function DecryptStream(str, decrypt) {
28216     this.str = str;
28217     this.dict = str.dict;
28218     this.decrypt = decrypt;
28220     DecodeStream.call(this);
28221   }
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) {
28230       this.eof = true;
28231       return;
28232     }
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;
28242   };
28244   return DecryptStream;
28245 })();
28247 var Ascii85Stream = (function Ascii85StreamClosure() {
28248   function Ascii85Stream(str) {
28249     this.str = str;
28250     this.dict = str.dict;
28251     this.input = new Uint8Array(5);
28253     DecodeStream.call(this);
28254   }
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)))
28265       c = str.getByte();
28267     if (!c || c === tildaCode) {
28268       this.eof = true;
28269       return;
28270     }
28272     var bufferLength = this.bufferLength, buffer;
28274     // special code for z
28275     if (c == zCode) {
28276       buffer = this.ensureBuffer(bufferLength + 4);
28277       for (var i = 0; i < 4; ++i)
28278         buffer[bufferLength + i] = 0;
28279       this.bufferLength += 4;
28280     } else {
28281       var input = this.input;
28282       input[0] = c;
28283       for (var i = 1; i < 5; ++i) {
28284         c = str.getByte();
28285         while (Lexer.isSpace(String.fromCharCode(c)))
28286           c = str.getByte();
28288         input[i] = c;
28290         if (!c || c == tildaCode)
28291           break;
28292       }
28293       buffer = this.ensureBuffer(bufferLength + i - 1);
28294       this.bufferLength += i - 1;
28296       // partial ending;
28297       if (i < 5) {
28298         for (; i < 5; ++i)
28299           input[i] = 0x21 + 84;
28300         this.eof = true;
28301       }
28302       var t = 0;
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;
28308         t >>= 8;
28309       }
28310     }
28311   };
28313   return Ascii85Stream;
28314 })();
28316 var AsciiHexStream = (function AsciiHexStreamClosure() {
28317   function AsciiHexStream(str) {
28318     this.str = str;
28319     this.dict = str.dict;
28321     DecodeStream.call(this);
28322   }
28324   var hexvalueMap = {
28325       9: -1, // \t
28326       32: -1, // space
28327       48: 0,
28328       49: 1,
28329       50: 2,
28330       51: 3,
28331       52: 4,
28332       53: 5,
28333       54: 6,
28334       55: 7,
28335       56: 8,
28336       57: 9,
28337       65: 10,
28338       66: 11,
28339       67: 12,
28340       68: 13,
28341       69: 14,
28342       70: 15,
28343       97: 10,
28344       98: 11,
28345       99: 12,
28346       100: 13,
28347       101: 14,
28348       102: 15
28349   };
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]];
28365       }
28367       if ((i + 1) < length && (bytes[i + 1] !== gtCode)) {
28368         n = hexvalueMap[bytes[++i]];
28369         buffer[bufferLength++] = c * 16 + n;
28370       } else {
28371         // EOD marker at an odd number, behave as if a 0 followed the last
28372         // digit.
28373         if (bytes[i] !== gtCode) {
28374           buffer[bufferLength++] = c * 16;
28375         }
28376       }
28377     }
28379     this.bufferLength = bufferLength;
28380     this.eof = true;
28381   };
28383   return AsciiHexStream;
28384 })();
28386 var RunLengthStream = (function RunLengthStreamClosure() {
28387   function RunLengthStream(str) {
28388     this.str = str;
28389     this.dict = str.dict;
28391     DecodeStream.call(this);
28392   }
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) {
28403       this.eof = true;
28404       return;
28405     }
28407     var bufferLength = this.bufferLength;
28408     var n = repeatHeader[0];
28409     if (n < 128) {
28410       // copy n bytes
28411       var buffer = this.ensureBuffer(bufferLength + n + 1);
28412       buffer[bufferLength++] = repeatHeader[1];
28413       if (n > 0) {
28414         var source = this.str.getBytes(n);
28415         buffer.set(source, bufferLength);
28416         bufferLength += n;
28417       }
28418     } else {
28419       n = 257 - n;
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;
28424     }
28425     this.bufferLength = bufferLength;
28426   };
28428   return RunLengthStream;
28429 })();
28431 var CCITTFaxStream = (function CCITTFaxStreamClosure() {
28433   var ccittEOL = -2;
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]
28510   ];
28512   var whiteTable1 = [
28513     [-1, -1],                               // 00000
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
28532   ];
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]
28696   ];
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]
28757   ];
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]
28836   ];
28838   var blackTable3 = [
28839     [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
28840     [6, 9],                                 // 000100
28841     [6, 8],                                 // 000101
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]
28857   ];
28859   function CCITTFaxStream(str, params) {
28860     this.str = str;
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)
28872       eoblock = true;
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;
28882     this.row = 0;
28883     this.nextLine2D = this.encoding < 0;
28884     this.inputBits = 0;
28885     this.inputBuf = 0;
28886     this.outputBits = 0;
28887     this.buf = EOF;
28889     var code1;
28890     while ((code1 = this.lookBits(12)) == 0) {
28891       this.eatBits(1);
28892     }
28893     if (code1 == 1) {
28894       this.eatBits(12);
28895     }
28896     if (this.encoding > 0) {
28897       this.nextLine2D = !this.lookBits(1);
28898       this.eatBits(1);
28899     }
28901     DecodeStream.call(this);
28902   }
28904   CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
28906   CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
28907     while (!this.eof) {
28908       var c = this.lookChar();
28909       this.buf = EOF;
28910       this.ensureBuffer(this.bufferLength + 1);
28911       this.buffer[this.bufferLength++] = c;
28912     }
28913   };
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');
28923         this.err = true;
28924         a1 = this.columns;
28925       }
28926       if ((codingPos & 1) ^ blackPixels) {
28927         ++codingPos;
28928       }
28930       codingLine[codingPos] = a1;
28931     }
28932     this.codingPos = codingPos;
28933   };
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');
28943         this.err = true;
28944         a1 = this.columns;
28945       }
28946       if ((codingPos & 1) ^ blackPixels)
28947         ++codingPos;
28949       codingLine[codingPos] = a1;
28950     } else if (a1 < codingLine[codingPos]) {
28951       if (a1 < 0) {
28952         warn('invalid code');
28953         this.err = true;
28954         a1 = 0;
28955       }
28956       while (codingPos > 0 && a1 < codingLine[codingPos - 1])
28957         --codingPos;
28958       codingLine[codingPos] = a1;
28959     }
28961     this.codingPos = codingPos;
28962   };
28964   CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
28965     if (this.buf != EOF)
28966       return this.buf;
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) {
28975       if (this.eof)
28976         return null;
28978       this.err = false;
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;
28987         codingLine[0] = 0;
28988         this.codingPos = 0;
28989         refPos = 0;
28990         blackPixels = 0;
28992         while (codingLine[this.codingPos] < columns) {
28993           code1 = this.getTwoDimCode();
28994           switch (code1) {
28995             case twoDimPass:
28996               this.addPixels(refLine[refPos + 1], blackPixels);
28997               if (refLine[refPos + 1] < columns)
28998                 refPos += 2;
28999               break;
29000             case twoDimHoriz:
29001               code1 = code2 = 0;
29002               if (blackPixels) {
29003                 do {
29004                   code1 += (code3 = this.getBlackCode());
29005                 } while (code3 >= 64);
29006                 do {
29007                   code2 += (code3 = this.getWhiteCode());
29008                 } while (code3 >= 64);
29009               } else {
29010                 do {
29011                   code1 += (code3 = this.getWhiteCode());
29012                 } while (code3 >= 64);
29013                 do {
29014                   code2 += (code3 = this.getBlackCode());
29015                 } while (code3 >= 64);
29016               }
29017               this.addPixels(codingLine[this.codingPos] +
29018                              code1, blackPixels);
29019               if (codingLine[this.codingPos] < columns) {
29020                 this.addPixels(codingLine[this.codingPos] + code2,
29021                                blackPixels ^ 1);
29022               }
29023               while (refLine[refPos] <= codingLine[this.codingPos] &&
29024                      refLine[refPos] < columns) {
29025                 refPos += 2;
29026               }
29027               break;
29028             case twoDimVertR3:
29029               this.addPixels(refLine[refPos] + 3, blackPixels);
29030               blackPixels ^= 1;
29031               if (codingLine[this.codingPos] < columns) {
29032                 ++refPos;
29033                 while (refLine[refPos] <= codingLine[this.codingPos] &&
29034                        refLine[refPos] < columns)
29035                   refPos += 2;
29036               }
29037               break;
29038             case twoDimVertR2:
29039               this.addPixels(refLine[refPos] + 2, blackPixels);
29040               blackPixels ^= 1;
29041               if (codingLine[this.codingPos] < columns) {
29042                 ++refPos;
29043                 while (refLine[refPos] <= codingLine[this.codingPos] &&
29044                        refLine[refPos] < columns) {
29045                   refPos += 2;
29046                 }
29047               }
29048               break;
29049             case twoDimVertR1:
29050               this.addPixels(refLine[refPos] + 1, blackPixels);
29051               blackPixels ^= 1;
29052               if (codingLine[this.codingPos] < columns) {
29053                 ++refPos;
29054                 while (refLine[refPos] <= codingLine[this.codingPos] &&
29055                        refLine[refPos] < columns)
29056                   refPos += 2;
29057               }
29058               break;
29059             case twoDimVert0:
29060               this.addPixels(refLine[refPos], blackPixels);
29061               blackPixels ^= 1;
29062               if (codingLine[this.codingPos] < columns) {
29063                 ++refPos;
29064                 while (refLine[refPos] <= codingLine[this.codingPos] &&
29065                        refLine[refPos] < columns)
29066                   refPos += 2;
29067               }
29068               break;
29069             case twoDimVertL3:
29070               this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
29071               blackPixels ^= 1;
29072               if (codingLine[this.codingPos] < columns) {
29073                 if (refPos > 0)
29074                   --refPos;
29075                 else
29076                   ++refPos;
29077                 while (refLine[refPos] <= codingLine[this.codingPos] &&
29078                        refLine[refPos] < columns)
29079                   refPos += 2;
29080               }
29081               break;
29082             case twoDimVertL2:
29083               this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
29084               blackPixels ^= 1;
29085               if (codingLine[this.codingPos] < columns) {
29086                 if (refPos > 0)
29087                   --refPos;
29088                 else
29089                   ++refPos;
29090                 while (refLine[refPos] <= codingLine[this.codingPos] &&
29091                        refLine[refPos] < columns)
29092                   refPos += 2;
29093               }
29094               break;
29095             case twoDimVertL1:
29096               this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
29097               blackPixels ^= 1;
29098               if (codingLine[this.codingPos] < columns) {
29099                 if (refPos > 0)
29100                   --refPos;
29101                 else
29102                   ++refPos;
29104                 while (refLine[refPos] <= codingLine[this.codingPos] &&
29105                        refLine[refPos] < columns)
29106                   refPos += 2;
29107               }
29108               break;
29109             case EOF:
29110               this.addPixels(columns, 0);
29111               this.eof = true;
29112               break;
29113             default:
29114               warn('bad 2d code');
29115               this.addPixels(columns, 0);
29116               this.err = true;
29117           }
29118         }
29119       } else {
29120         codingLine[0] = 0;
29121         this.codingPos = 0;
29122         blackPixels = 0;
29123         while (codingLine[this.codingPos] < columns) {
29124           code1 = 0;
29125           if (blackPixels) {
29126             do {
29127               code1 += (code3 = this.getBlackCode());
29128             } while (code3 >= 64);
29129           } else {
29130             do {
29131               code1 += (code3 = this.getWhiteCode());
29132             } while (code3 >= 64);
29133           }
29134           this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
29135           blackPixels ^= 1;
29136         }
29137       }
29139       if (this.byteAlign)
29140         this.inputBits &= ~7;
29142       var gotEOL = false;
29144       if (!this.eoblock && this.row == this.rows - 1) {
29145         this.eof = true;
29146       } else {
29147         code1 = this.lookBits(12);
29148         while (code1 == 0) {
29149           this.eatBits(1);
29150           code1 = this.lookBits(12);
29151         }
29152         if (code1 == 1) {
29153           this.eatBits(12);
29154           gotEOL = true;
29155         } else if (code1 == EOF) {
29156           this.eof = true;
29157         }
29158       }
29160       if (!this.eof && this.encoding > 0) {
29161         this.nextLine2D = !this.lookBits(1);
29162         this.eatBits(1);
29163       }
29165       if (this.eoblock && gotEOL) {
29166         code1 = this.lookBits(12);
29167         if (code1 == 1) {
29168           this.eatBits(12);
29169           if (this.encoding > 0) {
29170             this.lookBits(1);
29171             this.eatBits(1);
29172           }
29173           if (this.encoding >= 0) {
29174             for (var i = 0; i < 4; ++i) {
29175               code1 = this.lookBits(12);
29176               if (code1 != 1)
29177                 warn('bad rtc code: ' + code1);
29178               this.eatBits(12);
29179               if (this.encoding > 0) {
29180                 this.lookBits(1);
29181                 this.eatBits(1);
29182               }
29183             }
29184           }
29185           this.eof = true;
29186         }
29187       } else if (this.err && this.eoline) {
29188         while (true) {
29189           code1 = this.lookBits(13);
29190           if (code1 == EOF) {
29191             this.eof = true;
29192             return null;
29193           }
29194           if ((code1 >> 1) == 1) {
29195             break;
29196           }
29197           this.eatBits(1);
29198         }
29199         this.eatBits(12);
29200         if (this.encoding > 0) {
29201           this.eatBits(1);
29202           this.nextLine2D = !(code1 & 1);
29203         }
29204       }
29206       if (codingLine[0] > 0)
29207         this.outputBits = codingLine[this.codingPos = 0];
29208       else
29209         this.outputBits = codingLine[this.codingPos = 1];
29210       this.row++;
29211     }
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) {
29217         this.codingPos++;
29218         this.outputBits = (codingLine[this.codingPos] -
29219                            codingLine[this.codingPos - 1]);
29220       }
29221     } else {
29222       var bits = 8;
29223       this.buf = 0;
29224       do {
29225         if (this.outputBits > bits) {
29226           this.buf <<= bits;
29227           if (!(this.codingPos & 1)) {
29228             this.buf |= 0xFF >> (8 - bits);
29229           }
29230           this.outputBits -= bits;
29231           bits = 0;
29232         } else {
29233           this.buf <<= this.outputBits;
29234           if (!(this.codingPos & 1)) {
29235             this.buf |= 0xFF >> (8 - this.outputBits);
29236           }
29237           bits -= this.outputBits;
29238           this.outputBits = 0;
29239           if (codingLine[this.codingPos] < columns) {
29240             this.codingPos++;
29241             this.outputBits = (codingLine[this.codingPos] -
29242                                codingLine[this.codingPos - 1]);
29243           } else if (bits > 0) {
29244             this.buf <<= bits;
29245             bits = 0;
29246           }
29247         }
29248       } while (bits);
29249     }
29250     if (this.black) {
29251       this.buf ^= 0xFF;
29252     }
29253     return this.buf;
29254   };
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);
29268       if (code == EOF)
29269         return [true, 1, false];
29270       if (i < end)
29271         code <<= end - i;
29272       if (!limitValue || code >= limitValue) {
29273         var p = table[code - limitValue];
29274         if (p[0] == i) {
29275           this.eatBits(i);
29276           return [true, p[1], true];
29277         }
29278       }
29279     }
29280     return [false, 0, false];
29281   };
29283   CCITTFaxStream.prototype.getTwoDimCode =
29284     function ccittFaxStreamGetTwoDimCode() {
29286     var code = 0;
29287     var p;
29288     if (this.eoblock) {
29289       code = this.lookBits(7);
29290       p = twoDimTable[code];
29291       if (p && p[0] > 0) {
29292         this.eatBits(p[0]);
29293         return p[1];
29294       }
29295     } else {
29296       var result = this.findTableCode(1, 7, twoDimTable);
29297       if (result[0] && result[2])
29298         return result[1];
29299     }
29300     warn('Bad two dim code');
29301     return EOF;
29302   };
29304   CCITTFaxStream.prototype.getWhiteCode =
29305     function ccittFaxStreamGetWhiteCode() {
29307     var code = 0;
29308     var p;
29309     var n;
29310     if (this.eoblock) {
29311       code = this.lookBits(12);
29312       if (code == EOF)
29313         return 1;
29315       if ((code >> 5) == 0)
29316         p = whiteTable1[code];
29317       else
29318         p = whiteTable2[code >> 3];
29320       if (p[0] > 0) {
29321         this.eatBits(p[0]);
29322         return p[1];
29323       }
29324     } else {
29325       var result = this.findTableCode(1, 9, whiteTable2);
29326       if (result[0])
29327         return result[1];
29329       result = this.findTableCode(11, 12, whiteTable1);
29330       if (result[0])
29331         return result[1];
29332     }
29333     warn('bad white code');
29334     this.eatBits(1);
29335     return 1;
29336   };
29338   CCITTFaxStream.prototype.getBlackCode =
29339     function ccittFaxStreamGetBlackCode() {
29341     var code, p;
29342     if (this.eoblock) {
29343       code = this.lookBits(13);
29344       if (code == EOF)
29345         return 1;
29346       if ((code >> 7) == 0)
29347         p = blackTable1[code];
29348       else if ((code >> 9) == 0 && (code >> 7) != 0)
29349         p = blackTable2[(code >> 1) - 64];
29350       else
29351         p = blackTable3[code >> 7];
29353       if (p[0] > 0) {
29354         this.eatBits(p[0]);
29355         return p[1];
29356       }
29357     } else {
29358       var result = this.findTableCode(2, 6, blackTable3);
29359       if (result[0])
29360         return result[1];
29362       result = this.findTableCode(7, 12, blackTable2, 64);
29363       if (result[0])
29364         return result[1];
29366       result = this.findTableCode(10, 13, blackTable1);
29367       if (result[0])
29368         return result[1];
29369     }
29370     warn('bad black code');
29371     this.eatBits(1);
29372     return 1;
29373   };
29375   CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
29376     var c;
29377     while (this.inputBits < n) {
29378       if ((c = this.str.getByte()) == null) {
29379         if (this.inputBits == 0)
29380           return EOF;
29381         return ((this.inputBuf << (n - this.inputBits)) &
29382                 (0xFFFF >> (16 - n)));
29383       }
29384       this.inputBuf = (this.inputBuf << 8) + c;
29385       this.inputBits += 8;
29386     }
29387     return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
29388   };
29390   CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
29391     if ((this.inputBits -= n) < 0)
29392       this.inputBits = 0;
29393   };
29395   return CCITTFaxStream;
29396 })();
29398 var LZWStream = (function LZWStreamClosure() {
29399   function LZWStream(str, earlyChange) {
29400     this.str = str;
29401     this.dict = str.dict;
29402     this.cachedData = 0;
29403     this.bitsCached = 0;
29405     var maxLzwDictionarySize = 4096;
29406     var lzwState = {
29407       earlyChange: earlyChange,
29408       codeLength: 9,
29409       nextCode: 258,
29410       dictionaryValues: new Uint8Array(maxLzwDictionarySize),
29411       dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
29412       dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
29413       currentSequence: new Uint8Array(maxLzwDictionarySize),
29414       currentSequenceLength: 0
29415     };
29416     for (var i = 0; i < 256; ++i) {
29417       lzwState.dictionaryValues[i] = i;
29418       lzwState.dictionaryLengths[i] = 1;
29419     }
29420     this.lzwState = lzwState;
29422     DecodeStream.call(this);
29423   }
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();
29432       if (c == null) {
29433         this.eof = true;
29434         return null;
29435       }
29436       cachedData = (cachedData << 8) | c;
29437       bitsCached += 8;
29438     }
29439     this.bitsCached = (bitsCached -= n);
29440     this.cachedData = cachedData;
29441     this.lastCode = null;
29442     return (cachedData >>> bitsCached) & ((1 << n) - 1);
29443   };
29445   LZWStream.prototype.readBlock = function LZWStream_readBlock() {
29446     var blockSize = 512;
29447     var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
29448     var i, j, q;
29450     var lzwState = this.lzwState;
29451     if (!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;
29471       if (code < 256) {
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];
29480           }
29481         } else {
29482           currentSequence[currentSequenceLength++] = currentSequence[0];
29483         }
29484       } else if (code == 256) {
29485         codeLength = 9;
29486         nextCode = 258;
29487         currentSequenceLength = 0;
29488         continue;
29489       } else {
29490         this.eof = true;
29491         delete this.lzwState;
29492         break;
29493       }
29495       if (hasPrev) {
29496         dictionaryPrevCodes[nextCode] = prevCode;
29497         dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
29498         dictionaryValues[nextCode] = currentSequence[0];
29499         nextCode++;
29500         codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
29501           codeLength : Math.min(Math.log(nextCode + earlyChange) /
29502           0.6931471805599453 + 1, 12) | 0;
29503       }
29504       prevCode = code;
29506       decodedLength += currentSequenceLength;
29507       if (estimatedDecodedSize < decodedLength) {
29508         do {
29509           estimatedDecodedSize += decodedSizeDelta;
29510         } while (estimatedDecodedSize < decodedLength);
29511         buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
29512       }
29513       for (j = 0; j < currentSequenceLength; j++)
29514         buffer[currentBufferLength++] = currentSequence[j];
29515     }
29516     lzwState.nextCode = nextCode;
29517     lzwState.codeLength = codeLength;
29518     lzwState.prevCode = prevCode;
29519     lzwState.currentSequenceLength = currentSequenceLength;
29521     this.bufferLength = currentBufferLength;
29522   };
29524   return LZWStream;
29525 })();
29528 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
29529 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
29531 'use strict';
29533 function MessageHandler(name, comObj) {
29534   this.name = name;
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);
29542   }];
29543   ah['console_error'] = [function ahConsoleError(data) {
29544       PdfJS_window.console.error.apply(PdfJS_window.console, data);
29545   }];
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);
29555       } else {
29556         error('Cannot resolve callback ' + callbackId);
29557       }
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({
29564             isReply: true,
29565             callbackId: data.callbackId,
29566             data: resolvedData
29567           });
29568         });
29569         action[0].call(action[1], data.data, promise);
29570       } else {
29571         action[0].call(action[1], data.data);
29572       }
29573     } else {
29574       error('Unkown action from worker: ' + data.action);
29575     }
29576   };
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 + '"');
29584     }
29585     ah[actionName] = [handler, scope];
29586   },
29587   /**
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.
29592    */
29593   send: function messageHandlerSend(actionName, data, callback) {
29594     var message = {
29595       action: actionName,
29596       data: data
29597     };
29598     if (callback) {
29599       var callbackId = this.callbackIndex++;
29600       this.callbacks[callbackId] = callback;
29601       message.callbackId = callbackId;
29602     }
29603     this.comObj.postMessage(message);
29604   }
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);
29613     });
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));
29619       var doc = {
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
29626       };
29627       handler.send('GetDoc', {pdfInfo: doc});
29628     });
29630     handler.on('GetPageRequest', function wphSetupGetPage(data) {
29631       var pageNumber = data.pageIndex + 1;
29632       var pdfPage = pdfModel.getPage(pageNumber);
29633       var page = {
29634         pageIndex: data.pageIndex,
29635         rotate: pdfPage.rotate,
29636         ref: pdfPage.ref,
29637         view: pdfPage.view
29638       };
29639       handler.send('GetPage', {pageInfo: page});
29640     });
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()
29647       });
29648     });
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;
29663       try {
29664         var page = pdfModel.getPage(pageNum);
29665         // Pre compile the pdf page and fetch the fonts/images.
29666         operatorList = page.getOperatorList(handler, dependency);
29667       } catch (e) {
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') {
29673           e = {
29674             message: e,
29675             stack: minimumStackMessage
29676           };
29677         } else if (typeof e === 'object') {
29678           e = {
29679             message: e.message || e.toString(),
29680             stack: e.stack || minimumStackMessage
29681           };
29682         } else {
29683           e = {
29684             message: 'Unknown exception type: ' + (typeof e),
29685             stack: minimumStackMessage
29686           };
29687         }
29689         handler.send('PageError', {
29690           pageNum: pageNum,
29691           error: e
29692         });
29693         return;
29694       }
29696       // Filter the dependecies for fonts.
29697       var fonts = {};
29698       for (var i = 0, ii = dependency.length; i < ii; i++) {
29699         var dep = dependency[i];
29700         if (dep.indexOf('font_') == 0) {
29701           fonts[dep] = true;
29702         }
29703       }
29704       handler.send('RenderPage', {
29705         pageIndex: data.pageIndex,
29706         operatorList: operatorList,
29707         depFonts: Object.keys(fonts)
29708       });
29709     }, this);
29710   }
29713 var consoleTimer = {};
29715 var workerConsole = {
29716   log: function log() {
29717     var args = Array.prototype.slice.call(arguments);
29718     postMessage({
29719       action: 'console_log',
29720       data: args
29721     });
29722   },
29724   error: function error() {
29725     var args = Array.prototype.slice.call(arguments);
29726     postMessage({
29727       action: 'console_error',
29728       data: args
29729     });
29730     throw 'pdf.js execution error';
29731   },
29733   time: function time(name) {
29734     consoleTimer[name] = Date.now();
29735   },
29737   timeEnd: function timeEnd(name) {
29738     var time = consoleTimer[name];
29739     if (time == null) {
29740       error('Unkown timer name ' + name);
29741     }
29742     this.log('Timer:', name, Date.now() - time);
29743   }
29746 // Worker thread?
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() {
29767   "use strict";
29768   var dctZigZag = new Int32Array([
29769      0,
29770      1,  8,
29771     16,  9,  2,
29772      3, 10, 17, 24,
29773     32, 25, 18, 11, 4,
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,
29780     39, 46, 53, 60,
29781     61, 54, 47,
29782     55, 62,
29783     63
29784   ]);
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() {
29796   }
29798   function buildHuffmanTable(codeLengths, values) {
29799     var k = 0, code = [], i, j, length = 16;
29800     while (length > 0 && !codeLengths[length - 1])
29801       length--;
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++) {
29806         p = code.pop();
29807         p.children[p.index] = values[k];
29808         while (p.index > 0) {
29809           p = code.pop();
29810         }
29811         p.index++;
29812         code.push(p);
29813         while (code.length <= i) {
29814           code.push(q = {children: [], index: 0});
29815           p.children[p.index] = q.children;
29816           p = q;
29817         }
29818         k++;
29819       }
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;
29824         p = q;
29825       }
29826     }
29827     return code[0].children;
29828   }
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) {
29844         bitsCount--;
29845         return (bitsData >> bitsCount) & 1;
29846       }
29847       bitsData = data[offset++];
29848       if (bitsData == 0xFF) {
29849         var nextByte = data[offset++];
29850         if (nextByte) {
29851           throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16);
29852         }
29853         // unstuff 0
29854       }
29855       bitsCount = 7;
29856       return bitsData >>> 7;
29857     }
29858     function decodeHuffman(tree) {
29859       var node = tree, bit;
29860       while ((bit = readBit()) !== null) {
29861         node = node[bit];
29862         if (typeof node === 'number')
29863           return node;
29864         if (typeof node !== 'object')
29865           throw "invalid huffman sequence";
29866       }
29867       return null;
29868     }
29869     function receive(length) {
29870       var n = 0;
29871       while (length > 0) {
29872         var bit = readBit();
29873         if (bit === null) return;
29874         n = (n << 1) | bit;
29875         length--;
29876       }
29877       return n;
29878     }
29879     function receiveAndExtend(length) {
29880       var n = receive(length);
29881       if (n >= 1 << (length - 1))
29882         return n;
29883       return n + (-1 << length) + 1;
29884     }
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);
29889       var k = 1;
29890       while (k < 64) {
29891         var rs = decodeHuffman(component.huffmanTableAC);
29892         var s = rs & 15, r = rs >> 4;
29893         if (s === 0) {
29894           if (r < 15)
29895             break;
29896           k += 16;
29897           continue;
29898         }
29899         k += r;
29900         var z = dctZigZag[k];
29901         zz[z] = receiveAndExtend(s);
29902         k++;
29903       }
29904     }
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);
29909     }
29910     function decodeDCSuccessive(component, zz) {
29911       zz[0] |= readBit() << successive;
29912     }
29913     var eobrun = 0;
29914     function decodeACFirst(component, zz) {
29915       if (eobrun > 0) {
29916         eobrun--;
29917         return;
29918       }
29919       var k = spectralStart, e = spectralEnd;
29920       while (k <= e) {
29921         var rs = decodeHuffman(component.huffmanTableAC);
29922         var s = rs & 15, r = rs >> 4;
29923         if (s === 0) {
29924           if (r < 15) {
29925             eobrun = receive(r) + (1 << r) - 1;
29926             break;
29927           }
29928           k += 16;
29929           continue;
29930         }
29931         k += r;
29932         var z = dctZigZag[k];
29933         zz[z] = receiveAndExtend(s) * (1 << successive);
29934         k++;
29935       }
29936     }
29937     var successiveACState = 0, successiveACNextValue;
29938     function decodeACSuccessive(component, zz) {
29939       var k = spectralStart, e = spectralEnd, r = 0;
29940       while (k <= e) {
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;
29946           if (s === 0) {
29947             if (r < 15) {
29948               eobrun = receive(r) + (1 << r);
29949               successiveACState = 4;
29950             } else {
29951               r = 16;
29952               successiveACState = 1;
29953             }
29954           } else {
29955             if (s !== 1)
29956               throw "invalid ACn encoding";
29957             successiveACNextValue = receiveAndExtend(s);
29958             successiveACState = r ? 2 : 3;
29959           }
29960           continue;
29961         case 1: // skipping r zero items
29962         case 2:
29963           if (zz[z])
29964             zz[z] += (readBit() << successive);
29965           else {
29966             r--;
29967             if (r === 0)
29968               successiveACState = successiveACState == 2 ? 3 : 0;
29969           }
29970           break;
29971         case 3: // set value for a zero item
29972           if (zz[z])
29973             zz[z] += (readBit() << successive);
29974           else {
29975             zz[z] = successiveACNextValue << successive;
29976             successiveACState = 0;
29977           }
29978           break;
29979         case 4: // eob
29980           if (zz[z])
29981             zz[z] += (readBit() << successive);
29982           break;
29983         }
29984         k++;
29985       }
29986       if (successiveACState === 4) {
29987         eobrun--;
29988         if (eobrun === 0)
29989           successiveACState = 0;
29990       }
29991     }
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]);
29998     }
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]);
30003     }
30005     var componentsLength = components.length;
30006     var component, i, j, k, n;
30007     var decodeFn;
30008     if (progressive) {
30009       if (spectralStart === 0)
30010         decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
30011       else
30012         decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
30013     } else {
30014       decodeFn = decodeBaseline;
30015     }
30017     var mcu = 0, marker;
30018     var mcuExpected;
30019     if (componentsLength == 1) {
30020       mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
30021     } else {
30022       mcuExpected = mcusPerLine * frame.mcusPerColumn;
30023     }
30024     if (!resetInterval) resetInterval = mcuExpected;
30026     var h, v;
30027     while (mcu < mcuExpected) {
30028       // reset interval stuff
30029       for (i = 0; i < componentsLength; i++)
30030         components[i].pred = 0;
30031       eobrun = 0;
30033       if (componentsLength == 1) {
30034         component = components[0];
30035         for (n = 0; n < resetInterval; n++) {
30036           decodeBlock(component, decodeFn, mcu);
30037           mcu++;
30038         }
30039       } else {
30040         for (n = 0; n < resetInterval; n++) {
30041           for (i = 0; i < componentsLength; i++) {
30042             component = components[i];
30043             h = component.h;
30044             v = component.v;
30045             for (j = 0; j < v; j++) {
30046               for (k = 0; k < h; k++) {
30047                 decodeMcu(component, decodeFn, mcu, j, k);
30048               }
30049             }
30050           }
30051           mcu++;
30052         }
30053       }
30055       // find marker
30056       bitsCount = 0;
30057       marker = (data[offset] << 8) | data[offset + 1];
30058       if (marker <= 0xFF00) {
30059         throw "marker was not found";
30060       }
30062       if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
30063         offset += 2;
30064       }
30065       else
30066         break;
30067     }
30069     return offset - startOffset;
30070   }
30072   function buildComponentData(frame, component) {
30073     var lines = [];
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,
30083     //   988-991.
30084     function quantizeAndInverse(zz, dataOut, dataIn) {
30085       var qt = component.quantizationTable;
30086       var v0, v1, v2, v3, v4, v5, v6, v7, t;
30087       var p = dataIn;
30088       var i;
30090       // dequant
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) {
30096         var row = 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 &&
30101             p[7 + row] == 0) {
30102           t = (dctSqrt2 * p[0 + row] + 512) >> 10;
30103           p[0 + row] = t;
30104           p[1 + row] = t;
30105           p[2 + row] = t;
30106           p[3 + row] = t;
30107           p[4 + row] = t;
30108           p[5 + row] = t;
30109           p[6 + row] = t;
30110           p[7 + row] = t;
30111           continue;
30112         }
30114         // stage 4
30115         v0 = (dctSqrt2 * p[0 + row] + 128) >> 8;
30116         v1 = (dctSqrt2 * p[4 + row] + 128) >> 8;
30117         v2 = p[2 + row];
30118         v3 = p[6 + row];
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;
30124         // stage 3
30125         t = (v0 - v1+ 1) >> 1;
30126         v0 = (v0 + v1 + 1) >> 1;
30127         v1 = t;
30128         t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
30129         v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
30130         v3 = t;
30131         t = (v4 - v6 + 1) >> 1;
30132         v4 = (v4 + v6 + 1) >> 1;
30133         v6 = t;
30134         t = (v7 + v5 + 1) >> 1;
30135         v5 = (v7 - v5 + 1) >> 1;
30136         v7 = t;
30138         // stage 2
30139         t = (v0 - v3 + 1) >> 1;
30140         v0 = (v0 + v3 + 1) >> 1;
30141         v3 = t;
30142         t = (v1 - v2 + 1) >> 1;
30143         v1 = (v1 + v2 + 1) >> 1;
30144         v2 = t;
30145         t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
30146         v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
30147         v7 = t;
30148         t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
30149         v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
30150         v6 = t;
30152         // stage 1
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;
30161       }
30163       // inverse DCT on columns
30164       for (i = 0; i < 8; ++i) {
30165         var col = 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;
30172           p[0*8 + col] = t;
30173           p[1*8 + col] = t;
30174           p[2*8 + col] = t;
30175           p[3*8 + col] = t;
30176           p[4*8 + col] = t;
30177           p[5*8 + col] = t;
30178           p[6*8 + col] = t;
30179           p[7*8 + col] = t;
30180           continue;
30181         }
30183         // stage 4
30184         v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12;
30185         v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12;
30186         v2 = p[2*8 + col];
30187         v3 = p[6*8 + col];
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;
30190         v5 = p[3*8 + col];
30191         v6 = p[5*8 + col];
30193         // stage 3
30194         t = (v0 - v1 + 1) >> 1;
30195         v0 = (v0 + v1 + 1) >> 1;
30196         v1 = t;
30197         t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
30198         v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
30199         v3 = t;
30200         t = (v4 - v6 + 1) >> 1;
30201         v4 = (v4 + v6 + 1) >> 1;
30202         v6 = t;
30203         t = (v7 + v5 + 1) >> 1;
30204         v5 = (v7 - v5 + 1) >> 1;
30205         v7 = t;
30207         // stage 2
30208         t = (v0 - v3 + 1) >> 1;
30209         v0 = (v0 + v3 + 1) >> 1;
30210         v3 = t;
30211         t = (v1 - v2 + 1) >> 1;
30212         v1 = (v1 + v2 + 1) >> 1;
30213         v2 = t;
30214         t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
30215         v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
30216         v7 = t;
30217         t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
30218         v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
30219         v6 = t;
30221         // stage 1
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;
30230       }
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;
30236       }
30237     }
30239     var i, j;
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++];
30252         }
30253       }
30254     }
30255     return lines;
30256   }
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);
30266         this.parse(data);
30267         if (this.onload)
30268           this.onload();
30269       }).bind(this);
30270       xhr.send(null);
30271     },
30272     parse: function parse(data) {
30273       var offset = 0, length = data.length;
30274       function readUint16() {
30275         var value = (data[offset] << 8) | data[offset + 1];
30276         offset += 2;
30277         return value;
30278       }
30279       function readDataBlock() {
30280         var length = readUint16();
30281         var array = data.subarray(offset, offset + length - 2);
30282         offset += array.length;
30283         return array;
30284       }
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;
30293           }
30294         }
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;
30304             var blocks = [];
30305             for (var i = 0; i < blocksPerColumnForMcu; i++) {
30306               var row = [];
30307               for (var j = 0; j < blocksPerLineForMcu; j++)
30308                 row.push(new Int32Array(64));
30309               blocks.push(row);
30310             }
30311             component.blocksPerLine = blocksPerLine;
30312             component.blocksPerColumn = blocksPerColumn;
30313             component.blocks = blocks;
30314           }
30315         }
30316         frame.maxH = maxH;
30317         frame.maxV = maxV;
30318         frame.mcusPerLine = mcusPerLine;
30319         frame.mcusPerColumn = mcusPerColumn;
30320       }
30321       var jfif = null;
30322       var adobe = null;
30323       var pixels = null;
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";
30330       }
30332       fileMarker = readUint16();
30333       while (fileMarker != 0xFFD9) { // EOI (End of image)
30334         var i, j, l;
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'
30358                 jfif = {
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])
30366                 };
30367               }
30368             }
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'
30373                 adobe = {
30374                   version: appData[6],
30375                   flags0: (appData[7] << 8) | appData[8],
30376                   flags1: (appData[9] << 8) | appData[10],
30377                   transformCode: appData[11]
30378                 };
30379               }
30380             }
30381             break;
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++];
30392                 }
30393               } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
30394                 for (j = 0; j < 64; j++) {
30395                   var z = dctZigZag[j];
30396                   tableData[z] = readUint16();
30397                 }
30398               } else
30399                 throw "DQT: invalid table spec";
30400               quantizationTables[quantizationTableSpec & 15] = tableData;
30401             }
30402             break;
30404           case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
30405           case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
30406             readUint16(); // skip data length
30407             frame = {};
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] = {
30423                 h: h,
30424                 v: v,
30425                 quantizationTable: quantizationTables[qId]
30426               };
30427               offset += 3;
30428             }
30429             prepareComponents(frame);
30430             frames.push(frame);
30431             break;
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);
30449             }
30450             break;
30452           case 0xFFDD: // DRI (Define Restart Interval)
30453             readUint16(); // skip data length
30454             resetInterval = readUint16();
30455             break;
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);
30467             }
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;
30476             break;
30477           default:
30478             throw "unknown JPEG marker " + fileMarker.toString(16);
30479         }
30480         fileMarker = readUint16();
30481       }
30482       if (frames.length != 1)
30483         throw "only single frame JPEGs supported";
30485       this.width = frame.samplesPerLine;
30486       this.height = frame.scanLines;
30487       this.jfif = jfif;
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
30496         });
30497       }
30498     },
30499     getData: function getData(width, height) {
30500       function clampTo8bit(a) {
30501         return a < 0 ? 0 : a > 255 ? 255 : a;
30502       }
30503       var scaleX = this.width / width, scaleY = this.height / height;
30505       var component1, component2, component3, component4;
30506       var component1Line, component2Line, component3Line, component4Line;
30507       var x, y;
30508       var offset = 0;
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) {
30514         case 1:
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;
30522             }
30523           }
30524           break;
30525         case 3:
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)];
30546               } else {
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));
30554               }
30556               data[offset++] = R;
30557               data[offset++] = G;
30558               data[offset++] = B;
30559             }
30560           }
30561           break;
30562         case 4:
30563           if (!this.adobe)
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)];
30588               } else {
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));
30597               }
30598               data[offset++] = C;
30599               data[offset++] = M;
30600               data[offset++] = Ye;
30601               data[offset++] = K;
30602             }
30603           }
30604           break;
30605         default:
30606           throw 'Unsupported color mode';
30607       }
30608       return data;
30609     },
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) {
30617         case 1:
30618           for (y = 0; y < height; y++) {
30619             for (x = 0; x < width; x++) {
30620               Y = data[i++];
30622               imageDataArray[j++] = Y;
30623               imageDataArray[j++] = Y;
30624               imageDataArray[j++] = Y;
30625               imageDataArray[j++] = 255;
30626             }
30627           }
30628           break;
30629         case 3:
30630           for (y = 0; y < height; y++) {
30631             for (x = 0; x < width; x++) {
30632               R = data[i++];
30633               G = data[i++];
30634               B = data[i++];
30636               imageDataArray[j++] = R;
30637               imageDataArray[j++] = G;
30638               imageDataArray[j++] = B;
30639               imageDataArray[j++] = 255;
30640             }
30641           }
30642           break;
30643         case 4:
30644           for (y = 0; y < height; y++) {
30645             for (x = 0; x < width; x++) {
30646               C = data[i++];
30647               M = data[i++];
30648               Y = data[i++];
30649               K = data[i++];
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;
30659             }
30660           }
30661           break;
30662         default:
30663           throw 'Unsupported color mode';
30664       }
30665     }
30666   };
30668   return constructor;
30669 })();
30670 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
30671 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
30673 'use strict';
30675 var JpxImage = (function JpxImageClosure() {
30676   // Table E.1
30677   var SubbandsGainLog2 = {
30678     'LL': 0,
30679     'LH': 1,
30680     'HL': 1,
30681     'HH': 2
30682   };
30683   function JpxImage() {
30684     this.failOnCorruptedImage = false;
30685   }
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);
30694         this.parse(data);
30695         if (this.onload)
30696           this.onload();
30697       }).bind(this);
30698       xhr.send(null);
30699     },
30700     parse: function JpxImage_parse(data) {
30701       function ReadUint(data, offset, bytes) {
30702         var n = 0;
30703         for (var i = 0; i < bytes; i++)
30704           n = n * 256 + (data[offset + i] & 0xFF);
30705         return n;
30706       }
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;
30713         if (lbox == 1) {
30714           lbox = ReadUint(data, position, 8);
30715           position += 8;
30716           headerSize += 8;
30717         }
30718         if (lbox == 0)
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;
30724         switch (tbox) {
30725           case 0x6A501A1A: // 'jP\032\032'
30726             // TODO
30727             break;
30728           case 0x6A703268: // 'jp2h'
30729             jumpDataLength = false; // parsing child boxes
30730             break;
30731           case 0x636F6C72: // 'colr'
30732             // TODO
30733             break;
30734           case 0x6A703263: // 'jp2c'
30735             this.parseCodestream(data, position, position + dataLength);
30736             break;
30737         }
30738         if (jumpDataLength)
30739           position += dataLength;
30740       }
30741     },
30742     parseCodestream: function JpxImage_parseCodestream(data, start, end) {
30743       var context = {};
30744       try {
30745         var position = start;
30746         while (position < end) {
30747           var code = readUint16(data, position);
30748           position += 2;
30750           var length = 0, j;
30751           switch (code) {
30752             case 0xFF4F: // Start of codestream (SOC)
30753               context.mainHeader = true;
30754               break;
30755             case 0xFFD9: // End of codestream (EOC)
30756               break;
30757             case 0xFF51: // Image and tile size (SIZ)
30758               length = readUint16(data, position);
30759               var siz = {};
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 = [];
30771               j = position + 38;
30772               for (var i = 0; i < componentsCount; i++) {
30773                 var component = {
30774                   precision: (data[j] & 0x7F) + 1,
30775                   isSigned: !!(data[j] & 0x80),
30776                   XRsiz: data[j + 1],
30777                   YRsiz: data[j + 1]
30778                 };
30779                 calculateComponentDimensions(component, siz);
30780                 components.push(component);
30781               }
30782               context.SIZ = siz;
30783               context.components = components;
30784               calculateTileGrids(context, components);
30785               context.QCC = [];
30786               context.COC = [];
30787               break;
30788             case 0xFF5C: // Quantization default (QCD)
30789               length = readUint16(data, position);
30790               var qcd = {};
30791               j = position + 2;
30792               var sqcd = data[j++];
30793               var spqcdSize, scalarExpounded;
30794               switch (sqcd & 0x1F) {
30795                 case 0:
30796                   spqcdSize = 8;
30797                   scalarExpounded = true;
30798                   break;
30799                 case 1:
30800                   spqcdSize = 16;
30801                   scalarExpounded = false;
30802                   break;
30803                 case 2:
30804                   spqcdSize = 16;
30805                   scalarExpounded = true;
30806                   break;
30807                 default:
30808                   throw 'Invalid SQcd value ' + sqcd;
30809               }
30810               qcd.noQuantization = spqcdSize == 8;
30811               qcd.scalarExpounded = scalarExpounded;
30812               qcd.guardBits = sqcd >> 5;
30813               var spqcds = [];
30814               while (j < length + position) {
30815                 var spqcd = {};
30816                 if (spqcdSize == 8) {
30817                   spqcd.epsilon = data[j++] >> 3;
30818                   spqcd.mu = 0;
30819                 } else {
30820                   spqcd.epsilon = data[j] >> 3;
30821                   spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
30822                   j += 2;
30823                 }
30824                 spqcds.push(spqcd);
30825               }
30826               qcd.SPqcds = spqcds;
30827               if (context.mainHeader)
30828                 context.QCD = qcd;
30829               else {
30830                 context.currentTile.QCD = qcd;
30831                 context.currentTile.QCC = [];
30832               }
30833               break;
30834             case 0xFF5D: // Quantization component (QCC)
30835               length = readUint16(data, position);
30836               var qcc = {};
30837               j = position + 2;
30838               var cqcc;
30839               if (context.SIZ.Csiz < 257)
30840                 cqcc = data[j++];
30841               else {
30842                 cqcc = readUint16(data, j);
30843                 j += 2;
30844               }
30845               var sqcd = data[j++];
30846               var spqcdSize, scalarExpounded;
30847               switch (sqcd & 0x1F) {
30848                 case 0:
30849                   spqcdSize = 8;
30850                   scalarExpounded = true;
30851                   break;
30852                 case 1:
30853                   spqcdSize = 16;
30854                   scalarExpounded = false;
30855                   break;
30856                 case 2:
30857                   spqcdSize = 16;
30858                   scalarExpounded = true;
30859                   break;
30860                 default:
30861                   throw 'Invalid SQcd value ' + sqcd;
30862               }
30863               qcc.noQuantization = spqcdSize == 8;
30864               qcc.scalarExpounded = scalarExpounded;
30865               qcc.guardBits = sqcd >> 5;
30866               var spqcds = [];
30867               while (j < length + position) {
30868                 var spqcd = {};
30869                 if (spqcdSize == 8) {
30870                   spqcd.epsilon = data[j++] >> 3;
30871                   spqcd.mu = 0;
30872                 } else {
30873                   spqcd.epsilon = data[j] >> 3;
30874                   spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
30875                   j += 2;
30876                 }
30877                 spqcds.push(spqcd);
30878               }
30879               qcc.SPqcds = spqcds;
30880               if (context.mainHeader)
30881                 context.QCC[cqcc] = qcc;
30882               else
30883                 context.currentTile.QCC[cqcc] = qcc;
30884               break;
30885             case 0xFF52: // Coding style default (COD)
30886               length = readUint16(data, position);
30887               var cod = {};
30888               j = position + 2;
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);
30896               j += 2;
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
30917                   });
30918                 }
30919                 cod.precinctsSizes = precinctsSizes;
30920               }
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)
30931                 context.COD = cod;
30932               else {
30933                 context.currentTile.COD = cod;
30934                 context.currentTile.COC = [];
30935               }
30936               break;
30937             case 0xFF90: // Start of tile-part (SOT)
30938               length = readUint16(data, position);
30939               var tile = {};
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
30953               }
30954               context.currentTile = tile;
30955               break;
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);
30961               }
30963               // moving to the end of the data
30964               length = tile.dataEnd - position;
30966               parseTilePackets(context, data, position, length);
30967               break;
30968             case 0xFF64: // Comment (COM)
30969               length = readUint16(data, position);
30970               // skipping content
30971               break;
30972             default:
30973               throw 'Unknown codestream code: ' + code.toString(16);
30974           }
30975           position += length;
30976         }
30977       } catch (e) {
30978         if (this.failOnCorruptedImage)
30979           error('JPX error: ' + e);
30980         else
30981           warn('JPX error: ' + e + '. Trying to recover');
30982       }
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;
30987     }
30988   };
30989   function readUint32(data, offset) {
30990     return (data[offset] << 24) | (data[offset + 1] << 16) |
30991       (data[offset + 2] << 8) | data[offset + 3];
30992   }
30993   function readUint16(data, offset) {
30994     return (data[offset] << 8) | data[offset + 1];
30995   }
30996   function log2(x) {
30997     var n = 1, i = 0;
30998     while (x > n) {
30999       n <<= 1;
31000       i++;
31001     }
31002     return i;
31003   }
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;
31012   }
31013   function calculateTileGrids(context, components) {
31014     var siz = context.SIZ;
31015     // Section B.3 Division into tile and tile-components
31016     var tiles = [];
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++) {
31021         var tile = {};
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 = [];
31029         tiles.push(tile);
31030       }
31031     }
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;
31047       }
31048     }
31049   }
31050   function getBlocksDimensions(context, component, r) {
31051     var codOrCoc = component.codingStyleParameters;
31052     var result = {};
31053     if (!codOrCoc.entropyCoderWithCustomPrecincts) {
31054       result.PPx = 15;
31055       result.PPy = 15;
31056     } else {
31057       result.PPx = codOrCoc.precinctsSizes[r].PPx;
31058       result.PPy = codOrCoc.precinctsSizes[r].PPy;
31059     }
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);
31065     return result;
31066   }
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) *
31079       precinctWidth;
31080     var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
31081       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
31090     };
31091   }
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++) {
31107         var codeblock = {
31108           cbx: i,
31109           cby: j,
31110           tbx0: codeblockWidth * i,
31111           tby0: codeblockHeight * j,
31112           tbx1: codeblockWidth * (i + 1),
31113           tby1: codeblockHeight * (j + 1)
31114         };
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
31135         var precinct;
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);
31142         } else {
31143           precincts[precinctNumber] = precinct = {
31144             cbxMin: i,
31145             cbyMin: j,
31146             cbxMax: i,
31147             cbyMax: j
31148           };
31149         }
31150         codeblock.precinct = precinct;
31151       }
31152     }
31153     subband.codeblockParameters = {
31154       codeblockWidth: xcb_,
31155       codeblockHeight: ycb_,
31156       numcodeblockwide: cbx1 - cbx0 + 1,
31157       numcodeblockhigh: cby1 - cby1 + 1
31158     };
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;
31163     }
31164     subband.precincts = precincts;
31165   }
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)
31177           continue;
31178         precinctCodeblocks.push(codeblock);
31179       }
31180     }
31181     return {
31182       layerNumber: layerNumber,
31183       codeblocks: precinctCodeblocks
31184     };
31185   }
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);
31196     }
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)
31207               continue;
31209             var resolution = component.resolutions[r];
31210             var numprecincts = resolution.precinctParameters.numprecincts;
31211             for (; k < numprecincts;) {
31212               var packet = createPacket(resolution, k, l);
31213               k++;
31214               return packet;
31215             }
31216             k = 0;
31217           }
31218           i = 0;
31219         }
31220         r = 0;
31221       }
31222       throw 'Out of packets';
31223     };
31224   }
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);
31235     }
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)
31246               continue;
31248             var resolution = component.resolutions[r];
31249             var numprecincts = resolution.precinctParameters.numprecincts;
31250             for (; k < numprecincts;) {
31251               var packet = createPacket(resolution, k, l);
31252               k++;
31253               return packet;
31254             }
31255             k = 0;
31256           }
31257           i = 0;
31258         }
31259         l = 0;
31260       }
31261       throw 'Out of packets';
31262     };
31263   }
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 = [];
31276       var subbands = [];
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);
31288         var subband;
31289         if (r == 0) {
31290           // one sub-band (LL) with last decomposition
31291           subband = {};
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];
31301         } else {
31302           var bscale = 1 << (decompositionLevelsCount - r + 1);
31303           var resolutionSubbands = [];
31304           // three sub-bands (HL, LH and HH) with rest of decompositions
31305           subband = {};
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);
31316           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);
31327           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;
31339         }
31340       }
31341       component.resolutions = resolutions;
31342       component.subbands = subbands;
31343     }
31344     // Generate the packets sequence
31345     var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
31346     var packetsIterator;
31347     switch (progressionOrder) {
31348       case 0:
31349         tile.packetsIterator =
31350           new LayerResolutionComponentPositionIterator(context);
31351         break;
31352       case 1:
31353         tile.packetsIterator =
31354           new ResolutionLayerComponentPositionIterator(context);
31355         break;
31356       default:
31357         throw 'Unsupported progression order ' + progressionOrder;
31358     }
31359   }
31360   function parseTilePackets(context, data, offset, dataLength) {
31361     var position = 0;
31362     var buffer, bufferSize = 0, skipNextBit = false;
31363     function readBits(count) {
31364       while (bufferSize < count) {
31365         var b = data[offset + position];
31366         position++;
31367         if (skipNextBit) {
31368           buffer = (buffer << 7) | b;
31369           bufferSize += 7;
31370           skipNextBit = false;
31371         } else {
31372           buffer = (buffer << 8) | b;
31373           bufferSize += 8;
31374         }
31375         if (b == 0xFF) {
31376           skipNextBit = true;
31377         }
31378       }
31379       bufferSize -= count;
31380       return (buffer >>> bufferSize) & ((1 << count) - 1);
31381     }
31382     function alignToByte() {
31383       bufferSize = 0;
31384       if (skipNextBit) {
31385         position++;
31386         skipNextBit = false;
31387       }
31388     }
31389     function readCodingpasses() {
31390       var value = readBits(1);
31391       if (value == 0)
31392         return 1;
31393       value = (value << 1) | readBits(1);
31394       if (value == 0x02)
31395         return 2;
31396       value = (value << 2) | readBits(2);
31397       if (value <= 0x0E)
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;
31404     }
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)) {
31411         alignToByte();
31412         continue;
31413       }
31414       var layerNumber = packet.layerNumber;
31415       var queue = [];
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);
31425         } else {
31426           // reading inclusion tree
31427           var precinct = codeblock.precinct;
31428           var inclusionTree, zeroBitPlanesTree;
31429           if ('inclusionTree' in precinct) {
31430             inclusionTree = precinct.inclusionTree;
31431           } else {
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;
31439           }
31441           if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
31442             while (true) {
31443               if (readBits(1)) {
31444                 var valueReady = !inclusionTree.nextLevel();
31445                 if (valueReady) {
31446                   codeblock.included = true;
31447                   codeblockIncluded = firstTimeInclusion = true;
31448                   break;
31449                 }
31450               } else {
31451                 inclusionTree.incrementValue(layerNumber);
31452                 break;
31453               }
31454             }
31455           }
31456         }
31457         if (!codeblockIncluded)
31458           continue;
31459         if (firstTimeInclusion) {
31460           zeroBitPlanesTree = precinct.zeroBitPlanesTree;
31461           zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
31462           while (true) {
31463             if (readBits(1)) {
31464               var valueReady = !zeroBitPlanesTree.nextLevel();
31465               if (valueReady)
31466                 break;
31467             } else
31468               zeroBitPlanesTree.incrementValue();
31469           }
31470           codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
31471         }
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);
31480         queue.push({
31481           codeblock: codeblock,
31482           codingpasses: codingpasses,
31483           dataLength: codedDataLength
31484         });
31485       }
31486       alignToByte();
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({
31493           data: data,
31494           start: offset + position,
31495           end: offset + position + packetItem.dataLength,
31496           codingpasses: packetItem.codingpasses
31497         });
31498         position += packetItem.dataLength;
31499       }
31500     }
31501     return position;
31502   }
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)
31511         continue;
31512       if (!('data' in codeblock))
31513         continue;
31515       var bitModel, currentCodingpassType;
31516       bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
31517         codeblock.zeroBitPlanes);
31518       currentCodingpassType = 2; // first bit plane starts from cleanup
31520       // collect data
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;
31526       }
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);
31532         k += chunk.length;
31533       }
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) {
31540           case 0:
31541             bitModel.runSignificancePropogationPass();
31542             break;
31543           case 1:
31544             bitModel.runMagnitudeRefinementPass();
31545             break;
31546           case 2:
31547             bitModel.runCleanupPass();
31548             break;
31549         }
31550         currentCodingpassType = (currentCodingpassType + 1) % 3;
31551       }
31553       var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
31554       var position = 0;
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);
31565           } else
31566             correction = 1;
31567           coefficients[offset++] = n * correction * delta;
31568           position++;
31569         }
31570         offset += width - blockWidth;
31571       }
31572     }
31573   }
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 = [];
31587     var k = 0, b = 0;
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++) {
31592         var mu, epsilon;
31593         if (!scalarExpounded) {
31594           // formula E-5
31595           mu = spqcds[0].mu;
31596           epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
31597         } else {
31598           mu = spqcds[b].mu;
31599           epsilon = spqcds[b].epsilon;
31600         }
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) *
31609           (1 + mu / 2048);
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({
31617           width: width,
31618           height: height,
31619           items: coefficients
31620         });
31622         b++;
31623       }
31624     }
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);
31631     return {
31632       left: component.tcx0,
31633       top: component.tcy0,
31634       width: result.width,
31635       height: result.height,
31636       items: result.items
31637     };
31638   }
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];
31646       var result = [];
31647       for (var c = 0; c < componentsCount; c++) {
31648         var image = transformTile(context, tile, c);
31649         result.push(image);
31650       }
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);
31660           y1items[j] = i1;
31661           y0items[j] = y2 + i1;
31662           y2items[j] = y1 + i1;
31663         }
31664       }
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)
31670           continue;
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;
31677       }
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;
31690         }
31691         result[c].items = data;
31692       }
31694       resultImages.push(result);
31695     }
31696     return resultImages;
31697   }
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;
31711     }
31712     tile.codingStyleDefaultParameters = context.currentTile.COD;
31713   }
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;
31719       this.levels = [];
31720       for (var i = 0; i < levelsLength; i++) {
31721         var level = {
31722           width: width,
31723           height: height,
31724           items: []
31725         };
31726         this.levels.push(level);
31727         width = Math.ceil(width / 2);
31728         height = Math.ceil(height / 2);
31729       }
31730     }
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];
31739             break;
31740           }
31741           level.index = index;
31742           i >>= 1;
31743           j >>= 1;
31744           currentLevel++;
31745         }
31746         currentLevel--;
31747         var level = this.levels[currentLevel];
31748         level.items[level.index] = value;
31749         this.currentLevel = currentLevel;
31750         delete this.value;
31751       },
31752       incrementValue: function TagTree_incrementValue() {
31753         var level = this.levels[this.currentLevel];
31754         level.items[level.index]++;
31755       },
31756       nextLevel: function TagTree_nextLevel() {
31757         var currentLevel = this.currentLevel;
31758         var level = this.levels[currentLevel];
31759         var value = level.items[level.index];
31760         currentLevel--;
31761         if (currentLevel < 0) {
31762           this.value = value;
31763           return false;
31764         }
31766         this.currentLevel = currentLevel;
31767         var level = this.levels[currentLevel];
31768         level.items[level.index] = value;
31769         return true;
31770       }
31771     };
31772     return TagTree;
31773   })();
31775   var InclusionTree = (function InclusionTreeClosure() {
31776     function InclusionTree(width, height,  defaultValue) {
31777       var levelsLength = log2(Math.max(width, height)) + 1;
31778       this.levels = [];
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;
31784         var level = {
31785           width: width,
31786           height: height,
31787           items: items
31788         };
31789         this.levels.push(level);
31791         width = Math.ceil(width / 2);
31792         height = Math.ceil(height / 2);
31793       }
31794     }
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];
31804           if (value == 0xFF)
31805             break;
31807           if (value > stopValue) {
31808             this.currentLevel = currentLevel;
31809             // already know about this one, propagating the value to top levels
31810             this.propagateValues();
31811             return false;
31812           }
31814           i >>= 1;
31815           j >>= 1;
31816           currentLevel++;
31817         }
31818         this.currentLevel = currentLevel - 1;
31819         return true;
31820       },
31821       incrementValue: function InclusionTree_incrementValue(stopValue) {
31822         var level = this.levels[this.currentLevel];
31823         level.items[level.index] = stopValue + 1;
31824         this.propagateValues();
31825       },
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;
31833         }
31834       },
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;
31840         currentLevel--;
31841         if (currentLevel < 0)
31842           return false;
31844         this.currentLevel = currentLevel;
31845         var level = this.levels[currentLevel];
31846         level.items[level.index] = value;
31847         return true;
31848       }
31849     };
31850     return InclusionTree;
31851   })();
31853   // Implements C.3. Arithmetic decoding procedures
31854   var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
31855     var QeTable = [
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}
31903     ];
31905     function ArithmeticDecoder(data, start, end) {
31906       this.data = data;
31907       this.bp = start;
31908       this.dataEnd = end;
31910       this.chigh = data[start];
31911       this.clow = 0;
31913       this.byteIn();
31915       this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
31916       this.clow = (this.clow << 7) & 0xFFFF;
31917       this.ct -= 7;
31918       this.a = 0x8000;
31919     }
31921     ArithmeticDecoder.prototype = {
31922       byteIn: function ArithmeticDecoder_byteIn() {
31923         var data = this.data;
31924         var bp = this.bp;
31925         if (data[bp] == 0xFF) {
31926           var b1 = data[bp + 1];
31927           if (b1 > 0x8F) {
31928             this.clow += 0xFF00;
31929             this.ct = 8;
31930           } else {
31931             bp++;
31932             this.clow += (data[bp] << 9);
31933             this.ct = 7;
31934             this.bp = bp;
31935           }
31936         } else {
31937           bp++;
31938           this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
31939           this.ct = 8;
31940           this.bp = bp;
31941         }
31942         if (this.clow > 0xFFFF) {
31943           this.chigh += (this.clow >> 16);
31944           this.clow &= 0xFFFF;
31945         }
31946       },
31947       readBit: function ArithmeticDecoder_readBit(cx) {
31948         var qeIcx = QeTable[cx.index].qe;
31949         this.a -= qeIcx;
31951         if (this.chigh < qeIcx) {
31952           var d = this.exchangeLps(cx);
31953           this.renormD();
31954           return d;
31955         } else {
31956           this.chigh -= qeIcx;
31957           if ((this.a & 0x8000) == 0) {
31958             var d = this.exchangeMps(cx);
31959             this.renormD();
31960             return d;
31961           } else {
31962             return cx.mps;
31963           }
31964         }
31965       },
31966       renormD: function ArithmeticDecoder_renormD() {
31967         do {
31968           if (this.ct == 0)
31969             this.byteIn();
31971           this.a <<= 1;
31972           this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
31973           this.clow = (this.clow << 1) & 0xFFFF;
31974           this.ct--;
31975         } while ((this.a & 0x8000) == 0);
31976       },
31977       exchangeMps: function ArithmeticDecoder_exchangeMps(cx) {
31978         var d;
31979         var qeTableIcx = QeTable[cx.index];
31980         if (this.a < qeTableIcx.qe) {
31981           d = 1 - cx.mps;
31983           if (qeTableIcx.switchFlag == 1) {
31984             cx.mps = 1 - cx.mps;
31985           }
31986           cx.index = qeTableIcx.nlps;
31987         } else {
31988           d = cx.mps;
31989           cx.index = qeTableIcx.nmps;
31990         }
31991         return d;
31992       },
31993       exchangeLps: function ArithmeticDecoder_exchangeLps(cx) {
31994         var d;
31995         var qeTableIcx = QeTable[cx.index];
31996         if (this.a < qeTableIcx.qe) {
31997           this.a = qeTableIcx.qe;
31998           d = cx.mps;
31999           cx.index = qeTableIcx.nmps;
32000         } else {
32001           this.a = qeTableIcx.qe;
32002           d = 1 - cx.mps;
32004           if (qeTableIcx.switchFlag == 1) {
32005             cx.mps = 1 - cx.mps;
32006           }
32007           cx.index = qeTableIcx.nlps;
32008         }
32009         return d;
32010       }
32011     };
32013     return ArithmeticDecoder;
32014   })();
32016   // Section D. Coefficient bit modeling
32017   var BitModel = (function BitModelClosure() {
32018     // Table D-1
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
32025     ]);
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
32030     ]);
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
32035     ]);
32037     // Table D-2
32038     function calcSignContribution(significance0, sign0, significance1, sign1) {
32039       if (significance1) {
32040         if (!sign1)
32041           return significance0 ? (!sign0 ? 1 : 0) : 1;
32042         else
32043           return significance0 ? (!sign0 ? 0 : -1) : -1;
32044       } else
32045         return significance0 ? (!sign0 ? 1 : -1) : 0;
32046     }
32047     // Table D-3
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}
32058     ];
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;
32081       this.reset();
32082     }
32084     BitModel.prototype = {
32085       setDecoder: function BitModel_setDecoder(decoder) {
32086         this.decoder = decoder;
32087       },
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});
32095       },
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;
32101         if (row > 0) {
32102           if (column > 0)
32103             neighborsSignificance[index - width - 1] += 0x10;
32104           if (column + 1 < width)
32105             neighborsSignificance[index - width + 1] += 0x10;
32106           neighborsSignificance[index - width] += 0x04;
32107         }
32108         if (row + 1 < height) {
32109           if (column > 0)
32110             neighborsSignificance[index + width - 1] += 0x10;
32111           if (column + 1 < width)
32112             neighborsSignificance[index + width + 1] += 0x10;
32113           neighborsSignificance[index + width] += 0x04;
32114         }
32115         if (column > 0)
32116           neighborsSignificance[index - 1] += 0x01;
32117         if (column + 1 < width)
32118           neighborsSignificance[index + 1] += 0x01;
32119         neighborsSignificance[index] |= 0x80;
32120       },
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) {
32144               var i = i0 + i1;
32145               if (i >= height)
32146                 break;
32148               if (coefficentsMagnitude[index] || !neighborsSignificance[index])
32149                 continue;
32151               var contextLabel = labels[neighborsSignificance[index]];
32152               var cx = contexts[contextLabel];
32153               var decision = decoder.readBit(cx);
32154               if (decision) {
32155                 var sign = this.decodeSignBit(i, j);
32156                 coefficentsSign[index] = sign;
32157                 coefficentsMagnitude[index] = 1;
32158                 this.setNeighborsSignificance(i, j);
32159                 processingFlags[index] |= firstMagnitudeBitMask;
32160               }
32161               bitsDecoded[index]++;
32162               processingFlags[index] |= processedMask;
32163             }
32164           }
32165         }
32166       },
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;
32189       },
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++) {
32204               var i = i0 + i1;
32205               if (i >= height)
32206                 break;
32207               var index = i * width + j;
32209               // significant but not those that have just become
32210               if (!coefficentsMagnitude[index] ||
32211                 (processingFlags[index] & processedMask) != 0)
32212                 continue;
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;
32223               }
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;
32231             }
32232           }
32233         }
32234       },
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;
32266             var cx, i;
32267             if (allEmpty) {
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
32276               }
32277               cx = this.uniformContext;
32278               i1 = (decoder.readBit(cx) << 1) | decoder.readBit(cx);
32279               i = i0 + i1;
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;
32288               index = index0;
32289               for (var i2 = i0; i2 <= i; i2++, index += width)
32290                 bitsDecoded[index]++;
32292               i1++;
32293             }
32294             for (; i1 < 4; i1++, index += width) {
32295               i = i0 + i1;
32296               if (i >= height)
32297                 break;
32299               if (coefficentsMagnitude[index] ||
32300                 (processingFlags[index] & processedMask) != 0)
32301                 continue;
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;
32312               }
32313               bitsDecoded[index]++;
32314             }
32315           }
32316         }
32317       }
32318     };
32320     return BitModel;
32321   })();
32323   // Section F, Discrete wavelet transofrmation
32324   var Transform = (function TransformClosure() {
32325     function Transform() {
32326     }
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);
32333       }
32334       return ll;
32335     };
32336     Transform.prototype.iterate = function Transform_iterate(ll, hl, lh, hh,
32337                                                             u0, v0) {
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];
32351       }
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];
32356       }
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];
32361       }
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];
32366       }
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++) {
32376         if (width == 1) {
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;
32380           }
32381           continue;
32382         }
32384         var k = v * width;
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);
32403         k = v * width;
32404         l = bufferPadding;
32405         for (var u = 0; u < width; u++, k++, l++)
32406           items[k] = bufferOut[l];
32407       }
32409       // Section F.3.5 VER_SR
32410       for (var u = 0; u < width; u++) {
32411         if (height == 1) {
32412           // if height = 1, when v0 even keep items as is, when odd divide by 2
32413           if ((v0 % 1) != 0) {
32414             items[u] /= 2;
32415           }
32416           continue;
32417         }
32419         var k = u;
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);
32438         k = u;
32439         l = bufferPadding;
32440         for (var v = 0; v < height; v++, k += width, l++)
32441           items[k] = bufferOut[l];
32442       }
32443       return {
32444         width: width,
32445         height: height,
32446         items: items
32447       };
32448     };
32449     return Transform;
32450   })();
32452   // Section 3.8.2 Irreversible 9-7 filter
32453   var IrreversibleTransform = (function IrreversibleTransformClosure() {
32454     function IrreversibleTransform() {
32455       Transform.call(this);
32456     }
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;
32470       var K_ = 1 / K;
32472       // step 1
32473       var j = offset_ - 2;
32474       for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2)
32475         x[j] = K * y[j];
32477       // step 2
32478       var j = offset_ - 3;
32479       for (var n = i0_ - 2, nn = i1_ + 2; n < nn; n++, j += 2)
32480         x[j] = K_ * y[j];
32482       // step 3
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]);
32487       // step 4
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]);
32492       // step 5
32493       var j = offset_;
32494       for (var n = i0_, nn = i1_ + 1; n < nn; n++, j += 2)
32495         x[j] -= beta * (x[j - 1] + x[j + 1]);
32497       // step 6
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]);
32501     };
32503     return IrreversibleTransform;
32504   })();
32506   // Section 3.8.1 Reversible 5-3 filter
32507   var ReversibleTransform = (function ReversibleTransformClosure() {
32508     function ReversibleTransform() {
32509       Transform.call(this);
32510     }
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);
32524     };
32526     return ReversibleTransform;
32527   })();
32529   return JpxImage;
32530 })();
32533 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
32534 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
32536 'use strict';
32538 var bidi = PDFJS.bidi = (function bidiClosure() {
32539   // Character types for symbols from 0000 to 00FF.
32540   var baseTypes = [
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'
32560   ];
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'
32586   ];
32588   function isOdd(i) {
32589     return (i & 1) != 0;
32590   }
32592   function isEven(i) {
32593     return (i & 1) == 0;
32594   }
32596   function findUnequal(arr, start, value) {
32597     var j;
32598     for (var j = start, jj = arr.length; j < jj; ++j) {
32599       if (arr[j] != value)
32600         return j;
32601     }
32602     return j;
32603   }
32605   function setValues(arr, start, end, value) {
32606     for (var j = start; j < end; ++j) {
32607       arr[j] = value;
32608     }
32609   }
32611   function reverseValues(arr, start, end) {
32612     for (var i = start, j = end - 1; i < j; ++i, --j) {
32613       var temp = arr[i];
32614       arr[i] = arr[j];
32615       arr[j] = temp;
32616     }
32617   }
32619   function mirrorGlyphs(c) {
32620     /*
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
32632      */
32633     switch (c) {
32634       case '(':
32635         return ')';
32636       case ')':
32637         return '(';
32638       case '<':
32639         return '>';
32640       case '>':
32641         return '<';
32642       case ']':
32643         return '[';
32644       case '[':
32645         return ']';
32646       case '}':
32647         return '{';
32648       case '{':
32649         return '}';
32650       case '\u00AB':
32651         return '\u00BB';
32652       case '\u00BB':
32653         return '\u00AB';
32654       default:
32655         return c;
32656     }
32657   }
32659   function bidi(text, startLevel) {
32660     var str = text.str;
32661     var strLength = str.length;
32662     if (strLength == 0)
32663       return str;
32665     // get types, fill arrays
32667     var chars = [];
32668     var types = [];
32669     var oldtypes = [];
32670     var numBidi = 0;
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)
32680         charType = 'R';
32681       else if (0x0600 <= charCode && charCode <= 0x06ff)
32682         charType = arabicTypes[charCode & 0xff];
32683       else if (0x0700 <= charCode && charCode <= 0x08AC)
32684         charType = 'AL';
32686       if (charType == 'R' || charType == 'AL' || charType == 'AN')
32687         numBidi++;
32689       oldtypes[i] = types[i] = charType;
32690     }
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';
32698       return str;
32699     }
32701     if (startLevel == -1) {
32702       if ((strLength / numBidi) < 0.3) {
32703         text.direction = 'ltr';
32704         startLevel = 0;
32705       } else {
32706         text.direction = 'rtl';
32707         startLevel = 1;
32708       }
32709     }
32711     var levels = [];
32713     for (var i = 0; i < strLength; ++i) {
32714       levels[i] = startLevel;
32715     }
32717     /*
32718      X1-X10: skip most of this, since we are NOT doing the embeddings.
32719      */
32721     var e = isOdd(startLevel) ? 'R' : 'L';
32722     var sor = e;
32723     var eor = sor;
32725     /*
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.
32729      */
32731     var lastType = sor;
32732     for (var i = 0; i < strLength; ++i) {
32733       if (types[i] == 'NSM')
32734         types[i] = lastType;
32735       else
32736         lastType = types[i];
32737     }
32739     /*
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.
32743      */
32745     var lastType = sor;
32746     for (var i = 0; i < strLength; ++i) {
32747       var t = types[i];
32748       if (t == 'EN')
32749         types[i] = (lastType == 'AL') ? 'AN' : 'EN';
32750       else if (t == 'R' || t == 'L' || t == 'AL')
32751         lastType = t;
32752     }
32754     /*
32755      W3. Change all ALs to R.
32756      */
32758     for (var i = 0; i < strLength; ++i) {
32759       var t = types[i];
32760       if (t == 'AL')
32761         types[i] = 'R';
32762     }
32764     /*
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:
32768      */
32770     for (var i = 1; i < strLength - 1; ++i) {
32771       if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN')
32772         types[i] = '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];
32776     }
32778     /*
32779      W5. A sequence of European terminators adjacent to European numbers changes
32780      to all European numbers:
32781      */
32783     for (var i = 0; i < strLength; ++i) {
32784       if (types[i] == 'EN') {
32785         // do before
32786         for (var j = i - 1; j >= 0; --j) {
32787           if (types[j] != 'ET')
32788             break;
32789           types[j] = 'EN';
32790         }
32791         // do after
32792         for (var j = i + 1; j < strLength; --j) {
32793           if (types[j] != 'ET')
32794             break;
32795           types[j] = 'EN';
32796         }
32797       }
32798     }
32800     /*
32801      W6. Otherwise, separators and terminators change to Other Neutral:
32802      */
32804     for (var i = 0; i < strLength; ++i) {
32805       var t = types[i];
32806       if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS')
32807         types[i] = 'ON';
32808     }
32810     /*
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.
32814      */
32816     var lastType = sor;
32817     for (var i = 0; i < strLength; ++i) {
32818       var t = types[i];
32819       if (t == 'EN')
32820         types[i] = (lastType == 'L') ? 'L' : 'EN';
32821       else if (t == 'R' || t == 'L')
32822         lastType = t;
32823     }
32825     /*
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.
32830      */
32832     for (var i = 0; i < strLength; ++i) {
32833       if (types[i] == 'ON') {
32834         var end = findUnequal(types, i + 1, 'ON');
32835         var before = sor;
32836         if (i > 0)
32837           before = types[i - 1];
32838         var after = eor;
32839         if (end + 1 < strLength)
32840           after = types[end + 1];
32841         if (before != 'L')
32842           before = 'R';
32843         if (after != 'L')
32844           after = 'R';
32845         if (before == after)
32846           setValues(types, i, end, before);
32847         i = end - 1; // reset to end (-1 so next iteration is ok)
32848       }
32849     }
32851     /*
32852      N2. Any remaining neutrals take the embedding direction.
32853      */
32855     for (var i = 0; i < strLength; ++i) {
32856       if (types[i] == 'ON')
32857         types[i] = e;
32858     }
32860     /*
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
32863      levels.
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.
32866      */
32868     for (var i = 0; i < strLength; ++i) {
32869       var t = types[i];
32870       if (isEven(levels[i])) {
32871         if (t == 'R') {
32872           levels[i] += 1;
32873         } else if (t == 'AN' || t == 'EN') {
32874           levels[i] += 2;
32875         }
32876       } else { // isOdd, so
32877         if (t == 'L' || t == 'AN' || t == 'EN') {
32878           levels[i] += 1;
32879         }
32880       }
32881     }
32883     /*
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
32891      of the line.
32892      */
32894     // don't bother as text is only single line
32896     /*
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
32899      level or higher.
32900      */
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;
32912     }
32914     // now reverse between those limits
32916     for (var level = highestLevel; level >= lowestOddLevel; --level) {
32917       // find segments to reverse
32918       var start = -1;
32919       for (var i = 0, ii = levels.length; i < ii; ++i) {
32920         if (levels[i] < level) {
32921           if (start >= 0) {
32922             reverseValues(chars, start, i);
32923             start = -1;
32924           }
32925         } else if (start < 0) {
32926           start = i;
32927         }
32928       }
32929       if (start >= 0) {
32930         reverseValues(chars, start, levels.length);
32931       }
32932     }
32934     /*
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.
32939      */
32941     // don't bother for now
32943     /*
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.
32947      */
32949     // don't mirror as characters are already mirrored in the pdf
32951     // Finally, return string
32953     var result = '';
32954     for (var i = 0, ii = chars.length; i < ii; ++i) {
32955       var ch = chars[i];
32956       if (ch != '<' && ch != '>')
32957         result += ch;
32958     }
32959     return result;
32960   }
32962   return bidi;
32963 })();
32966 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
32967 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
32969 'use strict';
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);
32977       });
32978       var chars = '';
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) + ';';
32984       }
32985       return '>' + chars;
32986     });
32987   }
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');
32998     }
33000     this.metaDocument = meta;
33001     this.metadata = {};
33002     this.parse();
33003   }
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;
33014       }
33016       var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
33017       if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes())
33018         return;
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')
33025           continue;
33027         entries = [];
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]);
33031         }
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();
33037         }
33038       }
33039     },
33041     get: function Metadata_get(name) {
33042       return this.metadata[name] || null;
33043     },
33045     has: function Metadata_has(name) {
33046       return typeof this.metadata[name] !== 'undefined';
33047     }
33048   };
33050   return Metadata;
33051 })();
33053 }).call((typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window);