UNPKG

canvas-editor-pdf

Version:
9,688 lines 388 kB
(function(){"use strict";try{if(typeof document!="undefined"){var e=document.createElement("style");e.id="canvas-editor-pdf-style",e.appendChild(document.createTextNode("")),document.head.appendChild(e)}}catch(d){console.error("vite-plugin-css-injected-by-js",d)}})();
import jsPDF, { GState } from "jspdf";
var MaxHeightRatio = /* @__PURE__ */ ((MaxHeightRatio2) => {
  MaxHeightRatio2["HALF"] = "half";
  MaxHeightRatio2["ONE_THIRD"] = "one-third";
  MaxHeightRatio2["QUARTER"] = "quarter";
  return MaxHeightRatio2;
})(MaxHeightRatio || {});
var NumberType = /* @__PURE__ */ ((NumberType2) => {
  NumberType2["ARABIC"] = "arabic";
  NumberType2["CHINESE"] = "chinese";
  return NumberType2;
})(NumberType || {});
var ImageDisplay = /* @__PURE__ */ ((ImageDisplay2) => {
  ImageDisplay2["INLINE"] = "inline";
  ImageDisplay2["BLOCK"] = "block";
  ImageDisplay2["SURROUND"] = "surround";
  ImageDisplay2["FLOAT_TOP"] = "float-top";
  ImageDisplay2["FLOAT_BOTTOM"] = "float-bottom";
  return ImageDisplay2;
})(ImageDisplay || {});
const ZERO = "\u200B";
const NBSP = " ";
const PUNCTUATION_LIST = [
  "\xB7",
  "\u3001",
  ":",
  "\uFF1A",
  ",",
  "\uFF0C",
  ".",
  "\u3002",
  ";",
  "\uFF1B",
  "?",
  "\uFF1F",
  "!",
  "\uFF01"
];
const maxHeightRadioMapping = {
  [MaxHeightRatio.HALF]: 1 / 2,
  [MaxHeightRatio.ONE_THIRD]: 1 / 3,
  [MaxHeightRatio.QUARTER]: 1 / 4
};
const LETTER_CLASS = {
  ENGLISH: "A-Za-z",
  SPANISH: "A-Za-z\xC1\xC9\xCD\xD3\xDA\xE1\xE9\xED\xF3\xFA\xD1\xF1\xDC\xFC",
  FRENCH: "A-Za-z\xC0\xC2\xC7\xE0\xE2\xE7\xC9\xE9\xC8\xE8\xCA\xEA\xCB\xEB\xCE\xEE\xCF\xEF\xD4\xF4\xD9\xF9\xDB\xFB\u0178\xFF",
  GERMAN: "A-Za-z\xC4\xE4\xD6\xF6\xDC\xFC\xDF",
  RUSSIAN: "\u0410-\u042F\u0430-\u044F\u0401\u0451",
  PORTUGUESE: "A-Za-z\xC1\xC9\xCD\xD3\xDA\xE1\xE9\xED\xF3\xFA\xC3\xD5\xE3\xF5\xC7\xE7",
  ITALIAN: "A-Za-z\xC0\xE0\xC8\xE8\xC9\xE9\xCC\xEC\xCD\xED\xCE\xEE\xD3\xF3\xD2\xF2\xD9\xF9",
  DUTCH: "A-Za-z\xC0\xE0\xC1\xE1\xC2\xE2\xC4\xE4\xC8\xE8\xC9\xE9\xCA\xEA\xCB\xEB\xCC\xEC\xCD\xED\xCE\xEE\xCF\xEF\xD3\xF3\xD2\xF2\xD4\xF4\xD6\xF6\xD9\xF9\xDB\xFB\xDC\xFC",
  SWEDISH: "A-Za-z\xC5\xE5\xC4\xE4\xD6\xF6",
  GREEK: "\u0391\u03B1\u0392\u03B2\u0393\u03B3\u0394\u03B4\u0395\u03B5\u0396\u03B6\u0397\u03B7\u0398\u03B8\u0399\u03B9\u039A\u03BA\u039B\u03BB\u039C\u03BC\u039D\u03BD\u039E\u03BE\u039F\u03BF\u03A0\u03C0\u03A1\u03C1\u03A3\u03C3\u03C2\u03A4\u03C4\u03A5\u03C5\u03A6\u03C6\u03A7\u03C7\u03A8\u03C8\u03A9\u03C9"
};
const METRICS_BASIS_TEXT = "\u65E5";
var RowFlex = /* @__PURE__ */ ((RowFlex2) => {
  RowFlex2["LEFT"] = "left";
  RowFlex2["CENTER"] = "center";
  RowFlex2["RIGHT"] = "right";
  RowFlex2["ALIGNMENT"] = "alignment";
  RowFlex2["JUSTIFY"] = "justify";
  return RowFlex2;
})(RowFlex || {});
const SURROGATE_PAIR_REG = /[\uD800-\uDBFF][\uDC00-\uDFFF]/;
const EMOJI_REG = /[#*0-9]\uFE0F?\u20E3|[\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23ED-\u23EF\u23F1\u23F2\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB\u25FC\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692\u2694-\u2697\u2699\u269B\u269C\u26A0\u26A7\u26AA\u26B0\u26B1\u26BD\u26BE\u26C4\u26C8\u26CF\u26D1\u26E9\u26F0-\u26F5\u26F7\u26F8\u26FA\u2702\u2708\u2709\u270F\u2712\u2714\u2716\u271D\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u27A1\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B55\u3030\u303D\u3297\u3299]\uFE0F?|[\u261D\u270C\u270D](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\u270A\u270B](?:\uD83C[\uDFFB-\uDFFF])?|[\u23E9-\u23EC\u23F0\u23F3\u25FD\u2693\u26A1\u26AB\u26C5\u26CE\u26D4\u26EA\u26FD\u2705\u2728\u274C\u274E\u2753-\u2755\u2795-\u2797\u27B0\u27BF\u2B50]|\u26D3\uFE0F?(?:\u200D\uD83D\uDCA5)?|\u26F9(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\u2764\uFE0F?(?:\u200D(?:\uD83D\uDD25|\uD83E\uDE79))?|\uD83C(?:[\uDC04\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37\uDF21\uDF24-\uDF2C\uDF36\uDF7D\uDF96\uDF97\uDF99-\uDF9B\uDF9E\uDF9F\uDFCD\uDFCE\uDFD4-\uDFDF\uDFF5\uDFF7]\uFE0F?|[\uDF85\uDFC2\uDFC7](?:\uD83C[\uDFFB-\uDFFF])?|[\uDFC4\uDFCA](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDFCB\uDFCC](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDCCF\uDD8E\uDD91-\uDD9A\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF43\uDF45-\uDF4A\uDF4C-\uDF7C\uDF7E-\uDF84\uDF86-\uDF93\uDFA0-\uDFC1\uDFC5\uDFC6\uDFC8\uDFC9\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF8-\uDFFF]|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|\uDF44(?:\u200D\uD83D\uDFEB)?|\uDF4B(?:\u200D\uD83D\uDFE9)?|\uDFC3(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDFF3\uFE0F?(?:\u200D(?:\u26A7\uFE0F?|\uD83C\uDF08))?|\uDFF4(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDC73\uDB40\uDC63\uDB40\uDC74|\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F)?)|\uD83D(?:[\uDC3F\uDCFD\uDD49\uDD4A\uDD6F\uDD70\uDD73\uDD76-\uDD79\uDD87\uDD8A-\uDD8D\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA\uDECB\uDECD-\uDECF\uDEE0-\uDEE5\uDEE9\uDEF0\uDEF3]\uFE0F?|[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDC8F\uDC91\uDCAA\uDD7A\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC6E\uDC70\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4\uDEB5](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD74\uDD90](?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?|[\uDC00-\uDC07\uDC09-\uDC14\uDC16-\uDC25\uDC27-\uDC3A\uDC3C-\uDC3E\uDC40\uDC44\uDC45\uDC51-\uDC65\uDC6A\uDC79-\uDC7B\uDC7D-\uDC80\uDC84\uDC88-\uDC8E\uDC90\uDC92-\uDCA9\uDCAB-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDDA4\uDDFB-\uDE2D\uDE2F-\uDE34\uDE37-\uDE41\uDE43\uDE44\uDE48-\uDE4A\uDE80-\uDEA2\uDEA4-\uDEB3\uDEB7-\uDEBF\uDEC1-\uDEC5\uDED0-\uDED2\uDED5-\uDED7\uDEDC-\uDEDF\uDEEB\uDEEC\uDEF4-\uDEFC\uDFE0-\uDFEB\uDFF0]|\uDC08(?:\u200D\u2B1B)?|\uDC15(?:\u200D\uD83E\uDDBA)?|\uDC26(?:\u200D(?:\u2B1B|\uD83D\uDD25))?|\uDC3B(?:\u200D\u2744\uFE0F?)?|\uDC41\uFE0F?(?:\u200D\uD83D\uDDE8\uFE0F?)?|\uDC68(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDC68\uDC69]\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?\uDC68\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE])))?))?|\uDC69(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:\uDC8B\u200D\uD83D)?[\uDC68\uDC69]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D(?:[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?))|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFC-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFD-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFD\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D\uD83D(?:[\uDC68\uDC69]|\uDC8B\u200D\uD83D[\uDC68\uDC69])\uD83C[\uDFFB-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83D[\uDC68\uDC69]\uD83C[\uDFFB-\uDFFE])))?))?|\uDC6F(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDD75(?:\uFE0F|\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|\uDE2E(?:\u200D\uD83D\uDCA8)?|\uDE35(?:\u200D\uD83D\uDCAB)?|\uDE36(?:\u200D\uD83C\uDF2B\uFE0F?)?|\uDE42(?:\u200D[\u2194\u2195]\uFE0F?)?|\uDEB6(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?)|\uD83E(?:[\uDD0C\uDD0F\uDD18-\uDD1F\uDD30-\uDD34\uDD36\uDD77\uDDB5\uDDB6\uDDBB\uDDD2\uDDD3\uDDD5\uDEC3-\uDEC5\uDEF0\uDEF2-\uDEF8](?:\uD83C[\uDFFB-\uDFFF])?|[\uDD26\uDD35\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD\uDDCF\uDDD4\uDDD6-\uDDDD](?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDDDE\uDDDF](?:\u200D[\u2640\u2642]\uFE0F?)?|[\uDD0D\uDD0E\uDD10-\uDD17\uDD20-\uDD25\uDD27-\uDD2F\uDD3A\uDD3F-\uDD45\uDD47-\uDD76\uDD78-\uDDB4\uDDB7\uDDBA\uDDBC-\uDDCC\uDDD0\uDDE0-\uDDFF\uDE70-\uDE7C\uDE80-\uDE88\uDE90-\uDEBD\uDEBF-\uDEC2\uDECE-\uDEDB\uDEE0-\uDEE8]|\uDD3C(?:\u200D[\u2640\u2642]\uFE0F?|\uD83C[\uDFFB-\uDFFF])?|\uDDCE(?:\uD83C[\uDFFB-\uDFFF])?(?:\u200D(?:[\u2640\u2642]\uFE0F?(?:\u200D\u27A1\uFE0F?)?|\u27A1\uFE0F?))?|\uDDD1(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1|\uDDD1\u200D\uD83E\uDDD2(?:\u200D\uD83E\uDDD2)?|\uDDD2(?:\u200D\uD83E\uDDD2)?))|\uD83C(?:\uDFFB(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFC-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFC(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFD-\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFD(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFE(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFD\uDFFF]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?|\uDFFF(?:\u200D(?:[\u2695\u2696\u2708]\uFE0F?|\u2764\uFE0F?\u200D(?:\uD83D\uDC8B\u200D)?\uD83E\uDDD1\uD83C[\uDFFB-\uDFFE]|\uD83C[\uDF3E\uDF73\uDF7C\uDF84\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E(?:[\uDDAF\uDDBC\uDDBD](?:\u200D\u27A1\uFE0F?)?|[\uDDB0-\uDDB3]|\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF])))?))?|\uDEF1(?:\uD83C(?:\uDFFB(?:\u200D\uD83E\uDEF2\uD83C[\uDFFC-\uDFFF])?|\uDFFC(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFD-\uDFFF])?|\uDFFD(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])?|\uDFFE(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFD\uDFFF])?|\uDFFF(?:\u200D\uD83E\uDEF2\uD83C[\uDFFB-\uDFFE])?))?)/g;
const UNICODE_SYMBOL_REG = new RegExp(
  `${EMOJI_REG.source}|${SURROGATE_PAIR_REG.source}`,
  "g"
);
const PUNCTUATION_REG = /[、,。?!;:……「」“”‘’*()【】〔〕〖〗〘〙〚〛《》———﹝﹞–—\\/·.,!?;:`~<>()[\]{}'"|]/;
const START_LINE_BREAK_REG = new RegExp(`^[${ZERO}
]`);
function deepClone(obj) {
  if (!obj || typeof obj !== "object") {
    return obj;
  }
  let newObj = {};
  if (Array.isArray(obj)) {
    newObj = obj.map((item) => deepClone(item));
  } else {
    Object.keys(obj).forEach((key) => {
      return newObj[key] = deepClone(obj[key]);
    });
  }
  return newObj;
}
function getUUID() {
  function S4() {
    return ((1 + Math.random()) * 65536 | 0).toString(16).substring(1);
  }
  return S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4();
}
function splitText(text) {
  const data2 = [];
  if (Intl.Segmenter) {
    const segmenter = new Intl.Segmenter();
    const segments = segmenter.segment(text);
    for (const { segment } of segments) {
      data2.push(segment);
    }
  } else {
    const symbolMap = /* @__PURE__ */ new Map();
    for (const match of text.matchAll(UNICODE_SYMBOL_REG)) {
      symbolMap.set(match.index, match[0]);
    }
    let t = 0;
    while (t < text.length) {
      const symbol = symbolMap.get(t);
      if (symbol) {
        data2.push(symbol);
        t += symbol.length;
      } else {
        data2.push(text[t]);
        t++;
      }
    }
  }
  return data2;
}
function isObject(type) {
  return Object.prototype.toString.call(type) === "[object Object]";
}
function isArray(type) {
  return Array.isArray(type);
}
function mergeObject(source, target) {
  if (isObject(source) && isObject(target)) {
    const objectTarget = target;
    for (const [key, val] of Object.entries(source)) {
      if (!objectTarget[key]) {
        objectTarget[key] = val;
      } else {
        objectTarget[key] = mergeObject(val, objectTarget[key]);
      }
    }
  } else if (isArray(source) && isArray(target)) {
    target.push(...source);
  }
  return target;
}
function convertNumberToChinese(num) {
  const chineseNum = [
    "\u96F6",
    "\u4E00",
    "\u4E8C",
    "\u4E09",
    "\u56DB",
    "\u4E94",
    "\u516D",
    "\u4E03",
    "\u516B",
    "\u4E5D"
  ];
  const chineseUnit = [
    "",
    "\u5341",
    "\u767E",
    "\u5343",
    "\u4E07",
    "\u5341",
    "\u767E",
    "\u5343",
    "\u4EBF",
    "\u5341",
    "\u767E",
    "\u5343",
    "\u4E07",
    "\u5341",
    "\u767E",
    "\u5343",
    "\u4EBF"
  ];
  if (!num || isNaN(num))
    return "\u96F6";
  const numStr = num.toString().split("");
  let result = "";
  for (let i = 0; i < numStr.length; i++) {
    const desIndex = numStr.length - 1 - i;
    result = `${chineseUnit[i]}${result}`;
    result = `${chineseNum[Number(numStr[desIndex])]}${result}`;
  }
  result = result.replace(/零(千|百|十)/g, "\u96F6").replace(/十零/g, "\u5341");
  result = result.replace(/零+/g, "\u96F6");
  result = result.replace(/零亿/g, "\u4EBF").replace(/零万/g, "\u4E07");
  result = result.replace(/亿万/g, "\u4EBF");
  result = result.replace(/零+$/, "");
  result = result.replace(/^一十/g, "\u5341");
  return result;
}
function pickObject(object, pickKeys) {
  const newObject = {};
  for (const key in object) {
    if (pickKeys.includes(key)) {
      newObject[key] = object[key];
    }
  }
  return newObject;
}
function convertStringToBase64(input) {
  const encoder = new TextEncoder();
  const data2 = encoder.encode(input);
  const charArray = Array.from(data2, (byte) => String.fromCharCode(byte));
  const base64 = window.btoa(charArray.join(""));
  return base64;
}
function isArrayEqual(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }
  return !arr1.some((item) => !arr2.includes(item));
}
function isRectIntersect(rect1, rect2) {
  const rect1Left = rect1.x;
  const rect1Right = rect1.x + rect1.width;
  const rect1Top = rect1.y;
  const rect1Bottom = rect1.y + rect1.height;
  const rect2Left = rect2.x;
  const rect2Right = rect2.x + rect2.width;
  const rect2Top = rect2.y;
  const rect2Bottom = rect2.y + rect2.height;
  if (rect1Left > rect2Right || rect1Right < rect2Left || rect1Top > rect2Bottom || rect1Bottom < rect2Top) {
    return false;
  }
  return true;
}
var ControlType = /* @__PURE__ */ ((ControlType2) => {
  ControlType2["TEXT"] = "text";
  ControlType2["SELECT"] = "select";
  ControlType2["CHECKBOX"] = "checkbox";
  ControlType2["RADIO"] = "radio";
  ControlType2["DATE"] = "date";
  return ControlType2;
})(ControlType || {});
var ControlComponent = /* @__PURE__ */ ((ControlComponent2) => {
  ControlComponent2["PREFIX"] = "prefix";
  ControlComponent2["POSTFIX"] = "postfix";
  ControlComponent2["PLACEHOLDER"] = "placeholder";
  ControlComponent2["VALUE"] = "value";
  ControlComponent2["CHECKBOX"] = "checkbox";
  ControlComponent2["RADIO"] = "radio";
  return ControlComponent2;
})(ControlComponent || {});
var ControlIndentation = /* @__PURE__ */ ((ControlIndentation2) => {
  ControlIndentation2["ROW_START"] = "rowStart";
  ControlIndentation2["VALUE_START"] = "valueStart";
  return ControlIndentation2;
})(ControlIndentation || {});
var EditorComponent = /* @__PURE__ */ ((EditorComponent2) => {
  EditorComponent2["COMPONENT"] = "component";
  EditorComponent2["MENU"] = "menu";
  EditorComponent2["MAIN"] = "main";
  EditorComponent2["FOOTER"] = "footer";
  EditorComponent2["CONTEXTMENU"] = "contextmenu";
  EditorComponent2["POPUP"] = "popup";
  EditorComponent2["CATALOG"] = "catalog";
  EditorComponent2["COMMENT"] = "comment";
  return EditorComponent2;
})(EditorComponent || {});
var EditorMode = /* @__PURE__ */ ((EditorMode2) => {
  EditorMode2["EDIT"] = "edit";
  EditorMode2["CLEAN"] = "clean";
  EditorMode2["READONLY"] = "readonly";
  EditorMode2["FORM"] = "form";
  EditorMode2["PRINT"] = "print";
  EditorMode2["DESIGN"] = "design";
  return EditorMode2;
})(EditorMode || {});
var EditorZone = /* @__PURE__ */ ((EditorZone2) => {
  EditorZone2["HEADER"] = "header";
  EditorZone2["MAIN"] = "main";
  EditorZone2["FOOTER"] = "footer";
  return EditorZone2;
})(EditorZone || {});
var PageMode = /* @__PURE__ */ ((PageMode2) => {
  PageMode2["PAGING"] = "paging";
  PageMode2["CONTINUITY"] = "continuity";
  return PageMode2;
})(PageMode || {});
var PaperDirection = /* @__PURE__ */ ((PaperDirection2) => {
  PaperDirection2["VERTICAL"] = "vertical";
  PaperDirection2["HORIZONTAL"] = "horizontal";
  return PaperDirection2;
})(PaperDirection || {});
var WordBreak = /* @__PURE__ */ ((WordBreak2) => {
  WordBreak2["BREAK_ALL"] = "break-all";
  WordBreak2["BREAK_WORD"] = "break-word";
  return WordBreak2;
})(WordBreak || {});
var RenderMode = /* @__PURE__ */ ((RenderMode2) => {
  RenderMode2["SPEED"] = "speed";
  RenderMode2["COMPATIBILITY"] = "compatibility";
  return RenderMode2;
})(RenderMode || {});
const EDITOR_COMPONENT = "editor-component";
const EDITOR_PREFIX = "ce";
const defaultModeRuleOption = {
  print: {
    imagePreviewerDisabled: false
  },
  readonly: {
    imagePreviewerDisabled: false
  },
  form: {
    controlDeletableDisabled: false
  }
};
class ImageParticle {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
    this.imageCache = /* @__PURE__ */ new Map();
    this.floatImageContainer = null;
    this.floatImage = null;
  }
  createFloatImage(element) {
    const { scale } = this.options;
    let floatImageContainer = this.floatImageContainer;
    let floatImage = this.floatImage;
    if (!floatImageContainer) {
      floatImageContainer = document.createElement("div");
      floatImageContainer.classList.add(`${EDITOR_PREFIX}-float-image`);
      this.floatImageContainer = floatImageContainer;
    }
    if (!floatImage) {
      floatImage = document.createElement("img");
      floatImageContainer.append(floatImage);
      this.floatImage = floatImage;
    }
    floatImageContainer.style.display = "none";
    floatImage.style.width = `${element.width * scale}px`;
    floatImage.style.height = `${element.height * scale}px`;
    const height = this.draw.getHeight();
    const pageGap = this.draw.getPageGap();
    const preY = this.draw.getPageNo() * (height + pageGap);
    const imgFloatPosition = element.imgFloatPosition;
    floatImageContainer.style.left = `${imgFloatPosition.x}px`;
    floatImageContainer.style.top = `${preY + imgFloatPosition.y}px`;
    floatImage.src = element.value;
  }
  dragFloatImage(movementX, movementY) {
    if (!this.floatImageContainer)
      return;
    this.floatImageContainer.style.display = "block";
    const x = parseFloat(this.floatImageContainer.style.left) + movementX;
    const y = parseFloat(this.floatImageContainer.style.top) + movementY;
    this.floatImageContainer.style.left = `${x}px`;
    this.floatImageContainer.style.top = `${y}px`;
  }
  destroyFloatImage() {
    if (this.floatImageContainer) {
      this.floatImageContainer.style.display = "none";
    }
  }
  addImageObserver(promise) {
    this.draw.getImageObserver().add(promise);
  }
  getFallbackImage(width, height) {
    const tileSize = 8;
    const x = (width - Math.ceil(width / tileSize) * tileSize) / 2;
    const y = (height - Math.ceil(height / tileSize) * tileSize) / 2;
    const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="0 0 ${width} ${height}">
                  <rect width="${width}" height="${height}" fill="url(#mosaic)" />
                  <defs>
                    <pattern id="mosaic" x="${x}" y="${y}" width="${tileSize * 2}" height="${tileSize * 2}" patternUnits="userSpaceOnUse">
                      <rect width="${tileSize}" height="${tileSize}" fill="#cccccc" />
                      <rect width="${tileSize}" height="${tileSize}" fill="#cccccc" transform="translate(${tileSize}, ${tileSize})" />
                    </pattern>
                  </defs>
                </svg>`;
    const fallbackImage = new Image();
    fallbackImage.src = `data:image/svg+xml;base64,${convertStringToBase64(
      svg
    )}`;
    return fallbackImage;
  }
  render(ctx2d, element, x, y) {
    if (element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {
      this.draw.render({
        isCompute: false,
        isSetCursor: false,
        isSubmitHistory: false
      });
    } else {
      const { scale } = this.options;
      const width = element.width * scale;
      const height = element.height * scale;
      ctx2d.drawImage(element.value, x, y, width, height);
    }
  }
}
function svgString2Image(svgString, width, height, format, callback) {
  return new Promise((resolve) => {
    format = format ? format : "png";
    const svgData = svgString;
    const canvas = document.createElement("canvas");
    const context = canvas.getContext("2d");
    canvas.width = width;
    canvas.height = height;
    const image = new Image();
    image.onload = function() {
      if (context) {
        context.clearRect(0, 0, width, height);
        context.drawImage(image, 0, 0, width, height);
        const pngData = canvas.toDataURL("image/" + format);
        resolve(pngData);
        callback(pngData);
      }
    };
    image.src = svgData;
  });
}
const ordR = "R".charCodeAt(0);
function HERSHEY(i) {
  if (data[i] == null) {
    compile(i);
  }
  return data[i];
}
function compile(i) {
  const entry = raw[i];
  if (entry == null) {
    return;
  }
  const bound = entry.substring(3, 5);
  const xmin = 1 * bound.charCodeAt(0) - ordR;
  const xmax = 1 * bound.charCodeAt(1) - ordR;
  const content = entry.substring(5);
  const polylines = [[]];
  let ymin = Infinity;
  let ymax = -Infinity;
  let zmin = Infinity;
  let zmax = -Infinity;
  let j = 0;
  while (j < content.length) {
    const digit = content.substring(j, j + 2);
    if (digit == " R") {
      polylines.push([]);
    } else {
      const x = digit.charCodeAt(0) - ordR - xmin;
      const y = digit.charCodeAt(1) - ordR;
      ymin = Math.min(y, ymin);
      ymax = Math.max(y, ymax);
      zmin = Math.min(x, zmin);
      zmax = Math.max(x, zmax);
      polylines[polylines.length - 1].push([x, y]);
    }
    j += 2;
  }
  data[i] = {
    w: xmax - xmin,
    xmin: zmin,
    xmax: zmax,
    ymin,
    ymax,
    polylines
  };
}
const data = {};
const raw = {
  1: "  9MWRMNV RRMVV RPSTS",
  2: " 16MWOMOV ROMSMUNUPSQ ROQSQURUUSVOV",
  3: " 11MXVNTMRMPNOPOSPURVTVVU",
  4: " 12MWOMOV ROMRMTNUPUSTURVOV",
  5: " 12MWOMOV ROMUM ROQSQ ROVUV",
  6: "  9MVOMOV ROMUM ROQSQ",
  7: " 15MXVNTMRMPNOPOSPURVTVVUVR RSRVR",
  8: "  9MWOMOV RUMUV ROQUQ",
  9: "  3PTRMRV",
  10: "  7NUSMSTRVPVOTOS",
  11: "  9MWOMOV RUMOS RQQUV",
  12: "  6MVOMOV ROVUV",
  13: " 12LXNMNV RNMRV RVMRV RVMVV",
  14: "  9MWOMOV ROMUV RUMUV",
  15: " 14MXRMPNOPOSPURVSVUUVSVPUNSMRM",
  16: " 10MWOMOV ROMSMUNUQSROR",
  17: " 17MXRMPNOPOSPURVSVUUVSVPUNSMRM RSTVW",
  18: " 13MWOMOV ROMSMUNUQSROR RRRUV",
  19: " 13MWUNSMQMONOOPPTRUSUUSVQVOU",
  20: "  6MWRMRV RNMVM",
  21: "  9MXOMOSPURVSVUUVSVM",
  22: "  6MWNMRV RVMRV",
  23: " 12LXNMPV RRMPV RRMTV RVMTV",
  24: "  6MWOMUV RUMOV",
  25: "  7MWNMRQRV RVMRQ",
  26: "  9MWUMOV ROMUM ROVUV",
  27: "  9MWRMNV RRMVV RPSTS",
  28: " 16MWOMOV ROMSMUNUPSQ ROQSQURUUSVOV",
  29: "  6MVOMOV ROMUM",
  30: "  9MWRMNV RRMVV RNVVV",
  31: " 12MWOMOV ROMUM ROQSQ ROVUV",
  32: "  9MWUMOV ROMUM ROVUV",
  33: "  9MWOMOV RUMUV ROQUQ",
  34: " 20MXRMPNOPOSPURVSVUUVSVPUNSMRM RQQTR RTQQR",
  35: "  3PTRMRV",
  36: "  9MWOMOV RUMOS RQQUV",
  37: "  6MWRMNV RRMVV",
  38: " 12LXNMNV RNMRV RVMRV RVMVV",
  39: "  9MWOMOV ROMUV RUMUV",
  40: " 12MWOMUM RPQTR RTQPR ROVUV",
  41: " 14MXRMPNOPOSPURVSVUUVSVPUNSMRM",
  42: "  9MWOMOV RUMUV ROMUM",
  43: " 10MWOMOV ROMSMUNUQSROR",
  44: " 10MWOMRQOV ROMUM ROVUV",
  45: "  6MWRMRV RNMVM",
  46: " 15MWNONNOMPMQNRPRV RVOVNUMTMSNRP",
  47: " 13LXRMRV RPONPNSPTTTVSVPTOPO",
  48: "  6MWOMUV RUMOV",
  49: " 12LXRMRV RNOOPOSQTSTUSUPVO",
  50: " 13MXOVQVOROPPNRMSMUNVPVRTVVV",
  200: " 12MWRMPNOPOSPURVTUUSUPTNRM",
  201: "  4MWPORMRV",
  202: "  9MWONQMSMUNUPTROVUV",
  203: " 15MWONQMSMUNUPSQ RRQSQURUUSVQVOU",
  204: "  7MWSMSV RSMNSVS",
  205: " 14MWPMOQQPRPTQUSTURVQVOU RPMTM",
  206: " 14MWTMRMPNOPOSPURVTUUSTQRPPQOS",
  207: "  6MWUMQV ROMUM",
  208: " 19MWQMONOPQQSQUPUNSMQM RQQOROUQVSVUUURSQ",
  209: " 14MWUPTRRSPROPPNRMTNUPUSTURVPV",
  210: "  6PURURVSVSURU",
  211: "  7PUSVRVRUSUSWRY",
  212: " 12PURPRQSQSPRP RRURVSVSURU",
  213: " 13PURPRQSQSPRP RSVRVRUSUSWRY",
  214: " 12PURMRR RSMSR RRURVSVSURU",
  215: " 17NWPNRMSMUNUPRQRRSRSQUP RRURVSVSURU",
  216: "  3PTRMRQ",
  217: "  6NVPMPQ RTMTQ",
  218: " 10NVQMPNPPQQSQTPTNSMQM",
  219: " 16MWUNSMQMONOPQQTRUSUUSVQVOU RRLRW",
  220: "  3MWVLNW",
  221: "  7OVTLRNQPQSRUTW",
  222: "  7NUPLRNSPSSRUPW",
  223: "  3PTRLRW",
  224: "  3LXNRVR",
  225: "  6LXRNRV RNRVR",
  226: "  6LXNPVP RNTVT",
  227: "  6MWOOUU RUOOU",
  228: "  9MWRORU ROPUT RUPOT",
  229: "  6PURQRRSRSQRQ",
  230: "  7PUSMRORQSQSPRP",
  231: "  7PUSNRNRMSMSORQ",
  232: "  7LXSOVRSU RNRVR",
  233: " 12MXRLPW RULSW ROPVP ROSVS",
  234: " 21LXVRURTSSURVOVNUNSORRQSPSNRMPMONOPQSSUUVVV",
  235: " 20LXNNOQOSNV RVNUQUSVV RNNQOSOVN RNVQUSUVV",
  501: "  9I[RFJ[ RRFZ[ RMTWT",
  502: " 24G\\KFK[ RKFTFWGXHYJYLXNWOTP RKPTPWQXRYTYWXYWZT[K[",
  503: " 19H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV",
  504: " 16G\\KFK[ RKFRFUGWIXKYNYSXVWXUZR[K[",
  505: " 12H[LFL[ RLFYF RLPTP RL[Y[",
  506: "  9HZLFL[ RLFYF RLPTP",
  507: " 23H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZS RUSZS",
  508: "  9G]KFK[ RYFY[ RKPYP",
  509: "  3NVRFR[",
  510: " 11JZVFVVUYTZR[P[NZMYLVLT",
  511: "  9G\\KFK[ RYFKT RPOY[",
  512: "  6HYLFL[ RL[X[",
  513: " 12F^JFJ[ RJFR[ RZFR[ RZFZ[",
  514: "  9G]KFK[ RKFY[ RYFY[",
  515: " 22G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF",
  516: " 14G\\KFK[ RKFTFWGXHYJYMXOWPTQKQ",
  517: " 25G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF RSWY]",
  518: " 17G\\KFK[ RKFTFWGXHYJYLXNWOTPKP RRPY[",
  519: " 21H\\YIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX",
  520: "  6JZRFR[ RKFYF",
  521: " 11G]KFKULXNZQ[S[VZXXYUYF",
  522: "  6I[JFR[ RZFR[",
  523: " 12F^HFM[ RRFM[ RRFW[ R\\FW[",
  524: "  6H\\KFY[ RYFK[",
  525: "  7I[JFRPR[ RZFRP",
  526: "  9H\\YFK[ RKFYF RK[Y[",
  527: "  9I[RFJ[ RRFZ[ RMTWT",
  528: " 24G\\KFK[ RKFTFWGXHYJYLXNWOTP RKPTPWQXRYTYWXYWZT[K[",
  529: "  6HYLFL[ RLFXF",
  530: "  9I[RFJ[ RRFZ[ RJ[Z[",
  531: " 12H[LFL[ RLFYF RLPTP RL[Y[",
  532: "  9H\\YFK[ RKFYF RK[Y[",
  533: "  9G]KFK[ RYFY[ RKPYP",
  534: " 25G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF ROPUP",
  535: "  3NVRFR[",
  536: "  9G\\KFK[ RYFKT RPOY[",
  537: "  6I[RFJ[ RRFZ[",
  538: " 12F^JFJ[ RJFR[ RZFR[ RZFZ[",
  539: "  9G]KFK[ RKFY[ RYFY[",
  540: "  9I[KFYF ROPUP RK[Y[",
  541: " 22G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF",
  542: "  9G]KFK[ RYFY[ RKFYF",
  543: " 14G\\KFK[ RKFTFWGXHYJYMXOWPTQKQ",
  544: " 10I[KFRPK[ RKFYF RK[Y[",
  545: "  6JZRFR[ RKFYF",
  546: " 19I[KKKILGMFOFPGQIRMR[ RYKYIXGWFUFTGSIRM",
  547: " 21H\\RFR[ RPKMLLMKOKRLTMUPVTVWUXTYRYOXMWLTKPK",
  548: "  6H\\KFY[ RK[YF",
  549: " 18G]RFR[ RILJLKMLQMSNTQUSUVTWSXQYMZL[L",
  550: " 17H\\K[O[LTKPKLLINGQFSFVGXIYLYPXTU[Y[",
  551: " 20G[G[IZLWOSSLVFV[UXSUQSNQLQKRKTLVNXQZT[Y[",
  552: " 41F]SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFXFZG[I[KZMYNWOTP RSPTPWQXRYTYWXYWZU[R[PZOX",
  553: " 24H\\TLTMUNWNYMZKZIYGWFTFQGOIMLLNKRKVLYMZO[Q[TZVXWV",
  554: " 35G^TFRGQIPMOSNVMXKZI[G[FZFXGWIWKXMZP[S[VZXXZT[O[KZHYGWFTFRHRJSMUPWRZT\\U",
  555: " 28H\\VJVKWLYLZKZIYGVFRFOGNINLONPOSPPPMQLRKTKWLYMZP[S[VZXXYV",
  556: " 28H\\RLPLNKMINGQFTFXG[G]F RXGVNTTRXPZN[L[JZIXIVJULUNV RQPZP",
  557: " 29G^G[IZMVPQQNRJRGQFPFOGNINLONQOUOXNYMZKZQYVXXVZS[O[LZJXIVIT",
  558: " 38F^MMKLJJJIKGMFNFPGQIQKPONULYJ[H[GZGX RMRVOXN[L]J^H^G]F\\FZHXLVRUWUZV[W[YZZY\\V",
  559: " 25IZWVUTSQROQLQIRGSFUFVGWIWLVQTVSXQZO[M[KZJXJVKUMUOV",
  560: " 25JYT^R[PVOPOJPGRFTFUGVJVMURR[PaOdNfLgKfKdLaN^P\\SZWX",
  561: " 39F^MMKLJJJIKGMFNFPGQIQKPONULYJ[H[GZGX R^I^G]F\\FZGXIVLTNROPO RROSQSXTZU[V[XZYY[V",
  562: " 29I\\MRORSQVOXMYKYHXFVFUGTISNRSQVPXNZL[J[IZIXJWLWNXQZT[V[YZ[X",
  563: " 45@aEMCLBJBICGEFFFHGIIIKHPGTE[ RGTJLLHMGOFPFRGSISKRPQTO[ RQTTLVHWGYFZF\\G]I]K\\PZWZZ[[\\[^Z_YaV",
  564: " 32E]JMHLGJGIHGJFKFMGNINKMPLTJ[ RLTOLQHRGTFVFXGYIYKXPVWVZW[X[ZZ[Y]V",
  565: " 29H]TFQGOIMLLNKRKVLYMZO[Q[TZVXXUYSZOZKYHXGVFTFRHRKSNUQWSZU\\V",
  566: " 31F_SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFZF\\G]H^J^M]O\\PZQWQUPTO",
  567: " 32H^ULTNSOQPOPNNNLOIQGTFWFYGZIZMYPWSSWPYNZK[I[HZHXIWKWMXPZS[V[YZ[X",
  568: " 38F_SHTITLSPRSQUOXMZK[J[IZIWJRKOLMNJPHRGUFYF[G\\H]J]M\\O[PYQVQSPTQUSUXVZX[ZZ[Y]V",
  569: " 28H\\H[JZLXOTQQSMTJTGSFRFQGPIPKQMSOVQXSYUYWXYWZT[P[MZKXJVJT",
  570: " 25H[RLPLNKMINGQFTFXG[G]F RXGVNTTRXPZN[L[JZIXIVJULUNV",
  571: " 33E]JMHLGJGIHGJFKFMGNINKMOLRKVKXLZN[P[RZSYUUXMZF RXMWQVWVZW[X[ZZ[Y]V",
  572: " 32F]KMILHJHIIGKFLFNGOIOKNOMRLVLYM[O[QZTWVTXPYMZIZGYFXFWGVIVKWNYP[Q",
  573: " 25C_HMFLEJEIFGHFIFKGLILLK[ RUFK[ RUFS[ RaF_G\\JYNVTS[",
  574: " 36F^NLLLKKKILGNFPFRGSISLQUQXRZT[V[XZYXYVXUVU R]I]G\\FZFXGVITLPUNXLZJ[H[GZGX",
  575: " 38F]KMILHJHIIGKFLFNGOIOKNOMRLVLXMZN[P[RZTXVUWSYM R[FYMVWT]RbPfNgMfMdNaP^S[VY[V",
  576: " 40H]ULTNSOQPOPNNNLOIQGTFWFYGZIZMYPWTTWPZN[K[JZJXKWNWPXQYR[R^QaPcNfLgKfKdLaN^Q[TYZV",
  583: "  9I[JFR[ RZFR[ RJFZF",
  601: " 18I\\XMX[ RXPVNTMQMONMPLSLUMXOZQ[T[VZXX",
  602: " 18H[LFL[ RLPNNPMSMUNWPXSXUWXUZS[P[NZLX",
  603: " 15I[XPVNTMQMONMPLSLUMXOZQ[T[VZXX",
  604: " 18I\\XFX[ RXPVNTMQMONMPLSLUMXOZQ[T[VZXX",
  605: " 18I[LSXSXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX",
  606: "  9MYWFUFSGRJR[ ROMVM",
  607: " 23I\\XMX]W`VaTbQbOa RXPVNTMQMONMPLSLUMXOZQ[T[VZXX",
  608: " 11I\\MFM[ RMQPNRMUMWNXQX[",
  609: "  9NVQFRGSFREQF RRMR[",
  610: " 12MWRFSGTFSERF RSMS^RaPbNb",
  611: "  9IZMFM[ RWMMW RQSX[",
  612: "  3NVRFR[",
  613: " 19CaGMG[ RGQJNLMOMQNRQR[ RRQUNWMZM\\N]Q][",
  614: " 11I\\MMM[ RMQPNRMUMWNXQX[",
  615: " 18I\\QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM",
  616: " 18H[LMLb RLPNNPMSMUNWPXSXUWXUZS[P[NZLX",
  617: " 18I\\XMXb RXPVNTMQMONMPLSLUMXOZQ[T[VZXX",
  618: "  9KXOMO[ ROSPPRNTMWM",
  619: " 18J[XPWNTMQMNNMPNRPSUTWUXWXXWZT[Q[NZMX",
  620: "  9MYRFRWSZU[W[ ROMVM",
  621: " 11I\\MMMWNZP[S[UZXW RXMX[",
  622: "  6JZLMR[ RXMR[",
  623: " 12G]JMN[ RRMN[ RRMV[ RZMV[",
  624: "  6J[MMX[ RXMM[",
  625: " 10JZLMR[ RXMR[P_NaLbKb",
  626: "  9J[XMM[ RMMXM RM[X[",
  627: " 24H]QMONMPLRKUKXLZN[P[RZUWWTYPZM RQMSMTNUPWXXZY[Z[",
  628: " 31I\\UFSGQIOMNPMTLZKb RUFWFYHYKXMWNUORO RROTPVRWTWWVYUZS[Q[OZNYMV",
  629: " 17I\\JPLNNMOMQNROSRSVR[ RZMYPXRR[P_Ob",
  630: " 24I[TMQMONMPLSLVMYNZP[R[TZVXWUWRVOTMRKQIQGRFTFVGXI",
  631: " 19JZWOVNTMQMONOPPRSS RSSOTMVMXNZP[S[UZWX",
  632: " 23JYTFRGQHQIRJUKXK RXKTMQONRMUMWNYP[S]T_TaSbQbP`",
  633: " 19H\\IQJOLMNMONOPNTL[ RNTPPRNTMVMXOXRWWTb",
  634: " 27G\\HQIOKMMMNNNPMUMXNZO[Q[SZUWVUWRXMXJWGUFSFRHRJSMUPWRZT",
  635: "  9LWRMPTOXOZP[R[TYUW",
  636: " 19I[OMK[ RYNXMWMUNQROSNS RNSPTQUSZT[U[VZ",
  637: "  9JZKFMFOGPHX[ RRML[",
  638: " 21H]OMIb RNQMVMYO[Q[SZUXWT RYMWTVXVZW[Y[[Y\\W",
  639: " 14I[LMOMNSMXL[ RYMXPWRUURXOZL[",
  640: " 29JZTFRGQHQIRJUKXK RUKRLPMOOOQQSTTVT RTTPUNVMXMZO\\S^T_TaRbPb",
  641: " 18J[RMPNNPMSMVNYOZQ[S[UZWXXUXRWOVNTMRM",
  642: " 13G]PML[ RUMVSWXX[ RIPKNNM[M",
  643: " 19I[MSMVNYOZQ[S[UZWXXUXRWOVNTMRMPNNPMSIb",
  644: " 18I][MQMONMPLSLVMYNZP[R[TZVXWUWRVOUNSM",
  645: "  8H\\SMP[ RJPLNOMZM",
  646: " 16H\\IQJOLMNMONOPMVMYO[Q[TZVXXTYPYM",
  647: " 21G]ONMOKQJTJWKYLZN[Q[TZWXYUZRZOXMVMTORSPXMb",
  648: " 14I[KMMMOOU`WbYb RZMYOWRM]K`Jb",
  649: " 20F]VFNb RGQHOJMLMMNMPLULXMZO[Q[TZVXXUZP[M",
  650: " 23F]NMLNJQITIWJZK[M[OZQW RRSQWRZS[U[WZYWZTZQYNXM",
  651: " 22L\\UUTSRRPRNSMTLVLXMZO[Q[SZTXVRUWUZV[W[YZZY\\V",
  652: " 23M[MVOSRNSLTITGSFQGPIOMNTNZO[P[RZTXUUURVVWWYW[V",
  653: " 14MXTTTSSRQROSNTMVMXNZP[S[VYXV",
  654: " 24L\\UUTSRRPRNSMTLVLXMZO[Q[SZTXZF RVRUWUZV[W[YZZY\\V",
  655: " 17NXOYQXRWSUSSRRQROSNUNXOZQ[S[UZVYXV",
  656: " 24OWOVSQUNVLWIWGVFTGSIQQNZKaJdJfKgMfNcOZP[R[TZUYWV",
  657: " 28L[UUTSRRPRNSMTLVLXMZO[Q[SZTY RVRTYPdOfMgLfLdMaP^S\\U[XY[V",
  658: " 29M\\MVOSRNSLTITGSFQGPIOMNSM[ RM[NXOVQSSRURVSVUUXUZV[W[YZZY\\V",
  659: " 16PWSMSNTNTMSM RPVRRPXPZQ[R[TZUYWV",
  660: " 20PWSMSNTNTMSM RPVRRLdKfIgHfHdIaL^O\\Q[TYWV",
  661: " 33M[MVOSRNSLTITGSFQGPIOMNSM[ RM[NXOVQSSRURVSVUTVQV RQVSWTZU[V[XZYY[V",
  662: " 18OWOVQSTNULVIVGUFSGRIQMPTPZQ[R[TZUYWV",
  663: " 33E^EVGSIRJSJTIXH[ RIXJVLSNRPRQSQTPXO[ RPXQVSSURWRXSXUWXWZX[Y[[Z\\Y^V",
  664: " 23J\\JVLSNROSOTNXM[ RNXOVQSSRURVSVUUXUZV[W[YZZY\\V",
  665: " 23LZRRPRNSMTLVLXMZO[Q[SZTYUWUUTSRRQSQURWTXWXYWZV",
  666: " 24KZKVMSNQMUGg RMUNSPRRRTSUUUWTYSZQ[ RMZO[R[UZWYZV",
  667: " 27L[UUTSRRPRNSMTLVLXMZO[Q[SZ RVRUUSZPaOdOfPgRfScS\\U[XY[V",
  668: " 15MZMVOSPQPSSSTTTVSYSZT[U[WZXYZV",
  669: " 16NYNVPSQQQSSVTXTZR[ RNZP[T[VZWYYV",
  670: " 16OXOVQSSO RVFPXPZQ[S[UZVYXV RPNWN",
  671: " 19L[LVNRLXLZM[O[QZSXUU RVRTXTZU[V[XZYY[V",
  672: " 17L[LVNRMWMZN[O[RZTXUUUR RURVVWWYW[V",
  673: " 25I^LRJTIWIYJ[L[NZPX RRRPXPZQ[S[UZWXXUXR RXRYVZW\\W^V",
  674: " 20JZJVLSNRPRQSQZR[U[XYZV RWSVRTRSSOZN[L[KZ",
  675: " 23L[LVNRLXLZM[O[QZSXUU RVRPdOfMgLfLdMaP^S\\U[XY[V",
  676: " 23LZLVNSPRRRTTTVSXQZN[P\\Q^QaPdOfMgLfLdMaP^S\\WYZV",
  677: " 22J\\K[NZQXSVUSWOXKXIWGUFSGRHQJPOPTQXRZT[V[XZYY",
  683: " 26I[WUWRVOUNSMQMONMPLSLVMYNZP[R[TZVXWUXPXKWHVGTFRFPGNI",
  684: " 16JZWNUMRMPNNPMSMVNYOZQ[T[VZ RMTUT",
  685: " 23J[TFRGPJOLNOMTMXNZO[Q[SZUWVUWRXMXIWGVFTF RNPWP",
  686: " 21H\\VFNb RQMNNLPKSKVLXNZQ[S[VZXXYUYRXPVNSMQM",
  687: " 16I[XOWNTMQMNNMOLQLSMUOWSZT\\T^S_Q_",
  700: " 18H\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF",
  701: "  5H\\NJPISFS[",
  702: " 15H\\LKLJMHNGPFTFVGWHXJXLWNUQK[Y[",
  703: " 16H\\MFXFRNUNWOXPYSYUXXVZS[P[MZLYKW",
  704: "  7H\\UFKTZT RUFU[",
  705: " 18H\\WFMFLOMNPMSMVNXPYSYUXXVZS[P[MZLYKW",
  706: " 24H\\XIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQLT",
  707: "  6H\\YFO[ RKFYF",
  708: " 30H\\PFMGLILKMMONSOVPXRYTYWXYWZT[P[MZLYKWKTLRNPQOUNWMXKXIWGTFPF",
  709: " 24H\\XMWPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLX",
  710: "  6MWRYQZR[SZRY",
  711: "  9MWSZR[QZRYSZS\\R^Q_",
  712: " 12MWRMQNROSNRM RRYQZR[SZRY",
  713: " 15MWRMQNROSNRM RSZR[QZRYSZS\\R^Q_",
  714: "  9MWRFRT RRYQZR[SZRY",
  715: " 21I[LKLJMHNGPFTFVGWHXJXLWNVORQRT RRYQZR[SZRY",
  716: "  3NVRFRM",
  717: "  6JZNFNM RVFVM",
  718: " 14KYQFOGNINKOMQNSNUMVKVIUGSFQF",
  719: " 27H\\PBP_ RTBT_ RYIWGTFPFMGKIKKLMMNOOUQWRXSYUYXWZT[P[MZKX",
  720: "  3G][BIb",
  721: " 11KYVBTDRGPKOPOTPYR]T`Vb",
  722: " 11KYNBPDRGTKUPUTTYR]P`Nb",
  723: "  3NVRBRb",
  724: "  3E_IR[R",
  725: "  6E_RIR[ RIR[R",
  726: "  6E_IO[O RIU[U",
  727: "  6G]KKYY RYKKY",
  728: "  9JZRLRX RMOWU RWOMU",
  729: "  6MWRQQRRSSRRQ",
  730: "  8MWSFRGQIQKRLSKRJ",
  731: "  8MWRHQGRFSGSIRKQL",
  732: "  9E_UMXP[RXTUW RIR[R",
  733: " 12H]SBLb RYBRb RLOZO RKUYU",
  734: " 35E_\\O\\N[MZMYNXPVUTXRZP[L[JZIYHWHUISJRQNRMSKSIRGPFNGMIMKNNPQUXWZY[[[\\Z\\Y",
  735: " 28G]IIJKKOKUJYI[ R[IZKYOYUZY[[ RIIKJOKUKYJ[I RI[KZOYUYYZ[[",
  737: "  6KYOBO[ RUBU[",
  738: "  6F^RBR[ RI[[[",
  739: "  4F^[BI[[[",
  740: " 18E_RIQJRKSJRI RIYHZI[JZIY R[YZZ[[\\Z[Y",
  741: " 33F^RHNLKPJSJUKWMXOXQWRU RRHVLYPZSZUYWWXUXSWRU RRUQYP\\ RRUSYT\\ RP\\T\\",
  742: " 26F^RNQKPINHMHKIJKJOKRLTNWR\\ RRNSKTIVHWHYIZKZOYRXTVWR\\",
  743: " 20F^RGPJLOIR RRGTJXO[R RIRLUPZR] R[RXUTZR]",
  744: " 48F^RTTWVXXXZW[U[SZQXPVPSQ RSQUOVMVKUISHQHOINKNMOOQQ RQQNPLPJQISIUJWLXNXPWRT RRTQYP\\ RRTSYT\\ RP\\T\\",
  745: " 55F^RRR[Q\\ RRVQ\\ RRIQHOHNINKONRR RRISHUHVIVKUNRR RRRNOLNJNIOIQJR RRRVOXNZN[O[QZR RRRNULVJVIUISJR RRRVUXVZV[U[SZR",
  746: " 55F^ISJSLTMVMXLZ RISIRJQLQMRNTNWMYLZ RRGPIOLOOQUQXPZR\\ RRGTIULUOSUSXTZR\\ R[S[RZQXQWRVTVWWYXZ R[SZSXTWVWXXZ RKVYV",
  750: " 18PSSRRSQSPRPQQPRPSQSSRUQV RQQQRRRRQQQ",
  751: " 16PTQPPQPSQTSTTSTQSPQP RRQQRRSSRRQ",
  752: "  9NVPOTU RTOPU RNRVR",
  753: " 28MWRKQMOPMR RRKSMUPWR RRMOQ RRMUQ RROPQ RROTQ RQQSQ RMRWR",
  754: " 26MWMRMQNOONQMSMUNVOWQWR RPNTN ROOUO RNPVP RNQVQ RMRWR",
  755: " 14LRLFLRRRLF RLIPQ RLLOR RLOMQ",
  756: " 10MWRKQMOPMR RRKSMUPWR",
  757: " 11MWWRWQVOUNSMQMONNOMQMR",
  758: " 13G]]R]P\\MZJWHTGPGMHJJHMGPGR",
  759: " 11MWMRMSNUOVQWSWUVVUWSWR",
  760: "  7LXLPNRQSSSVRXP",
  761: "  6RURUTTURTPRO",
  762: "  7RVRRUPVNVLUKTK",
  763: "  7NRRROPNNNLOKPK",
  764: " 21MWWHVGTFQFOGNHMJMLNNOOUSVTWVWXVZU[S\\P\\N[MZ",
  765: " 21G]IWHVGTGQHOINKMMMONPOTUUVWWYW[V\\U]S]P\\N[M",
  766: " 31G]RRTUUVWWYW[V\\U]S]Q\\O[NYMWMUNTOPUOVMWKWIVHUGSGQHOINKMMMONPORR",
  767: " 22H\\KFK[ RHF[FQP[Z RZV[Y\\[ RZVZY RWYZY RWYZZ\\[",
  768: " 30KYUARBPCNELHKLKRLUNWQXSXVWXUYR RKPLMNKQJSJVKXMYPYVXZV]T_R`Oa",
  796: "  3>f>RfR",
  797: "  3D`D``D",
  798: "  3RRR>Rf",
  799: "  3D`DD``",
  800: "  3D`DR`R",
  801: "  3F^FY^K",
  802: "  3KYK^YF",
  803: "  3RRRDR`",
  804: "  3KYKFY^",
  805: "  3F^FK^Y",
  806: "  3KYKRYR",
  807: "  3MWMWWM",
  808: "  3RRRKRY",
  809: "  3MWMMWW",
  810: "  8GRRGPGMHJJHMGPGR",
  811: "  8GRGRGTHWJZM\\P]R]",
  812: "  8R]R]T]W\\ZZ\\W]T]R",
  813: "  8R]]R]P\\MZJWHTGRG",
  814: "  9D`DOGQKSPTTTYS]Q`O",
  815: "  9PUUDSGQKPPPTQYS]U`",
  816: "  9OTODQGSKTPTTSYQ]O`",
  817: "  9D`DUGSKQPPTPYQ]S`U",
  818: "  5KYRJYNKVRZ",
  819: "  5JZJRNKVYZR",
  820: "  5KYKVKNYVYN",
  821: "  5JZLXJPZTXL",
  822: " 23JZJ]L]O\\Q[TXUVVSVOULTJSIQIPJOLNONSOVPXS[U\\X]Z]",
  823: " 23I]]Z]X\\U[SXPVOSNONLOJPIQISJTLUOVSVVUXT[Q\\O]L]J",
  824: " 23JZZGXGUHSIPLONNQNUOXPZQ[S[TZUXVUVQUNTLQIOHLGJG",
  825: " 23G[GJGLHOIQLTNUQVUVXUZT[S[QZPXOUNQNNOLPISHUGXGZ",
  826: " 21E[EPFRHTJUMVQVUUXSZP[NZLWLSMQNNPLSKVKYL\\M^",
  827: " 19EYETHVKWPWSVVTXQYNYLXKVKSLPNNQMTMYN\\P_",
  828: " 26OUQOOQOSQUSUUSUQSOQO RQPPQPSQTSTTSTQSPQP RRQQRRSSRRQ",
  829: " 11RWRMSMUNVOWQWSVUUVSWRW",
  830: "  9D`DRJR RORUR RZR`R",
  831: "  5D`DUDO`O`U",
  832: "  6JZRDJR RRDZR",
  833: "  9D`DR`R RJYZY RP`T`",
  834: "  9D`DR`R RDRRb R`RRb",
  840: " 18KYQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK",
  841: "  6LXLLLXXXXLLL",
  842: "  5KYRJKVYVRJ",
  843: "  6LXRHLRR\\XRRH",
  844: " 12JZRIPOJOOSMYRUWYUSZOTORI",
  845: "  6KYRKRY RKRYR",
  846: "  6MWMMWW RWMMW",
  847: "  9MWRLRX RMOWU RWOMU",
  850: " 35NVQNOONQNSOUQVSVUUVSVQUOSNQN ROQOS RPPPT RQOQU RRORU RSOSU RTPTT RUQUS",
  851: " 27NVNNNVVVVNNN ROOOU RPOPU RQOQU RRORU RSOSU RTOTU RUOUU",
  852: " 17MWRLMUWURL RROOT RROUT RRRQT RRRST",
  853: " 17LULRUWUMLR RORTU RORTO RRRTS RRRTQ",
  854: " 17MWRXWOMORX RRUUP RRUOP RRRSP RRRQP",
  855: " 17OXXROMOWXR RURPO RURPU RRRPQ RRRPS",
  856: " 22LXRLNWXPLPVWRL RRRRL RRRLP RRRNW RRRVW RRRXP",
  857: " 11RYRKRY RRKYNRQ RSMVNSO",
  860: " 13MWRLRX ROOUO RMUOWQXSXUWWU",
  861: " 11LXRLRX RLQMOWOXQ RPWTW",
  862: " 14KYMNWX RWNMX ROLLOKQ RULXOYQ",
  863: " 18I[NII[ RVI[[ RMM[[ RWMI[ RNIVI RMMWM",
  864: " 21I[RGRV RMJWP RWJMP RIVL\\ R[VX\\ RIV[V RL\\X\\",
  865: " 11G[MJSV RKPSL RG\\[\\[RG\\",
  866: " 14LXPLPPLPLTPTPXTXTTXTXPTPTLPL",
  867: " 32KYYPXNVLSKQKNLLNKQKSLVNXQYSYVXXVYT RYPWNUMSMQNPOOQOSPUQVSWUWWVYT",
  868: " 10KYRJKVYVRJ RRZYNKNRZ",
  869: " 34G]PIPGQFSFTGTI RGZHXJVKTLPLKMJOIUIWJXKXPYTZV\\X]Z RGZ]Z RQZP[Q\\S\\T[SZ",
  870: " 64JZRMRS RRSQ\\ RRSS\\ RQ\\S\\ RRMQJPHNG RQJNG RRMSJTHVG RSJVG RRMNKLKJM RPLLLJM RRMVKXKZM RTLXLZM RRMPNOOOR RRMPOOR RRMTNUOUR RRMTOUR",
  871: " 94JZRIRK RRNRP RRSRU RRYQ\\ RRYS\\ RQ\\S\\ RRGQIPJ RRGSITJ RPJRITJ RRKPNNOMN RRKTNVOWN RNOPORNTOVO RRPPSNTLTKRKSLT RRPTSVTXTYRYSXT RNTPTRSTTVT RRUPXOYMZLZKYJWJYLZ RRUTXUYWZXZYYZWZYXZ RMZOZRYUZWZ",
  872: " 40JZRYQ\\ RRYS\\ RQ\\S\\ RRYUZXZZXZUYTWTYRZOYMWLUMVJUHSGQGOHNJOMMLKMJOKRMTKTJUJXLZOZRY",
  873: " 32JZRYQ\\ RRYS\\ RQ\\S\\ RRYVXVVXUXRZQZLYIXHVHTGPGNHLHKIJLJQLRLUNVNXRY",
  874: " 15I[IPKR RLKNP RRGRO RXKVP R[PYR",
  899: "  6QSRQQRRSSRRQ",
  900: " 10PTQPPQPSQTSTTSTQSPQP",
  901: " 14NVQNOONQNSOUQVSVUUVSVQUOSNQN",
  902: " 18MWQMONNOMQMSNUOVQWSWUVVUWSWQVOUNSMQM",
  903: " 18KYQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK",
  904: " 22G]PGMHJJHMGPGTHWJZM\\P]T]W\\ZZ\\W]T]P\\MZJWHTGPG",
  905: " 34AcPALBJCGEEGCJBLAPATBXCZE]G_JaLbPcTcXbZa]__]aZbXcTcPbLaJ_G]EZCXBTAPA",
  906: " 34<hP<K=G?DAAD?G=K<P<T=Y?]A`DcGeKgPhThYg]e`cc`e]gYhThPgKeGcD`A]?Y=T<P<",
  907: " 50){O)I*E+@-;073370;-@+E*I)O)U*[+_-d0i3m7q;t@wEyIzO{U{[z_ydwitmqqmtiwdy_z[{U{OzIyEw@t;q7m3i0d-_+[*U)O)",
  908: " 34>fRAPCMDJDGCEA>H@JAMAZB]D_G`M`PaRc RRATCWDZD]C_AfHdJcMcZb]`_]`W`TaRc",
  909: " 33AcRAPCMDJDGCEABGAKAPBTDXG\\L`Rc RRATCWDZD]C_AbGcKcPbT`X]\\X`Rc RBHbH",
  997: "  3MWMXWX",
  998: "  3JZJZZZ",
  999: "  3JZJ]Z]",
  1001: " 18KYRKMX RRNVX RRKWX ROTTT RKXPX RTXYX",
  1002: " 35JZNKNX ROKOX RLKSKVLWNVPSQ RSKULVNUPSQ ROQSQVRWTWUVWSXLX RSQURVTVUUWSX",
  1003: " 24KYVLWKWOVLTKQKOLNMMPMSNVOWQXTXVWWU RQKOMNPNSOVQX",
  1004: " 26JZNKNX ROKOX RLKSKVLWMXPXSWVVWSXLX RSKULVMWPWSVVUWSX",
  1005: " 22JYNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXVXVTUX",
  1006: " 20JXNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXQX",
  1007: " 36K[VLWKWOVLTKQKOLNMMPMSNVOWQXTXVW RQKOMNPNSOVQX RTXUWVU RVSVX RWSWX RTSYS",
  1008: " 27J[NKNX ROKOX RVKVX RWKWX RLKQK RTKYK ROQVQ RLXQX RTXYX",
  1009: " 12NWRKRX RSKSX RPKUK RPXUX",
  1010: " 19LXSKSURWQX RTKTUSWQXPXNWMUNTOUNV RQKVK",
  1011: " 27JZNKNX ROKOX RWKOS RQQVX RRQWX RLKQK RTKYK RLXQX RTXYX",
  1012: " 14KXOKOX RPKPX RMKRK RMXWXWTVX",
  1013: " 30I\\MKMX RNNRX RNKRU RWKRX RWKWX RXKXX RKKNK RWKZK RKXOX RUXZX",
  1014: " 21JZNKNX ROMVX ROKVV RVKVX RLKOK RTKXK RLXPX",
  1015: " 32KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK",
  1016: " 25JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX",
  1017: " 47KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK RPWPUQTSTTUUZV[W[XZ RTUUXVZW[",
  1018: " 37JZNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX RSRTSUWVXWXXW RSRUSVWWX",
  1019: " 32KZVMWKWOVMULSKQKOLNMNOOPQQTRVSWT RNNOOQPTQVRWSWVVWTXRXPWOVNTNXOV",
  1020: " 16KZRKRX RSKSX RNKMOMKXKXOWK RPXUX",
  1021: " 20J[NKNUOWQXTXVWWUWK ROKOUPWQX RLKQK RUKYK",
  1022: " 15KYMKRX RNKRU RWKRX RKKPK RTKYK",
  1023: " 24I[LKOX RMKOT RRKOX RRKUX RSKUT RXKUX RJKOK RVKZK",
  1024: " 21KZNKVX ROKWX RWKNX RLKQK RTKYK RLXQX RTXYX",
  1025: " 20LYNKRRRX ROKSR RWKSRSX RLKQK RTKYK RPXUX",
  1026: " 16LYVKNX RWKOX ROKNONKWK RNXWXWTVX",
  1027: " 18KYRKMX RRNVX RRKWX ROTTT RKXPX RTXYX",
  1028: " 35JZNKNX ROKOX RLKSKVLWNVPSQ RSKULVNUPSQ ROQSQVRWTWUVWSXLX RSQURVTVUUWSX",
  1029: " 14KXOKOX RPKPX RMKWKWOVK RMXRX",
  1030: " 15KYRKLX RRMWX RRKXX RMWVW RLXXX",
  1031: " 22JYNKNX ROKOX RSOSS RLKVKVOUK ROQSQ RLXVXVTUX",
  1032: " 16LYVKNX RWKOX ROKNONKWK RNXWXWTVX",
  1033: " 27J[NKNX ROKOX RVKVX RWKWX RLKQK RTKYK ROQVQ RLXQX RTXYX",
  1034: " 44KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK RQOQT RTOTT RQQTQ RQRTR",
  1035: " 12NWRKRX RSKSX RPKUK RPXUX",
  1036: " 27JZNKNX ROKOX RWKOS RQQVX RRQWX RLKQK RTKYK RLXQX RTXYX",
  1037: " 15KYRKMX RRNVX RRKWX RKXPX RTXYX",
  1038: " 30I\\MKMX RNNRX RNKRU RWKRX RWKWX RXKXX RKKNK RWKZK RKXOX RUXZX",
  1039: " 21JZNKNX ROMVX ROKVV RVKVX RLKOK RTKXK RLXPX",
  1040: " 36JZMJLM RXJWM RPPOS RUPTS RMVLY RXVWY RMKWK RMLWL RPQTQ RPRTR RMWWW RMXWX",
  1041: " 32KZQKOLNMMPMSNVOWQXTXVWWVXSXPWMVLTKQK RQKOMNPNSOVQX RTXVVWSWPVMTK",
  1042: " 21J[NKNX ROKOX RVKVX RWKWX RLKYK RLXQX RTXYX",
  1043: " 25JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXQX",
  1044: " 20K[MKRQ RNKSQMX RMKWKXOVK RNWWW RMXWXXTVX",
  1045: " 16KZRKRX RSKSX RNKMOMKXKXOWK RPXUX",
  1046: " 33KZMONLOKPKQLRORX RXOWLVKUKTLSOSX RMONMOLPLQMRO RXOWMVLULTMSO RPXUX",
  1047: " 40KZRKRX RSKSX RQNNOMQMRNTQUTUWTXRXQWOTNQN RQNOONQNROTQU RTUVTWRWQVOTN RPKUK RPXUX",
  1048: " 21KZNKVX ROKWX RWKNX RLKQK RTKYK RLXQX RTXYX",
  1049: " 33J[RKRX RSKSX RLPMONOOSQU RTUVSWOXOYP RMONROTQUTUVTWRXO RPKUK RPXUX",
  1050: " 35KZMVNXQXMRMONMOLQKTKVLWMXOXRTXWXXV ROUNRNOOMQK RTKVMWOWRVU RNWPW RUWWW",
  1051: " 18KYTKKX RSMTX RTKUX RNTTT RIXNX RRXWX",
  1052: " 34JYPKLX RQKMX RNKUKWLWNVPSQ RUKVLVNUPSQ ROQRQTRUSUUTWQXJX RRQTSTUSWQX",
  1053: " 25KXVLWLXKWNVLTKRKPLOMNOMRMUNWPXRXTWUU RRKPMOONRNVPX",
  1054: " 26JYPKLX RQKMX RNKTKVLWNWQVTUVTWQXJX RTKULVNVQUTTVSWQX",
  1055: " 22JYPKLX RQKMX RSORS RNKXKWNWK ROQRQ RJXTXUUSX",
  1056: " 20JXPKLX RQKMX RSORS RNKXKWNWK ROQRQ RJXOX",
  1057: " 33KYVLWLXKWNVLTKRKPLOMNOMRMUNWPXRXTWUVVS RRKPMOONRNVPX RRXTVUS RSSXS",
  1058: " 27J[PKLX RQKMX RXKTX RYKUX RNKSK RVK[K ROQVQ RJXOX RRXWX",
  1059: " 12NWTKPX RUKQX RRKWK RNXSX",
  1060: " 19LXUKRUQWPX RVKSURWPXOXMWLUMTNUMV RSKXK",
  1061: " 27JZPKLX RQKMX RYKOR RRPTX RSPUX RNKSK RVK[K RJXOX RRXWX",
  1062: " 14KXQKMX RRKNX ROKTK RKXUXVUTX",
  1063: " 30I\\OKKX ROMPX RPKQV RYKPX RYKUX RZKVX RMKPK RYK\\K RIXMX RSXXX",
  1064: " 21JZPKLX RPKTX RQKTU RXKTX RNKQK RVKZK RJXNX",
  1065: " 32KYRKPLOMNOMRMUNWPXRXTWUVVTWQWNVLTKRK RRKPMOONRNVPX RRXTVUTVQVMTK",
  1066: " 24JYPKLX RQKMX RNKUKWLXMXOWQTROR RUKWMWOVQTR RJXOX",
  1067: " 46KYRKPLOMNOMRMUNWPXRXTWUVVTWQWNVLTKRK RRKPMOONRNVPX RRXTVUTVQVMTK ROWOVPUQURVRZS[T[UZ RRVSZT[",
  1068: " 35JZPKLX RQKMX RNKUKWLXMXOWQTROR RUKWMWOVQTR RSRTWUXVXWW RSRTSUWVX RJXOX",
  1069: " 28KZWLXLYKXNWLUKRKPLOMOOPPUSVT RONPOURVSVVUWSXPXNWMULXMWNW",
  1070: " 16KZTKPX RUKQX RPKNNOKZKYNYK RNXSX",
  1071: " 20J[PKMUMWOXSXUWVUYK RQKNUNWOX RNKSK RWK[K",
  1072: " 15KYOKPX RPKQV RYKPX RMKRK RVK[K",
  1073: " 24I[NKMX ROKNV RTKMX RTKSX RUKTV RZKSX RLKQK RXK\\K",
  1074: " 21KZPKTX RQKUX RYKLX RNKSK RVK[K RJXOX RRXWX",
  1075: " 20LYPKRQPX RQKSQ RYKSQQX RNKSK RVK[K RNXSX",
  1076: " 16LYXKLX RYKMX RQKONPKYK RLXUXVUTX",
  1101: " 32LZQOPPPQOQOPQOTOVQVWWXXX RTOUQUWWX RURRSPTOUOWPXSXTWUU RRSPUPWQX",
  1102: " 29JYNKNX ROKOX RORPPROTOVPWRWUVWTXRXPWOU RTOUPVRVUUWTX RLKOK",
  1103: " 24LXVQUQURVRVQUPSOQOOPNRNUOWQXSXUWVV RQOPPOROUPWQX",
  1104: " 32L[VKVX RWKWX RVRUPSOQOOPNRNUOWQXSXUWVU RQOPPOROUPWQX RTKWK RVXYX",
  1105: " 26LXOSVSVRUPSOQOOPNRNUOWQXSXUWVV RUSUQSO RQOPPOROUPWQX",
  1106: " 20LWTKULUMVMVLTKRKPMPX RRKQMQX RNOSO RNXSX",
  1107: " 42LYQOOQOSQUSUUSUQSOQO RQOPQPSQU RSUTSTQSO RTPUOVO RPTOUOXPYTYVZ ROWPXTXVYV[T\\P\\N[NYPX",
  1108: " 28J[NKNX ROKOX RORPPROTOVPWRWX RTOUPVRVX RLKOK RLXQX RTXYX",
  1109: " 18NWRKRLSLSKRK RRORX RSOSX RPOSO RPXUX",
  1110: " 23NWSKSLTLTKSK RSOSZR\\ RTOTZR\\P\\O[OZPZP[O[ RQOTO",
  1111: " 27JZNKNX ROKOX RWOOU RRSVX RSSWX RLKOK RTOYO RLXQX RTXYX",
  1112: " 12NWRKRX RSKSX RPKSK RPXUX",
  1113: " 44F_JOJX RKOKX RKRLPNOPORPSRSX RPOQPRRRX RSRTPVOXOZP[R[X RXOYPZRZX RHOKO RHXMX RPXUX RXX]X",
  1114: " 28J[NONX ROOOX RORPPROTOVPWRWX RTOUPVRVX RLOOO RLXQX RTXYX",
  1115: " 28LYQOOPNRNUOWQXTXVWWUWRVPTOQO RQOPPOROUPWQX RTXUWVUVRUPTO",
  1116: " 32JYNON\\ ROOO\\ RORPPROTOVPWRWUVWTXRXPWOU RTOUPVRVUUWTX RLOOO RL\\Q\\",
  1117: " 29KYUOU\\ RVOV\\ RURTPROPONPMRMUNWPXRXTWUU RPOOPNRNUOWPX RS\\X\\",
  1118: " 22KXOOOX RPOPX RPRQPSOUOVPVQUQUPVP RMOPO RMXRX",
  1119: " 26LYTOUPUQVQVPTOQOOPORQSTTVU ROQQRTSVTVWTXQXOWOVPVPWQX",
  1120: " 14LWPKPVRXTXUWUV RQKQVRX RNOTO",
  1121: " 28J[NONUOWQXSXUWVU ROOOUPWQX RVOVX RWOWX RLOOO RTOWO RVXYX",
  1122: " 15KYNORX ROORV RVORX RLOQO RTOXO",
  1123: " 24I[LOOX RMOOU RROOX RROUX RSOUU RXOUX RJOOO RVOZO",
  1124: " 21KYNOUX ROOVX RVONX RLOQO RTOXO RLXPX RSXXX",
  1125: " 23KYNORX ROORV RVORXP[N\\M\\L[LZMZM[L[ RLOQO RTOXO",
  1126: " 16LXUONX RVOOX ROONQNOVO RNXVXVVUX",
  1127: " 32K[QOOPNQMSMUNWPXQXSWUUWRXO RQOOQNSNUOWPX RQOSOUPWWXX RSOTPVWXXYX",
  1128: " 40KXRKPMOOMUK\\ RQLPNNTL\\ RRKTKVLVNUPRQ RTKULUNTPRQ RRQTRUTUVTWRXQXOWNT RRQSRTTTVRX",
  1129: " 19KYLQNOPORPSSSXR\\ RLQNPPPRQSS RWOVRSXQ\\",
  1130: " 39KYSOQOOPNQMSMUNWPXRXTWUVVTVRUPRNQLQKRJTJUKVM RQOOQNSNVPX RRXTVUTUQSO RQLRKTKVM",
  1131: " 27LXVPTOQOOPOQPRRS RQOPPPQRS RRSOTNUNWPXSXUW RRSPTOUOWPX",
  1132: " 28LWRKQLQMSNVNVMSNPOOPNRNTOVPWRXSYS[R\\P\\O[ RSNQOPPOROTPVRX",
  1133: " 26IYJRKPLONOOPOQMX RMONPNQLX ROQPPROTOVPVRS\\ RTOUPURR\\",
  1134: " 35IYJSKQLPNPOQOVPX RMPNQNUOWPXQXSWTVUTVQVNULTKRKQLQNRPURWS RQXSVTTUQUNTK",
  1135: " 13NWROPVPWQXSXUWVU RSOQVQWRX",
  1136: " 26KYOOLX RPOMX RUOVPWPVOTORQOR RORPSRWTXVWWU RORQSSWTX",
  1137: " 15LXLKNKPLWX RNKOLVX RRPMX RRPNX",
  1138: " 26KZOOK\\ RPOL\\ RNUNWOXQXSWTV RVOTVTWUXWXXWYU RWOUVUWVX",
  1139: " 19JYNOMX ROONUMX RVRVOWOVRTUQWNXMX RLOOO",
  1140: " 36MXRKQLQMSNVN RTNQOPPPRRSUS RTNROQPQRRS RSSPTOUOWQXSYTZT[S\\Q\\ RSSQTPUPWQX",
  1141: " 28KXQOOPNQMSMUNWPXRXTWUVVTVRUPSOQO RQOOQNSNVPX RRXTVUTUQSO",
  1142: " 20IZPPMX RPPNX RTPSX RTPTX RKQMOXO RKQMPXP",
  1143: " 29JXSOQOOPNQMSJ\\ RQOOQNSK\\ RSOUPVRVTUVTWRXPXNWMU RSOUQUTTVRX",
  1144: " 28K[YOQOOPNQMSMUNWPXRXTWUVVTVRUPYP RQOOQNSNVPX RRXTVUTUQSO",
  1145: " 14KZSPQX RSPRX RMQOOXO RMQOPXP",
  1146: " 24JXKRLPMOOOPPPROUOWPX RNOOPORNUNWPXQXSWUUVRVOUOVP",
  1147: " 35KZOPNQMSMUNWPXRXUWWUXRXPWOUOTPSRRUO\\ RMUNVPWRWUVWTXR RXQWPUPSR RRUQXP\\",
  1148: " 17KXMONOPPS[T\\ RNOOPR[T\\U\\ RVOTRNYL\\",
  1149: " 28I[TKQ\\ RUKP\\ RJRKPLONOOPOVPWSWUVWT RMONPNTOWPXSXUWWTXRYO",
  1150: " 36JZNPPPPONPMQLSLUMWNXPXQWRUSR RLUNWPWRU RRRRWSXUXWVXTXRWPVOVPWP RRUSWUWWV",
  1151: " 32KZVOTVTWUXWXXWYU RWOUVUWVX RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX",
  1152: " 32JXOKMR RPKNRNVPX RNROPQOSOUPVRVTUVTWRXPXNWMUMR RSOUQUTTVRX RMKPK",
  1153: " 22KXUPUQVQUPSOQOOPNQMSMUNWPXRXTWUV RQOOQNSNVPX",
  1154: " 35KZWKTVTWUXWXXWYU RXKUVUWVX RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX RUKXK",
  1155: " 23KWNURTTSURUPSOQOOPNQMSMUNWPXRXTWUV RQOOQNSNVPX",
  1156: " 23MXWKXLXKVKTLSNPYO[N\\ RVKULTNQYP[N\\L\\L[M\\ RPOVO",
  1157: " 34KYVOTVSYR[ RWOUVTYR[P\\M\\L[M[N\\ RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX",
  1158: " 29KZPKLX RQKMX ROQPPROTOVPVRUUUWVX RTOUPURTUTWUXWXXWYU RNKQK",
  1159: " 26MWSKSLTLTKSK RNROPPOROSPSRRURWSX RQORPRRQUQWRXTXUWVU",
  1160: " 26MWTKTLULUKTK RORPPQOSOTPTRRYQ[O\\M\\M[N\\ RROSPSRQYP[O\\",
  1161: " 32KXPKLX RQKMX RVPUQVQVPUOTORQPROR RORPSQWRXTXUWVU RORQSRWSX RNKQK",
  1162: " 16NVSKPVPWQXSXTWUU RTKQVQWRX RQKTK",
  1163: " 46F^GRHPIOKOLPLQJX RJOKPKQIX RLQMPOOQOSPSQQX RQORPRQPX RSQTPVOXOZPZRYUYWZX RXOYPYRXUXWYX[X\\W]U",
  1164: " 33J[KRLPMOOOPPPQNX RNOOPOQMX RPQQPSOUOWPWRVUVWWX RUOVPVRUUUWVXXXYWZU",
  1165: " 28KXQOOPNQMSMUNWPXRXTWUVVTVRUPSOQO RQOOQNSNVPX RRXTVUTUQSO",
  1166: " 35JYKRLPMOOOPPPQM\\ RNOOPOQL\\ RPQROTOVPWRWTVVUWSXQXOVOT RTOVQVTUVSX RJ\\O\\",
  1167: " 28KYVOR\\ RWOS\\ RUSUQSOQOOPNQMSMUNWPXRXTV RQOOQNSNVPX RP\\U\\",
  1168: " 22LXMRNPOOQORPRQPX RPOQPQQOX RRQSPUOVOWPWQVQWP",
  1169: " 24LYVPVQWQVPTOQOOPORQSTTVU ROQQRTSVTVWTXQXOWNVOVOW",
  1170: " 16NWSKPVPWQXSXTWUU RTKQVQWRX RPOUO",
  1171: " 33IZJRKPLONOOPORNUNWOX RMONPNRMUMWOXQXSWTV RVOTVTWUXWXXWYU RWOUVUWVX",
  1172: " 24JXKRLPMOOOPPPROUOWPX RNOOPORNUNWPXQXSWUUVRVOUOVP",
  1173: " 37H\\IRJPKOMONPNRMUMWNX RLOMPMRLULWNXOXQWRV RTORVRWTX RUOSVSWTXUXWWYUZRZOYOZP",
  1174: " 38JZMRNPPOROSPSR RQORPRRQUPWNXMXLWLVMVLW RXPWQXQXPWOVOTPSRRURWSX RQUQWRXTXVWWU",
  1175: " 35IYJRKPLONOOPORNUNWOX RMONPNRMUMWOXQXSWTV RVOTVSYR[ RWOUVTYR[P\\M\\L[M[N\\",
  1176: " 27KYWOWPVQNVMWMX RNQOOROUQ ROPRPUQVQ RNVOVRWUW ROVRXUXVV",
  1177: " 39H[RKSLSMTMTLRKOKMLLNLX ROKNLMNMX RXKYLYMZMZLXKVKTMTX RVKUMUX RJOWO RJXOX RRXWX",
  1178: " 29J[UKVLWLWKQKOLNNNX RQKPLONOX RVOVX RWOWX RLOWO RLXQX RTXYX",
  1179: " 27J[WKQKOLNNNX RQKPLONOX RUKVLVX RWKWX RLOVO RLXQX RTXYX",
  1180: " 48F_PKQLQMRMRLPKMKKLJNJX RMKLLKNKX RYKZL[L[KUKSLRNRX RUKTLSNSX RZOZX R[O[X RHO[O RHXMX RPXUX RXX]X",
  1181: " 46F_PKQLQMRMRLPKMKKLJNJX RMKLLKNKX R[KUKSLRNRX RUKTLSNSX RYKZLZX R[K[X RHOZO RHXMX RPXUX RXX]X",
  1182: " 12NWRORX RSOSX RPOSO RPXUX",
  1184: " 21LXVPTOROPPOQNSNUOWQXSXUW RROPQOSOVQX ROSSS",
  1185: " 35LYSKQLPMOONRNUOWPXRXTWUVVTWQWNVLUKSK RSKQMPOOSOVPX RRXTVUTVPVMUK ROQVQ",
  1186: " 34KZTKQ\\ RUKP\\ RQONPMRMUNWQXTXWWXUXRWPTOQO RQOOPNRNUOWQX RTXVWWUWRVPTO",
  1187: " 22LXUPVRVQUPSOQOOPNRNTOVRX RQOOQOTPVRXSYS[R\\P\\",
  1191: " 45I[VKWLXLVKSKQLPMOOLYK[J\\ RSKQMPOMYL[J\\H\\H[I\\ RZK[L[KYKWLVNSYR[Q\\ RYKXLWNTYS[Q\\O\\O[P\\ RLOYO",
  1192: " 38IZVKWLXLXKSKQLPMOOLYK[J\\ RSKQMPOMYL[J\\H\\H[I\\ RVOTVTWUXWXXWYU RWOUVUWVX RLOWO",
  1193: " 38IZVKWL RXKSKQLPMOOLYK[J\\ RSKQMPOMYL[J\\H\\H[I\\ RWKTVTWUXWXXWYU RXKUVUWVX RLOVO",
  1194: " 63F^SKTLTM RULSKPKNLMMLOIYH[G\\ RPKNMMOJYI[G\\E\\E[F\\ RZK[L\\L\\KWKUL RTMSOPYO[N\\ RWKUMTOQYP[N\\L\\L[M\\ RZOXVXWYX[X\\W]U R[OYVYWZX RIO[O",
  1195: " 63F^SKTLTM RULSKPKNLMMLOIYH[G\\ RPKNMMOJYI[G\\E\\E[F\\ RZK[L R\\KWKUL RTMSOPYO[N\\ RWKUMTOQYP[N\\L\\L[M\\ R[KXVXWYX[X\\W]U R\\KYVYWZX RIOZO",
  1196: " 20MWNROPPOROSPSRRURWSX RQORPRRQUQWRXTXUWVU",
  1200: " 28LYQKOLNONTOWQXTXVWWTWOVLTKQK RQKPLOOOTPWQX RTXUWVTVOULTK",
  1201: " 10LYPNSKSX RRLRX ROXVX",
  1202: " 35LYOMONNNNMOLQKTKVLWNVPTQQROSNUNX RTKULVNUPTQ RNWOVPVSWVWWV RPVSXVXWVWU",
  1203: " 39LYOMONNNNMOLQKTKVLWNVPTQ RTKULVNUPTQ RRQTQVRWTWUVWTXQXOWNVNUOUOV RTQURVTVUUWTX",
  1204: " 13LYSMSX RTKTX RTKMTXT RQXVX",
  1205: " 33LYOKNQ ROKVK ROLSLVK RNQOPQOTOVPWRWUVWTXQXOWNVNUOUOV RTOUPVRVUUWTX",
  1206: " 36LYVMVNWNWMVLTKRKPLOMNPNUOWQXTXVWWUWSVQTPQPNR RRKPMOPOUPWQX RTXUWVUVSUQTP",
  1207: " 22LYNKNO RVMRTPX RWKTQQX RNMPKRKUM RNMPLRLUMVM",
  1208: " 51LYQKOLNNOPQQTQVPWNVLTKQK RQKPLONPPQQ RTQUPVNULTK RQQORNTNUOWQXTXVWWUWTVRTQ RQQPROTOUPWQX RTXUWVUVTURTQ",
  1209: " 36LYOVOUNUNVOWQXSXUWVVWSWNVLTKQKOLNNNPORQSTSWQ RSXUVVSVNULTK RQKPLONOPPRQS",
  1210: "  6NVRVQWRXSWRV",
  1211: "  8NVSWRXQWRVSWSYQ[",
  1212: " 12NVROQPRQSPRO RRVQWRXSWRV",
  1213: " 14NVROQPRQSPRO RSWRXQWRVSWSYQ[",
  1214: " 15NVRKQLRSSLRK RRLRO RRVQWRXSWRV",
  1215: " 29LYNNONOONONNOLQKTKVLWNWOVQSRRSRTST RTKVMVPUQSR RRWRXSXSWRW",
  1216: "  6OVRKRP RSKRP",
  1217: " 12LXOKOP RPKOP RUKUP RVKUP",
  1218: " 10MWQKPLPNQOSOTNTLSKQK",
  1219: "  9MWRJRP ROKUO RUKOO",
  1220: "  3KZXHM\\",
  1221: " 16MWUHSJQMPPPTQWSZU\\ RSJRLQPQTRXSZ",
  1222: " 16MWOHQJSMTPTTSWQZO\\ RQJRLSPSTRXQZ",
  1223: " 12MWPHP\\ RQHQ\\ RPHUH RP\\U\\",
  1224: " 12MWSHS\\ RTHT\\ ROHTH RO\\T\\",
  1225: " 38LWSHQIPJPLRNSP RQIPL RSNRQ RPJQLSNSPRQPRRSSTSVQXPZ RRSSV RPXQ[ RSTRVPXPZQ[S\\",
  1226: " 38MXQHSITJTLRNQP RSITL RQNRQ RTJSLQNQPRQTRRSQTQVSXTZ RRSQV RTXS[ RQTRVTXTZS[Q\\",
  1227: "  4MWTHPRT\\",
  1228: "  4MWPHTRP\\",
  1229: "  3OURHR\\",
  1230: "  6MWPHP\\ RTHT\\",
  1231: "  3I[LRXR",
  1232: "  6I[RLRX RLRXR",
  1233: "  9JZRMRX RMRWR RMXWX",
  1234: "  9JZRMRX RMMWM RMRWR",
  1235: "  6JZMMWW RWMMW",
  1236: "  6NVRQQRRSSRRQ",
  1237: " 15I[RLQMRNSMRL RLRXR RRVQWRXSWRV",
  1238: "  6I[LPXP RLTXT",
  1239: "  9I[WLMX RLPXP RLTXT",
  1240: "  9I[LNXN RLRXR RLVXV",
  1241: "  4JZWLMRWX",
  1242: "  4JZMLWRMX",
  1243: " 10JZWKMOWS RMTWT RMXWX",
  1244: " 10JZMKWOMS RMTWT RMXWX",
  1245: " 21H[YUWUUTTSRPQOONNNLOKQKRLTNUOUQTRSTPUOWNYN",
  1246: " 16JZLTLRMPOPUSWSXR RLRMQOQUTWTXRXP",
  1247: "  8JZMSRPWS RMSRQWS",
  1248: "  7NVSKPO RSKTLPO",
  1249: "  7NVQKTO RQKPLTO",
  1250: " 14LXNKOMQNSNUMVK RNKONQOSOUNVK",
  1251: "  8NVSLRMQLRKSLSNQP",
  1252: "  8NVSKQMQORPSORNQO",
  1253: "  8NVQLRMSLRKQLQNSP",
  1254: "  8NVQKSMSORPQORNSO",
  1256: " 11JZWMQMONNOMQMSNUOVQWWW",
  1257: " 11JZMMMSNUOVQWSWUVVUWSWM",
  1258: " 11JZMMSMUNVOWQWSVUUVSWMW",
  1259: " 11JZMWMQNOONQMSMUNVOWQWW",
  1260: " 14JZWMQMONNOMQMSNUOVQWWW RMRUR",
  1261: " 13I[TOUPXRUTTU RUPWRUT RLRWR",
  1262: " 13MWRMRX ROPPORLTOUP RPORMTO",
  1263: " 13I[POOPLROTPU ROPMROT RMRXR",
  1264: " 13MWRLRW ROTPURXTUUT RPURWTU",
  1265: " 37KYVSUPSOQOOPNQMSMUNWPXRXTWUVVTWQWNVLTKQKPLQLRK RQOOQNSNVPX RRXTVUTVQVNULTK",
  1266: " 15JZLKRX RMKRV RXKRX RLKXK RNLWL",
  1267: " 10G[IOLORW RKORX R[FRX",
  1268: " 26I[XIXJYJYIXHVHTJSLROQUPYO[ RUITKSORUQXPZN\\L\\K[KZLZL[",
  1269: " 40I[XIXJYJYIXHVHTJSLROQUPYO[ RUITKSORUQXPZN\\L\\K[KZLZL[ RQNOONQNSOUQVSVUUVSVQUOSNQN",
  1270: " 26H\\ZRYTWUVUTTSSQPPONNMNKOJQJRKTMUNUPTQSSPTOVNWNYOZQZR",
  1271: " 26JZXKLX ROKPLPNOOMOLNLLMKOKSLVLXK RUTTUTWUXWXXWXUWTUT",
  1272: " 41J[YPXPXQYQYPXOWOVPUTTVSWQXOXMWLVLTMSORRPSNSLRKPKOLONPQUWWXXXYW ROXMVMTOR RONPPVWWX",
  1273: " 29J[UPSOQOPQPRQTSTUS RUOUSVTXTYRYQXNVLSKRKOLMNLQLRMUOWRXSXVW",
  1274: " 34KZQHQ\\ RTHT\\ RWLVLVMWMWLUKPKNLNNOPVSWT RNNOOVRWTWVVWTXQXOWNVNUOUOVNV",
  1275: " 12KYRKN\\ RVKR\\ RNQWQ RMVVV",
  1276: " 40LXTLSLSMTMTLSKQKPLPNQPTRUS RPNQOTQUSUUSW RQPOROTPVSXTY ROTPUSWTYT[S\\Q\\P[PZQZQ[P[",
  1277: " 29LXRKQLRMSLRK RRMRQ RRQQSRVSSRQ RRVR\\ RPOONNOOPPOTOUNVOUPTO",
  1278: " 42LXRMSLRKQLRMRQQRSURV RRQSRQURVRZQ[R\\S[RZ RPOONNOOPPOTOUNVOUPTO RPXOWNXOYPXTXUWVXUYTX",
  1279: " 12LYVKVX RNKVK RQQVQ RNXVX",
  1281: " 24H\\QKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK RRQQRRSSRRQ",
  1282: " 33LYQKPLPMQN RTKULUMTN RRNPOOQORPTRUSUUTVRVQUOSNRN RRURY RSUSY ROWVW",
  1283: " 23LYRKPLONOOPQRRSRUQVOVNULSKRK RRRRX RSRSX ROUVU",
  1284: " 24H\\QKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK RRKRY RKRYR",
  1285: " 25JYRRPQOQMRLTLUMWOXPXRWSUSTRR RWMRR RRMWMWR RRMVNWR",
  1286: " 25JZLLMKOKQLRNRPQRPSNT ROKPLQNQQPS RVKUX RWKTX RNTXT",
  1287: " 27JYNKNU ROKNR RNROPQOSOUPVQVTTVTXUYVYWX RSOUQUTTV RLKOK",
  1288: " 27LYONRKRQ RVNSKSQ RRQPROTOUPWRXSXUWVUVTURSQ RRTRUSUSTRT",
  1289: " 27JZRKRY RMKMPNRPSTSVRWPWK RLMMKNM RQMRKSM RVMWKXM ROVUV",
  1290: " 27JYNKNX ROKOX RLKSKVLWNWOVQSROR RSKULVNVOUQSR RLXVXVUUX",
  1291: " 20LYWKTKQLONNQNSOVQXTYWY RWKTLRNQQQSRVTXWY",
  1292: " 23JZRRPQOQMRLTLUMWOXPXRWSUSTRR RSLQQ RWMRR RXQSS",
  1293: " 12KYPMTW RTMPW RMPWT RWPMT",
  1294: " 34J[OUMULVLXMYOYPXPVNTMRMONMOLQKTKVLWMXOXRWTUVUXVYXYYXYVXUVU RNMPLULWM",
  1295: " 34J[OOMOLNLLMKOKPLPNNPMRMUNWOXQYTYVXWWXUXRWPUNULVKXKYLYNXOVO RNWPXUXWW",
  1401: " 21F^KHK\\ RLHL\\ RXHX\\ RYHY\\ RHH\\H RH\\O\\ RU\\\\\\",
  1402: " 20H]KHRQJ\\ RJHQQ RJHYHZMXH RK[X[ RJ\\Y\\ZWX\\",
  1403: " 20KYVBTDRGPKOPOTPYR]T`Vb RTDRHQKPPPTQYR\\T`",
  1404: " 20KYNBPDRGTKUPUTTYR]P`Nb RPDRHSKTPTTSYR\\P`",
  1405: " 12KYOBOb RPBPb ROBVB RObVb",
  1406: " 12KYTBTb RUBUb RNBUB RNbUb",
  1407: " 40KYTBRCQDPFPHQJRKSMSOQQ RRCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra RQSSUSWRYQZP\\P^Q`RaTb",
  1408: " 40KYPBRCSDTFTHSJRKQMQOSQ RRCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra RSSQUQWRYSZT\\T^S`RaPb",
  1409: " 24KYU@RCPFOIOLPOSVTYT\\S_Ra RRCQEPHPKQNTUUXU[T^RaOd",
  1410: " 24KYO@RCTFUIULTOQVPYP\\Q_Ra RRCSETHTKSNPUOXO[P^RaUd",
  1411: " 13AXCRGRR` RGSRa RFSRb RX:Rb",
  1412: " 32F^[CZD[E\\D\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia",
  2001: " 18H\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[",
  2002: " 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[",
  2003: " 32G\\XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXXYV RQFOGMILKKNKSLVMXOZQ[",
  2004: " 30G]LFL[ RMFM[ RIFSFVGXIYKZNZSYVXXVZS[I[ RSFUGWIXKYNYSXVWXUZS[",
  2005: " 22G\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[",
  2006: " 20G[LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[P[",
  2007: " 40G^XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXX RQFOGMILKKNKSLVMXOZQ[ RXSX[ RYSY[ RUS\\S",
  2008: " 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RLPXP RH[O[ RU[\\[",
  2009: " 12MXRFR[ RSFS[ ROFVF RO[V[",
  2010: " 20KZUFUWTZR[P[NZMXMVNUOVNW RTFTWSZR[ RQFXF",
  2011: " 27F\\KFK[ RLFL[ RYFLS RQOY[ RPOX[ RHFOF RUF[F RH[O[ RU[[[",
  2012: " 14I[NFN[ ROFO[ RKFRF RK[Z[ZUY[",
  2013: " 30F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][",
  2014: " 21G^LFL[ RMFYY RMHY[ RYFY[ RIFMF RVF\\F RI[O[",
  2015: " 44G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF",
  2016: " 29G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[",
  2017: " 64G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF RNYNXOVQURUTVUXV_W`Y`Z^Z] RUXV\\W^X_Y_Z^",
  2018: " 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUPMP RUFWGXHYJYLXNWOUP RI[P[ RRPTQURXYYZZZ[Y RTQUSWZX[Z[[Y[X",
  2019: " 34H\\XIYFYLXIVGSFPFMGKIKKLMMNOOUQWRYT RKKMMONUPWQXRYTYXWZT[Q[NZLXKUK[LX",
  2020: " 16I\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[",
  2021: " 23F^KFKULXNZQ[S[VZXXYUYF RLFLUMXOZQ[ RHFOF RVF\\F",
  2022: " 15H\\KFR[ RLFRX RYFR[ RIFOF RUF[F",
  2023: " 24F^JFN[ RKFNV RRFN[ RRFV[ RSFVV RZFV[ RGFNF RWF]F",
  2024: " 21H\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[",
  2025: " 20H]KFRQR[ RLFSQS[ RZFSQ RIFOF RVF\\F RO[V[",
  2026: " 16H\\XFK[ RYFL[ RLFKLKFYF RK[Y[YUX[",
  2027: " 18H\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[",
  2028: " 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[",
  2029: " 14I[NFN[ ROFO[ RKFZFZLYF RK[R[",
  2030: " 15H\\RFJ[ RRFZ[ RRIY[ RKZYZ RJ[Z[",
  2031: " 22G\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[",
  2032: " 16H\\XFK[ RYFL[ RLFKLKFYF RK[Y[YUX[",
  2033: " 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RLPXP RH[O[ RU[\\[",
  2034: " 56G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF ROMOT RUMUT ROPUP ROQUQ",
  2035: " 12MXRFR[ RSFS[ ROFVF RO[V[",
  2036: " 27F\\KFK[ RLFL[ RYFLS RQOY[ RPOX[ RHFOF RUF[F RH[O[ RU[[[",
  2037: " 15H\\RFK[ RRFY[ RRIX[ RI[O[ RU[[[",
  2038: " 30F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][",
  2039: " 21G^LFL[ RMFYY RMHY[ RYFY[ RIFMF RVF\\F RI[O[",
  2040: " 36G]KEJJ RZEYJ RONNS RVNUS RKWJ\\ RZWY\\ RKGYG RKHYH ROPUP ROQUQ RKYYY RKZYZ",
  2041: " 44G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF",
  2042: " 21F^KFK[ RLFL[ RXFX[ RYFY[ RHF\\F RH[O[ RU[\\[",
  2043: " 29G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[",
  2044: " 20H]KFRPJ[ RJFQP RJFYFZLXF RKZXZ RJ[Y[ZUX[",
  2045: " 16I\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[",
  2046: " 33I\\KKKILGMFOFPGQIRMR[ RKIMGOGQI RZKZIYGXFVFUGTISMS[ RZIXGVGTI RO[V[",
  2047: " 48H]RFR[ RSFS[ RPKMLLMKOKRLTMUPVUVXUYTZRZOYMXLUKPK RPKNLMMLOLRMTNUPV RUVWUXTYRYOXMWLUK ROFVF RO[V[",
  2048: " 21H\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[",
  2049: " 41G^RFR[ RSFS[ RIMJLLMMQNSOTQU RJLKMLQMSNTQUTUWTXSYQZM[L RTUVTWSXQYM[L\\M ROFVF RO[V[",
  2050: " 43G]JXK[O[MWKSJPJLKIMGPFTFWGYIZLZPYSWWU[Y[ZX RMWLTKPKLLINGPF RTFVGXIYLYPXTWW RKZNZ RVZYZ",
  2051: " 18H\\UFH[ RUFV[ RTHU[ RLUUU RF[L[ RR[X[",
  2052: " 41F^OFI[ RPFJ[ RLFWFZG[I[KZNYOVP RWFYGZIZKYNXOVP RMPVPXQYSYUXXVZR[F[ RVPWQXSXUWXUZR[",
  2053: " 34H]ZH[H\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[S[UZWXXV RTFRGPINLMOLSLVMYNZP[",
  2054: " 30F]OFI[ RPFJ[ RLFUFXGYHZKZOYSWWUYSZO[F[ RUFWGXHYKYOXSVWTYRZO[",
  2055: " 22F]OFI[ RPFJ[ RTLRT RLF[FZLZF RMPSP RF[U[WVT[",
  2056: " 20F\\OFI[ RPFJ[ RTLRT RLF[FZLZF RMPSP RF[M[",
  2057: " 42H^ZH[H\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[R[UZWXYT RTFRGPINLMOLSLVMYNZP[ RR[TZVXXT RUT\\T",
  2058: " 27E_NFH[ ROFI[ R[FU[ R\\FV[ RKFRF RXF_F RLPXP RE[L[ RR[Y[",
  2059: " 12LYUFO[ RVFP[ RRFYF RL[S[",
  2060: " 21I[XFSWRYQZO[M[KZJXJVKULVKW RWFRWQYO[ RTF[F",
  2061: " 27F]OFI[ RPFJ[ R]FLS RSOW[ RROV[ RLFSF RYF_F RF[M[ RS[Y[",
  2062: " 14H\\QFK[ RRFL[ RNFUF RH[W[YUV[",
  2063: " 30E`NFH[ RNFO[ ROFPY R\\FO[ R\\FV[ R]FW[ RKFOF R\\F`F RE[K[ RS[Z[",
  2064: " 21F_OFI[ ROFVX ROIV[ R\\FV[ RLFOF RYF_F RF[L[",
  2065: " 42G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF RSFQGOIMLLOKSKVLYN[ RQ[SZUXWUXRYNYKXHVF",
  2066: " 27F]OFI[ RPFJ[ RLFXF[G\\I\\K[NYPUQMQ RXFZG[I[KZNXPUQ RF[M[",
  2067: " 61G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF RSFQGOIMLLOKSKVLYN[ RQ[SZUXWUXRYNYKXHVF RLYLXMVOUPURVSXS_T`V`W^W] RSXT^U_V_W^",
  2068: " 42F^OFI[ RPFJ[ RLFWFZG[I[KZNYOVPMP RWFYGZIZKYNXOVP RRPTQURVZW[Y[ZYZX RURWYXZYZZY RF[M[",
  2069: " 35G^ZH[H\\F[L[JZHYGVFRFOGMIMKNMONVRXT RMKOMVQWRXTXWWYVZS[O[LZKYJWJUI[JYKY",
  2070: " 16H]UFO[ RVFP[ ROFLLNF]F\\L\\F RL[S[",
  2071: " 25F_NFKQJUJXKZN[R[UZWXXU\\F ROFLQKUKXLZN[ RKFRF RYF_F",
  2072: " 15H\\NFO[ ROFPY R\\FO[ RLFRF RXF^F",
  2073: " 24E_MFK[ RNFLY RUFK[ RUFS[ RVFTY R]FS[ RJFQF RZF`F",
  2074: " 21G]NFU[ ROFV[ R\\FH[ RLFRF RXF^F RF[L[ RR[X[",
  2075: " 20H]NFRPO[ ROFSPP[ R]FSP RLFRF RYF_F RL[S[",
  2076: " 16G][FH[ R\\FI[ ROFLLNF\\F RH[V[XUU[",
  2077: " 46H\\KILKXWYYY[ RLLXX RKIKKLMXYY[ RPPLTKVKXLZK[ RKVMZ RLTLVMXMZK[ RSSXN RVIVLWNYNYLWKVI RVIWLYN",
  2101: " 39I]NONPMPMONNPMTMVNWOXQXXYZZ[ RWOWXXZZ[[[ RWQVRPSMTLVLXMZP[S[UZWX RPSNTMVMXNZP[",
  2102: " 33G\\LFL[ RMFM[ RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIFMF",
  2103: " 28H[WPVQWRXQXPVNTMQMNNLPKSKULXNZQ[S[VZXX RQMONMPLSLUMXOZQ[",
  2104: " 36H]WFW[ RXFX[ RWPUNSMQMNNLPKSKULXNZQ[S[UZWX RQMONMPLSLUMXOZQ[ RTFXF RW[[[",
  2105: " 31H[LSXSXQWOVNTMQMNNLPKSKULXNZQ[S[VZXX RWSWPVN RQMONMPLSLUMXOZQ[",
  2106: " 22KXUGTHUIVHVGUFSFQGPIP[ RSFRGQIQ[ RMMUM RM[T[",
  2107: " 60I\\QMONNOMQMSNUOVQWSWUVVUWSWQVOUNSMQM RONNPNTOV RUVVTVPUN RVOWNYMYNWN RNUMVLXLYM[P\\U\\X]Y^ RLYMZP[U[X\\Y^Y_XaUbObLaK_K^L\\O[",
  2108: " 28G]LFL[ RMFM[ RMPONRMTMWNXPX[ RTMVNWPW[ RIFMF RI[P[ RT[[[",
  2109: " 18MXRFQGRHSGRF RRMR[ RSMS[ ROMSM RO[V[",
  2110: " 25MXSFRGSHTGSF RTMT_SaQbObNaN`O_P`Oa RSMS_RaQb RPMTM",
  2111: " 27G\\LFL[ RMFM[ RWMMW RRSX[ RQSW[ RIFMF RTMZM RI[P[ RT[Z[",
  2112: " 12MXRFR[ RSFS[ ROFSF RO[V[",
  2113: " 44BcGMG[ RHMH[ RHPJNMMOMRNSPS[ ROMQNRPR[ RSPUNXMZM]N^P^[ RZM\\N]P][ RDMHM RD[K[ RO[V[ RZ[a[",
  2114: " 28G]LML[ RMMM[ RMPONRMTMWNXPX[ RTMVNWPW[ RIMMM RI[P[ RT[[[",
  2115: " 36H\\QMNNLPKSKULXNZQ[S[VZXXYUYSXPVNSMQM RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM",
  2116: " 36G\\LMLb RMMMb RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIMMM RIbPb",
  2117: " 33H\\WMWb RXMXb RWPUNSMQMNNLPKSKULXNZQ[S[UZWX RQMONMPLSLUMXOZQ[ RTb[b",
  2118: " 23IZNMN[ ROMO[ ROSPPRNTMWMXNXOWPVOWN RKMOM RK[R[",
  2119: " 32J[WOXMXQWOVNTMPMNNMOMQNRPSUUWVXW RMPNQPRUTWUXVXYWZU[Q[OZNYMWM[NY",
  2120: " 16KZPFPWQZS[U[WZXX RQFQWRZS[ RMMUM",
  2121: " 28G]LMLXMZP[R[UZWX RMMMXNZP[ RWMW[ RXMX[ RIMMM RTMXM RW[[[",
  2122: " 15I[LMR[ RMMRY RXMR[ RJMPM RTMZM",
  2123: " 24F^JMN[ RKMNX RRMN[ RRMV[ RSMVX RZMV[ RGMNM RWM]M",
  2124: " 21H\\LMW[ RMMX[ RXML[ RJMPM RTMZM RJ[P[ RT[Z[",
  2125: " 22H[LMR[ RMMRY RXMR[P_NaLbKbJaK`La RJMPM RTMZM",
  2126: " 16I[WML[ RXMM[ RMMLQLMXM RL[X[XWW[",
  2127: " 40G^QMNNLPKRJUJXKZN[P[RZUWWTYPZM RQMONMPLRKUKXLZN[ RQMSMUNVPXXYZZ[ RSMTNUPWXXZZ[[[",
  2128: " 57G\\TFQGOIMMLPKTJZIb RTFRGPINMMPLTKZJb RTFVFXGYHYKXMWNTOPO RVFXHXKWMVNTO RPOTPVRWTWWVYUZR[P[NZMYLV RPOSPURVTVWUYTZR[",
  2129: " 28H\\IPKNMMOMQNROSRSVRZOb RJOLNPNRO RZMYPXRSYP^Nb RYMXPWRSY",
  2130: " 44I\\VNTMRMONMQLTLWMYNZP[R[UZWWXTXQWOSJRHRFSEUEWFYH RRMPNNQMTMXNZ RR[TZVWWTWPVNTKSISGTFVFYH",
  2131: " 32I[XPVNTMPMNNNPPRSS RPMONOPQRSS RSSNTLVLXMZP[S[UZWX RSSOTMVMXNZP[",
  2132: " 31I[TFRGQHQIRJUKZKZJWKSMPOMRLULWMYP[S]T_TaSbQbPa RULQONRMUMWNYP[",
  2133: " 32G]HQIOKMNMONOPNTL[ RMMNNNPMTK[ RNTPPRNTMVMXNYOYRXWUb RVMXOXRWWTb",
  2134: " 44F]GQHOJMMMNNNPMUMXNZO[ RLMMNMPLULXMZO[Q[SZUXWUXRYMYIXGVFTFRHRJSMUPWRZT RSZUWVUWRXMXIWGVF",
  2135: " 15LXRMPTOXOZP[S[UYVW RSMQTPXPZQ[",
  2136: " 29H\\NMJ[ ROMK[ RXMYNZNYMWMUNQROSMS ROSQTSZT[ ROSPTRZS[U[WZYW",
  2137: " 23H\\KFMFOGPHQJWXXZY[ RMFOHPJVXWZY[Z[ RRMJ[ RRMK[",
  2138: " 28F]MMGb RNMHb RMPLVLYN[P[RZTXVU RXMUXUZV[Y[[Y\\W RYMVXVZW[",
  2139: " 24H\\NML[ ROMNSMXL[ RYMXQVU RZMYPXRVUTWQYOZL[ RKMOM",
  2140: " 45IZTFRGQHQIRJUKXK RUKQLOMNONQPSSTVT RUKRLPMOOOQQSST RSTOUMVLXLZN\\S^T_TaRbPb RSTPUNVMXMZO\\S^",
  2141: " 32I[RMONMQLTLWMYNZP[R[UZWWXTXQWOVNTMRM RRMPNNQMTMXNZ RR[TZVWWTWPVN",
  2142: " 22G]PNL[ RPNM[ RVNV[ RVNW[ RIPKNNM[M RIPKONN[N",
  2143: " 31H[LVMYNZP[R[UZWWXTXQWOVNTMRMONMQLTHb RR[TZVWWTWPVN RRMPNNQMTIb",
  2144: " 35H][MQMNNLQKTKWLYMZO[Q[TZVWWTWQVOUNSM RQMONMQLTLXMZ RQ[SZUWVTVPUN RUN[N",
  2145: " 16H\\SNP[ RSNQ[ RJPLNOMZM RJPLOONZN",
  2146: " 31H\\IQJOLMOMPNPPNVNYP[ RNMONOPMVMYNZP[Q[TZVXXUYRYOXMWNXOYR RXUYO",
  2147: " 37G]ONMOKQJTJWKYLZN[Q[TZWXYUZRZOXMVMTORSPXMb RJWLYNZQZTYWWYU RZOXNVNTPRSPYNb",
  2148: " 23I[KMMMONPPU_VaWb RMMNNOPT_UaWbYb RZMYOWRM]K`Jb",
  2149: " 34F]UFOb RVFNb RGQHOJMMMNNNPMUMXOZRZTYWVYS RLMMNMPLULXMZO[R[TZVXXUYS[M",
  2150: " 44F]JQLOONNMLNJQITIWJZK[M[OZQWRT RIWJYKZMZOYQW RQTQWRZS[U[WZYWZTZQYNXMWNYOZQ RQWRYSZUZWYYW",
  2151: " 39H]XMVTUXUZV[Y[[Y\\W RYMWTVXVZW[ RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ",
  2152: " 36H[PFLSLVMYNZ RQFMS RMSNPPNRMTMVNWOXQXTWWUZR[P[NZMWMS RVNWPWTVWTZR[ RMFQF",
  2153: " 25I[WPWQXQXPWNUMRMONMQLTLWMYNZP[R[UZWW RRMPNNQMTMXNZ",
  2154: " 42H]ZFVTUXUZV[Y[[Y\\W R[FWTVXVZW[ RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ RWF[F",
  2155: " 26I[MVQUTTWRXPWNUMRMONMQLTLWMYNZP[R[UZWX RRMPNNQMTMXNZ",
  2156: " 35KZZGYHZI[H[GZFXFVGUHTJSMP[O_Na RXFVHUJTNRWQ[P^O`NaLbJbIaI`J_K`Ja ROMYM",
  2157: " 43H\\YMU[T^RaObLbJaI`I_J^K_J` RXMT[S^QaOb RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ",
  2158: " 31H]PFJ[ RQFK[ RMTOPQNSMUMWNXOXQVWVZW[ RUMWOWQUWUZV[Y[[Y\\W RMFQF",
  2159: " 26LYUFTGUHVGUF RMQNOPMSMTNTQRWRZS[ RRMSNSQQWQZR[U[WYXW",
  2160: " 32LYVFUGVHWGVF RNQOOQMTMUNUQR[Q^P`OaMbKbJaJ`K_L`Ka RSMTNTQQ[P^O`Mb",
  2161: " 34H\\PFJ[ RQFK[ RXNWOXPYOYNXMWMUNQROSMS ROSQTSZT[ ROSPTRZS[U[WZYW RMFQF",
  2162: " 18MYUFQTPXPZQ[T[VYWW RVFRTQXQZR[ RRFVF",
  2163: " 52AbBQCOEMHMINIPHTF[ RGMHNHPGTE[ RHTJPLNNMPMRNSOSQP[ RPMRORQO[ RRTTPVNXMZM\\N]O]Q[W[Z\\[ RZM\\O\\QZWZZ[[^[`YaW",
  2164: " 37F]GQHOJMMMNNNPMTK[ RLMMNMPLTJ[ RMTOPQNSMUMWNXOXQVWVZW[ RUMWOWQUWUZV[Y[[Y\\W",
  2165: " 32I[RMONMQLTLWMYNZP[R[UZWWXTXQWOVNTMRM RRMPNNQMTMXNZ RR[TZVWWTWPVN",
  2166: " 42G\\HQIOKMNMONOPNTJb RMMNNNPMTIb RNTOQQNSMUMWNXOYQYTXWVZS[Q[OZNWNT RWNXPXTWWUZS[ RFbMb",
  2167: " 33H\\XMRb RYMSb RVTVQUNSMQMNNLQKTKWLYMZO[Q[SZUWVT RQMONMQLTLXMZ RObVb",
  2168: " 26IZJQKOMMPMQNQPPTN[ ROMPNPPOTM[ RPTRPTNVMXMYNYOXPWOXN",
  2169: " 28J[XOXPYPYOXNUMRMONNONQORVVWW RNPOQVUWVWYVZS[P[MZLYLXMXMY",
  2170: " 18KYTFPTOXOZP[S[UYVW RUFQTPXPZQ[ RNMWM",
  2171: " 37F]GQHOJMMMNNNQLWLYN[ RLMMNMQKWKYLZN[P[RZTXVT RXMVTUXUZV[Y[[Y\\W RYMWTVXVZW[",
  2172: " 26H\\IQJOLMOMPNPQNWNYP[ RNMONOQMWMYNZP[Q[TZVXXUYQYMXMYO",
  2173: " 41C`DQEOGMJMKNKQIWIYK[ RIMJNJQHWHYIZK[M[OZQXRV RTMRVRYSZU[W[YZ[X\\V]R]M\\M]O RUMSVSYU[",
  2174: " 42H\\KQMNOMRMSOSR RQMRORRQVPXNZL[K[JZJYKXLYKZ RQVQYR[U[WZYW RYNXOYPZOZNYMXMVNTPSRRVRYS[",
  2175: " 41G\\HQIOKMNMONOQMWMYO[ RMMNNNQLWLYMZO[Q[SZUXWT RZMV[U^SaPbMbKaJ`J_K^L_K` RYMU[T^RaPb",
  2176: " 31H\\YMXOVQNWLYK[ RLQMOOMRMVO RMOONRNVOXO RLYNYRZUZWY RNYR[U[WYXW",
  2177: " 43G^VGUHVIWHWGUFRFOGMILLL[ RRFPGNIMLM[ R\\G[H\\I]H]G\\FZFXGWIW[ RZFYGXIX[ RIM[M RI[P[ RT[[[",
  2178: " 33G]WGVHWIXHWGUFRFOGMILLL[ RRFPGNIMLM[ RWMW[ RXMX[ RIMXM RI[P[ RT[[[",
  2179: " 35G]VGUHVIWHWGUF RXFRFOGMILLL[ RRFPGNIMLM[ RWHW[ RXFX[ RIMWM RI[P[ RT[[[",
  2180: " 54BcRGQHRISHRGPFMFJGHIGLG[ RMFKGIIHLH[ R]G\\H]I^H]G[FXFUGSIRLR[ RXFVGTISLS[ R]M][ R^M^[ RDM^M RD[K[ RO[V[ RZ[a[",
  2181: " 56BcRGQHRISHRGPFMFJGHIGLG[ RMFKGIIHLH[ R\\G[H\\I]H]G[F R^FXFUGSIRLR[ RXFVGTISLS[ R]H][ R^F^[ RDM]M RD[K[ RO[V[ RZ[a[",
  2182: " 12MXRMR[ RSMS[ ROMSM RO[V[",
  2184: " 25IZWNUMRMONMPLSLVMYNZQ[T[VZ RRMPNNPMSMVNYOZQ[ RMTUT",
  2185: " 43I\\TFQGOJNLMOLTLXMZO[Q[TZVWWUXRYMYIXGVFTF RTFRGPJOLNOMTMXNZO[ RQ[SZUWVUWRXMXIWGVF RNPWP",
  2186: " 42G]UFOb RVFNb RQMMNKPJSJVKXMZP[S[WZYXZUZRYPWNTMQM RQMNNLPKSKVLXNZP[ RS[VZXXYUYRXPVNTM",
  2187: " 27I[TMVNXPXOWNTMQMNNMOLQLSMUOWSZ RQMONNOMQMSNUSZT\\T^S_Q_",
  2190: " 45G]LMKNJPJRKUOYP[ RJRKTOXP[P]O`MbLbKaJ_J\\KXMTOQRNTMVMYNZPZTYXWZU[T[SZSXTWUXTY RVMXNYPYTXXWZ",
  2191: " 69E_YGXHYIZHYGWFTFQGOINKMNLRJ[I_Ha RTFRGPIOKNNLWK[J^I`HaFbDbCaC`D_E`Da R_G^H_I`H`G_F]F[GZHYJXMU[T_Sa R]F[HZJYNWWV[U^T`SaQbObNaN`O_P`Oa RIM^M",
  2192: " 52F^[GZH[I\\H[GXFUFRGPIOKNNMRK[J_Ia RUFSGQIPKONMWL[K^J`IaGbEbDaD`E_F`Ea RYMWTVXVZW[Z[\\Y]W RZMXTWXWZX[ RJMZM",
  2193: " 54F^YGXHYIZHZGXF R\\FUFRGPIOKNNMRK[J_Ia RUFSGQIPKONMWL[K^J`IaGbEbDaD`E_F`Ea R[FWTVXVZW[Z[\\Y]W R\\FXTWXWZX[ RJMYM",
  2194: " 86@cTGSHTIUHTGRFOFLGJIIKHNGRE[D_Ca ROFMGKIJKINGWF[E^D`CaAb?b>a>`?_@`?a R`G_H`IaH`G]FZFWGUITKSNRRP[O_Na RZFXGVIUKTNRWQ[P^O`NaLbJbIaI`J_K`Ja R^M\\T[X[Z\\[_[aYbW R_M]T\\X\\Z][ RDM_M",
  2195: " 88@cTGSHTIUHTGRFOFLGJIIKHNGRE[D_Ca ROFMGKIJKINGWF[E^D`CaAb?b>a>`?_@`?a R^G]H^I_H_G]F RaFZFWGUITKSNRRP[O_Na RZFXGVIUKTNRWQ[P^O`NaLbJbIaI`J_K`Ja R`F\\T[X[Z\\[_[aYbW RaF]T\\X\\Z][ RDM^M",
  2196: " 20LYMQNOPMSMTNTQRWRZS[ RRMSNSQQWQZR[U[WYXW",
  2200: " 40H\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF RQFOGNHMJLOLRMWNYOZQ[ RS[UZVYWWXRXOWJVHUGSF",
  2201: " 11H\\NJPISFS[ RRGR[ RN[W[",
  2202: " 45H\\LJMKLLKKKJLHMGPFTFWGXHYJYLXNUPPRNSLUKXK[ RTFVGWHXJXLWNTPPR RKYLXNXSZVZXYYX RNXS[W[XZYXYV",
  2203: " 47H\\LJMKLLKKKJLHMGPFTFWGXIXLWNTOQO RTFVGWIWLVNTO RTOVPXRYTYWXYWZT[P[MZLYKWKVLUMVLW RWQXTXWWYVZT[",
  2204: " 13H\\THT[ RUFU[ RUFJUZU RQ[X[",
  2205: " 39H\\MFKP RKPMNPMSMVNXPYSYUXXVZS[P[MZLYKWKVLUMVLW RSMUNWPXSXUWXUZS[ RMFWF RMGRGWF",
  2206: " 48H\\WIVJWKXJXIWGUFRFOGMILKKOKULXNZQ[S[VZXXYUYTXQVOSNRNOOMQLT RRFPGNIMKLOLUMXOZQ[ RS[UZWXXUXTWQUOSN",
  2207: " 31H\\KFKL RKJLHNFPFUIWIXHYF RLHNGPGUI RYFYIXLTQSSRVR[ RXLSQRSQVQ[",
  2208: " 63H\\PFMGLILLMNPOTOWNXLXIWGTFPF RPFNGMIMLNNPO RTOVNWLWIVGTF RPOMPLQKSKWLYMZP[T[WZXYYWYSXQWPTO RPONPMQLSLWMYNZP[ RT[VZWYXWXSWQVPTO",
  2209: " 48H\\XMWPURRSQSNRLPKMKLLINGQFSFVGXIYLYRXVWXUZR[O[MZLXLWMVNWMX RQSORMPLMLLMIOGQF RSFUGWIXLXRWVVXTZR[",
  2210: "  6MWRYQZR[SZRY",
  2211: "  8MWR[QZRYSZS\\R^Q_",
  2212: " 12MWRMQNROSNRM RRYQZR[SZRY",
  2213: " 14MWRMQNROSNRM RR[QZRYSZS\\R^Q_",
  2214: " 15MWRFQHRTSHRF RRHRN RRYQZR[SZRY",
  2215: " 32I[MJNKMLLKLJMHNGPFSFVGWHXJXLWNVORQRT RSFUGVHWJWLVNTP RRYQZR[SZRY",
  2216: "  6NVRFQM RSFQM",
  2217: " 12JZNFMM ROFMM RVFUM RWFUM",
  2218: " 14KYQFOGNINKOMQNSNUMVKVIUGSFQF",
  2219: "  9JZRFRR RMIWO RWIMO",
  2220: "  3G][BIb",
  2221: " 20KYVBTDRGPKOPOTPYR]T`Vb RTDRHQKPPPTQYR\\T`",
  2222: " 20KYNBPDRGTKUPUTTYR]P`Nb RPDRHSKTPTTSYR\\P`",
  2223: " 12KYOBOb RPBPb ROBVB RObVb",
  2224: " 12KYTBTb RUBUb RNBUB RNbUb",
  2225: " 40KYTBRCQDPFPHQJRKSMSOQQ RRCQEQGRISJTLTNSPORSTTVTXSZR[Q]Q_Ra RQSSUSWRYQZP\\P^Q`RaTb",
  2226: " 40KYPBRCSDTFTHSJRKQMQOSQ RRCSESGRIQJPLPNQPURQTPVPXQZR[S]S_Ra RSSQUQWRYSZT\\T^S`RaPb",
  2227: "  4KYUBNRUb",
  2228: "  4KYOBVROb",
  2229: "  3NVRBRb",
  2230: "  6KYOBOb RUBUb",
  2231: "  3E_IR[R",
  2232: "  6E_RIR[ RIR[R",
  2233: "  9F^RJR[ RJRZR RJ[Z[",
  2234: "  9F^RJR[ RJJZJ RJRZR",
  2235: "  6G]KKYY RYKKY",
  2236: "  6MWRQQRRSSRRQ",
  2237: " 15E_RIQJRKSJRI RIR[R RRYQZR[SZRY",
  2238: "  6E_IO[O RIU[U",
  2239: "  9E_YIK[ RIO[O RIU[U",
  2240: "  9E_IM[M RIR[R RIW[W",
  2241: "  4F^ZIJRZ[",
  2242: "  4F^JIZRJ[",
  2243: " 10F^ZFJMZT RJVZV RJ[Z[",
  2244: " 10F^JFZMJT RJVZV RJ[Z[",
  2245: " 21F_[WYWWVUTRPQOONMNKOJQJSKUMVOVQURTUPWNYM[M",
  2246: " 24F^IUISJPLONOPPTSVTXTZS[Q RISJQLPNPPQTTVUXUZT[Q[O",
  2247: "  8G]JTROZT RJTRPZT",
  2248: "  7LXTFOL RTFUGOL",
  2249: "  7LXPFUL RPFOGUL",
  2250: " 18H\\KFLHNJQKSKVJXHYF RKFLINKQLSLVKXIYF",
  2251: "  8MWRHQGRFSGSIRKQL",
  2252: "  8MWSFRGQIQKRLSKRJ",
  2253: "  8MWRHSGRFQGQIRKSL",
  2254: "  8MWQFRGSISKRLQKRJ",
  2255: " 10E[HMLMRY RKMR[ R[BR[",
  2256: " 13F^ZJSJOKMLKNJQJSKVMXOYSZZZ",
  2257: " 13F^JJJQKULWNYQZSZVYXWYUZQZJ",
  2258: " 13F^JJQJUKWLYNZQZSYVWXUYQZJZ",
  2259: " 13F^JZJSKOLMNKQJSJVKXMYOZSZZ",
  2260: " 16F^ZJSJOKMLKNJQJSKVMXOYSZZZ RJRVR",
  2261: " 11E_XP[RXT RUMZRUW RIRZR",
  2262: " 11JZPLRITL RMORJWO RRJR[",
  2263: " 11E_LPIRLT ROMJROW RJR[R",
  2264: " 11JZPXR[TX RMURZWU RRIRZ",
  2265: " 44I\\XRWOVNTMRMONMQLTLWMYNZP[R[UZWXXUYPYKXHWGUFRFPGOHOIPIPH RRMPNNQMTMXNZ RR[TZVXWUXPXKWHUF",
  2266: " 15H\\JFR[ RKFRY RZFR[ RJFZF RKGYG",
  2267: " 10AbDMIMRY RHNR[ Rb:R[",
  2268: " 32F^[CZD[E\\D\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia",
  2269: " 50F^[CZD[E\\D\\C[BYBWCUETGSJRNPZO^N` RVDUFTJRVQZP]O_MaKbIbHaH`I_J`Ia RQKNLLNKQKSLVNXQYSYVXXVYSYQXNVLSKQK",
  2270: " 26F_\\S[UYVWVUUTTQPPONNLNJOIQISJULVNVPUQTTPUOWNYN[O\\Q\\S",
  2271: " 32F^[FI[ RNFPHPJOLMMKMIKIIJGLFNFPGSHVHYG[F RWTUUTWTYV[X[ZZ[X[VYTWT",
  2272: " 49F_[NZO[P\\O\\N[MZMYNXPVUTXRZP[M[JZIXIUJSPORMSKSIRGPFNGMIMKNNPQUXWZZ[[[\\Z\\Y RM[KZJXJUKSMQ RMKNMVXXZZ[",
  2273: " 56E`WNVLTKQKOLNMMPMSNUPVSVUUVS RQKOMNPNSOUPV RWKVSVUXVZV\\T]Q]O\\L[JYHWGTFQFNGLHJJILHOHRIUJWLYNZQ[T[WZYYZX RXKWSWUXV",
  2274: " 42H\\PBP_ RTBT_ RXIWJXKYJYIWGTFPFMGKIKKLMMNOOUQWRYT RKKMMONUPWQXRYTYXWZT[P[MZKXKWLVMWLX",
  2275: " 12H]SFLb RYFRb RLQZQ RKWYW",
  2276: " 46JZUITJUKVJVIUGSFQFOGNINKOMQOVR ROMTPVRWTWVVXTZ RPNNPMRMTNVPXU[ RNVSYU[V]V_UaSbQbOaN_N^O]P^O_",
  2277: " 30JZRFQHRJSHRF RRFRb RRQQTRbSTRQ RLMNNPMNLLM RLMXM RTMVNXMVLTM",
  2278: " 56JZRFQHRJSHRF RRFRT RRPQRSVRXQVSRRP RRTRb RR^Q`RbS`R^ RLMNNPMNLLM RLMXM RTMVNXMVLTM RL[N\\P[NZL[ RL[X[ RT[V\\X[VZT[",
  2279: " 12I\\XFX[ RKFXF RPPXP RK[X[",
  2281: " 38E`QFNGKIILHOHRIUKXNZQ[T[WZZX\\U]R]O\\LZIWGTFQF RROQPQQRRSRTQTPSORO RRPRQSQSPRP",
  2282: " 45J[PFNGOIQJ RPFOGOI RUFWGVITJ RUFVGVI RQJOKNLMNMQNSOTQUTUVTWSXQXNWLVKTJQJ RRUR[ RSUS[ RNXWX",
  2283: " 27I\\RFOGMILLLMMPORRSSSVRXPYMYLXIVGSFRF RRSR[ RSSS[ RNWWW",
  2284: " 28D`PFMGJIHLGOGSHVJYM[P\\T\\W[ZY\\V]S]O\\LZIWGTFPF RRFR\\ RGQ]Q",
  2285: " 31G`PMMNKPJSJTKWMYPZQZTYVWWTWSVPTNQMPM R]GWG[HUN R]G]M\\IVO R\\HVN",
  2286: " 28F\\IIJGLFOFQGRIRLQOPQNSKU ROFPGQIQMPPNS RVFT[ RWFS[ RKUYU",
  2287: " 30I\\MFMU RNFMQ RMQNOONQMTMWNXPXRWTUV RTMVNWPWRTXTZU[W[YY RKFNF",
  2288: " 44I\\RNOOMQLTLUMXOZR[S[VZXXYUYTXQVOSNRN RRHNJRFRN RSHWJSFSN RRSQTQURVSVTUTTSSRS RRTRUSUSTRT",
  2289: " 37G^QHRFR[ RTHSFS[ RJHKFKMLPNRQSRS RMHLFLNMQ R[HZFZMYPWRTSSS RXHYFYNXQ RNWWW",
  2290: " 31G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[Y[YVX[",
  2291: " 24H[YGUGQHNJLMKPKSLVNYQ[U\\Y\\ RYGVHSJQMPPPSQVSYV[Y\\",
  2292: " 27F_OQMQKRJSIUIWJYKZM[O[QZRYSWSURSQROQ RSHPQ RZJRR R\\QST",
  2293: " 12H\\OKUY RUKOY RKOYU RYOKU",
  2294: " 48F^NVLUKUIVHXHYI[K\\L\\N[OYOXNVKRJOJMKJMHPGTGWHYJZMZOYRVVUXUYV[X\\Y\\[[\\Y\\X[VYUXUVV RJMKKMIPHTHWIYKZM",
  2295: " 48F^NMLNKNIMHKHJIHKGLGNHOJOKNMKQJTJVKYM[P\\T\\W[YYZVZTYQVMUKUJVHXGYG[H\\J\\K[MYNXNVM RJVKXMZP[T[WZYXZV",
  2301: " 40F_JMILIJJHLGNGPHQIRKSP RIJKHMHOIPJQLRPR[ R[M\\L\\J[HYGWGUHTISKRP R\\JZHXHVIUJTLSPS[",
  2302: " 51F^IGJKKMMOPPTPWOYMZK[G RIGJJKLMNPOTOWNYLZJ[G RPONPMQLSLVMXOZQ[S[UZWXXVXSWQVPTO RPPNQMSMVNY RVYWVWSVQTP",
  2303: " 30F^MJMV RNKNU RVKVU RWJWV RIGKIMJPKTKWJYI[G RIYKWMVPUTUWVYW[Y",
  2304: " 48F^[ILIJJILINJPLQNQPPQNQLPJ[J RIMJOKPMQ RQMPKOJMI RIXXXZW[U[SZQXPVPTQSSSUTWIW R[TZRYQWP RSTTVUWWX",
  2305: " 48F]OUMTLTJUIWIXJZL[M[OZPXPWOUJPINIKJILHOGSGWHYJZLZOYRVUUWUYV[X[YZZX RMSKPJNJKKILH RSGVHXJYLYOXRVU",
  2306: " 48G_HKKHMKMV RJILLLV RMKPHRKRU ROIQLQU RRKUHWKW[ RTIVLV[ RWKZH[J\\M\\P[SZUXWUYP[ RYIZJ[M[PZSYUWWTYP[",
  2307: " 41F^ISMSLRKOKMLJNHQGSGVHXJYMYOXRWS[S RITOTMRLOLMMJOHQG RSGUHWJXMXOWRUT[T RKXYX RKYYY",
  2308: " 30F_GLJIMLMX RIJLMLX RMLPISLSX ROJRMRX RSLVIYLYW[Y RUJXMXXZZ]W",
  2309: " 33G]ZIJY RZIWJQJ RXKUKQJ RZIYLYR RXKXNYR RQRJR RPSMSJR RQRQY RPSPVQY",
  2310: " 33F^HOJKOU RJMOWRPWPZO[M[KZIXHWHUITKTMUPVRWUWXUZ RWHVIUKUMWQXTXWWYUZ",
  2311: " 36F^IOLLPN RKMOORLUN RQMTOWLYN RVMXO[L RIULRPT RKSOURRUT RQSTUWRYT RVSXU[R",
  2312: " 48F^JHNJPLQOQRPUNWJY RJHMIOJQLRO RRRQUOWMXJY RZHWIUJSLRO RRRSUUWWXZY RZHVJTLSOSRTUVWZY RIP[P RIQ[Q",
  2317: " 12NVQQQSSSSQQQ RQQSS RSQQS",
  2318: " 18JZMPQRTTVVWYW[V]U^ RMQST RMRPSTUVWWY",
  2319: " 18JZWKVMTOPQMR RSPMS RUFVGWIWKVNTPQRMT",
  2320: " 36H\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR",
  2321: " 36H\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR",
  2322: " 34J[SMPNNPMRMTNVPWRWUVWTXRXPWNUMSM ROPUM RNRVN RMTWO RNUXP ROVWR RPWVT",
  2323: " 18JZOGO^ RUFU] RMNWL RMOWM RMWWU RMXWV",
  2324: " 18JZNFNX RVLV^ RNNVL RNOVM RNWVU RNXVV",
  2325: " 25JZNBNW RNNQLTLVMWOWQVSSUQVNW RNNQMTMVN RUMVOVQUSSU",
  2326: " 18E_HIHL R\\I\\L RHI\\I RHJ\\J RHK\\K RHL\\L",
  2327: " 18JZMNMQ RWNWQ RMNWN RMOWO RMPWP RMQWQ",
  2328: " 49JZMLWX RMLONQOTOVNWMWKUKUMTO RONTO RQOWM RVKVN RULWL RWXUVSUPUNVMWMYOYOWPU RUVPU RSUMW RNVNY RMXOX",
  2329: " 26JZPOOMOKMKMMNNPOSOUNWL RNKNN RMLOL RMMSO RPOUN RWLWY",
  2330: " 86A^GfHfIeIdHcGcFdFfGhIiKiNhPfQdR`RUQ;Q4R/S-U,V,X-Y/Y3X6W8U;P?JCHEFHEJDNDREVGYJ[N\\R\\V[XZZW[T[PZMYKWITHPHMIKKJNJRKUMW RGdGeHeHdGd RU;Q?LCIFGIFKENERFVGXJ[ RR\\U[WZYWZTZPYMXKVITH",
  2331: "103EfNSOUQVSVUUVSVQUOSNQNOONPMSMVNYP[S\\V\\Y[[Y\\W]T]P\\MZJXIUHRHOIMJKLIOHSHXI]KaMcPeTfYf]e`cba RKLJNIRIXJ\\L`NbQdUeYe]d_cba RPOTO ROPUP RNQVQ RNRVR RNSVS ROTUT RPUTU RaLaNcNcLaL RbLbN RaMcM RaVaXcXcVaV RbVbX RaWcW",
  2332: " 30D`H@Hd RM@Md RW@Wd R\\@\\d RMMWK RMNWL RMOWM RMWWU RMXWV RMYWW",
  2367: " 12NVQQQSSSSQQQ RQQSS RSQQS",
  2368: " 18JZMPQRTTVVWYW[V]U^ RMQST RMRPSTUVWWY",
  2369: " 18JZWKVMTOPQMR RSPMS RUFVGWIWKVNTPQRMT",
  2370: " 32H\\PMMNLOKQKSLUMVPWTWWVXUYSYQXOWNTMPM RMNLPLSMUNVPW RWVXTXQWOVNTM",
  2371: " 36H\\SMONLPKRKTLVNWQWUVXTYRYPXNVMSM RXNSM RVMQNLP RONKR RLVQW RNWSVXT RUVYR",
  2372: " 34J[SMPNNPMRMTNVPWRWUVWTXRXPWNUMSM ROPUM RNRVN RMTWO RNUXP ROVWR RPWVT",
  2373: " 18JZOGO^ RUFU] RMNWL RMOWM RMWWU RMXWV",
  2374: " 18JZNFNX RVLV^ RNNVL RNOVM RNWVU RNXVV",
  2375: " 25JZNBNW RNNQLTLVMWOWQVSSUQVNW RNNQMTMVN RUMVOVQUSSU",
  2376: " 18E_HIHL R\\I\\L RHI\\I RHJ\\J RHK\\K RHL\\L",
  2377: " 18JZMNMQ RWNWQ RMNWN RMOWO RMPWP RMQWQ",
  2378: " 36JZQCVMRTRU RULQS RTITKPRRUUY RW\\UYSXQXOYN[N]O_Ra RW\\UZSYOYO]P_Ra RSXPZN]",
  2379: " 26JZPOOMOKMKMMNNPOSOUNWL RNKNN RMLOL RMMSO RPOUN RWLSY",
  2380: " 86A^GfHfIeIdHcGcFdFfGhIiKiNhPfQdR`RUQ;Q4R/S-U,V,X-Y/Y3X6W8U;P?JCHEFHEJDNDREVGYJ[N\\R\\V[XZZW[T[PZMYKWITHPHMIKKJNJRKUMW RGdGeHeHdGd RU;Q?LCIFGIFKENERFVGXJ[ RR\\U[WZYWZTZPYMXKVITH",
  2381: " 89IjNQOOQNSNUOVQVSUUSVQVOUNTMQMNNKPISHWH[I^K`NaRaW`[_]]`ZcVfQiMk RWHZI]K_N`R`W_[^]\\`YcTgQi RPOTO ROPUP RNQVQ RNRVR RNSVS ROTUT RPUTU ReLeNgNgLeL RfLfN ReMgM ReVeXgXgVeV RfVfX ReWgW",
  2382: " 85D`H>Hf RI>If RM>Mf RQBSBSDQDQAR?T>W>Y?[A\\D\\I[LYNWOUOSNRLQNOQNROSQVRXSVUUWUYV[X\\[\\`[cYeWfTfReQcQ`S`SbQb RRBRD RQCSC RY?ZA[D[IZLYN RRLRNPQNRPSRVRX RYVZX[[[`ZcYe RR`Rb RQaSa",
  2401: " 21AcHBHb RIBIb R[B[b R\\B\\b RDB`B RDbMb RWb`b",
  2402: " 23BaGBQPFb RFBPP REBPQ REB\\B^I[B RGa\\a RFb\\b^[[b",
  2403: " 28I[X+U1R8P=OANFMNMVN^OcPgRlUsXy RU1S6Q<P@OFNNNVO^PdQhSnUs",
  2404: " 28I[L+O1R8T=UAVFWNWVV^UcTgRlOsLy RO1Q6S<T@UFVNVVU^TdShQnOs",
  2405: " 14I[M+MRMy RN+NRNy RM+X+ RMyXy",
  2406: " 14I[V+VRVy RW+WRWy RL+W+ RLyWy",
  2407: " 48I[V+S-Q/P1O4O8P<TDUGUJTMRP RS-Q0P4P8Q;UCVGVJUMRPNRRTUWVZV]UaQiPlPpQtSw RRTTWUZU]T`PhOlOpPsQuSwVy",
  2408: " 48I[N+Q-S/T1U4U8T<PDOGOJPMRP RQ-S0T4T8S;OCNGNJOMRPVRRTOWNZN]OaSiTlTpStQw RRTPWOZO]P`ThUlUpTsSuQwNy",
  2409: " 32I[V.S1Q4O8N=NCOIPMSXT\\UbUgTlSoQs RS1Q5P8O=OBPHQLTWU[VaVgUlSpQsNv",
  2410: " 32I[N.Q1S4U8V=VCUITMQXP\\ObOgPlQoSs RQ1S5T8U=UBTHSLPWO[NaNgOlQpSsVv",
  2411: ' 147Z:RARRo R@RQo R?RRr RZ"VJRr',
  2412: " 57Ca].\\.[/[0\\1]1^0^.],[+Y+W,U.T0S3R:QJQjPsOv R\\/\\0]0]/\\/ RR:Rj RU.T1S:SZRjQqPtOvMxKyIyGxFvFtGsHsItIuHvGv RGtGuHuHtGt",
  2501: " 20H\\RFJ[ RRIK[J[ RRIY[Z[ RRFZ[ RMUWU RLVXV",
  2502: " 44H\\LFL[ RMGMZ RLFTFWGXHYJYMXOWPTQ RMGTGWHXJXMWOTP RMPTPWQXRYTYWXYWZT[L[ RMQTQWRXTXWWYTZMZ",
  2503: " 38H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZV RZKYKXIWHUGQGOHMKLNLSMVOYQZUZWYXXYVZV",
  2504: " 32H]LFL[ RMGMZ RLFSFVGXIYKZNZSYVXXVZS[L[ RMGSGVHWIXKYNYSXVWXVYSZMZ",
  2505: " 27I\\MFM[ RNGNZ RMFYF RNGYGYF RNPTPTQ RNQTQ RNZYZY[ RM[Y[",
  2506: " 21I[MFM[ RNGN[M[ RMFYF RNGYGYF RNPTPTQ RNQTQ",
  2507: " 44H]ZKYIWGUFQFOGMILKKNKSLVMXOZQ[U[WZYXZVZRUR RZKYKXIWHUGQGOHNIMKLNLSMVNXOYQZUZWYXXYVYSUSUR",
  2508: " 22G]KFK[ RKFLFL[K[ RYFXFX[Y[ RYFY[ RLPXP RLQXQ",
  2509: "  8NWRFR[S[ RRFSFS[",
  2510: " 20J[VFVVUYSZQZOYNVMV RVFWFWVVYUZS[Q[OZNYMV",
  2511: " 22H]LFL[M[ RLFMFM[ RZFYFMR RZFMS RPOY[Z[ RQOZ[",
  2512: " 14IZMFM[ RMFNFNZ RNZYZY[ RM[Y[",
  2513: " 26F^JFJ[ RKKK[J[ RKKR[ RJFRX RZFRX RYKR[ RYKY[Z[ RZFZ[",
  2514: " 20G]KFK[ RLIL[K[ RLIY[ RKFXX RXFXX RXFYFY[",
  2515: " 40G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF RQGNHLKKNKSLVNYQZSZVYXVYSYNXKVHSGQG",
  2516: " 27H\\LFL[ RMGM[L[ RLFUFWGXHYJYMXOWPUQMQ RMGUGWHXJXMWOUPMP",
  2517: " 48G]PFNGLIKKJNJSKVLXNZP[T[VZXXYVZSZNYKXIVGTFPF RQGNHLKKNKSLVNYQZSZVYXVYSYNXKVHSGQG RSXX]Y] RSXTXY]",
  2518: " 34H\\LFL[ RMGM[L[ RLFTFWGXHYJYMXOWPTQMQ RMGTGWHXJXMWOTPMP RRQX[Y[ RSQY[",
  2519: " 43H\\YIWGTFPFMGKIKKLMMNOOTQVRWSXUXXWYTZPZNYMXKX RYIWIVHTGPGMHLILKMMONTPVQXSYUYXWZT[P[MZKX",
  2520: " 15J[RGR[ RSGS[R[ RLFYFYG RLFLGYG",
  2521: " 24G]KFKULXNZQ[S[VZXXYUYF RKFLFLUMXNYQZSZVYWXXUXFYF",
  2522: " 14H\\JFR[ RJFKFRX RZFYFRX RZFR[",
  2523: " 26E_GFM[ RGFHFMX RRFMX RRIM[ RRIW[ RRFWX R]F\\FWX R]FW[",
  2524: " 16H\\KFX[Y[ RKFLFY[ RYFXFK[ RYFL[K[",
  2525: " 17I\\KFRPR[S[ RKFLFSP RZFYFRP RZFSPS[",
  2526: " 20H\\XFK[ RYFL[ RKFYF RKFKGXG RLZYZY[ RK[Y[",
  2551: " 38E\\XFVHTKQPOSLWIZG[E[DZDXEWFXEY RXFWJUTT[ RXFU[ RT[TYSVRTPRNQLQKRKTLWOZR[V[XZ",
  2552: " 70F^UGTHSJQOOUNWLZJ[ RTHSKQSPVOXMZJ[H[GZGXHWIXHY ROLNNMOKOJNJLKJMHOGRFXFZG[I[KZMXNTORO RXFYGZIZKYMXN RTOWPXQYSYVXYWZU[S[RZRXSU RTOVPWQXSXVWYU[",
  2553: " 41H]KHJJJLKNNOQOUNWMYKZIZGYFWFTGQJOMMQLULXMZP[R[UZWXXVXTWRURSSRU RWFUGRJPMNQMUMXNZP[",
  2554: " 43F]UGTHSJQOOUNWLZJ[ RTHSKQSPVOXMZJ[H[GZGXHWJWLXNZP[S[UZWXYTZOZLYIWGUFPFMGKIJKJMKNMNNMOK",
  2555: " 49I\\WIVJVLWMYMZKZIYGWFTFRGQHPJPLQNSO RTFRHQJQMSO RSOQONPLRKTKWLYMZO[R[UZWXXVXTWRURSSRU RQOOPMRLTLXMZ",
  2556: " 46G\\WHVJTORUQWOZM[ RQLPNNOLOKMKKLINGQF[FXGWHVKTSSVRXPZM[K[IZHYHXIWJXIY RSFWGXG ROSPRRQVQXPZMXT",
  2557: " 53G]JIIKIMJOLPOPROTNWKXHXGWFVFTGRIQKPNPQQSSTUTWSYQZO RWFUGSIRKQNQRST RZOYSWWUYSZO[L[JZIXIWJVKWJX RYSWVUXRZO[",
  2558: " 55F^LLKKKILGOFRFOQMWLYKZI[G[FZFXGWHXGY RRFOONRLWKYI[ RJTKSMRVOXN[L]J^H^G]F\\FZGXJWLURTVTYV[W[YZ[X R\\FZHXLVRUVUYV[",
  2559: " 33IYWHUKSPQUPWNZL[ RYLWNTOQOONNLNJOHQGUFYFWHVJTPRVQXOZL[J[IZIXJWKXJY",
  2560: " 34IZYFWHUKSPPYN] RYMWOTPQPOONMNKOIQGUFYFWIVKSTQXPZN]M^K_J^J\\KZMXOWRVVU",
  2561: " 59F^LLKKKIMGPFRFOQMWLYKZI[G[FZFXGWHXGY RRFOONRLWKYI[ RZGWKUMSNPO R]G\\H]I^H^G]F\\FZGWLVMTNPO RPOSPTRUYV[ RPORPSRTYV[W[YZ[X",
  2562: " 40I[MILKLMMOOPRPUOWNZK[H[GZFYFWGVHTKPUOWMZK[ RVHTLRSQVPXNZK[I[HZHXIWKWMXPZR[U[WZYX",
  2563: " 49D`RFNOKUIXGZE[C[BZBXCWDXCY RRFPMOQNVNZP[ RRFQJPOOVOZP[ R[FWORXP[ R[FYMXQWVWZY[Z[\\Z^X R[FZJYOXVXZY[",
  2564: " 38G^RFQJOPMULWJZH[F[EZEXFWGXFY RRFRKSVT[ RRFSKTVT[ R`G_H`IaHaG`F^F\\GZJYLWQUWT[",
  2565: " 34H]SFQGOIMLLNKRKVLYMZO[Q[TZVXXUYSZOZKYHXGWGUHSJQNPSPV RQGOJMNLRLVMYO[",
  2566: " 53F]UGTHSJQOOUNWLZJ[ RTHSKQSPVOXMZJ[H[GZGXHWIXHY ROLNNMOKOJNJLKJMHOGRFVFYGZH[J[MZOYPVQTQRP RVFXGYHZJZMYOXPVQ",
  2567: " 43H]UJULTNSOQPOPNNNLOIQGTFWFYGZIZMYPWSSWPYNZK[I[HZHXIWKWMXPZS[V[XZZX RWFXGYIYMXPVSSVOYK[",
  2568: " 65F^UGTHSJQOOUNWLZJ[ RTHSKQSPVOXMZJ[H[GZGXHWIXHY ROLNNMOKOJNJLKJMHOGRFWFZG[I[KZMYNVORO RWFYGZIZKYMXNVO RROUPVRWYX[ RROTPURVYX[Y[[Z]X",
  2569: " 36H\\NIMKMMNOPPSPVOXN[K\\H\\G[FZFXGWHVJUMSTRWPZN[ RVJUNTUSXQZN[K[IZHXHWIVJWIX",
  2570: " 38I[YHXJVOTUSWQZO[ RSLRNPONOMMMKNIPGSF\\FZGYHXKVSUVTXRZO[M[KZJYJXKWLXKY RUFYGZG",
  2571: " 39G]HJJGLFMFOHOKNNKVKYL[ RMFNHNKKSJVJYL[N[PZSWUTVR RZFVRUVUYW[X[ZZ\\X R[FWRVVVYW[",
  2572: " 36G\\HJJGLFMFOHOKNOLVLYM[ RMFNHNKLRKVKYM[N[QZTWVTXPYMZIZGYFXFWGVIVLWNYP[Q]Q",
  2573: " 41F]ILHLGKGIHGJFNFMHLLKUJ[ RLLLUK[ RVFTHRLOUMYK[ RVFUHTLSUR[ RTLTUS[ R`F^G\\IZLWUUYS[",
  2574: " 52H\\PKOLMLLKLIMGOFQFSGTITLSPQUOXMZJ[H[GZGXHWIXHY RQFRGSISLRPPUNXLZJ[ R]G\\H]I^H^G]F[FYGWIULSPRURXSZT[U[WZYX",
  2575: " 42G]JJLGNFOFQGQIOOORPT ROFPGPINONRPTRTUSWQYNZL R\\FZLWTUX R]F[LYQWUUXSZP[L[JZIXIWJVKWJX",
  2576: " 44G\\ZHYJWOVRUTSWQYOZL[ RSLRNPONOMMMKNIPGSF]F[GZHYKXOVUTXQZL[H[GZGXHWJWLXOZQ[T[WZYX RVFZG[G",
  2601: " 36H\\WMW[X[ RWMXMX[ RWPUNSMPMNNLPKSKULXNZP[S[UZWX RWPSNPNNOMPLSLUMXNYPZSZWX",
  2602: " 36H\\LFL[M[ RLFMFM[ RMPONQMTMVNXPYSYUXXVZT[Q[OZMX RMPQNTNVOWPXSXUWXVYTZQZMX",
  2603: " 32I[XPVNTMQMONMPLSLUMXOZQ[T[VZXX RXPWQVOTNQNOONPMSMUNXOYQZTZVYWWXX",
  2604: " 36H\\WFW[X[ RWFXFX[ RWPUNSMPMNNLPKSKULXNZP[S[UZWX RWPSNPNNOMPLSLUMXNYPZSZWX",
  2605: " 36I[MTXTXQWOVNTMQMONMPLSLUMXOZQ[T[VZXX RMSWSWQVOTNQNOONPMSMUNXOYQZTZVYWWXX",
  2606: " 24LZWFUFSGRJR[S[ RWFWGUGSH RTGSJS[ ROMVMVN ROMONVN",
  2607: " 48H\\XMWMW\\V_U`SaQaO`N_L_ RXMX\\W_UaSbPbNaL_ RWPUNSMPMNNLPKSKULXNZP[S[UZWX RWPSNPNNOMPLSLUMXNYPZSZWX",
  2608: " 25H\\LFL[M[ RLFMFM[ RMQPNRMUMWNXQX[ RMQPORNTNVOWQW[X[",
  2609: " 24NWRFQGQHRISITHTGSFRF RRGRHSHSGRG RRMR[S[ RRMSMS[",
  2610: " 24NWRFQGQHRISITHTGSFRF RRGRHSHSGRG RRMRbSb RRMSMSb",
  2611: " 22H[LFL[M[ RLFMFM[ RXMWMMW RXMMX RPTV[X[ RQSX[",
  2612: "  8NWRFR[S[ RRFSFS[",
  2613: " 42CbGMG[H[ RGMHMH[ RHQKNMMPMRNSQS[ RHQKOMNONQORQR[S[ RSQVNXM[M]N^Q^[ RSQVOXNZN\\O]Q][^[",
  2614: " 25H\\LML[M[ RLMMMM[ RMQPNRMUMWNXQX[ RMQPORNTNVOWQW[X[",
  2615: " 36I\\QMONMPLSLUMXOZQ[T[VZXXYUYSXPVNTMQM RQNOONPMSMUNXOYQZTZVYWXXUXSWPVOTNQN",
  2616: " 36H\\LMLbMb RLMMMMb RMPONQMTMVNXPYSYUXXVZT[Q[OZMX RMPQNTNVOWPXSXUWXVYTZQZMX",
  2617: " 36H\\WMWbXb RWMXMXb RWPUNSMPMNNLPKSKULXNZP[S[UZWX RWPSNPNNOMPLSLUMXNYPZSZWX",
  2618: " 21KYOMO[P[ ROMPMP[ RPSQPSNUMXM RPSQQSOUNXNXM",
  2619: " 50J[XPWNTMQMNNMPNRPSUUWV RVUWWWXVZ RWYTZQZNY ROZNXMX RXPWPVN RWOTNQNNO RONNPOR RNQPRUTWUXWXXWZT[Q[NZMX",
  2620: " 16MXRFR[S[ RRFSFS[ ROMVMVN ROMONVN",
  2621: " 25H\\LMLWMZO[R[TZWW RLMMMMWNYPZRZTYWW RWMW[X[ RWMXMX[",
  2622: " 14JZLMR[ RLMMMRY RXMWMRY RXMR[",
  2623: " 26F^IMN[ RIMJMNX RRMNX RRPN[ RRPV[ RRMVX R[MZMVX R[MV[",
  2624: " 16I[LMW[X[ RLMMMX[ RXMWML[ RXMM[L[",
  2625: " 17JZLMR[ RLMMMRY RXMWMRYNb RXMR[ObNb",
  2626: " 20I[VNL[ RXMNZ RLMXM RLMLNVN RNZXZX[ RL[X[",
  2651: " 33K[UUTSRRPRNSMTLVLXMZO[Q[SZTX RPRNTMVMYO[ RVRTXTZV[XZYY[V RWRUXUZV[",
  2652: " 23LZLVNSPO RSFMXMZO[P[RZTXUUURVVWWXWZV RTFNXNZO[",
  2653: " 22LXTSSTTTTSSRQROSNTMVMXNZP[S[VYXV RQROTNVNYP[",
  2654: " 33K[UUTSRRPRNSMTLVLXMZO[Q[SZTX RPRNTMVMYO[ RZFTXTZV[XZYY[V R[FUXUZV[",
  2655: " 23LXOYQXRWSUSSRRQROSNTMVMXNZP[S[VYXV RQROTNVNYP[",
  2656: " 27OXRRUOWLXIXGWFUGTIKdKfLgNfOcPZQ[S[UZVYXV RTISNRRO[M`Kd",
  2657: " 38K[UUTSRRPRNSMTLVLXMZO[Q[SZTX RPRNTMVMYO[ RVRPd RWRT[R`PdOfMgLfLdMaO_R]V[YY[V",
  2658: " 30L[LVNSPO RSFL[ RTFM[ ROUQSSRTRVSVUUXUZV[ RTRUSUUTXTZV[XZYY[V",
  2659: " 19NVSLRMSNTMSL RQROXOZQ[SZTYVV RRRPXPZQ[",
  2660: " 24NVSLRMSNTMSL RQRKd RRRO[M`KdJfHgGfGdHaJ_M]Q[TYVV",
  2661: " 31LZLVNSPO RSFL[ RTFM[ RURUSVSURTRRTOU ROURVSZT[ ROUQVRZT[U[XYZV",
  2662: " 17NVNVPSRO RUFOXOZQ[SZTYVV RVFPXPZQ[",
  2663: " 45E^EVGSIRKSKUI[ RIRJSJUH[ RKUMSORPRRSRUP[ RPRQSQUO[ RRUTSVRWRYSYUXXXZY[ RWRXSXUWXWZY[[Z\\Y^V",
  2664: " 32I[IVKSMROSOUM[ RMRNSNUL[ ROUQSSRTRVSVUUXUZV[ RTRUSUUTXTZV[XZYY[V",
  2665: " 29KYRRPRNSMTLVLXMZO[Q[SZTYUWUUTSRRQSQURWTXVXXWYV RPRNTMVMYO[",
  2666: " 30L[LVNSPO RQLHg RRLIg ROUQSSRTRVSVUUXUZV[ RTRUSUUTXTZV[XZYY[V",
  2667: " 35K[UUTSRRPRNSMTLVLXMZO[Q[SZ RPRNTMVMYO[ RVRPdPfQgSfTcT[V[YY[V RWRT[R`Pd",
  2668: " 24LZLVNSPRRSRUP[ RPRQSQUO[ RRUTSVRWRVU RVRVUWWXWZV",
  2669: " 22NZNVPSQQQSTUUWUYTZR[ RQSSUTWTYR[ RNZP[U[XYZV",
  2670: " 20NVNVPSRO RUFOXOZQ[SZTYVV RVFPXPZQ[ RPNVN",
  2671: " 27K[NRLXLZN[O[QZSXUU RORMXMZN[ RVRTXTZV[XZYY[V RWRUXUZV[",
  2672: " 23KZNRMTLWLZN[O[RZTXUUUR RORNTMWMZN[ RURVVWWXWZV",
  2673: " 36H]LRJTIWIZK[L[NZPX RMRKTJWJZK[ RRRPXPZR[S[UZWXXUXR RSRQXQZR[ RXRYVZW[W]V",
  2674: " 42JZJVLSNRPRQSQUPXOZM[L[KZKYLYKZ RWSVTWTWSVRURSSRUQXQZR[U[XYZV RQSRU RSSQU RPXQZ RQXOZ",
  2675: " 32K[NRLXLZN[O[QZSXUU RORMXMZN[ RVRPd RWRT[R`PdOfMgLfLdMaO_R]V[YY[V",
  2676: " 38LYLVNSPRRRTSTVSXPZN[ RRRSSSVRXPZ RN[P\\Q^QaPdNfLgKfKdLaO^R\\VYYV RN[O\\P^PaOdNf",
  2700: " 42H\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF ROGMJLOLRMWOZ RNYQZSZVY RUZWWXRXOWJUG RVHSGQGNH",
  2701: " 12H\\NJPISFS[ RNJNKPJRHR[S[",
  2702: " 34H\\LKLJMHNGPFTFVGWHXJXLWNUQL[ RLKMKMJNHPGTGVHWJWLVNTQK[ RLZYZY[ RK[Y[",
  2703: " 48H\\MFXFQO RMFMGWG RWFPO RQNSNVOXQYTYUXXVZS[P[MZLYKWLW RPOSOVPXS RTOWQXTXUWXTZ RXVVYSZPZMYLW ROZLX",
  2704: " 18H\\UIU[V[ RVFV[ RVFKVZV RUILV RLUZUZV",
  2705: " 53H\\MFLO RNGMN RMFWFWG RNGWG RMNPMSMVNXPYSYUXXVZS[P[MZLYKWLW RLOMOONSNVOXR RTNWPXSXUWXTZ RXVVYSZPZMYLW ROZLX",
  2706: " 62H\\VGWIXIWGTFRFOGMJLOLTMXOZR[S[VZXXYUYTXQVOSNRNOOMQ RWHTGRGOH RPGNJMOMTNXQZ RMVOYRZSZVYXV RTZWXXUXTWQTO RXSVPSOROOPMS RQONQMT",
  2707: " 12H\\KFYFO[ RKFKGXG RXFN[O[",
  2708: " 68H\\PFMGLILKMMNNPOTPVQWRXTXWWYTZPZMYLWLTMRNQPPTOVNWMXKXIWGTFPF RNGMIMKNMPNTOVPXRYTYWXYWZT[P[MZLYKWKTLRNPPOTNVMWKWIVG RWHTGPGMH RLXOZ RUZXX",
  2709: " 62H\\WPURRSQSNRLPKMKLLINGQFRFUGWIXMXRWWUZR[P[MZLXMXNZ RWMVPSR RWNUQRRQRNQLN RPRMPLMLLMIPG RLKNHQGRGUHWK RSGVIWMWRVWTZ RUYRZPZMY",
  2710: " 16MXRXQYQZR[S[TZTYSXRX RRYRZSZSYRY",
  2711: " 24MXTZS[R[QZQYRXSXTYT\\S^Q_ RRYRZSZSYRY RS[T\\ RTZS^",
  2712: " 32MXRMQNQORPSPTOTNSMRM RRNROSOSNRN RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY",
  2713: " 40MXRMQNQORPSPTOTNSMRM RRNROSOSNRN RTZS[R[QZQYRXSXTYT\\S^Q_ RRYRZSZSYRY RS[T\\ RTZS^",
  2714: " 24MXRFRTST RRFSFST RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY",
  2715: " 58I\\LKLJMHNGQFTFWGXHYJYLXNWOUPRQ RLKMKMJNHQGTGWHXJXLWNUORP RMIPG RUGXI RXMTP RRPRTSTSP RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY",
  2716: " 24MXTFRGQIQLRMSMTLTKSJRJQK RRKRLSLSKRK RRGQK RQIRJ",
  2717: " 24MXTHSIRIQHQGRFSFTGTJSLQM RRGRHSHSGRG RSITJ RTHSL",
  2718: " 71F_\\MZMXNWPUVTXSYQZMZKYJWJUKSLRQOSMTKTISGQFPFNGMIMKNNPQUWXZZ[\\[ R\\M\\NZNXO RYNXPVVUXSZQ[M[KZJYIWIUJSLQQNRMSKSIRG RSHQGPGNH ROGNINKONQQVWXYZZ\\Z\\[",
  2719: " 51I\\RBR_S_ RRBSBS_ RWIYIWGTFQFNGLILKMMNNVRWSXUXWWYTZQZOYNX RWIVHTGQGNHMIMKNMVQXSYUYWXYWZT[Q[NZLXNX RXXUZ",
  2720: "  8G^[BIbJb R[B\\BJb",
  2721: " 24KYUBSDQGOKNPNTOYQ]S`UbVb RUBVBTDRGPKOPOTPYR]T`Vb",
  2722: " 24KYNBPDRGTKUPUTTYR]P`NbOb RNBOBQDSGUKVPVTUYS]Q`Ob",
  2723: " 39JZRFQGSQRR RRFRR RRFSGQQRR RMINIVOWO RMIWO RMIMJWNWO RWIVINOMO RWIMO RWIWJMNMO",
  2724: "  8F_JQ[Q[R RJQJR[R",
  2725: " 16F_RIRZSZ RRISISZ RJQ[Q[R RJQJR[R",
  2726: " 16F_JM[M[N RJMJN[N RJU[U[V RJUJV[V",
  2727: " 11NWSFRGRM RSGRM RSFTGRM",
  2728: " 22I[NFMGMM RNGMM RNFOGMM RWFVGVM RWGVM RWFXGVM",
  2729: " 30KYQFOGNINKOMQNSNUMVKVIUGSFQF RQFNIOMSNVKUGQF RSFOGNKQNUMVISF",
  2750: " 42H]TFQGOIMLLOKSKVLYMZO[Q[TZVXXUYRZNZKYHXGVFTF RTFRGPINLMOLSLVMYO[ RQ[SZUXWUXRYNYKXHVF",
  2751: " 15H]TJO[ RVFP[ RVFSIPKNL RUIQKNL",
  2752: " 42H]OJPKOLNKNJOHPGSFVFYGZIZKYMWOTQPSMUKWI[ RVFXGYIYKXMVOPS RJYKXMXRZUZWYXW RMXR[U[WZXW",
  2753: " 50H]OJPKOLNKNJOHPGSFVFYGZIZKYMVOSP RVFXGYIYKXMVO RQPSPVQWRXTXWWYVZS[O[LZKYJWJVKULVKW RSPUQVRWTWWVYUZS[",
  2754: " 10H]XGR[ RYFS[ RYFJUZU",
  2755: " 39H]QFLP RQF[F RQGVG[F RLPMOPNSNVOWPXRXUWXUZR[O[LZKYJWJVKULVKW RSNUOVPWRWUVXTZR[",
  2756: " 46H]YIXJYKZJZIYGWFTFQGOIMLLOKSKWLYMZO[R[UZWXXVXSWQVPTOQOOPMRLT RTFRGPINLMOLSLXMZ RR[TZVXWVWRVP",
  2757: " 30H]NFLL R[FZIXLSRQUPWO[ RXLRRPUOWN[ RMIPFRFWI RNHPGRGWIYIZH[F",
  2758: " 63H]SFPGOHNJNMOOQPTPXOYNZLZIYGVFSF RSFQGPHOJOMPOQP RTPWOXNYLYIXGVF RQPMQKSJUJXKZN[R[VZWYXWXTWRVQTP RQPNQLSKUKXLZN[ RR[UZVYWWWSVQ",
  2759: " 46H]YMXOVQTRQROQNPMNMKNIPGSFVFXGYHZJZNYRXUVXTZQ[N[LZKXKWLVMWLX ROQNONKOIQGSF RXGYIYNXRWUUXSZQ[",
  2760: "  6MXPYOZP[QZPY",
  2761: "  8MXP[OZPYQZQ[P]N_",
  2762: " 11MXSMRNSOTNSM RPYOZP[QZ",
  2763: " 14MXSMRNSOTNSM RP[OZPYQZQ[P]N_",
  2764: " 17MXUFTGRS RUGRS RUFVGRS RPYOZP[QZPY",
  2765: " 34H]OJPKOLNKNJOHPGSFWFZG[I[KZMYNSPQQQSRTTT RWFYGZIZKYMXNVO RPYOZP[QZPY",
  2766: "  8MXVFTHSJSKTLUKTJ",
  2767: "  8MXUHTGUFVGVHUJSL",
  2768: " 55E_\\N[O\\P]O]N\\M[MYNWPRXPZN[K[HZGXGVHTISKRPPROTMUKUITGRFPGOIOLPRQUSXUZW[Y[ZYZX RK[IZHXHVITJSPP ROLPQQTSWUYWZYZZY",
  2769: " 41H]TBL_ RYBQ_ RZJYKZL[K[JZHYGVFRFOGMIMKNMONVRXT RMKOMVQWRXTXWWYVZS[O[LZKYJWJVKULVKW",
  2770: "  3G]_BEb",
  2771: " 20KZZBVESHQKOONTNXO]P`Qb RVESIQMPPOUOZP_Qb",
  2772: " 20JYSBTDUGVLVPUUSYQ\\N_Jb RSBTEUJUOTTSWQ[N_",
  2773: "  9J[TFTR ROIYO RYIOO",
  2774: "  3E_IR[R",
  2775: "  6E_RIR[ RIR[R",
  2776: "  6E_IO[O RIU[U",
  2777: "  6NWUFSM RVFSM",
  2778: " 12I[PFNM RQFNM RYFWM RZFWM",
  2779: " 14KZSFQGPIPKQMSNUNWMXKXIWGUFSF",
  2801: " 18H\\RFK[ RRFY[ RRIX[ RMUVU RI[O[ RU[[[",
  2802: " 31G]LFL[ RMFM[ RIFYFYLXF RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[",
  2803: " 45G]LFL[ RMFM[ RIFUFXGYHZJZLYNXOUP RUFWGXHYJYLXNWOUP RMPUPXQYRZTZWYYXZU[I[ RUPWQXRYTYWXYWZU[",
  2804: " 14I[NFN[ ROFO[ RKFZFZLYF RK[R[",
  2805: " 31F^NFNLMTLXKZJ[ RXFX[ RYFY[ RKF\\F RG[\\[ RG[Gb RH[Gb R[[\\b R\\[\\b",
  2806: " 22G\\LFL[ RMFM[ RSLST RIFYFYLXF RMPSP RI[Y[YUX[",
  2807: " 71CbRFR[ RSFS[ ROFVF RGGHHGIFHFGGFHFIGJIKMLONPWPYOZM[I\\G]F^F_G_H^I]H^G RNPLQKSJXIZH[ RNPMQLSKXJZI[G[FZEX RWPYQZS[X\\Z][ RWPXQYSZX[Z\\[^[_Z`X RO[V[",
  2808: " 45H\\LIKFKLLINGPFTFWGXIXLWNTOQO RTFVGWIWLVNTO RTOVPXRYTYWXYWZT[O[MZLYKWKVLUMVLW RWQXTXWWYVZT[",
  2809: " 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RXHLY RH[O[ RU[\\[",
  2810: " 37F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RXHLY RH[O[ RU[\\[ RN@N?M?M@NBPCTCVBW@",
  2811: " 43F^KFK[ RLFL[ RHFOF RLPSPUOVMWIXGYFZF[G[HZIYHZG RSPUQVSWXXZY[ RSPTQUSVXWZX[Z[[Z\\X RH[O[",
  2812: " 25E^MFMLLTKXJZI[H[GZGYHXIYHZ RXFX[ RYFY[ RJF\\F RU[\\[",
  2813: " 30F_KFK[ RLFRX RKFR[ RYFR[ RYFY[ RZFZ[ RHFLF RYF]F RH[N[ RV[][",
  2814: " 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RLPXP RH[O[ RU[\\[",
  2815: " 44G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RQFOGMILKKOKRLVMXOZQ[ RS[UZWXXVYRYOXKWIUGSF",
  2816: " 21F^KFK[ RLFL[ RXFX[ RYFY[ RHF\\F RH[O[ RU[\\[",
  2817: " 29G]LFL[ RMFM[ RIFUFXGYHZJZMYOXPUQMQ RUFWGXHYJYMXOWPUQ RI[P[",
  2818: " 32G\\XIYLYFXIVGSFQFNGLIKKJNJSKVLXNZQ[S[VZXXYV RQFOGMILKKNKSLVMXOZQ[",
  2819: " 16I\\RFR[ RSFS[ RLFKLKFZFZLYF RO[V[",
  2820: " 24H]KFRV RLFSV RZFSVQYPZN[M[LZLYMXNYMZ RIFOF RVF\\F",
  2821: " 48F_RFR[ RSFS[ ROFVF RPILJJLIOIRJULWPXUXYW[U\\R\\O[LYJUIPI RPIMJKLJOJRKUMWPX RUXXWZU[R[OZLXJUI RO[V[",
  2822: " 21H\\KFX[ RLFY[ RYFK[ RIFOF RUF[F RI[O[ RU[[[",
  2823: " 27F^KFK[ RLFL[ RXFX[ RYFY[ RHFOF RUF\\F RH[\\[ R[[\\b R\\[\\b",
  2824: " 28F]KFKQLSOTRTUSWQ RLFLQMSOT RWFW[ RXFX[ RHFOF RTF[F RT[[[",
  2825: " 30BcGFG[ RHFH[ RRFR[ RSFS[ R]F][ R^F^[ RDFKF ROFVF RZFaF RD[a[",
  2826: " 36BcGFG[ RHFH[ RRFR[ RSFS[ R]F][ R^F^[ RDFKF ROFVF RZFaF RD[a[ R`[ab Ra[ab",
  2827: " 31F`PFP[ RQFQ[ RIFHLHFTF RQPXP[Q\\R]T]W\\Y[ZX[M[ RXPZQ[R\\T\\W[YZZX[",
  2828: " 41CaHFH[ RIFI[ REFLF RIPPPSQTRUTUWTYSZP[E[ RPPRQSRTTTWSYRZP[ R[F[[ R\\F\\[ RXF_F RX[_[",
  2829: " 29H]MFM[ RNFN[ RJFQF RNPUPXQYRZTZWYYXZU[J[ RUPWQXRYTYWXYWZU[",
  2830: " 39H]LIKFKLLINGQFSFVGXIYKZNZSYVXXVZS[P[MZLYKWKVLUMVLW RSFUGWIXKYNYSXVWXUZS[ RPPYP",
  2831: " 59CbHFH[ RIFI[ REFLF RE[L[ RVFSGQIPKOOORPVQXSZV[X[[Z]X^V_R_O^K]I[GXFVF RVFTGRIQKPOPRQVRXTZV[ RX[ZZ\\X]V^R^O]K\\IZGXF RIPOP",
  2832: " 45G]WFW[ RXFX[ R[FOFLGKHJJJLKNLOOPWP ROFMGLHKJKLLNMOOP RRPPQORLYKZJZIY RPQOSMZL[J[IYIX RT[[[",
  2901: " 39I]NONPMPMONNPMTMVNWOXQXXYZZ[ RWOWXXZZ[[[ RWQVRPSMTLVLXMZP[S[UZWX RPSNTMVMXNZP[",
  2902: " 48H\\XFWGQINKLNKQKULXNZQ[S[VZXXYUYSXPVNSMQMNNLPKS RXFWHUIQJNLLN RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM",
  2903: " 37H\\MMM[ RNMN[ RJMUMXNYPYQXSUT RUMWNXPXQWSUT RNTUTXUYWYXXZU[J[ RUTWUXWXXWZU[",
  2904: " 14HZMMM[ RNMN[ RJMXMXRWM RJ[Q[",
  2905: " 22F]NMNQMWLZK[ RWMW[ RXMX[ RKM[M RI[H`H[[[[`Z[",
  2906: " 31H[LSXSXQWOVNTMQMNNLPKSKULXNZQ[S[VZXX RWSWPVN RQMONMPLSLUMXOZQ[",
  2907: " 59E`RMR[ RSMS[ ROMVM RJNIOHNIMJMKNMRNSPTUTWSXRZN[M\\M]N\\O[N RPTNUMVKZJ[ RPTNVLZK[I[HZGX RUTWUXVZZ[[ RUTWVYZZ[\\[]Z^X RO[V[",
  2908: " 42I[MOLMLQMONNPMTMWNXPXQWSTT RTMVNWPWQVSTT RQTTTWUXWXXWZT[P[MZLXLWMVNWMX RTTVUWWWXVZT[",
  2909: " 27G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[P[ RT[[[ RWNMZ",
  2910: " 37G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[P[ RT[[[ RWNMZ ROGOFNFNGOIQJSJUIVG",
  2911: " 38H\\MMM[ RNMN[ RJMQM RNTPTSSTRVNWMXMYNXOWN RPTSUTVVZW[ RPTRUSVUZV[X[YZZX RJ[Q[",
  2912: " 22G]NMNQMWLZK[J[IZJYKZ RWMW[ RXMX[ RKM[M RT[[[",
  2913: " 30G^LML[ RLMR[ RMMRY RXMR[ RXMX[ RYMY[ RIMMM RXM\\M RI[O[ RU[\\[",
  2914: " 27G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RMTWT RI[P[ RT[[[",
  2915: " 36H\\QMNNLPKSKULXNZQ[S[VZXXYUYSXPVNSMQM RQMONMPLSLUMXOZQ[ RS[UZWXXUXSWPUNSM",
  2916: " 21G]LML[ RMMM[ RWMW[ RXMX[ RIM[M RI[P[ RT[[[",
  2917: " 36G\\LMLb RMMMb RMPONQMSMVNXPYSYUXXVZS[Q[OZMX RSMUNWPXSXUWXUZS[ RIMMM RIbPb",
  2918: " 28H[WPVQWRXQXPVNTMQMNNLPKSKULXNZQ[S[VZXX RQMONMPLSLUMXOZQ[",
  2919: " 16I\\RMR[ RSMS[ RMMLRLMYMYRXM RO[V[",
  2920: " 22I[LMR[ RMMRY RXMR[P_NaLbKbJaK`La RJMPM RTMZM",
  2921: " 52H]RFRb RSFSb ROFSF RRPQNPMNMLNKQKWLZN[P[QZRX RNMMNLQLWMZN[ RWMXNYQYWXZW[ RSPTNUMWMYNZQZWYZW[U[TZSX RObVb",
  2922: " 21H\\LMW[ RMMX[ RXML[ RJMPM RTMZM RJ[P[ RT[Z[",
  2923: " 23G]LML[ RMMM[ RWMW[ RXMX[ RIMPM RTM[M RI[[[[`Z[",
  2924: " 28G]LMLTMVPWRWUVWT RMMMTNVPW RWMW[ RXMX[ RIMPM RTM[M RT[[[",
  2925: " 30CbHMH[ RIMI[ RRMR[ RSMS[ R\\M\\[ R]M][ REMLM ROMVM RYM`M RE[`[",
  2926: " 32CbHMH[ RIMI[ RRMR[ RSMS[ R\\M\\[ R]M][ REMLM ROMVM RYM`M RE[`[``_[",
  2927: " 27H]QMQ[ RRMR[ RLMKRKMUM RRTVTYUZWZXYZV[N[ RVTXUYWYXXZV[",
  2928: " 37E_JMJ[ RKMK[ RGMNM RKTOTRUSWSXRZO[G[ ROTQURWRXQZO[ RYMY[ RZMZ[ RVM]M RV[][",
  2929: " 25J[OMO[ RPMP[ RLMSM RPTTTWUXWXXWZT[L[ RTTVUWWWXVZT[",
  2930: " 34I\\MOLMLQMONNPMSMVNXPYSYUXXVZS[P[NZLXLWMVNWMX RSMUNWPXSXUWXUZS[ RRTXT",
  2931: " 51DaIMI[ RJMJ[ RFMMM RF[M[ RVMSNQPPSPUQXSZV[X[[Z]X^U^S]P[NXMVM RVMTNRPQSQURXTZV[ RX[ZZ\\X]U]S\\PZNXM RJTPT",
  2932: " 40G\\VMV[ RWMW[ RZMOMLNKPKQLSOTVT ROMMNLPLQMSOT RTTQUPVNZM[ RTTRUQVOZN[L[KZJX RS[Z[",
  3001: " 36H\\RFKZ RQIW[ RRIX[ RRFY[ RMUVU RI[O[ RT[[[ RKZJ[ RKZM[ RWZU[ RWYV[ RXYZ[",
  3002: " 78G]LFL[ RMGMZ RNFN[ RIFUFXGYHZJZLYNXOUP RXHYJYLXN RUFWGXIXMWOUP RNPUPXQYRZTZWYYXZU[I[ RXRYTYWXY RUPWQXSXXWZU[ RJFLG RKFLH ROFNH RPFNG RLZJ[ RLYK[ RNYO[ RNZP[",
  3003: " 37G\\XIYFYLXIVGTFQFNGLIKKJNJSKVLXNZQ[T[VZXXYV RMILKKNKSLVMX RQFOGMJLNLSMWOZQ[",
  3004: " 62G]LFL[ RMGMZ RNFN[ RIFSFVGXIYKZNZSYVXXVZS[I[ RWIXKYNYSXVWX RSFUGWJXNXSWWUZS[ RJFLG RKFLH ROFNH RPFNG RLZJ[ RLYK[ RNYO[ RNZP[",
  3005: " 83G\\LFL[ RMGMZ RNFN[ RIFYFYL RNPTP RTLTT RI[Y[YU RJFLG RKFLH ROFNH RPFNG RTFYG RVFYH RWFYI RXFYL RTLSPTT RTNRPTR RTOPPTQ RLZJ[ RLYK[ RNYO[ RNZP[ RT[YZ RV[YY RW[YX RX[YU",
  3006: " 70G[LFL[ RMGMZ RNFN[ RIFYFYL RNPTP RTLTT RI[Q[ RJFLG RKFLH ROFNH RPFNG RTFYG RVFYH RWFYI RXFYL RTLSPTT RTNRPTR RTOPPTQ RLZJ[ RLYK[ RNYO[ RNZP[",
  3007: " 60G^XIYFYLXIVGTFQFNGLIKKJNJSKVLXNZQ[T[VZXZY[YS RMILKKNKSLVMX RQFOGMJLNLSMWOZQ[ RXTXY RWSWYVZ RTS\\S RUSWT RVSWU RZSYU R[SYT",
  3008: " 81F^KFK[ RLGLZ RMFM[ RWFW[ RXGXZ RYFY[ RHFPF RTF\\F RMPWP RH[P[ RT[\\[ RIFKG RJFKH RNFMH ROFMG RUFWG RVFWH RZFYH R[FYG RKZI[ RKYJ[ RMYN[ RMZO[ RWZU[ RWYV[ RYYZ[ RYZ[[",
  3009: " 39LXQFQ[ RRGRZ RSFS[ RNFVF RN[V[ ROFQG RPFQH RTFSH RUFSG RQZO[ RQYP[ RSYT[ RSZU[",
  3010: " 45JYSFSWRZQ[ RTGTWSZ RUFUWTZQ[O[MZLXLVMUNUOVOWNXMX RMVMWNWNVMV RPFXF RQFSG RRFSH RVFUH RWFUG",
  3011: " 69F\\KFK[ RLGLZ RMFM[ RXGMR RPPW[ RQPX[ RQNY[ RHFPF RUF[F RH[P[ RT[[[ RIFKG RJFKH RNFMH ROFMG RWFXG RZFXG RKZI[ RKYJ[ RMYN[ RMZO[ RWYU[ RWYZ[",
  3012: " 52I[NFN[ ROGOZ RPFP[ RKFSF RK[Z[ZU RLFNG RMFNH RQFPH RRFPG RNZL[ RNYM[ RPYQ[ RPZR[ RU[ZZ RW[ZY RX[ZX RY[ZU",
  3013: " 63E_JFJZ RJFQ[ RKFQX RLFRX RXFQ[ RXFX[ RYGYZ RZFZ[ RGFLF RXF]F RG[M[ RU[][ RHFJG R[FZH R\\FZG RJZH[ RJZL[ RXZV[ RXYW[ RZY[[ RZZ\\[",
  3014: " 39F^KFKZ RKFY[ RLFXX RMFYX RYGY[ RHFMF RVF\\F RH[N[ RIFKG RWFYG R[FYG RKZI[ RKZM[",
  3015: " 54G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RMILKKNKSLVMX RWXXVYSYNXKWI RQFOGMJLNLSMWOZQ[ RS[UZWWXSXNWJUGSF",
  3016: " 59G]LFL[ RMGMZ RNFN[ RIFUFXGYHZJZMYOXPUQNQ RXHYJYMXO RUFWGXIXNWPUQ RI[Q[ RJFLG RKFLH ROFNH RPFNG RLZJ[ RLYK[ RNYO[ RNZP[",
  3017: " 77G]QFNGLIKKJOJRKVLXNZQ[S[VZXXYVZRZOYKXIVGSFQF RMILKKNKSLVMX RWXXVYSYNXKWI RQFOGMJLNLSMWOZQ[ RS[UZWWXSXNWJUGSF RNXOVQURUTVUXV^W`Y`Z^Z\\ RV\\W^X_Y_ RUXW]X^Y^Z]",
  3018: " 80G]LFL[ RMGMZ RNFN[ RIFUFXGYHZJZLYNXOUPNP RXHYJYLXN RUFWGXIXMWOUP RRPTQUSWYX[Z[[Y[W RWWXYYZZZ RTQURXXYYZY[X RI[Q[ RJFLG RKFLH ROFNH RPFNG RLZJ[ RLYK[ RNYO[ RNZP[",
  3019: " 44H\\XIYFYLXIVGSFPFMGKIKLLNOPURWSXUXXWZ RLLMNOOUQWRXT RMGLILKMMONUPXRYTYWXYWZT[Q[NZLXKUK[LX",
  3020: " 57H\\JFJL RQFQ[ RRGRZ RSFS[ RZFZL RJFZF RN[V[ RKFJL RLFJI RMFJH ROFJG RUFZG RWFZH RXFZI RYFZL RQZO[ RQYP[ RSYT[ RSZU[",
  3021: " 45F^KFKULXNZQ[S[VZXXYUYG RLGLVMX RMFMVNYOZQ[ RHFPF RVF\\F RIFKG RJFKH RNFMH ROFMG RWFYG R[FYG",
  3022: " 34H\\KFR[ RLFRXR[ RMFSX RYGR[ RIFPF RUF[F RJFLH RNFMH ROFMG RWFYG RZFYG",
  3023: " 55F^JFN[ RKFNVN[ RLFOV RRFOVN[ RRFV[ RSFVVV[ RTFWV RZGWVV[ RGFOF RRFTF RWF]F RHFKG RIFKH RMFLH RNFLG RXFZG R\\FZG",
  3024: " 54H\\KFW[ RLFX[ RMFY[ RXGLZ RIFPF RUF[F RI[O[ RT[[[ RJFMH RNFMH ROFMG RVFXG RZFXG RLZJ[ RLZN[ RWZU[ RWYV[ RWYZ[",
  3025: " 48G]JFQQQ[ RKFRQRZ RLFSQS[ RYGSQ RHFOF RVF\\F RN[V[ RIFKG RNFLG RWFYG R[FYG RQZO[ RQYP[ RSYT[ RSZU[",
  3026: " 41H\\YFKFKL RWFK[ RXFL[ RYFM[ RK[Y[YU RLFKL RMFKI RNFKH RPFKG RT[YZ RV[YY RW[YX RX[YU",
  3051: " 38H\\UFIZ RSJT[ RTHUZ RUFUHVYV[ RLUTU RF[L[ RQ[X[ RIZG[ RIZK[ RTZR[ RTYS[ RVYW[",
  3052: " 78F^OFI[ RPFJ[ RQFK[ RLFWFZG[I[KZNYOVP RYGZIZKYNXO RWFXGYIYKXNVP RNPVPXQYSYUXXVZR[F[ RWQXSXUWXUZ RVPWRWUVXTZR[ RMFPG RNFOH RRFPH RSFPG RJZG[ RJYH[ RKYL[ RJZM[",
  3053: " 41H]ZH[H\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[S[UZWXXV RQHOJNLMOLSLWMY RTFRGPJOLNOMSMXNZP[",
  3054: " 63F]OFI[ RPFJ[ RQFK[ RLFUFXGYHZKZOYSWWUYSZO[F[ RWGXHYKYOXSVWTY RUFWHXKXOWSUWRZO[ RMFPG RNFOH RRFPH RSFPG RJZG[ RJYH[ RKYL[ RJZM[",
  3055: " 80F]OFI[ RPFJ[ RQFK[ RULST RLF[FZL RNPTP RF[U[WV RMFPG RNFOH RRFPH RSFPG RWFZG RXFZH RYFZI RZFZL RULSPST RTNRPSR RTOQPSQ RJZG[ RJYH[ RKYL[ RJZM[ RP[UZ RR[UY RUYWV",
  3056: " 70F\\OFI[ RPFJ[ RQFK[ RULST RLF[FZL RNPTP RF[N[ RMFPG RNFOH RRFPH RSFPG RWFZG RXFZH RYFZI RZFZL RULSPST RTNRPSR RTOQPSQ RJZG[ RJYH[ RKYL[ RJZM[",
  3057: " 65H^ZH[H\\F[L[JZHYGWFTFQGOIMLLOKSKVLYMZP[R[UZWXYT RQHOJNLMOLSLWMY RVXWWXT RTFRGPJOLNOMSMXNZP[ RR[TZVWWT RTT\\T RUTWU RVTWW RZTXV R[TXU",
  3058: " 81E_NFH[ ROFI[ RPFJ[ RZFT[ R[FU[ R\\FV[ RKFSF RWF_F RLPXP RE[M[ RQ[Y[ RLFOG RMFNH RQFOH RRFOG RXF[G RYFZH R]F[H R^F[G RIZF[ RIYG[ RJYK[ RIZL[ RUZR[ RUYS[ RVYW[ RUZX[",
  3059: " 39KYTFN[ RUFO[ RVFP[ RQFYF RK[S[ RRFUG RSFTH RWFUH RXFUG ROZL[ ROYM[ RPYQ[ ROZR[",
  3060: " 47I\\WFRWQYO[ RXFTSSVRX RYFUSSXQZO[M[KZJXJVKULUMVMWLXKX RKVKWLWLVKV RTF\\F RUFXG RVFWH RZFXH R[FXG",
  3061: " 72F]OFI[ RPFJ[ RQFK[ R\\GMR RQOU[ RROV[ RSNWZ RLFTF RYF_F RF[N[ RR[Y[ RMFPG RNFOH RRFPH RSFPG RZF\\G R^F\\G RJZG[ RJYH[ RKYL[ RJZM[ RUZS[ RUYT[ RVYX[",
  3062: " 49H\\QFK[ RRFL[ RSFM[ RNFVF RH[W[YU ROFRG RPFQH RTFRH RUFRG RLZI[ RLYJ[ RMYN[ RLZO[ RR[WZ RT[XX RV[YU",
  3063: " 68D`MFGZ RMGNYN[ RNFOY ROFPX R[FPXN[ R[FU[ R\\FV[ R]FW[ RJFOF R[F`F RD[J[ RR[Z[ RKFMG RLFMH R^F\\H R_F\\G RGZE[ RGZI[ RVZS[ RVYT[ RWYX[ RVZY[",
  3064: " 43F_OFIZ ROFV[ RPFVX RQFWX R\\GWXV[ RLFQF RYF_F RF[L[ RMFPG RNFPH RZF\\G R^F\\G RIZG[ RIZK[",
  3065: " 56G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF ROIMLLOKSKWLY RUXWUXRYNYJXH RSFQGOJNLMOLSLXMZN[ RQ[SZUWVUWRXNXIWGVF",
  3066: " 60F]OFI[ RPFJ[ RQFK[ RLFXF[G\\I\\K[NYPUQMQ RZG[I[KZNXP RXFYGZIZKYNWPUQ RF[N[ RMFPG RNFOH RRFPH RSFPG RJZG[ RJYH[ RKYL[ RJZM[",
  3067: " 78G]SFPGNILLKOJSJVKYLZN[Q[TZVXXUYRZNZKYHXGVFSF ROIMLLOKSKWLY RUXWUXRYNYJXH RSFQGOJNLMOLSLXMZN[ RQ[SZUWVUWRXNXIWGVF RLXMVOUPURVSXT]U^V^W] RT^U_V_ RSXS_T`V`W]W\\",
  3068: " 78F^OFI[ RPFJ[ RQFK[ RLFWFZG[I[KZNYOVPNP RYGZIZKYNXO RWFXGYIYKXNVP RRPTQURWXXYYYZX RWYXZYZ RURVZW[Y[ZXZW RF[N[ RMFPG RNFOH RRFPH RSFPG RJZG[ RJYH[ RKYL[ RJZM[",
  3069: " 44G^ZH[H\\F[L[JZHYGVFRFOGMIMLNNPPVSWUWXVZ RNLONVRWT ROGNINKOMUPWRXTXWWYVZS[O[LZKYJWJUI[JYKY",
  3070: " 54G]TFN[ RUFO[ RVFP[ RMFKL R]F\\L RMF]F RK[S[ RNFKL RPFLI RRFMG RYF\\G RZF\\H R[F\\I R\\F\\L ROZL[ ROYM[ RPYQ[ ROZR[",
  3071: " 48F_NFKQJUJXKZN[R[UZWXXU\\G ROFLQKUKYLZ RPFMQLULYN[ RKFSF RYF_F RLFOG RMFNH RQFOH RRFOG RZF\\G R^F\\G",
  3072: " 35H\\NFNHOYO[ ROGPX RPFQW R[GO[ RLFSF RXF^F RMFNH RQFPH RRFOG RYF[G R]F[G",
  3073: " 57E_MFMHKYK[ RNGLX ROFMW RUFMWK[ RUFUHSYS[ RVGTX RWFUW R]GUWS[ RJFRF RUFWF RZF`F RKFNG RLFMH RPFNI RQFNG R[F]G R_F]G",
  3074: " 54G]NFT[ ROFU[ RPFV[ R[GIZ RLFSF RXF^F RF[L[ RQ[X[ RMFOH RQFPH RRFPG RYF[G R]F[G RIZG[ RIZK[ RTZR[ RTYS[ RUYW[",
  3075: " 51G]MFQPN[ RNFRPO[ ROFSPP[ R\\GSP RKFRF RYF_F RK[S[ RLFNG RPFOH RQFNG RZF\\G R^F\\G ROZL[ ROYM[ RPYQ[ ROZR[",
  3076: " 35G]ZFH[ R[FI[ R\\FJ[ R\\FNFLL RH[V[XU ROFLL RPFMI RRFNG RR[VZ RT[WX RU[XU",
  3101: " 54I]NPNOOOOQMQMONNPMTMVNWOXQXXYZZ[ RVOWQWXXZ RTMUNVPVXWZZ[[[ RVRUSPTMULWLXMZP[S[UZVX RNUMWMXNZ RUSQTOUNWNXOZP[",
  3102: " 47G\\LFL[MZOZ RMGMY RIFNFNZ RNPONQMSMVNXPYSYUXXVZS[Q[OZNX RWPXRXVWX RSMUNVOWRWVVYUZS[ RJFLG RKFLH",
  3103: " 34H[WQWPVPVRXRXPVNTMQMNNLPKSKULXNZQ[S[VZXX RMPLRLVMX RQMONNOMRMVNYOZQ[",
  3104: " 52H]VFV[[[ RWGWZ RSFXFX[ RVPUNSMQMNNLPKSKULXNZQ[S[UZVX RMPLRLVMX RQMONNOMRMVNYOZQ[ RTFVG RUFVH RXYY[ RXZZ[",
  3105: " 41H[MSXSXQWOVNSMQMNNLPKSKULXNZQ[S[VZXX RWRWQVO RMPLRLVMX RVSVPUNSM RQMONNOMRMVNYOZQ[",
  3106: " 40KYWHWGVGVIXIXGWFTFRGQHPKP[ RRHQKQZ RTFSGRIR[ RMMVM RM[U[ RPZN[ RPYO[ RRYS[ RRZT[",
  3107: " 89I\\XNYOZNYMXMVNUO RQMONNOMQMSNUOVQWSWUVVUWSWQVOUNSMQM ROONQNSOU RUUVSVQUO RQMPNOPOTPVQW RSWTVUTUPTNSM RNUMVLXLYM[N\\Q]U]X^Y_ RN[Q\\U\\X] RLYMZP[U[X\\Y^Y_XaUbObLaK_K^L\\O[ RObMaL_L^M\\O[",
  3108: " 65G^LFL[ RMGMZ RIFNFN[ RNQOOPNRMUMWNXOYRY[ RWOXRXZ RUMVNWQW[ RI[Q[ RT[\\[ RJFLG RKFLH RLZJ[ RLYK[ RNYO[ RNZP[ RWZU[ RWYV[ RYYZ[ RYZ[[",
  3109: " 43LXQFQHSHSFQF RRFRH RQGSG RQMQ[ RRNRZ RNMSMS[ RN[V[ ROMQN RPMQO RQZO[ RQYP[ RSYT[ RSZU[",
  3110: " 41KXRFRHTHTFRF RSFSH RRGTG RRMR^QaPb RSNS]R` ROMTMT]S`RaPbMbLaL_N_NaMaM` RPMRN RQMRO",
  3111: " 61G]LFL[ RMGMZ RIFNFN[ RWNNW RRSY[ RRTX[ RQTW[ RTM[M RI[Q[ RT[[[ RJFLG RKFLH RUMWN RZMWN RLZJ[ RLYK[ RNYO[ RNZP[ RWYU[ RVYZ[",
  3112: " 31LXQFQ[ RRGRZ RNFSFS[ RN[V[ ROFQG RPFQH RQZO[ RQYP[ RSYT[ RSZU[",
  3113: " 99AcFMF[ RGNGZ RCMHMH[ RHQIOJNLMOMQNROSRS[ RQORRRZ ROMPNQQQ[ RSQTOUNWMZM\\N]O^R^[ R\\O]R]Z RZM[N\\Q\\[ RC[K[ RN[V[ RY[a[ RDMFN REMFO RFZD[ RFYE[ RHYI[ RHZJ[ RQZO[ RQYP[ RSYT[ RSZU[ R\\ZZ[ R\\Y[[ R^Y_[ R^Z`[",
  3114: " 65G^LML[ RMNMZ RIMNMN[ RNQOOPNRMUMWNXOYRY[ RWOXRXZ RUMVNWQW[ RI[Q[ RT[\\[ RJMLN RKMLO RLZJ[ RLYK[ RNYO[ RNZP[ RWZU[ RWYV[ RYYZ[ RYZ[[",
  3115: " 46H\\QMNNLPKSKULXNZQ[S[VZXXYUYSXPVNSMQM RMPLRLVMX RWXXVXRWP RQMONNOMRMVNYOZQ[ RS[UZVYWVWRVOUNSM",
  3116: " 60G\\LMLb RMNMa RIMNMNb RNPONQMSMVNXPYSYUXXVZS[Q[OZNX RWPXRXVWX RSMUNVOWRWVVYUZS[ RIbQb RJMLN RKMLO RLaJb RL`Kb RN`Ob RNaPb",
  3117: " 55H\\VNVb RWOWa RUNWNXMXb RVPUNSMQMNNLPKSKULXNZQ[S[UZVX RMPLRLVMX RQMONNOMRMVNYOZQ[ RSb[b RVaTb RV`Ub RX`Yb RXaZb",
  3118: " 43IZNMN[ RONOZ RKMPMP[ RWOWNVNVPXPXNWMUMSNQPPS RK[S[ RLMNN RMMNO RNZL[ RNYM[ RPYQ[ RPZR[",
  3119: " 43J[WOXMXQWOVNTMPMNNMOMQNSPTUUWVXY RNNMQ RNRPSUTWU RXVWZ RMONQPRUSWTXVXYWZU[Q[OZNYMWM[NY",
  3120: " 22KZPHPVQYRZT[V[XZYX RQHQWRY RPHRFRWSZT[ RMMVM",
  3121: " 43G^LMLVMYNZP[S[UZVYWW RMNMWNY RIMNMNWOZP[ RWMW[\\[ RXNXZ RTMYMY[ RJMLN RKMLO RYYZ[ RYZ[[",
  3122: " 31I[LMR[ RMMRY RNMSY RXNSYR[ RJMQM RTMZM RKMNO RPMNN RVMXN RYMXN",
  3123: " 45F^JMN[ RKMNX RLMOX RRMOXN[ RRMV[ RSMVX RRMTMWX RZNWXV[ RGMOM RWM]M RHMKN RNMLN RXMZN R\\MZN",
  3124: " 48H\\LMV[ RMMW[ RNMX[ RWNMZ RJMQM RTMZM RJ[P[ RS[Z[ RKMMN RPMNN RUMWN RYMWN RMZK[ RMZO[ RVZT[ RWZY[",
  3125: " 40H[LMR[ RMMRY RNMSY RXNSYP_NaLbJbIaI_K_KaJaJ` RJMQM RTMZM RKMNO RPMNN RVMXN RYMXN",
  3126: " 41I[VML[ RWMM[ RXMN[ RXMLMLQ RL[X[XW RMMLQ RNMLP ROMLO RQMLN RS[XZ RU[XY RV[XX RW[XW",
  3151: " 50G]WMUTUXVZW[Y[[Y\\W RXMVTVZ RWMYMWTVX RUTUQTNRMPMMNKQJTJVKYLZN[P[RZSYTWUT RNNLQKTKWLY RPMNOMQLTLWMZN[",
  3152: " 52I\\PFNMMSMWNYOZQ[S[VZXWYTYRXOWNUMSMQNPOOQNT RQFOMNQNWOZ RVYWWXTXQWO RMFRFPMNT RS[UYVWWTWQVNUM RNFQG ROFPH",
  3153: " 34I[WQWPVPVRXRXPWNUMRMONMQLTLVMYNZP[R[UZWW ROONQMTMWNY RRMPOOQNTNWOZP[",
  3154: " 58G]YFVQUUUXVZW[Y[[Y\\W RZFWQVUVZ RVF[FWTVX RUTUQTNRMPMMNKQJTJVKYLZN[P[RZSYTWUT RMOLQKTKWLY RPMNOMQLTLWMZN[ RWFZG RXFYH",
  3155: " 33I[MVQUTTWRXPWNUMRMONMQLTLVMYNZP[R[UZWX ROONQMTMWNY RRMPOOQNTNWOZP[",
  3156: " 45JZZHZGYGYI[I[GZFXFVGTISKRNQRO[N^M`Kb RTJSMRRP[O^ RXFVHUJTMSRQZP]O_MaKbIbHaH_J_JaIaI` RNMYM",
  3157: " 57H]XMT[S^QaOb RYMU[S_ RXMZMV[T_RaObLbJaI`I^K^K`J`J_ RVTVQUNSMQMNNLQKTKVLYMZO[Q[SZTYUWVT RNOMQLTLWMY RQMOONQMTMWNZO[",
  3158: " 41G]OFI[K[ RPFJ[ RLFQFK[ RMTOPQNSMUMWNXPXSVX RWNWRVVVZ RWPUUUXVZW[Y[[Y\\W RMFPG RNFOH",
  3159: " 35KXSFSHUHUFSF RTFTH RSGUG RLQMOOMQMRNSPSSQX RRNRRQVQZ RRPPUPXQZR[T[VYWW",
  3160: " 45KXUFUHWHWFUF RVFVH RUGWG RMQNOPMRMSNTPTSRZQ]P_NaLbJbIaI_K_KaJaJ` RSNSSQZP]O_ RSPRTP[O^N`Lb",
  3161: " 49G]OFI[K[ RPFJ[ RLFQFK[ RYOYNXNXPZPZNYMWMUNQROS RMSOSQTRUTYUZWZ RQUSYTZ ROSPTRZS[U[WZYW RMFPG RNFOH",
  3162: " 26LXTFQQPUPXQZR[T[VYWW RUFRQQUQZ RQFVFRTQX RRFUG RSFTH",
  3163: " 61@cAQBODMFMGNHPHSF[ RGNGSE[ RGPFTD[F[ RHSJPLNNMPMRNSPSSQ[ RRNRSP[ RRPQTO[Q[ RSSUPWNYM[M]N^P^S\\X R]N]R\\V\\Z R]P[U[X\\Z][_[aYbW",
  3164: " 42F^GQHOJMLMMNNPNSL[ RMNMSK[ RMPLTJ[L[ RNSPPRNTMVMXNYPYSWX RXNXRWVWZ RXPVUVXWZX[Z[\\Y]W",
  3165: " 46H\\QMNNLQKTKVLYMZP[S[VZXWYTYRXOWNTMQM RNOMQLTLWMY RVYWWXTXQWO RQMOONQMTMWNZP[ RS[UYVWWTWQVNTM",
  3166: " 66G]HQIOKMMMNNOPOSNWKb RNNNSMWJb RNPMTIb ROTPQQORNTMVMXNYOZRZTYWWZT[R[PZOWOT RXOYQYTXWWY RVMWNXQXTWWVYT[ RFbNb RJaGb RJ`Hb RK`Lb RJaMb",
  3167: " 57G\\WMQb RXMRb RWMYMSb RUTUQTNRMPMMNKQJTJVKYLZN[P[RZSYTWUT RMOLQKTKWLY RPMNOMQLTLWMZN[ RNbVb RRaOb RR`Pb RS`Tb RRaUb",
  3168: " 30I[JQKOMMOMPNQPQTO[ RPNPTN[ RPPOTM[O[ RYOYNXNXPZPZNYMWMUNSPQT",
  3169: " 47J[XPXOWOWQYQYOXNUMRMONNONQOSQTTUVVWX RONNQ RORQSTTVU RWVVZ RNOOQQRTSVTWVWXVZS[P[MZLYLWNWNYMYMX",
  3170: " 23KYTFQQPUPXQZR[T[VYWW RUFRQQUQZ RTFVFRTQX RNMXM",
  3171: " 42F^GQHOJMLMMNNPNSLX RMNMRLVLZ RMPKUKXLZN[P[RZTXVU RXMVUVXWZX[Z[\\Y]W RYMWUWZ RXMZMXTWX",
  3172: " 29H\\IQJOLMNMONPPPSNX RONORNVNZ ROPMUMXNZP[R[TZVXXUYQYMXMXNYP",
  3173: " 48CaDQEOGMIMJNKPKSIX RJNJRIVIZ RJPHUHXIZK[M[OZQXRU RTMRURXSZU[W[YZ[X]U^Q^M]M]N^P RUMSUSZ RTMVMTTSX",
  3174: " 51G]JQLNNMPMRNSPSR RPMQNQRPVOXMZK[I[HZHXJXJZIZIY RRORRQVQY RZOZNYNYP[P[NZMXMVNTPSRRVRZS[ RPVPXQZS[U[WZYW",
  3175: " 49G]HQIOKMMMNNOPOSMX RNNNRMVMZ RNPLULXMZO[Q[SZUXWT RYMU[T^RaPb RZMV[T_ RYM[MW[U_SaPbMbKaJ`J^L^L`K`K_",
  3176: " 39H\\YMXOVQNWLYK[ RXOOOMPLR RVORNONNO RVORMOMMOLR RLYUYWXXV RNYRZUZVY RNYR[U[WYXV",
  3200: " 50H\\QFNGLJKOKRLWNZQ[S[VZXWYRYOXJVGSFQF RNHMJLNLSMWNY RVYWWXSXNWJVH RQFOGNIMNMSNXOZQ[ RS[UZVXWSWNVIUGSF",
  3201: " 28H\\QHQ[ RRHRZ RSFS[ RSFPINJ RM[W[ RQZO[ RQYP[ RSYT[ RSZU[",
  3202: " 62H\\LJLKMKMJLJ RLIMINJNKMLLLKKKJLHMGPFTFWGXHYJYLXNUPPRNSLUKXK[ RWHXJXLWN RTFVGWJWLVNTPPR RKYLXNXSYWYYX RNXSZWZXY RNXS[W[XZYXYV",
  3203: " 76H\\LJLKMKMJLJ RLIMINJNKMLLLKKKJLHMGPFTFWGXIXLWNTO RVGWIWLVN RSFUGVIVLUNSO RQOTOVPXRYTYWXYWZT[P[MZLYKWKVLUMUNVNWMXLX RWRXTXWWY RSOUPVQWTWWVZT[ RLVLWMWMVLV",
  3204: " 28H\\SIS[ RTHTZ RUFU[ RUFJUZU RP[X[ RSZQ[ RSYR[ RUYV[ RUZW[",
  3205: " 55H\\MFKPMNPMSMVNXPYSYUXXVZS[P[MZLYKWKVLUMUNVNWMXLX RWPXRXVWX RSMUNVOWRWVVYUZS[ RLVLWMWMVLV RMFWF RMGUG RMHQHUGWF",
  3206: " 69H\\VIVJWJWIVI RWHVHUIUJVKWKXJXIWGUFRFOGMILKKOKULXNZQ[S[VZXXYUYTXQVOSNQNOONPMR RNIMKLOLUMXNY RWXXVXSWQ RRFPGOHNJMNMUNXOZQ[ RS[UZVYWVWSVPUOSN",
  3207: " 43H\\KFKL RYFYIXLTQSSRWR[ RSRRTQWQ[ RXLSQQTPWP[R[ RKJLHNFPFUIWIXHYF RMHNGPGRH RKJLINHPHUI",
  3208: " 79H\\PFMGLILLMNPOTOWNXLXIWGTFPF RNGMIMLNN RVNWLWIVG RPFOGNINLONPO RTOUNVLVIUGTF RPOMPLQKSKWLYMZP[T[WZXYYWYSXQWPTO RMQLSLWMY RWYXWXSWQ RPONPMSMWNZP[ RT[VZWWWSVPTO",
  3209: " 69H\\MWMXNXNWMW RWOVQURSSQSNRLPKMKLLINGQFSFVGXIYLYRXVWXUZR[O[MZLXLWMVNVOWOXNYMY RMPLNLKMI RVHWIXLXRWVVX RQSORNQMNMKNHOGQF RSFUGVIWLWSVWUYTZR[",
  3210: " 16MXRXQYQZR[S[TZTYSXRX RRYRZSZSYRY",
  3211: " 24MXTZS[R[QZQYRXSXTYT\\S^Q_ RRYRZSZSYRY RS[T\\ RTZS^",
  3212: " 32MXRMQNQORPSPTOTNSMRM RRNROSOSNRN RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY",
  3213: " 40MXRMQNQORPSPTOTNSMRM RRNROSOSNRN RTZS[R[QZQYRXSXTYT\\S^Q_ RRYRZSZSYRY RS[T\\ RTZS^",
  3214: " 34MXRFQGQIRQ RRFRTST RRFSFST RSFTGTISQ RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY",
  3215: " 52I\\MKMJNJNLLLLJMHNGPFTFWGXHYJYLXNWOSQ RWHXIXMWN RTFVGWIWMVOUP RRQRTSTSQRQ RRXQYQZR[S[TZTYSXRX RRYRZSZSYRY",
  3216: " 24MXTFRGQIQLRMSMTLTKSJRJQK RRKRLSLSKRK RRGQK RQIRJ",
  3217: " 24MXTHSIRIQHQGRFSFTGTJSLQM RRGRHSHSGRG RSITJ RTHSL",
  3218: " 74E_[O[NZNZP\\P\\N[MZMYNXPVUTXRZP[L[JZIXIUJSPORMSKSIRGPFNGMIMLNOPRTWWZY[[[\\Y\\X RKZJXJUKSLR RRMSI RSKRG RNGMK RNNPQTVWYYZ RN[LZKXKULSPO RMINMQQUVXYZZ[Z\\Y",
  3219: " 56H\\PBP_ RTBT_ RXKXJWJWLYLYJXHWGTFPFMGKIKLLNOPURWSXUXXWZ RLLMNOOUQWRXT RMGLILKMMONUPXRYTYWXYWZT[P[MZLYKWKUMUMWLWLV",
  3220: "  8G^[BIbJb R[B\\BJb",
  3221: " 27KYUBSDQGOKNPNTOYQ]S`Ub RQHPKOOOUPYQ\\ RSDRFQIPOPUQ[R^S`",
  3222: " 27KYOBQDSGUKVPVTUYS]Q`Ob RSHTKUOUUTYS\\ RQDRFSITOTUS[R^Q`",
  3223: " 39JZRFQGSQRR RRFRR RRFSGQQRR RMINIVOWO RMIWO RMIMJWNWO RWIVINOMO RWIMO RWIWJMNMO",
  3224: "  8F_JQ[Q[R RJQJR[R",
  3225: " 16F_RIRZSZ RRISISZ RJQ[Q[R RJQJR[R",
  3226: " 16F_JM[M[N RJMJN[N RJU[U[V RJUJV[V",
  3227: " 11NWSFRGRM RSGRM RSFTGRM",
  3228: " 22I[NFMGMM RNGMM RNFOGMM RWFVGVM RWGVM RWFXGVM",
  3229: " 30KYQFOGNINKOMQNSNUMVKVIUGSFQF RQFNIOMSNVKUGQF RSFOGNKQNUMVISF",
  3250: " 58H]TFQGOIMLLOKSKVLYMZO[Q[TZVXXUYRZNZKYHXGVFTF RQHOJNLMOLSLWMY RTYVWWUXRYNYJXH RTFRGPJOLNOMSMXNZO[ RQ[SZUWVUWRXNXIWGVF",
  3251: " 20H]TJO[Q[ RWFUJP[ RWFQ[ RWFTIQKOL RTJRKOL",
  3252: " 52H]OKOJPJPLNLNJOHPGSFVFYGZIZKYMWOMUKWI[ RXGYIYKXMVOSQ RVFWGXIXKWMUOMU RJYKXMXRYWYXX RMXRZWZ RMXR[U[WZXXXW",
  3253: " 64H]OKOJPJPLNLNJOHPGSFVFYGZIZKYMXNVOSP RXGYIYKXMWN RVFWGXIXKWMUOSP RQPSPVQWRXTXWWYUZR[O[LZKYJWJULULWKWKV RVRWTWWVY RSPUQVSVWUYTZR[",
  3254: " 15H]WJR[T[ RZFXJS[ RZFT[ RZFJUZU",
  3255: " 49H]QFLP RQF[F RQGYG RPHUHYG[F RLPMOPNSNVOWPXRXUWXUZQ[N[LZKYJWJULULWKWKV RVPWRWUVXTZ RSNUOVQVUUXSZQ[",
  3256: " 61H]YJYIXIXKZKZIYGWFTFQGOIMLLOKSKVLYMZO[R[UZWXXVXSWQVPTOQOOPNQMS RPINLMOLSLWMY RVXWVWSVQ RTFRGPJOLNOMSMXNZO[ RR[TZUYVVVRUPTO",
  3257: " 39H]NFLL R[FZIXLTQRTQWP[ RRSPWO[ RXLRRPUOWN[P[ RMIPFRFWI ROGRGWI RMIOHRHWIYIZH[F",
  3258: "104H]SFPGOHNJNMOOQPTPWOYNZLZIYGWFSF RUFPG RPHOJONPO ROORP RSPWO RXNYLYIXG RYGUF RSFQHPJPNQP RTPVOWNXLXHWF RQPMQKSJUJXKZN[R[VZWYXWXTWRVQTP RRPMQ RNQLSKUKXLZ RKZP[VZ RVYWWWTVR RVQSP RQPOQMSLULXMZN[ RR[TZUYVWVSUQTP",
  3259: " 61H]XNWPVQTRQROQNPMNMKNIPGSFVFXGYHZKZNYRXUVXTZQ[N[LZKXKVMVMXLXLW ROPNNNKOI RXHYJYNXRWUUX RQRPQOOOKPHQGSF RVFWGXIXNWRVUUWSZQ[",
  3260: " 16MXPXOYOZP[Q[RZRYQXPX RPYPZQZQYPY",
  3261: " 22MXQ[P[OZOYPXQXRYR[Q]P^N_ RPYPZQZQYPY RQ[Q\\P^",
  3262: " 32MXSMRNROSPTPUOUNTMSM RSNSOTOTNSN RPXOYOZP[Q[RZRYQXPX RPYPZQZQYPY",
  3263: " 38MXSMRNROSPTPUOUNTMSM RSNSOTOTNSN RQ[P[OZOYPXQXRYR[Q]P^N_ RPYPZQZQYPY RQ[Q\\P^",
  3264: " 34MXVFUFTGRT RVGUGRT RVGVHRT RVFWGWHRT RPXOYOZP[Q[RZRYQXPX RPYPZQZQYPY",
  3265: " 59H]OKOJPJPLNLNJOHPGSFWFZG[I[KZMYNWOSPQQQSSTTT RUFZG RYGZIZKYMXNVO RWFXGYIYKXMWNSPRQRSST RPXOYOZP[Q[RZRYQXPX RPYPZQZQYPY",
  3266: " 22MXWFUGTHSJSLTMUMVLVKUJTJ RUGTITJ RTKTLULUKTK",
  3267: " 22MXVIUITHTGUFVFWGWIVKULSM RUGUHVHVGUG RVIVJUL",
  3268: " 72E_\\O\\N[N[P]P]N\\M[MYNWPRXPZN[K[HZGXGVHTISKRPPROTMUKUITGRFPGOIOLPRQURWTZV[X[YYYX RL[HZ RIZHXHVITJSLR RPPQSTYVZ RK[JZIXIVJTKSMRRO ROLPOQRSVUYWZXZYY",
  3269: " 52H]TBL_ RYBQ_ RZKZJYJYL[L[JZHYGVFRFOGMIMLNNPPVSWUWXVZ RNLONVRWT ROGNINKOMUPWRXTXWWYVZS[O[LZKYJWJULULWKWKV",
  3270: "  8G^_BEbFb R_B`BFb",
  3271: " 32JZZBXCUERHPKNOMSMXN\\O_Qb RSHQKOONTN\\ RZBWDTGRJQLPOOSN\\ RNTO]P`Qb",
  3272: " 32JZSBUEVHWLWQVUTYR\\O_LaJb RVHVPUUSYQ\\ RSBTDUGVP RVHUQTUSXRZP]M`Jb",
  3273: " 39J[TFSGUQTR RTFTR RTFUGSQTR ROIPIXOYO ROIYO ROIOJYNYO RYIXIPOOO RYIOO RYIYJONOO",
  3274: "  8F_JQ[Q[R RJQJR[R",
  3275: " 16F_RIRZSZ RRISISZ RJQ[Q[R RJQJR[R",
  3276: " 16F_JM[M[N RJMJN[N RJU[U[V RJUJV[V",
  3277: " 11MWUFTGRM RUGRM RUFVGRM",
  3278: " 22H\\PFOGMM RPGMM RPFQGMM RZFYGWM RZGWM RZF[GWM",
  3279: " 30KZSFQGPIPKQMSNUNWMXKXIWGUFSF RSFPIQMUNXKWGSF RUFQGPKSNWMXIUF",
  3301: " 62F^IHJIIJHIIGKFMFOGPHQKQOPRNTLUIV ROHPKPPOR RMFNGOJOPNSLU RLVOY RKVOZ RIVN[UV R\\G[H\\H\\G[FYFWGVHUJUYW[[W RWHVJVXXZ RYFXGWJWWYY",
  3302: "101E_GQGRHSJSLRLOKMIJIHKF RKOIK RJSKRKPIMHKHIIGKFNFPGQHRJRRQUOW RPHQJQT RNFOGPJPUOW RRISGUFWFYGZH[J\\K RYHZJ RWFXGYJZK\\K R\\KRP RYM[O\\R\\U[XYZV[S[PZJWIWHX RXNYN[P RVNYO[Q\\S RTZRZLWKW RZYXZUZRYNWKVIVHXHZI[JZIY",
  3303: " 79F^RHPFNFLGJJINIRJVLYNZQ[T[WZYY[W RLHKJJMJRKVMYPZ RNFMGLIKMKQLUMWOYRZUZXY[W RUFRHQIPKPLQNTPURUT RQKQLUPUQ RQIQJRLUNVPVRUTSURUPTOR RUFVGXHZH RUGVHWH RTGVIXIZH[G",
  3304: " 79E_HLHKIIKGNFRFUGWHYJ[M\\Q\\U[XYZV[S[PZJWIWHX RKHMGRGUHWIYK[N RTZRZLWKW RHKJIMHRHUIWJYL[O\\R RZYXZUZRYNWKVIVHXHZI[JZIY RPHMKLMLONSNU RMNMONQNR RMKMMOQOSNUMVKVJUJT",
  3305: " 95F^RHPFNFLGJJINIRJVLYNZQ[T[WZYY[W RLHKJJMJRKVMYPZ RNFMGLIKMKQLUMWOYRZUZXY[W RUFRHQIPKPLQNTPURUT RQKQLUPUQ RQIQJRLUNVPVRUTSURUPTOR RUFVGXHZH RUGVHWH RTGVIXIZH[G RUNYK RYKZL\\L RXLYMZM RWMXNZN\\L",
  3306: " 94F^MNKMJKJIKGNFQFTGXI RKHMGRGUH RJKKIMHRHXIZI[H[GZFYF RSHRIQKQMROVSWVWYV\\U]S^ RTPWSXVXYW[ RQMSOVQXSYVYYX[V]S^O^L]K\\JZJWLTLRKQ RL\\K[KWLU RO^M]L[LWMTMRLQJQIRIS RUPYL RYLZM\\M RXMYNZN RWNXOZO\\M",
  3307: " 99E_UJTHSGQFNFKGIJHNHRIUJWLYNZQ[T[WZYY[W\\T\\Q[NYL RKHJJIMIRJUKW RZW[U[QZNYM RNFLGKIJMJRKVLXNZ RWZYXZUZQYOWM RUFRHPJOLOMPOSQTSTU RPLPMTQTR RPJPKQMTOUQUSTURVQVOUNS RTOYLZJ R\\FZJ RYG]I R\\F[GYGZHZJ[I]I\\H\\F",
  3308: " 92F_RFPGNIMKMMNOPQQSQU RNLNMQQQR RNINKOMQORQRSQUPVNWLWJVIUHSHQIPJQIR RRFTHVHXG RQGSH RPGQHSIUIXG RRPYK RYK[N\\Q\\T[WYYVZR[ RXLZN[Q[UZW RVMWMYOZRZVYXXYVZ RVZTZRYPYNZM\\N^P_R_T^ RSZQZ RR[PZNZ",
  3309: " 83F_PPNPLOKNJLJJKHLGOFQFTGWJYK RLHNGRGTHUI RJJKIMHQHTIVJYK[K\\J\\H[GYG RJXKYJZIYIWJVLVNWPYR\\T^ RNXOYQ\\R] RLVMWNYP\\Q]S^V^X]Y\\ZZZWYUWRVPVO RYXYWVRVQ RX]Y[YYXWVTURUPWNYNZOZP",
  3310: " 83F_PPNPLOKNJLJJKHLGOFQFTGWJYK RLHNGRGTHUI RJJKIMHQHTIVJYK[K\\J\\H[GYG RJXKYJZIYIWJVLVNWPYR\\T^ RNXOYQ\\R] RLVMWNYP\\Q]S^V^X]Y\\ZZZWYUWRVPVO RYXYWVRVQ RX]Y[YYXWVTURUPWNYNZOZP",
  3311: " 81E_[KZIXGUFRFOGMILKLNMQPWPYN[ RMNMOPUPV RNHMJMMNOPSQVQXPZN[L[JZ RHVJZ RGYKW RHVHXGYIYJZJXKWIWHV RNONMOKQJTJVKXMYM RUKWM RRJTKULVN RYMPQ RUOYXZY[Y RTPXXZZ RSPWYY[\\X",
  3312: " 73G^ZSYTVTUSUQVOXLYJYH RVQVPYLYK RWTVSVRWPYNZLZJYHXGUFPFMGLHKJKLLNNQOSOTNV RLKLLOQOR RLHLJMLOOPQPSOUMWJY RMWOWRYUZXZZY RNXOXSZTZ RJYLXMXQZT[V[YZZY[W",
  3313: "128BbEQERFSHSJRJOIMGJGHIF RIOGK RHSIRIPGMFKFIGGIFKFMGOIPLPROUNWLYI[HZGZ RNIOLORNUMW RJZIYHY RKFMHNKNRMVLXKYJXIXF[ RNGPFRFTGVIWLWRVUUWSYQ[PZOZ RUIVLVRUV RRZQYPY RRFTHUKUSTWSYRXQXN[ RUHVGXFZF\\G]H^J_K R\\H]J RZF[G\\J]K_K R_K\\M[NZQZT[X][`X R\\N[P[T\\W^Z R_K]M\\O\\S]W_Y",
  3314: " 96D`GQGRHSJSLRLOKMIJIHKF RKOIK RJSKRKPIMHKHIIGKFNFPGRISLSRRUQWOYL[KZIZG[ RQIRKRRQUPWOX RMZKYIY RNFPHQKQRPVNYLXJXG[ RRHSGUFWFYGZH[J\\K RYHZJ RWFXGYJZK\\K R\\KYMXNWQWTXXZ[]X RYNXPXTYW[Z R\\KZMYOYSZW\\Y",
  3315: " 72D`PFNGLIKKKMMQMS RLLLMMOMP RLILKNONQMSLTJTISIR RPFQGWIZK[M\\P\\S[VZXXZU[R[OZIWHWGX RPGQHWJYKZL RPFPHQIWKYL[N\\P RSZQZKWJW RYYWZTZQYMWJVHVGXGZH[IZHY",
  3316: "100E`HQHRISKSMRMOLMJJJHLF RLOJK RKSLRLPJMIKIIJGLFOFQGRHSJSU RSWS\\R^P_M_L^L\\M[N\\M] RQHRJR\\Q^ ROFPGQJQU RQWQ\\P^O_ RSJXF RXFZI[K\\O\\R[UYXV[ RWGZK[N[O RVHXJZM[P[SZVYX RWYUVSU RQUOVMX RWZUWSVPV RV[TXSW RQWOWMX",
  3317: " 88D`PFNGLIKKKMMQMS RLLLMMOMP RLILKNONQMSLTJTISIR RPFQGWIZK[M\\P\\S[VZX RXZU[R[OZIWHWGX RPGQHWJYKZL RPFPHQIWKYL[N\\P RSZQZKWJW RXZTZQYMWJVHVGXGZH[IZHY RTXVVXV\\Z]Z RWWXW[Z RUWVWZ[\\[^Y",
  3318: " 96D`GQGRHSJSLRLOKMIJIHKF RKOIK RJSKRKPIMHKHIIGKFNFPGQHRJRVQXOZM[K[IZ RPHQJQVPX RNFOGPJPVOYM[ RGVIZ RFYJW RGVGXFYHYIZIXJWHWGV RRISGUFWFYGZH[J\\K RYHZJ RWFXGYJZK\\K R\\KRP RTOXYZ[]X RUOYX[Z RVNZX[Y\\Y",
  3319: " 83E`\\H[G\\F]G]I\\KZKVISHOHKIIK RYJVHSGOGLH R]I\\JZJVGSFOFLGJIIKHNHRIUJWLYNZQ[U[XZZY\\W]T]Q\\OZNWNUOSRQSOS RLXNYQZUZYY RIUKWMXPYUYYX[W\\V]T RXOWOSSRS R]Q[OYOWPUSSTQTOSNQNOOMQL",
  3320: " 81F_LNJMIKIIJGMFRFUGYJ[J\\I RJHLGRGUHXJ RIKJILHRHUIYK[K\\I\\G[FZG[H RUIRLQNQPSTSV RRORPSRSS RRLRNTRTTSVRWPWOVOT RJYKZJ[IZIXJVLVOWSYVZYZ[Y RLWMWSZUZ RIXJWKWMXQZT[W[ZZ\\X",
  3321: " 45G]JHKHLILWJX RKGMHMXPZ RIILFNHNWPYRY RJXKXMYO[RYVV RTHUHVIVYX[[X RUGWHWYYZ RSIVFYHXIXXYYZY",
  3322: "100D`GQGRHSJSLRLOKMIJIHKF RKOIK RJSKRKPIMHKHIIGKFNFPGQHRJRRQUOW RPHQJQT RNFOGPJPUOW RRISGUFWFYG[J\\K RYHZJ RWFXGYJZK\\K RZKXKWLWNXP[R\\T RXO[Q RWMXN[P\\R\\V[XYZW[S[PZJWIWHX RTZRZLWKW RZYXZUZRYNWKVIVHXHZI[JZIY",
  3323: "143BcEQERFSHSJRJOIMGJGHIF RIOGK RHSIRIPGMFKFIGGIFLFNGOHPJPNOQMTKV RNHOJOONR RLFMGNJNOMSKV RNGPFSFUG RWFTGSISMTPVSWUWWVY RTMTNWSWT RWFUGTITLUNWQXTXVWXUZS[O[MZKXIWGWFX RNZKWJW RQ[OZLWJVGVFXFZG[HZGY RWFZF\\G^J_K R\\H]J RZF[G\\J]K_K R]K[KZLZN[P^R_T R[O^Q RZM[N^P_R_W^Y]Z[[X[UZ RYZXZVY R^Y\\ZZZXYWX",
  3324: " 86F^KHMHOIPJQMQO RQQQUPXM[KZI[ RNZLYKY ROYNYLXI[ RMGPHQIRLRUSWUYWZ RIINFPGRISLSO RSQSTTWUXWYYY RQURXTZV[[X RSLTIWFYG[F RVGXHYH RUHVHXI[F RKSMOQO RSOWOYM RMPWP RKSMQQQ RSQWQYM",
  3325: " 74E_HQHRISKSMRMOLMJJJHLF RLOJK RKSLRLPJMIKIIJGLFOFQGRHSJSORRQTQUSWTW RQHRJRPQSPUSX ROFPGQJQPPTOVRYUV RSJ[F RYGYZX] RZGZXY[ R[F[VZZY\\W^T_P_M^K\\JZKYLZK[",
  3326: " 74F^NIOGQFTFVGWHXJXMWOVPTQ RQQOPNN RVHWIWNVO RTFUGVIVNUPTQ RMUNSORQQTQWRYTZVZZY\\W^T_P_N^KZJY RXTYVYZX\\ RTQWSXUX[W]V^T_ RO^N]LZKY RR_P^O]MZLYIYHZH\\I]J]",
  3401: " 46J[TMQNOONPMSMVNYO[UX RNVOYPZ RQNOPNSNUOXQZ RRNSOUPUYW[ZX RSNVPVXXZ RTMUNWOXO RWPXO RWPWXXYYY",
  3402: " 50J[LHMINK RTFQGOINKNXMY RPIOKOXRZ RTFRGQHPKPXRYSZ RMYNYPZQ[TZ RPPVMWOXRXUWXVYTZ RUNVOWQ RTNVPWSWUVXTZ",
  3403: " 27KXRNTPVOTMRNOPNRNWOYQ[UY RSNUO RPPOROWPYQZ RQOPQPVQXSZ",
  3404: " 47J[QFNINKOLSNVPWRWUVXTZ ROJOKSMVOWP ROHOIPJUMWOXRXUWXTZQ[ RRNNPNXMY ROPOXRZ RPOPXRYSZ RMYNYPZQ[",
  3405: " 27KXPUVQSMOPNRNWOYQ[UY RUQRN RPPOROWPYQZ RTRROQOPQPVQXSZ",
  3406: " 49LYXFWGUGSFQFPHPMOONP RVHTHRGQG RXFWHVITIRHQHPI RPKQMRNTOVOVP RNPPP RRPVP RPPPTQ` RSOPOQNQ[ RRPRTQ`",
  3407: " 53J[TMQNOONPMSMVNYO[UX RNWOYPZ RQNOPNSNUOXQZ RRNSOUPUXV[V]U_ RSNVPVZ RTMUNWOXO RWPXO RWPW\\V^U_S`P`N_M^M]N]N^",
  3408: " 50J[LHMINK RTFQGOINKNXMY RPIOKOYPZ RTFRGQHPKPXQYRY RMYOZP[SX RPPVMWOXSXWWZV\\T^Q` RUNVOWR RTNVQWTWWV[T^",
  3409: " 39MWRFQGQHRISHSGRF RQGSH RQHSG ROOPOQPQYS[VX RPNRORXTZ RNPQMRNTO RSPTO RSPSXTYUY",
  3410: " 45MWRFQGQHRISHSGRF RQGSH RQHSG ROOPOQPQ[P^O_M` RPNROR[Q] RNPQMRNTO RSPTO RSPS[R]P_M` RS[T]U^",
  3411: " 63KYNHOIPK RUFSGQIPKPMOONP RPPPXOY RRIQKQM RQOPOQMQXSZ RUFSHRKRO RRPRXSYTY ROYQZR[UX RRLVIWJWLUNSO RUJVKVLUN RROWOWP RNPPP RRPWP",
  3412: " 29MWOHPIQK RWFTGRIQKQXPY RSIRKRYTZ RWFUGTHSKSXTYUY RPYRZS[VX",
  3413: " 74E_GOHOIPIXHYJ[ RHNJPJXIYJZKYJX RFPIMKOKXLYJ[ RNNPOQQQXPYR[ RPNQORQRXQYRZSYRX RKPNNPMRNSPSXTYR[ RVNWOYPYY[[^X RWNZPZX\\Z RSPVNXMYN[O\\O R[P\\O R[P[X\\Y]Y",
  3414: " 49I[KOLOMPMXLYN[ RLNNPNXMYNZOYNX RJPMMOOOXPYN[ RRNSOUPUYW[ZX RSNVPVXXZ ROPRNTMUNWOXO RWPXO RWPWXXYYY",
  3415: " 41J[NPNXMY ROPOXRZ RQOPPPXRYSZ RMYNYPZQ[TZ RNPQOVMWOXRXUWXVYTZ RUNVOWQ RTNVPWSWUVXTZ",
  3416: " 57J[OJMLMNNQNXLZ RNYO` RNMNNOQO[ RNKNLONPQPXQXSYTZ RPYO` RSZQY RTZR[PY RNYLZ RPPVMWOXRXUWXVYTZ RUNVOWQ RTNVPWSWUVXTZ",
  3417: " 43J[TMQNOONPMSMVNYO[UX RNWOYPZ RQNOPNSNUOXQZ RRNSOUPUXV` RSNVPV[ RTMUNWOXO RWPXO RWPWXV`",
  3418: " 32KYNOOOPPPXOY RONQPQYSZ RMPPMRORXSYTY ROYQZR[UX RTNUPWOVMRO RUNVO",
  3419: " 42LWXFWGUGSFQFPHPMOONP RVHTHRGQG RXFWHVITIRHQHPI RPKRP RPPPTQ` RQOPOQNQ[ RRPRTQ` RNPPP",
  3420: " 37LXSIRLQNPONP RSISOVOVP RNPQP RSPVP RQPQXPY RROQORMRXTZ RSPSXTYUY RPYRZS[VX",
  3421: " 47I[KOLOMPMXLY RLNNPNXPZ RJPMMOOOXQYRZ RLYMYOZP[RZUX RVMTOUPUYW[ZX RVPWOVNUOVPVXXZ RVMXOWPWXXYYY",
  3422: " 47J[OKMMMONRNXMY RNNNOOROXRZ RNLNMOOPRPXRYSZ RMYNYPZQ[TZ RPPVMWOXRXUWXVYTZ RUNVOWQ RTNVPWSWUVXTZ",
  3423: " 72F_KKIMIOJRJXIYK[ RJNJOKRKXJYKZLYKX RJLJMKOLRLXMYK[ RONQORQRXQY RQNROSQSXVZ RLPONQMSNTPTXVYWZ RQYRYTZU[XZ RTPZM[O\\R\\T[XZYXZ RYNZO[Q RXNZP[S[UZXXZ",
  3424: " 44KZOOPOQPQXPXNYM[M]N_P`S`V_V^U^U_ RPNRPRXUZ RNPQMSOSXUYVZ RXYT[SZQYOYM[ RUNVPXOWMSO RVNWO",
  3425: " 47J[OKMMMONRNXMY RNNNOOROYQZ RNLNMOOPRPXQYRY RMYOZP[SX RPPVMWOXSXWWZV\\T^Q` RUNVOWR RTNVQWTWWV[T^",
  3426: " 43KYNPSMUNVPVRUTQV RSNUO RRNTOUQURTTSU RSUUWVYV]U_S`Q`O_N]N[OYQXWV RRVTWUY RQVTXUZU]T_S`",
  3427: " 61JZRMPNMPMRNU RNPNROT RPNOOORPT RPNROTOVNWMWKVJTJ RQNSN RRMTNVN RNUVRWUWWVYR[ RUSVUVXUY RTSUUUXTZ RTZRYOYL[ RSZQZ RR[PZNZL[",
  3428: " 78J[VFUGSGQFOFNHNMMOLP RTHRHPGOG RVFUHTIRIPHOHNI RNKPP RNPNTO` ROONOONO[ RPPPTO` RLPNP RPPUMWNXPXRWTSV RUNWO RTNVOWQWRVTUU RUUWVXXX[W]U_R` RUVWW RSVTVVWWYW\\V^",
  3429: " 62J[PIOLNNMOKP RPIPXQYO[ ROONOONOXNYOZPYOX RKPNPNXMYO[ RPPUMWNXPXRWTSV RUNWO RTNVOWQWRVTUU RUUWVXXX[W]U_R` RUVWW RSVTVVWWYW\\V^",
  3501: " 60G]LINGPFRFSGZW[X]X RQGRHYXZZ[YYX RNGPGQHXXYZZ[[[]X RLMMLOKPKQL RPLPM RMLOLPN RG[IYKXNXPY RJYNYOZ RG[JZMZN[PY RRJLX RNSVS",
  3502: "110F^HHJFMFOGQF RKGNG RHHJGLHOHQF RMKLLKNKOIOHPHRIQKQKW RLMLU RIPLP RMKMTLVKW RRIQJPLPU RQKQS RRIRRQTPU RRIXFZG[I[KYMUO RXGZIZK RVGXHYIYLWN RWNZP[R[X RYPZRZW RWNXOYQYX RJ[MYPXTXWY RLZOYTYVZ RJ[NZSZU[WYYX[X RUOUX RURYR RUUYU",
  3503: " 69E]NGLHJJILHOHSIVJXMZP[S[VZXYZW[U RJKINISKWNYQZTZWY RNGLIKKJNJRKUNXQYTYWXYW[U RPJPV RQJQT RRIRSQUPV RPJRIUFWGYGZF RTGVHXH RSHUIWIYHZF RWIWX",
  3504: " 72G^IFWFYGZIZX RKGWGYIYW RIFJGLHWHXIXX ROKNLMNMOKOJPJRKQMQMV RNMNT RKPNP ROKOSNUMV RI[LYOXSXVY RKZNYSYUZ RI[MZRZT[VYXXZX RRHRX RRMTNVNXM RRSTRVRXS",
  3505: " 94G]IHKFMFOGQF RLGNG RIHKGMHOHQF RNKMLLNLOJOIPIRJQLQLW RMMMU RJPMP RNKNTMVLW RQMRJSHTGVFXF[G RTHVGXGZH RRJSIUHWHYI[G RQURRSPTOVOXP RTPVPWQ RRRSQUQVRXP RK[NYRXWX[Y RMZPYWYZZ RK[OZVZY[[Y RQMQX",
  3506: " 91F]JHLFOFQGSF RMGPG RJHLGNHQHSF RPKOLNNNOLOKPKRLQNQNV ROMOT RLPOP RPKPSOUNV RSJSYRZQZMXKXIYG[ RTJTX RTPXP RPZOZMYJY RUIUOXO RXQUQUWTYP[N[LZJZG[ RSJUIXFZG\\G]F RWGYH[H RVHXIZI\\H]F RXIXW",
  3507: " 87E^NGLHJJILHOHRIUJWLYNZQ[U[XZZX[V[SZQYPWOUO RJKINISJV RNGLIKKJNJSKVLXNZ RYXZWZSYQ RU[WZXYYWYSXQWPUO RPJPW RQJQU RRIRTQVPW RPJRIUFWGYGZF RTGVHXH RSHUIWIYHZF RYHUOU[ RUSYS RUVYV",
  3508: "112F^HHJFMFOGQF RKGNG RHHJGLHOHQF RMKLLKNKOIOHPHRIQKQKW RLMLU RIPLP RMKMTLVKW RJ[MYPXSXUY RLZOYRYTZ RJ[NZQZS[UY RRIQJPLPU RQKQS RRIRRQTPU RRITGVFXFZG RWGXGYH RTGVGXIZG RUOWNYLZM[P[TZXX[ RXMYNZPZUYX RWNXNYPYUX[ RUOUY RURYR RUUYU",
  3509: " 67I\\LHNFQFTGVF ROGSG RLHNGQHTHVF RSKRLQNQOOONPNROQQQQV RRMRT ROPRP RSKSSRUQV RYHWJVMVXUZSZOXMXKYI[ RWKWW RRZQZOYLY RYHXJXVWXUZS[P[NZKZI[",
  3510: " 65H\\LHNFQFTGVF ROGSG RLHNGQHTHVF RSKRLQNQOOONPNROQQQQV RRMRT ROPRP RSKSSRUQV RYHWJVMVXUZ RWKWW RYHXJXVWXUZR[O[LZJXJVKULUMVLWKW RJVMV",
  3511: "115F^HHJFMFOGQF RKGNG RHHJGLHOHQF RMKLLKNKOIOHPHRIQKQKW RLMLU RIPLP RMKMTLVKW RJ[MYPXSXUY RLZNYRYTZ RJ[NZQZS[UY RRIQJPLPU RQKQS RRIRRQTPU RRITGVFXFZG RWGXGYH RTGVGXIZG RUOXLYM[N RWMYN[N R[NYQWSUU RWSYTZX[Z\\Z RYVZZ RWSXTYZZ[[[\\Z RUOUY",
  3512: " 85G]IHKFNFPGRF RLGOG RIHKGMHPHRF RNKMLLNLOJOIPIRJQLQLW RMMMU RJPMP RNKNTMVLW RK[NYRXWX[Y RMZPYWYZZ RK[OZVZY[[Y RSIRJQLQU RRKRS RSISRRTQU RSIUGWFYF[G RXGYGZH RUGWGYI[G RWGWX",
  3513: "107D`LJKKJMJOHOGPGRHQJQJU RKLKS RHPKP RLJLRKTJU RE[GYIXKXMYNYOX RHYKYMZ RE[GZJZL[M[NZOX RLJPFTJTWUYVY RPGSJSXRYSZTYSX RPPSP RNHOHRKROOO ROQRQRXQYS[VYWX RTJXF\\J\\W]Y^Y RXG[J[X]Z RXP[P RVHWHZKZOWO RWQZQZY\\[^Y ROHOX RWHWX",
  3514: " 84E^GIIGKFMFOGQJVUXXYY RMGOIPKVWYZ RIGKGMHOKTVVYWZY[ RVHXIZI\\H]F RWGYH[H RVHXFZG\\G]F RKOIOHPHRIQKQ RIPKP RG[IYKXNXPY RJYMYOZ RG[JZMZN[PY RKGKX RYIY[ RRLSMUNWNYM RKTMSQSST",
  3515: " 79E_NFLGJIIKHNHRIUJWLYNZQ[S[VZXYZW[U\\R\\N[KZIXGVFUGRIOJ RJJIMISJV RNFLHKJJMJSKVLXNZ RZV[S[MYIXH RVZXXYVZSZMYKWHUG ROJOW RPJPU RQJQTPVOW RUGUZ RUMWNXNZM RUSWRXRZS",
  3516: " 70H^KFLGMIMOKOJPJRKQMQMYJ[MZMbO` RMHNJN` RKPNP RKFMGNHOJO` ROKRIVFZJZX RVGYJYX RTHUHXKXY RRXUXXY RSYUYWZ RRZTZV[XYZX RRIR_ RRMTNVNXM RRSTRVRXS",
  3517: " 99E_NFLGJIIKHNHRIUJWLYNZP[T[VZXYZW[U\\R\\N[KZIXGVFUGRIOJ RJJIMISJV RNFLHKJJMJSKVLXNZ RZV[S[MYIXH RVZXXYVZSZMYKWHUG ROJOW RPJPU RQJQTPVOW RUGUZ RUMWNXNZM RUSWRXRZS RP[QZRZT[X`Za[a RT\\V_XaYa RRZS[VaXbZb[a",
  3518: "108F^HHJFMFOGQF RKGNG RHHJGLHOHQF RMKLLKNKOIOHPHRIQKQKW RLMLU RIPLP RMKMTLVKW RJ[MYPXRXUY RLZNYRYTZ RJ[NZQZS[UY RRIQJPLPU RQKQS RRIRRQTPU RRIUGWFYGZIZLYNXOTQRR RWGXGYIYMXN RUGWHXJXMWOTQ RTQVRWSZX[Y\\Y RWTYX[Z RTQVSXYZ[\\Y",
  3519: " 94G^UITHRGOF RVHTG RWGSFOFLGKHJJKLLMONWNYOZPZRYU RKKLLOMXMZN[O[QZS RKHKJLKOLYL[M\\O\\QYUU[ RIOJPLQUQVRVSUU RJQLRTRUS RIOIPJRLSSSUTUU RI[LYPXSXVY RKZNYRYUZ RI[MZRZU[ RWGUISL RRNPQ ROSMUKVJVJUKV",
  3520: " 71E]JJILHOHSIVKYMZP[S[VZXYZW[U RISJVLXNYQZTZWY RJJIMIQJTLWNXQYTYWXYW[U RHIIGKFOFUGYG[F RPGTHXH RHIIHKGNGTIWIYH[F RSIRJPKPV RQKQT RRJRSQUPV RWIWX",
  3521: " 89F^HHJFLFOGQF RKGNG RHHJGMHOHQF RKJJLIOISJVKXMZP[S[VZXYZ[\\Y RJSKVNYQZTZ RKJJNJQKTLVNXQYUYXX RUIQJPLPV RQKQT RRJRSQUPV RUIWHYFZG\\HZIZW[Y\\Y RYIZHYGXHYIYX[Z RWHXIXX RUIUY RUNXN RURXR",
  3522: " 72G^JFKGLILOJOIPIRJQLQLXJY RLHMJMX RJPMP RNYQYSZ RJFLGMHNJNXRXUY RJYMYPZR[UYXXZX RRJUIWHYFZG\\HZIZX RYIZHYGXHYIYW RWHXIXX RRJRX RRMTNVNXM RRSTRVRXS",
  3523: " 95E`HFIGJIJOHOGPGRHQJQJXHY RJHKJKX RHPKP RLYNYPZ RHFJGKHLJLXOXQY RHYKYNZO[QYTXVYW[YY\\X ROHRFTHTXWXYY RRGSHSX ROHQHRIRXQY RWYXZ RWHZF\\H\\X RZG[H[X RWHYHZIZXYY ROHOX RWHWX RONRN RORRR RWNZN RWRZR",
  3524: " 65G]HIJGLFNFOGWYXZZZ RMGNHVYWZ RJGLGMHUZV[X[ZZ\\X RWFYG[G\\F RWGXHZH RVHWIYI[H\\F RH[IYKXMXNY RJYLYMZ RH[IZKZM[ RWFSO RQRM[ RLPPP RSPXP",
  3525: " 86G^JFKGLILOJOIPIRJQLQLXJY RLHMJMX RJPMP RNYQYSZ RJFLGMHNJNXRXUY RJYMYPZR[UYXX RRJUIWHYFZG\\HZIZ^Y`WbUaQ`L` RYIZHYGXHYIYY RWHXIXXZ[ RXaV`S` RY`V_P_L` RRJRX RRMTNVNXM RRSTRVRXS",
  3526: " 57H\\XGWIROOSMWJ[ RVKNV RZFWJUNRRMXLZ RJHLFOGUGZF RKGOHSHWG RJHNIRIVHXG RLZNYRXVXZY RMZQYUYYZ RJ[OZUZX[ZY RMPQP RTPXP",
  3601: " 53J[PRNTMVMXNZP[RYUX RMVNXOYQZ RNTNVOXQYRY RNPPPSOUNVMXOWPWXXYYY RONNOQO RTOWOVNVYWZ RMOOMPNROUPUYW[YY RMORT",
  3602: " 44I[LHMJMXKY RNJMHNGNXQZ RLHOFOXQYRZ RKYMYOZP[RZUYWY ROPROTNUMVNXOYOWPWY RTNVOVX RROSOUPUY",
  3603: " 35JXNONXLYMYOZP[ ROOOYQZ RPOPXRYSYQZP[ RNORNTMUNWOXO RSNTOVO RPORNTPVPXO",
  3604: " 41IZRMPNMOMXKY RNONXQZ RRMOOOXQYRZ RKYMYOZP[RZUYWY RMHPFQIWOWY RPINHOGPIVOVX RMHUPUY",
  3605: " 32JXNONXLYMYOZP[ ROOOYQZ RPOPXRYSYQZP[ RNORNTMWQURPU RSNVQ RPORNUR",
  3606: " 41JWNHNXLYMYOZP[ ROHOYQZ RPHPXRYSYQZP[ RNHQGSFTGVHWH RRGSHUH RPHQGSIUIWH RKMNM RPMTM",
  3607: " 56I[MOMXKYLYNZO[PZRYUX RNPNYPZ ROOOXQYRY RMOOORNTMUNWOYOWPW\\V_TaRbQaO`M` RSNVPV\\ RSaQ`P` RRNSOUPUZV]V_ RTaS`Q_O_M`",
  3608: " 47I[LHMJMXKYLYNZO[ RNJMHNGNYPZ RLHOFOXQYO[ ROPROTNUMVNXOYOWPWYU[T] RTNVOVYU[ RROSOUPUYT]T`UbVbT`",
  3609: " 35MWRFPHRITHRF RRGQHSHRG RRMQNOOQPQYS[UY RRPSORNQORPRYSZ RRMSNUOSPSXTYUY",
  3610: " 39MWRFPHRITHRF RRGQHSHRG RRMQNOOQPQYS[T] RRPSORNQORPRYS[ RRMSNUOSPSYT]T`RbPbPaRb",
  3611: " 50IZLHMJMXKYLYNZO[ RNJMHNGNYPZ RLHOFOXQYO[ ROPRNTMVPSROU RSNUP RRNTQ RSRTSVXWYXY RSSTTUYVZ RRSSTTYV[XY",
  3612: " 22MWPHQJQXOYPYRZS[ RRJQHRGRYTZ RPHSFSXUYVYTZS[",
  3613: " 67E_GOHOIPIXGYHYJZK[ RINJOJYLZ RGOIMKOKXMYK[ RKPNOPNQMSOSXUYS[ RPNRORYTZ RNOOOQPQXPYRZS[ RSPVOXNYMZN\\O]O[P[X\\Y]Y RXNZOZY[Z RVOWOYPYY[[]Y",
  3614: " 45I[KOLOMPMXKYLYNZO[ RMNNONYPZ RKOMMOOOXQYO[ ROPROTNUMVNXOYOWPWXXYYY RTNVOVYWZ RROSOUPUYW[YY",
  3615: " 40I[MOMXKY RNPNXQZ ROOOXQYRZ RKYMYOZP[RZUYWY RMOOORNTMUNWOYOWPWY RSNVPVX RRNSOUPUY",
  3616: " 54I[LMMOMXKYMYMb RMNNONaO`N^ RNYOYQZ RLMNNOOOXQYRZ ROZP[RZUYWY ROZO^P`Mb ROPROTNUMVNXOYOWPWY RTNVOVX RROSOUPUY",
  3617: " 44I[MOMXKY RNPNYPZ ROOOXQYRY RKYLYNZO[PZRYUX RMOOORNTMUNWOYOWPWb RSNVPVaU`V^ RRNSOUPU^T`Wb",
  3618: " 38JXLOMONPNXLYMYOZP[ RMNOOOYQZ RLONMPOPXRYSYQZP[ RPOTMUNWOXO RSNTOVO RRNTPVPXO",
  3619: " 59JZMOMSOTUTWUWY RNONS RVUVY RPNOOOSQT RSTUUUYTZ RMOPNRMTNVNWM RQNSN RPNROTOVN RWYTZR[PZNZL[ RSZQZ RTZRYOYL[ RWMVOTROWL[",
  3620: " 28MWPHQJQXOYPYRZS[ RRJQHRGRYTZ RPHSFSXUYVYTZS[ RNMQM RSMVM",
  3621: " 47I[KOLOMPMXKY RLNNONYPZ RKOMMOOOXQYRY RKYLYNZO[PZRYUX RUMVNXOYOWPWXXYYY RTNVOVYWZ RUMSOUPUYW[YY",
  3622: " 36I[LMMOMXP[RYUXWX RMNNONXQZ RLMNNOOOWPXRY RUMVNXOYOWPWX RTNVOVW RUMSOUPUX",
  3623: " 57E_HMIOIXL[NYQX RINJOJXMZ RHMJNKOKWLXNY RQMOOQPQXT[VYYX[X RPNRORXUZ RQMRNTOSPSWTXVY RYMZN\\O]O[P[X RXNZOZW RYMWOYPYX",
  3624: " 59H[KOLONPOQSYTZV[XY RMNOOTYVZ RKOMMONPOTWUXWYXY RRSUMVNXNYM RUNVOWO RTOVPXOYM RQUN[MZKZJ[ RNZMYLY ROYMXKYJ[ RMTPT RSTVT",
  3625: " 60I[KOLOMPMXKY RLNNONYPZ RKOMMOOOXQYRY RKYLYNZO[PZRYUX RUMVNXOYOWPW\\V_TaRbQaO`M` RTNVOV\\ RSaQ`P` RUMSOUPUZV]V_ RTaS`Q_O_M`",
  3626: " 38I[XML[ RLONPQPTOXM RMNOOSO RLONMPNTNXM RL[PYSXVXXY RQYUYWZ RL[PZTZV[XY RNTVT",
  3700: " 42H\\LHLXJY RMIMXPZ RNHNXPYQZ RLHNHSGUF RSGTHVIVY RTGWIWX RUFVGXHZHXIXY RJYLYNZO[QZVYXY",
  3701: " 27H\\OHPIQKQXOY RQIPHQGRIRYTZ ROHRFSHSXUYVY ROYPYRZS[TZVY",
  3702: " 48H\\LHNHPGQFSGVHXH RPHRG RLHNIPIRHSG RVHVP RWIWO RXHXPQPNQLSKVK[ RK[OYSXVXZY RNZQYVYYZ RK[PZUZX[ZY",
  3703: " 57H\\LHMHOGPFRGVHXH ROHQG RLHNIPIRG RVHVO RWIWN RXHXOVOSPQQ RQPSQVRXRXY RWSWX RVRVY RKYMXOXQYRZ ROYQZ RKYMYOZP[RZVYXY",
  3704: " 41H\\UFKPKUTU RVUZU[V[TZU RLPLT RMNMU RTGTXRY RUJVHUGUYWZ RUFWHVJVXXYYY RRYSYUZV[WZYY",
  3705: " 53H\\LFLO RLFXF RMGVG RLHUHWGXF RVLUMSNOOLO RSNTNVOVY RUMWNWX RVLWMYNZNXOXY RKYMXOXQYRZ ROYQZ RKYMYOZP[RZVYXY",
  3706: " 59H\\LHLXJY RMIMXPZ RNHNXPYQZ RLHNHRGTFUGWHXH RSGUH RRGTIVIXH RNPOPSOUNVM RSOTOVPVY RUNWPWX RVMWNYOZOXPXY RJYLYNZO[QZVYXY",
  3707: " 38H\\KHMFPGUGZF RLGOHTHWG RKHOIRIVHZF RZFYHWKSOQRPUPXQ[ RRQQTQWRZ RUMSPRSRVSYQ[",
  3708: " 71H\\LILO RMJMN RNINO RLINISHUGVF RSHTHVIVO RUGWHWN RVFWGYHZHXIXO RLONOVRXR RXOVONRLR RLRLXJY RMSMXPZ RNRNXPYQZ RVRVY RWSWX RXRXY RJYLYNZO[QZVYXY",
  3709: " 60H\\LHLQJR RMIMROS RNHNQPRQR RLHNHSGUF RSGTHVIVY RTGWIWX RUFVGXHZHXIXY RJRKRMSNTOSQRUQVQ RKYMXOXQYRZ ROYQZ RKYMYOZP[RZVYXY",
  3710: " 11LXRXPZR[TZRX RRYQZSZRY",
  3711: " 14LXR^R\\PZRXSZS\\R^P_ RRYQZR[RY",
  3712: " 22LXRMPORPTORM RRNQOSORN RRXPZR[TZRX RRYQZSZRY",
  3713: " 25LXRMPORPTORM RRNQOSORN RR^R\\PZRXSZS\\R^P_ RRYQZR[RY",
  3714: " 30LXRFQGOHQIRT RRISHRGQHRIRT RRFSGUHSIRT RRXPZR[TZRX RRYQZSZRY",
  3715: " 51I[LJMHNGQFSFVGWHXJXLWNUPSQ RMJNH RVHWIWMVN RLJNKNIOGQF RSFUGVIVMUOSQ RRQRTSQQQRT RRXPZR[TZRX RRYQZSZRY",
  3716: " 14LXTFRGQIQKRMTKRIRG RRJRLSKRJ",
  3717: " 14LXRLRJPHRFSHSJRLPM RRGQHRIRG",
  3718: " 62E_YNZO[O\\N RXOYP[P RXPYQZQ[P\\N RYNST RRUL[HVNP ROOSKOFJLPRTXVZX[Z[[Z\\X RLZIV RRKOG RKLPQTWVYXZ[Z RMZIU RRLNG RKKQQUWVXXY[Y\\X",
  3719: " 60H\\PBP_ RTBT_ RTFVGWIWKYJXHWGTFPFMGKIKLLNOPURWSXUXXWZ RXJWH RLLMNOOUQWRXT RMYLW RMGLILKMMONUPXRYTYWXYWZT[P[MZLYKWMVMXNZP[",
  3720: "  8G^[BIbJb R[B\\BJb",
  3721: " 27KYUBSDQGOKNPNTOYQ]S`Ub RQHPKOOOUPYQ\\ RSDRFQIPOPUQ[R^S`",
  3722: " 27KYOBQDSGUKVPVTUYS]Q`Ob RSHTKUOUUTYS\\ RQDRFSITOTUS[R^Q`",
  3723: " 39JZRFQGSQRR RRFRR RRFSGQQRR RMINIVOWO RMIWO RMIMJWNWO RWIVINOMO RWIMO RWIWJMNMO",
  3724: "  8F_JQ[Q[R RJQJR[R",
  3725: " 16F_RIRZSZ RRISISZ RJQ[Q[R RJQJR[R",
  3726: " 16F_JM[M[N RJMJN[N RJU[U[V RJUJV[V",
  3727: " 11NWSFRGRM RSGRM RSFTGRM",
  3728: " 22I[NFMGMM RNGMM RNFOGMM RWFVGVM RWGVM RWFXGVM",
  3729: " 30KYQFOGNINKOMQNSNUMVKVIUGSFQF RQFNIOMSNVKUGQF RSFOGNKQNUMVISF",
  3801: " 52E_NHLIJKIMHPHSIUKV RJLIOISJU RNHLJKLJOJRKVKXJZH[ RVHXHXYVY RYHYY RZGZZ RHFKGQHVHZG\\F RJPXP RH[KZQYVYZZ\\[",
  3802: " 65E_LGLZ RMGMZ RPFNGNZP[ RHJJHLGPFUFXGZIZKYM RXHYIYKXM RUFWGXIXKWL RQUOTNRNPONPMSLVLYM[O\\Q\\T[WYYWZT[P[LZJYHW RZO[Q[UZW RVLYNZQZUYXWZ",
  3803: " 60E_\\F[HZJXHVGSFQFNGLHJJILHOHRIUJWLYNZQ[S[VZXYZW[Y\\[ R[HZMZT[Y RZKYJ RZNYKXIVG RJKINISJV RNGLIKKJNJSKVLXNZ RYWZV RVZXXYVZS",
  3804: " 46E_KGKZ RLGLZ RNFMGMZN[ RHKIIKGNFSFVGXHZJ[L\\O\\R[UZWXYVZS[N[KZIXHV RZK[N[SZV RVGXIYKZNZSYVXXVZ",
  3805: " 86E_\\F[HZJXHVGSFQFNGLHJJILHOHRIUJWLYNZQ[S[VZXYZW[Y\\[ R[HZMZT[Y RZKYJ RZMXIVG RJKINISJV RNGLIKKJNJSKVLXNZ RYWZV RVZXXYVZS RJPKONOUQXQZP RPPRQURWRYQ RMORRUSWSYRZP RZMYLXLWMXNYM",
  3806: " 69E_JHJZ RMGKHKY ROFMGLILYNY RHJJHLGOFSFVGXHYI\\F R\\F[HZLZO[S\\U RZIYK RVGXIYLZO RLPMOOOTPWPYO RQPTQVQXP RNOTRVRXQYOYLXKWKVLWMXL RH[JZNYSYYZ\\[",
  3807: " 90E_\\F[HZJXHVGSFQFNGLHJJILHOHRIUJWLYNZQ[T[VZXYYXZV[Y\\[ R[HZMZT[Y RZKYJ RZNYKXIVG RJKINISJV RNGLIKKJNJSKVLXNZ RXXYVYR RVZWYXVXQ RKSLRMSLTKTJS RJPKNMMOMRNUPWQ RKOMNONROTP RJPLOOOUQYQZP",
  3808: " 50E_JGJZH[ RKHKZ RNHLHLZ RHFJGNHSHYG\\F RLPMNOLRKVKYL[N\\Q\\T[UYV RZN[P[SZU RVKXLYMZOZSYVYXZZ\\[ RH[LZPZU[",
  3809: " 23E_QIQY RRJRX RSISY RHFLHPITIXH\\F RH[KZOYUYYZ\\[",
  3810: " 42E_TIVIVXUZS[ RWIWXVY RXHXY RHFLHPITIXH\\F RIOHQHUIXKZN[S[VZXYZW\\T RIUJXKY RHSJUKXLZN[",
  3811: " 70E_JGJZH[ RKHKZ RNHLHLZ RHFJGNHSHYG\\F RLPMNOLRKUKXLYMYOXPSRQSPTPUQVRUQT RWLXMXOWP RUKWMWOVPSR RSRVRYSZUZWYX RWSYUYW RSRVSXUYXZZ[[\\[ RH[LZPZU[",
  3812: " 45E_JGJZ RKHKY RNHLHLYNY R\\KZNYPXSXUYW[X RZOYRYUZW R\\K[MZQZT[X\\[ RHFJGNHSHYG\\F RH[JZNYSYYZ\\[",
  3813: " 68E_QIQY RRJRX RSISY RNYLWJVIUHRHMIJKHMGPFTFWGYH[J\\M\\R[UZVXWVY RJUIRIMJJ RLWKUJRJLKIMG RZJ[M[RZU RWGYIZLZRYUXW RHFLHPITIXH\\F RH[KZOYUYYZ\\[",
  3814: " 48E_JHJZH[ RLHKIKZ ROFMGLILZ RHJJHLGOFSFVGXHZJ[L\\O\\S[UYV RZK[N[RZU RVGXIYKZNZRYVYXZZ[[\\[ RH[LZPZU[",
  3815: " 54E_QFNGLHJJILHOHRIUJWLYNZQ[S[VZXYZW[U\\R\\O[LZJXHVGSFQF RJKINISJV RNGLIKKJNJSKVLXNZ RZV[S[NZK RVZXXYVZSZNYKXIVG",
  3816: " 51E_JIJZ RMHKJKY RQFOGMILKLYNY RHKJINGQFTFWGYH[J\\M\\O[RYTVURUOTMRLO RZJ[L[PZR RWGYIZLZPYSVU RH[JZNYSYYZ\\[",
  3817: " 74E_QFNGLHJJILHOHRIUJWLYNZQ[S[VZXYZW[U\\R\\O[LZJXHVGSFQF RJKINISJV RNGLIKKJNJSKVLXNZ RZV[S[NZK RVZXXYVZSZNYKXIVG RJSKUNVTW[W\\X\\Z[[[Z\\Y RPWRW RKUNWQXSXTW",
  3818: " 69E_JIJZH[ RKIKZ RLHLZ RHKJILHNGQFUFYG[I\\K\\N[PZQ RYHZI[K[NZP RUFWGYIZKZOYQ RXRUSRSPRPPROUOXPZR\\U\\W[XZX RXQYR[V[WZT RTOVPXRYTZX[Z\\[ RH[LZPZU[",
  3819: " 94E_TFZG\\F[H[JYHWGTFPFMGJJIMIOJRLTOURUTTUSVQVP R[GZH[J RJPKRLSOTRTTS RKIJKJNKPMRPSRSTRVPWOXO RLQMQNPPNRMUMWNYPZRZUYXWZ RPMRLULXMZO[R[UZW RIWJYIZ RNPNOOMPLRKUKXL[O\\R\\T[WYYWZT[P[MZKYIWIYH[JZP[",
  3820: " 66E_QHMHKIJJILHOHSIVJXKYMZP[S[VZXYZW[U\\R\\N[KYIWH RUHTITKULVKUJ RISJVLXNYQZTZWY RJJINIQJTLWNXQYTYWXYW[T\\R RHFKI RKHLG RIGJGKFMGQHWHZG\\F",
  3821: " 51E_LHJJILHOHRIUJWLYNZQ[U[XZZY RKJJLIOISJV RKILJLKKMJPJSKVLXNZ RVHXHXXWZU[ RYHYXXY RZGZY\\[ RHFKGQHVHZG\\F",
  3822: " 31E_HFR[ RIGJHQWRY RJGKHRWSX R\\FR[ RWNUS RYLUQTTTV RHFJGOHUHZG\\F",
  3823: " 67E_LHJJILHOHRIUJWLYNZQ[S[VZXYZW[U\\R\\O[LZJXH RJLIOIRJUKW RJJKKKLJOJRKVLXNZ RYWZU[R[OZL RVZXXYVZRZOYLYKZJ RQIQ[ RRJRZ RSIS[ RHFLHPITIXH\\F",
  3824: " 41E_HFXYYZ RIGKHZZ RLH\\[ R\\FSP RQRJZ RPSMULW RQRMTLUKWKY RHFLHPITIXH\\F RH[JZNYSYYZ\\[",
  3825: " 47E_XHXZ RYHYY RZGZY RKHIJHMHPISKUMVPWSWVVXU RLUOVUV RHPIRKTNUTUVV RHFLHPITIXH\\F RHWJYLZP[T[XZ\\X",
  3826: " 73E_HFIGKHNHSFVFYGZIZKYM RXGYIYKXM RVFWGXIXL RXNTOROPNPLRKTKXL RTKVLWMVNTO RYM[O\\R\\T[WYYWZT[P[MZKYIWHTHRIOJNLMNMPNPPOQNPOO RXMZO[Q[UZW RXNYOZQZUYXWZ",
  3901: " 42J[PQMTMXP[TY RNTNXPZ ROROWRZ RRSMNNMONNO RONSNUMWOWXXY RUNVOVXUYVZWYVX RSNUPUXTYV[XY",
  3902: " 31IZNHLFMJMXP[UYWX RNHNXPZ RNHPFOJOWRZ ROOTMWPWX RTNVPVX RRNUQUY",
  3903: " 23KWNPNYP[RY ROPOYPZ RPOPXQYRY RNPTMVOTPRN RSNUO",
  3904: " 32JZRMMPMXP[RZUYWY RNPNXPZ ROOOWRZ RPIPFQIWPWY RPIVPVX RPIMIPJUPUY",
  3905: " 25KXNPNYP[RY ROPOYPZ RPOPXQYRY RNPTMWQPU RSNVQ RRNUR",
  3906: " 32KWOIOXNYP[ RPIPXOYPZQYPX RQHQXRYP[ ROIUFWHUISG RTGVH RLMOM RQMUM",
  3907: " 41J[MPMXP[UY RNPNXPZ ROOOWRZ RMPOOTMWPW]V_U`SaQaO`MaObQa RTNVPV]U_ RPaNa RRNUQU^T`Sa",
  3908: " 42I[NHLFMJMXLYN[ RNHNXMYNZOYNX RNHPFOJOXPYN[ ROORNTMWPWYT]T`UbVbT` RTNVPVYU[ RRNUQUZT]",
  3909: " 37MWRFPHRJTHRF RRGQHRISHRG RRMPOQPQXPYR[ RRPSORNQORPRXQYRZSYRX RRMTOSPSXTYR[",
  3910: " 37MWRFPHRJTHRF RRGQHRISHRG RRMPOQPQYT] RRPSORNQORPRYS[ RRMTOSPSZT]T`RbPaPbRb",
  3911: " 51IZNHLFMJMXLYN[ RNHNXMYNZOYNX RNHPFOJOXPYN[ ROPRNTMVPSROU RSNUP RRNTQ RRSSTTYV[XY RSSTUUYVZ RSRTSVXWYXY",
  3912: " 21MWRHPFQJQXPYR[ RRHRXQYRZSYRX RRHTFSJSXTYR[",
  3913: " 66E_GOHOIPIXHYJ[ RINJOJXIYJZKYJX RGOIMKOKXLYJ[ RKONNPMSOSXTYR[ RPNRORXQYRZSYRX RNNQPQXPYR[ RSOVNXM[O[X\\YZ[ RXNZOZXYYZZ[YZX RVNYPYXXYZ[",
  3914: " 44I[KOLOMPMXLYN[ RMNNONXMYNZOYNX RKOMMOOOXPYN[ ROORNTMWOWXXYV[ RTNVOVXUYVZWYVX RRNUPUXTYV[",
  3915: " 28JZMPMXP[UYWX RNPNXPZ ROOOWRZ RMPOOTMWPWX RTNVPVX RRNUQUY",
  3916: " 47IZLMMOMXKYMYM_LbN` RNON` RLMNNOOOXQYRZ RNYOYQZ ROZP[UYWX ROZO_PbN` ROORNTMWPWX RTNVPVX RRNUQUY",
  3917: " 31J[MPMXP[UY RNPNXPZ ROOOWRZ RMPOOTMWPW_XbV` RTNVPV` RRNUQU_TbV`",
  3918: " 31KXMONOOPOXNYP[ RONPOPXOYPZQYPX RMOOMQOQXRYP[ RQOUMWOUPSN RTNVO",
  3919: " 41JZMPMSOUURWTWX RNPNSOT ROOOSPT RUSVTVX RTSUTUY RMPSMVNTOQN RRNUN RWXQ[MYOXSZ ROYQZ",
  3920: " 27MWRHPFQJQXPYR[ RRHRXQYRZSYRX RRHTFSJSXTYR[ RNMQM RSMVM",
  3921: " 40I[KOLOMPMYP[UY RMNNONYPZ RKOMMOOOXRZ RVMXOWPWXXYYY RVPWOVNUOVPVYWZ RVMTOUPUYW[YY",
  3922: " 36I[LMMOMXQ[SYWW RMNNONXQZ RLMNNOOOWRYSY RVMXOWPWW RVPWOVNUOVPVW RVMTOUPUX",
  3923: " 59E_HMIOIXM[OYQX RINJOJXMZ RHMJNKOKWNYOY RRMPOQPQXU[WY[W RRPSORNQORPRXUZ RRMTOSPSWVYWY RZM\\O[P[W RZP[OZNYOZPZW RZMXOYPYX",
  3924: " 39I[LONPUZV[XY RMNOOUYWZ RLONMONVXXY RXMVMVOXOXMVOSS RQUNYL[N[NYLYL[ RNTQT RSTVT",
  3925: " 49I[KOLOMPMYP[UY RMNNONYPZ RKOMMOOOXRZ RVMXOWPW]V_U`SaQaO`MaObQa RVPWOVNUOVPV^U_ RPaNa RVMTOUPU^T`Sa",
  3926: " 43L[RNOPOORNTMWOWSRU RTNVOVS RRNUPUSTT RRUWWW]V_U`SaQaO`MaObQa RVWV^U_ RPaNa RTVUWU^T`Sa"
};
const SYMB = {
  "\\frac": { glyph: 0, arity: 2, flags: {} },
  "\\binom": { glyph: 0, arity: 2, flags: {} },
  "\\sqrt": {
    glyph: 2267,
    arity: 1,
    flags: { opt: true, xfl: true, yfl: true }
  },
  "^": { glyph: 0, arity: 1, flags: {} },
  _: { glyph: 0, arity: 1, flags: {} },
  "(": { glyph: 2221, arity: 0, flags: { yfl: true } },
  ")": { glyph: 2222, arity: 0, flags: { yfl: true } },
  "[": { glyph: 2223, arity: 0, flags: { yfl: true } },
  "]": { glyph: 2224, arity: 0, flags: { yfl: true } },
  "\\langle": { glyph: 2227, arity: 0, flags: { yfl: true } },
  "\\rangle": { glyph: 2228, arity: 0, flags: { yfl: true } },
  "|": { glyph: 2229, arity: 0, flags: { yfl: true } },
  "\\|": { glyph: 2230, arity: 0, flags: { yfl: true } },
  "\\{": { glyph: 2225, arity: 0, flags: { yfl: true } },
  "\\}": { glyph: 2226, arity: 0, flags: { yfl: true } },
  "\\#": { glyph: 2275, arity: 0, flags: {} },
  "\\$": { glyph: 2274, arity: 0, flags: {} },
  "\\&": { glyph: 2273, arity: 0, flags: {} },
  "\\%": { glyph: 2271, arity: 0, flags: {} },
  "\\begin": { glyph: 0, arity: 1, flags: {} },
  "\\end": { glyph: 0, arity: 1, flags: {} },
  "\\left": { glyph: 0, arity: 1, flags: {} },
  "\\right": { glyph: 0, arity: 1, flags: {} },
  "\\middle": { glyph: 0, arity: 1, flags: {} },
  "\\cdot": { glyph: 2236, arity: 0, flags: {} },
  "\\pm": { glyph: 2233, arity: 0, flags: {} },
  "\\mp": { glyph: 2234, arity: 0, flags: {} },
  "\\times": { glyph: 2235, arity: 0, flags: {} },
  "\\div": { glyph: 2237, arity: 0, flags: {} },
  "\\leqq": { glyph: 2243, arity: 0, flags: {} },
  "\\geqq": { glyph: 2244, arity: 0, flags: {} },
  "\\leq": { glyph: 2243, arity: 0, flags: {} },
  "\\geq": { glyph: 2244, arity: 0, flags: {} },
  "\\propto": { glyph: 2245, arity: 0, flags: {} },
  "\\sim": { glyph: 2246, arity: 0, flags: {} },
  "\\equiv": { glyph: 2240, arity: 0, flags: {} },
  "\\dagger": { glyph: 2277, arity: 0, flags: {} },
  "\\ddagger": { glyph: 2278, arity: 0, flags: {} },
  "\\ell": { glyph: 662, arity: 0, flags: {} },
  "\\vec": {
    glyph: 2261,
    arity: 1,
    flags: { hat: true, xfl: true, yfl: true }
  },
  "\\overrightarrow": {
    glyph: 2261,
    arity: 1,
    flags: { hat: true, xfl: true, yfl: true }
  },
  "\\overleftarrow": {
    glyph: 2263,
    arity: 1,
    flags: { hat: true, xfl: true, yfl: true }
  },
  "\\bar": { glyph: 2231, arity: 1, flags: { hat: true, xfl: true } },
  "\\overline": { glyph: 2231, arity: 1, flags: { hat: true, xfl: true } },
  "\\widehat": {
    glyph: 2247,
    arity: 1,
    flags: { hat: true, xfl: true, yfl: true }
  },
  "\\hat": { glyph: 2247, arity: 1, flags: { hat: true } },
  "\\acute": { glyph: 2248, arity: 1, flags: { hat: true } },
  "\\grave": { glyph: 2249, arity: 1, flags: { hat: true } },
  "\\breve": { glyph: 2250, arity: 1, flags: { hat: true } },
  "\\tilde": { glyph: 2246, arity: 1, flags: { hat: true } },
  "\\underline": { glyph: 2231, arity: 1, flags: { mat: true, xfl: true } },
  "\\not": { glyph: 2220, arity: 1, flags: {} },
  "\\neq": { glyph: 2239, arity: 1, flags: {} },
  "\\ne": { glyph: 2239, arity: 1, flags: {} },
  "\\exists": { glyph: 2279, arity: 0, flags: {} },
  "\\in": { glyph: 2260, arity: 0, flags: {} },
  "\\subset": { glyph: 2256, arity: 0, flags: {} },
  "\\supset": { glyph: 2258, arity: 0, flags: {} },
  "\\cup": { glyph: 2257, arity: 0, flags: {} },
  "\\cap": { glyph: 2259, arity: 0, flags: {} },
  "\\infty": { glyph: 2270, arity: 0, flags: {} },
  "\\partial": { glyph: 2265, arity: 0, flags: {} },
  "\\nabla": { glyph: 2266, arity: 0, flags: {} },
  "\\aleph": { glyph: 2077, arity: 0, flags: {} },
  "\\wp": { glyph: 2190, arity: 0, flags: {} },
  "\\therefore": { glyph: 740, arity: 0, flags: {} },
  "\\mid": { glyph: 2229, arity: 0, flags: {} },
  "\\sum": { glyph: 2402, arity: 0, flags: { big: true } },
  "\\prod": { glyph: 2401, arity: 0, flags: { big: true } },
  "\\bigoplus": { glyph: 2284, arity: 0, flags: { big: true } },
  "\\bigodot": { glyph: 2281, arity: 0, flags: { big: true } },
  "\\int": { glyph: 2412, arity: 0, flags: { yfl: true } },
  "\\oint": { glyph: 2269, arity: 0, flags: { yfl: true } },
  "\\oplus": { glyph: 1284, arity: 0, flags: {} },
  "\\odot": { glyph: 1281, arity: 0, flags: {} },
  "\\perp": { glyph: 738, arity: 0, flags: {} },
  "\\angle": { glyph: 739, arity: 0, flags: {} },
  "\\triangle": { glyph: 842, arity: 0, flags: {} },
  "\\Box": { glyph: 841, arity: 0, flags: {} },
  "\\rightarrow": { glyph: 2261, arity: 0, flags: {} },
  "\\to": { glyph: 2261, arity: 0, flags: {} },
  "\\leftarrow": { glyph: 2263, arity: 0, flags: {} },
  "\\gets": { glyph: 2263, arity: 0, flags: {} },
  "\\circ": { glyph: 902, arity: 0, flags: {} },
  "\\bigcirc": { glyph: 904, arity: 0, flags: {} },
  "\\bullet": { glyph: 828, arity: 0, flags: {} },
  "\\star": { glyph: 856, arity: 0, flags: {} },
  "\\diamond": { glyph: 743, arity: 0, flags: {} },
  "\\ast": { glyph: 728, arity: 0, flags: {} },
  "\\log": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\ln": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\exp": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\mod": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\lim": { glyph: 0, arity: 0, flags: { txt: true, big: true } },
  "\\sin": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\cos": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\tan": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\csc": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\sec": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\cot": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\sinh": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\cosh": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\tanh": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\csch": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\sech": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\coth": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\arcsin": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\arccos": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\arctan": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\arccsc": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\arcsec": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\arccot": { glyph: 0, arity: 0, flags: { txt: true } },
  "\\text": { glyph: 0, arity: 1, flags: {} },
  "\\mathnormal": { glyph: 0, arity: 1, flags: {} },
  "\\mathrm": { glyph: 0, arity: 1, flags: {} },
  "\\mathit": { glyph: 0, arity: 1, flags: {} },
  "\\mathbf": { glyph: 0, arity: 1, flags: {} },
  "\\mathsf": { glyph: 0, arity: 1, flags: {} },
  "\\mathtt": { glyph: 0, arity: 1, flags: {} },
  "\\mathfrak": { glyph: 0, arity: 1, flags: {} },
  "\\mathcal": { glyph: 0, arity: 1, flags: {} },
  "\\mathbb": { glyph: 0, arity: 1, flags: {} },
  "\\mathscr": { glyph: 0, arity: 1, flags: {} },
  "\\rm": { glyph: 0, arity: 1, flags: {} },
  "\\it": { glyph: 0, arity: 1, flags: {} },
  "\\bf": { glyph: 0, arity: 1, flags: {} },
  "\\sf": { glyph: 0, arity: 1, flags: {} },
  "\\tt": { glyph: 0, arity: 1, flags: {} },
  "\\frak": { glyph: 0, arity: 1, flags: {} },
  "\\cal": { glyph: 0, arity: 1, flags: {} },
  "\\bb": { glyph: 0, arity: 1, flags: {} },
  "\\scr": { glyph: 0, arity: 1, flags: {} },
  "\\quad": { glyph: 0, arity: 0, flags: {} },
  "\\,": { glyph: 0, arity: 0, flags: {} },
  "\\.": { glyph: 0, arity: 0, flags: {} },
  "\\;": { glyph: 0, arity: 0, flags: {} },
  "\\!": { glyph: 0, arity: 0, flags: {} },
  "\\alpha": { glyph: 2127, flags: {} },
  "\\beta": { glyph: 2128, flags: {} },
  "\\gamma": { glyph: 2129, flags: {} },
  "\\delta": { glyph: 2130, flags: {} },
  "\\varepsilon": { glyph: 2131, flags: {} },
  "\\zeta": { glyph: 2132, flags: {} },
  "\\eta": { glyph: 2133, flags: {} },
  "\\vartheta": { glyph: 2134, flags: {} },
  "\\iota": { glyph: 2135, flags: {} },
  "\\kappa": { glyph: 2136, flags: {} },
  "\\lambda": { glyph: 2137, flags: {} },
  "\\mu": { glyph: 2138, flags: {} },
  "\\nu": { glyph: 2139, flags: {} },
  "\\xi": { glyph: 2140, flags: {} },
  "\\omicron": { glyph: 2141, flags: {} },
  "\\pi": { glyph: 2142, flags: {} },
  "\\rho": { glyph: 2143, flags: {} },
  "\\sigma": { glyph: 2144, flags: {} },
  "\\tau": { glyph: 2145, flags: {} },
  "\\upsilon": { glyph: 2146, flags: {} },
  "\\varphi": { glyph: 2147, flags: {} },
  "\\chi": { glyph: 2148, flags: {} },
  "\\psi": { glyph: 2149, flags: {} },
  "\\omega": { glyph: 2150, flags: {} },
  "\\epsilon": { glyph: 2184, flags: {} },
  "\\theta": { glyph: 2185, flags: {} },
  "\\phi": { glyph: 2186, flags: {} },
  "\\varsigma": { glyph: 2187, flags: {} },
  "\\Alpha": { glyph: 2027, flags: {} },
  "\\Beta": { glyph: 2028, flags: {} },
  "\\Gamma": { glyph: 2029, flags: {} },
  "\\Delta": { glyph: 2030, flags: {} },
  "\\Epsilon": { glyph: 2031, flags: {} },
  "\\Zeta": { glyph: 2032, flags: {} },
  "\\Eta": { glyph: 2033, flags: {} },
  "\\Theta": { glyph: 2034, flags: {} },
  "\\Iota": { glyph: 2035, flags: {} },
  "\\Kappa": { glyph: 2036, flags: {} },
  "\\Lambda": { glyph: 2037, flags: {} },
  "\\Mu": { glyph: 2038, flags: {} },
  "\\Nu": { glyph: 2039, flags: {} },
  "\\Xi": { glyph: 2040, flags: {} },
  "\\Omicron": { glyph: 2041, flags: {} },
  "\\Pi": { glyph: 2042, flags: {} },
  "\\Rho": { glyph: 2043, flags: {} },
  "\\Sigma": { glyph: 2044, flags: {} },
  "\\Tau": { glyph: 2045, flags: {} },
  "\\Upsilon": { glyph: 2046, flags: {} },
  "\\Phi": { glyph: 2047, flags: {} },
  "\\Chi": { glyph: 2048, flags: {} },
  "\\Psi": { glyph: 2049, flags: {} },
  "\\Omega": { glyph: 2050, flags: {} }
};
function asciiMap(x, mode = "math") {
  const c = x.charCodeAt(0);
  if (65 <= c && c <= 90) {
    const d = c - 65;
    if (mode == "text" || mode == "rm") {
      return d + 2001;
    } else if (mode == "tt") {
      return d + 501;
    } else if (mode == "bf" || mode == "bb") {
      return d + 3001;
    } else if (mode == "sf") {
      return d + 2501;
    } else if (mode == "frak") {
      return d + 3301;
    } else if (mode == "scr" || mode == "cal") {
      return d + 2551;
    } else {
      return d + 2051;
    }
  }
  if (97 <= c && c <= 122) {
    const d = c - 97;
    if (mode == "text" || mode == "rm") {
      return d + 2101;
    } else if (mode == "tt") {
      return d + 601;
    } else if (mode == "bf" || mode == "bb") {
      return d + 3101;
    } else if (mode == "sf") {
      return d + 2601;
    } else if (mode == "frak") {
      return d + 3401;
    } else if (mode == "scr" || mode == "cal") {
      return d + 2651;
    } else {
      return d + 2151;
    }
  }
  if (48 <= c && c <= 57) {
    const d = c - 48;
    if (mode == "it") {
      return d + 2750;
    } else if (mode == "bf") {
      return d + 3200;
    } else if (mode == "tt") {
      return d + 700;
    } else {
      return d + 2200;
    }
  }
  return {
    ".": 2210,
    ",": 2211,
    ":": 2212,
    ";": 2213,
    "!": 2214,
    "?": 2215,
    "'": 2216,
    '"': 2217,
    "*": 2219,
    "/": 2220,
    "-": 2231,
    "+": 2232,
    "=": 2238,
    "<": 2241,
    ">": 2242,
    "~": 2246,
    "@": 2273,
    "\\": 804
  }[x];
}
const CONFIG = {
  SUB_SUP_SCALE: 0.5,
  SQRT_MAG_SCALE: 0.5,
  FRAC_SCALE: 0.85,
  LINE_SPACING: 0.5,
  FRAC_SPACING: 0.4
};
function tokenize(str) {
  str = str.replace(/\n/g, " ");
  let i = 0;
  const tokens = [];
  let curr = "";
  while (i < str.length) {
    if (str[i] == " ") {
      if (curr.length) {
        tokens.push(curr);
        curr = "";
      }
    } else if (str[i] == "\\") {
      if (curr.length == 1 && curr[0] == "\\") {
        curr += str[i];
        tokens.push(curr);
        curr = "";
      } else {
        if (curr.length) {
          tokens.push(curr);
        }
        curr = str[i];
      }
    } else if (/[A-Za-z0-9\.]/.test(str[i])) {
      curr += str[i];
    } else {
      if (curr.length && curr != "\\") {
        tokens.push(curr);
        curr = "";
      }
      curr += str[i];
      tokens.push(curr);
      curr = "";
    }
    i++;
  }
  if (curr.length)
    tokens.push(curr);
  return tokens;
}
function parseAtom(x) {
  return {
    type: SYMB[x] ? "symb" : "char",
    mode: "math",
    text: x,
    chld: [],
    bbox: null
  };
}
function parse(tokens) {
  let i = 0;
  let expr = {
    type: "node",
    text: "",
    mode: "math",
    chld: [],
    bbox: null
  };
  function takeOpt() {
    if (tokens[i] != "[") {
      return null;
    }
    let lvl = 0;
    let j = i;
    while (j < tokens.length) {
      if (tokens[j] == "[") {
        lvl++;
      } else if (tokens[j] == "]") {
        lvl--;
        if (!lvl) {
          break;
        }
      }
      j++;
    }
    const ret = parse(tokens.slice(i + 1, j));
    i = j;
    return ret;
  }
  function takeN(n) {
    let j = i;
    let j0 = j;
    let lvl = 0;
    let cnt = 0;
    const ret = [];
    while (j < tokens.length) {
      if (tokens[j] == "{") {
        if (!lvl) {
          j0 = j;
        }
        lvl++;
      } else if (tokens[j] == "}") {
        lvl--;
        if (!lvl) {
          ret.push(parse(tokens.slice(j0 + 1, j)));
          cnt++;
          if (cnt == n) {
            break;
          }
        }
      } else {
        if (lvl == 0) {
          ret.push(parseAtom(tokens[j]));
          cnt++;
          if (cnt == n) {
            break;
          }
        }
      }
      j++;
    }
    i = j;
    return ret;
  }
  for (i = 0; i < tokens.length; i++) {
    const s = SYMB[tokens[i]];
    const e = {
      type: "",
      text: tokens[i],
      mode: "math",
      chld: [],
      bbox: null
    };
    if (s) {
      if (s.arity) {
        i++;
        e.type = "func";
        let opt = null;
        if (s.flags.opt) {
          opt = takeOpt();
          if (opt)
            i++;
        }
        const chld = takeN(s.arity);
        e.chld = chld;
        if (opt) {
          e.chld.push(opt);
        }
      } else {
        e.type = "symb";
      }
    } else {
      if (tokens[i] == "{") {
        e.type = "node";
        e.text = "";
        e.chld = takeN(1);
      } else {
        e.type = "char";
      }
    }
    expr.chld.push(e);
  }
  if (expr.chld.length == 1) {
    expr = expr.chld[0];
  }
  return expr;
}
function environments(exprs) {
  let i = 0;
  while (i < exprs.length) {
    if (exprs[i].text == "\\begin") {
      let j;
      for (j = i; j < exprs.length; j++) {
        if (exprs[j].text == "\\end") {
          break;
        }
      }
      const es = exprs.splice(i + 1, j - (i + 1));
      environments(es);
      exprs[i].text = exprs[i].chld[0].text;
      exprs[i].chld = es;
      exprs.splice(i + 1, 1);
    }
    i++;
  }
}
function transform(expr, sclx, scly, x, y, notFirst) {
  if (scly == null) {
    scly = sclx;
  }
  if (!expr.bbox)
    return;
  if (notFirst) {
    expr.bbox.x *= sclx;
    expr.bbox.y *= scly;
  }
  expr.bbox.w *= sclx;
  expr.bbox.h *= scly;
  for (let i = 0; i < expr.chld.length; i++) {
    transform(expr.chld[i], sclx, scly, 0, 0, true);
  }
  expr.bbox.x += x;
  expr.bbox.y += y;
}
function computeBbox(exprs) {
  let xmin = Infinity;
  let xmax = -Infinity;
  let ymin = Infinity;
  let ymax = -Infinity;
  for (let i = 0; i < exprs.length; i++) {
    if (!exprs[i].bbox) {
      continue;
    }
    xmin = Math.min(xmin, exprs[i].bbox.x);
    ymin = Math.min(ymin, exprs[i].bbox.y);
    xmax = Math.max(xmax, exprs[i].bbox.x + exprs[i].bbox.w);
    ymax = Math.max(ymax, exprs[i].bbox.y + exprs[i].bbox.h);
  }
  return { x: xmin, y: ymin, w: xmax - xmin, h: ymax - ymin };
}
function group(exprs) {
  if (!exprs.length) {
    return null;
  }
  const bbox = computeBbox(exprs);
  for (let i = 0; i < exprs.length; i++) {
    if (!exprs[i].bbox) {
      continue;
    }
    exprs[i].bbox.x -= bbox.x;
    exprs[i].bbox.y -= bbox.y;
  }
  const expr = {
    type: "node",
    text: "",
    mode: "math",
    chld: exprs,
    bbox
  };
  return expr;
}
function align(exprs, alignment = "center") {
  for (let i = 0; i < exprs.length; i++) {
    if (exprs[i].text == "^" || exprs[i].text == "'") {
      let h = 0;
      let j = i;
      while (j > 0 && (exprs[j].text == "^" || exprs[j].text == "_" || exprs[j].text == "'")) {
        j--;
      }
      h = exprs[j].bbox.y;
      if (exprs[i].text == "'") {
        exprs[i].bbox.y = h;
      } else {
        transform(exprs[i], CONFIG.SUB_SUP_SCALE, null, 0, 0);
        if (SYMB[exprs[j].text] && SYMB[exprs[j].text].flags.big) {
          exprs[i].bbox.y = h - exprs[i].bbox.h;
        } else if (exprs[j].text == "\\int") {
          exprs[i].bbox.y = h;
        } else {
          exprs[i].bbox.y = h - exprs[i].bbox.h / 2;
        }
      }
    } else if (exprs[i].text == "_") {
      let h = 1;
      let j = i;
      while (j > 0 && (exprs[j].text == "^" || exprs[j].text == "_" || exprs[j].text == "'")) {
        j--;
      }
      h = exprs[j].bbox.y + exprs[j].bbox.h;
      transform(exprs[i], CONFIG.SUB_SUP_SCALE, null, 0, 0);
      if (SYMB[exprs[j].text] && SYMB[exprs[j].text].flags.big) {
        exprs[i].bbox.y = h;
      } else if (exprs[j].text == "\\int") {
        exprs[i].bbox.y = h - exprs[i].bbox.h;
      } else {
        exprs[i].bbox.y = h - exprs[i].bbox.h / 2;
      }
    }
  }
  function searchHigh(i, l, r, dir, lvl0) {
    let j = i;
    let lvl = lvl0;
    let ymin = Infinity;
    let ymax = -Infinity;
    while (dir > 0 ? j < exprs.length : j >= 0) {
      if (exprs[j].text == l) {
        lvl++;
      } else if (exprs[j].text == r) {
        lvl--;
        if (lvl == 0) {
          break;
        }
      } else if (exprs[j].text == "^" || exprs[j].text == "_")
        ;
      else if (exprs[j].bbox) {
        ymin = Math.min(ymin, exprs[j].bbox.y);
        ymax = Math.max(ymax, exprs[j].bbox.y + exprs[j].bbox.h);
      }
      j += dir;
    }
    return [ymin, ymax];
  }
  for (let i = 0; i < exprs.length; i++) {
    if (exprs[i].text == "\\left") {
      const [ymin, ymax] = searchHigh(i, "\\left", "\\right", 1, 0);
      if (ymin != Infinity && ymax != -Infinity) {
        exprs[i].bbox.y = ymin;
        transform(exprs[i], 1, (ymax - ymin) / exprs[i].bbox.h, 0, 0);
      }
    } else if (exprs[i].text == "\\right") {
      const [ymin, ymax] = searchHigh(i, "\\right", "\\left", -1, 0);
      if (ymin != Infinity && ymax != -Infinity) {
        exprs[i].bbox.y = ymin;
        transform(exprs[i], 1, (ymax - ymin) / exprs[i].bbox.h, 0, 0);
      }
    } else if (exprs[i].text == "\\middle") {
      const [lmin, lmax] = searchHigh(i, "\\right", "\\left", -1, 1);
      const [rmin, rmax] = searchHigh(i, "\\left", "\\right", 1, 1);
      const ymin = Math.min(lmin, rmin);
      const ymax = Math.max(lmax, rmax);
      if (ymin != Infinity && ymax != -Infinity) {
        exprs[i].bbox.y = ymin;
        transform(exprs[i], 1, (ymax - ymin) / exprs[i].bbox.h, 0, 0);
      }
    }
  }
  if (!exprs.some((x) => x.text == "&" || x.text == "\\\\")) {
    return;
  }
  const rows = [];
  let row = [];
  let cell = [];
  for (let i = 0; i < exprs.length; i++) {
    if (exprs[i].text == "&") {
      row.push(cell);
      cell = [];
    } else if (exprs[i].text == "\\\\") {
      if (cell.length) {
        row.push(cell);
        cell = [];
      }
      rows.push(row);
      row = [];
    } else {
      cell.push(exprs[i]);
    }
  }
  if (cell.length) {
    row.push(cell);
  }
  if (row.length) {
    rows.push(row);
  }
  const colws = [];
  const erows = [];
  for (let i = 0; i < rows.length; i++) {
    const erow = [];
    for (let j = 0; j < rows[i].length; j++) {
      const e = group(rows[i][j]);
      if (e) {
        colws[j] = colws[j] || 0;
        colws[j] = Math.max(e.bbox.w + 1, colws[j]);
      }
      erow[j] = e;
    }
    erows.push(erow);
  }
  const ybds = [];
  for (let i = 0; i < erows.length; i++) {
    let ymin = Infinity;
    let ymax = -Infinity;
    for (let j = 0; j < erows[i].length; j++) {
      if (!erows[i][j]) {
        continue;
      }
      ymin = Math.min(ymin, erows[i][j].bbox.y);
      ymax = Math.max(ymax, erows[i][j].bbox.y + erows[i][j].bbox.h);
    }
    ybds.push([ymin, ymax]);
  }
  for (let i = 0; i < ybds.length; i++) {
    if (ybds[i][0] == Infinity || ybds[i][1] == Infinity) {
      ybds[i][0] = i == 0 ? 0 : ybds[i - 1][1];
      ybds[i][1] = ybds[i][0] + 2;
    }
  }
  for (let i = 1; i < erows.length; i++) {
    const shft = ybds[i - 1][1] - ybds[i][0] + CONFIG.LINE_SPACING;
    for (let j = 0; j < erows[i].length; j++) {
      if (erows[i][j]) {
        erows[i][j].bbox.y += shft;
      }
    }
    ybds[i][0] += shft;
    ybds[i][1] += shft;
  }
  exprs.splice(0, exprs.length);
  for (let i = 0; i < erows.length; i++) {
    let dx = 0;
    for (let j = 0; j < erows[i].length; j++) {
      const e = erows[i][j];
      if (!e) {
        dx += colws[j];
        continue;
      }
      e.bbox.x += dx;
      dx += colws[j] - e.bbox.w;
      if (alignment == "center") {
        e.bbox.x += (colws[j] - e.bbox.w) / 2;
      } else if (alignment == "left")
        ;
      else if (alignment == "right") {
        e.bbox.x += colws[j] - e.bbox.w;
      } else if (alignment == "equation") {
        if (j != erows[i].length - 1) {
          e.bbox.x += colws[j] - e.bbox.w;
        }
      }
      exprs.push(e);
    }
  }
}
function plan(expr, mode = "math") {
  var _a, _b, _c;
  const tmd = (_a = {
    "\\text": "text",
    "\\mathnormal": "math",
    "\\mathrm": "rm",
    "\\mathit": "it",
    "\\mathbf": "bf",
    "\\mathsf": "sf",
    "\\mathtt": "tt",
    "\\mathfrak": "frak",
    "\\mathcal": "cal",
    "\\mathbb": "bb",
    "\\mathscr": "scr",
    "\\rm": "rm",
    "\\it": "it",
    "\\bf": "bf",
    "\\sf": "tt",
    "\\tt": "tt",
    "\\frak": "frak",
    "\\cal": "cal",
    "\\bb": "bb",
    "\\scr": "scr"
  }[expr.text]) != null ? _a : mode;
  if (!expr.chld.length) {
    if (SYMB[expr.text]) {
      if (SYMB[expr.text].flags.big) {
        if (expr.text == "\\lim") {
          expr.bbox = { x: 0, y: 0, w: 3.5, h: 2 };
        } else {
          expr.bbox = { x: 0, y: -0.5, w: 3, h: 3 };
        }
      } else if (SYMB[expr.text].flags.txt) {
        let w = 0;
        for (let i = 1; i < expr.text.length; i++) {
          w += HERSHEY(asciiMap(expr.text[i], "text")).w;
        }
        w /= 16;
        expr.bbox = { x: 0, y: 0, w, h: 2 };
      } else if (SYMB[expr.text].glyph) {
        let w = HERSHEY(SYMB[expr.text].glyph).w;
        w /= 16;
        if (expr.text == "\\int" || expr.text == "\\oint") {
          expr.bbox = { x: 0, y: -1.5, w, h: 5 };
        } else {
          expr.bbox = { x: 0, y: 0, w, h: 2 };
        }
      } else {
        expr.bbox = { x: 0, y: 0, w: 1, h: 2 };
      }
    } else {
      let w = 0;
      for (let i = 0; i < expr.text.length; i++) {
        if (!HERSHEY(asciiMap(expr.text[i], tmd))) {
          continue;
        }
        if (tmd == "tt") {
          w += 16;
        } else {
          w += HERSHEY(asciiMap(expr.text[i], tmd)).w;
        }
      }
      w /= 16;
      expr.bbox = { x: 0, y: 0, w, h: 2 };
    }
    expr.mode = tmd;
    return;
  }
  if (expr.text == "\\frac") {
    const a = expr.chld[0];
    const b = expr.chld[1];
    const s = CONFIG.FRAC_SCALE;
    plan(a);
    plan(b);
    a.bbox.x = 0;
    a.bbox.y = 0;
    b.bbox.x = 0;
    b.bbox.y = 0;
    const mw = Math.max(a.bbox.w, b.bbox.w) * s;
    transform(a, s, null, (mw - a.bbox.w * s) / 2, 0);
    transform(
      b,
      s,
      null,
      (mw - b.bbox.w * s) / 2,
      a.bbox.h + CONFIG.FRAC_SPACING
    );
    expr.bbox = {
      x: 0,
      y: -a.bbox.h + 1 - CONFIG.FRAC_SPACING / 2,
      w: mw,
      h: a.bbox.h + b.bbox.h + CONFIG.FRAC_SPACING
    };
  } else if (expr.text == "\\binom") {
    const a = expr.chld[0];
    const b = expr.chld[1];
    plan(a);
    plan(b);
    a.bbox.x = 0;
    a.bbox.y = 0;
    b.bbox.x = 0;
    b.bbox.y = 0;
    const mw = Math.max(a.bbox.w, b.bbox.w);
    transform(a, 1, null, (mw - a.bbox.w) / 2 + 1, 0);
    transform(b, 1, null, (mw - b.bbox.w) / 2 + 1, a.bbox.h);
    expr.bbox = { x: 0, y: -a.bbox.h + 1, w: mw + 2, h: a.bbox.h + b.bbox.h };
  } else if (expr.text == "\\sqrt") {
    const e = expr.chld[0];
    plan(e);
    const f = expr.chld[1];
    let pl = 0;
    if (f) {
      plan(f);
      pl = Math.max(f.bbox.w * CONFIG.SQRT_MAG_SCALE - 0.5, 0);
      transform(f, CONFIG.SQRT_MAG_SCALE, null, 0, 0.5);
    }
    transform(e, 1, null, 1 + pl, 0.5);
    expr.bbox = {
      x: 0,
      y: 2 - e.bbox.h - 0.5,
      w: e.bbox.w + 1 + pl,
      h: e.bbox.h + 0.5
    };
  } else if (SYMB[expr.text] && SYMB[expr.text].flags.hat) {
    const e = expr.chld[0];
    plan(e);
    const y0 = e.bbox.y - 0.5;
    e.bbox.y = 0.5;
    expr.bbox = { x: 0, y: y0, w: e.bbox.w, h: e.bbox.h + 0.5 };
  } else if (SYMB[expr.text] && SYMB[expr.text].flags.mat) {
    const e = expr.chld[0];
    plan(e);
    expr.bbox = { x: 0, y: 0, w: e.bbox.w, h: e.bbox.h + 0.5 };
  } else {
    let dx = 0;
    let dy = 0;
    let mh = 1;
    for (let i = 0; i < expr.chld.length; i++) {
      const c = expr.chld[i];
      const spac = (_b = {
        "\\quad": 2,
        "\\,": 2 * 3 / 18,
        "\\:": 2 * 4 / 18,
        "\\;": 2 * 5 / 18,
        "\\!": 2 * -3 / 18
      }[c.text]) != null ? _b : null;
      if (c.text == "\\\\") {
        dy += mh;
        dx = 0;
        mh = 1;
        continue;
      } else if (c.text == "&") {
        continue;
      } else if (spac != null) {
        dx += spac;
        continue;
      } else {
        plan(c, tmd);
        transform(c, 1, null, dx, dy);
        if (c.text == "^" || c.text == "_" || c.text == "'") {
          let j = i;
          while (j > 0 && (expr.chld[j].text == "^" || expr.chld[j].text == "_" || expr.chld[j].text == "'")) {
            j--;
          }
          const wasBig = SYMB[expr.chld[j].text] && SYMB[expr.chld[j].text].flags.big;
          if (c.text == "'") {
            let k = j + 1;
            let nth = 0;
            while (k < i) {
              if (expr.chld[k].text == "'") {
                nth++;
              }
              k++;
            }
            c.bbox.x = expr.chld[j].bbox.x + expr.chld[j].bbox.w + c.bbox.w * nth;
            dx = Math.max(dx, c.bbox.x + c.bbox.w);
          } else {
            if (wasBig) {
              const ex = expr.chld[j].bbox.x + (expr.chld[j].bbox.w - c.bbox.w * CONFIG.SUB_SUP_SCALE) / 2;
              c.bbox.x = ex;
              dx = Math.max(
                dx,
                expr.chld[j].bbox.x + expr.chld[j].bbox.w + (c.bbox.w * CONFIG.SUB_SUP_SCALE - expr.chld[j].bbox.w) / 2
              );
            } else {
              c.bbox.x = expr.chld[j].bbox.x + expr.chld[j].bbox.w;
              dx = Math.max(dx, c.bbox.x + c.bbox.w * CONFIG.SUB_SUP_SCALE);
            }
          }
        } else {
          dx += c.bbox.w;
        }
        if (mode == "text") {
          dx += 1;
        }
        mh = Math.max(c.bbox.y + c.bbox.h - dy, mh);
      }
    }
    dy += mh;
    const m2s = {
      bmatrix: ["[", "]"],
      pmatrix: ["(", ")"],
      Bmatrix: ["\\{", "\\}"],
      cases: ["\\{"]
    };
    const alt = (_c = {
      bmatrix: "center",
      pmatrix: "center",
      Bmatrix: "center",
      cases: "left",
      matrix: "center",
      aligned: "equation"
    }[expr.text]) != null ? _c : "left";
    const hasLp = !!m2s[expr.text];
    const hasRp = !!m2s[expr.text] && m2s[expr.text].length > 1;
    align(expr.chld, alt);
    const bb = computeBbox(expr.chld);
    if (expr.text == "\\text") {
      bb.x -= 1;
      bb.w += 2;
    }
    for (let i = 0; i < expr.chld.length; i++) {
      transform(expr.chld[i], 1, null, -bb.x + (hasLp ? 1.5 : 0), -bb.y);
    }
    expr.bbox = {
      x: 0,
      y: 0,
      w: bb.w + 1.5 * Number(hasLp) + 1.5 * Number(hasRp),
      h: bb.h
    };
    if (hasLp) {
      expr.chld.unshift({
        type: "symb",
        text: m2s[expr.text][0],
        mode: expr.mode,
        chld: [],
        bbox: { x: 0, y: 0, w: 1, h: bb.h }
      });
    }
    if (hasRp) {
      expr.chld.push({
        type: "symb",
        text: m2s[expr.text][1],
        mode: expr.mode,
        chld: [],
        bbox: { x: bb.w + 2, y: 0, w: 1, h: bb.h }
      });
    }
    if (hasLp || hasRp || expr.text == "matrix") {
      expr.type = "node";
      expr.text = "";
      expr.bbox.y -= (expr.bbox.h - 2) / 2;
    }
  }
}
function flatten(expr) {
  function flat(expr2, dx, dy) {
    const ff = [];
    if (expr2.bbox) {
      dx += expr2.bbox.x;
      dy += expr2.bbox.y;
      if (expr2.text == "\\frac") {
        const h = expr2.chld[1].bbox.y - (expr2.chld[0].bbox.y + expr2.chld[0].bbox.h);
        const e = {
          type: "symb",
          mode: expr2.mode,
          text: "\\bar",
          bbox: {
            x: dx,
            y: dy + (expr2.chld[1].bbox.y - h / 2) - h / 2,
            w: expr2.bbox.w,
            h
          },
          chld: []
        };
        ff.push(e);
      } else if (expr2.text == "\\sqrt") {
        const h = expr2.chld[0].bbox.y;
        const xx = Math.max(
          0,
          expr2.chld[0].bbox.x - expr2.chld[0].bbox.h / 2
        );
        const e = {
          type: "symb",
          mode: expr2.mode,
          text: "\\sqrt",
          bbox: {
            x: dx + xx,
            y: dy + h / 2,
            w: expr2.chld[0].bbox.x - xx,
            h: expr2.bbox.h - h / 2
          },
          chld: []
        };
        ff.push(e);
        ff.push({
          type: "symb",
          text: "\\bar",
          mode: expr2.mode,
          bbox: {
            x: dx + expr2.chld[0].bbox.x,
            y: dy,
            w: expr2.bbox.w - expr2.chld[0].bbox.x,
            h
          },
          chld: []
        });
      } else if (expr2.text == "\\binom") {
        const w = Math.min(expr2.chld[0].bbox.x, expr2.chld[1].bbox.x);
        const e = {
          type: "symb",
          mode: expr2.mode,
          text: "(",
          bbox: {
            x: dx,
            y: dy,
            w,
            h: expr2.bbox.h
          },
          chld: []
        };
        ff.push(e);
        ff.push({
          type: "symb",
          text: ")",
          mode: expr2.mode,
          bbox: {
            x: dx + expr2.bbox.w - w,
            y: dy,
            w,
            h: expr2.bbox.h
          },
          chld: []
        });
      } else if (SYMB[expr2.text] && SYMB[expr2.text].flags.hat) {
        const h = expr2.chld[0].bbox.y;
        const e = {
          type: "symb",
          mode: expr2.mode,
          text: expr2.text,
          bbox: {
            x: dx,
            y: dy,
            w: expr2.bbox.w,
            h
          },
          chld: []
        };
        ff.push(e);
      } else if (SYMB[expr2.text] && SYMB[expr2.text].flags.mat) {
        const h = expr2.chld[0].bbox.h;
        const e = {
          type: "symb",
          text: expr2.text,
          mode: expr2.mode,
          bbox: {
            x: dx,
            y: dy + h,
            w: expr2.bbox.w,
            h: expr2.bbox.h - h
          },
          chld: []
        };
        ff.push(e);
      } else if (expr2.type != "node" && expr2.text != "^" && expr2.text != "_") {
        const e = {
          type: expr2.type == "func" ? "symb" : expr2.type,
          text: expr2.text,
          mode: expr2.mode,
          bbox: {
            x: dx,
            y: dy,
            w: expr2.bbox.w,
            h: expr2.bbox.h
          },
          chld: []
        };
        ff.push(e);
      }
    }
    for (let i = 0; i < expr2.chld.length; i++) {
      const f2 = flat(expr2.chld[i], dx, dy);
      ff.push(...f2);
    }
    return ff;
  }
  const f = flat(expr, -expr.bbox.x, -expr.bbox.y);
  expr.type = "node";
  expr.text = "";
  expr.chld = f;
}
function render(expr) {
  const o = [];
  for (let i = 0; i < expr.chld.length; i++) {
    const e = expr.chld[i];
    let s = e.bbox.h / 2;
    let isSmallHat = false;
    if (SYMB[e.text] && SYMB[e.text].flags.hat && !SYMB[e.text].flags.xfl && !SYMB[e.text].flags.yfl) {
      s *= 4;
      isSmallHat = true;
    }
    if (SYMB[e.text] && SYMB[e.text].glyph) {
      const d = HERSHEY(SYMB[e.text].glyph);
      for (let j = 0; j < d.polylines.length; j++) {
        const l = [];
        for (let k = 0; k < d.polylines[j].length; k++) {
          let x = d.polylines[j][k][0];
          let y = d.polylines[j][k][1];
          if (SYMB[e.text].flags.xfl) {
            x = (x - d.xmin) / Math.max(d.xmax - d.xmin, 1) * e.bbox.w;
            x += e.bbox.x;
          } else if (d.w / 16 * s > e.bbox.w) {
            x = x / Math.max(d.w, 1) * e.bbox.w;
            x += e.bbox.x;
          } else {
            x = x / 16 * s;
            const p = (e.bbox.w - d.w / 16 * s) / 2;
            x += e.bbox.x + p;
          }
          if (SYMB[e.text].flags.yfl) {
            y = (y - d.ymin) / Math.max(d.ymax - d.ymin, 1) * e.bbox.h;
            y += e.bbox.y;
          } else {
            y = y / 16 * s;
            if (isSmallHat) {
              const p = (d.ymax + d.ymin) / 2;
              y -= p / 16 * s;
            }
            y += e.bbox.y + e.bbox.h / 2;
          }
          l.push([x, y]);
        }
        o.push(l);
      }
    } else if (SYMB[e.text] && SYMB[e.text].flags.txt || e.type == "char") {
      let x0 = e.bbox.x;
      const isVerb = !!(SYMB[e.text] && SYMB[e.text].flags.txt);
      for (let n = Number(isVerb); n < e.text.length; n++) {
        const d = HERSHEY(asciiMap(e.text[n], isVerb ? "text" : e.mode));
        if (!d) {
          console.warn("unmapped character: " + e.text[n]);
          continue;
        }
        for (let j = 0; j < d.polylines.length; j++) {
          const l = [];
          for (let k = 0; k < d.polylines[j].length; k++) {
            let x = d.polylines[j][k][0];
            let y = d.polylines[j][k][1];
            x /= 16;
            y /= 16;
            x *= s;
            y *= s;
            if (e.mode == "tt") {
              if (d.w > 16) {
                x *= 16 / d.w;
              } else {
                x += (16 - d.w) / 2 / 16;
              }
            }
            x += x0;
            y += e.bbox.y + e.bbox.h / 2;
            l.push([x, y]);
          }
          o.push(l);
        }
        if (e.mode == "tt") {
          x0 += s;
        } else {
          x0 += d.w / 16 * s;
        }
      }
    }
  }
  return o;
}
function nf(x) {
  return Math.round(x * 100) / 100;
}
class LaTexUtils {
  constructor(latex) {
    this._latex = latex;
    this._tokens = tokenize(latex);
    this._tree = parse(this._tokens);
    environments(this._tree.chld);
    plan(this._tree);
    flatten(this._tree);
    this._polylines = render(this._tree);
  }
  resolveScale(opt) {
    var _a, _b, _c, _d;
    if (opt == void 0) {
      return [16, 16, 16, 16];
    }
    let sclx = (_a = opt.SCALE_X) != null ? _a : 16;
    let scly = (_b = opt.SCALE_Y) != null ? _b : 16;
    if (opt.MIN_CHAR_H != void 0) {
      let mh = 0;
      for (let i = 0; i < this._tree.chld.length; i++) {
        const c = this._tree.chld[i];
        if (c.type == "char" || SYMB[c.text] && (SYMB[c.text].flags.txt || !Object.keys(SYMB[c.text].flags).length)) {
          mh = Math.min(c.bbox.h, mh);
        }
      }
      const s = Math.max(1, opt.MIN_CHAR_H / mh);
      sclx *= s;
      scly *= s;
    }
    if (opt.MAX_W != void 0) {
      const s0 = sclx;
      sclx = Math.min(sclx, opt.MAX_W / this._tree.bbox.w);
      scly *= sclx / s0;
    }
    if (opt.MAX_H != void 0) {
      const s0 = scly;
      scly = Math.min(scly, opt.MAX_H / this._tree.bbox.h);
      sclx *= scly / s0;
    }
    const px = (_c = opt.MARGIN_X) != null ? _c : sclx;
    const py = (_d = opt.MARGIN_Y) != null ? _d : scly;
    return [px, py, sclx, scly];
  }
  polylines(opt) {
    if (!opt)
      opt = {};
    const polylines = [];
    const [px, py, sclx, scly] = this.resolveScale(opt);
    for (let i = 0; i < this._polylines.length; i++) {
      polylines.push([]);
      for (let j = 0; j < this._polylines[i].length; j++) {
        const [x, y] = this._polylines[i][j];
        polylines[polylines.length - 1].push([px + x * sclx, py + y * scly]);
      }
    }
    return polylines;
  }
  pathd(opt) {
    if (!opt)
      opt = {};
    let d = "";
    const [px, py, sclx, scly] = this.resolveScale(opt);
    for (let i = 0; i < this._polylines.length; i++) {
      for (let j = 0; j < this._polylines[i].length; j++) {
        const [x, y] = this._polylines[i][j];
        d += !j ? "M" : "L";
        d += `${nf(px + x * sclx)} ${nf(py + y * scly)}`;
      }
    }
    return d;
  }
  svg(opt) {
    var _a, _b;
    if (!opt)
      opt = {};
    const [px, py, sclx, scly] = this.resolveScale(opt);
    const w = nf(this._tree.bbox.w * sclx + px * 2);
    const h = nf(this._tree.bbox.h * scly + py * 2);
    let o = `<svg
      xmlns="http://www.w3.org/2000/svg"
      width="${w}" height="${h}"
      fill="none" stroke="${(_a = opt.FG_COLOR) != null ? _a : "black"}" stroke-width="${(_b = opt.STROKE_W) != null ? _b : 1}"
      stroke-linecap="round" stroke-linejoin="round"
    >`;
    if (opt.BG_COLOR) {
      o += `<rect x="${0}" y="${0}" width="${w}" height="${h}" fill="${opt.BG_COLOR}" stroke="none"></rect>`;
    }
    o += `<path d="`;
    for (let i = 0; i < this._polylines.length; i++) {
      o += "M";
      for (let j = 0; j < this._polylines[i].length; j++) {
        const [x, y] = this._polylines[i][j];
        o += nf(px + x * sclx) + " " + nf(py + y * scly) + " ";
      }
    }
    o += `"/>`;
    o += `</svg>`;
    return {
      svg: `data:image/svg+xml;base64,${window.btoa(o)}`,
      width: Math.ceil(w),
      height: Math.ceil(h)
    };
  }
  pdf(opt) {
    var _a;
    if (!opt)
      opt = {};
    const [px, py, sclx, scly] = this.resolveScale(opt);
    const width = nf(this._tree.bbox.w * sclx + px * 2);
    const height = nf(this._tree.bbox.h * scly + py * 2);
    let head = `%PDF-1.1
%%\xA5\xB1\xEB
1 0 obj
<< /Type /Catalog
/Pages 2 0 R
>>endobj
    2 0 obj
<< /Type /Pages
/Kids [3 0 R]
/Count 1
/MediaBox [0 0 ${width} ${height}]
>>
endobj
    3 0 obj
<< /Type /Page
/Parent 2 0 R
/Resources
<< /Font
<< /F1
<< /Type /Font
    /Subtype /Type1
/BaseFont /Times-Roman
>>
>>
>>
/Contents [`;
    let pdf = "";
    let count = 4;
    for (let i = 0; i < this._polylines.length; i++) {
      pdf += `${count} 0 obj 
<< /Length 0 >>
 stream
 1 j 1 J ${(_a = opt.STROKE_W) != null ? _a : 1} w
`;
      for (let j = 0; j < this._polylines[i].length; j++) {
        const [x, y] = this._polylines[i][j];
        pdf += `${nf(px + x * sclx)} ${nf(height - (py + y * scly))} ${j ? "l" : "m"} `;
      }
      pdf += "\nS\nendstream\nendobj\n";
      head += `${count} 0 R `;
      count++;
    }
    head += "]\n>>\nendobj\n";
    pdf += "\ntrailer\n<< /Root 1 0 R \n /Size 0\n >>startxref\n\n%%EOF\n";
    return head + pdf;
  }
  boxes(opt) {
    if (!opt)
      opt = {};
    const [px, py, sclx, scly] = this.resolveScale(opt);
    const bs = [];
    for (let i = 0; i < this._tree.chld.length; i++) {
      const { x, y, w, h } = this._tree.chld[i].bbox;
      bs.push({ x: px + x * sclx, y: py + y * scly, w: w * sclx, h: h * scly });
    }
    return bs;
  }
  box(opt) {
    if (!opt)
      opt = {};
    const [px, py, sclx, scly] = this.resolveScale(opt);
    return {
      x: px + this._tree.bbox.x * sclx,
      y: py + this._tree.bbox.y * scly,
      w: this._tree.bbox.w * sclx,
      h: this._tree.bbox.h * scly
    };
  }
}
class LaTexParticle extends ImageParticle {
  static convertLaTextToSVG(laTex) {
    return new LaTexUtils(laTex).svg({
      SCALE_X: 10,
      SCALE_Y: 10,
      MARGIN_X: 0,
      MARGIN_Y: 0
    });
  }
  async render(ctx2d, element, x, y) {
    const { scale } = this.options;
    const width = element.width * scale;
    const height = element.height * scale;
    ctx2d.drawImage(element.laTexSVG, x, y, width, height);
  }
}
var ElementType = /* @__PURE__ */ ((ElementType2) => {
  ElementType2["TEXT"] = "text";
  ElementType2["IMAGE"] = "image";
  ElementType2["TABLE"] = "table";
  ElementType2["HYPERLINK"] = "hyperlink";
  ElementType2["SUPERSCRIPT"] = "superscript";
  ElementType2["SUBSCRIPT"] = "subscript";
  ElementType2["SEPARATOR"] = "separator";
  ElementType2["PAGE_BREAK"] = "pageBreak";
  ElementType2["CONTROL"] = "control";
  ElementType2["CHECKBOX"] = "checkbox";
  ElementType2["RADIO"] = "radio";
  ElementType2["LATEX"] = "latex";
  ElementType2["TAB"] = "tab";
  ElementType2["DATE"] = "date";
  ElementType2["BLOCK"] = "block";
  ElementType2["TITLE"] = "title";
  ElementType2["LIST"] = "list";
  return ElementType2;
})(ElementType || {});
const EDITOR_ROW_ATTR = ["rowFlex", "rowMargin"];
const EDITOR_ELEMENT_ZIP_ATTR = [
  "type",
  "font",
  "size",
  "bold",
  "color",
  "italic",
  "highlight",
  "underline",
  "strikeout",
  "rowFlex",
  "rowMargin",
  "dashArray",
  "trList",
  "borderType",
  "width",
  "height",
  "url",
  "colgroup",
  "valueList",
  "control",
  "checkbox",
  "radio",
  "dateFormat",
  "block",
  "level",
  "title",
  "listType",
  "listStyle",
  "listWrap",
  "groupIds",
  "conceptId",
  "imgDisplay",
  "imgFloatPosition",
  "textDecoration",
  "extension",
  "externalId"
];
const TABLE_TD_ZIP_ATTR = [
  "conceptId",
  "extension",
  "externalId",
  "verticalAlign",
  "backgroundColor",
  "borderTypes",
  "slashTypes"
];
const TABLE_CONTEXT_ATTR = [
  "tdId",
  "trId",
  "tableId"
];
const TITLE_CONTEXT_ATTR = [
  "level",
  "titleId",
  "title"
];
const LIST_CONTEXT_ATTR = [
  "listId",
  "listType",
  "listStyle"
];
const CONTROL_STYLE_ATTR = [
  "font",
  "size",
  "bold",
  "highlight",
  "italic",
  "strikeout"
];
const EDITOR_ELEMENT_CONTEXT_ATTR = [
  ...TABLE_CONTEXT_ATTR,
  ...TITLE_CONTEXT_ATTR,
  ...LIST_CONTEXT_ATTR
];
const TEXTLIKE_ELEMENT_TYPE = [
  ElementType.TEXT,
  ElementType.HYPERLINK,
  ElementType.SUBSCRIPT,
  ElementType.SUPERSCRIPT,
  ElementType.CONTROL,
  ElementType.DATE
];
[
  ElementType.IMAGE,
  ElementType.LATEX
];
const BLOCK_ELEMENT_TYPE = [
  ElementType.BLOCK,
  ElementType.PAGE_BREAK,
  ElementType.SEPARATOR,
  ElementType.TABLE
];
[
  ElementType.TITLE,
  ElementType.LIST
];
var ListType = /* @__PURE__ */ ((ListType2) => {
  ListType2["UL"] = "ul";
  ListType2["OL"] = "ol";
  return ListType2;
})(ListType || {});
var UlStyle = /* @__PURE__ */ ((UlStyle2) => {
  UlStyle2["DISC"] = "disc";
  UlStyle2["CIRCLE"] = "circle";
  UlStyle2["SQUARE"] = "square";
  UlStyle2["CHECKBOX"] = "checkbox";
  return UlStyle2;
})(UlStyle || {});
var ListStyle = /* @__PURE__ */ ((ListStyle2) => {
  ListStyle2["DISC"] = "disc";
  ListStyle2["CIRCLE"] = "circle";
  ListStyle2["SQUARE"] = "square";
  ListStyle2["DECIMAL"] = "decimal";
  ListStyle2["CHECKBOX"] = "checkbox";
  return ListStyle2;
})(ListStyle || {});
const ulStyleMapping = {
  [UlStyle.DISC]: "\u2022",
  [UlStyle.CIRCLE]: "\u25E6",
  [UlStyle.SQUARE]: "\u25AB\uFE0E",
  [UlStyle.CHECKBOX]: "\u2611\uFE0F"
};
({
  [ListType.OL]: "ol",
  [ListType.UL]: "ul"
});
({
  [ListStyle.DISC]: "disc",
  [ListStyle.CIRCLE]: "circle",
  [ListStyle.SQUARE]: "square",
  [ListStyle.DECIMAL]: "decimal",
  [ListStyle.CHECKBOX]: "checkbox"
});
var TitleLevel = /* @__PURE__ */ ((TitleLevel2) => {
  TitleLevel2["FIRST"] = "first";
  TitleLevel2["SECOND"] = "second";
  TitleLevel2["THIRD"] = "third";
  TitleLevel2["FOURTH"] = "fourth";
  TitleLevel2["FIFTH"] = "fifth";
  TitleLevel2["SIXTH"] = "sixth";
  return TitleLevel2;
})(TitleLevel || {});
const defaultTitleOption = {
  defaultFirstSize: 26,
  defaultSecondSize: 24,
  defaultThirdSize: 22,
  defaultFourthSize: 20,
  defaultFifthSize: 18,
  defaultSixthSize: 16
};
const titleSizeMapping = {
  [TitleLevel.FIRST]: "defaultFirstSize",
  [TitleLevel.SECOND]: "defaultSecondSize",
  [TitleLevel.THIRD]: "defaultThirdSize",
  [TitleLevel.FOURTH]: "defaultFourthSize",
  [TitleLevel.FIFTH]: "defaultFifthSize",
  [TitleLevel.SIXTH]: "defaultSixthSize"
};
({
  [TitleLevel.FIRST]: 1,
  [TitleLevel.SECOND]: 2,
  [TitleLevel.THIRD]: 3,
  [TitleLevel.FOURTH]: 4,
  [TitleLevel.FIFTH]: 5,
  [TitleLevel.SIXTH]: 6
});
({
  H1: TitleLevel.FIRST,
  H2: TitleLevel.SECOND,
  H3: TitleLevel.THIRD,
  H4: TitleLevel.FOURTH,
  H5: TitleLevel.FIFTH,
  H6: TitleLevel.SIXTH
});
var TableBorder = /* @__PURE__ */ ((TableBorder2) => {
  TableBorder2["ALL"] = "all";
  TableBorder2["EMPTY"] = "empty";
  TableBorder2["EXTERNAL"] = "external";
  TableBorder2["INTERNAL"] = "internal";
  TableBorder2["DASH"] = "dash";
  return TableBorder2;
})(TableBorder || {});
var TdBorder = /* @__PURE__ */ ((TdBorder2) => {
  TdBorder2["TOP"] = "top";
  TdBorder2["RIGHT"] = "right";
  TdBorder2["BOTTOM"] = "bottom";
  TdBorder2["LEFT"] = "left";
  return TdBorder2;
})(TdBorder || {});
var TdSlash = /* @__PURE__ */ ((TdSlash2) => {
  TdSlash2["FORWARD"] = "forward";
  TdSlash2["BACK"] = "back";
  return TdSlash2;
})(TdSlash || {});
function unzipElementList(elementList) {
  const result = [];
  for (let v = 0; v < elementList.length; v++) {
    const valueItem = elementList[v];
    const textList = splitText(valueItem.value);
    for (let d = 0; d < textList.length; d++) {
      result.push({ ...valueItem, value: textList[d] });
    }
  }
  return result;
}
async function formatElementList(elementList, options) {
  const {
    isHandleFirstElement = true,
    isForceCompensation = false,
    editorOptions
  } = options;
  const startElement = elementList[0];
  if (isForceCompensation || isHandleFirstElement && (startElement == null ? void 0 : startElement.type) !== ElementType.LIST && ((startElement == null ? void 0 : startElement.type) && startElement.type !== ElementType.TEXT || !START_LINE_BREAK_REG.test(startElement == null ? void 0 : startElement.value))) {
    elementList.unshift({
      value: ZERO
    });
  }
  let i = 0;
  while (i < elementList.length) {
    let el = elementList[i];
    if (el.type === ElementType.TITLE) {
      elementList.splice(i, 1);
      const valueList = el.valueList || [];
      formatElementList(valueList, {
        ...options,
        isHandleFirstElement: false,
        isForceCompensation: false
      });
      if (valueList.length) {
        const titleId = getUUID();
        const titleOptions = editorOptions.title;
        for (let v = 0; v < valueList.length; v++) {
          const value = valueList[v];
          value.title = el.title;
          if (el.level) {
            value.titleId = titleId;
            value.level = el.level;
          }
          if (isTextLikeElement(value)) {
            if (!value.size) {
              value.size = titleOptions[titleSizeMapping[value.level]];
            }
            if (value.bold === void 0) {
              value.bold = true;
            }
          }
          elementList.splice(i, 0, value);
          i++;
        }
      }
      i--;
    } else if (el.type === ElementType.LIST) {
      elementList.splice(i, 1);
      const valueList = el.valueList || [];
      formatElementList(valueList, {
        ...options,
        isHandleFirstElement: true,
        isForceCompensation: false
      });
      if (valueList.length) {
        const listId = getUUID();
        for (let v = 0; v < valueList.length; v++) {
          const value = valueList[v];
          value.listId = listId;
          value.listType = el.listType;
          value.listStyle = el.listStyle;
          elementList.splice(i, 0, value);
          i++;
        }
      }
      i--;
    } else if (el.type === ElementType.TABLE) {
      const tableId = getUUID();
      el.id = tableId;
      if (el.trList) {
        const { defaultTrMinHeight } = editorOptions.table;
        for (let t = 0; t < el.trList.length; t++) {
          const tr = el.trList[t];
          const trId = getUUID();
          tr.id = trId;
          if (!tr.minHeight || tr.minHeight < defaultTrMinHeight) {
            tr.minHeight = defaultTrMinHeight;
          }
          if (tr.height < tr.minHeight) {
            tr.height = tr.minHeight;
          }
          for (let d = 0; d < tr.tdList.length; d++) {
            const td = tr.tdList[d];
            const tdId = getUUID();
            td.id = tdId;
            formatElementList(td.value, {
              ...options,
              isHandleFirstElement: true,
              isForceCompensation: true
            });
            for (let v = 0; v < td.value.length; v++) {
              const value = td.value[v];
              value.tdId = tdId;
              value.trId = trId;
              value.tableId = tableId;
            }
          }
        }
      }
    } else if (el.type === ElementType.HYPERLINK) {
      elementList.splice(i, 1);
      const valueList = unzipElementList(el.valueList || []);
      if (valueList.length) {
        const hyperlinkId = getUUID();
        for (let v = 0; v < valueList.length; v++) {
          const value = valueList[v];
          value.type = el.type;
          value.url = el.url;
          value.hyperlinkId = hyperlinkId;
          elementList.splice(i, 0, value);
          i++;
        }
      }
      i--;
    } else if (el.type === ElementType.DATE) {
      elementList.splice(i, 1);
      const valueList = unzipElementList(el.valueList || []);
      if (valueList.length) {
        const dateId = getUUID();
        for (let v = 0; v < valueList.length; v++) {
          const value = valueList[v];
          value.type = el.type;
          value.dateFormat = el.dateFormat;
          value.dateId = dateId;
          elementList.splice(i, 0, value);
          i++;
        }
      }
      i--;
    } else if (el.type === ElementType.CONTROL) {
      if (!el.control) {
        i++;
        continue;
      }
      const { prefix, postfix, value, placeholder, code, type, valueSets } = el.control;
      const {
        editorOptions: {
          control: controlOption,
          checkbox: checkboxOption,
          radio: radioOption
        }
      } = options;
      const controlId = getUUID();
      elementList.splice(i, 1);
      const controlContext = pickObject(el, [
        ...EDITOR_ELEMENT_CONTEXT_ATTR,
        ...EDITOR_ROW_ATTR
      ]);
      const controlDefaultStyle = pickObject(
        el.control,
        CONTROL_STYLE_ATTR
      );
      const thePrePostfixArg = {
        ...controlDefaultStyle,
        color: editorOptions.control.bracketColor
      };
      const prefixStrList = splitText(prefix || controlOption.prefix);
      for (let p = 0; p < prefixStrList.length; p++) {
        const value2 = prefixStrList[p];
        elementList.splice(i, 0, {
          ...controlContext,
          ...thePrePostfixArg,
          controlId,
          value: value2,
          type: el.type,
          control: el.control,
          controlComponent: ControlComponent.PREFIX
        });
        i++;
      }
      if (value && value.length || type === ControlType.CHECKBOX || type === ControlType.RADIO || type === ControlType.SELECT && code && (!value || !value.length)) {
        let valueList = value || [];
        if (type === ControlType.CHECKBOX) {
          const codeList = code ? code.split(",") : [];
          if (Array.isArray(valueSets) && valueSets.length) {
            const valueStyleList = valueList.reduce(
              (pre, cur) => pre.concat(
                cur.value.split("").map((v) => ({ ...cur, value: v }))
              ),
              []
            );
            let valueStyleIndex = 0;
            for (let v = 0; v < valueSets.length; v++) {
              const valueSet = valueSets[v];
              elementList.splice(i, 0, {
                ...controlContext,
                ...controlDefaultStyle,
                controlId,
                value: "",
                type: el.type,
                control: el.control,
                controlComponent: ControlComponent.CHECKBOX,
                checkbox: {
                  code: valueSet.code,
                  value: codeList.includes(valueSet.code)
                }
              });
              i++;
              const valueStrList = splitText(valueSet.value);
              for (let e = 0; e < valueStrList.length; e++) {
                const value2 = valueStrList[e];
                const isLastLetter = e === valueStrList.length - 1;
                elementList.splice(i, 0, {
                  ...controlContext,
                  ...controlDefaultStyle,
                  ...valueStyleList[valueStyleIndex],
                  controlId,
                  value: value2 === "\n" ? ZERO : value2,
                  letterSpacing: isLastLetter ? checkboxOption.gap : 0,
                  control: el.control,
                  controlComponent: ControlComponent.VALUE
                });
                valueStyleIndex++;
                i++;
              }
            }
          }
        } else if (type === ControlType.RADIO) {
          if (Array.isArray(valueSets) && valueSets.length) {
            const valueStyleList = valueList.reduce(
              (pre, cur) => pre.concat(
                cur.value.split("").map((v) => ({ ...cur, value: v }))
              ),
              []
            );
            let valueStyleIndex = 0;
            for (let v = 0; v < valueSets.length; v++) {
              const valueSet = valueSets[v];
              elementList.splice(i, 0, {
                ...controlContext,
                ...controlDefaultStyle,
                controlId,
                value: "",
                type: el.type,
                control: el.control,
                controlComponent: ControlComponent.RADIO,
                radio: {
                  code: valueSet.code,
                  value: code === valueSet.code
                }
              });
              i++;
              const valueStrList = splitText(valueSet.value);
              for (let e = 0; e < valueStrList.length; e++) {
                const value2 = valueStrList[e];
                const isLastLetter = e === valueStrList.length - 1;
                elementList.splice(i, 0, {
                  ...controlContext,
                  ...controlDefaultStyle,
                  ...valueStyleList[valueStyleIndex],
                  controlId,
                  value: value2 === "\n" ? ZERO : value2,
                  letterSpacing: isLastLetter ? radioOption.gap : 0,
                  control: el.control,
                  controlComponent: ControlComponent.VALUE
                });
                valueStyleIndex++;
                i++;
              }
            }
          }
        } else {
          if (!value || !value.length) {
            if (Array.isArray(valueSets) && valueSets.length) {
              const valueSet = valueSets.find((v) => v.code === code);
              if (valueSet) {
                valueList = [
                  {
                    value: valueSet.value
                  }
                ];
              }
            }
          }
          formatElementList(valueList, {
            ...options,
            isHandleFirstElement: false,
            isForceCompensation: false
          });
          for (let v = 0; v < valueList.length; v++) {
            const element = valueList[v];
            const value2 = element.value;
            elementList.splice(i, 0, {
              ...controlContext,
              ...controlDefaultStyle,
              ...element,
              controlId,
              value: value2 === "\n" ? ZERO : value2,
              type: element.type || ElementType.TEXT,
              control: el.control,
              controlComponent: ControlComponent.VALUE
            });
            i++;
          }
        }
      } else if (placeholder) {
        const thePlaceholderArgs = {
          ...controlDefaultStyle,
          color: editorOptions.control.placeholderColor
        };
        const placeholderStrList = splitText(placeholder);
        for (let p = 0; p < placeholderStrList.length; p++) {
          const value2 = placeholderStrList[p];
          elementList.splice(i, 0, {
            ...controlContext,
            ...thePlaceholderArgs,
            controlId,
            value: value2 === "\n" ? ZERO : value2,
            type: el.type,
            control: el.control,
            controlComponent: ControlComponent.PLACEHOLDER
          });
          i++;
        }
      }
      const postfixStrList = splitText(postfix || controlOption.postfix);
      for (let p = 0; p < postfixStrList.length; p++) {
        const value2 = postfixStrList[p];
        elementList.splice(i, 0, {
          ...controlContext,
          ...thePrePostfixArg,
          controlId,
          value: value2,
          type: el.type,
          control: el.control,
          controlComponent: ControlComponent.POSTFIX
        });
        i++;
      }
      i--;
    } else if ((!el.type || TEXTLIKE_ELEMENT_TYPE.includes(el.type)) && el.value.length > 1) {
      elementList.splice(i, 1);
      const valueList = splitText(el.value);
      for (let v = 0; v < valueList.length; v++) {
        elementList.splice(i + v, 0, { ...el, value: valueList[v] });
      }
      el = elementList[i];
    }
    if (el.value === "\n" || el.value == "\r\n") {
      el.value = ZERO;
    }
    if (el.type === ElementType.IMAGE || el.type === ElementType.BLOCK) {
      el.id = getUUID();
    }
    if (el.type === ElementType.LATEX) {
      const { svg, width, height } = LaTexParticle.convertLaTextToSVG(el.value);
      el.width = el.width || width;
      el.height = el.height || height;
      el.laTexSVG = svg;
      el.id = getUUID();
      await svgString2Image(el.laTexSVG, width, height, "png", (pngData) => {
        el.laTexSVG = pngData;
      });
    }
    i++;
  }
}
function isSameElementExceptValue(source, target) {
  const sourceKeys = Object.keys(source);
  const targetKeys = Object.keys(target);
  if (sourceKeys.length !== targetKeys.length)
    return false;
  for (let s = 0; s < sourceKeys.length; s++) {
    const key = sourceKeys[s];
    if (key === "value")
      continue;
    if (key === "groupIds" && Array.isArray(source[key]) && Array.isArray(target[key]) && isArrayEqual(source[key], target[key])) {
      continue;
    }
    if (source[key] !== target[key]) {
      return false;
    }
  }
  return true;
}
function pickElementAttr(payload, option = {}) {
  const { extraPickAttrs } = option;
  const zipAttrs = EDITOR_ELEMENT_ZIP_ATTR;
  if (extraPickAttrs) {
    zipAttrs.push(...extraPickAttrs);
  }
  const element = {
    value: payload.value === ZERO ? `
` : payload.value
  };
  zipAttrs.forEach((attr) => {
    const value = payload[attr];
    if (value !== void 0) {
      element[attr] = value;
    }
  });
  return element;
}
function zipElementList(payload, options = {}) {
  const { extraPickAttrs } = options;
  const elementList = deepClone(payload);
  const zipElementListData = [];
  let e = 0;
  while (e < elementList.length) {
    let element = elementList[e];
    if (e === 0 && element.value === ZERO && !element.listId && (!element.type || element.type === ElementType.TEXT)) {
      e++;
      continue;
    }
    if (element.titleId && element.level) {
      const titleId = element.titleId;
      if (titleId) {
        const level = element.level;
        const titleElement = {
          type: ElementType.TITLE,
          title: element.title,
          value: "",
          level
        };
        const valueList = [];
        while (e < elementList.length) {
          const titleE = elementList[e];
          if (titleId !== titleE.titleId) {
            e--;
            break;
          }
          delete titleE.level;
          delete titleE.title;
          valueList.push(titleE);
          e++;
        }
        titleElement.valueList = zipElementList(valueList, options);
        element = titleElement;
      }
    } else if (element.listId && element.listType) {
      const listId = element.listId;
      if (listId) {
        const listType = element.listType;
        const listStyle = element.listStyle;
        const listElement = {
          type: ElementType.LIST,
          value: "",
          listId,
          listType,
          listStyle
        };
        const valueList = [];
        while (e < elementList.length) {
          const listE = elementList[e];
          if (listId !== listE.listId) {
            e--;
            break;
          }
          delete listE.listType;
          delete listE.listStyle;
          valueList.push(listE);
          e++;
        }
        listElement.valueList = zipElementList(valueList, options);
        element = listElement;
      }
    } else if (element.type === ElementType.TABLE) {
      if (element.pagingId) {
        let tableIndex = e + 1;
        let combineCount = 0;
        while (tableIndex < elementList.length) {
          const nextElement = elementList[tableIndex];
          if (nextElement.pagingId === element.pagingId) {
            element.height += nextElement.height;
            element.trList.push(...nextElement.trList);
            tableIndex++;
            combineCount++;
          } else {
            break;
          }
        }
        e += combineCount;
      }
      if (element.trList) {
        for (let t = 0; t < element.trList.length; t++) {
          const tr = element.trList[t];
          delete tr.id;
          for (let d = 0; d < tr.tdList.length; d++) {
            const td = tr.tdList[d];
            const zipTd = {
              colspan: td.colspan,
              rowspan: td.rowspan,
              value: zipElementList(td.value, options)
            };
            TABLE_TD_ZIP_ATTR.forEach((attr) => {
              const value = td[attr];
              if (value !== void 0) {
                zipTd[attr] = value;
              }
            });
            tr.tdList[d] = zipTd;
          }
        }
      }
    } else if (element.type === ElementType.HYPERLINK) {
      const hyperlinkId = element.hyperlinkId;
      if (hyperlinkId) {
        const hyperlinkElement = {
          type: ElementType.HYPERLINK,
          value: "",
          url: element.url
        };
        const valueList = [];
        while (e < elementList.length) {
          const hyperlinkE = elementList[e];
          if (hyperlinkId !== hyperlinkE.hyperlinkId) {
            e--;
            break;
          }
          delete hyperlinkE.type;
          delete hyperlinkE.url;
          valueList.push(hyperlinkE);
          e++;
        }
        hyperlinkElement.valueList = zipElementList(valueList, options);
        element = hyperlinkElement;
      }
    } else if (element.type === ElementType.DATE) {
      const dateId = element.dateId;
      if (dateId) {
        const dateElement = {
          type: ElementType.DATE,
          value: "",
          dateFormat: element.dateFormat
        };
        const valueList = [];
        while (e < elementList.length) {
          const dateE = elementList[e];
          if (dateId !== dateE.dateId) {
            e--;
            break;
          }
          delete dateE.type;
          delete dateE.dateFormat;
          valueList.push(dateE);
          e++;
        }
        dateElement.valueList = zipElementList(valueList, options);
        element = dateElement;
      }
    } else if (element.controlId) {
      const controlId = element.controlId;
      if (controlId) {
        const controlDefaultStyle = pickObject(element, CONTROL_STYLE_ATTR);
        const control = {
          ...element.control,
          ...controlDefaultStyle
        };
        const controlElement = {
          ...pickObject(element, EDITOR_ROW_ATTR),
          type: ElementType.CONTROL,
          value: "",
          control,
          controlId
        };
        const valueList = [];
        while (e < elementList.length) {
          const controlE = elementList[e];
          if (controlId !== controlE.controlId) {
            e--;
            break;
          }
          if (controlE.controlComponent === ControlComponent.VALUE) {
            delete controlE.control;
            delete controlE.controlId;
            valueList.push(controlE);
          }
          e++;
        }
        controlElement.control.value = zipElementList(valueList, options);
        element = pickElementAttr(controlElement, { extraPickAttrs });
      }
    }
    const pickElement = pickElementAttr(element, { extraPickAttrs });
    if (!element.type || element.type === ElementType.TEXT || element.type === ElementType.SUBSCRIPT || element.type === ElementType.SUPERSCRIPT) {
      while (e < elementList.length) {
        const nextElement = elementList[e + 1];
        e++;
        if (nextElement && isSameElementExceptValue(
          pickElement,
          pickElementAttr(nextElement, { extraPickAttrs })
        )) {
          const nextValue = nextElement.value === ZERO ? "\n" : nextElement.value;
          pickElement.value += nextValue;
        } else {
          break;
        }
      }
    } else {
      e++;
    }
    zipElementListData.push(pickElement);
  }
  return zipElementListData;
}
function isTextLikeElement(element) {
  return !element.type || TEXTLIKE_ELEMENT_TYPE.includes(element.type);
}
function getIsBlockElement(element) {
  return !!(element == null ? void 0 : element.type) && (BLOCK_ELEMENT_TYPE.includes(element.type) || element.imgDisplay === ImageDisplay.INLINE);
}
function pickSurroundElementList(elementList) {
  const surroundElementList = [];
  for (let e = 0; e < elementList.length; e++) {
    const element = elementList[e];
    if (element.imgDisplay === ImageDisplay.SURROUND) {
      surroundElementList.push(element);
    }
  }
  return surroundElementList;
}
function deleteSurroundElementList(elementList, pageNo) {
  var _a;
  for (let s = elementList.length - 1; s >= 0; s--) {
    const surroundElement = elementList[s];
    if (((_a = surroundElement.imgFloatPosition) == null ? void 0 : _a.pageNo) === pageNo) {
      elementList.splice(s, 1);
    }
  }
}
var VerticalAlign = /* @__PURE__ */ ((VerticalAlign2) => {
  VerticalAlign2["TOP"] = "top";
  VerticalAlign2["MIDDLE"] = "middle";
  VerticalAlign2["BOTTOM"] = "bottom";
  return VerticalAlign2;
})(VerticalAlign || {});
class Position {
  constructor(draw) {
    this.positionList = [];
    this.floatPositionList = [];
    this.cursorPosition = null;
    this.positionContext = {
      isTable: false,
      isControl: false
    };
    this.draw = draw;
    this.options = draw.getOptions();
  }
  getFloatPositionList() {
    return this.floatPositionList;
  }
  getTablePositionList(sourceElementList) {
    const { index, trIndex, tdIndex } = this.positionContext;
    return sourceElementList[index].trList[trIndex].tdList[tdIndex].positionList || [];
  }
  getPositionList() {
    return this.positionContext.isTable ? this.getTablePositionList(this.draw.getOriginalElementList()) : this.getOriginalPositionList();
  }
  getMainPositionList() {
    return this.positionContext.isTable ? this.getTablePositionList(this.draw.getOriginalMainElementList()) : this.positionList;
  }
  getOriginalPositionList() {
    return this.positionList;
  }
  getOriginalMainPositionList() {
    return this.positionList;
  }
  setPositionList(payload) {
    this.positionList = payload;
  }
  setFloatPositionList(payload) {
    this.floatPositionList = payload;
  }
  computePageRowPosition(payload) {
    const {
      positionList,
      rowList,
      pageNo,
      startX,
      startY,
      startRowIndex,
      startIndex,
      innerWidth,
      zone: zone2
    } = payload;
    const {
      scale,
      table: { tdPadding }
    } = this.options;
    let x = startX;
    let y = startY;
    let index = startIndex;
    for (let i = 0; i < rowList.length; i++) {
      const curRow = rowList[i];
      if (!curRow.isSurround) {
        const curRowWidth = curRow.width + (curRow.offsetX || 0);
        if (curRow.rowFlex === RowFlex.CENTER) {
          x += (innerWidth - curRowWidth) / 2;
        } else if (curRow.rowFlex === RowFlex.RIGHT) {
          x += innerWidth - curRowWidth;
        }
      }
      x += curRow.offsetX || 0;
      const tablePreX = x;
      const tablePreY = y;
      for (let j = 0; j < curRow.elementList.length; j++) {
        const element = curRow.elementList[j];
        const metrics = element.metrics;
        const offsetY = element.imgDisplay !== ImageDisplay.INLINE && element.type === ElementType.IMAGE || element.type === ElementType.LATEX ? curRow.ascent - metrics.height : curRow.ascent;
        if (element.left) {
          x += element.left;
        }
        const positionItem = {
          pageNo,
          index,
          value: element.value,
          rowIndex: startRowIndex + i,
          rowNo: i,
          metrics,
          left: element.left || 0,
          ascent: offsetY,
          lineHeight: curRow.height,
          isFirstLetter: j === 0,
          isLastLetter: j === curRow.elementList.length - 1,
          coordinate: {
            leftTop: [x, y],
            leftBottom: [x, y + curRow.height],
            rightTop: [x + metrics.width, y],
            rightBottom: [x + metrics.width, y + curRow.height]
          }
        };
        if (element.imgDisplay === ImageDisplay.SURROUND || element.imgDisplay === ImageDisplay.FLOAT_TOP || element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {
          const prePosition = positionList[positionList.length - 1];
          if (prePosition) {
            positionItem.metrics = prePosition.metrics;
            positionItem.coordinate = prePosition.coordinate;
          }
          if (!element.imgFloatPosition) {
            element.imgFloatPosition = {
              x,
              y,
              pageNo
            };
          }
          this.floatPositionList.push({
            pageNo,
            element,
            position: positionItem,
            isTable: payload.isTable,
            index: payload.index,
            tdIndex: payload.tdIndex,
            trIndex: payload.trIndex,
            tdValueIndex: index,
            zone: zone2
          });
        }
        positionList.push(positionItem);
        index++;
        x += metrics.width;
        if (element.type === ElementType.TABLE) {
          const tdPaddingWidth = tdPadding[1] + tdPadding[3];
          const tdPaddingHeight = tdPadding[0] + tdPadding[2];
          for (let t = 0; t < element.trList.length; t++) {
            const tr = element.trList[t];
            for (let d = 0; d < tr.tdList.length; d++) {
              const td = tr.tdList[d];
              td.positionList = [];
              const rowList2 = td.rowList;
              const drawRowResult = this.computePageRowPosition({
                positionList: td.positionList,
                rowList: rowList2,
                pageNo,
                startRowIndex: 0,
                startIndex: 0,
                startX: (td.x + tdPadding[3]) * scale + tablePreX,
                startY: (td.y + tdPadding[0]) * scale + tablePreY,
                innerWidth: (td.width - tdPaddingWidth) * scale,
                isTable: true,
                index: index - 1,
                tdIndex: d,
                trIndex: t,
                zone: zone2
              });
              if (td.verticalAlign === VerticalAlign.MIDDLE || td.verticalAlign === VerticalAlign.BOTTOM) {
                const rowsHeight = rowList2.reduce(
                  (pre, cur) => pre + cur.height,
                  0
                );
                const blankHeight = (td.height - tdPaddingHeight) * scale - rowsHeight;
                const offsetHeight = td.verticalAlign === VerticalAlign.MIDDLE ? blankHeight / 2 : blankHeight;
                if (Math.floor(offsetHeight) > 0) {
                  td.positionList.forEach((tdPosition) => {
                    const {
                      coordinate: { leftTop, leftBottom, rightBottom, rightTop }
                    } = tdPosition;
                    leftTop[1] += offsetHeight;
                    leftBottom[1] += offsetHeight;
                    rightBottom[1] += offsetHeight;
                    rightTop[1] += offsetHeight;
                  });
                }
              }
              x = drawRowResult.x;
              y = drawRowResult.y;
            }
          }
          x = tablePreX;
          y = tablePreY;
        }
      }
      x = startX;
      y += curRow.height;
    }
    return { x, y, index };
  }
  computePositionList() {
    var _a;
    this.positionList = [];
    const innerWidth = this.draw.getInnerWidth();
    const pageRowList = this.draw.getPageRowList();
    const margins = this.draw.getMargins();
    const startX = margins[3];
    const header = this.draw.getHeader();
    const extraHeight = header.getExtraHeight();
    const startY = margins[0] + extraHeight;
    let startRowIndex = 0;
    for (let i = 0; i < pageRowList.length; i++) {
      const rowList = pageRowList[i];
      const startIndex = (_a = rowList[0]) == null ? void 0 : _a.startIndex;
      this.computePageRowPosition({
        positionList: this.positionList,
        rowList,
        pageNo: i,
        startRowIndex,
        startIndex,
        startX,
        startY,
        innerWidth
      });
      startRowIndex += rowList.length;
    }
  }
  computeRowPosition(payload) {
    const { row, innerWidth } = payload;
    const positionList = [];
    this.computePageRowPosition({
      positionList,
      innerWidth,
      rowList: [deepClone(row)],
      pageNo: 0,
      startX: 0,
      startY: 0,
      startIndex: 0,
      startRowIndex: 0
    });
    return positionList;
  }
  setCursorPosition(position) {
    this.cursorPosition = position;
  }
  getCursorPosition() {
    return this.cursorPosition;
  }
  getPositionContext() {
    return this.positionContext;
  }
  setPositionContext(payload) {
    this.positionContext = payload;
  }
  getPositionByXY(payload) {
    var _a, _b, _c, _d, _e;
    const { x, y, isTable } = payload;
    let { elementList, positionList } = payload;
    if (!elementList) {
      elementList = this.draw.getOriginalElementList();
    }
    if (!positionList) {
      positionList = this.getOriginalPositionList();
    }
    const curPageNo = (_a = payload.pageNo) != null ? _a : this.draw.getPageNo();
    const positionNo = curPageNo;
    if (!isTable) {
      const floatTopPosition = this.getFloatPositionByXY({
        ...payload,
        imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND]
      });
      if (floatTopPosition)
        return floatTopPosition;
    }
    for (let j = 0; j < positionList.length; j++) {
      const {
        index,
        pageNo,
        left,
        isFirstLetter,
        coordinate: { leftTop, rightTop, leftBottom }
      } = positionList[j];
      if (positionNo !== pageNo)
        continue;
      if (pageNo > positionNo)
        break;
      if (leftTop[0] - left <= x && rightTop[0] >= x && leftTop[1] <= y && leftBottom[1] >= y) {
        let curPositionIndex2 = j;
        const element = elementList[j];
        if (element.type === ElementType.TABLE) {
          for (let t = 0; t < element.trList.length; t++) {
            const tr = element.trList[t];
            for (let d = 0; d < tr.tdList.length; d++) {
              const td = tr.tdList[d];
              const tablePosition = this.getPositionByXY({
                x,
                y,
                td,
                pageNo: curPageNo,
                tablePosition: positionList[j],
                isTable: true,
                elementList: td.value,
                positionList: td.positionList
              });
              if (~tablePosition.index) {
                const { index: tdValueIndex, hitLineStartIndex: hitLineStartIndex3 } = tablePosition;
                const tdValueElement = td.value[tdValueIndex];
                return {
                  index,
                  isCheckbox: tablePosition.isCheckbox || tdValueElement.type === ElementType.CHECKBOX || tdValueElement.controlComponent === ControlComponent.CHECKBOX,
                  isRadio: tdValueElement.type === ElementType.RADIO || tdValueElement.controlComponent === ControlComponent.RADIO,
                  isControl: !!tdValueElement.controlId,
                  isImage: tablePosition.isImage,
                  isDirectHit: tablePosition.isDirectHit,
                  isTable: true,
                  tdIndex: d,
                  trIndex: t,
                  tdValueIndex,
                  tdId: td.id,
                  trId: tr.id,
                  tableId: element.id,
                  hitLineStartIndex: hitLineStartIndex3
                };
              }
            }
          }
        }
        if (element.type === ElementType.IMAGE || element.type === ElementType.LATEX) {
          return {
            index: curPositionIndex2,
            isDirectHit: true,
            isImage: true
          };
        }
        if (element.type === ElementType.CHECKBOX || element.controlComponent === ControlComponent.CHECKBOX) {
          return {
            index: curPositionIndex2,
            isDirectHit: true,
            isCheckbox: true
          };
        }
        if (element.type === ElementType.RADIO || element.controlComponent === ControlComponent.RADIO) {
          return {
            index: curPositionIndex2,
            isDirectHit: true,
            isRadio: true
          };
        }
        let hitLineStartIndex2;
        if (elementList[index].value !== ZERO) {
          const valueWidth = rightTop[0] - leftTop[0];
          if (x < leftTop[0] + valueWidth / 2) {
            curPositionIndex2 = j - 1;
            if (isFirstLetter) {
              hitLineStartIndex2 = j;
            }
          }
        }
        return {
          isDirectHit: true,
          hitLineStartIndex: hitLineStartIndex2,
          index: curPositionIndex2,
          isControl: !!element.controlId
        };
      }
    }
    if (!isTable) {
      const floatBottomPosition = this.getFloatPositionByXY({
        ...payload,
        imgDisplays: [ImageDisplay.FLOAT_BOTTOM]
      });
      if (floatBottomPosition)
        return floatBottomPosition;
    }
    let isLastArea = false;
    let curPositionIndex = -1;
    let hitLineStartIndex;
    if (isTable) {
      const { scale } = this.options;
      const { td, tablePosition } = payload;
      if (td && tablePosition) {
        const { leftTop } = tablePosition.coordinate;
        const tdX = td.x * scale + leftTop[0];
        const tdY = td.y * scale + leftTop[1];
        const tdWidth = td.width * scale;
        const tdHeight = td.height * scale;
        if (!(tdX < x && x < tdX + tdWidth && tdY < y && y < tdY + tdHeight)) {
          return {
            index: curPositionIndex
          };
        }
      }
    }
    const lastLetterList = positionList.filter(
      (p) => p.isLastLetter && p.pageNo === positionNo
    );
    for (let j = 0; j < lastLetterList.length; j++) {
      const {
        index,
        rowNo,
        coordinate: { leftTop, leftBottom }
      } = lastLetterList[j];
      if (y > leftTop[1] && y <= leftBottom[1]) {
        const headIndex = positionList.findIndex(
          (p) => p.pageNo === positionNo && p.rowNo === rowNo
        );
        const headElement = elementList[headIndex];
        const headPosition = positionList[headIndex];
        const headStartX = headElement.listStyle === ListStyle.CHECKBOX ? this.options.margins[3] : headPosition.coordinate.leftTop[0];
        if (x < headStartX) {
          if (~headIndex) {
            if (headPosition.value === ZERO) {
              curPositionIndex = headIndex;
            } else {
              curPositionIndex = headIndex - 1;
              hitLineStartIndex = headIndex;
            }
          } else {
            curPositionIndex = index;
          }
        } else {
          if (headElement.listStyle === ListStyle.CHECKBOX && x < leftTop[0]) {
            return {
              index: headIndex,
              isDirectHit: true,
              isCheckbox: true
            };
          }
          curPositionIndex = index;
        }
        isLastArea = true;
        break;
      }
    }
    if (!isLastArea) {
      const header = this.draw.getHeader();
      const headerHeight = header.getHeight();
      const headerBottomY = header.getHeaderTop() + headerHeight;
      const footer = this.draw.getFooter();
      const pageHeight = this.draw.getHeight();
      const footerTopY = pageHeight - (footer.getFooterBottom() + footer.getHeight());
      if (y < headerBottomY) {
        return {
          index: -1,
          zone: EditorZone.HEADER
        };
      }
      if (y > footerTopY) {
        return {
          index: -1,
          zone: EditorZone.FOOTER
        };
      }
      const margins = this.draw.getMargins();
      if (y <= margins[1]) {
        for (let p = 0; p < positionList.length; p++) {
          const position = positionList[p];
          if (position.pageNo !== positionNo || position.rowNo !== 0)
            continue;
          const { leftTop, rightTop } = position.coordinate;
          if (x <= margins[3] || x >= leftTop[0] && x <= rightTop[0] || ((_b = positionList[p + 1]) == null ? void 0 : _b.rowNo) !== 0) {
            return {
              index: position.index
            };
          }
        }
      } else {
        const lastLetter = lastLetterList[lastLetterList.length - 1];
        if (lastLetter) {
          const lastRowNo = lastLetter.rowNo;
          for (let p = 0; p < positionList.length; p++) {
            const position = positionList[p];
            if (position.pageNo !== positionNo || position.rowNo !== lastRowNo) {
              continue;
            }
            const { leftTop, rightTop } = position.coordinate;
            if (x <= margins[3] || x >= leftTop[0] && x <= rightTop[0] || ((_c = positionList[p + 1]) == null ? void 0 : _c.rowNo) !== lastRowNo) {
              return {
                index: position.index
              };
            }
          }
        }
      }
      return {
        index: ((_d = lastLetterList[lastLetterList.length - 1]) == null ? void 0 : _d.index) || positionList.length - 1
      };
    }
    return {
      hitLineStartIndex,
      index: curPositionIndex,
      isControl: !!((_e = elementList[curPositionIndex]) == null ? void 0 : _e.controlId)
    };
  }
  getFloatPositionByXY(payload) {
    var _a;
    const { x, y } = payload;
    const currentPageNo = (_a = payload.pageNo) != null ? _a : this.draw.getPageNo();
    for (let f = 0; f < this.floatPositionList.length; f++) {
      const {
        position,
        element,
        isTable,
        index,
        trIndex,
        tdIndex,
        tdValueIndex,
        pageNo
      } = this.floatPositionList[f];
      if (currentPageNo === pageNo && element.type === ElementType.IMAGE && element.imgDisplay && payload.imgDisplays.includes(element.imgDisplay)) {
        const imgFloatPosition = element.imgFloatPosition;
        if (x >= imgFloatPosition.x && x <= imgFloatPosition.x + element.width && y >= imgFloatPosition.y && y <= imgFloatPosition.y + element.height) {
          if (isTable) {
            return {
              index,
              isDirectHit: true,
              isImage: true,
              isTable,
              trIndex,
              tdIndex,
              tdValueIndex,
              tdId: element.tdId,
              trId: element.trId,
              tableId: element.tableId
            };
          }
          return {
            index: position.index,
            isDirectHit: true,
            isImage: true
          };
        }
      }
    }
  }
  adjustPositionContext(payload) {
    const positionResult = this.getPositionByXY(payload);
    if (!~positionResult.index)
      return null;
    const {
      index,
      isCheckbox,
      isRadio,
      isControl,
      isImage,
      isDirectHit,
      isTable,
      trIndex,
      tdIndex,
      tdId,
      trId,
      tableId
    } = positionResult;
    this.setPositionContext({
      isTable: isTable || false,
      isCheckbox: isCheckbox || false,
      isRadio: isRadio || false,
      isControl: isControl || false,
      isImage: isImage || false,
      isDirectHit: isDirectHit || false,
      index,
      trIndex,
      tdIndex,
      tdId,
      trId,
      tableId
    });
    return positionResult;
  }
  setSurroundPosition(payload) {
    var _a;
    const {
      pageNo,
      row,
      rowElement,
      rowElementRect,
      surroundElementList,
      availableWidth
    } = payload;
    let x = rowElementRect.x;
    let rowIncreaseWidth = 0;
    if (surroundElementList.length && !getIsBlockElement(rowElement) && !((_a = rowElement.control) == null ? void 0 : _a.minWidth)) {
      for (let s = 0; s < surroundElementList.length; s++) {
        const surroundElement = surroundElementList[s];
        const floatPosition = surroundElement.imgFloatPosition;
        if (floatPosition.pageNo !== pageNo)
          continue;
        const surroundRect = {
          ...floatPosition,
          width: surroundElement.width,
          height: surroundElement.height
        };
        if (isRectIntersect(rowElementRect, surroundRect)) {
          row.isSurround = true;
          const translateX = surroundRect.width + surroundRect.x - rowElementRect.x;
          rowElement.left = translateX;
          row.width += translateX;
          rowIncreaseWidth += translateX;
          x = surroundRect.x + surroundRect.width;
          console.log("availableWidth");
          console.log(availableWidth);
          console.log(row);
          console.log(rowElement);
          if (row.width + rowElement.metrics.width > availableWidth) {
            rowElement.left = 0;
            row.width -= rowIncreaseWidth;
            break;
          }
        }
      }
    }
    return { x, rowIncreaseWidth };
  }
}
var BackgroundSize = /* @__PURE__ */ ((BackgroundSize2) => {
  BackgroundSize2["CONTAIN"] = "contain";
  BackgroundSize2["COVER"] = "cover";
  return BackgroundSize2;
})(BackgroundSize || {});
var BackgroundRepeat = /* @__PURE__ */ ((BackgroundRepeat2) => {
  BackgroundRepeat2["REPEAT"] = "repeat";
  BackgroundRepeat2["NO_REPEAT"] = "no-repeat";
  BackgroundRepeat2["REPEAT_X"] = "repeat-x";
  BackgroundRepeat2["REPEAT_Y"] = "repeat-y";
  return BackgroundRepeat2;
})(BackgroundRepeat || {});
class Background {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
  }
  _renderBackgroundColor(ctx2d, color, width, height) {
    ctx2d.save();
    ctx2d.fillStyle = color;
    ctx2d.fillRect(0, 0, width, height);
    ctx2d.restore();
  }
  _drawImage(ctx2d, width, height) {
    const { background, scale } = this.options;
    if (background.size === BackgroundSize.CONTAIN) {
      const imageWidth = width * scale;
      const imageHeight = height * scale;
      if (!background.repeat || background.repeat === BackgroundRepeat.NO_REPEAT) {
        ctx2d.drawImage(background.image, 0, 0, imageWidth, imageHeight);
      } else {
        let startX = 0;
        let startY = 0;
        const repeatXCount = background.repeat === BackgroundRepeat.REPEAT || background.repeat === BackgroundRepeat.REPEAT_X ? Math.ceil(width * scale / imageWidth) : 1;
        const repeatYCount = background.repeat === BackgroundRepeat.REPEAT || background.repeat === BackgroundRepeat.REPEAT_Y ? Math.ceil(height * scale / imageHeight) : 1;
        for (let x = 0; x < repeatXCount; x++) {
          for (let y = 0; y < repeatYCount; y++) {
            ctx2d.drawImage(background.image, startX, startY, imageWidth, imageHeight);
            startY += imageHeight;
          }
          startY = 0;
          startX += imageWidth;
        }
      }
    } else {
      ctx2d.drawImage(background.image, 0, 0, width * scale, height * scale);
    }
  }
  _renderBackgroundImage(ctx2d, width, height) {
    this._drawImage(ctx2d, width, height);
  }
  render(ctx2d, pageNo) {
    const {
      background: { image, color, applyPageNumbers }
    } = this.options;
    if (image && (!(applyPageNumbers == null ? void 0 : applyPageNumbers.length) || applyPageNumbers.includes(pageNo))) {
      const { width, height } = this.options;
      this._renderBackgroundImage(ctx2d, width, height);
    } else {
      const width = this.draw.getCanvasWidth(pageNo);
      const height = this.draw.getCanvasHeight(pageNo);
      this._renderBackgroundColor(ctx2d, color, width, height);
    }
  }
}
class AbstractRichText {
  constructor() {
    this.fillRect = this.clearFillInfo();
  }
  clearFillInfo() {
    this.fillColor = void 0;
    this.fillDecorationStyle = void 0;
    this.fillRect = {
      x: 0,
      y: 0,
      width: 0,
      height: 0
    };
    return this.fillRect;
  }
  recordFillInfo(ctx2d, x, y, width, height, color, decorationStyle) {
    const isFirstRecord = !this.fillRect.width;
    if (!isFirstRecord && (this.fillColor !== color || this.fillDecorationStyle !== decorationStyle)) {
      this.render(ctx2d);
      this.clearFillInfo();
      this.recordFillInfo(ctx2d, x, y, width, height, color, decorationStyle);
      return;
    }
    if (isFirstRecord) {
      this.fillRect.x = x;
      this.fillRect.y = y;
    }
    if (height && this.fillRect.height < height) {
      this.fillRect.height = height;
    }
    this.fillRect.width += width;
    this.fillColor = color;
    this.fillDecorationStyle = decorationStyle;
  }
}
class Highlight extends AbstractRichText {
  constructor(draw) {
    super();
    this.draw = draw;
    this.options = draw.getOptions();
  }
  render(ctx2d) {
    if (!this.fillRect.width)
      return;
    const { highlightAlpha } = this.options;
    const { x, y, width, height } = this.fillRect;
    ctx2d.save();
    this.draw.getPdf().setGState(new GState({
      opacity: highlightAlpha
    }));
    ctx2d.globalAlpha = highlightAlpha;
    ctx2d.fillStyle = this.fillColor;
    ctx2d.fillRect(x, y, width, height);
    this.draw.getPdf().setGState(new GState({
      opacity: 1
    }));
    ctx2d.restore();
    this.clearFillInfo();
  }
}
class Margin {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
  }
  render(ctx2d, pageNo) {
    const { marginIndicatorColor, pageMode } = this.options;
    const width = this.draw.getWidth();
    const height = pageMode === PageMode.CONTINUITY ? this.draw.getCanvasHeight(pageNo) : this.draw.getHeight();
    const margins = this.draw.getMargins();
    const marginIndicatorSize = this.draw.getMarginIndicatorSize();
    ctx2d.save();
    ctx2d.translate(0.5, 0.5);
    ctx2d.strokeStyle = marginIndicatorColor;
    ctx2d.beginPath();
    const leftTopPoint = [margins[3], margins[0]];
    const rightTopPoint = [width - margins[1], margins[0]];
    const leftBottomPoint = [margins[3], height - margins[2]];
    const rightBottomPoint = [
      width - margins[1],
      height - margins[2]
    ];
    ctx2d.moveTo(leftTopPoint[0] - marginIndicatorSize, leftTopPoint[1]);
    ctx2d.lineTo(...leftTopPoint);
    ctx2d.lineTo(leftTopPoint[0], leftTopPoint[1] - marginIndicatorSize);
    ctx2d.moveTo(rightTopPoint[0] + marginIndicatorSize, rightTopPoint[1]);
    ctx2d.lineTo(...rightTopPoint);
    ctx2d.lineTo(rightTopPoint[0], rightTopPoint[1] - marginIndicatorSize);
    ctx2d.moveTo(leftBottomPoint[0] - marginIndicatorSize, leftBottomPoint[1]);
    ctx2d.lineTo(...leftBottomPoint);
    ctx2d.lineTo(leftBottomPoint[0], leftBottomPoint[1] + marginIndicatorSize);
    ctx2d.moveTo(rightBottomPoint[0] + marginIndicatorSize, rightBottomPoint[1]);
    ctx2d.lineTo(...rightBottomPoint);
    ctx2d.lineTo(rightBottomPoint[0], rightBottomPoint[1] + marginIndicatorSize);
    ctx2d.stroke();
    ctx2d.restore();
  }
}
class Strikeout extends AbstractRichText {
  constructor(draw) {
    super();
    this.options = draw.getOptions();
  }
  render(ctx2d) {
    if (!this.fillRect.width)
      return;
    const { scale, strikeoutColor } = this.options;
    const { x, y, width } = this.fillRect;
    ctx2d.save();
    ctx2d.lineWidth = scale;
    ctx2d.strokeStyle = strikeoutColor;
    const adjustY = y + 0.5;
    ctx2d.beginPath();
    ctx2d.moveTo(x, adjustY);
    ctx2d.lineTo(x + width, adjustY);
    ctx2d.stroke();
    ctx2d.restore();
    this.clearFillInfo();
  }
}
var TextDecorationStyle = /* @__PURE__ */ ((TextDecorationStyle2) => {
  TextDecorationStyle2["SOLID"] = "solid";
  TextDecorationStyle2["DOUBLE"] = "double";
  TextDecorationStyle2["DASHED"] = "dashed";
  TextDecorationStyle2["DOTTED"] = "dotted";
  TextDecorationStyle2["WAVY"] = "wavy";
  return TextDecorationStyle2;
})(TextDecorationStyle || {});
var DashType = /* @__PURE__ */ ((DashType2) => {
  DashType2["SOLID"] = "solid";
  DashType2["DASHED"] = "dashed";
  DashType2["DOTTED"] = "dotted";
  return DashType2;
})(DashType || {});
class Underline extends AbstractRichText {
  constructor(draw) {
    super();
    this.options = draw.getOptions();
  }
  _drawLine(ctx2d, startX, startY, width, dashType) {
    const endX = startX + width;
    ctx2d.beginPath();
    switch (dashType) {
      case DashType.DASHED:
        break;
      case DashType.DOTTED:
        break;
    }
    ctx2d.moveTo(startX, startY);
    ctx2d.lineTo(endX, startY);
    ctx2d.stroke();
  }
  _drawDouble(ctx2d, startX, startY, width) {
    const SPACING = 3;
    const endX = startX + width;
    const endY = startY + SPACING * this.options.scale;
    ctx2d.beginPath();
    ctx2d.moveTo(startX, startY);
    ctx2d.lineTo(endX, startY);
    ctx2d.stroke();
    ctx2d.beginPath();
    ctx2d.moveTo(startX, endY);
    ctx2d.lineTo(endX, endY);
    ctx2d.stroke();
  }
  _drawWave(ctx2d, startX, startY, width) {
    const { scale } = this.options;
    const AMPLITUDE = 1.2 * scale;
    const FREQUENCY = 1 / scale;
    const adjustY = startY + 2 * AMPLITUDE;
    ctx2d.beginPath();
    for (let x = 0; x < width; x++) {
      const y = AMPLITUDE * Math.sin(FREQUENCY * x);
      ctx2d.lineTo(startX + x, adjustY + y);
    }
    ctx2d.stroke();
  }
  render(ctx2d) {
    if (!this.fillRect.width)
      return;
    const { underlineColor, scale } = this.options;
    const { x, y, width } = this.fillRect;
    ctx2d.save();
    ctx2d.strokeStyle = this.fillColor || underlineColor;
    ctx2d.lineWidth = scale;
    const adjustY = Math.floor(y + 2 * ctx2d.lineWidth) + 0.5;
    switch (this.fillDecorationStyle) {
      case TextDecorationStyle.WAVY:
        this._drawWave(ctx2d, x, adjustY, width);
        break;
      case TextDecorationStyle.DOUBLE:
        this._drawDouble(ctx2d, x, adjustY, width);
        break;
      case TextDecorationStyle.DASHED:
        this._drawLine(ctx2d, x, adjustY, width, DashType.DASHED);
        break;
      case TextDecorationStyle.DOTTED:
        this._drawLine(ctx2d, x, adjustY, width, DashType.DOTTED);
        break;
      default:
        this._drawLine(ctx2d, x, adjustY, width);
        break;
    }
    ctx2d.restore();
    this.clearFillInfo();
  }
}
class TextParticle {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
    this.ctx2d = draw.getCtx2d();
    this.curX = -1;
    this.curY = -1;
    this.text = "";
    this.bold = false;
    this.italic = false;
    this.curStyle = "";
    this.cacheMeasureText = /* @__PURE__ */ new Map();
  }
  measureBasisWord(ctx2d, font) {
    ctx2d.save();
    ctx2d.font = font;
    const textMetrics = this.measureText(ctx2d, {
      value: METRICS_BASIS_TEXT
    });
    ctx2d.restore();
    return textMetrics;
  }
  measureWord(ctx2d, elementList, curIndex) {
    const LETTER_REG = this.draw.getLetterReg();
    let width = 0;
    let endElement = elementList[curIndex];
    let i = curIndex;
    while (i < elementList.length) {
      const element = elementList[i];
      if (element.type && element.type !== ElementType.TEXT || !LETTER_REG.test(element.value)) {
        endElement = element;
        break;
      }
      width += this.measureText(ctx2d, element).width;
      i++;
    }
    return {
      width,
      endElement
    };
  }
  measurePunctuationWidth(ctx2d, element) {
    if (!element || !PUNCTUATION_LIST.includes(element.value))
      return 0;
    return this.measureText(ctx2d, element).width;
  }
  measureText(ctx2d, element) {
    const font = this.draw.getFont(element);
    const value = element.value === `
` ? "" : element.value;
    if (element.width) {
      const textMetrics2 = this.draw.measureText(font, element.value);
      return {
        width: element.width,
        actualBoundingBoxAscent: textMetrics2.actualBoundingBoxAscent,
        actualBoundingBoxDescent: textMetrics2.actualBoundingBoxDescent,
        actualBoundingBoxLeft: textMetrics2.actualBoundingBoxLeft,
        actualBoundingBoxRight: textMetrics2.actualBoundingBoxRight,
        fontBoundingBoxAscent: textMetrics2.fontBoundingBoxAscent,
        fontBoundingBoxDescent: textMetrics2.fontBoundingBoxDescent
      };
    }
    const id = `${element.value}${ctx2d.font}`;
    const cacheTextMetrics = this.cacheMeasureText.get(id);
    if (cacheTextMetrics) {
      return cacheTextMetrics;
    }
    const textMetrics = this.draw.measureText(font, value);
    this.cacheMeasureText.set(id, textMetrics);
    return textMetrics;
  }
  complete() {
    this._render();
    this.text = "";
  }
  record(ctx2d, element, x, y) {
    this.ctx2d = ctx2d;
    if (this.options.renderMode === RenderMode.COMPATIBILITY) {
      this._setCurXY(x, y);
      this.text = element.value;
      this.curStyle = element.style;
      this.curColor = element.color;
      this.bold = element.bold;
      this.italic = element.italic;
      this.complete();
      return;
    }
    if (!this.text) {
      this._setCurXY(x, y);
    }
    if (this.curStyle && element.style !== this.curStyle || element.color !== this.curColor) {
      this.complete();
      this._setCurXY(x, y);
    }
    this.text += element.value;
    this.curStyle = element.style.toLocaleLowerCase();
    this.curColor = element.color;
    this.bold = element.bold;
    this.italic = element.italic;
  }
  _setCurXY(x, y) {
    this.curX = x;
    this.curY = y;
  }
  _render() {
    if (!this.text || !~this.curX || !~this.curX)
      return;
    this.ctx2d.save();
    this.ctx2d.font = this.curStyle.toLowerCase();
    const fontWeight = this.bold ? "bold" : "normal";
    const fontItalic = this.italic ? "italic" : "";
    this.draw.getPdf().setFont(this.curStyle.split("px ")[1], fontItalic, fontWeight);
    this.draw.getPdf().setCharSpace(0.1);
    this.ctx2d.save();
    this.ctx2d.fillStyle = this.curColor || this.options.defaultColor;
    this.ctx2d.fillText(this.text, this.curX, this.curY);
    this.ctx2d.restore();
  }
}
const FORMAT_PLACEHOLDER = {
  PAGE_NO: "{pageNo}",
  PAGE_COUNT: "{pageCount}"
};
const defaultPageNumberOption = {
  bottom: 60,
  size: 12,
  font: "Microsoft YaHei",
  color: "#000000",
  rowFlex: RowFlex.CENTER,
  format: FORMAT_PLACEHOLDER.PAGE_NO,
  numberType: NumberType.ARABIC,
  disabled: false,
  startPageNo: 1,
  fromPageNo: 0,
  maxPageNo: null
};
class PageNumber {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
  }
  static formatNumberPlaceholder(text, pageNo, replaceReg, numberType) {
    const pageNoText = numberType === NumberType.CHINESE ? convertNumberToChinese(pageNo) : `${pageNo}`;
    return text.replace(replaceReg, pageNoText);
  }
  render(ctx2d, pageNo) {
    const {
      scale,
      pageMode,
      pageNumber: {
        size,
        font,
        color,
        rowFlex,
        numberType,
        format,
        startPageNo,
        fromPageNo
      }
    } = this.options;
    if (pageNo < fromPageNo)
      return;
    let text = format;
    const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO);
    if (pageNoReg.test(text)) {
      const realPageNo = pageNo + startPageNo - fromPageNo;
      const pageNoText = numberType === NumberType.CHINESE ? convertNumberToChinese(realPageNo) : `${realPageNo}`;
      text = text.replace(pageNoReg, pageNoText);
    }
    const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT);
    if (pageCountReg.test(text)) {
      const pageCount = this.draw.getPageCount() - fromPageNo;
      const pageCountText = numberType === NumberType.CHINESE ? convertNumberToChinese(pageCount) : `${pageCount}`;
      text = text.replace(pageCountReg, pageCountText);
    }
    const width = this.draw.getWidth();
    const height = pageMode === PageMode.CONTINUITY ? this.draw.getCanvasHeight(pageNo) : this.draw.getHeight();
    const pageNumberBottom = this.draw.getPageNumberBottom();
    const y = height - pageNumberBottom;
    ctx2d.save();
    ctx2d.fillStyle = color;
    let newFont = font;
    if (newFont.includes("Microsoft YaHei")) {
      newFont = newFont.replace("Microsoft YaHei", "Yahei");
    }
    ctx2d.font = `${size * scale}px ${newFont}`;
    let x = 0;
    const margins = this.draw.getMargins();
    const { width: textWidth } = this.draw.getFakeCtx().measureText(text);
    if (rowFlex === RowFlex.CENTER) {
      x = (width - textWidth) / 2;
    } else if (rowFlex === RowFlex.RIGHT) {
      x = width - textWidth - margins[1];
    } else {
      x = margins[3];
    }
    ctx2d.fillText(text, x, y);
    ctx2d.restore();
  }
}
class TableParticle {
  constructor(draw) {
    this.options = draw.getOptions();
  }
  getTrListGroupByCol(payload) {
    var _a;
    const trList = deepClone(payload);
    for (let t = 0; t < payload.length; t++) {
      const tr = trList[t];
      for (let d = tr.tdList.length - 1; d >= 0; d--) {
        const td = tr.tdList[d];
        const { rowspan, rowIndex, colIndex } = td;
        const curRowIndex = rowIndex + rowspan - 1;
        if (curRowIndex !== d) {
          const changeTd = tr.tdList.splice(d, 1)[0];
          (_a = trList[curRowIndex]) == null ? void 0 : _a.tdList.splice(colIndex, 0, changeTd);
        }
      }
    }
    return trList;
  }
  _drawOuterBorder(payload) {
    const {
      ctx2d,
      startX,
      startY,
      width,
      height,
      isDrawFullBorder,
      borderExternalWidth
    } = payload;
    const { scale } = this.options;
    const lineWidth = ctx2d.lineWidth;
    if (borderExternalWidth) {
      ctx2d.lineWidth = borderExternalWidth * scale;
    }
    ctx2d.beginPath();
    const x = Math.round(startX);
    const y = Math.round(startY);
    ctx2d.translate(0.5, 0.5);
    if (isDrawFullBorder) {
      ctx2d.rect(x, y, width, height);
    } else {
      ctx2d.moveTo(x, y + height);
      ctx2d.lineTo(x, y);
      ctx2d.lineTo(x + width, y);
    }
    ctx2d.stroke();
    if (borderExternalWidth) {
      ctx2d.lineWidth = lineWidth;
    }
    ctx2d.translate(-0.5, -0.5);
  }
  _drawSlash(ctx2d, td, startX, startY) {
    var _a, _b;
    const { scale } = this.options;
    ctx2d.save();
    const width = td.width * scale;
    const height = td.height * scale;
    const x = Math.round(td.x * scale + startX);
    const y = Math.round(td.y * scale + startY);
    if ((_a = td.slashTypes) == null ? void 0 : _a.includes(TdSlash.FORWARD)) {
      ctx2d.moveTo(x + width, y);
      ctx2d.lineTo(x, y + height);
    }
    if ((_b = td.slashTypes) == null ? void 0 : _b.includes(TdSlash.BACK)) {
      ctx2d.moveTo(x, y);
      ctx2d.lineTo(x + width, y + height);
    }
    ctx2d.stroke();
    ctx2d.restore();
  }
  _drawBorder(ctx2d, element, startX, startY) {
    var _a, _b, _c, _d, _e, _f;
    const {
      colgroup,
      trList,
      borderType,
      borderColor,
      borderWidth = 1,
      borderExternalWidth
    } = element;
    if (!colgroup || !trList)
      return;
    const {
      scale,
      table: { defaultBorderColor }
    } = this.options;
    const tableWidth = element.width * scale;
    const tableHeight = element.height * scale;
    const isEmptyBorderType = borderType === TableBorder.EMPTY;
    const isExternalBorderType = borderType === TableBorder.EXTERNAL;
    const isInternalBorderType = borderType === TableBorder.INTERNAL;
    ctx2d.save();
    if (borderType === TableBorder.DASH)
      ;
    ctx2d.lineWidth = borderWidth * scale;
    ctx2d.strokeStyle = borderColor || defaultBorderColor;
    if (!isEmptyBorderType && !isInternalBorderType) {
      this._drawOuterBorder({
        ctx2d,
        startX,
        startY,
        width: tableWidth,
        height: tableHeight,
        borderExternalWidth,
        isDrawFullBorder: isExternalBorderType
      });
    }
    for (let t = 0; t < trList.length; t++) {
      const tr = trList[t];
      for (let d = 0; d < tr.tdList.length; d++) {
        const td = tr.tdList[d];
        if ((_a = td.slashTypes) == null ? void 0 : _a.length) {
          this._drawSlash(ctx2d, td, startX, startY);
        }
        if (!((_b = td.borderTypes) == null ? void 0 : _b.length) && (isEmptyBorderType || isExternalBorderType)) {
          continue;
        }
        const width = td.width * scale;
        const height = td.height * scale;
        const x = Math.round(td.x * scale + startX + width);
        const y = Math.round(td.y * scale + startY);
        ctx2d.translate(0.5, 0.5);
        ctx2d.beginPath();
        if ((_c = td.borderTypes) == null ? void 0 : _c.includes(TdBorder.TOP)) {
          ctx2d.moveTo(x - width, y);
          ctx2d.lineTo(x, y);
          ctx2d.stroke();
        }
        if ((_d = td.borderTypes) == null ? void 0 : _d.includes(TdBorder.RIGHT)) {
          ctx2d.moveTo(x, y);
          ctx2d.lineTo(x, y + height);
          ctx2d.stroke();
        }
        if ((_e = td.borderTypes) == null ? void 0 : _e.includes(TdBorder.BOTTOM)) {
          ctx2d.moveTo(x, y + height);
          ctx2d.lineTo(x - width, y + height);
          ctx2d.stroke();
        }
        if ((_f = td.borderTypes) == null ? void 0 : _f.includes(TdBorder.LEFT)) {
          ctx2d.moveTo(x - width, y);
          ctx2d.lineTo(x - width, y + height);
          ctx2d.stroke();
        }
        if (!isEmptyBorderType && !isExternalBorderType) {
          if (!isInternalBorderType || td.colIndex + td.colspan < colgroup.length) {
            ctx2d.moveTo(x, y);
            ctx2d.lineTo(x, y + height);
            if (borderExternalWidth && borderExternalWidth !== borderWidth && td.colIndex + td.colspan === colgroup.length) {
              const lineWidth = ctx2d.lineWidth;
              ctx2d.lineWidth = borderExternalWidth * scale;
              ctx2d.stroke();
              ctx2d.beginPath();
              ctx2d.lineWidth = lineWidth;
            }
          }
          if (!isInternalBorderType || td.rowIndex + td.rowspan < trList.length) {
            const isSetExternalBottomBorder = borderExternalWidth && borderExternalWidth !== borderWidth && td.rowIndex + td.rowspan === trList.length;
            if (isSetExternalBottomBorder) {
              ctx2d.stroke();
              ctx2d.beginPath();
            }
            ctx2d.moveTo(x, y + height);
            ctx2d.lineTo(x - width, y + height);
            if (isSetExternalBottomBorder) {
              const lineWidth = ctx2d.lineWidth;
              ctx2d.lineWidth = borderExternalWidth * scale;
              ctx2d.stroke();
              ctx2d.beginPath();
              ctx2d.lineWidth = lineWidth;
            }
          }
          ctx2d.stroke();
        }
        ctx2d.translate(-0.5, -0.5);
      }
    }
    ctx2d.restore();
  }
  _drawBackgroundColor(ctx2d, element, startX, startY) {
    const { trList } = element;
    if (!trList)
      return;
    const { scale } = this.options;
    for (let t = 0; t < trList.length; t++) {
      const tr = trList[t];
      for (let d = 0; d < tr.tdList.length; d++) {
        const td = tr.tdList[d];
        if (!td.backgroundColor)
          continue;
        ctx2d.save();
        const width = td.width * scale;
        const height = td.height * scale;
        const x = Math.round(td.x * scale + startX);
        const y = Math.round(td.y * scale + startY);
        ctx2d.fillStyle = td.backgroundColor;
        ctx2d.fillRect(x, y, width, height);
        ctx2d.restore();
      }
    }
  }
  getTableWidth(element) {
    return element.colgroup.reduce((pre, cur) => pre + cur.width, 0);
  }
  getTableHeight(element) {
    const trList = element.trList;
    if (!(trList == null ? void 0 : trList.length))
      return 0;
    return this.getTdListByColIndex(trList, 0).reduce(
      (pre, cur) => pre + cur.height,
      0
    );
  }
  getRowCountByColIndex(trList, colIndex) {
    return this.getTdListByColIndex(trList, colIndex).reduce(
      (pre, cur) => pre + cur.rowspan,
      0
    );
  }
  getTdListByColIndex(trList, colIndex) {
    const data2 = [];
    for (let r = 0; r < trList.length; r++) {
      const tdList = trList[r].tdList;
      for (let d = 0; d < tdList.length; d++) {
        const td = tdList[d];
        const min = td.colIndex;
        const max = min + td.colspan - 1;
        if (colIndex >= min && colIndex <= max) {
          data2.push(td);
        }
      }
    }
    return data2;
  }
  computeRowColInfo(element) {
    const { colgroup, trList } = element;
    if (!colgroup || !trList)
      return;
    let preX = 0;
    for (let t = 0; t < trList.length; t++) {
      const tr = trList[t];
      const isLastTr = trList.length - 1 === t;
      for (let d = 0; d < tr.tdList.length; d++) {
        const td = tr.tdList[d];
        let colIndex = 0;
        if (trList.length > 1 && t !== 0) {
          const preTd = tr.tdList[d - 1];
          const start = preTd ? preTd.colIndex + preTd.colspan : d;
          for (let c = start; c < colgroup.length; c++) {
            const rowCount = this.getRowCountByColIndex(trList.slice(0, t), c);
            if (rowCount === t) {
              colIndex = c;
              let preColWidth = 0;
              for (let preC = 0; preC < c; preC++) {
                preColWidth += colgroup[preC].width;
              }
              preX = preColWidth;
              break;
            }
          }
        } else {
          const preTd = tr.tdList[d - 1];
          if (preTd) {
            colIndex = preTd.colIndex + preTd.colspan;
          }
        }
        let width = 0;
        for (let col = 0; col < td.colspan; col++) {
          width += colgroup[col + colIndex].width;
        }
        let height = 0;
        for (let row = 0; row < td.rowspan; row++) {
          const curTr = trList[row + t] || trList[t];
          height += curTr.height;
        }
        const isLastRowTd = tr.tdList.length - 1 === d;
        let isLastColTd = isLastTr;
        if (!isLastColTd) {
          if (td.rowspan > 1) {
            const nextTrLength = trList.length - 1 - t;
            isLastColTd = td.rowspan - 1 === nextTrLength;
          }
        }
        const isLastTd = isLastTr && isLastRowTd;
        td.isLastRowTd = isLastRowTd;
        td.isLastColTd = isLastColTd;
        td.isLastTd = isLastTd;
        td.x = preX;
        let preY = 0;
        for (let preR = 0; preR < t; preR++) {
          const preTdList = trList[preR].tdList;
          for (let preD = 0; preD < preTdList.length; preD++) {
            const td2 = preTdList[preD];
            if (colIndex >= td2.colIndex && colIndex < td2.colIndex + td2.colspan) {
              preY += td2.height;
              break;
            }
          }
        }
        td.y = preY;
        td.width = width;
        td.height = height;
        td.rowIndex = t;
        td.colIndex = colIndex;
        td.trIndex = t;
        td.tdIndex = d;
        preX += width;
        if (isLastRowTd && !isLastTd) {
          preX = 0;
        }
      }
    }
  }
  render(ctx2d, element, startX, startY) {
    this._drawBackgroundColor(ctx2d, element, startX, startY);
    this._drawBorder(ctx2d, element, startX, startY);
  }
}
class HyperlinkParticle {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
    const { hyperlinkPopupContainer, hyperlinkDom } = this._createHyperlinkPopupDom();
    this.hyperlinkDom = hyperlinkDom;
    this.hyperlinkPopupContainer = hyperlinkPopupContainer;
  }
  _createHyperlinkPopupDom() {
    const hyperlinkPopupContainer = document.createElement("div");
    hyperlinkPopupContainer.classList.add(`${EDITOR_PREFIX}-hyperlink-popup`);
    const hyperlinkDom = document.createElement("a");
    hyperlinkDom.target = "_blank";
    hyperlinkDom.rel = "noopener";
    hyperlinkPopupContainer.append(hyperlinkDom);
    return { hyperlinkPopupContainer, hyperlinkDom };
  }
  drawHyperlinkPopup(element, position) {
    const {
      coordinate: {
        leftTop: [left, top]
      },
      lineHeight
    } = position;
    const height = this.draw.getHeight();
    const pageGap = this.draw.getPageGap();
    const preY = this.draw.getPageNo() * (height + pageGap);
    this.hyperlinkPopupContainer.style.display = "block";
    this.hyperlinkPopupContainer.style.left = `${left}px`;
    this.hyperlinkPopupContainer.style.top = `${top + preY + lineHeight}px`;
    const url = element.url || "#";
    this.hyperlinkDom.href = url;
    this.hyperlinkDom.title = url;
    this.hyperlinkDom.innerText = url;
  }
  clearHyperlinkPopup() {
    this.hyperlinkPopupContainer.style.display = "none";
  }
  openHyperlink(element) {
    const newTab = window.open(element.url, "_blank");
    if (newTab) {
      newTab.opener = null;
    }
  }
  render(ctx2d, element, x, y) {
    ctx2d.save();
    ctx2d.font = element.style.toLowerCase();
    if (!element.color) {
      element.color = this.options.defaultHyperlinkColor;
    }
    ctx2d.fillStyle = element.color;
    if (element.underline === void 0) {
      element.underline = true;
    }
    ctx2d.fillText(element.value, x, y);
    ctx2d.restore();
  }
}
class Header {
  constructor(draw, data2) {
    this.draw = draw;
    this.position = draw.getPosition();
    this.options = draw.getOptions();
    this.elementList = data2 || [];
    this.rowList = [];
    this.positionList = [];
  }
  getRowList() {
    return this.rowList;
  }
  setElementList(elementList) {
    this.elementList = elementList;
  }
  getElementList() {
    return this.elementList;
  }
  getPositionList() {
    return this.positionList;
  }
  compute() {
    this.recovery();
    this._computeRowList();
    this._computePositionList();
  }
  recovery() {
    this.rowList = [];
    this.positionList = [];
  }
  _computeRowList() {
    const innerWidth = this.draw.getInnerWidth();
    const margins = this.draw.getMargins();
    const surroundElementList = pickSurroundElementList(this.elementList);
    this.rowList = this.draw.computeRowList({
      startX: margins[3],
      startY: this.getHeaderTop(),
      innerWidth,
      elementList: this.elementList,
      surroundElementList
    });
  }
  _computePositionList() {
    const headerTop = this.getHeaderTop();
    const innerWidth = this.draw.getInnerWidth();
    const margins = this.draw.getMargins();
    const startX = margins[3];
    const startY = headerTop;
    this.position.computePageRowPosition({
      positionList: this.positionList,
      rowList: this.rowList,
      pageNo: 0,
      startRowIndex: 0,
      startIndex: 0,
      startX,
      startY,
      innerWidth,
      zone: EditorZone.HEADER
    });
  }
  getHeaderTop() {
    const {
      header: { top, disabled },
      scale
    } = this.options;
    if (disabled)
      return 0;
    return Math.floor(top * scale);
  }
  getMaxHeight() {
    const {
      header: { maxHeightRadio }
    } = this.options;
    const height = this.draw.getHeight();
    return Math.floor(height * maxHeightRadioMapping[maxHeightRadio]);
  }
  getHeight() {
    const maxHeight = this.getMaxHeight();
    const rowHeight = this.getRowHeight();
    return rowHeight > maxHeight ? maxHeight : rowHeight;
  }
  getRowHeight() {
    return this.rowList.reduce((pre, cur) => pre + cur.height, 0);
  }
  getExtraHeight() {
    const margins = this.draw.getMargins();
    const headerHeight = this.getHeight();
    const headerTop = this.getHeaderTop();
    const extraHeight = headerTop + headerHeight - margins[0];
    return extraHeight <= 0 ? 0 : extraHeight;
  }
  render(ctx2d, pageNo) {
    ctx2d.globalAlpha = 1;
    const innerWidth = this.draw.getInnerWidth();
    const maxHeight = this.getMaxHeight();
    const rowList = [];
    let curRowHeight = 0;
    for (let r = 0; r < this.rowList.length; r++) {
      const row = this.rowList[r];
      if (curRowHeight + row.height > maxHeight) {
        break;
      }
      rowList.push(row);
      curRowHeight += row.height;
    }
    this.draw.drawRow(ctx2d, {
      elementList: this.elementList,
      positionList: this.draw.getHeader().getPositionList(),
      rowList,
      pageNo,
      startIndex: 0,
      innerWidth,
      zone: EditorZone.HEADER
    });
  }
}
class SuperscriptParticle {
  getOffsetY(element) {
    return -element.metrics.height / 2;
  }
  render(ctx2d, element, x, y) {
    ctx2d.save();
    ctx2d.font = element.style;
    if (element.color) {
      ctx2d.fillStyle = element.color;
    }
    ctx2d.fillText(element.value, x, y + this.getOffsetY(element));
    ctx2d.restore();
  }
}
class SubscriptParticle {
  getOffsetY(element) {
    return element.metrics.height / 2;
  }
  render(ctx2d, element, x, y) {
    ctx2d.save();
    ctx2d.font = element.style;
    if (element.color) {
      ctx2d.fillStyle = element.color;
    }
    ctx2d.fillText(element.value, x, y + this.getOffsetY(element));
    ctx2d.restore();
  }
}
class SeparatorParticle {
  constructor(draw) {
    this.options = draw.getOptions();
  }
  render(ctx2d, element, x, y) {
    var _a;
    ctx2d.save();
    const {
      scale,
      separator: { lineWidth, strokeStyle }
    } = this.options;
    ctx2d.lineWidth = lineWidth * scale;
    ctx2d.strokeStyle = element.color || strokeStyle;
    if ((_a = element.dashArray) == null ? void 0 : _a.length)
      ;
    const offsetY = Math.round(y);
    ctx2d.translate(0, ctx2d.lineWidth / 2);
    ctx2d.beginPath();
    ctx2d.moveTo(x, offsetY);
    ctx2d.lineTo(x + element.width * scale, offsetY);
    ctx2d.stroke();
    ctx2d.restore();
  }
}
var WatermarkType = /* @__PURE__ */ ((WatermarkType2) => {
  WatermarkType2["TEXT"] = "text";
  WatermarkType2["IMAGE"] = "image";
  return WatermarkType2;
})(WatermarkType || {});
class Watermark {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
    this.imageCache = /* @__PURE__ */ new Map();
  }
  renderText(ctx2d, pageNo) {
    const {
      watermark: { data: data2, opacity, font, size, color, repeat, gap, numberType },
      scale
    } = this.options;
    const width = this.draw.getWidth();
    const height = this.draw.getHeight();
    ctx2d.save();
    this.draw.getPdf().setGState(new GState({
      opacity
    }));
    ctx2d.globalAlpha = opacity;
    ctx2d.font = `${size * scale}px ${font}`;
    let text = data2;
    const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO);
    if (pageNoReg.test(text)) {
      text = PageNumber.formatNumberPlaceholder(
        text,
        pageNo + 1,
        pageNoReg,
        numberType
      );
    }
    const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT);
    if (pageCountReg.test(text)) {
      text = PageNumber.formatNumberPlaceholder(
        text,
        this.draw.getPageCount(),
        pageCountReg,
        numberType
      );
    }
    const measureText = this.draw.getFakeCtx().measureText(data2);
    if (repeat) {
      const dpr = this.draw.getPagePixelRatio();
      const temporaryCanvas = document.createElement("canvas");
      const temporaryCtx = temporaryCanvas.getContext("2d");
      const textWidth = measureText.width;
      const textHeight = measureText.actualBoundingBoxAscent + measureText.actualBoundingBoxDescent;
      const diagonalLength = Math.sqrt(
        Math.pow(textWidth, 2) + Math.pow(textHeight, 2)
      );
      const patternWidth = diagonalLength + 2 * gap[0] * scale;
      const patternHeight = diagonalLength + 2 * gap[1] * scale;
      temporaryCanvas.width = patternWidth;
      temporaryCanvas.height = patternHeight;
      temporaryCanvas.style.width = `${patternWidth * dpr}px`;
      temporaryCanvas.style.height = `${patternHeight * dpr}px`;
      temporaryCtx.translate(patternWidth / 2, patternHeight / 2);
      temporaryCtx.rotate(-45 * Math.PI / 180);
      temporaryCtx.translate(-patternWidth / 2, -patternHeight / 2);
      temporaryCtx.font = `${size * scale}px ${font}`;
      temporaryCtx.fillStyle = color;
      temporaryCtx.fillText(
        data2,
        (patternWidth - textWidth) / 2,
        (patternHeight - textHeight) / 2 + measureText.actualBoundingBoxAscent
      );
      ctx2d.createPattern();
      ctx2d.fillRect(0, 0, width, height);
    } else {
      const x = width / 2.8;
      const y = height;
      ctx2d.globalAlpha = opacity;
      ctx2d.font = `${size * scale}px ${font}`;
      ctx2d.fillStyle = color;
      ctx2d.translate(x, y);
      ctx2d.rotate(-45 * Math.PI / 180);
      ctx2d.fillText(
        data2,
        -measureText.width / 2,
        measureText.actualBoundingBoxAscent - size * 2
      );
    }
    this.draw.getPdf().setGState(new GState({
      opacity: 1
    }));
    ctx2d.restore();
  }
  renderImage(ctx2d) {
    const {
      watermark: { width, height, data: data2, opacity, repeat, gap },
      scale
    } = this.options;
    if (!this.imageCache.has(data2))
      ;
    const docWidth = this.draw.getWidth();
    const docHeight = this.draw.getHeight();
    const imageWidth = width * scale;
    const imageHeight = height * scale;
    ctx2d.save();
    ctx2d.globalAlpha = opacity;
    if (repeat) {
      const dpr = this.draw.getPagePixelRatio();
      const temporaryCanvas = document.createElement("canvas");
      const temporaryCtx = temporaryCanvas.getContext("2d");
      const diagonalLength = Math.sqrt(
        Math.pow(imageWidth, 2) + Math.pow(imageHeight, 2)
      );
      const patternWidth = diagonalLength + 2 * gap[0] * scale;
      const patternHeight = diagonalLength + 2 * gap[1] * scale;
      temporaryCanvas.width = patternWidth;
      temporaryCanvas.height = patternHeight;
      temporaryCanvas.style.width = `${patternWidth * dpr}px`;
      temporaryCanvas.style.height = `${patternHeight * dpr}px`;
      temporaryCtx.translate(patternWidth / 2, patternHeight / 2);
      temporaryCtx.rotate(-45 * Math.PI / 180);
      temporaryCtx.translate(-patternWidth / 2, -patternHeight / 2);
      temporaryCtx.drawImage(
        this.imageCache.get(data2),
        (patternWidth - imageWidth) / 2,
        (patternHeight - imageHeight) / 2,
        imageWidth,
        imageHeight
      );
      ctx2d.createPattern();
      ctx2d.fillRect(0, 0, docWidth, docHeight);
    } else {
      this.draw.getPdf().addImage(
        data2,
        "PNG",
        docWidth * 45 / 100,
        docHeight * 35 / 100,
        imageWidth,
        imageHeight,
        void 0,
        "FAST",
        45
      );
    }
    ctx2d.restore();
  }
  render(ctx2d, pageNo) {
    if (this.options.watermark.type === WatermarkType.IMAGE) {
      this.renderImage(ctx2d);
    } else {
      this.renderText(ctx2d, pageNo);
    }
  }
}
class CheckboxParticle {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
  }
  setSelect(element) {
    const { checkbox } = element;
    if (checkbox) {
      checkbox.value = !checkbox.value;
    } else {
      element.checkbox = {
        value: true
      };
    }
    this.draw.render({
      isCompute: false,
      isSetCursor: false
    });
  }
  render(payload) {
    const { ctx2d, x, index, row } = payload;
    let { y } = payload;
    const {
      checkbox: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign },
      scale
    } = this.options;
    const { metrics, checkbox } = row.elementList[index];
    if (verticalAlign === VerticalAlign.TOP || verticalAlign === VerticalAlign.MIDDLE) {
      let nextIndex = index + 1;
      let nextElement = null;
      while (nextIndex < row.elementList.length) {
        nextElement = row.elementList[nextIndex];
        if (nextElement.value !== ZERO && nextElement.value !== NBSP)
          break;
        nextIndex++;
      }
      if (nextElement) {
        const {
          metrics: { boundingBoxAscent, boundingBoxDescent }
        } = nextElement;
        const textHeight = boundingBoxAscent + boundingBoxDescent;
        if (textHeight > metrics.height) {
          if (verticalAlign === VerticalAlign.TOP) {
            y -= boundingBoxAscent - metrics.height;
          } else if (verticalAlign === VerticalAlign.MIDDLE) {
            y -= (textHeight - metrics.height) / 2;
          }
        }
      }
    }
    const left = Math.round(x + gap * scale);
    const top = Math.round(y - metrics.height + lineWidth);
    const width = metrics.width - gap * 2 * scale;
    const height = metrics.height;
    ctx2d.save();
    ctx2d.beginPath();
    ctx2d.translate(0.5, 0.5);
    if (checkbox == null ? void 0 : checkbox.value) {
      ctx2d.lineWidth = lineWidth;
      ctx2d.strokeStyle = fillStyle;
      ctx2d.rect(left, top, width, height);
      ctx2d.stroke();
      ctx2d.beginPath();
      ctx2d.fillStyle = fillStyle;
      ctx2d.fillRect(left, top, width, height);
      ctx2d.beginPath();
      ctx2d.strokeStyle = strokeStyle;
      ctx2d.lineWidth = lineWidth * 2 * scale;
      ctx2d.moveTo(left + 2 * scale, top + height / 2);
      ctx2d.lineTo(left + width / 2, top + height - 3 * scale);
      ctx2d.lineTo(left + width - 2 * scale, top + 3 * scale);
      ctx2d.stroke();
    } else {
      ctx2d.lineWidth = lineWidth;
      ctx2d.rect(left, top, width, height);
      ctx2d.stroke();
    }
    ctx2d.closePath();
    ctx2d.restore();
  }
}
class RadioParticle {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
  }
  setSelect(element) {
    const { radio } = element;
    if (radio) {
      radio.value = !radio.value;
    } else {
      element.radio = {
        value: true
      };
    }
    this.draw.render({
      isCompute: false,
      isSetCursor: false
    });
  }
  render(payload) {
    const { ctx2d, x, index, row } = payload;
    let { y } = payload;
    const {
      radio: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign },
      scale
    } = this.options;
    const { metrics, radio } = row.elementList[index];
    if (verticalAlign === VerticalAlign.TOP || verticalAlign === VerticalAlign.MIDDLE) {
      let nextIndex = index + 1;
      let nextElement = null;
      while (nextIndex < row.elementList.length) {
        nextElement = row.elementList[nextIndex];
        if (nextElement.value !== ZERO && nextElement.value !== NBSP)
          break;
        nextIndex++;
      }
      if (nextElement) {
        const {
          metrics: { boundingBoxAscent, boundingBoxDescent }
        } = nextElement;
        const textHeight = boundingBoxAscent + boundingBoxDescent;
        if (textHeight > metrics.height) {
          if (verticalAlign === VerticalAlign.TOP) {
            y -= boundingBoxAscent - metrics.height;
          } else if (verticalAlign === VerticalAlign.MIDDLE) {
            y -= (textHeight - metrics.height) / 2;
          }
        }
      }
    }
    const left = Math.round(x + gap * scale);
    const top = Math.round(y - metrics.height + lineWidth);
    const width = metrics.width - gap * 2 * scale;
    const height = metrics.height;
    ctx2d.save();
    ctx2d.beginPath();
    ctx2d.translate(0.5, 0.5);
    ctx2d.strokeStyle = (radio == null ? void 0 : radio.value) ? fillStyle : strokeStyle;
    ctx2d.lineWidth = lineWidth;
    ctx2d.arc(left + width / 2, top + height / 2, width / 2, 0, Math.PI * 2, true);
    ctx2d.stroke();
    if (radio == null ? void 0 : radio.value) {
      ctx2d.beginPath();
      ctx2d.fillStyle = fillStyle;
      ctx2d.arc(left + width / 2, top + height / 2, width / 3, 0, Math.PI * 2, true);
      ctx2d.fill();
    }
    ctx2d.closePath();
    ctx2d.restore();
  }
}
class DatePicker {
  constructor(draw, options = {}) {
    this.draw = draw;
    this.options = options;
    this.lang = this._getLang();
    this.now = new Date();
    this.dom = this._createDom();
    this.renderOptions = null;
    this.isDatePicker = true;
    this.pickDate = null;
    this._bindEvent();
  }
  _createDom() {
    const datePickerContainer = document.createElement("div");
    datePickerContainer.classList.add(`${EDITOR_PREFIX}-date-container`);
    datePickerContainer.setAttribute(EDITOR_COMPONENT, EditorComponent.POPUP);
    const dateWrap = document.createElement("div");
    dateWrap.classList.add(`${EDITOR_PREFIX}-date-wrap`);
    const datePickerTitle = document.createElement("div");
    datePickerTitle.classList.add(`${EDITOR_PREFIX}-date-title`);
    const preYearTitle = document.createElement("span");
    preYearTitle.classList.add(`${EDITOR_PREFIX}-date-title__pre-year`);
    preYearTitle.innerText = `<<`;
    const preMonthTitle = document.createElement("span");
    preMonthTitle.classList.add(`${EDITOR_PREFIX}-date-title__pre-month`);
    preMonthTitle.innerText = `<`;
    const nowTitle = document.createElement("span");
    nowTitle.classList.add(`${EDITOR_PREFIX}-date-title__now`);
    const nextMonthTitle = document.createElement("span");
    nextMonthTitle.classList.add(`${EDITOR_PREFIX}-date-title__next-month`);
    nextMonthTitle.innerText = `>`;
    const nextYearTitle = document.createElement("span");
    nextYearTitle.classList.add(`${EDITOR_PREFIX}-date-title__next-year`);
    nextYearTitle.innerText = `>>`;
    datePickerTitle.append(preYearTitle);
    datePickerTitle.append(preMonthTitle);
    datePickerTitle.append(nowTitle);
    datePickerTitle.append(nextMonthTitle);
    datePickerTitle.append(nextYearTitle);
    const datePickerWeek = document.createElement("div");
    datePickerWeek.classList.add(`${EDITOR_PREFIX}-date-week`);
    const {
      weeks: { sun, mon, tue, wed, thu, fri, sat }
    } = this.lang;
    const weekList = [sun, mon, tue, wed, thu, fri, sat];
    weekList.forEach((week) => {
      const weekDom = document.createElement("span");
      weekDom.innerText = `${week}`;
      datePickerWeek.append(weekDom);
    });
    const datePickerDay = document.createElement("div");
    datePickerDay.classList.add(`${EDITOR_PREFIX}-date-day`);
    dateWrap.append(datePickerTitle);
    dateWrap.append(datePickerWeek);
    dateWrap.append(datePickerDay);
    const timeWrap = document.createElement("ul");
    timeWrap.classList.add(`${EDITOR_PREFIX}-time-wrap`);
    let hourTime;
    let minuteTime;
    let secondTime;
    const timeList = [this.lang.hour, this.lang.minute, this.lang.second];
    timeList.forEach((t, i) => {
      const li = document.createElement("li");
      const timeText = document.createElement("span");
      timeText.innerText = t;
      li.append(timeText);
      const ol = document.createElement("ol");
      const isHour = i === 0;
      const isMinute = i === 1;
      const endIndex = isHour ? 24 : 60;
      for (let i2 = 0; i2 < endIndex; i2++) {
        const time = document.createElement("li");
        time.innerText = `${String(i2).padStart(2, "0")}`;
        time.setAttribute("data-id", `${i2}`);
        ol.append(time);
      }
      if (isHour) {
        hourTime = ol;
      } else if (isMinute) {
        minuteTime = ol;
      } else {
        secondTime = ol;
      }
      li.append(ol);
      timeWrap.append(li);
    });
    const datePickerMenu = document.createElement("div");
    datePickerMenu.classList.add(`${EDITOR_PREFIX}-date-menu`);
    const timeMenu = document.createElement("button");
    timeMenu.classList.add(`${EDITOR_PREFIX}-date-menu__time`);
    timeMenu.innerText = this.lang.timeSelect;
    const nowMenu = document.createElement("button");
    nowMenu.classList.add(`${EDITOR_PREFIX}-date-menu__now`);
    nowMenu.innerText = this.lang.now;
    const submitMenu = document.createElement("button");
    submitMenu.classList.add(`${EDITOR_PREFIX}-date-menu__submit`);
    submitMenu.innerText = this.lang.confirm;
    datePickerMenu.append(timeMenu);
    datePickerMenu.append(nowMenu);
    datePickerMenu.append(submitMenu);
    datePickerContainer.append(dateWrap);
    datePickerContainer.append(timeWrap);
    datePickerContainer.append(datePickerMenu);
    return {
      container: datePickerContainer,
      dateWrap,
      datePickerWeek,
      timeWrap,
      title: {
        preYear: preYearTitle,
        preMonth: preMonthTitle,
        now: nowTitle,
        nextMonth: nextMonthTitle,
        nextYear: nextYearTitle
      },
      day: datePickerDay,
      time: {
        hour: hourTime,
        minute: minuteTime,
        second: secondTime
      },
      menu: {
        time: timeMenu,
        now: nowMenu,
        submit: submitMenu
      }
    };
  }
  _bindEvent() {
    this.dom.title.preYear.onclick = () => {
      this._preYear();
    };
    this.dom.title.preMonth.onclick = () => {
      this._preMonth();
    };
    this.dom.title.nextMonth.onclick = () => {
      this._nextMonth();
    };
    this.dom.title.nextYear.onclick = () => {
      this._nextYear();
    };
    this.dom.menu.time.onclick = () => {
      this.isDatePicker = !this.isDatePicker;
      this._toggleDateTimePicker();
    };
    this.dom.menu.now.onclick = () => {
      this._now();
      this._submit();
    };
    this.dom.menu.submit.onclick = () => {
      this.dispose();
      this._submit();
    };
    this.dom.time.hour.onclick = (evt) => {
      if (!this.pickDate)
        return;
      const li = evt.target;
      const id = li.dataset.id;
      if (!id)
        return;
      this.pickDate.setHours(Number(id));
      this._setTimePick(false);
    };
    this.dom.time.minute.onclick = (evt) => {
      if (!this.pickDate)
        return;
      const li = evt.target;
      const id = li.dataset.id;
      if (!id)
        return;
      this.pickDate.setMinutes(Number(id));
      this._setTimePick(false);
    };
    this.dom.time.second.onclick = (evt) => {
      if (!this.pickDate)
        return;
      const li = evt.target;
      const id = li.dataset.id;
      if (!id)
        return;
      this.pickDate.setSeconds(Number(id));
      this._setTimePick(false);
    };
  }
  _setPosition() {
    if (!this.renderOptions)
      return;
    const {
      position: {
        coordinate: {
          leftTop: [left, top]
        },
        lineHeight,
        pageNo
      }
    } = this.renderOptions;
    const height = this.draw.getHeight();
    const pageGap = this.draw.getPageGap();
    const currentPageNo = pageNo != null ? pageNo : this.draw.getPageNo();
    const preY = currentPageNo * (height + pageGap);
    this.dom.container.style.left = `${left}px`;
    this.dom.container.style.top = `${top + preY + lineHeight}px`;
  }
  isInvalidDate(value) {
    return value.toDateString() === "Invalid Date";
  }
  _setValue() {
    var _a;
    const value = (_a = this.renderOptions) == null ? void 0 : _a.value;
    if (value) {
      const setDate = new Date(value);
      this.now = this.isInvalidDate(setDate) ? new Date() : setDate;
    } else {
      this.now = new Date();
    }
    this.pickDate = new Date(this.now);
  }
  _getLang() {
    const i18n = this.draw.getI18n();
    const t = i18n.t.bind(i18n);
    return {
      now: t("datePicker.now"),
      confirm: t("datePicker.confirm"),
      return: t("datePicker.return"),
      timeSelect: t("datePicker.timeSelect"),
      weeks: {
        sun: t("datePicker.weeks.sun"),
        mon: t("datePicker.weeks.mon"),
        tue: t("datePicker.weeks.tue"),
        wed: t("datePicker.weeks.wed"),
        thu: t("datePicker.weeks.thu"),
        fri: t("datePicker.weeks.fri"),
        sat: t("datePicker.weeks.sat")
      },
      year: t("datePicker.year"),
      month: t("datePicker.month"),
      hour: t("datePicker.hour"),
      minute: t("datePicker.minute"),
      second: t("datePicker.second")
    };
  }
  _setLangChange() {
    this.dom.menu.time.innerText = this.lang.timeSelect;
    this.dom.menu.now.innerText = this.lang.now;
    this.dom.menu.submit.innerText = this.lang.confirm;
    const {
      weeks: { sun, mon, tue, wed, thu, fri, sat }
    } = this.lang;
    const weekList = [sun, mon, tue, wed, thu, fri, sat];
    this.dom.datePickerWeek.childNodes.forEach((child, i) => {
      const childElement = child;
      childElement.innerText = weekList[i];
    });
    const hourTitle = this.dom.time.hour.previousElementSibling;
    hourTitle.innerText = this.lang.hour;
    const minuteTitle = this.dom.time.minute.previousElementSibling;
    minuteTitle.innerText = this.lang.minute;
    const secondTitle = this.dom.time.second.previousElementSibling;
    secondTitle.innerText = this.lang.second;
  }
  _update() {
    const localDate = new Date();
    const localYear = localDate.getFullYear();
    const localMonth = localDate.getMonth() + 1;
    const localDay = localDate.getDate();
    let pickYear = null;
    let pickMonth = null;
    let pickDay = null;
    if (this.pickDate) {
      pickYear = this.pickDate.getFullYear();
      pickMonth = this.pickDate.getMonth() + 1;
      pickDay = this.pickDate.getDate();
    }
    const year = this.now.getFullYear();
    const month = this.now.getMonth() + 1;
    this.dom.title.now.innerText = `${year}${this.lang.year} ${String(
      month
    ).padStart(2, "0")}${this.lang.month}`;
    const curDate = new Date(year, month, 0);
    const curDay = curDate.getDate();
    let curWeek = new Date(year, month - 1, 1).getDay();
    if (curWeek === 0) {
      curWeek = 7;
    }
    const preDay = new Date(year, month - 1, 0).getDate();
    this.dom.day.innerHTML = "";
    const preStartDay = preDay - curWeek + 1;
    for (let i = preStartDay; i <= preDay; i++) {
      const dayDom = document.createElement("div");
      dayDom.classList.add("disable");
      dayDom.innerText = `${i}`;
      dayDom.onclick = () => {
        const newMonth = month - 2;
        this.now = new Date(year, newMonth, i);
        this._setDatePick(year, newMonth, i);
      };
      this.dom.day.append(dayDom);
    }
    for (let i = 1; i <= curDay; i++) {
      const dayDom = document.createElement("div");
      if (localYear === year && localMonth === month && localDay === i) {
        dayDom.classList.add("active");
      }
      if (this.pickDate && pickYear === year && pickMonth === month && pickDay === i) {
        dayDom.classList.add("select");
      }
      dayDom.innerText = `${i}`;
      dayDom.onclick = (evt) => {
        const newMonth = month - 1;
        this.now = new Date(year, newMonth, i);
        this._setDatePick(year, newMonth, i);
        evt.stopPropagation();
      };
      this.dom.day.append(dayDom);
    }
    const nextEndDay = 6 * 7 - curWeek - curDay;
    for (let i = 1; i <= nextEndDay; i++) {
      const dayDom = document.createElement("div");
      dayDom.classList.add("disable");
      dayDom.innerText = `${i}`;
      dayDom.onclick = () => {
        this.now = new Date(year, month, i);
        this._setDatePick(year, month, i);
      };
      this.dom.day.append(dayDom);
    }
  }
  _toggleDateTimePicker() {
    if (this.isDatePicker) {
      this.dom.dateWrap.classList.add("active");
      this.dom.timeWrap.classList.remove("active");
      this.dom.menu.time.innerText = this.lang.timeSelect;
    } else {
      this.dom.dateWrap.classList.remove("active");
      this.dom.timeWrap.classList.add("active");
      this.dom.menu.time.innerText = this.lang.return;
      this._setTimePick();
    }
  }
  _setDatePick(year, month, day) {
    var _a, _b, _c;
    this.now = new Date(year, month, day);
    (_a = this.pickDate) == null ? void 0 : _a.setFullYear(year);
    (_b = this.pickDate) == null ? void 0 : _b.setMonth(month);
    (_c = this.pickDate) == null ? void 0 : _c.setDate(day);
    this._update();
  }
  _setTimePick(isIntoView = true) {
    var _a, _b, _c;
    const hour = ((_a = this.pickDate) == null ? void 0 : _a.getHours()) || 0;
    const minute = ((_b = this.pickDate) == null ? void 0 : _b.getMinutes()) || 0;
    const second = ((_c = this.pickDate) == null ? void 0 : _c.getSeconds()) || 0;
    const {
      hour: hourDom,
      minute: minuteDom,
      second: secondDom
    } = this.dom.time;
    const timeDomList = [hourDom, minuteDom, secondDom];
    timeDomList.forEach((timeDom) => {
      timeDom.querySelectorAll("li").forEach((li) => li.classList.remove("active"));
    });
    const pickList = [
      [hourDom, hour],
      [minuteDom, minute],
      [secondDom, second]
    ];
    pickList.forEach(([dom, time]) => {
      const pickDom = dom.querySelector(`[data-id='${time}']`);
      pickDom.classList.add("active");
      if (isIntoView) {
        this._scrollIntoView(dom, pickDom);
      }
    });
  }
  _scrollIntoView(container, selected) {
    if (!selected) {
      container.scrollTop = 0;
      return;
    }
    const offsetParents = [];
    let pointer = selected.offsetParent;
    while (pointer && container !== pointer && container.contains(pointer)) {
      offsetParents.push(pointer);
      pointer = pointer.offsetParent;
    }
    const top = selected.offsetTop + offsetParents.reduce((prev, curr) => prev + curr.offsetTop, 0);
    const bottom = top + selected.offsetHeight;
    const viewRectTop = container.scrollTop;
    const viewRectBottom = viewRectTop + container.clientHeight;
    if (top < viewRectTop) {
      container.scrollTop = top;
    } else if (bottom > viewRectBottom) {
      container.scrollTop = bottom - container.clientHeight;
    }
  }
  _preMonth() {
    this.now.setMonth(this.now.getMonth() - 1);
    this._update();
  }
  _nextMonth() {
    this.now.setMonth(this.now.getMonth() + 1);
    this._update();
  }
  _preYear() {
    this.now.setFullYear(this.now.getFullYear() - 1);
    this._update();
  }
  _nextYear() {
    this.now.setFullYear(this.now.getFullYear() + 1);
    this._update();
  }
  _now() {
    this.pickDate = new Date();
    this.dispose();
  }
  _toggleVisible(isVisible) {
    if (isVisible) {
      this.dom.container.classList.add("active");
    } else {
      this.dom.container.classList.remove("active");
    }
  }
  _submit() {
    var _a;
    if (this.options.onSubmit && this.pickDate) {
      const format = (_a = this.renderOptions) == null ? void 0 : _a.dateFormat;
      const pickDateString = this.formatDate(this.pickDate, format);
      this.options.onSubmit(pickDateString);
    }
  }
  formatDate(date, format = "yyyy-MM-dd hh:mm:ss") {
    let dateString = format;
    const dateOption = {
      "y+": date.getFullYear().toString(),
      "M+": (date.getMonth() + 1).toString(),
      "d+": date.getDate().toString(),
      "h+": date.getHours().toString(),
      "m+": date.getMinutes().toString(),
      "s+": date.getSeconds().toString()
    };
    for (const k in dateOption) {
      const reg = new RegExp("(" + k + ")").exec(format);
      const key = k;
      if (reg) {
        dateString = dateString.replace(
          reg[1],
          reg[1].length === 1 ? dateOption[key] : dateOption[key].padStart(reg[1].length, "0")
        );
      }
    }
    return dateString;
  }
  render(option) {
    this.renderOptions = option;
    this.lang = this._getLang();
    this._setLangChange();
    this._setValue();
    this._update();
    this._setPosition();
    this.isDatePicker = true;
    this._toggleDateTimePicker();
    this._toggleVisible(true);
  }
  dispose() {
    this._toggleVisible(false);
  }
  destroy() {
    this.dom.container.remove();
  }
}
class DateParticle {
  constructor(draw) {
    this.datePicker = new DatePicker(draw, {});
  }
  clearDatePicker() {
    this.datePicker.dispose();
  }
  renderDatePicker(element, position) {
    console.log(element, position);
  }
}
var BlockType = /* @__PURE__ */ ((BlockType2) => {
  BlockType2["IFRAME"] = "iframe";
  BlockType2["VIDEO"] = "video";
  return BlockType2;
})(BlockType || {});
const _IFrameBlock = class {
  constructor(element) {
    this.element = element;
  }
  _defineIframeProperties(iframeWindow) {
    Object.defineProperties(iframeWindow, {
      parent: {
        get: () => null
      },
      __POWERED_BY_CANVAS_EDITOR__: {
        get: () => true
      }
    });
  }
  render(blockItemContainer) {
    var _a, _b;
    const block = this.element.block;
    const iframe = document.createElement("iframe");
    iframe.setAttribute("data-id", this.element.id);
    iframe.sandbox.add(..._IFrameBlock.sandbox);
    iframe.style.border = "none";
    iframe.style.width = "100%";
    iframe.style.height = "100%";
    if ((_a = block.iframeBlock) == null ? void 0 : _a.src) {
      iframe.src = block.iframeBlock.src;
    } else if ((_b = block.iframeBlock) == null ? void 0 : _b.srcdoc) {
      iframe.srcdoc = block.iframeBlock.srcdoc;
    }
    blockItemContainer.append(iframe);
    this._defineIframeProperties(iframe.contentWindow);
  }
};
let IFrameBlock = _IFrameBlock;
IFrameBlock.sandbox = ["allow-scripts", "allow-same-origin"];
class VideoBlock {
  constructor(element) {
    this.element = element;
  }
  render(blockItemContainer) {
    var _a;
    const block = this.element.block;
    const video = document.createElement("video");
    video.style.width = "100%";
    video.style.height = "100%";
    video.style.objectFit = "contain";
    video.src = ((_a = block.videoBlock) == null ? void 0 : _a.src) || "";
    video.controls = true;
    video.crossOrigin = "anonymous";
    blockItemContainer.append(video);
  }
}
class BaseBlock {
  constructor(blockParticle, element) {
    this.draw = blockParticle.getDraw();
    this.blockContainer = blockParticle.getBlockContainer();
    this.element = element;
    this.block = null;
    this.blockItem = this._createBlockItem();
    this.blockContainer.append(this.blockItem);
  }
  getBlockElement() {
    return this.element;
  }
  _createBlockItem() {
    const blockItem = document.createElement("div");
    blockItem.classList.add(`${EDITOR_PREFIX}-block-item`);
    return blockItem;
  }
  render() {
    const block = this.element.block;
    if (block.type === BlockType.IFRAME) {
      this.block = new IFrameBlock(this.element);
      this.block.render(this.blockItem);
    } else if (block.type === BlockType.VIDEO) {
      this.block = new VideoBlock(this.element);
      this.block.render(this.blockItem);
    }
  }
  setClientRects(pageNo, x, y) {
    const height = this.draw.getHeight();
    const pageGap = this.draw.getPageGap();
    const preY = pageNo * (height + pageGap);
    const { metrics } = this.element;
    this.blockItem.style.width = `${metrics.width}px`;
    this.blockItem.style.height = `${metrics.height}px`;
    this.blockItem.style.left = `${x}px`;
    this.blockItem.style.top = `${preY + y}px`;
  }
  remove() {
    this.blockItem.remove();
  }
}
class BlockParticle {
  constructor(draw) {
    this.draw = draw;
    this.blockMap = /* @__PURE__ */ new Map();
    this.blockContainer = this._createBlockContainer();
  }
  _createBlockContainer() {
    const blockContainer = document.createElement("div");
    blockContainer.classList.add(`${EDITOR_PREFIX}-block-container`);
    return blockContainer;
  }
  getDraw() {
    return this.draw;
  }
  getBlockContainer() {
    return this.blockContainer;
  }
  render(pageNo, element, x, y) {
    const id = element.id;
    const cacheBlock = this.blockMap.get(id);
    if (cacheBlock) {
      cacheBlock.setClientRects(pageNo, x, y);
    } else {
      const newBlock = new BaseBlock(this, element);
      newBlock.render();
      newBlock.setClientRects(pageNo, x, y);
      this.blockMap.set(id, newBlock);
    }
  }
  clear() {
    if (!this.blockMap.size)
      return;
    const elementList = this.draw.getElementList();
    const blockElementIds = [];
    for (let e = 0; e < elementList.length; e++) {
      const element = elementList[e];
      if (element.type === ElementType.BLOCK) {
        blockElementIds.push(element.id);
      }
    }
    this.blockMap.forEach((block) => {
      const id = block.getBlockElement().id;
      if (!blockElementIds.includes(id)) {
        block.remove();
        this.blockMap.delete(id);
      }
    });
  }
}
const contextmenu$1 = {
  global: {
    cut: "\u526A\u5207",
    copy: "\u590D\u5236",
    paste: "\u7C98\u8D34",
    selectAll: "\u5168\u9009",
    print: "\u6253\u5370"
  },
  control: {
    "delete": "\u5220\u9664\u63A7\u4EF6"
  },
  hyperlink: {
    "delete": "\u5220\u9664\u94FE\u63A5",
    cancel: "\u53D6\u6D88\u94FE\u63A5",
    edit: "\u7F16\u8F91\u94FE\u63A5"
  },
  image: {
    change: "\u66F4\u6539\u56FE\u7247",
    saveAs: "\u53E6\u5B58\u4E3A\u56FE\u7247",
    textWrap: "\u6587\u5B57\u73AF\u7ED5",
    textWrapType: {
      embed: "\u5D4C\u5165\u578B",
      upDown: "\u4E0A\u4E0B\u578B\u73AF\u7ED5",
      surround: "\u56DB\u5468\u578B\u73AF\u7ED5",
      floatTop: "\u6D6E\u4E8E\u6587\u5B57\u4E0A\u65B9",
      floatBottom: "\u886C\u4E8E\u6587\u5B57\u4E0B\u65B9"
    }
  },
  table: {
    insertRowCol: "\u63D2\u5165\u884C\u5217",
    insertTopRow: "\u4E0A\u65B9\u63D2\u51651\u884C",
    insertBottomRow: "\u4E0B\u65B9\u63D2\u51651\u884C",
    insertLeftCol: "\u5DE6\u4FA7\u63D2\u51651\u5217",
    insertRightCol: "\u53F3\u4FA7\u63D2\u51651\u5217",
    deleteRowCol: "\u5220\u9664\u884C\u5217",
    deleteRow: "\u5220\u96641\u884C",
    deleteCol: "\u5220\u96641\u5217",
    deleteTable: "\u5220\u9664\u6574\u4E2A\u8868\u683C",
    mergeCell: "\u5408\u5E76\u5355\u5143\u683C",
    mergeCancelCell: "\u53D6\u6D88\u5408\u5E76",
    verticalAlign: "\u5782\u76F4\u5BF9\u9F50",
    verticalAlignTop: "\u9876\u7AEF\u5BF9\u9F50",
    verticalAlignMiddle: "\u5782\u76F4\u5C45\u4E2D",
    verticalAlignBottom: "\u5E95\u7AEF\u5BF9\u9F50",
    border: "\u8868\u683C\u8FB9\u6846",
    borderAll: "\u6240\u6709\u6846\u7EBF",
    borderEmpty: "\u65E0\u6846\u7EBF",
    borderExternal: "\u5916\u4FA7\u6846\u7EBF",
    borderTd: "\u5355\u5143\u683C\u8FB9\u6846",
    borderTdTop: "\u4E0A\u8FB9\u6846",
    borderTdRight: "\u53F3\u8FB9\u6846",
    borderTdBottom: "\u4E0B\u8FB9\u6846",
    borderTdLeft: "\u5DE6\u8FB9\u6846",
    borderTdForward: "\u6B63\u659C\u7EBF",
    borderTdBack: "\u53CD\u659C\u7EBF"
  }
};
const datePicker$1 = {
  now: "\u6B64\u523B",
  confirm: "\u786E\u5B9A",
  "return": "\u8FD4\u56DE\u65E5\u671F",
  timeSelect: "\u65F6\u95F4\u9009\u62E9",
  weeks: {
    sun: "\u65E5",
    mon: "\u4E00",
    tue: "\u4E8C",
    wed: "\u4E09",
    thu: "\u56DB",
    fri: "\u4E94",
    sat: "\u516D"
  },
  year: "\u5E74",
  month: "\u6708",
  hour: "\u65F6",
  minute: "\u5206",
  second: "\u79D2"
};
const frame$1 = {
  header: "\u9875\u7709",
  footer: "\u9875\u811A"
};
const pageBreak$1 = {
  displayName: "\u5206\u9875\u7B26"
};
const zone$1 = {
  headerTip: "\u53CC\u51FB\u7F16\u8F91\u9875\u7709",
  footerTip: "\u53CC\u51FB\u7F16\u8F91\u9875\u811A"
};
var zhCN = {
  contextmenu: contextmenu$1,
  datePicker: datePicker$1,
  frame: frame$1,
  pageBreak: pageBreak$1,
  zone: zone$1
};
const contextmenu = {
  global: {
    cut: "Cut",
    copy: "Copy",
    paste: "Paste",
    selectAll: "Select all",
    print: "Print"
  },
  control: {
    "delete": "Delete control"
  },
  hyperlink: {
    "delete": "Delete hyperlink",
    cancel: "Cancel hyperlink",
    edit: "Edit hyperlink"
  },
  image: {
    change: "Change image",
    saveAs: "Save as image",
    textWrap: "Text wrap",
    textWrapType: {
      embed: "Embed",
      upDown: "Up down",
      surround: "Surround",
      floatTop: "Float above text",
      floatBottom: "Float below text"
    }
  },
  table: {
    insertRowCol: "Insert row col",
    insertTopRow: "Insert top 1 row",
    insertBottomRow: "Insert bottom 1 row",
    insertLeftCol: "Insert left 1 col",
    insertRightCol: "Insert right 1 col",
    deleteRowCol: "Delete row col",
    deleteRow: "Delete 1 row",
    deleteCol: "Delete 1 col",
    deleteTable: "Delete table",
    mergeCell: "Merge cell",
    mergeCancelCell: "Cancel merge cell",
    verticalAlign: "Vertical align",
    verticalAlignTop: "Top",
    verticalAlignMiddle: "Middle",
    verticalAlignBottom: "Bottom",
    border: "Table border",
    borderAll: "All",
    borderEmpty: "Empty",
    borderExternal: "External",
    borderTd: "Table cell border",
    borderTdTop: "Top",
    borderTdRight: "Right",
    borderTdBottom: "Bottom",
    borderTdLeft: "Left",
    borderTdForward: "Forward",
    borderTdBack: "Back"
  }
};
const datePicker = {
  now: "Now",
  confirm: "Confirm",
  "return": "Return",
  timeSelect: "Time select",
  weeks: {
    sun: "Sun",
    mon: "Mon",
    tue: "Tue",
    wed: "Wed",
    thu: "Thu",
    fri: "Fri",
    sat: "Sat"
  },
  year: " ",
  month: " ",
  hour: "Hour",
  minute: "Minute",
  second: "Second"
};
const frame = {
  header: "Header",
  footer: "Footer"
};
const pageBreak = {
  displayName: "Page Break"
};
const zone = {
  headerTip: "Double click to edit header",
  footerTip: "Double click to edit footer"
};
var en = {
  contextmenu,
  datePicker,
  frame,
  pageBreak,
  zone
};
class I18n {
  constructor() {
    this.langMap = /* @__PURE__ */ new Map([
      ["zhCN", zhCN],
      ["en", en]
    ]);
    this.currentLocale = "zhCN";
  }
  registerLangMap(locale, lang) {
    const sourceLang = this.langMap.get(locale);
    this.langMap.set(locale, mergeObject(sourceLang || zhCN, lang));
  }
  getLocale() {
    return this.currentLocale;
  }
  setLocale(locale) {
    this.currentLocale = locale;
  }
  getLang() {
    return this.langMap.get(this.currentLocale) || zhCN;
  }
  t(path) {
    const keyList = path.split(".");
    let value = "";
    let item = this.getLang();
    for (let k = 0; k < keyList.length; k++) {
      const key = keyList[k];
      const currentValue = Reflect.get(item, key);
      if (currentValue) {
        value = item = currentValue;
      } else {
        return "";
      }
    }
    return value;
  }
}
class ImageObserver {
  constructor() {
    this.promiseList = [];
  }
  add(payload) {
    this.promiseList.push(payload);
  }
  clearAll() {
    this.promiseList = [];
  }
  allSettled() {
    return Promise.allSettled(this.promiseList);
  }
}
class Footer {
  constructor(draw, data2) {
    this.draw = draw;
    this.position = draw.getPosition();
    this.options = draw.getOptions();
    this.elementList = data2 || [];
    this.rowList = [];
    this.positionList = [];
  }
  getRowList() {
    return this.rowList;
  }
  setElementList(elementList) {
    this.elementList = elementList;
  }
  getElementList() {
    return this.elementList;
  }
  getPositionList() {
    return this.positionList;
  }
  compute() {
    this.recovery();
    this._computeRowList();
    this._computePositionList();
  }
  recovery() {
    this.rowList = [];
    this.positionList = [];
  }
  _computeRowList() {
    const innerWidth = this.draw.getInnerWidth();
    this.rowList = this.draw.computeRowList({
      innerWidth,
      elementList: this.elementList
    });
  }
  _computePositionList() {
    const footerBottom = this.getFooterBottom();
    const innerWidth = this.draw.getInnerWidth();
    const margins = this.draw.getMargins();
    const startX = margins[3];
    const pageHeight = this.draw.getHeight();
    const footerHeight = this.getHeight();
    const startY = pageHeight - footerBottom - footerHeight;
    this.position.computePageRowPosition({
      positionList: this.positionList,
      rowList: this.rowList,
      pageNo: 0,
      startRowIndex: 0,
      startIndex: 0,
      startX,
      startY,
      innerWidth,
      zone: EditorZone.FOOTER
    });
  }
  getFooterBottom() {
    const {
      footer: { bottom, disabled },
      scale
    } = this.options;
    if (disabled)
      return 0;
    return Math.floor(bottom * scale);
  }
  getMaxHeight() {
    const {
      footer: { maxHeightRadio }
    } = this.options;
    const height = this.draw.getHeight();
    return Math.floor(height * maxHeightRadioMapping[maxHeightRadio]);
  }
  getHeight() {
    const maxHeight = this.getMaxHeight();
    const rowHeight = this.getRowHeight();
    return rowHeight > maxHeight ? maxHeight : rowHeight;
  }
  getRowHeight() {
    return this.rowList.reduce((pre, cur) => pre + cur.height, 0);
  }
  getExtraHeight() {
    const margins = this.draw.getMargins();
    const footerHeight = this.getHeight();
    const footerBottom = this.getFooterBottom();
    const extraHeight = footerBottom + footerHeight - margins[2];
    return extraHeight <= 0 ? 0 : extraHeight;
  }
  render(ctx2d, pageNo) {
    ctx2d.globalAlpha = 1;
    const innerWidth = this.draw.getInnerWidth();
    const maxHeight = this.getMaxHeight();
    const rowList = [];
    let curRowHeight = 0;
    for (let r = 0; r < this.rowList.length; r++) {
      const row = this.rowList[r];
      if (curRowHeight + row.height > maxHeight) {
        break;
      }
      rowList.push(row);
      curRowHeight += row.height;
    }
    this.draw.drawRow(ctx2d, {
      elementList: this.elementList,
      positionList: this.positionList,
      rowList,
      pageNo,
      startIndex: 0,
      innerWidth,
      zone: EditorZone.FOOTER
    });
  }
}
var KeyMap = /* @__PURE__ */ ((KeyMap2) => {
  KeyMap2["Delete"] = "Delete";
  KeyMap2["Backspace"] = "Backspace";
  KeyMap2["Enter"] = "Enter";
  KeyMap2["Left"] = "ArrowLeft";
  KeyMap2["Right"] = "ArrowRight";
  KeyMap2["Up"] = "ArrowUp";
  KeyMap2["Down"] = "ArrowDown";
  KeyMap2["ESC"] = "Escape";
  KeyMap2["TAB"] = "Tab";
  KeyMap2["META"] = "Meta";
  KeyMap2["LEFT_BRACKET"] = "[";
  KeyMap2["RIGHT_BRACKET"] = "]";
  KeyMap2["COMMA"] = ",";
  KeyMap2["PERIOD"] = ".";
  KeyMap2["LEFT_ANGLE_BRACKET"] = "<";
  KeyMap2["RIGHT_ANGLE_BRACKET"] = ">";
  KeyMap2["EQUAL"] = "=";
  KeyMap2["MINUS"] = "-";
  KeyMap2["PLUS"] = "+";
  KeyMap2["A"] = "a";
  KeyMap2["B"] = "b";
  KeyMap2["C"] = "c";
  KeyMap2["D"] = "d";
  KeyMap2["E"] = "e";
  KeyMap2["F"] = "f";
  KeyMap2["G"] = "g";
  KeyMap2["H"] = "h";
  KeyMap2["I"] = "i";
  KeyMap2["J"] = "j";
  KeyMap2["K"] = "k";
  KeyMap2["L"] = "l";
  KeyMap2["M"] = "m";
  KeyMap2["N"] = "n";
  KeyMap2["O"] = "o";
  KeyMap2["P"] = "p";
  KeyMap2["Q"] = "q";
  KeyMap2["R"] = "r";
  KeyMap2["S"] = "s";
  KeyMap2["T"] = "t";
  KeyMap2["U"] = "u";
  KeyMap2["V"] = "v";
  KeyMap2["W"] = "w";
  KeyMap2["X"] = "x";
  KeyMap2["Y"] = "y";
  KeyMap2["Z"] = "z";
  KeyMap2["A_UPPERCASE"] = "A";
  KeyMap2["B_UPPERCASE"] = "B";
  KeyMap2["C_UPPERCASE"] = "C";
  KeyMap2["D_UPPERCASE"] = "D";
  KeyMap2["E_UPPERCASE"] = "E";
  KeyMap2["F_UPPERCASE"] = "F";
  KeyMap2["G_UPPERCASE"] = "G";
  KeyMap2["H_UPPERCASE"] = "H";
  KeyMap2["I_UPPERCASE"] = "I";
  KeyMap2["J_UPPERCASE"] = "J";
  KeyMap2["K_UPPERCASE"] = "K";
  KeyMap2["L_UPPERCASE"] = "L";
  KeyMap2["M_UPPERCASE"] = "M";
  KeyMap2["N_UPPERCASE"] = "N";
  KeyMap2["O_UPPERCASE"] = "O";
  KeyMap2["P_UPPERCASE"] = "P";
  KeyMap2["Q_UPPERCASE"] = "Q";
  KeyMap2["R_UPPERCASE"] = "R";
  KeyMap2["S_UPPERCASE"] = "S";
  KeyMap2["T_UPPERCASE"] = "T";
  KeyMap2["U_UPPERCASE"] = "U";
  KeyMap2["V_UPPERCASE"] = "V";
  KeyMap2["W_UPPERCASE"] = "W";
  KeyMap2["X_UPPERCASE"] = "X";
  KeyMap2["Y_UPPERCASE"] = "Y";
  KeyMap2["Z_UPPERCASE"] = "Z";
  KeyMap2["ZERO"] = "0";
  KeyMap2["ONE"] = "1";
  KeyMap2["TWO"] = "2";
  KeyMap2["THREE"] = "3";
  KeyMap2["FOUR"] = "4";
  KeyMap2["FIVE"] = "5";
  KeyMap2["SIX"] = "6";
  KeyMap2["SEVEN"] = "7";
  KeyMap2["EIGHT"] = "8";
  KeyMap2["NINE"] = "9";
  return KeyMap2;
})(KeyMap || {});
class ListParticle {
  constructor(draw) {
    this.UN_COUNT_STYLE_WIDTH = 20;
    this.MEASURE_BASE_TEXT = "0";
    this.LIST_GAP = 10;
    this.draw = draw;
    this.options = draw.getOptions();
  }
  computeListStyle(elementList) {
    const listStyleMap = /* @__PURE__ */ new Map();
    let start = 0;
    if (!elementList[start])
      return listStyleMap;
    let curListId = elementList[start].listId;
    let curElementList = [];
    const elementLength = elementList.length;
    while (start < elementLength) {
      const curElement = elementList[start];
      if (curListId && curListId === curElement.listId) {
        curElementList.push(curElement);
      } else {
        if (curElement.listId && curElement.listId !== curListId) {
          if (curElementList.length) {
            const width = this.getListStyleWidth(curElementList);
            listStyleMap.set(curListId, width);
          }
          curListId = curElement.listId;
          curElementList = curListId ? [curElement] : [];
        }
      }
      start++;
    }
    if (curElementList.length) {
      const width = this.getListStyleWidth(curElementList);
      listStyleMap.set(curListId, width);
    }
    return listStyleMap;
  }
  getListStyleWidth(listElementList) {
    const { scale, checkbox } = this.options;
    const startElement = listElementList[0];
    if (startElement.listStyle && startElement.listStyle !== ListStyle.DECIMAL) {
      if (startElement.listStyle === ListStyle.CHECKBOX) {
        return (checkbox.width + this.LIST_GAP) * scale;
      }
      return this.UN_COUNT_STYLE_WIDTH * scale;
    }
    const count = listElementList.reduce((pre, cur) => {
      if (cur.value === ZERO) {
        pre += 1;
      }
      return pre;
    }, 0);
    if (!count)
      return 0;
    const text = `${this.MEASURE_BASE_TEXT.repeat(String(count).length)}${KeyMap.PERIOD}`;
    const textMetrics = this.draw.getFakeCtx().measureText(text);
    return Math.ceil((textMetrics.width + this.LIST_GAP) * scale);
  }
  drawListStyle(ctx2d, row, position) {
    var _a;
    const { elementList, offsetX, listIndex, ascent } = row;
    const startElement = elementList[0];
    if (startElement.value !== ZERO || startElement.listWrap)
      return;
    let tabWidth = 0;
    const { defaultTabWidth, scale, defaultFont, defaultSize } = this.options;
    for (let i = 1; i < elementList.length; i++) {
      const element = elementList[i];
      if ((element == null ? void 0 : element.type) !== ElementType.TAB)
        break;
      tabWidth += defaultTabWidth * scale;
    }
    const {
      coordinate: {
        leftTop: [startX, startY]
      }
    } = position;
    const x = startX - offsetX + tabWidth;
    const y = startY + ascent;
    if (startElement.listStyle === ListStyle.CHECKBOX) {
      const { width, height, gap } = this.options.checkbox;
      const checkboxRowElement = {
        ...startElement,
        checkbox: {
          value: !!((_a = startElement.checkbox) == null ? void 0 : _a.value)
        },
        metrics: {
          ...startElement.metrics,
          width: (width + gap * 2) * scale,
          height: height * scale
        }
      };
      this.draw.getCheckboxParticle().render({
        ctx2d,
        x: x - gap * scale,
        y,
        index: 0,
        row: {
          ...row,
          elementList: [checkboxRowElement, ...row.elementList]
        }
      });
    } else {
      let text = "";
      if (startElement.listType === ListType.UL) {
        text = ulStyleMapping[startElement.listStyle] || ulStyleMapping[UlStyle.DISC];
      } else {
        text = `${listIndex + 1}${KeyMap.PERIOD}`;
      }
      if (!text)
        return;
      ctx2d.save();
      ctx2d.font = `${defaultSize * scale}px ${defaultFont}`;
      ctx2d.fillText(text, x, y);
      ctx2d.restore();
    }
  }
}
const _LineBreakParticle = class {
  constructor(draw) {
    this.options = draw.getOptions();
  }
  render(ctx2d, element, x, y) {
    const {
      scale,
      lineBreak: { color, lineWidth }
    } = this.options;
    ctx2d.save();
    ctx2d.beginPath();
    const top = y - _LineBreakParticle.HEIGHT * scale / 2;
    const left = x + element.metrics.width;
    ctx2d.translate(left, top);
    ctx2d.scale(scale, scale);
    ctx2d.strokeStyle = color;
    ctx2d.lineWidth = lineWidth;
    ctx2d.lineCap = "round";
    ctx2d.lineJoin = "round";
    ctx2d.beginPath();
    ctx2d.moveTo(8, 0);
    ctx2d.lineTo(12, 0);
    ctx2d.lineTo(12, 6);
    ctx2d.lineTo(3, 6);
    ctx2d.moveTo(3, 6);
    ctx2d.lineTo(6, 3);
    ctx2d.moveTo(3, 6);
    ctx2d.lineTo(6, 9);
    ctx2d.stroke();
    ctx2d.closePath();
    ctx2d.restore();
  }
};
let LineBreakParticle = _LineBreakParticle;
LineBreakParticle.WIDTH = 12;
LineBreakParticle.HEIGHT = 9;
LineBreakParticle.GAP = 3;
class Placeholder {
  constructor(draw) {
    this.draw = draw;
    this.position = draw.getPosition();
    this.options = draw.getOptions();
    this.elementList = [];
    this.rowList = [];
    this.positionList = [];
  }
  _recovery() {
    this.elementList = [];
    this.rowList = [];
    this.positionList = [];
  }
  _compute() {
    this._computeRowList();
    this._computePositionList();
  }
  _computeRowList() {
    const innerWidth = this.draw.getInnerWidth();
    this.rowList = this.draw.computeRowList({
      innerWidth,
      elementList: this.elementList
    });
  }
  _computePositionList() {
    const { lineBreak, scale } = this.options;
    const headerExtraHeight = this.draw.getHeader().getExtraHeight();
    const innerWidth = this.draw.getInnerWidth();
    const margins = this.draw.getMargins();
    let startX = margins[3];
    if (!lineBreak.disabled) {
      startX += (LineBreakParticle.WIDTH + LineBreakParticle.GAP) * scale;
    }
    const startY = margins[0] + headerExtraHeight;
    this.position.computePageRowPosition({
      positionList: this.positionList,
      rowList: this.rowList,
      pageNo: 0,
      startRowIndex: 0,
      startIndex: 0,
      startX,
      startY,
      innerWidth
    });
  }
  render(ctx2d) {
    const {
      placeholder: { data: data2, font, size, color, opacity }
    } = this.options;
    if (!data2)
      return;
    this._recovery();
    this.elementList = [
      {
        value: data2,
        font,
        size,
        color
      }
    ];
    formatElementList(this.elementList, {
      editorOptions: this.options,
      isForceCompensation: true
    });
    this._compute();
    const innerWidth = this.draw.getInnerWidth();
    ctx2d.save();
    ctx2d.globalAlpha = opacity;
    this.draw.drawRow(ctx2d, {
      elementList: this.elementList,
      positionList: this.positionList,
      rowList: this.rowList,
      pageNo: 0,
      startIndex: 0,
      innerWidth,
      isDrawLineBreak: false
    });
    ctx2d.restore();
  }
}
class Group {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
    this.fillRectMap = /* @__PURE__ */ new Map();
  }
  setGroup() {
    this.draw.render({
      isSetCursor: false,
      isCompute: false
    });
    return null;
  }
  getElementListByGroupId(elementList, groupId) {
    var _a, _b;
    const groupElementList = [];
    for (let e = 0; e < elementList.length; e++) {
      const element = elementList[e];
      if (element.type === ElementType.TABLE) {
        const trList = element.trList;
        for (let r = 0; r < trList.length; r++) {
          const tr = trList[r];
          for (let d = 0; d < tr.tdList.length; d++) {
            const td = tr.tdList[d];
            const tdGroupElementList = this.getElementListByGroupId(
              td.value,
              groupId
            );
            if (tdGroupElementList.length) {
              groupElementList.push(...tdGroupElementList);
              return groupElementList;
            }
          }
        }
      }
      if ((_a = element == null ? void 0 : element.groupIds) == null ? void 0 : _a.includes(groupId)) {
        groupElementList.push(element);
        const nextElement = elementList[e + 1];
        if (!((_b = nextElement == null ? void 0 : nextElement.groupIds) == null ? void 0 : _b.includes(groupId)))
          break;
      }
    }
    return groupElementList;
  }
  deleteGroup(groupId) {
    const elementList = this.draw.getOriginalMainElementList();
    const groupElementList = this.getElementListByGroupId(elementList, groupId);
    if (!groupElementList.length)
      return;
    for (let e = 0; e < groupElementList.length; e++) {
      const element = groupElementList[e];
      const groupIds = element.groupIds;
      const groupIndex = groupIds.findIndex((id) => id === groupId);
      groupIds.splice(groupIndex, 1);
      if (!groupIds.length) {
        delete element.groupIds;
      }
    }
    this.draw.render({
      isSetCursor: false,
      isCompute: false
    });
  }
  getContextByGroupId(elementList, groupId) {
    var _a, _b;
    for (let e = 0; e < elementList.length; e++) {
      const element = elementList[e];
      if (element.type === ElementType.TABLE) {
        const trList = element.trList;
        for (let r = 0; r < trList.length; r++) {
          const tr = trList[r];
          for (let d = 0; d < tr.tdList.length; d++) {
            const td = tr.tdList[d];
            const range = this.getContextByGroupId(td.value, groupId);
            if (range) {
              return {
                ...range,
                isTable: true,
                index: e,
                trIndex: r,
                tdIndex: d,
                tdId: td.id,
                trId: tr.id,
                tableId: element.tableId
              };
            }
          }
        }
      }
      const nextElement = elementList[e + 1];
      if (((_a = element.groupIds) == null ? void 0 : _a.includes(groupId)) && !((_b = nextElement == null ? void 0 : nextElement.groupIds) == null ? void 0 : _b.includes(groupId))) {
        return {
          isTable: false,
          startIndex: e,
          endIndex: e
        };
      }
    }
    return null;
  }
  clearFillInfo() {
    this.fillRectMap.clear();
  }
  recordFillInfo(element, x, y, width, height) {
    const groupIds = element.groupIds;
    if (!groupIds)
      return;
    for (const groupId of groupIds) {
      const fillRect = this.fillRectMap.get(groupId);
      if (!fillRect) {
        this.fillRectMap.set(groupId, {
          x,
          y,
          width,
          height
        });
      } else {
        fillRect.width += width;
      }
    }
  }
  render(ctx2d) {
    if (!this.fillRectMap.size)
      return;
    const {
      group: { backgroundColor, opacity, activeOpacity, activeBackgroundColor }
    } = this.options;
    const elementList = this.draw.getElementList();
    const elementsWithGroupIds = elementList.filter((element) => {
      return element.groupIds;
    });
    const anchorGroupIds = elementsWithGroupIds.reduce((accum, element) => {
      var _a;
      (_a = element.groupIds) == null ? void 0 : _a.forEach((groupId) => accum.push(groupId));
      return accum;
    }, []);
    ctx2d.save();
    this.draw.getPdf().setGState(new GState({
      opacity
    }));
    this.fillRectMap.forEach((fillRect, groupId) => {
      const { x, y, width, height } = fillRect;
      if (anchorGroupIds == null ? void 0 : anchorGroupIds.includes(groupId)) {
        ctx2d.globalAlpha = activeOpacity;
        ctx2d.fillStyle = activeBackgroundColor;
      } else {
        ctx2d.globalAlpha = opacity;
        ctx2d.fillStyle = backgroundColor;
      }
      ctx2d.fillRect(x, y, width, height);
    });
    this.draw.getPdf().setGState(new GState({
      opacity: 1
    }));
    ctx2d.restore();
    this.clearFillInfo();
  }
}
var LineNumberType = /* @__PURE__ */ ((LineNumberType2) => {
  LineNumberType2["PAGE"] = "page";
  LineNumberType2["CONTINUITY"] = "continuity";
  return LineNumberType2;
})(LineNumberType || {});
class LineNumber {
  constructor(draw) {
    this.draw = draw;
    this.options = draw.getOptions();
  }
  render(ctx2d, pageNo) {
    const {
      scale,
      lineNumber: { color, size, font, right, type }
    } = this.options;
    const textParticle = this.draw.getTextParticle();
    const margins = this.draw.getMargins();
    const positionList = this.draw.getPosition().getOriginalMainPositionList();
    const pageRowList = this.draw.getPageRowList();
    const rowList = pageRowList[pageNo];
    ctx2d.save();
    ctx2d.fillStyle = color;
    ctx2d.font = `${size * scale}px ${font}`;
    for (let i = 0; i < rowList.length; i++) {
      const row = rowList[i];
      const {
        coordinate: { leftBottom }
      } = positionList[row.startIndex];
      const seq = type === LineNumberType.PAGE ? i + 1 : row.rowIndex + 1;
      const textMetrics = textParticle.measureText(ctx2d, {
        value: `${seq}`
      });
      const x = margins[3] - (textMetrics.width + right) * scale;
      const y = leftBottom[1] - textMetrics.actualBoundingBoxAscent * scale;
      ctx2d.fillText(`${seq}`, x, y);
    }
    ctx2d.restore();
  }
}
class PageBorder {
  constructor(draw) {
    this.draw = draw;
    this.header = draw.getHeader();
    this.footer = draw.getFooter();
    this.options = draw.getOptions();
  }
  render(ctx2d) {
    const {
      scale,
      pageBorder: { color, lineWidth, padding }
    } = this.options;
    ctx2d.save();
    ctx2d.translate(0.5, 0.5);
    ctx2d.strokeStyle = color;
    ctx2d.lineWidth = lineWidth * scale;
    const margins = this.draw.getMargins();
    const x = margins[3] - padding[3] * scale;
    const y = margins[0] + this.header.getExtraHeight() - padding[0] * scale;
    const width = this.draw.getInnerWidth() + (padding[1] + padding[3]) * scale;
    const height = this.draw.getHeight() - y - this.footer.getExtraHeight() - margins[2] + padding[2] * scale;
    ctx2d.rect(x, y, width, height);
    ctx2d.stroke();
    ctx2d.restore();
  }
}
const defaultBackground = {
  color: "#FFFFFF",
  image: "",
  size: BackgroundSize.COVER,
  repeat: BackgroundRepeat.NO_REPEAT,
  applyPageNumbers: []
};
const defaultCheckboxOption = {
  width: 14,
  height: 14,
  gap: 5,
  lineWidth: 1,
  fillStyle: "#5175f4",
  strokeStyle: "#ffffff",
  verticalAlign: VerticalAlign.BOTTOM
};
const defaultControlOption = {
  placeholderColor: "#9c9b9b",
  bracketColor: "#000000",
  prefix: "{",
  postfix: "}",
  borderWidth: 1,
  borderColor: "#000000",
  activeBackgroundColor: ""
};
const defaultCursorOption = {
  width: 1,
  color: "#000000",
  dragWidth: 2,
  dragColor: "#0000FF"
};
const defaultFooterOption = {
  bottom: 30,
  maxHeightRadio: MaxHeightRatio.HALF,
  disabled: false
};
const defaultGroupOption = {
  opacity: 0.1,
  backgroundColor: "#E99D00",
  activeOpacity: 0.5,
  activeBackgroundColor: "#E99D00",
  disabled: false
};
const defaultHeaderOption = {
  top: 30,
  maxHeightRadio: MaxHeightRatio.HALF,
  disabled: false
};
const defaultLineBreak = {
  disabled: true,
  color: "#CCCCCC",
  lineWidth: 1.5
};
const defaultPageBreakOption = {
  font: "Microsoft YaHei",
  fontSize: 12,
  lineDash: [3, 1]
};
const defaultPlaceholderOption = {
  data: "",
  color: "#DCDFE6",
  opacity: 1,
  size: 16,
  font: "Microsoft YaHei"
};
const defaultRadioOption = {
  width: 14,
  height: 14,
  gap: 5,
  lineWidth: 1,
  fillStyle: "#5175f4",
  strokeStyle: "#000000",
  verticalAlign: VerticalAlign.BOTTOM
};
const defaultSeparatorOption = {
  lineWidth: 1,
  strokeStyle: "#000000"
};
const defaultTableOption = {
  tdPadding: [0, 5, 5, 5],
  defaultTrMinHeight: 42,
  defaultColMinWidth: 40,
  defaultBorderColor: "#000000"
};
const defaultWatermarkOption = {
  data: "",
  type: WatermarkType.TEXT,
  width: 0,
  height: 0,
  color: "#AEB5C0",
  opacity: 0.3,
  size: 200,
  font: "Microsoft YaHei",
  repeat: false,
  gap: [10, 10],
  numberType: NumberType.ARABIC
};
const defaultZoneOption = {
  tipDisabled: true
};
const defaultLineNumberOption = {
  size: 12,
  font: "Microsoft YaHei",
  color: "#000000",
  disabled: true,
  right: 20,
  type: LineNumberType.CONTINUITY
};
const defaultPageBorderOption = {
  color: "#000000",
  lineWidth: 1,
  padding: [0, 5, 0, 5],
  disabled: true
};
const defaultBadgeOption = {
  top: 0,
  left: 5
};
function mergeOption(options = {}) {
  var _a, _b, _c;
  const tableOptions = {
    ...defaultTableOption,
    ...options.table
  };
  const headerOptions = {
    ...defaultHeaderOption,
    ...options.header
  };
  const footerOptions = {
    ...defaultFooterOption,
    ...options.footer
  };
  const pageNumberOptions = {
    ...defaultPageNumberOption,
    ...options.pageNumber
  };
  const waterMarkOptions = {
    ...defaultWatermarkOption,
    ...options.watermark
  };
  const controlOptions = {
    ...defaultControlOption,
    ...options.control
  };
  const checkboxOptions = {
    ...defaultCheckboxOption,
    ...options.checkbox
  };
  const radioOptions = {
    ...defaultRadioOption,
    ...options.radio
  };
  const cursorOptions = {
    ...defaultCursorOption,
    ...options.cursor
  };
  const titleOptions = {
    ...defaultTitleOption,
    ...options.title
  };
  const placeholderOptions = {
    ...defaultPlaceholderOption,
    ...options.placeholder
  };
  const groupOptions = {
    ...defaultGroupOption,
    ...options.group
  };
  const pageBreakOptions = {
    ...defaultPageBreakOption,
    ...options.pageBreak
  };
  const zoneOptions = {
    ...defaultZoneOption,
    ...options.zone
  };
  const backgroundOptions = {
    ...defaultBackground,
    ...options.background
  };
  const lineBreakOptions = {
    ...defaultLineBreak,
    ...options.lineBreak
  };
  const separatorOptions = {
    ...defaultSeparatorOption,
    ...options.separator
  };
  const lineNumberOptions = {
    ...defaultLineNumberOption,
    ...options.lineNumber
  };
  const pageBorderOptions = {
    ...defaultPageBorderOption,
    ...options.pageBorder
  };
  const badgeOptions = {
    ...defaultBadgeOption,
    ...options.badge
  };
  const modeRuleOption = {
    print: {
      ...defaultModeRuleOption.print,
      ...(_a = options.modeRule) == null ? void 0 : _a.print
    },
    readonly: {
      ...defaultModeRuleOption.readonly,
      ...(_b = options.modeRule) == null ? void 0 : _b.readonly
    },
    form: {
      ...defaultModeRuleOption.form,
      ...(_c = options.modeRule) == null ? void 0 : _c.form
    }
  };
  return {
    mode: EditorMode.EDIT,
    locale: "zhCN",
    defaultType: "TEXT",
    defaultColor: "#000000",
    defaultFont: "Microsoft YaHei",
    defaultSize: 16,
    minSize: 5,
    maxSize: 72,
    defaultRowMargin: 1,
    defaultBasicRowMarginHeight: 8,
    defaultTabWidth: 32,
    width: 794,
    height: 1123,
    scale: 1,
    pageGap: 20,
    underlineColor: "#000000",
    strikeoutColor: "#FF0000",
    rangeAlpha: 0.6,
    rangeColor: "#AECBFA",
    rangeMinWidth: 5,
    searchMatchAlpha: 0.6,
    searchMatchColor: "#FFFF00",
    searchNavigateMatchColor: "#AAD280",
    highlightAlpha: 0.6,
    highlightMarginHeight: 8,
    resizerColor: "#4182D9",
    resizerSize: 5,
    marginIndicatorSize: 35,
    marginIndicatorColor: "#BABABA",
    margins: [100, 120, 100, 120],
    pageMode: PageMode.PAGING,
    renderMode: RenderMode.SPEED,
    defaultHyperlinkColor: "#0000FF",
    paperDirection: PaperDirection.VERTICAL,
    inactiveAlpha: 0.6,
    historyMaxRecordCount: 100,
    wordBreak: WordBreak.BREAK_WORD,
    printPixelRatio: 3,
    maskMargin: [0, 0, 0, 0],
    letterClass: [LETTER_CLASS.ENGLISH],
    contextMenuDisableKeys: [],
    shortcutDisableKeys: [],
    scrollContainerSelector: "",
    pageOuterSelectionDisable: false,
    ...options,
    table: tableOptions,
    header: headerOptions,
    footer: footerOptions,
    pageNumber: pageNumberOptions,
    watermark: waterMarkOptions,
    control: controlOptions,
    checkbox: checkboxOptions,
    radio: radioOptions,
    cursor: cursorOptions,
    title: titleOptions,
    placeholder: placeholderOptions,
    group: groupOptions,
    pageBreak: pageBreakOptions,
    zone: zoneOptions,
    background: backgroundOptions,
    lineBreak: lineBreakOptions,
    separator: separatorOptions,
    lineNumber: lineNumberOptions,
    pageBorder: pageBorderOptions,
    badge: badgeOptions,
    modeRule: modeRuleOption
  };
}
class DrawPdf {
  constructor(options, data2, pdfOptions = {}) {
    this.fakeCanvas = document.createElement("canvas");
    this.fakeCtx = this.fakeCanvas.getContext("2d");
    this.pageList = [];
    this.ctxList = [];
    this.ctxListInfos = [];
    this.pageNo = 0;
    this.pagePixelRatio = null;
    this.mode = options.mode;
    this.options = mergeOption(options);
    let headerElementList = [];
    let mainElementList = [];
    let footerElementList = [];
    data2 = deepClone(data2);
    if (Array.isArray(data2)) {
      mainElementList = data2;
    } else {
      headerElementList = data2.header || [];
      mainElementList = data2.main;
      footerElementList = data2.footer || [];
    }
    const pageComponentData = [
      headerElementList,
      mainElementList,
      footerElementList
    ];
    pageComponentData.forEach((elementList) => {
      formatElementList(elementList, {
        editorOptions: this.getOptions(),
        isForceCompensation: true
      });
    });
    pageComponentData.forEach((datas) => {
      if (datas) {
        datas = this.filterAssistElement(
          datas
        );
      }
    });
    this.elementList = data2.main;
    this._formatContainer();
    this.pdf = new jsPDF({
      orientation: "p",
      unit: "px",
      format: [this.getWidth(), this.getHeight()],
      hotfixes: ["px_scaling"],
      compress: true
    });
    this.pdf.setDocumentProperties({
      author: "canvas-editor"
    });
    if (pdfOptions.loadDefaultFonts) {
      this.defaultFontsLoadedPromise = this._addDefaultFont();
    } else {
      this.defaultFontsLoadedPromise = Promise.resolve(false);
    }
    this._createPage(0);
    this.i18n = new I18n();
    this.position = new Position(this);
    this.margin = new Margin(this);
    this.background = new Background(this);
    this.group = new Group(this);
    this.underline = new Underline(this);
    this.strikeout = new Strikeout(this);
    this.highlight = new Highlight(this);
    this.imageParticle = new ImageParticle(this);
    this.laTexParticle = new LaTexParticle(this);
    this.textParticle = new TextParticle(this);
    this.tableParticle = new TableParticle(this);
    this.pageNumber = new PageNumber(this);
    this.lineNumber = new LineNumber(this);
    this.waterMark = new Watermark(this);
    this.placeholder = new Placeholder(this);
    this.header = new Header(this, data2.header);
    this.footer = new Footer(this, data2.footer);
    this.hyperlinkParticle = new HyperlinkParticle(this);
    this.dateParticle = new DateParticle(this);
    this.separatorParticle = new SeparatorParticle(this);
    this.superscriptParticle = new SuperscriptParticle();
    this.subscriptParticle = new SubscriptParticle();
    this.checkboxParticle = new CheckboxParticle(this);
    this.radioParticle = new RadioParticle(this);
    this.blockParticle = new BlockParticle(this);
    this.listParticle = new ListParticle(this);
    this.lineBreakParticle = new LineBreakParticle(this);
    this.pageBorder = new PageBorder(this);
    this.imageObserver = new ImageObserver();
    const { letterClass } = options;
    this.LETTER_REG = new RegExp(`[${letterClass.join("")}]`);
    this.WORD_LIKE_REG = new RegExp(
      `${letterClass.map((letter) => `[^${letter}][${letter}]`).join("|")}`
    );
    this.rowList = [];
    this.pageRowList = [];
    this.printModeData = null;
  }
  getCtx2d() {
    return this.pdf.context2d;
  }
  getFakeCtx() {
    return this.fakeCtx;
  }
  measureText(font, text) {
    this.fakeCtx.save();
    this.fakeCtx.font = font;
    const textMetrics = this.fakeCtx.measureText(text);
    this.fakeCtx.restore();
    return textMetrics;
  }
  async downloadFont(url, fileName, id, type) {
    const response = await fetch(url);
    const blob = await response.blob();
    return new Promise((onSuccess, onError) => {
      try {
        const $this = this;
        const reader = new FileReader();
        reader.onload = function() {
          const base64 = this.result;
          $this.pdf.addFileToVFS(fileName, base64.split("base64,")[1]);
          $this.pdf.addFont(fileName, id, type);
          onSuccess(this.result);
        };
        reader.readAsDataURL(blob);
      } catch (e) {
        onError(e);
      }
    });
  }
  async _addDefaultFont() {
    await Promise.all([
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/msyh.ttf",
        "msyh.ttf",
        "microsoft yahei",
        "normal"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/msyh-bold.ttf",
        "msyh.ttf",
        "microsoft yahei",
        "bold"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Arial.ttf",
        "Arial.ttf",
        "arial",
        "normal"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Arial_Bold.ttf",
        "Arial_Bold.ttf",
        "arial",
        "bold"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Arial_Italic.ttf",
        "Arial_Italic.ttf",
        "arial",
        "italic"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Arial_Bold_Italic.ttf",
        "Arial_Bold_Italic.ttf",
        "arial",
        "bolditalic"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/calibri-regular.ttf",
        "calibri-regular.ttf",
        "calibri",
        "normal"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/calibri-bold.ttf",
        "calibri-bold.ttf",
        "calibri",
        "bold"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/calibri-italic.ttf",
        "calibri-italic.ttf",
        "calibri",
        "italic"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/calibri-bold-italic.ttf",
        "calibri-bold-italic.ttf",
        "calibri",
        "bolditalic"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Cambria.ttf",
        "Cambria.ttf",
        "cambria",
        "normal"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/cambriab.ttf",
        "cambriab.ttf",
        "cambria",
        "bold"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/cambriai.ttf",
        "cambriai.ttf",
        "cambria",
        "italic"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/cambriaz.ttf",
        "cambriaz.ttf",
        "cambria",
        "bolditalic"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Verdana.ttf",
        "Verdana.ttf",
        "verdana",
        "normal"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Verdana_Bold.ttf",
        "Verdana_Bold.ttf",
        "verdana",
        "bold"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Verdana_Italic.ttf",
        "Verdana_Italic.ttf",
        "verdana",
        "italic"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Verdana_Bold_Italic.ttf",
        "Verdana_Bold_Italic.ttf",
        "verdana",
        "bolditalic"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/Inkfree.ttf",
        "Inkfree.ttf",
        "ink free",
        "normal"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/segoe-ui.ttf",
        "segoe-ui.ttf",
        "segoe ui",
        "normal"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/segoe-ui-bold.ttf",
        "segoe-ui-bold.ttf",
        "segoe ui",
        "bold"
      ),
      this.downloadFont(
        "https://cdn.jsdelivr.net/npm/canvas-editor-pdf@0.2.7/dist/font/segoeuii.ttf",
        "segoeuii.ttf",
        "segoe ui",
        "italic"
      )
    ]);
    return true;
  }
  loadDefaultFonts() {
    return this.defaultFontsLoadedPromise = this._addDefaultFont();
  }
  async addFont(url, fileName, id, type) {
    await this.downloadFont(url, fileName, id, type);
    return true;
  }
  getFont(el) {
    const { defaultSize, defaultFont } = this.options;
    const font = el.font || defaultFont;
    const size = el.actualSize || el.size || defaultSize;
    return `${el.italic ? "italic " : ""}${el.bold ? "bold " : ""}${size}px ${font}`;
  }
  getLetterReg() {
    return this.LETTER_REG;
  }
  getMode() {
    return this.mode;
  }
  filterAssistElement(elementList) {
    return elementList.filter((element) => {
      if (element.type === ElementType.TABLE) {
        const trList = element.trList;
        for (let r = 0; r < trList.length; r++) {
          const tr = trList[r];
          for (let d = 0; d < tr.tdList.length; d++) {
            const td = tr.tdList[d];
            td.value = this.filterAssistElement(td.value);
          }
        }
      }
      if (!element.controlId)
        return true;
      if (element.controlComponent === ControlComponent.PREFIX || element.controlComponent === ControlComponent.POSTFIX || element.controlComponent === ControlComponent.PLACEHOLDER) {
        element.value = "";
        return true;
      }
      return true;
    });
  }
  setMode(payload) {
    if (payload === EditorMode.PRINT) {
      this.printModeData = {
        header: this.header.getElementList(),
        main: this.elementList,
        footer: this.footer.getElementList()
      };
      const clonePrintModeData = deepClone(this.printModeData);
      const editorDataKeys = ["header", "main", "footer"];
      editorDataKeys.forEach((key) => {
        clonePrintModeData[key] = this.filterAssistElement(
          clonePrintModeData[key]
        );
      });
    }
    this.clearSideEffect();
    this.mode = payload;
    this.options.mode = payload;
  }
  getOriginalWidth() {
    const { paperDirection, width, height } = this.options;
    return paperDirection === PaperDirection.VERTICAL ? width : height;
  }
  getOriginalHeight() {
    const { paperDirection, width, height } = this.options;
    return paperDirection === PaperDirection.VERTICAL ? height : width;
  }
  getWidth() {
    return Math.floor(this.getOriginalWidth() * this.options.scale);
  }
  getHeight() {
    return Math.floor(this.getOriginalHeight() * this.options.scale);
  }
  getMainHeight() {
    const pageHeight = this.getHeight();
    return pageHeight - this.getMainOuterHeight();
  }
  getMainOuterHeight() {
    const margins = this.getMargins();
    const headerExtraHeight = this.header.getExtraHeight();
    const footerExtraHeight = this.footer.getExtraHeight();
    return margins[0] + margins[2] + headerExtraHeight + footerExtraHeight;
  }
  getCanvasWidth(pageNo = -1) {
    const page = this.ctxListInfos[pageNo];
    return page.width;
  }
  getCanvasHeight(pageNo = -1) {
    const page = this.ctxListInfos[pageNo];
    return page.height;
  }
  getInnerWidth() {
    const width = this.getWidth();
    const margins = this.getMargins();
    return width - margins[1] - margins[3];
  }
  getOriginalInnerWidth() {
    const width = this.getOriginalWidth();
    const margins = this.getOriginalMargins();
    return width - margins[1] - margins[3];
  }
  getContextInnerWidth() {
    const positionContext = this.position.getPositionContext();
    if (positionContext.isTable) {
      const { index, trIndex, tdIndex } = positionContext;
      const elementList = this.getOriginalElementList();
      const td = elementList[index].trList[trIndex].tdList[tdIndex];
      const tdPadding = this.getTdPadding();
      return td.width - tdPadding[1] - tdPadding[3];
    }
    return this.getOriginalInnerWidth();
  }
  getMargins() {
    return this.getOriginalMargins().map((m) => m * this.options.scale);
  }
  getOriginalMargins() {
    const { margins, paperDirection } = this.options;
    return paperDirection === PaperDirection.VERTICAL ? margins : [margins[1], margins[2], margins[3], margins[0]];
  }
  getPageGap() {
    return this.options.pageGap * this.options.scale;
  }
  getOriginalPageGap() {
    return this.options.pageGap;
  }
  getPageNumberBottom() {
    const {
      pageNumber: { bottom },
      scale
    } = this.options;
    return bottom * scale;
  }
  getMarginIndicatorSize() {
    return this.options.marginIndicatorSize * this.options.scale;
  }
  getDefaultBasicRowMarginHeight() {
    return this.options.defaultBasicRowMarginHeight * this.options.scale;
  }
  getTdPadding() {
    const {
      table: { tdPadding },
      scale
    } = this.options;
    return tdPadding.map((m) => m * scale);
  }
  getPageNo() {
    return this.pageNo;
  }
  setPageNo(payload) {
    this.pageNo = payload;
  }
  getPage(pageNo = -1) {
    return this.pageList[~pageNo ? pageNo : this.pageNo];
  }
  getPageList() {
    return this.pageList;
  }
  getPageCount() {
    return this.pageList.length;
  }
  getTableRowList(sourceElementList) {
    const positionContext = this.position.getPositionContext();
    const { index, trIndex, tdIndex } = positionContext;
    return sourceElementList[index].trList[trIndex].tdList[tdIndex].rowList;
  }
  getOriginalRowList() {
    return this.rowList;
  }
  getRowList() {
    const positionContext = this.position.getPositionContext();
    return positionContext.isTable ? this.getTableRowList(this.getOriginalElementList()) : this.getOriginalRowList();
  }
  getPageRowList() {
    return this.pageRowList;
  }
  getPdf() {
    return this.pdf;
  }
  getCtx() {
    return this.ctxList[this.pageNo];
  }
  getOptions() {
    return this.options;
  }
  getGroup() {
    return this.group;
  }
  getPosition() {
    return this.position;
  }
  getLineBreakParticle() {
    return this.lineBreakParticle;
  }
  getTextParticle() {
    return this.textParticle;
  }
  getHeaderElementList() {
    return this.header.getElementList();
  }
  getTableElementList(sourceElementList) {
    var _a;
    const positionContext = this.position.getPositionContext();
    const { index, trIndex, tdIndex } = positionContext;
    return ((_a = sourceElementList[index].trList) == null ? void 0 : _a[trIndex].tdList[tdIndex].value) || [];
  }
  getElementList() {
    const positionContext = this.position.getPositionContext();
    const elementList = this.getOriginalElementList();
    return positionContext.isTable ? this.getTableElementList(elementList) : elementList;
  }
  getMainElementList() {
    const positionContext = this.position.getPositionContext();
    return positionContext.isTable ? this.getTableElementList(this.elementList) : this.elementList;
  }
  getOriginalElementList() {
    return this.elementList;
  }
  getOriginalMainElementList() {
    return this.elementList;
  }
  getFooterElementList() {
    return this.footer.getElementList();
  }
  getTd() {
    const positionContext = this.position.getPositionContext();
    const { index, trIndex, tdIndex, isTable } = positionContext;
    if (isTable) {
      const elementList = this.getOriginalElementList();
      return elementList[index].trList[trIndex].tdList[tdIndex];
    }
    return null;
  }
  spliceElementList(elementList, start, deleteCount, ...items) {
    var _a;
    if (deleteCount > 0) {
      const endIndex = start + deleteCount;
      const endElement = elementList[endIndex];
      const endElementListId = endElement == null ? void 0 : endElement.listId;
      if (endElementListId && ((_a = elementList[start - 1]) == null ? void 0 : _a.listId) !== endElementListId) {
        let startIndex = endIndex;
        while (startIndex < elementList.length) {
          const curElement = elementList[startIndex];
          if (curElement.listId !== endElementListId || curElement.value === ZERO) {
            break;
          }
          delete curElement.listId;
          delete curElement.listType;
          delete curElement.listStyle;
          startIndex++;
        }
      }
    }
    for (let i = 0; i < items.length; i++) {
      elementList.splice(start + i, 0, items[i]);
    }
  }
  getImageParticle() {
    return this.imageParticle;
  }
  getTableParticle() {
    return this.tableParticle;
  }
  getHeader() {
    return this.header;
  }
  getFooter() {
    return this.footer;
  }
  getHyperlinkParticle() {
    return this.hyperlinkParticle;
  }
  getDateParticle() {
    return this.dateParticle;
  }
  getListParticle() {
    return this.listParticle;
  }
  getCheckboxParticle() {
    return this.checkboxParticle;
  }
  getRadioParticle() {
    return this.radioParticle;
  }
  getImageObserver() {
    return this.imageObserver;
  }
  getI18n() {
    return this.i18n;
  }
  getRowCount() {
    return this.getRowList().length;
  }
  async getDataURL(payload = {}) {
    const { pixelRatio, mode } = payload;
    if (pixelRatio) {
      this.setPagePixelRatio(pixelRatio);
    }
    this.mode;
    this.render({
      isLazy: false,
      isCompute: false,
      isSetCursor: false,
      isSubmitHistory: false
    });
    await this.imageObserver.allSettled();
    const dataUrlList = this.pageList.map((c) => c.toDataURL());
    if (pixelRatio) {
      this.setPagePixelRatio(null);
    }
    return dataUrlList;
  }
  async setValue(payload) {
    const { header, main, footer } = deepClone(payload);
    if (!header && !main && !footer)
      return;
    const pageComponentData = [header, main, footer];
    for (let i = 0; i < pageComponentData.length; i++) {
      const data2 = pageComponentData[i];
      if (!data2)
        return;
      await formatElementList(data2, {
        editorOptions: this.options,
        isForceCompensation: true
      });
    }
    pageComponentData.forEach((datas) => {
      if (datas) {
        datas = this.filterAssistElement(
          datas
        );
      }
    });
    this.setEditorData({
      header,
      main,
      footer
    });
  }
  setPageScale(payload) {
    const dpr = this.getPagePixelRatio();
    this.options.scale = payload;
    const width = this.getWidth();
    const height = this.getHeight();
    this.pageList.forEach((p, i) => {
      p.width = width * dpr;
      p.height = height * dpr;
      p.style.width = `${width}px`;
      p.style.height = `${height}px`;
      p.style.marginBottom = `${this.getPageGap()}px`;
      this._initPageContext(this.ctxList[i]);
    });
    const cursorPosition = this.position.getCursorPosition();
    this.render({
      isSubmitHistory: false,
      isSetCursor: !!cursorPosition,
      curIndex: cursorPosition == null ? void 0 : cursorPosition.index
    });
  }
  getPagePixelRatio() {
    return this.pagePixelRatio || window.devicePixelRatio;
  }
  setPagePixelRatio(payload) {
    if (!this.pagePixelRatio && payload === window.devicePixelRatio || payload === this.pagePixelRatio) {
      return;
    }
    this.pagePixelRatio = payload;
    this.setPageDevicePixel();
  }
  setPageDevicePixel() {
    const dpr = this.getPagePixelRatio();
    const width = this.getWidth();
    const height = this.getHeight();
    this.pageList.forEach((p, i) => {
      p.width = width * dpr;
      p.height = height * dpr;
      this._initPageContext(this.ctxList[i]);
    });
    this.render({
      isSubmitHistory: false,
      isSetCursor: false
    });
  }
  setPaperSize(width, height) {
    this.options.width = width;
    this.options.height = height;
    const dpr = this.getPagePixelRatio();
    const realWidth = this.getWidth();
    const realHeight = this.getHeight();
    this.pageList.forEach((p, i) => {
      p.width = realWidth * dpr;
      p.height = realHeight * dpr;
      p.style.width = `${realWidth}px`;
      p.style.height = `${realHeight}px`;
      this._initPageContext(this.ctxList[i]);
    });
    this.render({
      isSubmitHistory: false,
      isSetCursor: false
    });
  }
  setPaperDirection(payload) {
    const dpr = this.getPagePixelRatio();
    this.options.paperDirection = payload;
    const width = this.getWidth();
    const height = this.getHeight();
    this.pageList.forEach((p, i) => {
      p.width = width * dpr;
      p.height = height * dpr;
      p.style.width = `${width}px`;
      p.style.height = `${height}px`;
      this._initPageContext(this.ctxList[i]);
    });
    this.render({
      isSubmitHistory: false,
      isSetCursor: false
    });
  }
  setPaperMargin(payload) {
    this.options.margins = payload;
    this.render({
      isSubmitHistory: false,
      isSetCursor: false
    });
  }
  getValue(options = {}) {
    const { pageNo, extraPickAttrs } = options;
    let mainElementList = this.elementList;
    if (Number.isInteger(pageNo) && pageNo >= 0 && pageNo < this.pageRowList.length) {
      mainElementList = this.pageRowList[pageNo].flatMap(
        (row) => row.elementList
      );
    }
    const data2 = {
      header: zipElementList(this.getHeaderElementList(), {
        extraPickAttrs
      }),
      main: zipElementList(mainElementList, {
        extraPickAttrs
      }),
      footer: zipElementList(this.getFooterElementList(), {
        extraPickAttrs
      })
    };
    const version = "0.0.94";
    return {
      version,
      data: data2,
      options: deepClone(this.options)
    };
  }
  setEditorData(payload) {
    const { header, main, footer } = payload;
    if (header) {
      this.header.setElementList(header);
    }
    if (main) {
      this.elementList = main;
    }
    if (footer) {
      this.footer.setElementList(footer);
    }
  }
  _formatContainer() {
  }
  _createPage(pageNo) {
    const width = this.getWidth();
    const height = this.getHeight();
    const dpr = 1;
    const orientation = this.getOptions().paperDirection === PaperDirection.VERTICAL ? "p" : "l";
    this.ctxListInfos.push({
      width,
      height,
      background: "#ffffff",
      marginBottom: `${this.getPageGap()}px`,
      index: String(pageNo)
    });
    this.pageList.push({
      width,
      height,
      background: "#ffffff",
      marginBottom: `${this.getPageGap()}px`,
      index: String(pageNo)
    });
    const newPagePdf = this.pdf.addPage([width, height], orientation);
    newPagePdf.context2d.scale(dpr, dpr);
  }
  _initPageContext(ctx) {
    const dpr = this.getPagePixelRatio();
    ctx.scale(dpr, dpr);
    ctx.letterSpacing = "0px";
    ctx.wordSpacing = "0px";
    ctx.direction = "ltr";
  }
  getElementFont(el, scale = 1) {
    const { defaultSize, defaultFont } = this.options;
    const font = el.font || defaultFont;
    const size = el.actualSize || el.size || defaultSize;
    return `${el.italic ? "italic " : ""}${el.bold ? "bold " : ""}${size * scale}px ${font}`;
  }
  getElementSize(el) {
    return el.actualSize || el.size || this.options.defaultSize;
  }
  getElementRowMargin(el) {
    var _a;
    const { defaultBasicRowMarginHeight, defaultRowMargin, scale } = this.options;
    return defaultBasicRowMarginHeight * ((_a = el.rowMargin) != null ? _a : defaultRowMargin) * scale;
  }
  forceUpdate(options) {
    const { isSubmitHistory = false } = options || {};
    this.render({
      isSubmitHistory,
      isSetCursor: false
    });
  }
  updateOptions(payload) {
    const newOption = mergeOption(payload);
    Object.entries(newOption).forEach(([key, value]) => {
      Reflect.set(this.options, key, value);
    });
  }
  computeRowList(payload) {
    var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
    const {
      innerWidth,
      elementList,
      isPagingMode = false,
      isFromTable = false,
      startX = 0,
      startY = 0,
      pageHeight = 0,
      mainOuterHeight = 0,
      surroundElementList = []
    } = payload;
    const {
      defaultSize,
      defaultRowMargin,
      scale,
      table: { tdPadding },
      defaultTabWidth
    } = this.options;
    const defaultBasicRowMarginHeight = this.getDefaultBasicRowMarginHeight();
    const listStyleMap = this.listParticle.computeListStyle(elementList);
    const rowList = [];
    if (elementList.length) {
      rowList.push({
        width: 0,
        height: 0,
        ascent: 0,
        elementList: [],
        startIndex: 0,
        rowIndex: 0,
        rowFlex: ((_a = elementList == null ? void 0 : elementList[0]) == null ? void 0 : _a.rowFlex) || ((_b = elementList == null ? void 0 : elementList[1]) == null ? void 0 : _b.rowFlex)
      });
    }
    let x = startX;
    let y = startY;
    let pageNo = 0;
    let listId;
    let listIndex = 0;
    let controlRealWidth = 0;
    for (let i = 0; i < elementList.length; i++) {
      const curRow = rowList[rowList.length - 1];
      const element = elementList[i];
      const rowMargin = defaultBasicRowMarginHeight * ((_c = element.rowMargin) != null ? _c : defaultRowMargin);
      const metrics = {
        width: 0,
        height: 0,
        boundingBoxAscent: 0,
        boundingBoxDescent: 0
      };
      const offsetX = curRow.offsetX || element.listId && listStyleMap.get(element.listId) || 0;
      const availableWidth = innerWidth - offsetX;
      x += curRow.elementList.length === 1 ? offsetX : 0;
      if (element.type === ElementType.IMAGE || element.type === ElementType.LATEX) {
        if (element.imgDisplay === ImageDisplay.SURROUND || element.imgDisplay === ImageDisplay.FLOAT_TOP || element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) {
          metrics.width = 0;
          metrics.height = 0;
          metrics.boundingBoxDescent = 0;
        } else {
          const elementWidth = element.width * scale;
          const elementHeight = element.height * scale;
          if (elementWidth > availableWidth) {
            const adaptiveHeight = elementHeight * availableWidth / elementWidth;
            element.width = availableWidth / scale;
            element.height = adaptiveHeight / scale;
            metrics.width = availableWidth;
            metrics.height = adaptiveHeight;
            metrics.boundingBoxDescent = adaptiveHeight;
          } else {
            metrics.width = elementWidth;
            metrics.height = elementHeight;
            metrics.boundingBoxDescent = elementHeight;
          }
        }
        metrics.boundingBoxAscent = 0;
      } else if (element.type === ElementType.TABLE) {
        const tdPaddingWidth = tdPadding[1] + tdPadding[3];
        const tdPaddingHeight = tdPadding[0] + tdPadding[2];
        if (element.pagingId) {
          let tableIndex = i + 1;
          let combineCount = 0;
          while (tableIndex < elementList.length) {
            const nextElement2 = elementList[tableIndex];
            if (nextElement2.pagingId === element.pagingId) {
              const nexTrList = nextElement2.trList.filter(
                (tr) => !tr.pagingRepeat
              );
              element.trList.push(...nexTrList);
              element.height += nextElement2.height;
              tableIndex++;
              combineCount++;
            } else {
              break;
            }
          }
          if (combineCount) {
            elementList.splice(i + 1, combineCount);
          }
        }
        element.pagingIndex = (_d = element.pagingIndex) != null ? _d : 0;
        this.tableParticle.computeRowColInfo(element);
        const trList = element.trList;
        for (let t = 0; t < trList.length; t++) {
          const tr = trList[t];
          for (let d = 0; d < tr.tdList.length; d++) {
            const td = tr.tdList[d];
            const rowList2 = this.computeRowList({
              innerWidth: (td.width - tdPaddingWidth) * scale,
              elementList: td.value,
              isFromTable: true,
              isPagingMode
            });
            const rowHeight = rowList2.reduce((pre, cur) => pre + cur.height, 0);
            td.rowList = rowList2;
            const curTdHeight = rowHeight / scale + tdPaddingHeight;
            if (td.height < curTdHeight) {
              const extraHeight = curTdHeight - td.height;
              const changeTr = trList[t + td.rowspan - 1];
              changeTr.height += extraHeight;
              changeTr.tdList.forEach((changeTd) => {
                changeTd.height += extraHeight;
              });
            }
            let curTdMinHeight = 0;
            let curTdRealHeight = 0;
            let i2 = 0;
            while (i2 < td.rowspan) {
              const curTr = trList[i2 + t] || trList[t];
              curTdMinHeight += curTr.minHeight;
              curTdRealHeight += curTr.height;
              i2++;
            }
            td.realMinHeight = curTdMinHeight;
            td.realHeight = curTdRealHeight;
            td.mainHeight = curTdHeight;
          }
        }
        const reduceTrList = this.tableParticle.getTrListGroupByCol(trList);
        for (let t = 0; t < reduceTrList.length; t++) {
          const tr = reduceTrList[t];
          let reduceHeight = -1;
          for (let d = 0; d < tr.tdList.length; d++) {
            const td = tr.tdList[d];
            const curTdRealHeight = td.realHeight;
            const curTdHeight = td.mainHeight;
            const curTdMinHeight = td.realMinHeight;
            const curReduceHeight = curTdHeight < curTdMinHeight ? curTdRealHeight - curTdMinHeight : curTdRealHeight - curTdHeight;
            if (!~reduceHeight || curReduceHeight < reduceHeight) {
              reduceHeight = curReduceHeight;
            }
          }
          if (reduceHeight > 0) {
            const changeTr = trList[t];
            changeTr.height -= reduceHeight;
            changeTr.tdList.forEach((changeTd) => {
              changeTd.height -= reduceHeight;
            });
          }
        }
        this.tableParticle.computeRowColInfo(element);
        const tableHeight = this.tableParticle.getTableHeight(element);
        const tableWidth = this.tableParticle.getTableWidth(element);
        element.width = tableWidth;
        element.height = tableHeight;
        const elementWidth = tableWidth * scale;
        const elementHeight = tableHeight * scale;
        metrics.width = elementWidth;
        metrics.height = elementHeight;
        metrics.boundingBoxDescent = elementHeight;
        metrics.boundingBoxAscent = -rowMargin;
        if (isPagingMode) {
          const height2 = this.getHeight();
          const marginHeight = this.getMainOuterHeight();
          let curPagePreHeight = marginHeight;
          for (let r = 0; r < rowList.length; r++) {
            const row = rowList[r];
            if (row.height + curPagePreHeight > height2 || ((_e = rowList[r - 1]) == null ? void 0 : _e.isPageBreak)) {
              curPagePreHeight = marginHeight + row.height;
            } else {
              curPagePreHeight += row.height;
            }
          }
          const rowMarginHeight = rowMargin * 2 * scale;
          if (curPagePreHeight + element.trList[0].height + rowMarginHeight > height2 || element.pagingIndex !== 0 && element.trList[0].pagingRepeat) {
            curPagePreHeight = marginHeight;
          }
          if (curPagePreHeight + rowMarginHeight + elementHeight > height2) {
            const trList2 = element.trList;
            let deleteStart = 0;
            let deleteCount = 0;
            let preTrHeight = 0;
            if (trList2.length > 1) {
              for (let r = 0; r < trList2.length; r++) {
                const tr = trList2[r];
                const trHeight = tr.height * scale;
                if (curPagePreHeight + rowMarginHeight + preTrHeight + trHeight > height2) {
                  const rowColCount = tr.tdList.reduce(
                    (pre, cur) => pre + cur.colspan,
                    0
                  );
                  if (((_f = element.colgroup) == null ? void 0 : _f.length) !== rowColCount) {
                    deleteCount = 0;
                  }
                  break;
                } else {
                  deleteStart = r + 1;
                  deleteCount = trList2.length - deleteStart;
                  preTrHeight += trHeight;
                }
              }
            }
            if (deleteCount) {
              const cloneTrList = trList2.splice(deleteStart, deleteCount);
              const cloneTrHeight = cloneTrList.reduce(
                (pre, cur) => pre + cur.height,
                0
              );
              const pagingId = element.pagingId || getUUID();
              element.pagingId = pagingId;
              element.height -= cloneTrHeight;
              metrics.height -= cloneTrHeight;
              metrics.boundingBoxDescent -= cloneTrHeight;
              const cloneElement = deepClone(element);
              cloneElement.pagingId = pagingId;
              cloneElement.pagingIndex = element.pagingIndex + 1;
              const repeatTrList = trList2.filter((tr) => tr.pagingRepeat);
              if (repeatTrList.length) {
                const cloneRepeatTrList = deepClone(repeatTrList);
                cloneRepeatTrList.forEach((tr) => tr.id = getUUID());
                cloneTrList.unshift(...cloneRepeatTrList);
              }
              cloneElement.trList = cloneTrList;
              cloneElement.id = getUUID();
              this.spliceElementList(elementList, i + 1, 0, cloneElement);
            }
          }
          if (element.pagingId) {
            const positionContext = this.position.getPositionContext();
            if (positionContext.isTable) {
              let newPositionContextIndex = -1;
              let newPositionContextTrIndex = -1;
              let tableIndex = i;
              while (tableIndex < elementList.length) {
                const curElement = elementList[tableIndex];
                if (curElement.pagingId !== element.pagingId)
                  break;
                const trIndex = curElement.trList.findIndex(
                  (r) => r.id === positionContext.trId
                );
                if (~trIndex) {
                  newPositionContextIndex = tableIndex;
                  newPositionContextTrIndex = trIndex;
                  break;
                }
                tableIndex++;
              }
              if (~newPositionContextIndex) {
                positionContext.index = newPositionContextIndex;
                positionContext.trIndex = newPositionContextTrIndex;
                this.position.setPositionContext(positionContext);
              }
            }
          }
        }
      } else if (element.type === ElementType.SEPARATOR) {
        const {
          separator: { lineWidth }
        } = this.options;
        element.width = availableWidth / scale;
        metrics.width = availableWidth;
        metrics.height = lineWidth * scale;
        metrics.boundingBoxAscent = -rowMargin;
        metrics.boundingBoxDescent = -rowMargin + metrics.height;
      } else if (element.type === ElementType.PAGE_BREAK) {
        element.width = availableWidth / scale;
        metrics.width = availableWidth;
        metrics.height = defaultSize;
      } else if (element.type === ElementType.RADIO || element.controlComponent === ControlComponent.RADIO) {
        const { width, height: height2, gap } = this.options.radio;
        const elementWidth = width + gap * 2;
        element.width = elementWidth;
        metrics.width = elementWidth * scale;
        metrics.height = height2 * scale;
      } else if (element.type === ElementType.CHECKBOX || element.controlComponent === ControlComponent.CHECKBOX) {
        const { width, height: height2, gap } = this.options.checkbox;
        const elementWidth = width + gap * 2;
        element.width = elementWidth;
        metrics.width = elementWidth * scale;
        metrics.height = height2 * scale;
      } else if (element.type === ElementType.TAB) {
        metrics.width = defaultTabWidth * scale;
        metrics.height = defaultSize * scale;
        metrics.boundingBoxDescent = 0;
        metrics.boundingBoxAscent = metrics.height;
      } else if (element.type === ElementType.BLOCK) {
        if (!element.width) {
          metrics.width = availableWidth;
        } else {
          const elementWidth = element.width * scale;
          metrics.width = Math.min(elementWidth, availableWidth);
        }
        metrics.height = element.height * scale;
        metrics.boundingBoxDescent = metrics.height;
        metrics.boundingBoxAscent = 0;
      } else {
        const size = element.size || defaultSize;
        if (element.type === ElementType.SUPERSCRIPT || element.type === ElementType.SUBSCRIPT) {
          element.actualSize = Math.ceil(size * 0.6);
        }
        metrics.height = (element.actualSize || size) * scale;
        this.getCtx2d().font = this.getElementFont(element);
        const fontMetrics = this.textParticle.measureText(this.getCtx2d(), element);
        metrics.width = fontMetrics.width * scale;
        if (element.letterSpacing) {
          metrics.width += element.letterSpacing * scale;
        }
        metrics.boundingBoxAscent = (element.value === ZERO ? element.size || defaultSize : fontMetrics.actualBoundingBoxAscent) * scale;
        metrics.boundingBoxDescent = fontMetrics.actualBoundingBoxDescent * scale;
        if (element.type === ElementType.SUPERSCRIPT) {
          metrics.boundingBoxAscent += metrics.height / 2;
        } else if (element.type === ElementType.SUBSCRIPT) {
          metrics.boundingBoxDescent += metrics.height / 2;
        }
      }
      const ascent = element.imgDisplay !== ImageDisplay.INLINE && element.type === ElementType.IMAGE || element.type === ElementType.LATEX ? metrics.height + rowMargin : metrics.boundingBoxAscent + rowMargin;
      const height = rowMargin + metrics.boundingBoxAscent + metrics.boundingBoxDescent + rowMargin;
      const rowElement = Object.assign(element, {
        metrics,
        left: 0,
        style: this.getElementFont(element, scale)
      });
      if ((_g = rowElement.control) == null ? void 0 : _g.minWidth) {
        if (rowElement.controlComponent) {
          controlRealWidth += metrics.width;
        }
        if (rowElement.controlComponent === ControlComponent.POSTFIX) {
          const extraWidth = rowElement.control.minWidth - controlRealWidth;
          if (extraWidth > 0) {
            const rowRemainingWidth = availableWidth - curRow.width - metrics.width;
            const left = Math.min(rowRemainingWidth, extraWidth) * scale;
            rowElement.left = left;
            curRow.width += left;
          }
          controlRealWidth = 0;
        }
      }
      const preElement = elementList[i - 1];
      let nextElement = elementList[i + 1];
      let curRowWidth = curRow.width + metrics.width;
      if (this.options.wordBreak === WordBreak.BREAK_WORD) {
        if ((!(preElement == null ? void 0 : preElement.type) || (preElement == null ? void 0 : preElement.type) === ElementType.TEXT) && (!element.type || element.type === ElementType.TEXT)) {
          const word = `${(preElement == null ? void 0 : preElement.value) || ""}${element.value}`;
          if (this.WORD_LIKE_REG.test(word)) {
            const { width, endElement } = this.textParticle.measureWord(
              this.getCtx2d(),
              elementList,
              i
            );
            const wordWidth = width * scale;
            if (wordWidth <= availableWidth) {
              curRowWidth += wordWidth;
              nextElement = endElement;
            }
          }
          const punctuationWidth = this.textParticle.measurePunctuationWidth(
            this.getCtx2d(),
            nextElement
          );
          curRowWidth += punctuationWidth * scale;
        }
      }
      if (element.listId) {
        if (element.listId !== listId) {
          listIndex = 0;
        } else if (element.value === ZERO && !element.listWrap) {
          listIndex++;
        }
      }
      listId = element.listId;
      const surroundPosition = this.position.setSurroundPosition({
        pageNo,
        rowElement,
        row: curRow,
        rowElementRect: {
          x,
          y,
          height,
          width: metrics.width
        },
        availableWidth,
        surroundElementList
      });
      x = surroundPosition.x;
      curRowWidth += surroundPosition.rowIncreaseWidth;
      x += metrics.width;
      const isForceBreak = element.type === ElementType.SEPARATOR || element.type === ElementType.TABLE || (preElement == null ? void 0 : preElement.type) === ElementType.TABLE || (preElement == null ? void 0 : preElement.type) === ElementType.BLOCK || element.type === ElementType.BLOCK || (preElement == null ? void 0 : preElement.imgDisplay) === ImageDisplay.INLINE || element.imgDisplay === ImageDisplay.INLINE || (preElement == null ? void 0 : preElement.listId) !== element.listId || i !== 0 && element.value === ZERO;
      const isWidthNotEnough = curRowWidth > availableWidth;
      const isWrap = isForceBreak || isWidthNotEnough;
      if (isWrap) {
        const row = {
          width: metrics.width,
          height,
          startIndex: i,
          elementList: [rowElement],
          ascent,
          rowIndex: curRow.rowIndex + 1,
          rowFlex: ((_h = elementList[i]) == null ? void 0 : _h.rowFlex) || ((_i = elementList[i + 1]) == null ? void 0 : _i.rowFlex),
          isPageBreak: element.type === ElementType.PAGE_BREAK
        };
        if (rowElement.controlComponent !== ControlComponent.PREFIX && ((_j = rowElement.control) == null ? void 0 : _j.indentation) === ControlIndentation.VALUE_START) {
          const preStartIndex = curRow.elementList.findIndex(
            (el) => el.controlId === rowElement.controlId && el.controlComponent !== ControlComponent.PREFIX
          );
          if (~preStartIndex) {
            const preRowPositionList = this.position.computeRowPosition({
              row: curRow,
              innerWidth: this.getInnerWidth()
            });
            const valueStartPosition = preRowPositionList[preStartIndex];
            if (valueStartPosition) {
              row.offsetX = valueStartPosition.coordinate.leftTop[0];
            }
          }
        }
        if (element.listId) {
          row.isList = true;
          row.offsetX = listStyleMap.get(element.listId);
          row.listIndex = listIndex;
        }
        rowList.push(row);
      } else {
        curRow.width += metrics.width;
        if (i === 0 && getIsBlockElement(elementList[1])) {
          curRow.height = defaultBasicRowMarginHeight;
          curRow.ascent = defaultBasicRowMarginHeight;
        } else if (curRow.height < height) {
          curRow.height = height;
          curRow.ascent = ascent;
        }
        curRow.elementList.push(rowElement);
      }
      if (isWrap || i === elementList.length - 1) {
        curRow.isWidthNotEnough = isWidthNotEnough && !isForceBreak;
        if (!curRow.isSurround && ((preElement == null ? void 0 : preElement.rowFlex) === RowFlex.JUSTIFY || (preElement == null ? void 0 : preElement.rowFlex) === RowFlex.ALIGNMENT && isWidthNotEnough)) {
          const rowElementList = ((_k = curRow.elementList[0]) == null ? void 0 : _k.value) === ZERO ? curRow.elementList.slice(1) : curRow.elementList;
          const gap = (availableWidth - curRow.width) / (rowElementList.length - 1);
          for (let e = 0; e < rowElementList.length - 1; e++) {
            const el = rowElementList[e];
            el.metrics.width += gap;
          }
          curRow.width = availableWidth;
        }
      }
      if (isWrap) {
        x = startX;
        y += curRow.height;
        if (isPagingMode && !isFromTable && pageHeight && (y - startY + mainOuterHeight + height > pageHeight || element.type === ElementType.PAGE_BREAK)) {
          y = startY;
          deleteSurroundElementList(surroundElementList, pageNo);
          pageNo += 1;
        }
        rowElement.left = 0;
        const nextRow = rowList[rowList.length - 1];
        const surroundPosition2 = this.position.setSurroundPosition({
          pageNo,
          rowElement,
          row: nextRow,
          rowElementRect: {
            x,
            y,
            height,
            width: metrics.width
          },
          availableWidth,
          surroundElementList
        });
        x = surroundPosition2.x;
        x += metrics.width;
      }
    }
    return rowList;
  }
  _computePageList() {
    var _a;
    const pageRowList = [[]];
    const {
      pageMode,
      pageNumber: { maxPageNo }
    } = this.options;
    const height = this.getHeight();
    const marginHeight = this.getMainOuterHeight();
    let pageHeight = marginHeight;
    let pageNo = 0;
    if (pageMode === PageMode.CONTINUITY) {
      pageRowList[0] = this.rowList;
      pageHeight += this.rowList.reduce((pre, cur) => pre + cur.height, 0);
      const dpr = this.getPagePixelRatio();
      const pageDom = this.pageList[0];
      const pageDomHeight = Number(pageDom.style.height.replace("px", ""));
      if (pageHeight > pageDomHeight) {
        pageDom.style.height = `${pageHeight}px`;
        pageDom.height = pageHeight * dpr;
      } else {
        const reduceHeight = pageHeight < height ? height : pageHeight;
        pageDom.style.height = `${reduceHeight}px`;
        pageDom.height = reduceHeight * dpr;
      }
      this._initPageContext(this.ctxList[0]);
    } else {
      for (let i = 0; i < this.rowList.length; i++) {
        const row = this.rowList[i];
        if (row.height + pageHeight > height || ((_a = this.rowList[i - 1]) == null ? void 0 : _a.isPageBreak)) {
          if (Number.isInteger(maxPageNo) && pageNo >= maxPageNo) {
            this.elementList = this.elementList.slice(0, row.startIndex);
            break;
          }
          pageHeight = marginHeight + row.height;
          pageRowList.push([row]);
          pageNo++;
        } else {
          pageHeight += row.height;
          pageRowList[pageNo].push(row);
        }
      }
    }
    return pageRowList;
  }
  _drawHighlight(ctx2d, payload) {
    const {
      control: { activeBackgroundColor }
    } = this.options;
    const { rowList, positionList } = payload;
    for (let i = 0; i < rowList.length; i++) {
      const curRow = rowList[i];
      for (let j = 0; j < curRow.elementList.length; j++) {
        const element = curRow.elementList[j];
        if (element.highlight) {
          const {
            coordinate: {
              leftTop: [x, y]
            }
          } = positionList[curRow.startIndex + j];
          const offsetX = element.left || 0;
          this.highlight.recordFillInfo(
            ctx2d,
            x - offsetX,
            y,
            element.metrics.width + offsetX,
            curRow.height,
            element.highlight || activeBackgroundColor
          );
          this.highlight.render(ctx2d);
        }
      }
    }
  }
  drawRow(ctx2d, payload) {
    var _a, _b, _c;
    this._drawHighlight(ctx2d, payload);
    const {
      scale,
      table: { tdPadding },
      group: group2,
      lineBreak
    } = this.options;
    const {
      rowList,
      pageNo,
      positionList,
      zone: zone2,
      isDrawLineBreak = !lineBreak.disabled
    } = payload;
    const isPrintMode = this.mode === EditorMode.PRINT;
    for (let i = 0; i < rowList.length; i++) {
      const curRow = rowList[i];
      for (let j = 0; j < curRow.elementList.length; j++) {
        const element = curRow.elementList[j];
        const metrics = element.metrics;
        const {
          ascent: offsetY,
          coordinate: {
            leftTop: [x, y]
          }
        } = positionList[curRow.startIndex + j];
        const preElement = curRow.elementList[j - 1];
        if (element.type === ElementType.IMAGE) {
          this.textParticle.complete();
          if (element.imgDisplay !== ImageDisplay.SURROUND && element.imgDisplay !== ImageDisplay.FLOAT_TOP && element.imgDisplay !== ImageDisplay.FLOAT_BOTTOM) {
            this.imageParticle.render(this.getCtx2d(), element, x, y + offsetY);
          }
        } else if (element.type === ElementType.LATEX) {
          this.textParticle.complete();
          this.laTexParticle.render(this.getCtx2d(), element, x, y + offsetY);
        } else if (element.type === ElementType.TABLE) {
          this.tableParticle.render(this.getCtx2d(), element, x, y);
        } else if (element.type === ElementType.HYPERLINK) {
          this.textParticle.complete();
          this.hyperlinkParticle.render(this.getCtx2d(), element, x, y + offsetY);
        } else if (element.type === ElementType.DATE) {
          const nextElement = curRow.elementList[j + 1];
          if (!preElement || preElement.dateId !== element.dateId) {
            this.textParticle.complete();
          }
          this.textParticle.record(this.getCtx2d(), element, x, y + offsetY);
          if (!nextElement || nextElement.dateId !== element.dateId) {
            this.textParticle.complete();
          }
        } else if (element.type === ElementType.SUPERSCRIPT) {
          this.textParticle.complete();
          this.superscriptParticle.render(this.getCtx2d(), element, x, y + offsetY);
        } else if (element.type === ElementType.SUBSCRIPT) {
          this.underline.render(this.getCtx2d());
          this.textParticle.complete();
          this.subscriptParticle.render(this.getCtx2d(), element, x, y + offsetY);
        } else if (element.type === ElementType.SEPARATOR) {
          this.separatorParticle.render(this.getCtx2d(), element, x, y);
        } else if (element.type === ElementType.PAGE_BREAK)
          ;
        else if (element.type === ElementType.CHECKBOX || element.controlComponent === ControlComponent.CHECKBOX) {
          this.textParticle.complete();
          this.checkboxParticle.render({
            ctx2d: this.getCtx2d(),
            x,
            y: y + offsetY,
            index: j,
            row: curRow
          });
        } else if (element.type === ElementType.RADIO || element.controlComponent === ControlComponent.RADIO) {
          this.textParticle.complete();
          this.radioParticle.render({
            ctx2d: this.getCtx2d(),
            x,
            y: y + offsetY,
            index: j,
            row: curRow
          });
        } else if (element.type === ElementType.TAB) {
          this.textParticle.complete();
        } else if (element.rowFlex === RowFlex.ALIGNMENT || element.rowFlex === RowFlex.JUSTIFY) {
          this.textParticle.record(this.getCtx2d(), element, x, y + offsetY);
          this.textParticle.complete();
        } else if (element.type === ElementType.BLOCK) {
          this.textParticle.complete();
          this.blockParticle.render(pageNo, element, x, y);
        } else {
          if (element.left) {
            this.textParticle.complete();
          }
          this.textParticle.record(this.getCtx2d(), element, x, y + offsetY);
          if (element.width || element.letterSpacing || PUNCTUATION_REG.test(element.value)) {
            this.textParticle.complete();
          }
        }
        if (isDrawLineBreak && !isPrintMode && this.mode !== EditorMode.CLEAN && !curRow.isWidthNotEnough && j === curRow.elementList.length - 1) {
          this.lineBreakParticle.render(this.getCtx2d(), element, x, y + curRow.height / 2);
        }
        if (element.underline || ((_a = element.control) == null ? void 0 : _a.underline)) {
          if ((preElement == null ? void 0 : preElement.type) === ElementType.SUBSCRIPT && element.type !== ElementType.SUBSCRIPT) {
            this.underline.render(this.getCtx2d());
          }
          const rowMargin = this.getElementRowMargin(element);
          const offsetX = element.left || 0;
          let offsetY2 = 0;
          if (element.type === ElementType.SUBSCRIPT) {
            offsetY2 = this.subscriptParticle.getOffsetY(element);
          }
          const color = element.controlComponent === ControlComponent.PLACEHOLDER ? void 0 : element.color;
          this.underline.recordFillInfo(
            this.getCtx2d(),
            x - offsetX,
            y + curRow.height - rowMargin + offsetY2,
            metrics.width + offsetX,
            0,
            color,
            (_b = element.textDecoration) == null ? void 0 : _b.style
          );
        } else if ((preElement == null ? void 0 : preElement.underline) || ((_c = preElement == null ? void 0 : preElement.control) == null ? void 0 : _c.underline)) {
          this.underline.render(this.getCtx2d());
        }
        if (element.strikeout) {
          if (!element.type || TEXTLIKE_ELEMENT_TYPE.includes(element.type)) {
            if (preElement && (preElement.type === ElementType.SUBSCRIPT && element.type !== ElementType.SUBSCRIPT || preElement.type === ElementType.SUPERSCRIPT && element.type !== ElementType.SUPERSCRIPT || this.getElementSize(preElement) !== this.getElementSize(element))) {
              this.strikeout.render(this.getCtx2d());
            }
            const standardMetrics = this.textParticle.measureBasisWord(
              this.getCtx2d(),
              this.getElementFont(element)
            );
            let adjustY = y + offsetY + standardMetrics.actualBoundingBoxDescent * scale - metrics.height / 2;
            if (element.type === ElementType.SUBSCRIPT) {
              adjustY += this.subscriptParticle.getOffsetY(element);
            } else if (element.type === ElementType.SUPERSCRIPT) {
              adjustY += this.superscriptParticle.getOffsetY(element);
            }
            this.strikeout.recordFillInfo(this.getCtx2d(), x, adjustY, metrics.width);
          }
        } else if (preElement == null ? void 0 : preElement.strikeout) {
          this.strikeout.render(this.getCtx2d());
        }
        if (!group2.disabled && element.groupIds) {
          this.group.recordFillInfo(element, x, y, metrics.width, curRow.height);
        }
        if (element.type === ElementType.TABLE) {
          const tdPaddingWidth = tdPadding[1] + tdPadding[3];
          for (let t = 0; t < element.trList.length; t++) {
            const tr = element.trList[t];
            for (let d = 0; d < tr.tdList.length; d++) {
              const td = tr.tdList[d];
              this.drawRow(ctx2d, {
                elementList: td.value,
                positionList: td.positionList,
                rowList: td.rowList,
                pageNo,
                startIndex: 0,
                innerWidth: (td.width - tdPaddingWidth) * scale,
                zone: zone2,
                isDrawLineBreak
              });
            }
          }
        }
      }
      if (curRow.isList) {
        this.listParticle.drawListStyle(
          ctx2d,
          curRow,
          positionList[curRow.startIndex]
        );
      }
      this.textParticle.complete();
      this.underline.render(this.getCtx2d());
      this.strikeout.render(this.getCtx2d());
      this.group.render(this.getCtx2d());
    }
  }
  _drawFloat(ctx2d, payload) {
    const { scale } = this.options;
    const floatPositionList = this.position.getFloatPositionList();
    const { imgDisplays, pageNo } = payload;
    for (let e = 0; e < floatPositionList.length; e++) {
      const floatPosition = floatPositionList[e];
      const element = floatPosition.element;
      if ((pageNo === floatPosition.pageNo || floatPosition.zone === EditorZone.HEADER || floatPosition.zone == EditorZone.FOOTER) && element.imgDisplay && imgDisplays.includes(element.imgDisplay) && element.type === ElementType.IMAGE) {
        const imgFloatPosition = element.imgFloatPosition;
        this.imageParticle.render(
          ctx2d,
          element,
          imgFloatPosition.x * scale,
          imgFloatPosition.y * scale
        );
      }
    }
  }
  _clearPage(pageNo) {
    const ctx = this.getCtx2d();
    const pageDom = this.getPageList()[pageNo];
    if (pageDom) {
      ctx.clearRect(
        0,
        0,
        Math.max(pageDom.width, this.getWidth()),
        Math.max(pageDom.height, this.getHeight())
      );
    }
    this.blockParticle.clear();
  }
  _drawPage(payload) {
    var _a, _b;
    const { elementList, positionList, rowList, pageNo } = payload;
    const {
      pageMode,
      header,
      footer,
      pageNumber,
      lineNumber,
      pageBorder
    } = this.options;
    const innerWidth = this.getInnerWidth();
    const ctx2d = this.getCtx2d();
    this.getPdf().setPage(pageNo + 1);
    this._clearPage(pageNo);
    this.background.render(ctx2d, pageNo);
    if (this.mode !== EditorMode.PRINT) {
      this.margin.render(ctx2d, pageNo);
    }
    this._drawFloat(ctx2d, {
      pageNo,
      imgDisplays: [ImageDisplay.FLOAT_BOTTOM]
    });
    const index = (_a = rowList[0]) == null ? void 0 : _a.startIndex;
    this.drawRow(ctx2d, {
      elementList,
      positionList,
      rowList,
      pageNo,
      startIndex: index,
      innerWidth,
      zone: EditorZone.MAIN
    });
    if (this.getOptions().pageMode === PageMode.PAGING) {
      if (!header.disabled) {
        this.header.render(ctx2d, pageNo);
      }
      if (!pageNumber.disabled) {
        this.pageNumber.render(ctx2d, pageNo);
      }
      if (!footer.disabled) {
        this.footer.render(ctx2d, pageNo);
      }
    }
    this._drawFloat(ctx2d, {
      pageNo,
      imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND]
    });
    if (pageMode !== PageMode.CONTINUITY && this.options.watermark.data) {
      this.waterMark.render(ctx2d, pageNo);
    }
    if (this.elementList.length <= 1 && !((_b = this.elementList[0]) == null ? void 0 : _b.listId)) {
      this.placeholder.render(ctx2d);
    }
    if (!lineNumber.disabled) {
      this.lineNumber.render(ctx2d, pageNo);
    }
    if (!pageBorder.disabled) {
      this.pageBorder.render(ctx2d);
    }
  }
  _immediateRender() {
    const positionList = this.getPosition().getOriginalMainPositionList();
    const elementList = this.getOriginalMainElementList();
    for (let i = 0; i < this.pageRowList.length; i++) {
      this._drawPage({
        elementList,
        positionList,
        rowList: this.pageRowList[i],
        pageNo: i
      });
    }
  }
  render(payload) {
    const { header, footer } = this.options;
    const {
      isCompute = true
    } = payload || {};
    const innerWidth = this.getInnerWidth();
    const isPagingMode = this.getOptions().pageMode === PageMode.PAGING;
    if (isCompute) {
      this.position.setFloatPositionList([]);
      if (isPagingMode) {
        if (!header.disabled) {
          this.header.compute();
        }
        if (!footer.disabled) {
          this.footer.compute();
        }
      }
      const margins = this.getMargins();
      const pageHeight = this.getHeight();
      const extraHeight = this.header.getExtraHeight();
      const mainOuterHeight = this.getMainOuterHeight();
      const startX = margins[3];
      const startY = margins[0] + extraHeight;
      const surroundElementList = pickSurroundElementList(this.elementList);
      this.rowList = this.computeRowList({
        startX,
        startY,
        pageHeight,
        mainOuterHeight,
        isPagingMode,
        innerWidth,
        surroundElementList,
        elementList: this.elementList
      });
      this.pageRowList = this._computePageList();
      this.position.computePositionList();
    }
    for (let i = 0; i < this.pageRowList.length; i++) {
      if (!this.pageList[i]) {
        this._createPage(i);
      }
    }
    const curPageCount = this.pageRowList.length;
    const prePageCount = this.pageList.length;
    if (prePageCount > curPageCount) {
      const deleteCount = prePageCount - curPageCount;
      this.ctxList.splice(curPageCount, deleteCount);
      this.pageList.splice(curPageCount, deleteCount).forEach((page, index) => {
        if (page.remove) {
          page.remove();
        }
        this.getPdf().deletePage(index + 1);
      });
    }
    if (this.getPdf().getNumberOfPages() > this.getPageList().length) {
      const deleteCount = this.getPdf().getNumberOfPages() - this.getPageList().length;
      for (let i = 1; i <= deleteCount; i++) {
        this.getPdf().deletePage(i);
      }
    }
    if (this.getPdf().getNumberOfPages() < this.getPageList().length) {
      const addCount = this.getPageList().length - this.getPdf().getNumberOfPages();
      for (let i = 1; i <= addCount; i++) {
        this.getPdf().addPage();
      }
    }
    this._immediateRender();
    if (this.getPdf().getNumberOfPages() > this.getPageList().length) {
      const deleteCount = this.getPdf().getNumberOfPages() - this.getPageList().length;
      for (let i = 1; i <= deleteCount; i++) {
        this.getPdf().deletePage(i);
      }
    }
  }
  destroy() {
  }
  clearSideEffect() {
    this.getHyperlinkParticle().clearHyperlinkPopup();
    this.getDateParticle().clearDatePicker();
  }
}
export { DrawPdf, svgString2Image };
//# sourceMappingURL=canvas-editor-pdf.es.js.map