From bd7dbb44a3bd72e067e97b9c822d1407b1113402 Mon Sep 17 00:00:00 2001 From: Akmal Isomadinov Date: Mon, 8 May 2023 14:51:34 +0500 Subject: [PATCH] Web:Viewer Removed unnecessary dependency --- .../sub-components/PDFViewer/index.tsx | 2 - .../sub-components/PDFViewer/lib/AllFonts.js | 1920 ---------- .../sub-components/PDFViewer/lib/Externals.js | 1240 ------ .../PDFViewer/lib/GlobalLoaders.js | 782 ---- .../sub-components/PDFViewer/lib/Overlay.js | 3385 ----------------- .../PDFViewer/lib/SerializeCommonWordExcel.js | 1580 -------- .../PDFViewer/lib/WorkEvents.js | 769 ---- .../sub-components/PDFViewer/lib/api.js | 282 -- .../sub-components/PDFViewer/lib/bookmarks.js | 91 - .../sub-components/PDFViewer/lib/browser.js | 203 - .../PDFViewer/lib/device_scale.js | 119 - .../sub-components/PDFViewer/lib/file.js | 2460 ------------ .../PDFViewer/lib/font/character.js | 339 -- .../PDFViewer/lib/font/loader.js | 233 -- .../sub-components/PDFViewer/lib/font/map.js | 3103 --------------- .../sub-components/PDFViewer/lib/index.ts | 23 - .../sub-components/PDFViewer/lib/scroll.js | 2175 ----------- .../sub-components/PDFViewer/lib/skin.js | 500 --- .../PDFViewer/lib/stringserialize.js | 371 -- .../PDFViewer/lib/thumbnails.js | 976 ----- .../sub-components/PDFViewer/lib/viewer.js | 2409 ------------ 21 files changed, 22962 deletions(-) delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/AllFonts.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/Externals.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/GlobalLoaders.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/Overlay.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/SerializeCommonWordExcel.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/WorkEvents.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/api.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/bookmarks.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/browser.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/device_scale.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/file.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/character.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/loader.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/map.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/index.ts delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/scroll.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/skin.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/stringserialize.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/thumbnails.js delete mode 100644 packages/common/components/MediaViewer/sub-components/PDFViewer/lib/viewer.js diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/index.tsx b/packages/common/components/MediaViewer/sub-components/PDFViewer/index.tsx index 2e133ce676..245bb219c7 100644 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/index.tsx +++ b/packages/common/components/MediaViewer/sub-components/PDFViewer/index.tsx @@ -17,8 +17,6 @@ import { import { ToolbarActionType } from "../../helpers"; import { ToolbarItemType } from "../ImageViewerToolbar/ImageViewerToolbar.props"; -// import "./lib"; - // import { isDesktop } from "react-device-detect";? const pdfViewerId = "pdf-viewer"; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/AllFonts.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/AllFonts.js deleted file mode 100644 index 3bc33886e8..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/AllFonts.js +++ /dev/null @@ -1,1920 +0,0 @@ -window["__all_fonts_js_version__"] = 2; - -window["__fonts_files"] = [ - "000", - "001", - "002", - "003", - "004", - "005", - "006", - "007", - "008", - "009", - "010", - "011", - "012", - "013", - "014", - "015", - "016", - "017", - "018", - "019", - "020", - "021", - "022", - "023", - "024", - "025", - "026", - "027", - "028", - "029", - "030", - "031", - "032", - "033", - "034", - "035", - "036", - "037", - "038", - "039", - "040", - "041", - "042", - "043", - "044", - "045", - "046", - "047", - "048", - "049", - "050", - "051", - "052", - "053", - "054", - "055", - "056", - "057", - "058", - "059", - "060", - "061", - "062", - "063", - "064", - "065", - "066", - "067", - "068", - "069", - "070", - "071", - "072", - "073", - "074", - "075", - "076", - "077", - "078", - "079", - "080", - "081", - "082", - "083", - "084", - "085", - "086", - "087", - "088", - "089", - "090", - "091", - "092", - "093", - "094", - "095", - "096", - "097", - "098", - "099", - "100", - "101", - "102", - "103", - "104", - "105", - "106", - "107", - "108", - "109", - "110", - "111", - "112", - "113", - "114", - "115", - "116", - "117", - "118", - "119", - "120", - "121", - "122", - "123", - "124", - "125", - "126", - "127", - "128", - "129", - "130", - "131", - "132", - "133", - "134", - "135", - "136", - "137", - "138", - "139", - "140", - "141", - "142", - "143", - "144", - "145", - "146", - "147", - "148", - "149", - "150", - "151", - "152", - "153", - "154", - "155", - "156", - "157", - "158", - "159", - "160", - "161", - "162", - "163", - "164", - "165", - "166", - "167", - "168", - "169", - "170", - "171", - "172", - "173", - "174", - "175", - "176", - "177", - "178", - "179", - "180", - "181", - "182", - "183", - "184", - "185", - "186", - "187", - "188", - "189", - "190", - "191", - "192", - "193", - "194", - "195", - "196", - "197", - "198", - "199", - "200", - "201", - "202", - "203", - "204", - "205", - "206", - "207", - "208", - "209", - "210", - "211", - "212", - "213", - "214", - "215", - "216", - "217", - "218", - "219", - "220", - "221", - "222", - "223", - "224", - "225", - "226", - "227", - "228", - "229", - "230", - "231", - "232", - "233", - "234", - "235", - "236", - "237", - "238", - "239", - "240", - "241", - "242", - "243", - "244", - "245", - "246", - "247", - "248", - "249", - "250", - "251", - "252", - "253", - "254", - "255", - "256", - "257", - "258", - "259", - "260", - "261", - "262", - "263", - "264", - "265", - "266", - "267", - "268", - "269", - "270", - "271", - "272", - "273", - "274", - "275", - "276", - "277", - "278", - "279", - "280", - "281", - "282", - "283", - "284", - "285", - "286", - "287", - "288", - "289", - "290", - "291", - "292", - "293", - "294", - "295", - "296", - "297", - "298", - "299", - "300", - "301", - "302", - "303", - "304", - "305", - "306", - "307", - "308", - "309", - "310", - "311", - "312", - "313", - "314", - "315", - "316", - "317", - "318", - "319", - "320", - "321", - "322", - "323", - "324", - "325", - "326", - "327", - "328", - "329", - "330", - "331", - "332", - "333", - "334", - "335", - "336", - "337", - "338", - "339", - "340", - "341", - "342", - "343", - "344", - "345", - "346", - "347", - "348", - "349", - "350", - "351", - "352", - "353", - "354", - "355", - "356", - "357", - "358", - "359", - "360", - "361", - "362", - "363", - "364", - "365", - "366", - "367", - "368", - "369", - "370", - "371", - "372", - "373", - "374", - "375", - "376", - "377", - "378", - "379", - "380", - "381", - "382", - "383", - "384", - "385", - "386", - "387", - "388", - "389", - "390", - "391", - "392", - "393", - "394", - "395", - "396", - "397", - "398", - "399", - "400", - "401", - "402", - "403", - "404", - "405", - "406", - "407", - "408", - "409", - "410", - "411", - "412", - "413", - "414", - "415", - "416", - "417", - "418", - "419", - "420", - "421", - "422", - "423", - "424", - "425", - "426", - "427", - "428", - "429", - "430", - "431", - "432", - "433", - "434", - "435", - "436", - "437", - "438", - "439", - "440", - "441", - "442", - "443", - "444", - "445", - "446", - "447", - "448", - "449", - "450", - "451", - "452", - "453", - "454", - "455", - "456", - "457", - "458", - "459", - "460", - "461", - "462", - "463", - "464", - "465", - "466", - "467", - "468", - "469", - "470", - "471", - "472", - "473", - "474", - "475", - "476", - "477", - "478", - "479", - "480", - "481", - "482", - "483", - "484", - "485", - "486", - "487", - "488", - "489", - "490", - "491", - "492", - "493", - "494", - "495", - "496", - "497", - "498", - "499", - "500", - "501", - "502", - "503", - "504", - "505", - "506", - "507", - "508", - "509", - "510", - "511", - "512", - "513", - "514", - "515", - "516", - "517", - "518", - "519", - "520", - "521", - "522", - "523", - "524", - "525", - "526", - "527", - "528", - "529", - "530", - "531", - "532", - "533", - "534", - "535", - "536", - "537", - "538", - "539", - "540", - "541", - "542", - "543", - "544", - "545", - "546", - "547", - "548", - "549", - "550", - "551", - "552", - "553", - "554", - "555", - "556", - "557", - "558", - "559", - "560", - "561", - "562", - "563", - "564", - "565", - "566", - "567", - "568", - "569", - "570", - "571", - "572", - "573", - "574", - "575", - "576", - "577", - "578", - "579", - "580", - "581", - "582", - "583", - "584", - "585", - "586", - "587", - "588", - "589", - "590", - "591", - "592", - "593", - "594", - "595", - "596", - "597", - "598", - "599", - "600", - "601", - "602", - "603", - "604", - "605", - "606", - "607", - "608", - "609", - "610", - "611", - "612", - "613", - "614", - "615", - "616", - "617", - "618", - "619", - "620", - "621", - "622", - "623", - "624", - "625", - "626", - "627", - "628", - "629", - "630", - "631", - "632", - "633", - "634", - "635", - "636", - "637", - "638", - "639", - "640", - "641", - "642", - "643", - "644", - "645", - "646", - "647", - "648", - "649", - "650", - "651", - "652", - "653", - "654", - "655", - "656", - "657", - "658", - "659", - "660", - "661", - "662", - "663", - "664", - "665", - "666", - "667", - "668", - "669", - "670", - "671", - "672", - "673", - "674", - "675", - "676", - "677", - "678", - "679", - "680", - "681", - "682", - "683", - "684", - "685", - "686", - "687", - "688", - "689", - "690", - "691", - "692", - "693", - "694", - "695", - "696", - "697", - "698", - "699", - "700", - "701", - "702", - "703", - "704", - "705", - "706", - "707", - "708", - "709", - "710", - "711", - "712", - "713", - "714", - "715", - "716", - "717", - "718", - "719", - "720", - "721", - "722", - "723", - "724", - "725", - "726", - "727", - "728", - "729", - "730", - "731", - "732", - "733", - "734", - "735", - "736", - "737", - "738", - "739", - "740", - "741", - "742", - "743", - "744", -]; - -window["__fonts_infos"] = [ - ["Abyssinica SIL", 561, 0, -1, -1, -1, -1, -1, -1], - ["Agency FB", 1, 0, -1, -1, 0, 0, -1, -1], - ["Aharoni", -1, -1, -1, -1, 361, 0, -1, -1], - ["Algerian", 2, 0, -1, -1, -1, -1, -1, -1], - ["Andale Mono", 530, 0, -1, -1, -1, -1, -1, -1], - ["Andalus", 362, 0, -1, -1, -1, -1, -1, -1], - ["Angsana New", 3, 0, 5, 0, 4, 0, 10, 0], - ["AngsanaUPC", 6, 0, 8, 0, 7, 0, 9, 0], - ["Ani", 596, 0, -1, -1, -1, -1, -1, -1], - ["AR PL UKai CN", 563, 0, -1, -1, -1, -1, -1, -1], - ["AR PL UKai HK", 563, 1, -1, -1, -1, -1, -1, -1], - ["AR PL UKai TW", 563, 2, -1, -1, -1, -1, -1, -1], - ["AR PL UKai TW MBE", 563, 3, -1, -1, -1, -1, -1, -1], - ["Arabic Transparent", 369, 0, -1, -1, 368, 0, -1, -1], - ["Arial", 363, 0, 366, 0, 364, 0, 365, 0], - ["Arial Black", 367, 0, -1, -1, -1, -1, -1, -1], - ["Arial Narrow", 14, 0, 17, 0, 15, 0, 16, 0], - ["Arial Rounded MT Bold", 19, 0, -1, -1, -1, -1, -1, -1], - ["Arial Unicode MS", 18, 0, -1, -1, -1, -1, -1, -1], - ["Arvo", 23, 0, 22, 0, 20, 0, 21, 0], - ["Asana", 564, 0, -1, -1, -1, -1, -1, -1], - ["Asana Math", 499, 0, -1, -1, -1, -1, -1, -1], - ["ASCW3", 560, 0, -1, -1, -1, -1, -1, -1], - ["Aston-F1", 24, 0, -1, -1, -1, -1, -1, -1], - ["Baskerville Old Face", 25, 0, -1, -1, -1, -1, -1, -1], - ["Batang", 370, 0, -1, -1, -1, -1, -1, -1], - ["BatangChe", 370, 1, -1, -1, -1, -1, -1, -1], - ["Bauhaus 93", 26, 0, -1, -1, -1, -1, -1, -1], - ["Bell MT", 27, 0, 29, 0, 28, 0, -1, -1], - ["Berlin Sans FB", 51, 0, -1, -1, 49, 0, -1, -1], - ["Berlin Sans FB Demi", -1, -1, -1, -1, 50, 0, -1, -1], - ["Bernard MT Condensed", 30, 0, -1, -1, -1, -1, -1, -1], - ["Bickham Script Pro Regular", -1, -1, -1, -1, 63, 0, -1, -1], - ["Blackadder ITC", 223, 0, -1, -1, -1, -1, -1, -1], - ["Bodoni MT", 42, 0, 40, 0, 32, 0, 33, 0], - ["Bodoni MT Black", 35, 0, 34, 0, -1, -1, -1, -1], - ["Bodoni MT Condensed", 39, 0, 38, 0, 36, 0, 37, 0], - ["Bodoni MT Poster Compressed", 41, 0, -1, -1, -1, -1, -1, -1], - ["Book Antiqua", 31, 0, 13, 0, 11, 0, 12, 0], - ["Bookman Old Style", 43, 0, 46, 0, 44, 0, 45, 0], - ["Bookshelf Symbol 7", 62, 0, -1, -1, -1, -1, -1, -1], - ["Bradley Hand ITC", 47, 0, -1, -1, -1, -1, -1, -1], - ["Britannic Bold", 48, 0, -1, -1, -1, -1, -1, -1], - ["Broadway", 52, 0, -1, -1, -1, -1, -1, -1], - ["Browallia New", 53, 0, 55, 0, 54, 0, 60, 0], - ["BrowalliaUPC", 56, 0, 58, 0, 57, 0, 59, 0], - ["Brush Script MT", -1, -1, 61, 0, -1, -1, -1, -1], - ["Calibri", 371, 0, 373, 0, 372, 0, 376, 0], - ["Calibri Light", 109, 0, 110, 0, -1, -1, -1, -1], - ["Californian FB", 66, 0, 65, 0, 64, 0, -1, -1], - ["Calisto MT", 67, 0, 70, 0, 68, 0, 69, 0], - ["Cambria", 71, 0, 73, 0, 72, 0, 74, 0], - ["Cambria Math", 71, 1, -1, -1, -1, -1, -1, -1], - ["Candara", 75, 0, 77, 0, 76, 0, 78, 0], - ["Carlito", 568, 0, 567, 0, 565, 0, 566, 0], - ["Castellar", 79, 0, -1, -1, -1, -1, -1, -1], - ["Centaur", 81, 0, -1, -1, -1, -1, -1, -1], - ["Century", 82, 0, -1, -1, -1, -1, -1, -1], - ["Century Gothic", 200, 0, 203, 0, 201, 0, 202, 0], - ["Century Schoolbook", 80, 0, 306, 0, 304, 0, 305, 0], - ["Chiller", 83, 0, -1, -1, -1, -1, -1, -1], - ["Colonna MT", 84, 0, -1, -1, -1, -1, -1, -1], - ["Comic Sans MS", 377, 0, -1, -1, 378, 0, -1, -1], - ["Consolas", 85, 0, 87, 0, 86, 0, 88, 0], - ["Constantia", 89, 0, 91, 0, 90, 0, 92, 0], - ["Cooper Black", 93, 0, -1, -1, -1, -1, -1, -1], - ["Copperplate Gothic Bold", 94, 0, -1, -1, -1, -1, -1, -1], - ["Copperplate Gothic Light", 95, 0, -1, -1, -1, -1, -1, -1], - ["Corbel", 96, 0, 98, 0, 97, 0, 99, 0], - ["Cordia New", 100, 0, 102, 0, 101, 0, 107, 0], - ["CordiaUPC", 103, 0, 105, 0, 104, 0, 106, 0], - ["Courier New", 379, 0, 382, 0, 380, 0, 381, 0], - ["Cuprum", 114, 0, 113, 0, 111, 0, 112, 0], - ["Curlz MT", 108, 0, -1, -1, -1, -1, -1, -1], - ["Dancing Script", 116, 0, -1, -1, 115, 0, -1, -1], - ["David", 383, 0, -1, -1, 384, 0, -1, -1], - ["David Transparent", 385, 0, -1, -1, -1, -1, -1, -1], - ["DejaVu Math TeX Gyre", 569, 0, -1, -1, -1, -1, -1, -1], - ["DejaVu Sans", 574, 0, 132, 0, 129, 0, 130, 0], - ["DejaVu Sans Condensed", 578, 0, 120, 0, 118, 0, 119, 0], - ["DejaVu Sans Light", 572, 0, -1, -1, -1, -1, -1, -1], - ["DejaVu Sans Mono", 582, 0, 128, 0, 126, 0, 127, 0], - ["DejaVu Serif", 586, 0, 148, 0, 146, 0, 147, 0], - ["DejaVu Serif Condensed", 590, 0, 124, 0, 122, 0, 123, 0], - ["DilleniaUPC", 326, 0, 325, 0, 323, 0, 324, 0], - ["Dingbats", 157, 0, -1, -1, -1, -1, -1, -1], - ["Dotum", 398, 2, -1, -1, -1, -1, -1, -1], - ["DotumChe", 398, 3, -1, -1, -1, -1, -1, -1], - ["Droid Sans", 159, 0, -1, -1, 158, 0, -1, -1], - ["Droid Sans Fallback", 591, 0, -1, -1, -1, -1, -1, -1], - ["Droid Sans Mono", 160, 0, -1, -1, -1, -1, -1, -1], - ["Droid Serif", 164, 0, 163, 0, 161, 0, 162, 0], - ["Edwardian Script ITC", 224, 0, -1, -1, -1, -1, -1, -1], - ["Elephant", 165, 0, 166, 0, -1, -1, -1, -1], - ["Engravers MT", 167, 0, -1, -1, -1, -1, -1, -1], - ["Eras Bold ITC", 168, 0, -1, -1, -1, -1, -1, -1], - ["Eras Demi ITC", 169, 0, -1, -1, -1, -1, -1, -1], - ["Eras Light ITC", 170, 0, -1, -1, -1, -1, -1, -1], - ["Eras Medium ITC", 171, 0, -1, -1, -1, -1, -1, -1], - ["Estrangelo Edessa", 386, 0, -1, -1, -1, -1, -1, -1], - ["EucrosiaUPC", 330, 0, 329, 0, 327, 0, 328, 0], - ["Felix Titling", 172, 0, -1, -1, -1, -1, -1, -1], - ["Fixed Miriam Transparent", 412, 0, -1, -1, -1, -1, -1, -1], - ["FlemishScript BT", 185, 0, -1, -1, -1, -1, -1, -1], - ["FontAwesome", 387, 0, -1, -1, -1, -1, -1, -1], - ["Footlight MT Light", 184, 0, -1, -1, -1, -1, -1, -1], - ["Forte", 173, 0, -1, -1, -1, -1, -1, -1], - ["Franklin Gothic Book", 174, 0, 175, 0, -1, -1, -1, -1], - ["Franklin Gothic Demi", 176, 0, 178, 0, -1, -1, -1, -1], - ["Franklin Gothic Demi Cond", 177, 0, -1, -1, -1, -1, -1, -1], - ["Franklin Gothic Heavy", 179, 0, 180, 0, -1, -1, -1, -1], - ["Franklin Gothic Medium", 388, 0, 389, 0, -1, -1, -1, -1], - ["Franklin Gothic Medium Cond", 181, 0, -1, -1, -1, -1, -1, -1], - ["FrankRuehl", 390, 0, -1, -1, -1, -1, -1, -1], - ["FreeMono", 602, 0, 605, 0, 603, 0, 604, 0], - ["FreeSans", 606, 0, 609, 0, 607, 0, 608, 0], - ["FreeSerif", 610, 0, 613, 0, 611, 0, 612, 0], - ["FreesiaUPC", 334, 0, 333, 0, 331, 0, 332, 0], - ["Freestyle Script", 182, 0, -1, -1, -1, -1, -1, -1], - ["French Script MT", 183, 0, -1, -1, -1, -1, -1, -1], - ["Gabriola", 186, 0, -1, -1, -1, -1, -1, -1], - ["Garamond", 187, 0, 189, 0, 188, 0, -1, -1], - ["Gautami", 391, 0, -1, -1, -1, -1, -1, -1], - ["Gentium Basic", 211, 0, 210, 0, 208, 0, 209, 0], - ["Gentium Book Basic", 215, 0, 214, 0, 212, 0, 213, 0], - ["Georgia", 392, 0, 394, 0, 393, 0, 395, 0], - ["Gigi", 190, 0, -1, -1, -1, -1, -1, -1], - ["Gill Sans MT", 197, 0, 194, 0, 192, 0, 191, 0], - ["Gill Sans MT Condensed", 193, 0, -1, -1, -1, -1, -1, -1], - ["Gill Sans MT Ext Condensed Bold", 199, 0, -1, -1, -1, -1, -1, -1], - ["Gill Sans Ultra Bold", 196, 0, -1, -1, -1, -1, -1, -1], - ["Gill Sans Ultra Bold Condensed", 195, 0, -1, -1, -1, -1, -1, -1], - ["Gloucester MT Extra Condensed", 198, 0, -1, -1, -1, -1, -1, -1], - ["GOST type A", 396, 0, -1, -1, -1, -1, -1, -1], - ["GOST type B", 397, 0, -1, -1, -1, -1, -1, -1], - ["Goudy Old Style", 204, 0, 206, 0, 205, 0, -1, -1], - ["Goudy Stout", 207, 0, -1, -1, -1, -1, -1, -1], - ["Gulim", 398, 0, -1, -1, -1, -1, -1, -1], - ["GulimChe", 398, 1, -1, -1, -1, -1, -1, -1], - ["Gungsuh", 370, 2, -1, -1, -1, -1, -1, -1], - ["GungsuhChe", 370, 3, -1, -1, -1, -1, -1, -1], - ["Haettenschweiler", 218, 0, -1, -1, -1, -1, -1, -1], - ["Harlow Solid Italic", -1, -1, 216, 0, -1, -1, -1, -1], - ["Harrington", 217, 0, -1, -1, -1, -1, -1, -1], - ["High Tower Text", 219, 0, 220, 0, -1, -1, -1, -1], - ["Impact", 399, 0, -1, -1, -1, -1, -1, -1], - ["Imprint MT Shadow", 221, 0, -1, -1, -1, -1, -1, -1], - ["Informal Roman", 222, 0, -1, -1, -1, -1, -1, -1], - ["IrisUPC", 338, 0, 337, 0, 335, 0, 336, 0], - ["Jamrul", 592, 0, -1, -1, -1, -1, -1, -1], - ["JasmineUPC", 342, 0, 341, 0, 339, 0, 340, 0], - ["Jokerman", 226, 0, -1, -1, -1, -1, -1, -1], - ["Juice ITC", 227, 0, -1, -1, -1, -1, -1, -1], - ["KacstArt", 616, 0, -1, -1, -1, -1, -1, -1], - ["KacstBook", 617, 0, -1, -1, -1, -1, -1, -1], - ["KacstDecorative", 618, 0, -1, -1, -1, -1, -1, -1], - ["KacstDigital", 619, 0, -1, -1, -1, -1, -1, -1], - ["KacstFarsi", 620, 0, -1, -1, -1, -1, -1, -1], - ["KacstLetter", 621, 0, -1, -1, -1, -1, -1, -1], - ["KacstNaskh", 622, 0, -1, -1, -1, -1, -1, -1], - ["KacstOffice", 623, 0, -1, -1, -1, -1, -1, -1], - ["KacstOne", 615, 0, -1, -1, 614, 0, -1, -1], - ["KacstPen", 624, 0, -1, -1, -1, -1, -1, -1], - ["KacstPoster", 625, 0, -1, -1, -1, -1, -1, -1], - ["KacstQurn", 626, 0, -1, -1, -1, -1, -1, -1], - ["KacstScreen", 627, 0, -1, -1, -1, -1, -1, -1], - ["KacstTitle", 628, 0, -1, -1, -1, -1, -1, -1], - ["KacstTitleL", 629, 0, -1, -1, -1, -1, -1, -1], - ["Kartika", 400, 0, -1, -1, -1, -1, -1, -1], - ["Khmer OS", 729, 0, -1, -1, -1, -1, -1, -1], - ["Khmer OS System", 730, 0, -1, -1, -1, -1, -1, -1], - ["KodchiangUPC", 346, 0, 345, 0, 343, 0, 344, 0], - ["Kristen ITC", 225, 0, -1, -1, -1, -1, -1, -1], - ["Kunstler Script", 228, 0, -1, -1, -1, -1, -1, -1], - ["Latha", 402, 0, -1, -1, -1, -1, -1, -1], - ["Levenim MT", 404, 0, -1, -1, 405, 0, -1, -1], - ["Liberation Mono", 486, 0, 485, 0, 483, 0, 484, 0], - ["Liberation Sans", 490, 0, 489, 0, 487, 0, 488, 0], - ["Liberation Sans Narrow", 494, 0, 493, 0, 491, 0, 492, 0], - ["Liberation Serif", 498, 0, 497, 0, 495, 0, 496, 0], - ["Likhan", 593, 0, -1, -1, -1, -1, -1, -1], - ["LilyUPC", 350, 0, 349, 0, 347, 0, 348, 0], - ["Lobster", 248, 0, -1, -1, -1, -1, -1, -1], - ["Lobster Two", 252, 0, 251, 0, 249, 0, 250, 0], - ["Lohit Assamese", 647, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Bengali", 648, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Devanagari", 649, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Gujarati", 650, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Gurmukhi", 654, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Kannada", 651, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Malayalam", 652, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Odia", 653, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Tamil", 656, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Tamil Classical", 655, 0, -1, -1, -1, -1, -1, -1], - ["Lohit Telugu", 657, 0, -1, -1, -1, -1, -1, -1], - ["Lucida Bright", 230, 0, 233, 0, 231, 0, 232, 0], - ["Lucida Calligraphy", 234, 0, -1, -1, -1, -1, -1, -1], - ["Lucida Console", 403, 0, -1, -1, -1, -1, -1, -1], - ["Lucida Fax", 235, 0, 238, 0, 236, 0, 237, 0], - ["Lucida Handwriting", 239, 0, -1, -1, -1, -1, -1, -1], - ["Lucida Sans", 240, 0, 243, 0, 241, 0, 242, 0], - ["Lucida Sans Typewriter", 244, 0, 247, 0, 245, 0, 246, 0], - ["Lucida Sans Unicode", 401, 0, -1, -1, -1, -1, -1, -1], - ["Magneto", -1, -1, -1, -1, 253, 0, -1, -1], - ["Maiandra GD", 254, 0, -1, -1, -1, -1, -1, -1], - ["Mangal", 406, 0, -1, -1, -1, -1, -1, -1], - ["Marlett", 407, 0, -1, -1, -1, -1, -1, -1], - ["Matura MT Script Capitals", 255, 0, -1, -1, -1, -1, -1, -1], - ["Meiryo", 256, 0, 256, 1, 257, 0, 257, 1], - ["Meiryo UI", 256, 2, 256, 3, 257, 2, 257, 3], - ["Microsoft Sans Serif", 408, 0, -1, -1, -1, -1, -1, -1], - ["MingLiU", 409, 0, -1, -1, -1, -1, -1, -1], - ["Miriam", 410, 0, -1, -1, -1, -1, -1, -1], - ["Miriam Fixed", 411, 0, -1, -1, -1, -1, -1, -1], - ["Miriam Transparent", 413, 0, -1, -1, -1, -1, -1, -1], - ["Mistral", 258, 0, -1, -1, -1, -1, -1, -1], - ["Mitra Mono", 597, 0, -1, -1, -1, -1, -1, -1], - ["Modern No. 20", 259, 0, -1, -1, -1, -1, -1, -1], - ["Monotype Corsiva", -1, -1, 260, 0, -1, -1, -1, -1], - ["mry_KacstQurn", 630, 0, -1, -1, -1, -1, -1, -1], - ["MS Gothic", 414, 0, -1, -1, -1, -1, -1, -1], - ["MS Mincho", 416, 0, -1, -1, -1, -1, -1, -1], - ["MS Outlook", 266, 0, -1, -1, -1, -1, -1, -1], - ["MS PGothic", 414, 2, -1, -1, -1, -1, -1, -1], - ["MS PMincho", 416, 1, -1, -1, -1, -1, -1, -1], - ["MS Reference Sans Serif", 295, 0, -1, -1, -1, -1, -1, -1], - ["MS Reference Specialty", 296, 0, -1, -1, -1, -1, -1, -1], - ["MS UI Gothic", 414, 1, -1, -1, -1, -1, -1, -1], - ["Mukti Narrow", 594, 0, -1, -1, 595, 0, -1, -1], - ["MV Boli", 417, 0, -1, -1, -1, -1, -1, -1], - ["NanumBarunGothic", 658, 0, -1, -1, 659, 0, -1, -1], - ["NanumGothic", 660, 0, -1, -1, 661, 0, -1, -1], - ["NanumMyeongjo", 662, 0, -1, -1, -1, -1, -1, -1], - ["NanumSquare", 665, 0, -1, -1, -1, -1, -1, -1], - ["NanumSquare Bold", 664, 0, -1, -1, -1, -1, -1, -1], - ["Narkisim", 419, 0, -1, -1, -1, -1, -1, -1], - ["Niagara Engraved", 261, 0, -1, -1, -1, -1, -1, -1], - ["Niagara Solid", 262, 0, -1, -1, -1, -1, -1, -1], - ["Nirmala UI", 418, 0, -1, -1, -1, -1, -1, -1], - ["Noto Emoji", 666, 0, -1, -1, -1, -1, -1, -1], - ["Noto Naskh Arabic", 668, 0, -1, -1, 667, 0, -1, -1], - ["Noto Naskh Arabic UI", 670, 0, -1, -1, 669, 0, -1, -1], - ["Noto Sans Adlam Unjoined", 671, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans AnatoHiero", 672, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Avestan", 673, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Bamum", 674, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Brahmi", 675, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Buginese", 676, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Canadian Aboriginal", 677, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Chakma", 678, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Cuneiform", 679, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Cypriot", 680, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans EgyptHiero", 681, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Glagolitic", 682, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans ImpAramaic", 683, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans InsPahlavi", 684, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans InsParthi", 685, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Javanese", 686, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Kaithi", 687, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Kayah Li", 688, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Kharoshthi", 689, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans KR", 709, 0, -1, -1, 706, 0, -1, -1], - ["Noto Sans KR Black", 705, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans KR Light", 707, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans KR Medium", 708, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans KR Thin", 710, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Limbu", 690, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Lydian", 691, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Mongolian", 692, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans NewTaiLue", 693, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Osage", 694, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Osmanya", 695, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Phoenician", 696, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Rejang", 697, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Tagalog", 698, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Tagbanwa", 699, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Tai Le", 700, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Tai Tham", 701, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Tamil", 702, 0, -1, -1, -1, -1, -1, -1], - ["Noto Sans Yi", 703, 0, -1, -1, -1, -1, -1, -1], - ["Noto Serif Sinhala", 704, 0, -1, -1, -1, -1, -1, -1], - ["NSimSun", 446, 1, -1, -1, -1, -1, -1, -1], - ["OCR A Extended", 263, 0, -1, -1, -1, -1, -1, -1], - ["Old English Text MT", 264, 0, -1, -1, -1, -1, -1, -1], - ["Onyx", 265, 0, -1, -1, -1, -1, -1, -1], - ["Open Sans", 273, 0, 272, 0, 267, 0, 268, 0], - ["Open Sans Condensed", -1, -1, -1, -1, 269, 0, -1, -1], - ["Open Sans Condensed Light", 270, 0, 271, 0, -1, -1, -1, -1], - ["Open Sans Extrabold", 713, 0, -1, -1, -1, -1, -1, -1], - ["Open Sans Light", 714, 0, -1, -1, -1, -1, -1, -1], - ["Open Sans Semibold", 716, 0, -1, -1, -1, -1, -1, -1], - ["OpenSymbol", 420, 0, -1, -1, -1, -1, -1, -1], - ["Oswald", 275, 0, -1, -1, 274, 0, -1, -1], - ["Pacifico", 292, 0, -1, -1, -1, -1, -1, -1], - ["Padauk", 720, 0, -1, -1, 717, 0, -1, -1], - ["Padauk Book", 718, 0, -1, -1, 719, 0, -1, -1], - ["padmaa", 599, 0, -1, -1, -1, -1, -1, -1], - ["Palace Script MT", -1, -1, 276, 0, -1, -1, -1, -1], - ["Palatino Linotype", 421, 0, 424, 0, 422, 0, 423, 0], - ["Papyrus", 277, 0, -1, -1, -1, -1, -1, -1], - ["Parchment", 278, 0, -1, -1, -1, -1, -1, -1], - ["Perpetua", 284, 0, 281, 0, 280, 0, 279, 0], - ["Perpetua Titling MT", 283, 0, -1, -1, 282, 0, -1, -1], - ["Playbill", 285, 0, -1, -1, -1, -1, -1, -1], - ["PMingLiU", 409, 1, -1, -1, -1, -1, -1, -1], - ["Poor Richard", 286, 0, -1, -1, -1, -1, -1, -1], - ["Pothana2000", 600, 0, -1, -1, -1, -1, -1, -1], - ["Pristina", 287, 0, -1, -1, -1, -1, -1, -1], - ["PT Sans", 291, 0, 290, 0, 288, 0, 289, 0], - ["Raavi", 425, 0, -1, -1, -1, -1, -1, -1], - ["Rage Italic", 293, 0, -1, -1, -1, -1, -1, -1], - ["Ravie", 294, 0, -1, -1, -1, -1, -1, -1], - ["Rekha", 598, 0, -1, -1, -1, -1, -1, -1], - ["Rockwell", 299, 0, 303, 0, 300, 0, 301, 0], - ["Rockwell Condensed", 298, 0, -1, -1, 297, 0, -1, -1], - ["Rockwell Extra Bold", 302, 0, -1, -1, -1, -1, -1, -1], - ["Rod", 426, 0, -1, -1, -1, -1, -1, -1], - ["Rod Transparent", 427, 0, -1, -1, -1, -1, -1, -1], - ["Samyak Devanagari", 724, 0, -1, -1, -1, -1, -1, -1], - ["Samyak Gujarati", 721, 0, -1, -1, -1, -1, -1, -1], - ["Samyak Malayalam", 722, 0, -1, -1, -1, -1, -1, -1], - ["Samyak Tamil", 723, 0, -1, -1, -1, -1, -1, -1], - ["Script MT Bold", 307, 0, -1, -1, -1, -1, -1, -1], - ["Segoe UI", 308, 0, 310, 0, 309, 0, 311, 0], - ["Segoe UI Black", 434, 0, 435, 0, -1, -1, -1, -1], - ["Segoe UI Light", 431, 0, 436, 0, -1, -1, -1, -1], - ["Segoe UI Semibold", 437, 0, 438, 0, -1, -1, -1, -1], - ["Segoe UI Semilight", 432, 0, 439, 0, -1, -1, -1, -1], - ["Segoe UI Symbol", 440, 0, -1, -1, -1, -1, -1, -1], - ["Showcard Gothic", 312, 0, -1, -1, -1, -1, -1, -1], - ["Shruti", 441, 0, -1, -1, -1, -1, -1, -1], - ["SimHei", 442, 0, -1, -1, -1, -1, -1, -1], - ["Simplified Arabic", 445, 0, -1, -1, 443, 0, -1, -1], - ["Simplified Arabic Fixed", 444, 0, -1, -1, -1, -1, -1, -1], - ["SimSun", 446, 0, -1, -1, -1, -1, -1, -1], - ["SimSun-PUA", 446, 2, -1, -1, -1, -1, -1, -1], - ["Snap ITC", 313, 0, -1, -1, -1, -1, -1, -1], - ["Stencil", 314, 0, -1, -1, -1, -1, -1, -1], - ["Sylfaen", 447, 0, -1, -1, -1, -1, -1, -1], - ["Symbol", 448, 0, -1, -1, -1, -1, -1, -1], - ["Symbola", 562, 0, -1, -1, -1, -1, -1, -1], - ["Tahoma", 449, 0, -1, -1, 450, 0, -1, -1], - ["TakaoExGothic", 725, 0, -1, -1, -1, -1, -1, -1], - ["TakaoGothic", 726, 0, -1, -1, -1, -1, -1, -1], - ["TakaoPGothic", 727, 0, -1, -1, -1, -1, -1, -1], - ["Tall Paul", 451, 0, -1, -1, -1, -1, -1, -1], - ["Tempus Sans ITC", 322, 0, -1, -1, -1, -1, -1, -1], - ["Tibetan Machine Uni", 728, 0, -1, -1, -1, -1, -1, -1], - ["Times New Roman", 452, 0, 455, 0, 453, 0, 454, 0], - ["Traditional Arabic", 457, 0, -1, -1, 456, 0, -1, -1], - ["Trebuchet MS", 458, 0, 461, 0, 459, 0, 460, 0], - ["Tunga", 500, 0, -1, -1, -1, -1, -1, -1], - ["Tw Cen MT", 321, 0, 320, 0, 316, 0, 315, 0], - ["Tw Cen MT Condensed", 319, 0, -1, -1, 317, 0, -1, -1], - ["Tw Cen MT Condensed Extra Bold", 318, 0, -1, -1, -1, -1, -1, -1], - ["Ubuntu", 354, 0, 353, 0, 351, 0, 352, 0], - ["Ubuntu Condensed", 355, 0, -1, -1, -1, -1, -1, -1], - ["Ubuntu Light", 734, 0, 735, 0, 736, 0, 737, 0], - ["Ubuntu Mono", 742, 0, 743, 0, 740, 0, 741, 0], - ["Vemana2000", 601, 0, -1, -1, -1, -1, -1, -1], - ["Verdana", 501, 0, 503, 0, 502, 0, 504, 0], - ["Viner Hand ITC", 356, 0, -1, -1, -1, -1, -1, -1], - ["Vivaldi", -1, -1, 357, 0, -1, -1, -1, -1], - ["Vladimir Script", 358, 0, -1, -1, -1, -1, -1, -1], - ["Vrinda", 505, 0, -1, -1, -1, -1, -1, -1], - ["Webdings", 506, 0, -1, -1, -1, -1, -1, -1], - ["WenQuanYi Zen Hei", 744, 0, -1, -1, -1, -1, -1, -1], - ["WenQuanYi Zen Hei Mono", 744, 1, -1, -1, -1, -1, -1, -1], - ["WenQuanYi Zen Hei Sharp", 744, 2, -1, -1, -1, -1, -1, -1], - ["Wide Latin", 229, 0, -1, -1, -1, -1, -1, -1], - ["Wingdings", 507, 0, -1, -1, -1, -1, -1, -1], - ["Wingdings 2", 359, 0, -1, -1, -1, -1, -1, -1], - ["Wingdings 3", 360, 0, -1, -1, -1, -1, -1, -1], -]; - -window["__fonts_ranges"] = [ - 0, 31, 25, 32, 126, 14, 127, 127, 334, 128, 383, 14, 384, 460, 348, 461, 476, - 14, 477, 887, 348, 890, 893, 348, 894, 894, 14, 895, 895, 348, 898, 898, 21, - 900, 906, 14, 908, 908, 14, 910, 929, 14, 931, 974, 14, 975, 1024, 348, 1025, - 1036, 14, 1037, 1037, 348, 1038, 1103, 14, 1104, 1104, 348, 1105, 1116, 14, - 1117, 1327, 348, 1329, 1366, 348, 1369, 1375, 348, 1377, 1415, 348, 1417, - 1418, 348, 1421, 1423, 348, 1425, 1479, 348, 1488, 1514, 14, 1520, 1524, 14, - 1525, 1525, 316, 1536, 1564, 341, 1566, 1791, 341, 1792, 1805, 99, 1807, 1836, - 99, 1840, 1866, 99, 1872, 1919, 341, 1920, 1969, 229, 2208, 2228, 341, 2230, - 2237, 341, 2260, 2303, 341, 2304, 2361, 238, 2362, 2363, 186, 2364, 2381, 238, - 2382, 2391, 186, 2392, 2418, 238, 2419, 2431, 186, 2432, 2432, 185, 2433, - 2435, 238, 2437, 2444, 238, 2447, 2448, 238, 2451, 2472, 238, 2474, 2480, 238, - 2482, 2482, 238, 2486, 2489, 238, 2492, 2500, 238, 2503, 2504, 238, 2507, - 2510, 238, 2519, 2519, 238, 2524, 2525, 238, 2527, 2531, 238, 2534, 2555, 238, - 2561, 2563, 238, 2565, 2570, 238, 2575, 2576, 238, 2579, 2600, 238, 2602, - 2608, 238, 2610, 2611, 238, 2613, 2614, 238, 2616, 2617, 238, 2620, 2620, 238, - 2622, 2626, 238, 2631, 2632, 238, 2635, 2637, 238, 2641, 2641, 238, 2649, - 2652, 238, 2654, 2654, 238, 2662, 2677, 238, 2689, 2706, 312, 2707, 2728, 238, - 2729, 2787, 312, 2788, 2801, 296, 2817, 2819, 238, 2821, 2828, 238, 2831, - 2832, 238, 2835, 2856, 238, 2858, 2864, 238, 2866, 2867, 238, 2869, 2873, 238, - 2876, 2884, 238, 2887, 2888, 238, 2891, 2893, 238, 2902, 2903, 238, 2908, - 2909, 238, 2911, 2915, 238, 2918, 2929, 238, 2930, 2935, 191, 2946, 2947, 238, - 2949, 2954, 238, 2958, 2960, 238, 2962, 2965, 238, 2969, 2970, 238, 2972, - 2972, 238, 2974, 2975, 238, 2979, 2980, 238, 2984, 2986, 238, 2990, 3001, 238, - 3006, 3010, 238, 3014, 3016, 238, 3018, 3021, 238, 3024, 3024, 238, 3031, - 3031, 238, 3046, 3066, 238, 3072, 3072, 194, 3073, 3075, 238, 3077, 3084, 238, - 3086, 3088, 238, 3090, 3112, 238, 3114, 3129, 194, 3133, 3140, 238, 3142, - 3144, 238, 3146, 3149, 238, 3157, 3158, 238, 3160, 3161, 238, 3162, 3162, 194, - 3168, 3171, 238, 3174, 3183, 238, 3185, 3185, 306, 3192, 3199, 238, 3202, - 3203, 238, 3205, 3212, 238, 3214, 3216, 238, 3218, 3240, 238, 3242, 3251, 238, - 3253, 3257, 238, 3260, 3268, 238, 3270, 3272, 238, 3274, 3277, 238, 3285, - 3286, 238, 3294, 3294, 238, 3296, 3299, 238, 3302, 3311, 238, 3313, 3314, 238, - 3330, 3331, 238, 3333, 3340, 238, 3342, 3344, 238, 3346, 3386, 238, 3389, - 3396, 238, 3398, 3400, 238, 3402, 3406, 238, 3415, 3415, 238, 3424, 3427, 238, - 3430, 3445, 238, 3449, 3455, 238, 3458, 3459, 238, 3461, 3478, 238, 3482, - 3505, 238, 3507, 3515, 238, 3517, 3517, 238, 3520, 3526, 238, 3530, 3530, 238, - 3535, 3540, 238, 3542, 3542, 238, 3544, 3551, 238, 3558, 3567, 280, 3570, - 3572, 238, 3584, 3584, 181, 3585, 3642, 341, 3647, 3675, 341, 3713, 3714, 78, - 3716, 3716, 78, 3719, 3720, 78, 3722, 3722, 78, 3725, 3725, 78, 3732, 3735, - 78, 3737, 3743, 78, 3745, 3747, 78, 3749, 3749, 78, 3751, 3751, 78, 3754, - 3755, 78, 3757, 3769, 78, 3771, 3773, 78, 3776, 3780, 78, 3782, 3782, 78, - 3784, 3789, 78, 3792, 3801, 78, 3804, 3805, 78, 3840, 3948, 347, 3953, 3979, - 347, 3984, 3991, 347, 3993, 4028, 347, 4030, 4044, 347, 4046, 4056, 347, 4096, - 4255, 294, 4256, 4293, 78, 4295, 4295, 327, 4301, 4301, 327, 4304, 4348, 78, - 4349, 4351, 327, 4352, 4601, 25, 4602, 4607, 265, 4608, 4680, 0, 4682, 4685, - 0, 4688, 4694, 0, 4696, 4696, 0, 4698, 4701, 0, 4704, 4744, 0, 4746, 4749, 0, - 4752, 4784, 0, 4786, 4789, 0, 4792, 4798, 0, 4800, 4800, 0, 4802, 4805, 0, - 4808, 4822, 0, 4824, 4880, 0, 4882, 4885, 0, 4888, 4954, 0, 4957, 4988, 0, - 4992, 5017, 0, 5024, 5108, 21, 5120, 5128, 248, 5129, 5147, 78, 5148, 5148, - 248, 5149, 5173, 78, 5174, 5174, 248, 5175, 5194, 78, 5195, 5203, 248, 5204, - 5309, 78, 5310, 5311, 248, 5312, 5354, 78, 5355, 5355, 248, 5356, 5383, 78, - 5384, 5391, 248, 5392, 5438, 78, 5439, 5439, 248, 5440, 5456, 78, 5457, 5457, - 248, 5458, 5482, 78, 5483, 5491, 248, 5492, 5509, 78, 5510, 5513, 248, 5514, - 5526, 78, 5527, 5535, 248, 5536, 5551, 78, 5552, 5759, 248, 5760, 5788, 80, - 5888, 5900, 274, 5902, 5908, 274, 5941, 5942, 275, 5984, 5996, 275, 5998, - 6000, 275, 6002, 6003, 275, 6016, 6109, 169, 6112, 6121, 169, 6128, 6137, 169, - 6144, 6158, 268, 6160, 6169, 268, 6176, 6263, 268, 6272, 6314, 268, 6320, - 6389, 248, 6400, 6428, 266, 6432, 6443, 266, 6448, 6459, 266, 6464, 6464, 266, - 6468, 6479, 266, 6480, 6509, 276, 6512, 6516, 276, 6528, 6571, 269, 6576, - 6601, 269, 6608, 6618, 269, 6622, 6623, 269, 6624, 6655, 169, 6656, 6683, 247, - 6686, 6687, 247, 6688, 6750, 277, 6752, 6780, 277, 6783, 6793, 277, 6800, - 6809, 277, 6816, 6829, 277, 6832, 6846, 340, 7248, 7295, 238, 7296, 7304, 340, - 7386, 7386, 278, 7413, 7414, 186, 7424, 7626, 348, 7627, 7673, 340, 7675, - 7677, 340, 7678, 7839, 348, 7840, 7929, 14, 7930, 7957, 348, 7960, 7965, 348, - 7968, 8005, 348, 8008, 8013, 348, 8016, 8023, 348, 8025, 8025, 348, 8027, - 8027, 348, 8029, 8029, 348, 8031, 8061, 348, 8064, 8116, 348, 8118, 8132, 348, - 8134, 8147, 348, 8150, 8155, 348, 8157, 8175, 348, 8178, 8180, 348, 8182, - 8190, 348, 8192, 8292, 348, 8294, 8305, 348, 8308, 8334, 348, 8335, 8335, 54, - 8336, 8348, 348, 8352, 8383, 348, 8384, 8399, 308, 8400, 8431, 21, 8432, 8432, - 115, 8448, 8587, 348, 8592, 8977, 78, 8978, 8981, 81, 8982, 9002, 52, 9003, - 9007, 328, 9008, 9114, 52, 9115, 9134, 78, 9135, 9135, 21, 9136, 9149, 52, - 9150, 9164, 220, 9165, 9167, 52, 9168, 9210, 328, 9211, 9215, 340, 9216, 9252, - 202, 9253, 9254, 328, 9280, 9290, 328, 9312, 9331, 51, 9332, 9371, 334, 9372, - 9449, 220, 9450, 9460, 51, 9461, 9470, 220, 9471, 9471, 328, 9472, 9547, 334, - 9548, 9551, 220, 9552, 9580, 14, 9581, 9587, 334, 9588, 9599, 220, 9600, 9672, - 78, 9673, 9673, 22, 9674, 9674, 78, 9675, 9675, 22, 9676, 9743, 78, 9744, - 9745, 22, 9746, 9884, 78, 9885, 9887, 328, 9888, 9912, 78, 9913, 9995, 328, - 9996, 10023, 78, 10024, 10024, 328, 10025, 10059, 78, 10060, 10080, 328, - 10081, 10132, 78, 10133, 10135, 328, 10136, 10159, 78, 10160, 10160, 328, - 10161, 10174, 78, 10175, 10175, 328, 10176, 10186, 21, 10187, 10189, 340, - 10190, 10223, 21, 10224, 10495, 78, 10496, 10623, 82, 10624, 10763, 21, 10764, - 10780, 78, 10781, 10876, 21, 10877, 10912, 78, 10913, 10925, 21, 10926, 10938, - 78, 10939, 11007, 21, 11008, 11034, 78, 11035, 11055, 328, 11056, 11084, 21, - 11085, 11123, 328, 11126, 11157, 328, 11160, 11193, 328, 11197, 11208, 328, - 11210, 11217, 328, 11218, 11218, 340, 11244, 11247, 328, 11264, 11310, 253, - 11312, 11358, 253, 11360, 11391, 348, 11392, 11507, 328, 11513, 11519, 328, - 11520, 11557, 82, 11559, 11559, 327, 11565, 11565, 327, 11568, 11621, 115, - 11631, 11631, 115, 11648, 11670, 0, 11680, 11686, 0, 11688, 11694, 0, 11696, - 11702, 0, 11704, 11710, 0, 11712, 11718, 0, 11720, 11726, 0, 11728, 11734, 0, - 11736, 11742, 0, 11744, 11775, 327, 11776, 11842, 348, 11843, 11844, 341, - 11845, 11849, 340, 11904, 11929, 265, 11931, 12019, 265, 12032, 12245, 208, - 12272, 12283, 334, 12288, 12292, 220, 12293, 12311, 334, 12312, 12320, 220, - 12321, 12351, 265, 12353, 12435, 334, 12436, 12438, 220, 12439, 12440, 366, - 12441, 12448, 220, 12449, 12534, 334, 12535, 12543, 220, 12549, 12585, 334, - 12586, 12591, 265, 12593, 12686, 25, 12688, 12689, 208, 12690, 12703, 304, - 12704, 12731, 265, 12736, 12771, 265, 12784, 12799, 220, 12800, 12828, 25, - 12829, 12830, 265, 12832, 12867, 220, 12868, 12879, 328, 12880, 12880, 265, - 12881, 12895, 220, 12896, 12923, 25, 12924, 12927, 265, 12928, 13003, 220, - 13004, 13007, 265, 13008, 13054, 220, 13055, 13055, 265, 13056, 13174, 220, - 13175, 13178, 265, 13179, 13277, 220, 13278, 13279, 265, 13280, 13310, 220, - 13311, 13311, 265, 13312, 19893, 89, 19904, 19967, 78, 19968, 40869, 334, - 40870, 40907, 366, 40960, 42124, 279, 42128, 42182, 279, 42183, 42191, 232, - 42192, 42202, 324, 42203, 42239, 47, 42401, 42410, 232, 42416, 42425, 232, - 42433, 42456, 232, 42465, 42488, 232, 42560, 42653, 47, 42654, 42655, 340, - 42656, 42743, 245, 42760, 42774, 78, 42775, 42926, 348, 42927, 42991, 232, - 42999, 43007, 348, 43056, 43065, 238, 43169, 43172, 232, 43174, 43174, 232, - 43176, 43183, 232, 43185, 43231, 232, 43232, 43261, 186, 43262, 43262, 232, - 43264, 43311, 259, 43312, 43347, 273, 43359, 43359, 273, 43360, 43388, 265, - 43392, 43469, 257, 43470, 43470, 232, 43471, 43481, 257, 43482, 43518, 232, - 43616, 43643, 294, 43681, 43763, 232, 43777, 43782, 0, 43785, 43790, 0, 43793, - 43798, 0, 43808, 43814, 0, 43816, 43822, 0, 43824, 43877, 348, 43937, 44022, - 232, 44032, 55203, 25, 55204, 55215, 230, 55216, 55238, 265, 55239, 55242, - 230, 55243, 55291, 265, 55292, 55294, 230, 55457, 55550, 230, 55713, 55806, - 230, 55969, 56062, 230, 56225, 56318, 230, 56481, 56574, 230, 56737, 56830, - 230, 56993, 57086, 230, 57249, 57342, 230, 57344, 57344, 32, 57345, 57363, - 291, 57364, 57367, 32, 57368, 57396, 291, 57397, 57480, 32, 57481, 57496, 291, - 57497, 57508, 32, 57509, 57553, 291, 57554, 57599, 32, 57600, 57681, 291, - 57682, 57855, 32, 57856, 57918, 291, 57919, 57919, 32, 57920, 57953, 291, - 57954, 58124, 32, 58125, 58140, 291, 58141, 58233, 32, 58234, 58246, 0, 58247, - 58383, 32, 58384, 58395, 0, 58396, 58422, 32, 58423, 58462, 291, 58463, 58477, - 32, 58478, 58495, 291, 58496, 58516, 32, 58517, 58564, 291, 58565, 58638, 32, - 58639, 58652, 0, 58653, 58668, 291, 58670, 58675, 291, 58676, 58676, 10, - 58679, 58679, 10, 58681, 58683, 10, 58685, 58686, 10, 58689, 58689, 10, 58691, - 58691, 10, 58696, 58716, 291, 58718, 58719, 291, 58722, 58722, 10, 58726, - 58727, 10, 58729, 58729, 10, 58733, 58734, 10, 58736, 58737, 291, 58738, - 58752, 10, 58754, 58755, 10, 58756, 58759, 291, 58760, 58760, 10, 58763, - 58764, 10, 58765, 58768, 291, 58769, 58770, 10, 58771, 58775, 291, 58776, - 58776, 10, 58778, 58778, 10, 58780, 58784, 10, 58785, 58878, 230, 58880, - 58880, 10, 58882, 58882, 10, 58884, 58884, 10, 58892, 58892, 10, 58895, 58898, - 10, 58905, 58909, 10, 58913, 58913, 10, 58915, 58916, 10, 58919, 58919, 10, - 58921, 58921, 10, 58923, 58923, 10, 58925, 58925, 10, 58930, 58932, 10, 58935, - 58941, 10, 58943, 58946, 10, 58949, 58950, 10, 58952, 58952, 10, 58955, 58955, - 10, 58958, 58959, 10, 58961, 58965, 10, 58967, 58969, 10, 58973, 58976, 10, - 58978, 58984, 10, 58986, 58986, 10, 58990, 58991, 10, 58993, 58993, 10, 58997, - 59001, 10, 59003, 59005, 10, 59007, 59007, 10, 59008, 59043, 291, 59044, - 59134, 230, 59135, 59138, 10, 59142, 59143, 10, 59145, 59146, 10, 59148, - 59148, 10, 59152, 59155, 10, 59158, 59163, 10, 59165, 59165, 10, 59172, 59174, - 10, 59179, 59179, 10, 59182, 59184, 10, 59187, 59192, 10, 59194, 59197, 10, - 59200, 59202, 10, 59204, 59204, 10, 59207, 59207, 10, 59209, 59209, 10, 59212, - 59215, 10, 59217, 59218, 10, 59227, 59229, 10, 59231, 59234, 10, 59236, 59237, - 10, 59239, 59241, 10, 59244, 59246, 10, 59248, 59248, 10, 59253, 59256, 10, - 59258, 59258, 10, 59260, 59262, 10, 59264, 59264, 10, 59268, 59268, 10, 59270, - 59270, 10, 59273, 59273, 10, 59275, 59275, 10, 59277, 59286, 9, 59287, 59287, - 10, 59289, 59289, 10, 59297, 59366, 230, 59367, 59379, 331, 59380, 59390, 230, - 59391, 59392, 10, 59393, 59397, 14, 59398, 59398, 10, 59400, 59400, 10, 59404, - 59404, 10, 59406, 59407, 10, 59409, 59412, 349, 59413, 59492, 331, 59493, - 59495, 10, 59497, 59501, 10, 59505, 59505, 10, 59510, 59510, 10, 59512, 59512, - 10, 59517, 59520, 10, 59527, 59527, 10, 59534, 59535, 10, 59536, 59536, 18, - 59537, 59538, 10, 59540, 59541, 10, 59545, 59549, 10, 59552, 59552, 10, 59553, - 59646, 230, 59648, 59649, 10, 59651, 59651, 10, 59654, 59656, 10, 59659, - 59660, 10, 59662, 59666, 10, 59669, 59669, 10, 59671, 59672, 10, 59675, 59676, - 10, 59678, 59682, 10, 59685, 59692, 10, 59694, 59695, 10, 59697, 59702, 10, - 59704, 59704, 10, 59706, 59706, 10, 59708, 59710, 10, 59713, 59713, 10, 59716, - 59718, 10, 59720, 59721, 10, 59725, 59725, 10, 59728, 59728, 10, 59730, 59733, - 10, 59735, 59736, 10, 59738, 59738, 10, 59740, 59742, 10, 59744, 59745, 10, - 59748, 59749, 10, 59751, 59751, 10, 59752, 59752, 318, 59755, 59755, 318, - 59756, 59756, 10, 59758, 59759, 318, 59763, 59765, 10, 59767, 59771, 10, - 59773, 59773, 10, 59777, 59778, 10, 59780, 59783, 318, 59786, 59786, 10, - 59789, 59790, 10, 59792, 59792, 318, 59793, 59793, 10, 59795, 59795, 318, - 59796, 59796, 10, 59798, 59798, 10, 59804, 59807, 10, 59809, 59902, 230, - 59907, 59907, 10, 59914, 59915, 10, 59919, 59919, 10, 59923, 59923, 10, 59925, - 59925, 10, 59931, 59931, 10, 59937, 59937, 10, 59946, 59946, 10, 59953, 59953, - 10, 59957, 59957, 10, 59964, 59965, 10, 59971, 59971, 10, 59980, 59980, 10, - 59983, 59983, 10, 59991, 59991, 10, 60003, 60003, 10, 60006, 60006, 10, 60021, - 60022, 10, 60029, 60029, 10, 60034, 60034, 10, 60037, 60037, 10, 60039, 60039, - 10, 60041, 60041, 10, 60045, 60045, 10, 60048, 60048, 10, 60059, 60059, 10, - 60061, 60061, 10, 60065, 60158, 230, 60159, 60160, 10, 60162, 60165, 10, - 60168, 60175, 10, 60177, 60178, 10, 60181, 60181, 10, 60183, 60189, 10, 60191, - 60193, 10, 60195, 60195, 10, 60197, 60197, 10, 60199, 60199, 10, 60202, 60202, - 10, 60204, 60217, 10, 60221, 60223, 10, 60225, 60225, 10, 60227, 60228, 10, - 60230, 60230, 10, 60234, 60251, 10, 60253, 60253, 10, 60255, 60259, 10, 60261, - 60267, 10, 60269, 60269, 10, 60271, 60273, 10, 60275, 60276, 10, 60278, 60280, - 10, 60282, 60282, 10, 60286, 60289, 10, 60291, 60293, 10, 60295, 60304, 10, - 60306, 60307, 10, 60309, 60315, 10, 60319, 60320, 10, 60321, 60414, 230, - 60415, 60416, 10, 60419, 60419, 10, 60421, 60422, 10, 60424, 60425, 10, 60427, - 60427, 347, 60428, 60432, 10, 60435, 60436, 10, 60438, 60445, 10, 60448, - 60448, 10, 60450, 60450, 10, 60452, 60452, 10, 60454, 60454, 10, 60458, 60463, - 10, 60465, 60466, 10, 60469, 60469, 10, 60471, 60471, 10, 60475, 60477, 10, - 60479, 60493, 10, 60495, 60495, 10, 60498, 60504, 10, 60506, 60506, 10, 60508, - 60509, 10, 60511, 60515, 10, 60519, 60531, 10, 60533, 60535, 10, 60537, 60537, - 10, 60539, 60540, 10, 60542, 60544, 10, 60548, 60548, 10, 60550, 60551, 10, - 60556, 60559, 10, 60561, 60571, 10, 60573, 60573, 347, 60574, 60574, 10, - 60576, 60576, 10, 60577, 60670, 230, 60676, 60677, 10, 60679, 60679, 10, - 60682, 60682, 10, 60684, 60689, 10, 60691, 60691, 10, 60693, 60696, 10, 60698, - 60703, 10, 60706, 60711, 10, 60713, 60714, 10, 60716, 60717, 10, 60723, 60723, - 10, 60727, 60728, 10, 60730, 60731, 10, 60733, 60733, 10, 60737, 60738, 10, - 60740, 60741, 10, 60743, 60744, 10, 60746, 60751, 10, 60753, 60756, 10, 60759, - 60761, 10, 60764, 60767, 10, 60770, 60770, 10, 60772, 60772, 10, 60774, 60774, - 10, 60779, 60779, 10, 60781, 60781, 10, 60783, 60783, 10, 60785, 60786, 10, - 60789, 60789, 10, 60791, 60792, 10, 60794, 60795, 10, 60801, 60801, 10, 60804, - 60806, 10, 60808, 60811, 10, 60814, 60814, 10, 60817, 60817, 10, 60833, 60926, - 230, 60936, 60936, 10, 60945, 60945, 10, 60949, 60949, 10, 60955, 60955, 10, - 60960, 60960, 10, 60962, 60962, 10, 60970, 60970, 10, 60974, 60974, 10, 60976, - 60977, 10, 60980, 60980, 10, 60995, 60995, 10, 60997, 60997, 10, 61000, 61000, - 10, 61002, 61002, 10, 61011, 61011, 10, 61014, 61014, 10, 61017, 61017, 10, - 61019, 61019, 10, 61021, 61021, 10, 61024, 61024, 10, 61028, 61029, 10, 61033, - 61075, 230, 61079, 61079, 10, 61084, 61084, 10, 61087, 61087, 10, 61089, - 61182, 230, 61183, 61183, 10, 61345, 61438, 230, 61440, 61442, 104, 61443, - 61443, 197, 61444, 61471, 14, 61472, 61472, 22, 61473, 61473, 14, 61474, - 61474, 22, 61475, 61489, 14, 61490, 61495, 370, 61496, 61496, 22, 61497, - 61566, 370, 61567, 61567, 226, 61568, 61695, 370, 61696, 61710, 104, 61712, - 61726, 104, 61728, 61742, 104, 61744, 61758, 104, 61760, 61774, 104, 61775, - 61775, 169, 61776, 61790, 104, 61792, 61806, 104, 61808, 61822, 104, 61824, - 61838, 104, 61840, 61854, 104, 61856, 61870, 104, 61871, 61871, 230, 61872, - 61886, 104, 61887, 61887, 230, 61888, 61902, 104, 61903, 61903, 230, 61904, - 61918, 104, 61919, 61919, 230, 61920, 61934, 104, 61935, 61935, 230, 61936, - 61950, 104, 61952, 61966, 104, 61967, 61967, 123, 61968, 61982, 104, 61983, - 61983, 123, 61985, 62014, 104, 62016, 62030, 104, 62032, 62046, 104, 62048, - 62062, 104, 62063, 62063, 10, 62064, 62078, 104, 62079, 62079, 10, 62080, - 62094, 104, 62095, 62095, 10, 62096, 62110, 104, 62112, 62126, 104, 62127, - 62127, 230, 62128, 62142, 104, 62143, 62143, 230, 62144, 62158, 104, 62159, - 62159, 230, 62160, 62174, 104, 62175, 62175, 230, 62176, 62190, 104, 62191, - 62206, 230, 62208, 62208, 347, 62209, 62209, 348, 62210, 62210, 347, 62211, - 62232, 10, 62234, 62234, 347, 62237, 62238, 347, 62241, 62241, 347, 62244, - 62244, 347, 62245, 62245, 10, 62247, 62247, 347, 62250, 62250, 347, 62253, - 62253, 347, 62256, 62256, 347, 62259, 62259, 347, 62262, 62262, 347, 62265, - 62265, 347, 62268, 62268, 347, 62271, 62271, 347, 62274, 62274, 347, 62276, - 62276, 10, 62277, 62277, 347, 62278, 62278, 10, 62280, 62280, 347, 62282, - 62282, 10, 62283, 62283, 347, 62286, 62286, 347, 62292, 62292, 347, 62304, - 62304, 347, 62307, 62307, 347, 62316, 62317, 347, 62323, 62324, 347, 62330, - 62330, 347, 62336, 62336, 347, 62342, 62342, 347, 62348, 62348, 347, 62354, - 62354, 347, 62368, 62368, 10, 62369, 62462, 230, 62464, 62501, 80, 62502, - 62502, 82, 62504, 62504, 82, 62505, 62505, 347, 62507, 62509, 10, 62511, - 62511, 347, 62517, 62517, 347, 62519, 62519, 10, 62521, 62522, 10, 62524, - 62525, 10, 62528, 62528, 10, 62529, 62529, 347, 62530, 62530, 10, 62532, - 62534, 10, 62536, 62539, 10, 62541, 62541, 347, 62542, 62546, 10, 62547, - 62548, 347, 62549, 62551, 10, 62554, 62554, 347, 62555, 62556, 10, 62557, - 62557, 347, 62558, 62559, 10, 62560, 62560, 347, 62561, 62563, 10, 62564, - 62564, 347, 62565, 62565, 10, 62566, 62566, 347, 62568, 62575, 10, 62579, - 62580, 10, 62583, 62583, 10, 62584, 62584, 347, 62585, 62586, 10, 62587, - 62587, 347, 62588, 62589, 10, 62590, 62590, 347, 62592, 62593, 10, 62595, - 62597, 10, 62598, 62601, 308, 62603, 62603, 10, 62605, 62609, 10, 62611, - 62612, 10, 62614, 62616, 10, 62619, 62619, 10, 62620, 62620, 347, 62621, - 62621, 10, 62622, 62623, 308, 62625, 62718, 230, 62719, 62719, 10, 62720, - 62720, 106, 62721, 62725, 10, 62726, 62737, 358, 62738, 62797, 308, 62798, - 62798, 10, 62802, 62802, 347, 62803, 62804, 10, 62806, 62806, 10, 62809, - 62809, 347, 62810, 62810, 10, 62814, 62814, 10, 62821, 62821, 10, 62827, - 62828, 347, 62834, 62834, 10, 62837, 62840, 347, 62841, 62841, 10, 62842, - 62842, 347, 62843, 62843, 10, 62844, 62845, 347, 62848, 62848, 347, 62849, - 62851, 10, 62853, 62853, 347, 62856, 62856, 347, 62859, 62859, 347, 62860, - 62862, 10, 62863, 62864, 347, 62867, 62868, 10, 62870, 62871, 10, 62873, - 62873, 10, 62874, 62880, 347, 62881, 62974, 230, 62975, 62993, 347, 62994, - 62994, 10, 62996, 62996, 10, 62998, 63027, 10, 63028, 63029, 308, 63030, - 63030, 347, 63031, 63031, 10, 63032, 63041, 32, 63042, 63042, 10, 63043, - 63043, 347, 63044, 63044, 10, 63048, 63048, 10, 63052, 63053, 347, 63057, - 63057, 10, 63058, 63058, 347, 63059, 63059, 10, 63061, 63070, 32, 63071, - 63071, 10, 63073, 63073, 32, 63074, 63074, 308, 63075, 63082, 32, 63084, - 63086, 10, 63090, 63090, 347, 63092, 63092, 347, 63093, 63093, 10, 63095, - 63095, 10, 63096, 63096, 347, 63100, 63100, 347, 63102, 63102, 10, 63103, - 63103, 347, 63105, 63105, 347, 63107, 63108, 347, 63112, 63112, 347, 63116, - 63116, 347, 63117, 63117, 10, 63121, 63122, 347, 63124, 63124, 10, 63128, - 63130, 347, 63133, 63133, 347, 63134, 63134, 10, 63137, 63222, 230, 63223, - 63231, 225, 63232, 63261, 181, 63262, 63443, 225, 63444, 63444, 230, 63445, - 63497, 225, 63498, 63511, 358, 63512, 63523, 197, 63524, 63533, 225, 63534, - 63547, 10, 63549, 63549, 230, 63551, 63551, 347, 63552, 63567, 230, 63568, - 63568, 347, 63571, 63571, 347, 63573, 63573, 347, 63577, 63577, 347, 63579, - 63579, 347, 63583, 63584, 347, 63585, 63586, 342, 63588, 63588, 347, 63591, - 63593, 347, 63601, 63601, 347, 63604, 63605, 347, 63608, 63608, 347, 63610, - 63610, 347, 63613, 63613, 347, 63615, 63615, 342, 63633, 63633, 347, 63635, - 63636, 347, 63639, 63640, 347, 63643, 63643, 347, 63649, 63742, 230, 63743, - 63743, 54, 63744, 64011, 25, 64012, 64013, 304, 64014, 64045, 220, 64046, - 64047, 233, 64048, 64109, 220, 64112, 64157, 366, 64158, 64254, 230, 64256, - 64256, 348, 64257, 64258, 14, 64259, 64262, 348, 64275, 64279, 348, 64285, - 64297, 348, 64298, 64310, 14, 64312, 64316, 14, 64318, 64318, 14, 64320, - 64321, 14, 64323, 64324, 14, 64326, 64449, 341, 64450, 64466, 219, 64467, - 64511, 341, 64512, 64712, 240, 64713, 64725, 349, 64726, 64831, 240, 64848, - 64911, 240, 64914, 64967, 240, 64968, 65007, 230, 65008, 65021, 240, 65022, - 65022, 230, 65024, 65039, 78, 65040, 65049, 89, 65056, 65071, 340, 65072, - 65074, 265, 65075, 65092, 334, 65093, 65094, 208, 65095, 65106, 265, 65108, - 65112, 265, 65113, 65126, 334, 65128, 65131, 334, 65136, 65141, 219, 65142, - 65276, 341, 65277, 65279, 220, 65281, 65374, 334, 65375, 65439, 220, 65440, - 65470, 265, 65474, 65479, 265, 65482, 65487, 265, 65490, 65495, 265, 65498, - 65500, 265, 65504, 65509, 334, 65510, 65510, 220, 65512, 65518, 220, 65519, - 65520, 366, 65522, 65533, 187, 65536, 65536, 366, 65792, 65794, 340, 65799, - 65843, 340, 65847, 65934, 340, 65936, 65947, 340, 65952, 65952, 340, 66000, - 66045, 340, 66272, 66299, 340, 66560, 66639, 328, 66688, 66717, 271, 66720, - 66728, 271, 66729, 66729, 272, 66736, 66771, 270, 66776, 66811, 270, 67584, - 67589, 251, 67592, 67592, 251, 67594, 67637, 251, 67639, 67640, 251, 67644, - 67644, 251, 67647, 67647, 251, 67648, 67669, 254, 67671, 67678, 254, 67679, - 67679, 255, 67840, 67867, 272, 67871, 67871, 272, 67872, 67897, 267, 67903, - 67903, 267, 68096, 68099, 260, 68101, 68102, 260, 68108, 68115, 260, 68117, - 68119, 260, 68121, 68147, 260, 68152, 68154, 260, 68159, 68167, 260, 68176, - 68184, 260, 68352, 68405, 244, 68409, 68415, 244, 68416, 68437, 256, 68440, - 68447, 256, 68448, 68466, 255, 68472, 68479, 255, 69632, 69709, 246, 69714, - 69743, 246, 69760, 69825, 258, 69840, 69864, 238, 69872, 69881, 238, 69888, - 69940, 249, 69942, 69955, 249, 70113, 70132, 280, 70403, 70403, 278, 70460, - 70460, 278, 73728, 74649, 250, 74752, 74862, 250, 74864, 74868, 250, 74880, - 75075, 250, 77824, 78894, 252, 82944, 83526, 243, 92160, 92728, 245, 118784, - 119029, 340, 119040, 119078, 328, 119081, 119272, 328, 119296, 119365, 340, - 119552, 119638, 78, 119648, 119665, 340, 119808, 119892, 21, 119894, 119964, - 21, 119966, 119967, 21, 119970, 119970, 21, 119973, 119974, 21, 119975, - 119976, 328, 119977, 119980, 21, 119982, 119993, 21, 119995, 119995, 21, - 119997, 120003, 21, 120005, 120069, 21, 120071, 120074, 21, 120077, 120084, - 21, 120086, 120092, 21, 120094, 120121, 21, 120123, 120126, 78, 120128, - 120132, 78, 120134, 120134, 78, 120138, 120144, 78, 120146, 120171, 78, - 120172, 120485, 21, 120488, 120779, 21, 120782, 120831, 21, 122880, 122886, - 253, 122888, 122904, 253, 122907, 122913, 253, 122915, 122916, 253, 122918, - 122922, 253, 125184, 125258, 242, 125264, 125273, 242, 125278, 125279, 242, - 126976, 127019, 328, 127024, 127123, 328, 127136, 127150, 328, 127153, 127167, - 328, 127169, 127183, 328, 127185, 127221, 328, 127232, 127244, 328, 127248, - 127278, 328, 127279, 127279, 265, 127280, 127337, 328, 127338, 127339, 340, - 127340, 127340, 265, 127344, 127386, 328, 127387, 127404, 340, 127462, 127487, - 239, 127488, 127490, 328, 127504, 127546, 220, 127547, 127547, 340, 127552, - 127560, 220, 127568, 127569, 220, 127584, 127589, 340, 127744, 127776, 239, - 127777, 127798, 328, 127799, 127868, 239, 127869, 127871, 328, 127872, 127891, - 239, 127892, 127903, 328, 127904, 127940, 239, 127941, 127967, 328, 127968, - 127984, 239, 127985, 127999, 328, 128000, 128041, 239, 128042, 128042, 328, - 128043, 128062, 239, 128063, 128065, 328, 128066, 128247, 239, 128248, 128255, - 328, 128256, 128317, 239, 128318, 128334, 328, 128335, 128335, 340, 128336, - 128359, 239, 128360, 128506, 328, 128507, 128576, 239, 128577, 128580, 328, - 128581, 128591, 239, 128592, 128639, 328, 128640, 128663, 239, 128664, 128664, - 328, 128665, 128709, 239, 128710, 128722, 328, 128723, 128724, 340, 128736, - 128748, 328, 128752, 128758, 328, 128759, 128760, 340, 128768, 128883, 328, - 128896, 128927, 340, 128928, 128960, 328, 128961, 128980, 340, 129024, 129035, - 328, 129040, 129095, 328, 129104, 129113, 328, 129120, 129159, 328, 129168, - 129197, 328, 129280, 129291, 340, 129296, 129310, 328, 129311, 129330, 340, - 129331, 129342, 328, 129344, 129356, 340, 129360, 129374, 328, 129375, 129387, - 340, 129408, 129425, 328, 129426, 129431, 340, 129472, 129472, 328, 129488, - 129510, 340, 131083, 131083, 220, 131105, 131105, 9, 131134, 131134, 9, - 131142, 131142, 9, 131150, 131150, 9, 131176, 131176, 9, 131206, 131207, 9, - 131209, 131209, 220, 131210, 131210, 208, 131220, 131220, 9, 131234, 131234, - 220, 131236, 131236, 220, 131248, 131248, 208, 131274, 131277, 9, 131281, - 131281, 9, 131287, 131287, 265, 131310, 131310, 9, 131317, 131317, 208, - 131340, 131340, 9, 131342, 131342, 9, 131352, 131352, 9, 131372, 131372, 265, - 131416, 131416, 220, 131490, 131490, 220, 131492, 131492, 9, 131497, 131497, - 9, 131499, 131499, 9, 131521, 131521, 9, 131537, 131537, 9, 131540, 131540, 9, - 131570, 131570, 9, 131578, 131578, 9, 131588, 131588, 9, 131596, 131596, 9, - 131603, 131603, 220, 131604, 131604, 9, 131641, 131641, 9, 131675, 131675, 9, - 131700, 131701, 9, 131726, 131726, 9, 131737, 131737, 9, 131742, 131742, 9, - 131744, 131744, 9, 131767, 131767, 9, 131775, 131776, 9, 131813, 131813, 9, - 131850, 131850, 9, 131877, 131877, 9, 131883, 131883, 220, 131905, 131905, 9, - 131909, 131911, 9, 131953, 131953, 220, 131966, 131968, 9, 131969, 131969, - 220, 132000, 132000, 9, 132007, 132007, 9, 132021, 132021, 9, 132041, 132041, - 9, 132043, 132043, 9, 132085, 132085, 9, 132089, 132089, 220, 132092, 132092, - 9, 132115, 132116, 9, 132127, 132127, 9, 132170, 132170, 220, 132197, 132197, - 9, 132231, 132231, 9, 132238, 132238, 9, 132241, 132242, 9, 132259, 132259, 9, - 132311, 132311, 9, 132348, 132348, 9, 132350, 132350, 9, 132361, 132361, 220, - 132423, 132423, 366, 132484, 132484, 9, 132494, 132494, 9, 132517, 132517, 9, - 132529, 132529, 208, 132531, 132531, 9, 132547, 132547, 9, 132554, 132554, - 265, 132560, 132560, 9, 132565, 132565, 9, 132566, 132566, 220, 132575, - 132576, 9, 132587, 132587, 9, 132625, 132625, 208, 132629, 132629, 9, 132633, - 132634, 9, 132648, 132648, 220, 132656, 132656, 9, 132694, 132694, 9, 132726, - 132726, 9, 132796, 132796, 9, 132844, 132844, 208, 132878, 132878, 9, 132913, - 132913, 9, 132943, 132943, 220, 132958, 132958, 9, 132985, 132985, 9, 133037, - 133037, 9, 133127, 133127, 220, 133149, 133149, 9, 133164, 133164, 9, 133178, - 133178, 220, 133235, 133235, 9, 133305, 133305, 220, 133333, 133333, 9, - 133390, 133390, 208, 133398, 133398, 9, 133411, 133411, 9, 133460, 133460, 9, - 133497, 133497, 9, 133500, 133500, 220, 133508, 133508, 265, 133533, 133533, - 220, 133607, 133607, 9, 133649, 133649, 9, 133698, 133698, 9, 133712, 133712, - 9, 133732, 133732, 208, 133743, 133743, 9, 133812, 133812, 9, 133826, 133826, - 9, 133837, 133837, 9, 133843, 133843, 220, 133901, 133901, 9, 133917, 133917, - 220, 134004, 134004, 9, 134031, 134031, 9, 134044, 134044, 9, 134047, 134047, - 220, 134056, 134057, 9, 134071, 134071, 220, 134075, 134075, 9, 134079, - 134079, 9, 134086, 134086, 9, 134091, 134091, 9, 134114, 134114, 9, 134123, - 134123, 9, 134139, 134139, 9, 134143, 134143, 9, 134155, 134155, 9, 134157, - 134157, 9, 134176, 134176, 9, 134196, 134196, 9, 134202, 134203, 9, 134209, - 134211, 9, 134227, 134227, 9, 134245, 134245, 9, 134263, 134264, 9, 134268, - 134268, 9, 134285, 134285, 9, 134294, 134294, 9, 134300, 134300, 9, 134318, - 134318, 9, 134325, 134325, 9, 134328, 134328, 9, 134335, 134335, 9, 134351, - 134351, 9, 134355, 134358, 9, 134365, 134365, 9, 134381, 134381, 9, 134399, - 134399, 9, 134421, 134421, 9, 134440, 134440, 9, 134445, 134445, 9, 134449, - 134451, 9, 134469, 134469, 220, 134470, 134473, 9, 134476, 134478, 9, 134486, - 134486, 9, 134488, 134488, 208, 134511, 134511, 9, 134513, 134513, 9, 134516, - 134516, 9, 134524, 134524, 9, 134526, 134527, 9, 134550, 134550, 9, 134556, - 134556, 9, 134567, 134567, 9, 134578, 134578, 9, 134599, 134600, 9, 134625, - 134625, 220, 134636, 134636, 9, 134660, 134660, 9, 134665, 134666, 9, 134669, - 134673, 9, 134678, 134678, 9, 134685, 134685, 9, 134721, 134721, 9, 134732, - 134732, 9, 134756, 134756, 220, 134765, 134765, 220, 134771, 134771, 9, - 134773, 134779, 9, 134796, 134796, 9, 134805, 134805, 220, 134806, 134806, 9, - 134808, 134808, 9, 134813, 134813, 9, 134818, 134818, 9, 134826, 134828, 9, - 134838, 134838, 9, 134871, 134872, 9, 134877, 134877, 9, 134904, 134907, 9, - 134941, 134941, 9, 134950, 134950, 9, 134957, 134958, 9, 134960, 134961, 9, - 134971, 134971, 9, 134988, 134988, 9, 135007, 135007, 220, 135012, 135012, 9, - 135053, 135053, 9, 135056, 135056, 9, 135085, 135085, 9, 135092, 135094, 9, - 135100, 135100, 9, 135135, 135135, 9, 135146, 135149, 9, 135188, 135188, 9, - 135197, 135198, 9, 135247, 135247, 9, 135260, 135260, 9, 135279, 135279, 9, - 135285, 135288, 9, 135291, 135291, 9, 135304, 135304, 9, 135318, 135318, 9, - 135325, 135325, 9, 135348, 135348, 9, 135359, 135361, 9, 135367, 135369, 9, - 135375, 135375, 9, 135379, 135379, 9, 135396, 135396, 9, 135412, 135414, 9, - 135471, 135471, 9, 135483, 135483, 9, 135485, 135485, 9, 135493, 135493, 9, - 135496, 135496, 9, 135503, 135503, 9, 135509, 135509, 265, 135552, 135552, 9, - 135559, 135559, 9, 135641, 135641, 9, 135681, 135681, 220, 135740, 135740, 9, - 135741, 135741, 220, 135759, 135759, 9, 135765, 135765, 220, 135796, 135796, - 220, 135803, 135803, 220, 135804, 135804, 9, 135821, 135821, 265, 135848, - 135849, 9, 135856, 135856, 9, 135895, 135895, 220, 135907, 135907, 9, 135908, - 135908, 220, 135933, 135933, 220, 135934, 135934, 9, 135938, 135941, 9, - 135963, 135963, 220, 135990, 135990, 220, 135994, 135994, 9, 136004, 136004, - 220, 136036, 136036, 9, 136053, 136054, 9, 136078, 136078, 9, 136088, 136088, - 9, 136092, 136092, 9, 136132, 136132, 220, 136133, 136134, 9, 136173, 136173, - 9, 136190, 136190, 9, 136211, 136211, 9, 136214, 136214, 9, 136228, 136228, 9, - 136255, 136255, 9, 136274, 136274, 9, 136276, 136277, 9, 136301, 136302, 220, - 136330, 136330, 9, 136343, 136343, 9, 136374, 136374, 9, 136424, 136424, 9, - 136445, 136445, 9, 136567, 136567, 9, 136578, 136578, 9, 136596, 136596, 265, - 136598, 136598, 9, 136663, 136663, 220, 136714, 136714, 9, 136723, 136723, 9, - 136729, 136729, 9, 136766, 136766, 9, 136775, 136775, 220, 136801, 136801, 9, - 136850, 136850, 9, 136884, 136884, 220, 136888, 136888, 9, 136890, 136890, 9, - 136896, 136898, 9, 136915, 136915, 9, 136917, 136917, 9, 136927, 136927, 9, - 136934, 136936, 9, 136954, 136956, 9, 136958, 136958, 9, 136966, 136966, 220, - 136973, 136973, 9, 136976, 136976, 9, 136998, 136998, 9, 136999, 136999, 265, - 137013, 137013, 9, 137018, 137020, 9, 137026, 137026, 220, 137047, 137047, 9, - 137068, 137073, 9, 137075, 137076, 9, 137131, 137131, 9, 137136, 137141, 9, - 137155, 137155, 9, 137159, 137159, 9, 137171, 137171, 9, 137177, 137180, 9, - 137183, 137183, 9, 137199, 137199, 9, 137205, 137206, 9, 137208, 137212, 9, - 137248, 137248, 9, 137256, 137258, 9, 137261, 137261, 9, 137273, 137275, 9, - 137280, 137280, 9, 137285, 137285, 9, 137298, 137298, 9, 137310, 137310, 9, - 137313, 137316, 9, 137335, 137335, 9, 137339, 137339, 9, 137347, 137349, 9, - 137374, 137378, 9, 137405, 137405, 220, 137406, 137407, 9, 137425, 137425, 9, - 137430, 137433, 9, 137466, 137466, 9, 137475, 137477, 9, 137488, 137490, 9, - 137493, 137493, 9, 137500, 137500, 9, 137506, 137506, 9, 137511, 137511, 9, - 137531, 137531, 9, 137540, 137540, 9, 137560, 137560, 9, 137578, 137578, 9, - 137596, 137596, 9, 137600, 137600, 9, 137603, 137603, 9, 137608, 137608, 9, - 137622, 137622, 9, 137667, 137667, 220, 137691, 137691, 9, 137715, 137715, 9, - 137754, 137754, 208, 137773, 137773, 9, 137780, 137780, 9, 137797, 137797, 9, - 137803, 137803, 9, 137827, 137827, 9, 138052, 138052, 9, 138177, 138178, 9, - 138282, 138282, 9, 138326, 138326, 220, 138352, 138352, 9, 138402, 138402, 9, - 138405, 138405, 9, 138412, 138412, 9, 138462, 138462, 9, 138541, 138541, 220, - 138565, 138565, 220, 138566, 138566, 9, 138590, 138590, 9, 138594, 138594, - 220, 138616, 138616, 220, 138640, 138640, 9, 138642, 138642, 220, 138652, - 138652, 220, 138657, 138657, 220, 138678, 138678, 9, 138679, 138679, 220, - 138682, 138682, 9, 138698, 138698, 9, 138705, 138705, 9, 138720, 138720, 220, - 138731, 138731, 9, 138745, 138745, 9, 138780, 138780, 9, 138787, 138787, 9, - 138803, 138804, 220, 138807, 138807, 9, 138813, 138813, 9, 138889, 138889, 9, - 138916, 138916, 9, 138920, 138920, 9, 138952, 138952, 9, 138965, 138965, 9, - 139023, 139023, 9, 139029, 139029, 9, 139038, 139038, 220, 139100, 139100, - 265, 139114, 139114, 9, 139126, 139126, 220, 139166, 139166, 9, 139169, - 139169, 9, 139240, 139240, 9, 139258, 139258, 220, 139333, 139333, 9, 139337, - 139337, 9, 139390, 139390, 9, 139418, 139418, 9, 139463, 139463, 9, 139516, - 139516, 9, 139562, 139562, 9, 139611, 139611, 9, 139635, 139635, 9, 139642, - 139642, 9, 139643, 139643, 220, 139681, 139681, 9, 139713, 139713, 9, 139715, - 139715, 9, 139784, 139785, 9, 139800, 139800, 220, 139900, 139900, 9, 139959, - 139959, 9, 140062, 140062, 220, 140065, 140065, 9, 140069, 140069, 9, 140205, - 140205, 220, 140221, 140221, 9, 140240, 140240, 9, 140247, 140247, 9, 140282, - 140282, 9, 140389, 140389, 9, 140401, 140401, 9, 140427, 140427, 9, 140433, - 140433, 9, 140464, 140464, 265, 140508, 140508, 9, 140525, 140525, 265, - 140563, 140563, 9, 140571, 140571, 9, 140592, 140592, 9, 140628, 140629, 9, - 140685, 140685, 9, 140719, 140719, 9, 140730, 140730, 9, 140734, 140734, 9, - 140765, 140765, 9, 140809, 140809, 208, 140827, 140828, 9, 140843, 140843, 9, - 140904, 140904, 9, 140922, 140922, 9, 140950, 140950, 9, 140952, 140952, 9, - 141043, 141043, 220, 141044, 141046, 9, 141074, 141074, 9, 141076, 141076, 9, - 141083, 141083, 9, 141087, 141087, 9, 141098, 141098, 9, 141173, 141173, 9, - 141185, 141185, 9, 141206, 141206, 9, 141236, 141237, 9, 141261, 141261, 9, - 141315, 141315, 9, 141403, 141403, 220, 141407, 141408, 9, 141425, 141425, 9, - 141483, 141483, 220, 141485, 141485, 9, 141505, 141505, 9, 141559, 141559, 9, - 141606, 141606, 9, 141625, 141625, 9, 141647, 141647, 265, 141671, 141671, 9, - 141675, 141675, 9, 141696, 141696, 9, 141711, 141711, 220, 141715, 141715, 9, - 141926, 141926, 9, 141989, 141989, 9, 142008, 142008, 220, 142031, 142031, 9, - 142035, 142035, 9, 142037, 142037, 9, 142054, 142054, 9, 142056, 142056, 9, - 142059, 142059, 9, 142062, 142062, 9, 142094, 142094, 9, 142114, 142114, 9, - 142143, 142143, 9, 142147, 142147, 9, 142150, 142150, 220, 142159, 142160, - 220, 142186, 142186, 9, 142246, 142246, 220, 142282, 142282, 9, 142286, - 142286, 9, 142313, 142313, 9, 142320, 142320, 9, 142365, 142365, 220, 142372, - 142372, 220, 142374, 142375, 9, 142387, 142387, 9, 142392, 142392, 9, 142412, - 142412, 9, 142417, 142417, 9, 142421, 142421, 9, 142434, 142434, 9, 142436, - 142436, 9, 142447, 142447, 265, 142472, 142472, 9, 142491, 142491, 9, 142497, - 142497, 9, 142505, 142505, 9, 142514, 142514, 9, 142519, 142520, 9, 142530, - 142530, 9, 142534, 142534, 9, 142537, 142537, 9, 142599, 142600, 9, 142610, - 142610, 9, 142660, 142660, 9, 142668, 142668, 9, 142695, 142695, 9, 142720, - 142720, 9, 142733, 142733, 9, 142741, 142741, 9, 142752, 142752, 9, 142755, - 142756, 9, 142775, 142775, 9, 142817, 142817, 220, 142830, 142830, 9, 142861, - 142861, 9, 142902, 142902, 9, 142914, 142914, 208, 142968, 142968, 9, 142987, - 142987, 9, 143027, 143027, 9, 143072, 143072, 265, 143087, 143087, 9, 143220, - 143220, 9, 143308, 143308, 9, 143331, 143331, 9, 143339, 143339, 208, 143411, - 143411, 9, 143428, 143428, 9, 143435, 143435, 9, 143462, 143462, 9, 143485, - 143486, 9, 143502, 143502, 9, 143543, 143543, 9, 143548, 143548, 9, 143578, - 143578, 9, 143613, 143613, 265, 143619, 143619, 9, 143677, 143677, 9, 143741, - 143741, 9, 143746, 143746, 9, 143780, 143781, 9, 143794, 143795, 9, 143798, - 143798, 220, 143811, 143812, 220, 143816, 143817, 9, 143861, 143861, 220, - 143863, 143865, 9, 143887, 143887, 9, 143909, 143909, 9, 143919, 143919, 9, - 143921, 143924, 9, 143958, 143958, 9, 143970, 143970, 9, 144001, 144001, 9, - 144009, 144010, 9, 144043, 144045, 9, 144082, 144082, 9, 144096, 144097, 9, - 144128, 144128, 9, 144138, 144138, 9, 144159, 144159, 9, 144195, 144195, 265, - 144208, 144208, 9, 144242, 144242, 220, 144308, 144308, 9, 144332, 144332, - 220, 144336, 144336, 220, 144338, 144339, 220, 144341, 144341, 220, 144346, - 144346, 220, 144350, 144350, 9, 144351, 144351, 220, 144356, 144356, 220, - 144358, 144358, 9, 144372, 144373, 9, 144377, 144378, 9, 144382, 144382, 220, - 144384, 144384, 9, 144447, 144447, 9, 144458, 144459, 220, 144464, 144464, 9, - 144465, 144465, 220, 144485, 144485, 220, 144495, 144495, 9, 144498, 144498, - 9, 144612, 144612, 220, 144613, 144613, 9, 144665, 144665, 9, 144688, 144688, - 9, 144721, 144721, 9, 144730, 144730, 220, 144743, 144743, 9, 144788, 144788, - 220, 144789, 144789, 9, 144793, 144793, 9, 144796, 144796, 9, 144836, 144836, - 220, 144845, 144847, 9, 144883, 144883, 9, 144896, 144896, 9, 144919, 144919, - 9, 144922, 144922, 9, 144952, 144954, 220, 144955, 144955, 265, 144956, - 144956, 9, 144960, 144960, 9, 144967, 144967, 220, 144985, 144985, 9, 144991, - 144991, 9, 145015, 145015, 9, 145062, 145062, 9, 145069, 145069, 9, 145082, - 145082, 9, 145119, 145119, 9, 145134, 145134, 9, 145140, 145140, 9, 145155, - 145155, 9, 145164, 145164, 220, 145174, 145174, 9, 145180, 145180, 220, - 145184, 145184, 9, 145197, 145197, 9, 145199, 145199, 9, 145215, 145215, 220, - 145251, 145252, 220, 145254, 145254, 9, 145281, 145281, 9, 145314, 145314, 9, - 145340, 145340, 9, 145346, 145346, 9, 145365, 145367, 9, 145383, 145383, 220, - 145407, 145407, 220, 145444, 145444, 220, 145466, 145466, 9, 145469, 145469, - 220, 145858, 145858, 9, 146072, 146072, 220, 146087, 146087, 9, 146137, - 146137, 265, 146139, 146139, 9, 146158, 146158, 9, 146170, 146170, 9, 146202, - 146202, 9, 146266, 146266, 9, 146368, 146368, 9, 146531, 146531, 9, 146559, - 146559, 220, 146585, 146587, 9, 146613, 146613, 9, 146615, 146615, 9, 146622, - 146622, 208, 146631, 146633, 9, 146684, 146685, 9, 146686, 146686, 220, - 146687, 146687, 9, 146688, 146688, 220, 146702, 146702, 220, 146752, 146752, - 220, 146779, 146779, 9, 146814, 146814, 9, 146831, 146831, 9, 146870, 146877, - 9, 146899, 146899, 220, 146915, 146915, 9, 146936, 146936, 9, 146937, 146938, - 220, 146950, 146950, 9, 146961, 146961, 9, 146988, 146993, 9, 147001, 147001, - 9, 147015, 147015, 9, 147080, 147083, 9, 147129, 147129, 9, 147135, 147135, 9, - 147159, 147159, 9, 147191, 147196, 9, 147253, 147253, 9, 147265, 147265, 9, - 147274, 147274, 9, 147297, 147297, 9, 147326, 147326, 220, 147327, 147330, 9, - 147343, 147343, 9, 147380, 147380, 9, 147383, 147383, 9, 147392, 147392, 9, - 147397, 147397, 9, 147435, 147440, 9, 147473, 147473, 9, 147513, 147517, 9, - 147531, 147531, 208, 147543, 147543, 9, 147589, 147589, 9, 147595, 147597, 9, - 147601, 147601, 9, 147606, 147606, 220, 147657, 147657, 9, 147681, 147681, 9, - 147692, 147692, 9, 147715, 147715, 220, 147716, 147716, 9, 147727, 147727, 9, - 147737, 147737, 9, 147775, 147776, 9, 147780, 147780, 9, 147790, 147790, 9, - 147797, 147799, 9, 147804, 147804, 9, 147807, 147807, 9, 147831, 147831, 9, - 147834, 147834, 9, 147875, 147877, 9, 147884, 147884, 9, 147893, 147893, 9, - 147910, 147910, 220, 147917, 147917, 9, 147938, 147938, 9, 147964, 147964, 9, - 147966, 147966, 220, 147995, 147995, 9, 148043, 148043, 9, 148054, 148054, 9, - 148057, 148057, 9, 148086, 148088, 9, 148100, 148100, 9, 148115, 148115, 9, - 148117, 148117, 9, 148133, 148133, 9, 148159, 148159, 9, 148161, 148161, 9, - 148169, 148170, 9, 148206, 148206, 220, 148209, 148209, 265, 148218, 148218, - 9, 148237, 148237, 9, 148250, 148250, 9, 148276, 148276, 9, 148296, 148296, 9, - 148322, 148325, 9, 148364, 148364, 9, 148374, 148374, 9, 148380, 148380, 9, - 148381, 148381, 265, 148412, 148412, 220, 148413, 148413, 9, 148417, 148417, - 9, 148432, 148432, 208, 148457, 148458, 9, 148466, 148466, 9, 148472, 148472, - 9, 148484, 148484, 9, 148533, 148534, 9, 148570, 148571, 9, 148595, 148595, 9, - 148615, 148616, 9, 148665, 148665, 9, 148668, 148668, 9, 148686, 148686, 9, - 148691, 148691, 9, 148694, 148694, 9, 148741, 148741, 9, 148769, 148769, 9, - 148856, 148856, 9, 148911, 148911, 9, 148936, 148936, 9, 149016, 149016, 9, - 149033, 149033, 220, 149034, 149034, 9, 149093, 149093, 9, 149108, 149108, 9, - 149143, 149143, 9, 149157, 149157, 220, 149204, 149204, 9, 149208, 149208, 9, - 149254, 149254, 9, 149285, 149285, 9, 149295, 149295, 9, 149391, 149391, 9, - 149402, 149402, 9, 149472, 149472, 9, 149489, 149489, 220, 149522, 149522, 9, - 149539, 149539, 9, 149634, 149634, 9, 149654, 149654, 220, 149737, 149737, - 265, 149744, 149744, 265, 149745, 149747, 9, 149755, 149755, 9, 149759, - 149761, 9, 149772, 149772, 9, 149782, 149783, 9, 149785, 149785, 9, 149807, - 149807, 9, 149811, 149812, 9, 149822, 149827, 9, 149858, 149859, 9, 149876, - 149878, 9, 149883, 149883, 9, 149887, 149887, 9, 149890, 149890, 9, 149896, - 149903, 9, 149908, 149908, 9, 149924, 149924, 9, 149927, 149927, 9, 149929, - 149929, 9, 149931, 149933, 9, 149943, 149947, 9, 149957, 149957, 9, 149968, - 149968, 9, 149978, 149978, 9, 149982, 149983, 9, 149987, 149987, 9, 149989, - 149989, 9, 149996, 149997, 9, 150006, 150009, 9, 150011, 150011, 9, 150017, - 150017, 265, 150030, 150030, 9, 150034, 150034, 265, 150035, 150035, 9, - 150037, 150037, 9, 150049, 150058, 9, 150078, 150078, 9, 150082, 150082, 9, - 150085, 150085, 9, 150090, 150090, 9, 150093, 150093, 220, 150094, 150097, 9, - 150109, 150109, 9, 150117, 150119, 9, 150129, 150129, 9, 150135, 150138, 9, - 150156, 150156, 9, 150163, 150166, 9, 150180, 150183, 9, 150193, 150195, 9, - 150202, 150204, 9, 150208, 150208, 9, 150215, 150215, 9, 150218, 150218, 9, - 150225, 150225, 9, 150239, 150239, 9, 150242, 150242, 9, 150249, 150249, 9, - 150287, 150287, 9, 150358, 150358, 220, 150382, 150382, 9, 150383, 150383, - 220, 150517, 150517, 9, 150537, 150537, 9, 150550, 150550, 220, 150686, - 150687, 9, 150729, 150729, 9, 150745, 150745, 9, 150790, 150790, 9, 150803, - 150803, 9, 150804, 150804, 220, 150915, 150915, 9, 150968, 150968, 9, 150982, - 150982, 9, 151018, 151019, 9, 151044, 151044, 208, 151054, 151054, 220, - 151083, 151083, 9, 151095, 151095, 220, 151099, 151099, 9, 151120, 151120, 9, - 151146, 151146, 220, 151179, 151179, 220, 151205, 151205, 9, 151207, 151207, - 9, 151310, 151310, 9, 151388, 151388, 9, 151426, 151426, 9, 151430, 151430, 9, - 151447, 151447, 9, 151450, 151450, 9, 151465, 151465, 9, 151480, 151480, 9, - 151490, 151490, 9, 151538, 151538, 208, 151596, 151596, 9, 151626, 151626, - 220, 151634, 151634, 9, 151637, 151637, 220, 151709, 151709, 9, 151842, - 151842, 220, 151851, 151851, 9, 151880, 151880, 9, 151933, 151934, 9, 151977, - 151977, 220, 152013, 152013, 220, 152035, 152035, 9, 152037, 152037, 220, - 152038, 152039, 9, 152094, 152094, 220, 152096, 152097, 9, 152140, 152140, - 220, 152144, 152144, 9, 152217, 152217, 9, 152263, 152263, 9, 152280, 152280, - 9, 152334, 152334, 9, 152337, 152337, 9, 152339, 152339, 9, 152346, 152346, 9, - 152382, 152382, 265, 152393, 152393, 9, 152458, 152458, 9, 152501, 152501, - 265, 152574, 152574, 265, 152601, 152601, 9, 152613, 152613, 9, 152622, - 152622, 220, 152623, 152624, 9, 152646, 152646, 9, 152684, 152684, 9, 152686, - 152686, 9, 152718, 152718, 220, 152730, 152730, 9, 152754, 152754, 9, 152793, - 152793, 220, 152846, 152846, 220, 152881, 152881, 9, 152885, 152885, 9, - 152895, 152895, 9, 152923, 152926, 9, 152930, 152930, 9, 152933, 152934, 9, - 152961, 152961, 9, 152964, 152964, 9, 152975, 152975, 9, 152999, 152999, 220, - 153017, 153017, 9, 153045, 153045, 9, 153051, 153051, 9, 153056, 153056, 9, - 153093, 153093, 9, 153141, 153141, 9, 153169, 153169, 9, 153215, 153215, 208, - 153219, 153219, 9, 153237, 153237, 9, 153315, 153315, 9, 153334, 153334, 9, - 153350, 153350, 9, 153373, 153373, 9, 153381, 153381, 9, 153405, 153405, 9, - 153457, 153457, 220, 153458, 153458, 9, 153513, 153513, 220, 153524, 153524, - 220, 153543, 153543, 9, 153567, 153569, 9, 153650, 153650, 265, 153658, - 153658, 265, 153687, 153687, 9, 153693, 153693, 9, 153701, 153701, 9, 153714, - 153714, 9, 153716, 153716, 208, 153800, 153800, 9, 153825, 153825, 9, 153859, - 153859, 9, 153926, 153926, 9, 153942, 153942, 9, 153975, 153975, 9, 153976, - 153976, 265, 153985, 153985, 9, 153996, 153996, 9, 154028, 154028, 9, 154052, - 154052, 220, 154060, 154060, 208, 154068, 154068, 220, 154196, 154196, 9, - 154261, 154261, 9, 154268, 154268, 9, 154286, 154287, 9, 154327, 154327, 265, - 154339, 154340, 220, 154345, 154345, 9, 154353, 154353, 220, 154456, 154456, - 9, 154484, 154484, 9, 154505, 154505, 9, 154519, 154519, 265, 154546, 154546, - 220, 154547, 154548, 9, 154566, 154566, 9, 154596, 154596, 9, 154600, 154600, - 9, 154625, 154625, 9, 154630, 154630, 9, 154657, 154657, 9, 154698, 154698, 9, - 154699, 154699, 220, 154724, 154724, 220, 154725, 154725, 9, 154769, 154769, - 9, 154788, 154788, 9, 154816, 154817, 9, 154878, 154878, 9, 154890, 154890, 9, - 154912, 154912, 9, 154928, 154928, 9, 154947, 154947, 9, 155041, 155041, 220, - 155150, 155150, 9, 155182, 155182, 220, 155204, 155204, 265, 155209, 155209, - 9, 155222, 155222, 220, 155234, 155234, 220, 155237, 155237, 220, 155265, - 155267, 9, 155302, 155302, 9, 155324, 155324, 9, 155330, 155330, 220, 155351, - 155351, 9, 155352, 155352, 220, 155368, 155368, 220, 155418, 155418, 9, - 155427, 155427, 220, 155446, 155446, 9, 155467, 155467, 9, 155477, 155477, 9, - 155484, 155484, 220, 155604, 155604, 220, 155616, 155616, 220, 155617, 155618, - 9, 155643, 155643, 220, 155645, 155645, 9, 155660, 155660, 220, 155671, - 155671, 220, 155689, 155689, 9, 155720, 155720, 9, 155735, 155735, 265, - 155744, 155744, 220, 155748, 155748, 9, 155779, 155779, 9, 155799, 155799, 9, - 155812, 155813, 9, 155885, 155885, 220, 155906, 155906, 9, 155937, 155937, 9, - 155993, 155996, 9, 156077, 156078, 9, 156082, 156082, 9, 156125, 156125, 9, - 156248, 156248, 9, 156257, 156257, 9, 156266, 156267, 9, 156272, 156272, 220, - 156294, 156294, 220, 156307, 156307, 9, 156368, 156368, 9, 156469, 156469, 9, - 156491, 156491, 9, 156492, 156492, 220, 156497, 156497, 9, 156606, 156606, 9, - 156661, 156661, 9, 156664, 156664, 9, 156674, 156674, 220, 156688, 156690, 9, - 156746, 156746, 9, 156748, 156748, 9, 156777, 156777, 9, 156804, 156804, 9, - 156808, 156809, 9, 156813, 156813, 9, 156824, 156824, 9, 156946, 156946, 9, - 157042, 157042, 9, 157088, 157088, 9, 157092, 157092, 265, 157101, 157101, 9, - 157119, 157120, 9, 157202, 157202, 9, 157222, 157222, 9, 157310, 157310, 220, - 157359, 157359, 9, 157360, 157360, 220, 157361, 157361, 9, 157365, 157365, 9, - 157402, 157402, 9, 157416, 157416, 9, 157436, 157436, 9, 157446, 157446, 9, - 157459, 157459, 9, 157462, 157462, 9, 157469, 157469, 220, 157505, 157505, 9, - 157593, 157593, 9, 157619, 157620, 9, 157644, 157644, 9, 157656, 157656, 265, - 157724, 157724, 9, 157766, 157766, 9, 157790, 157790, 9, 157806, 157806, 9, - 157832, 157832, 9, 157834, 157834, 9, 157843, 157843, 9, 157895, 157895, 9, - 157917, 157917, 220, 157930, 157930, 220, 157966, 157966, 9, 157969, 157969, - 9, 157990, 157990, 9, 158009, 158009, 9, 158033, 158033, 220, 158063, 158063, - 220, 158105, 158105, 208, 158120, 158120, 9, 158133, 158133, 9, 158154, - 158154, 9, 158173, 158173, 220, 158194, 158194, 9, 158202, 158202, 9, 158236, - 158236, 9, 158238, 158238, 220, 158253, 158254, 9, 158260, 158260, 9, 158274, - 158274, 9, 158289, 158290, 9, 158296, 158296, 220, 158348, 158348, 220, - 158391, 158391, 220, 158463, 158463, 220, 158469, 158469, 9, 158474, 158474, - 9, 158483, 158483, 9, 158485, 158485, 9, 158499, 158499, 9, 158504, 158504, 9, - 158544, 158547, 9, 158555, 158555, 9, 158581, 158581, 9, 158594, 158594, 9, - 158614, 158615, 9, 158621, 158621, 9, 158643, 158643, 9, 158656, 158656, 9, - 158711, 158711, 9, 158753, 158753, 9, 158761, 158761, 220, 158784, 158785, 9, - 158790, 158790, 9, 158835, 158835, 220, 158846, 158850, 9, 158878, 158878, - 208, 158884, 158884, 9, 158903, 158904, 9, 158909, 158909, 9, 158912, 158912, - 9, 158915, 158915, 9, 158929, 158929, 9, 158941, 158941, 220, 159010, 159018, - 9, 159057, 159057, 9, 159092, 159092, 9, 159136, 159143, 9, 159150, 159150, 9, - 159196, 159196, 9, 159210, 159211, 9, 159216, 159216, 9, 159232, 159232, 9, - 159237, 159237, 9, 159239, 159239, 9, 159250, 159250, 9, 159296, 159296, 220, - 159298, 159301, 9, 159333, 159333, 220, 159342, 159342, 9, 159346, 159346, 9, - 159351, 159351, 9, 159364, 159364, 9, 159371, 159371, 9, 159385, 159385, 9, - 159440, 159447, 9, 159526, 159526, 9, 159603, 159604, 9, 159636, 159636, 220, - 159647, 159647, 9, 159649, 159649, 9, 159678, 159678, 9, 159710, 159711, 9, - 159734, 159736, 220, 159758, 159758, 9, 159819, 159819, 9, 159826, 159827, 9, - 159880, 159880, 9, 159917, 159919, 9, 159949, 159949, 9, 159954, 159954, 9, - 159988, 159988, 220, 159992, 159992, 9, 160009, 160009, 9, 160012, 160012, 9, - 160013, 160013, 220, 160038, 160039, 9, 160057, 160057, 220, 160068, 160068, - 265, 160100, 160101, 9, 160117, 160117, 9, 160205, 160205, 9, 160283, 160283, - 9, 160351, 160351, 9, 160359, 160359, 9, 160384, 160384, 9, 160389, 160389, 9, - 160395, 160395, 9, 160434, 160434, 9, 160438, 160438, 9, 160486, 160486, 9, - 160516, 160516, 9, 160594, 160594, 9, 160666, 160666, 9, 160691, 160691, 9, - 160730, 160731, 220, 160766, 160766, 220, 160767, 160767, 9, 160784, 160784, - 220, 160802, 160802, 9, 160841, 160841, 220, 160848, 160848, 9, 160900, - 160900, 9, 160902, 160902, 9, 161140, 161140, 9, 161187, 161187, 9, 161248, - 161248, 9, 161252, 161252, 9, 161277, 161278, 9, 161279, 161279, 265, 161287, - 161287, 9, 161292, 161292, 9, 161300, 161301, 220, 161317, 161317, 265, - 161329, 161329, 220, 161330, 161330, 9, 161337, 161337, 9, 161365, 161367, 9, - 161412, 161412, 220, 161427, 161427, 220, 161428, 161428, 9, 161550, 161550, - 220, 161551, 161551, 9, 161566, 161566, 9, 161571, 161571, 220, 161589, - 161590, 9, 161601, 161601, 9, 161618, 161618, 220, 161630, 161630, 9, 161668, - 161669, 9, 161740, 161740, 9, 161880, 161880, 9, 161904, 161904, 9, 161949, - 161949, 9, 161970, 161970, 265, 161992, 161992, 9, 162084, 162084, 9, 162151, - 162151, 9, 162170, 162170, 9, 162181, 162181, 220, 162208, 162208, 9, 162228, - 162228, 208, 162269, 162269, 9, 162296, 162296, 9, 162301, 162301, 9, 162314, - 162314, 9, 162318, 162318, 9, 162366, 162366, 9, 162385, 162385, 265, 162387, - 162387, 9, 162393, 162393, 9, 162425, 162425, 9, 162436, 162436, 220, 162493, - 162494, 9, 162548, 162548, 9, 162562, 162562, 265, 162566, 162566, 9, 162571, - 162571, 9, 162584, 162584, 9, 162601, 162601, 9, 162616, 162618, 9, 162632, - 162632, 9, 162739, 162739, 220, 162750, 162750, 220, 162759, 162759, 220, - 162799, 162799, 9, 162804, 162804, 9, 162834, 162834, 9, 162869, 162869, 9, - 162876, 162876, 208, 162924, 162924, 9, 162993, 162993, 9, 163000, 163000, - 220, 163013, 163013, 9, 163055, 163055, 265, 163119, 163119, 9, 163155, - 163156, 9, 163174, 163174, 9, 163187, 163187, 208, 163204, 163204, 9, 163215, - 163215, 9, 163224, 163224, 9, 163232, 163232, 220, 163261, 163261, 9, 163292, - 163292, 9, 163344, 163344, 220, 163405, 163405, 9, 163407, 163407, 9, 163453, - 163453, 265, 163491, 163491, 9, 163611, 163611, 265, 163630, 163630, 9, - 163707, 163707, 9, 163767, 163767, 220, 163827, 163827, 9, 163833, 163833, 9, - 163842, 163842, 9, 163849, 163849, 9, 163870, 163870, 9, 163875, 163876, 9, - 163912, 163912, 9, 163917, 163917, 9, 163960, 163960, 9, 163971, 163971, 9, - 163978, 163978, 220, 163984, 163984, 9, 164016, 164016, 9, 164027, 164027, - 220, 164029, 164030, 9, 164063, 164063, 9, 164072, 164073, 9, 164084, 164084, - 9, 164142, 164142, 9, 164175, 164175, 9, 164180, 164180, 9, 164189, 164189, 9, - 164207, 164207, 9, 164233, 164233, 9, 164271, 164271, 9, 164284, 164284, 9, - 164359, 164359, 9, 164376, 164376, 9, 164378, 164378, 9, 164438, 164438, 9, - 164451, 164451, 9, 164471, 164471, 220, 164476, 164476, 9, 164482, 164482, - 220, 164507, 164507, 9, 164557, 164557, 9, 164578, 164578, 9, 164595, 164595, - 220, 164614, 164614, 9, 164632, 164632, 9, 164655, 164655, 9, 164666, 164666, - 9, 164709, 164709, 9, 164717, 164717, 9, 164733, 164733, 9, 164746, 164746, 9, - 164777, 164777, 9, 164813, 164813, 220, 164854, 164854, 265, 164876, 164876, - 220, 164882, 164882, 9, 164949, 164949, 220, 164956, 164956, 9, 164968, - 164968, 9, 164972, 164972, 9, 164979, 164979, 9, 164994, 164994, 9, 165082, - 165082, 9, 165084, 165084, 265, 165121, 165121, 9, 165180, 165181, 9, 165227, - 165227, 220, 165228, 165228, 9, 165320, 165321, 220, 165352, 165352, 9, - 165364, 165364, 9, 165376, 165376, 9, 165387, 165387, 9, 165413, 165413, 9, - 165435, 165435, 9, 165546, 165547, 9, 165554, 165554, 9, 165564, 165564, 9, - 165591, 165591, 220, 165592, 165592, 9, 165606, 165606, 9, 165626, 165626, - 220, 165647, 165647, 9, 165651, 165651, 9, 165892, 165892, 9, 165931, 165931, - 9, 166195, 166195, 9, 166214, 166214, 220, 166216, 166216, 9, 166217, 166217, - 220, 166230, 166230, 9, 166244, 166244, 9, 166248, 166248, 9, 166251, 166251, - 220, 166252, 166253, 9, 166270, 166270, 9, 166279, 166280, 220, 166281, - 166281, 9, 166312, 166312, 9, 166314, 166315, 9, 166328, 166328, 9, 166330, - 166331, 220, 166332, 166332, 9, 166336, 166336, 9, 166364, 166364, 9, 166366, - 166366, 9, 166369, 166369, 9, 166371, 166372, 9, 166375, 166376, 9, 166385, - 166385, 9, 166393, 166396, 9, 166415, 166415, 9, 166422, 166422, 9, 166430, - 166430, 220, 166437, 166437, 9, 166441, 166441, 220, 166450, 166450, 9, - 166454, 166454, 9, 166467, 166467, 220, 166468, 166475, 9, 166489, 166490, 9, - 166513, 166513, 220, 166529, 166531, 9, 166553, 166553, 220, 166554, 166556, - 9, 166592, 166592, 9, 166598, 166598, 9, 166603, 166604, 9, 166605, 166605, - 220, 166606, 166606, 9, 166621, 166621, 220, 166622, 166627, 9, 166628, - 166628, 220, 166629, 166629, 9, 166634, 166634, 9, 166652, 166652, 9, 166668, - 166668, 9, 166675, 166675, 9, 166689, 166690, 9, 166699, 166701, 9, 166703, - 166703, 9, 166726, 166726, 9, 166732, 166732, 9, 166734, 166734, 9, 166736, - 166736, 9, 166747, 166747, 9, 166755, 166758, 9, 166764, 166764, 9, 166799, - 166799, 9, 166809, 166809, 9, 166812, 166813, 9, 166841, 166841, 9, 166849, - 166849, 220, 166850, 166850, 9, 166853, 166853, 9, 166868, 166868, 9, 166871, - 166871, 9, 166873, 166874, 9, 166887, 166892, 9, 166895, 166895, 220, 166901, - 166901, 9, 166911, 166911, 9, 166915, 166915, 9, 166921, 166921, 9, 166940, - 166941, 9, 166947, 166947, 9, 166950, 166950, 9, 166955, 166955, 9, 166960, - 166960, 9, 166969, 166969, 9, 166971, 166971, 9, 167114, 167114, 9, 167117, - 167117, 9, 167122, 167122, 9, 167133, 167133, 208, 167184, 167184, 220, - 167220, 167220, 9, 167281, 167281, 220, 167306, 167306, 265, 167321, 167321, - 9, 167329, 167329, 265, 167353, 167353, 9, 167419, 167419, 220, 167439, - 167439, 265, 167447, 167447, 208, 167455, 167455, 220, 167478, 167478, 220, - 167481, 167481, 9, 167525, 167526, 9, 167561, 167561, 220, 167575, 167575, 9, - 167596, 167596, 9, 167602, 167603, 9, 167641, 167641, 9, 167655, 167655, 9, - 167659, 167659, 220, 167670, 167670, 208, 167730, 167730, 220, 167877, 167877, - 9, 167928, 167928, 220, 168057, 168057, 9, 168072, 168072, 9, 168075, 168075, - 9, 168083, 168083, 9, 168111, 168113, 9, 168128, 168128, 9, 168164, 168165, 9, - 168172, 168173, 9, 168205, 168205, 9, 168208, 168208, 9, 168252, 168252, 9, - 168269, 168269, 9, 168283, 168283, 9, 168286, 168286, 9, 168304, 168304, 9, - 168348, 168348, 9, 168360, 168360, 9, 168405, 168405, 265, 168419, 168419, - 265, 168427, 168427, 9, 168608, 168608, 220, 168625, 168625, 220, 168928, - 168928, 9, 168989, 168989, 9, 168992, 168992, 9, 169011, 169011, 9, 169023, - 169023, 9, 169032, 169032, 9, 169086, 169086, 9, 169104, 169104, 220, 169168, - 169168, 9, 169177, 169178, 9, 169182, 169182, 265, 169189, 169189, 9, 169191, - 169191, 9, 169225, 169225, 265, 169374, 169374, 9, 169392, 169392, 9, 169400, - 169400, 9, 169423, 169423, 220, 169431, 169431, 9, 169449, 169449, 9, 169460, - 169460, 9, 169599, 169599, 220, 169705, 169705, 9, 169712, 169712, 220, - 169735, 169735, 9, 169753, 169753, 220, 169760, 169760, 9, 169778, 169778, 9, - 169808, 169808, 220, 169940, 169940, 9, 170000, 170000, 265, 170043, 170043, - 265, 170071, 170071, 9, 170148, 170148, 9, 170182, 170182, 220, 170193, - 170193, 9, 170218, 170218, 9, 170225, 170225, 9, 170234, 170234, 9, 170243, - 170243, 9, 170245, 170245, 9, 170287, 170287, 9, 170309, 170309, 9, 170311, - 170313, 9, 170333, 170333, 9, 170346, 170346, 9, 170397, 170397, 9, 170435, - 170435, 9, 170441, 170441, 9, 170513, 170513, 9, 170536, 170536, 9, 170573, - 170573, 9, 170610, 170610, 220, 170648, 170648, 9, 170757, 170757, 9, 170766, - 170766, 9, 170965, 170965, 9, 171123, 171123, 9, 171181, 171181, 9, 171326, - 171326, 9, 171339, 171339, 208, 171354, 171354, 9, 171377, 171377, 9, 171388, - 171388, 9, 171416, 171416, 9, 171419, 171419, 9, 171483, 171483, 220, 171510, - 171510, 9, 171526, 171526, 9, 171541, 171541, 220, 171565, 171565, 9, 171581, - 171581, 220, 171593, 171593, 220, 171624, 171624, 9, 171646, 171646, 9, - 171658, 171658, 220, 171692, 171692, 9, 171696, 171696, 9, 171715, 171715, 9, - 171716, 171716, 220, 171739, 171739, 220, 171753, 171753, 220, 171768, 171768, - 9, 171811, 171811, 9, 171824, 171824, 9, 171959, 171959, 9, 171982, 171982, - 220, 171991, 171991, 220, 171998, 171998, 9, 172052, 172052, 9, 172058, - 172058, 220, 172079, 172079, 220, 172162, 172162, 220, 172167, 172167, 9, - 172217, 172217, 9, 172257, 172257, 9, 172269, 172269, 9, 172275, 172275, 9, - 172280, 172280, 9, 172281, 172281, 220, 172286, 172286, 9, 172295, 172295, 9, - 172323, 172323, 9, 172339, 172340, 9, 172368, 172368, 9, 172432, 172432, 220, - 172434, 172435, 9, 172459, 172459, 9, 172468, 172469, 9, 172511, 172511, 9, - 172533, 172533, 9, 172576, 172576, 9, 172595, 172595, 9, 172691, 172691, 9, - 172703, 172703, 9, 172717, 172717, 265, 172722, 172722, 208, 172724, 172724, - 9, 172726, 172726, 9, 172730, 172730, 9, 172733, 172733, 9, 172767, 172767, 9, - 172799, 172799, 9, 172881, 172881, 9, 172899, 172899, 9, 172940, 172940, 220, - 172969, 172969, 9, 173086, 173086, 9, 173108, 173108, 9, 173111, 173111, 220, - 173147, 173147, 9, 173264, 173264, 265, 173510, 173510, 9, 173515, 173515, 9, - 173553, 173553, 220, 173569, 173569, 9, 173570, 173570, 220, 173594, 173594, - 220, 173607, 173607, 9, 173618, 173618, 9, 173642, 173642, 9, 173659, 173659, - 9, 173668, 173668, 265, 173737, 173737, 9, 173746, 173746, 220, 180501, - 180501, 265, 182227, 182227, 265, 185668, 185668, 265, 189801, 189801, 265, - 194560, 195101, 366, 198441, 198441, 265, 200414, 200414, 261, 240969, 241347, - 367, 983089, 983089, 347, 983101, 983101, 347, 983111, 983111, 347, 983122, - 983122, 347, 983149, 983149, 347, 983155, 983155, 347, 983168, 983168, 340, - 983170, 983192, 340, 983194, 983200, 340, 983202, 983202, 347, 983213, 983213, - 340, 983218, 983218, 347, 983232, 983232, 347, 983235, 983235, 347, 983245, - 983245, 347, 983259, 983260, 347, 983308, 983308, 347, 983313, 983313, 347, - 983339, 983339, 347, 983345, 983345, 347, 983347, 983347, 347, 983352, 983352, - 347, 983371, 983371, 347, 983373, 983373, 347, 983393, 983394, 347, 983399, - 983400, 347, 983413, 983413, 347, 983426, 983426, 347, 983443, 983443, 347, - 983461, 983461, 347, 983469, 983469, 347, 983483, 983483, 347, 983489, 983489, - 347, 983496, 983496, 347, 983502, 983502, 347, 983512, 983512, 347, 983520, - 983520, 347, 983537, 983537, 347, 983547, 983547, 347, 983565, 983565, 347, - 983806, 983806, 347, 983887, 983887, 340, 984371, 984371, 347, 984377, 984377, - 347, 984432, 984432, 347, 984478, 984478, 347, 984489, 984489, 347, 984509, - 984509, 347, 984676, 984676, 347, 984690, 984690, 347, 984710, 984710, 347, - 984762, 984762, 347, 984816, 984825, 340, 985176, 985176, 347, 985180, 985180, - 347, 985196, 985197, 347, 985209, 985209, 347, 986965, 986965, 347, 986986, - 986986, 347, 986996, 986997, 347, 987009, 987009, 347, 987013, 987013, 347, - 987025, 987025, 347, 987045, 987045, 347, 987066, 987067, 347, 987071, 987071, - 347, 987085, 987085, 347, 987092, 987092, 347, 987103, 987103, 347, 987125, - 987125, 347, 987129, 987129, 347, 987137, 987137, 347, 987148, 987148, 347, - 987162, 987162, 347, 987166, 987166, 347, 987174, 987174, 347, 987186, 987186, - 347, 987217, 987217, 347, 987235, 987235, 347, 987295, 987295, 347, 987298, - 987298, 347, 987306, 987306, 347, 987310, 987310, 347, 987318, 987318, 347, - 987365, 987365, 347, 987380, 987380, 347, 987391, 987391, 347, 987396, 987396, - 347, 987399, 987399, 347, 987401, 987401, 347, 987471, 987471, 347, 988594, - 988594, 347, 991232, 991247, 340, 991249, 991249, 340, 991272, 991279, 340, - 991327, 991332, 340, 991334, 991343, 340, 991402, 991402, 340, 995438, 995438, - 340, 995991, 995991, 340, 995993, 995993, 340, 1003053, 1003053, 340, 1036632, - 1036633, 340, 1036659, 1036666, 340, 1041637, 1041646, 239, 1042476, 1042476, - 239, 1042478, 1042486, 239, 1042487, 1042487, 318, 1048064, 1048079, 340, - 1048569, 1048571, 340, 1113458, 1114110, 21, -]; - -window["g_fonts_selection_bin"] = - "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AABAAAAAAAAAAAABAAAAAAAAALwCBQACCgEA7gGYA+j+AABMAdACAACyAAAADgAAAERhbmNpbmcgU2NyaXB0AAAAAEgAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RhbmNpbmdTY3JpcHQtUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAMIBgAEBQcADQAvAACACwAAQAAAAAAAAAAAAQAAAAAAAACQAQUAAgoBANMBmAPo/gAATAHQAgAAtwAAABUAAABEZWphVnUgU2FucyBDb25kZW5zZWQAAAAARgAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1Q29uZGVuc2VkU2Fucy50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBgYDCAQCAgT/LgDn//0A0ikgBAoAAAAA/wEA4AAA/7+QAQQAAAABAMgB9wIQ/8gAAAAAAAAAuwAAABUAAABEZWphVnUgU2FucyBDb25kZW5zZWQAAAAASgAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1Q29uZGVuc2VkU2Fuc0JvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACCwgGAwYEAgIE/y4A5//1ANIpIAQKAAAAAP8BAGAAAP+/vAIEAAAAAQADAvcCEP/IAAAAAAAAAMIAAAAVAAAARGVqYVZ1IFNhbnMgQ29uZGVuc2VkAAAAAFEAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdUNvbmRlbnNlZFNhbnNCb2xkT2JsaXF1ZS50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAILCAYDAwQLAgT/DgDn//UAUiEgBAoAAAAAvwEAYAAA95+8AgQAAAABAAMC9wIQ/8gAAAAAAAAAvgAAABUAAABEZWphVnUgU2FucyBDb25kZW5zZWQAAAAATQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1Q29uZGVuc2VkU2Fuc09ibGlxdWUudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACCwYGAwMECwIE/w4A5//9AFIhIAQKAAAAAL8BAGAAAPefkAEEAAAAAQDIAfcCEP/IAAAAAAAAALkAAAAWAAAARGVqYVZ1IFNlcmlmIENvbmRlbnNlZAAAAABHAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVDb25kZW5zZWRTZXJpZi50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAIGBgYFBgUCAgT/AgDk+3kAUCAABAgAAAAAnwAAYAAA15+QAQQAAAABAMwB9wIQ/8gAAAAAAAAAvQAAABYAAABEZWphVnUgU2VyaWYgQ29uZGVuc2VkAAAAAEsAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdUNvbmRlbnNlZFNlcmlmQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAIGCAYFBgUCAgT/AgDk+3EAUCAABAgAAAAAnwAAYAAA15+8AgQAAAABAP0B9wIQ/8gAAAAAAAAAwwAAABYAAABEZWphVnUgU2VyaWYgQ29uZGVuc2VkAAAAAFEAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdUNvbmRlbnNlZFNlcmlmQm9sZEl0YWxpYy50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAIGCAYFAwULAgT/AgDk+3EAUCAABAgAAAAAnwAAYAAA15+8AgQAAAABAP0B9wIQ/8gAAAAAAAAAvwAAABYAAABEZWphVnUgU2VyaWYgQ29uZGVuc2VkAAAAAE0AAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdUNvbmRlbnNlZFNlcmlmSXRhbGljLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAgYGBgUDBQsCBP8CAOT7eQBQIAAECAAAAACfAABgAADXn5ABBAAAAAEAzAH3AhD/yAAAAAAAAACtAAAAEAAAAERlamFWdSBTYW5zIE1vbm8AAAAAQQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1TW9ub1NhbnMudHRmAAAAAAAAAAAAAAAAAQAAAAoAAAACCwYJAwgEAgIE/yIA5vv5ANAoAAAAAAAAAN8AAGAAAN+/kAEFAAAAAQBaAvcCEP/IAAAAAAAAALEAAAAQAAAARGVqYVZ1IFNhbnMgTW9ubwAAAABFAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVNb25vU2Fuc0JvbGQudHRmAAAAAAAAAAABAAAAAQAAAAoAAAACCwcJAwYEAgIE/yIA5vvxANAoAAAAAAAAAN8AAGAAAN+/vAIFAAAAAQBaAvcCEP/IAAAAAAAAALgAAAAQAAAARGVqYVZ1IFNhbnMgTW9ubwAAAABMAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVNb25vU2Fuc0JvbGRPYmxpcXVlLnR0ZgAAAAABAAAAAQAAAAEAAAAKAAAAAgsHCQMDBAsCBP8CAOb7cQBQIAAAAAAAAACfAABgAADXn7wCBQAAAAEAWgL3AhD/yAAAAAAAAAC0AAAAEAAAAERlamFWdSBTYW5zIE1vbm8AAAAASAAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1TW9ub1NhbnNPYmxpcXVlLnR0ZgAAAAABAAAAAAAAAAEAAAAKAAAAAgsGCQMDBAsCBP8CAOb7eQBQIAAAAAAAAACfAABgAADXn5ABBQAAAAEAWgL3AhD/yAAAAAAAAACpAAAACwAAAERlamFWdSBTYW5zAAAAAEIAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNhbnMtQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAILCAMDBgQCAgT/LgDn//UA0ilgBAoAAAAA/wEAYAAACAC8AgUAAAABADwC9wIQ/8gAAAAAAAAAsAAAAAsAAABEZWphVnUgU2FucwAAAABJAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTYW5zLUJvbGRPYmxpcXVlLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAgsIAwMDBAsCBP8OAOf/9QBSISAECgAAAAC/AQBgAAAAALwCBQAAAAEAPAL3AhD/yAAAAAAAAAC1AAAAEQAAAERlamFWdSBTYW5zIExpZ2h0AAAAAEgAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNhbnMtRXh0cmFMaWdodC50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILAgMDCAQCAgT/JgDgewAAUCBAAAgAAAAAnwEAAAAAAADIAAUAAAABAPoB9wIQ/wAAAAAAAAAArAAAAAsAAABEZWphVnUgU2FucwAAAABFAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTYW5zLU9ibGlxdWUudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACCwYDAwMECwIE/w4A5//9AFIhIAQKAAAAAL8BAGAAAPffkAEFAAAAAQD6AfcCEP/IAAAAAAAAAKQAAAALAAAARGVqYVZ1IFNhbnMAAAAAPQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1U2Fucy50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBgMDCAQCAgT/LgDn//0A0ikgBAoAAAAA/wEA4AAA/7+QAQUAAAABAPoB9wIQ/8gAAAAAAAAAqAAAAAsAAABEZWphVnUgU2FucwAAAABBAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTYW5zQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAILCAMDBgQCAgT/LgDn//UA0ikgBAoAAAAA/wEAYAAA/7+8AgUAAAABADwC9wIQ/8gAAAAAAAAArwAAAAsAAABEZWphVnUgU2FucwAAAABIAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTYW5zQm9sZE9ibGlxdWUudHRmAAAAAAEAAAABAAAAAAAAAAoAAAACCwgDAwMECwIE/w4A5//1AFIhIAQKAAAAAL8BAGAAAPefvAIFAAAAAQA8AvcCEP/IAAAAAAAAALwAAAAVAAAARGVqYVZ1IFNhbnMgQ29uZGVuc2VkAAAAAEsAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNhbnNDb25kZW5zZWQtQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAILCAYDBgQCAgT/LgDn//UA0ilgBAoAAAAA/wEAYAAACAC8AgQAAAABAAMC9wIQ/8gAAAAAAAAAwwAAABUAAABEZWphVnUgU2FucyBDb25kZW5zZWQAAAAAUgAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1U2Fuc0NvbmRlbnNlZC1Cb2xkT2JsaXF1ZS50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAILCAYDAwQLAgT/DgDn//UAUiEgBAoAAAAAvwEAYAAAAAC8AgQAAAABAAMC9wIQ/8gAAAAAAAAAvwAAABUAAABEZWphVnUgU2FucyBDb25kZW5zZWQAAAAATgAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1U2Fuc0NvbmRlbnNlZC1PYmxpcXVlLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAgsGBgMDBAsCBP8OAOf//QBSISAECgAAAAC/AQBgAAD335ABBAAAAAEAyAH3AhD/yAAAAAAAAAC3AAAAFQAAAERlamFWdSBTYW5zIENvbmRlbnNlZAAAAABGAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTYW5zQ29uZGVuc2VkLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsGBgMIBAICBP8uAOf//QDSKWAECgAAAAD/AQBgAAD/35ABBAAAAAEAyAH3AhD/yAAAAAAAAAC0AAAAEQAAAERlamFWdSBTYW5zIExpZ2h0AAAAAEcAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNhbnNFeHRyYUxpZ2h0LnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsCAwMIBAICBP8mAOB7AABQIAAACAAAAACfAQBgAADXn8gABQAAAAEA+gH3AhD/AAAAAAAAAACyAAAAEAAAAERlamFWdSBTYW5zIE1vbm8AAAAARgAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1U2Fuc01vbm8tQm9sZC50dGYAAAAAAAAAAAEAAAABAAAACgAAAAILBwkDBgQCAgT/IgDm+/EA0CgAAAAAAAAA3wEAYAAACAC8AgUAAAABAFoC9wIQ/8gAAAAAAAAAuQAAABAAAABEZWphVnUgU2FucyBNb25vAAAAAE0AAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNhbnNNb25vLUJvbGRPYmxpcXVlLnR0ZgAAAAABAAAAAQAAAAEAAAAKAAAAAgsHCQMDBAsCBP8CAOb7cQBQIAAAAAAAAACfAQBgAAAAALwCBQAAAAEAWgL3AhD/yAAAAAAAAAC1AAAAEAAAAERlamFWdSBTYW5zIE1vbm8AAAAASQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1U2Fuc01vbm8tT2JsaXF1ZS50dGYAAAAAAQAAAAAAAAABAAAACgAAAAILBgkDAwQLAgT/AgDm+3kAUCAAAAAAAAAAnwEAYAAA19+QAQUAAAABAFoC9wIQ/8gAAAAAAAAArQAAABAAAABEZWphVnUgU2FucyBNb25vAAAAAEEAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNhbnNNb25vLnR0ZgAAAAAAAAAAAAAAAAEAAAAKAAAAAgsGCQMIBAICBP8iAOb7+QDSKAAAAgAAAADfAQBgAADf35ABBQAAAAEAWgL3AhD/yAAAAAAAAACrAAAACwAAAERlamFWdSBTYW5zAAAAAEQAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNhbnNPYmxpcXVlLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAgsGAwMDBAsCBP8OAOf//QBSISAECgAAAAC/AQBgAAD3n5ABBQAAAAEA+gH3AhD/yAAAAAAAAACrAAAADAAAAERlamFWdSBTZXJpZgAAAABDAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTZXJpZi1Cb2xkLnR0ZgAAAAAAAAAAAQAAAAAAAAAKAAAAAgYIAwUGBQICBP8CAOT78QBSIAAECgAAAACfAABgAAAAALwCBQAAAAEANQL3AhD/yAAAAAAAAACxAAAADAAAAERlamFWdSBTZXJpZgAAAABJAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTZXJpZi1Cb2xkSXRhbGljLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAgYIAwUDBQsCBP8CAOT78QBSIAAECgAAAACfAABgAAAAALwCBQAAAAEANQL3AhD/yAAAAAAAAACtAAAADAAAAERlamFWdSBTZXJpZgAAAABFAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTZXJpZi1JdGFsaWMudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACBgYDBQMFCwIE/wIA5Pv5AFIgAAQKAAAAAJ8AAGAAANffkAEFAAAAAQAAAvcCEP/IAAAAAAAAAKYAAAAMAAAARGVqYVZ1IFNlcmlmAAAAAD4AAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNlcmlmLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgYGAwUGBQICBP8CAOT7eQBQIAAECAAAAACfAABgAADXn5ABBQAAAAEAAAL3AhD/yAAAAAAAAACqAAAADAAAAERlamFWdSBTZXJpZgAAAABCAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTZXJpZkJvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACBggDBQYFAgIE/wIA5PtxAFAgAAQIAAAAAJ8AAGAAANefvAIFAAAAAQA1AvcCEP/IAAAAAAAAALAAAAAMAAAARGVqYVZ1IFNlcmlmAAAAAEgAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNlcmlmQm9sZEl0YWxpYy50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAIGCAMFAwULAgT/AgDk+3EAUCAABAgAAAAAnwAAYAAA15+8AgUAAAABADUC9wIQ/8gAAAAAAAAAvgAAABYAAABEZWphVnUgU2VyaWYgQ29uZGVuc2VkAAAAAEwAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL0RlamFWdVNlcmlmQ29uZGVuc2VkLUJvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACBggGBQYFAgIE/wIA5PvxAFIgAAQKAAAAAJ8AAGAAAAAAvAIEAAAAAQD9AfcCEP/IAAAAAAAAAMQAAAAWAAAARGVqYVZ1IFNlcmlmIENvbmRlbnNlZAAAAABSAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy9EZWphVnVTZXJpZkNvbmRlbnNlZC1Cb2xkSXRhbGljLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAgYIBgUDBQsCBP8CAOT78QBSIAAECgAAAACfAABgAAAAALwCBAAAAAEA/QH3AhD/yAAAAAAAAADAAAAAFgAAAERlamFWdSBTZXJpZiBDb25kZW5zZWQAAAAATgAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1U2VyaWZDb25kZW5zZWQtSXRhbGljLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAgYGBgUDBQsCBP8CAOT7+QBSIAAECgAAAACfAABgAADX35ABBAAAAAEAzAH3AhD/yAAAAAAAAAC5AAAAFgAAAERlamFWdSBTZXJpZiBDb25kZW5zZWQAAAAARwAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvRGVqYVZ1U2VyaWZDb25kZW5zZWQudHRmAAAA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AAAAAAAIALkAAAALAAAARGVqYVZ1IFNhbnMAAAAAUgAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvZGVqYXZ1L0RlamFWdVNhbnMtQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAILCAMDBgQCAgT/bgDn//0A0ilgJAoMIAAE/wEAYAAA//+8AgUAAAABADwC9wIQ/8gAAAAAAAAAwAAAAAsAAABEZWphVnUgU2FucwAAAABZAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2Fucy1Cb2xkT2JsaXF1ZS50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAILCAMDAwQLAgT/DgDn//0AUiEgJAoIIAAEvwEAYAAA99+8AgUAAAABADwC9wIQ/8gAAAAAAAAAxQAAABEAAABEZWphVnUgU2FucyBMaWdodAAAAABYAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2Fucy1FeHRyYUxpZ2h0LnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsCAwMIBAICBP8mAOV7AABQIEAACAAAAACfAQAAAAAAAMgABQAAAAEA+gH3AhD/AAAAAAAAAAC8AAAACwAAAERlamFWdSBTYW5zAAAAAFUAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2RlamF2dS9EZWphVnVTYW5zLU9ibGlxdWUudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACCwYDAwMECwIE/w4A5//9AFIhICQKCCAABL8BAGAAAPffkAEFAAAAAQD6AfcCEP/IAAAAAAAAALQAAAALAAAARGVqYVZ1IFNhbnMAAAAATQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvZGVqYXZ1L0RlamFWdVNhbnMudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwYDAwgEAgIE/24A5//9ANIpYCQKDCAABP8BAGAAAP/fkAEFAAAAAQD6AfcCEP/IAAAAAAAAAMwAAAAVAAAARGVqYVZ1IFNhbnMgQ29uZGVuc2VkAAAAAFsAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2RlamF2dS9EZWphVnVTYW5zQ29uZGVuc2VkLUJvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACCwgGAwYEAgIE/24A5//9ANIpYCQKDCAABP8BAGAAAP//vAIEAAAAAQADAvcCEP/IAAAAAAAAANMAAAAVAAAARGVqYVZ1IFNhbnMgQ29uZGVuc2VkAAAAAGIAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2RlamF2dS9EZWphVnVTYW5zQ29uZGVuc2VkLUJvbGRPYmxpcXVlLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAgsIBgMDBAsCBP8OAOf//QBSISAkCgggAAS/AQBgAAD337wCBAAAAAEAAwL3AhD/yAAAAAAAAADPAAAAFQAAAERlamFWdSBTYW5zIENvbmRlbnNlZAAAAABeAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2Fuc0NvbmRlbnNlZC1PYmxpcXVlLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAgsGBgMDBAsCBP8OAOf//QBSISAkCgggAAS/AQBgAAD335ABBAAAAAEAyAH3AhD/yAAAAAAAAADHAAAAFQAAAERlamFWdSBTYW5zIENvbmRlbnNlZAAAAABWAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2Fuc0NvbmRlbnNlZC50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBgYDCAQCAgT/bgDn//0A0ilgJAoMIAAE/wEAYAAA/9+QAQQAAAABAMgB9wIQ/8gAAAAAAAAAwgAAABAAAABEZWphVnUgU2FucyBNb25vAAAAAFYAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2RlamF2dS9EZWphVnVTYW5zTW9uby1Cb2xkLnR0ZgAAAAAAAAAAAQAAAAEAAAAKAAAAAgsHCQMGBAICBP8mAOf7+QDSKAAAAgAAAADfAQBgAADf/7wCBQAAAAEAWgL3AhD/yAAAAAAAAADJAAAAEAAAAERlamFWdSBTYW5zIE1vbm8AAAAAXQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvZGVqYXZ1L0RlamFWdVNhbnNNb25vLUJvbGRPYmxpcXVlLnR0ZgAAAAABAAAAAQAAAAEAAAAKAAAAAgsHCQMDBAsCBP8GAOf7eQBSIAAAAgAAAACfAQBgAADX37wCBQAAAAEAWgL3AhD/yAAAAAAAAADFAAAAEAAAAERlamFWdSBTYW5zIE1vbm8AAAAAWQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvZGVqYXZ1L0RlamFWdVNhbnNNb25vLU9ibGlxdWUudHRmAAAAAAEAAAAAAAAAAQAAAAoAAAACCwYJAwMECwIE/wYA5/t5AFIgAAACAAAAAJ8BAGAAANffkAEFAAAAAQBaAvcCEP/IAAAAAAAAAL0AAAAQAAAARGVqYVZ1IFNhbnMgTW9ubwAAAABRAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2Fuc01vbm8udHRmAAAAAAAAAAAAAAAAAQAAAAoAAAACCwYJAwgEAgIE/yYA5/v5ANIoAAACAAAAAN8BAGAAAN//kAEFAAAAAQBaAvcCEP/IAAAAAAAAALsAAAAMAAAARGVqYVZ1IFNlcmlmAAAAAFMAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2RlamF2dS9EZWphVnVTZXJpZi1Cb2xkLnR0ZgAAAAAAAAAAAQAAAAAAAAAKAAAAAgYIAwUGBQICBP8GAOX7+QBSIAAECgAAAACfAABgAADX37wCBQAAAAEANQL3AhD/yAAAAAAAAADBAAAADAAAAERlamFWdSBTZXJpZgAAAABZAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2VyaWYtQm9sZEl0YWxpYy50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAIGCAMFAwULAgT/BgDl+/kAUiAABAoAAAAAnwAAYAAA19+8AgUAAAABADUC9wIQ/8gAAAAAAAAAvQAAAAwAAABEZWphVnUgU2VyaWYAAAAAVQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvZGVqYXZ1L0RlamFWdVNlcmlmLUl0YWxpYy50dGYAAAAAAQAAAAAAAAAAAAAACgAAAAIGBgMFAwULAgT/BgDl+/kAUiAABAoAAAAAnwAAYAAA19+QAQUAAAABAAAC9wIQ/8gAAAAAAAAAtgAAAAwAAABEZWphVnUgU2VyaWYAAAAATgAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvZGVqYXZ1L0RlamFWdVNlcmlmLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgYGAwUGBQICBP8GAOX7+QBSIAAECgAAAACfAABgAADX35ABBQAAAAEAAAL3AhD/yAAAAAAAAADOAAAAFgAAAERlamFWdSBTZXJpZiBDb25kZW5zZWQAAAAAXAAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvZGVqYXZ1L0RlamFWdVNlcmlmQ29uZGVuc2VkLUJvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACBggGBQYFAgIE/wYA5fv5AFIgAAQKAAAAAJ8AAGAAANffvAIEAAAAAQD9AfcCEP/IAAAAAAAAANQAAAAWAAAARGVqYVZ1IFNlcmlmIENvbmRlbnNlZAAAAABiAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2VyaWZDb25kZW5zZWQtQm9sZEl0YWxpYy50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAIGCAYFAwULAgT/BgDl+/kAUiAABAoAAAAAnwAAYAAA19+8AgQAAAABAP0B9wIQ/8gAAAAAAAAA0AAAABYAAABEZWphVnUgU2VyaWYgQ29uZGVuc2VkAAAAAF4AAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2RlamF2dS9EZWphVnVTZXJpZkNvbmRlbnNlZC1JdGFsaWMudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACBgYGBQMFCwIE/wYA5fv5AFIgAAQKAAAAAJ8AAGAAANffkAEEAAAAAQDMAfcCEP/IAAAAAAAAAMkAAAAWAAAARGVqYVZ1IFNlcmlmIENvbmRlbnNlZAAAAABXAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9kZWphdnUvRGVqYVZ1U2VyaWZDb25kZW5zZWQudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACBgYGBQYFAgIE/wYA5fv5AFIgAAQKAAAAAJ8AAGAAANffkAEEAAAAAQDMAfcCEP/IAAAAAAAAAMUAAAAPAAAATGliZXJhdGlvbiBNb25vAAAAAFoAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2xpYmVyYXRpb24vTGliZXJhdGlvbk1vbm8tQm9sZC50dGYAAAAAAAAAAAEAAAABAAAACgAAAAIHBwkCAgUCBASvAgCg+3gAQAAAAAAAAAAAnwAAYAAA19+8AgUABQgBAFgCeQIw/+MAEAKSAgAAywAAAA8AAABMaWJlcmF0aW9uIE1vbm8AAAAAYAAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvbGliZXJhdGlvbi9MaWJlcmF0aW9uTW9uby1Cb2xkSXRhbGljLnR0ZgAAAAABAAAAAQAAAAEAAAAKAAAAAgcHCQICBQkEBK8CAKD7eABAAAAAAAAAAACfAABgAADX37wCBQAFCAEAWAJ5AjD/4wAQApICAADHAAAADwAAAExpYmVyYXRpb24gTW9ubwAAAABcAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9saWJlcmF0aW9uL0xpYmVyYXRpb25Nb25vLUl0YWxpYy50dGYAAAAAAQAAAAAAAAABAAAACgAAAAIHBAkCAgUJBASvAgCg+3gAQAAAAAAAAAAAnwAAYAAA19+QAQUABQgBAFgCZAJE/wwBEAKSAgAAyAAAAA8AAABMaWJlcmF0aW9uIE1vbm8AAAAAXQAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvbGliZXJhdGlvbi9MaWJlcmF0aW9uTW9uby1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAEAAAAKAAAAAgcECQICBQIEBK8CAKD7eABAAAAAAAAAAACfAABgAADX35ABBQAFCAEAWAJkAkT/DAEQApICAADFAAAADwAAAExpYmVyYXRpb24gU2FucwAAAABaAAAAL3Vzci9zaGFyZS9mb250cy9jdXN0b20vY3VzdG9tL2RvYy1saW51eC1mb250cy90cnVldHlwZS9saWJlcmF0aW9uL0xpYmVyYXRpb25TYW5zLUJvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACCwcEAgICAgIErwIAoPt4AFAAAAAAAAAAAJ8AAGAAANffvAIFAAUIAQBkAtgCLv+VABACrwIAAMsAAAAPAAAATGliZXJhdGlvbiBTYW5zAAAAAGAAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2xpYmVyYXRpb24vTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAILBwQCAgIJAgSvAgCg+3gAUAAAAAAAAAAAnwAAYAAA19+8AgUABQgBAGUC2AIu/5UAEAKvAgAAxwAAAA8AAABMaWJlcmF0aW9uIFNhbnMAAAAAXAAAAC91c3Ivc2hhcmUvZm9udHMvY3VzdG9tL2N1c3RvbS9kb2MtbGludXgtZm9udHMvdHJ1ZXR5cGUvbGliZXJhdGlvbi9MaWJlcmF0aW9uU2Fucy1JdGFsaWMudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACCwYEAgICCQIErwIAoPt4AFAAAAAAAAAAAJ8AAGAAANffkAEFAAUIAQBOAtgCMf+VABACrwIAAMgAAAAPAAAATGliZXJhdGlvbiBTYW5zAAAAAF0AAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2xpYmVyYXRpb24vTGliZXJhdGlvblNhbnMtUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBgQCAgICAgSvAgCg+3gAUAAAAAAAAAAAnwAAYAAA19+QAQUABQgBAE0C2AIu/5UAEAKvAgAA0gAAABYAAABMaWJlcmF0aW9uIFNhbnMgTmFycm93AAAAAGAAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2xpYmVyYXRpb24vTGliZXJhdGlvblNhbnNOYXJyb3ctQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAILBwYCAgIDAgSvAgCg+3gAUAAAAAAAAAAAnwAAYAAA19+8AgMABQgBAIgB2AIu/4MAAAAAAAAA2AAAABYAAABMaWJlcmF0aW9uIFNhbnMgTmFycm93AAAAAGYAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2xpYmVyYXRpb24vTGliZXJhdGlvblNhbnNOYXJyb3ctQm9sZEl0YWxpYy50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAILBwYCAgIKAgSvAgCg+3gAUAAAAAAAAAAAnwAAYAAA19+8AgMABQgBAIgB2AIu/4MAAAAAAAAA1AAAABYAAABMaWJlcmF0aW9uIFNhbnMgTmFycm93AAAAAGIAAAAvdXNyL3NoYXJlL2ZvbnRzL2N1c3RvbS9jdXN0b20vZG9jLWxpbnV4LWZvbnRzL3RydWV0eXBlL2xpYmVyYXRpb24vTGliZXJhdGlvblNhbnNOYXJyb3ctSXRhbGljLnR0ZgAAAAABAAAAAAAA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AAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZGVqYXZ1L0RlamFWdVNhbnNDb25kZW5zZWQtQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAILCAYDBgQCAgT/bgDn//0A0ilgJAoMIAAE/wEAYAAA//+8AgQAAAABAAMC9wIQ/8gAAAAAAAAAyQAAABUAAABEZWphVnUgU2FucyBDb25kZW5zZWQAAAAAWAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9kZWphdnUvRGVqYVZ1U2Fuc0NvbmRlbnNlZC1Cb2xkT2JsaXF1ZS50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAILCAYDAwQLAgT/DgDn//0AUiEgJAoIIAAEvwEAYAAA99+8AgQAAAABAAMC9wIQ/8gAAAAAAAAAxQAAABUAAABEZWphVnUgU2FucyBDb25kZW5zZWQAAAAAVAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9kZWphdnUvRGVqYVZ1U2Fuc0NvbmRlbnNlZC1PYmxpcXVlLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAgsGBgMDBAsCBP8OAOf//QBSISAkCgggAAS/AQBgAAD335ABBAAAAAEAyAH3AhD/yAAAAAAAAAC9AAAAFQAAAERlamFWdSBTYW5zIENvbmRlbnNlZAAAAABMAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2RlamF2dS9EZWphVnVTYW5zQ29uZGVuc2VkLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsGBgMIBAICBP9uAOf//QDSKWAkCgwgAAT/AQBgAAD/35ABBAAAAAEAyAH3AhD/yAAAAAAAAAC4AAAAEAAAAERlamFWdSBTYW5zIE1vbm8AAAAATAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9kZWphdnUvRGVqYVZ1U2Fuc01vbm8tQm9sZC50dGYAAAAAAAAAAAEAAAABAAAACgAAAAILBwkDBgQCAgT/JgDn+/kA0igAAAIAAAAA3wEAYAAA3/+8AgUAAAABAFoC9wIQ/8gAAAAAAAAAvwAAABAAAABEZWphVnUgU2FucyBNb25vAAAAAFMAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZGVqYXZ1L0RlamFWdVNhbnNNb25vLUJvbGRPYmxpcXVlLnR0ZgAAAAABAAAAAQAAAAEAAAAKAAAAAgsHCQMDBAsCBP8GAOf7eQBSIAAAAgAAAACfAQBgAADX37wCBQAAAAEAWgL3AhD/yAAAAAAAAAC7AAAAEAAAAERlamFWdSBTYW5zIE1vbm8AAAAATwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9kZWphdnUvRGVqYVZ1U2Fuc01vbm8tT2JsaXF1ZS50dGYAAAAAAQAAAAAAAAABAAAACgAAAAILBgkDAwQLAgT/BgDn+3kAUiAAAAIAAAAAnwEAYAAA19+QAQUAAAABAFoC9wIQ/8gAAAAAAAAAswAAABAAAABEZWphVnUgU2FucyBNb25vAAAAAEcAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZGVqYXZ1L0RlamFWdVNhbnNNb25vLnR0ZgAAAAAAAAAAAAAAAAEAAAAKAAAAAgsGCQMIBAICBP8mAOf7+QDSKAAAAgAAAADfAQBgAADf/5ABBQAAAAEAWgL3AhD/yAAAAAAAAACxAAAADAAAAERlamFWdSBTZXJpZgAAAABJAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2RlamF2dS9EZWphVnVTZXJpZi1Cb2xkLnR0ZgAAAAAAAAAAAQAAAAAAAAAKAAAAAgYIAwUGBQICBP8GAOX7+QBSIAAECgAAAACfAABgAADX37wCBQAAAAEANQL3AhD/yAAAAAAAAAC3AAAADAAAAERlamFWdSBTZXJpZgAAAABPAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2RlamF2dS9EZWphVnVTZXJpZi1Cb2xkSXRhbGljLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAgYIAwUDBQsCBP8GAOX7+QBSIAAECgAAAACfAABgAADX37wCBQAAAAEANQL3AhD/yAAAAAAAAACzAAAADAAAAERlamFWdSBTZXJpZgAAAABLAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2RlamF2dS9EZWphVnVTZXJpZi1JdGFsaWMudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACBgYDBQMFCwIE/wYA5fv5AFIgAAQKAAAAAJ8AAGAAANffkAEFAAAAAQAAAvcCEP/IAAAAAAAAAKwAAAAMAAAARGVqYVZ1IFNlcmlmAAAAAEQAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZGVqYXZ1L0RlamFWdVNlcmlmLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgYGAwUGBQICBP8GAOX7+QBSIAAECgAAAACfAABgAADX35ABBQAAAAEAAAL3AhD/yAAAAAAAAADEAAAAFgAAAERlamFWdSBTZXJpZiBDb25kZW5zZWQAAAAAUgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9kZWphdnUvRGVqYVZ1U2VyaWZDb25kZW5zZWQtQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAIGCAYFBgUCAgT/BgDl+/kAUiAABAoAAAAAnwAAYAAA19+8AgQAAAABAP0B9wIQ/8gAAAAAAAAAygAAABYAAABEZWphVnUgU2VyaWYgQ29uZGVuc2VkAAAAAFgAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZGVqYXZ1L0RlamFWdVNlcmlmQ29uZGVuc2VkLUJvbGRJdGFsaWMudHRmAAAAAAEAAAABAAAAAAAAAAoAAAACBggGBQMFCwIE/wYA5fv5AFIgAAQKAAAAAJ8AAGAAANffvAIEAAAAAQD9AfcCEP/IAAAAAAAAAMYAAAAWAAAARGVqYVZ1IFNlcmlmIENvbmRlbnNlZAAAAABUAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2RlamF2dS9EZWphVnVTZXJpZkNvbmRlbnNlZC1JdGFsaWMudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACBgYGBQMFCwIE/wYA5fv5AFIgAAQKAAAAAJ8AAGAAANffkAEEAAAAAQDMAfcCEP/IAAAAAAAAAL8AAAAWAAAARGVqYVZ1IFNlcmlmIENvbmRlbnNlZAAAAABNAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2RlamF2dS9EZWphVnVTZXJpZkNvbmRlbnNlZC50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAIGBgYFBgUCAgT/BgDl+/kAUiAABAoAAAAAnwAAYAAA19+QAQQAAAABAMwB9wIQ/8gAAAAAAAAAvAAAABMAAABEcm9pZCBTYW5zIEZhbGxiYWNrAAAAAE0AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZHJvaWQvRHJvaWRTYW5zRmFsbGJhY2tGdWxsLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgAAAAAAAf8CAJH7/N8rNgAAAAAAAAD/AT8gAAD/15ABBQAFCAEA4AP9AhL/PgAXAsoCCACxAAAABgAAAEphbXJ1bAAAAABPAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2ZvbnRzLWJlbmctZXh0cmEvSmFtcnVsTm9ybWFsLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgAGAwAAAAAAAAOAAYBCIAAAAAAAAAAAAAABAAAAAAAAgPQBBgAAAAEAVgIfAzj/WQAAAAAAAACxAAAABgAAAExpa2hhbgAAAABPAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2ZvbnRzLWJlbmctZXh0cmEvTGlraGFuTm9ybWFsLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgAGAwAAAAAAAAOAAYBCIAAAAAAAAAAAAAABAAAAAAAAgPQBBQAAAAEAEQIfAzj/WQAAAAAAAADfAAAADAAAAE11a3RpIE5hcnJvdwEAAAAlAAAAw6DCpsKuw6DCp8KBw6DCpuKAosOgwqfCjcOgwqbCpMOgwqbCv04AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZm9udHMtYmVuZy1leHRyYS9NdWt0aU5hcnJvdy50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAABgAEAAAAAAAAAAAAAAAAAAAAAAAAAAACQAQUAAAABABkC2QS2AQAAAAAAAAAA4QAAAAwAAABNdWt0aSBOYXJyb3cBAAAAIwAAAOCmruCngeCmleCnjeCmpOCmvyAg4Kaq4Ka+4Kak4Kao4Ka+UgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9mb250cy1iZW5nLWV4dHJhL011a3RpTmFycm93Qm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAAAAAAAAAAAAAABgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AgUAAAABABwC2QS2AQAA1AIZAgAAwQAAAAMAAABBbmkBAAAAGAAAAMOgwqbigKbDoMKmwqjDoMKmwr8gIER2ZkYAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZm9udHMtYmVuZy1leHRyYS9hbmkudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAEFAAAAAQC5AdkEtgEAAAAAAAAAANAAAAAKAAAATWl0cmEgTW9ubwEAAAAeAAAAXHUwOWFlXHUwOWJmXHUwOWE0XHUwOWNkXHUwOWIwSAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9mb250cy1iZW5nLWV4dHJhL21pdHJhLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAAsACQAAAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAJABBQAAAAEAEAENAyb/AAAAAAAAAACpAAAABQAAAFJla2hhAAAAAEgAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZm9udHMtZ3Vqci1leHRyYS9SZWtoYS50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAIABgAEAAAAAAABAASAACAAAAAAAAAAAAAAAAAAAAAAAID0AQUAAAABALEBAgOD/lcAAAAAAAAAtgAAAAYAAABwYWRtYWEBAAAABwAAAHBhZG1tYWFJAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2ZvbnRzLWd1anItZXh0cmEvcGFkbWFhLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgAIAAQAAAAAAC8ABIBIIAAAAAAAAAAAAAABAAAAAADUwPQBBQAAAAEA5AEfAzj/AAAAAAAACAC1AAAACwAAAFBvdGhhbmEyMDAwAAAAAE4AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZm9udHMtdGVsdS1leHRyYS9Qb3RoYW5hMjAwMC50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAAABAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAACQAQUAAAABADECcAO4/AAAAAAAAAAAswAAAAoAAABWZW1hbmEyMDAwAAAAAE0AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZm9udHMtdGVsdS1leHRyYS92ZW1hbmEyMDAwLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAAAEAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAJABBQAAAAEAaQJwA7j8AAAAAAAAAACnAAAACAAAAEZyZWVNb25vAAAAAEMAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZnJlZWZvbnQvRnJlZU1vbm8udHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACDwQJAgIFAgQE/y4A5P9/AMIokCAAAAAQAP8BAGAAAP//kAEFAAUFAQBYAiADOP8AAKEBMwIAAKsAAAAIAAAARnJlZU1vbm8AAAAARwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9mcmVlZm9udC9GcmVlTW9ub0JvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACDwYJAggFAgQE/woApPt5AEAgAAAAAAAAAL8BAGAAAPffvAIFAAUFAQBYAiADOP8AALUBRwIAALIAAAAIAAAARnJlZU1vbm8AAAAATgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9mcmVlZm9udC9GcmVlTW9ub0JvbGRPYmxpcXVlLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAg8GCQICBQkEBP8KAKT7YQBAIAAAAAAAAAC/AQBgAAAAALwCBQAFBQEAWAIgAzj/AAC1AUcCAACuAAAACAAAAEZyZWVNb25vAAAAAEoAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZnJlZWZvbnQvRnJlZU1vbm9PYmxpcXVlLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAg8ECQICBQkEBP8OAOT7YQBAIAAAAAAAAAC/AQBgAAAAAJABBQAFBQEAWAIgAzj/AAChATMCAACnAAAACAAAAEZyZWVTYW5zAAAAAEMAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZnJlZWZvbnQvRnJlZVNhbnMudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwUEAgICAgIE/56D5P/9AEagMAAAhAUAAL8BAGAAAPffkAEFAAUIAQCRAiADOP9kAAwC2QIAAKsAAAAIAAAARnJlZVNhbnMAAAAARwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9mcmVlZm9udC9GcmVlU2Fuc0JvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACCwcEAgICAgIE/44C5P/hAEAgEAAABAAAAL8BAGAAAAAAWAIFAAUIAQCCAiADOP9kABwC2QIAALIAAAAIAAAARnJlZVNhbnMAAAAATgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9mcmVlZm9udC9GcmVlU2Fuc0JvbGRPYmxpcXVlLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAgsHBAICAgkCBP8OAOT/YQBAIBAAAAQAAAC/AQBgAAAAAFgCBQAFCAEAfwIgAzj/ZAAcAtgCAACuAAAACAAAAEZyZWVTYW5zAAAAAEoAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZnJlZWZvbnQvRnJlZVNhbnNPYmxpcXVlLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAgsFBAICAgkCBP8OAeT/YQBAIBAAAAQAAAC/AQBgAAAAAJABBQAFCAEAWAIgAzj/ZAAMAtkCAACpAAAACQAAAEZyZWVTZXJpZgAAAABEAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2ZyZWVmb250L0ZyZWVTZXJpZi50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAICBgMFBAUCAwT/r5/l//0AwikbUENDAAAE/wEBYAAA//+QAQUABQEBAGoCIAM4/2QAwgGWAgAArQAAAAkAAABGcmVlU2VyaWYAAAAASAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9mcmVlZm9udC9GcmVlU2VyaWZCb2xkLnR0ZgAAAAAAAAAAAQAAAAAAAAAKAAAAAgIIAwcFBQIDBP+vAuX/eQDCKBMAAEAAAAD/AQFgAAD//7wCBQAFAQEAdAIgAzj/ZADNAaECAACzAAAACQAAAEZyZWVTZXJpZgAAAABOAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2ZyZWVmb250L0ZyZWVTZXJpZkJvbGRJdGFsaWMudHRmAAAAAAEAAAABAAAAAAAAAAoAAAACAggDBgUFCQME/w4A5f9hAEIgEAAAQAAAAL8BAWAAAAAAvAIFAAUBAQBUAiADOP9kAMEBnQIAAK8AAAAJAAAARnJlZVNlcmlmAAAAAEoAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvZnJlZWZvbnQvRnJlZVNlcmlmSXRhbGljLnR0ZgAAAAABAAAAAAAAAAAAAAAKAAAAAgIGAwUEBQkDBP+OAeX/YQBCIBAAAEAAAAC/AQFgAAAAAJABBQAFAQEALwIgAzj/ZAC5AYwCAACtAAAACAAAAEthY3N0T25lAAAAAEkAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMva2Fjc3Qtb25lL0thY3N0T25lLUJvbGQudHRmAAAAAAAAAAABAAAAAAAAAAoAAAACAAgDAAAAAAAAAyAAgAAAAIAIAAAAAAAAAEAAAAAAAAAAvAIFAAAAAQBOAtADq/4cAAAAAAAAAKgAAAAIAAAAS2Fjc3RPbmUAAAAARAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9rYWNzdC1vbmUvS2Fjc3RPbmUudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACAAUDAAAAAAAAAyAAgAAAAIAIAAAAAAAAAEAAAAAAAAAAkAEFAAAAAQAtAtADq/4cAAAAAAAAAKQAAAAIAAAAS2Fjc3RBcnQAAAAAQAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9rYWNzdC9LYWNzdEFydC50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAIAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQAAAAAAAAAD0AQUAAAABANoBDQPc/hwAAAAAAAAApgAAAAkAAABLYWNzdEJvb2sAAAAAQQAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9rYWNzdC9LYWNzdEJvb2sudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAEAAAAAAAAAA9AEFAAAAAQC1AQ0D3P4cAAAAAAAAALIAAAAPAAAAS2Fjc3REZWNvcmF0aXZlAAAAAEcAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMva2Fjc3QvS2Fjc3REZWNvcmF0aXZlLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAABAAAAAAAAAAPQBBQAAAAEAAQINA9z+HAAAAAAAAACsAAAADAAAAEthY3N0RGlnaXRhbAAAAABEAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2thY3N0L0thY3N0RGlnaXRhbC50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAIAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQAAAAAAAAAD0AQUAAAABAFQCDQPc/hwAAAAAAAAAqAAAAAoAAABLYWNzdEZhcnNpAAAAAEIAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMva2Fjc3QvS2Fjc3RGYXJzaS50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAIAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQAAAAAAAAAD0AQUAAAABANMBDQPc/hwAAAAAAAAAqgAAAAsAAABLYWNzdExldHRlcgAAAABDAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2thY3N0L0thY3N0TGV0dGVyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAABAAAAAAAAAAPQBBQAAAAEAygENA9z+HAAAAAAAAACoAAAACgAAAEthY3N0TmFza2gAAAAAQgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9rYWNzdC9LYWNzdE5hc2toLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAABAAAAAAAAAAPQBBQAAAAEA0QENA9z+HAAAAAAAAACqAAAACwAAAEthY3N0T2ZmaWNlAAAAAEMAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMva2Fjc3QvS2Fjc3RPZmZpY2UudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAEAAAAAAAAAA9AEFAAAAAQC9AQ0D3P4cAAAAAAAAAKQAAAAIAAAAS2Fjc3RQZW4AAAAAQAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9rYWNzdC9LYWNzdFBlbi50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAIAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQAAAAAAAAAD0AQUAAAABAMIBDQPc/hwAAAAAAAAAqgAAAAsAAABLYWNzdFBvc3RlcgAAAABDAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2thY3N0L0thY3N0UG9zdGVyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAABAAAAAAAAAAPQBBQAAAAEAgQINA9z+HAAAAAAAAACmAAAACQAAAEthY3N0UXVybgAAAABBAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2thY3N0L0thY3N0UXVybi50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAQAAAAAAAAACQAQUAAAABAEkCDQPc/hwAAAAAAAAAqgAAAAsAAABLYWNzdFNjcmVlbgAAAABDAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2thY3N0L0thY3N0U2NyZWVuLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAABBAAAAAAAAAPQBBQAAAAEAXgINA9z+HAAAAAAAAACoAAAACgAAAEthY3N0VGl0bGUAAAAAQgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9rYWNzdC9LYWNzdFRpdGxlLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAABAAAAAAAAAAPQBBQAAAAEAwQINA9z+HAAAAAAAAACqAAAACwAAAEthY3N0VGl0bGVMAAAAAEMAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMva2Fjc3QvS2Fjc3RUaXRsZUwudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAkAEFAAAAAQC1Ag0D3P4cAAAAAAAAAK4AAAANAAAAbXJ5X0thY3N0UXVybgAAAABFAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2thY3N0L21yeV9LYWNzdFF1cm4udHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACBgYDBQYFAgIELyAAgAgAAIAIAAAAAAAAAEAAAAAAABigkAEFAAAAAQDnAfcCEP8AAAAAAAAEALsAAAAPAAAATGliZXJhdGlvbiBNb25vAAAAAFAAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbGliZXJhdGlvbi9MaWJlcmF0aW9uTW9uby1Cb2xkLnR0ZgAAAAAAAAAAAQAAAAEAAAAKAAAAAgcHCQICBQIEBK8CAKD7eABAAAAAAAAAAACfAABgAADX37wCBQAFCAEAWAJ5AjD/4wAQApICAADBAAAADwAAAExpYmVyYXRpb24gTW9ubwAAAABWAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2xpYmVyYXRpb24vTGliZXJhdGlvbk1vbm8tQm9sZEl0YWxpYy50dGYAAAAAAQAAAAEAAAABAAAACgAAAAIHBwkCAgUJBASvAgCg+3gAQAAAAAAAAAAAnwAAYAAA19+8AgUABQgBAFgCeQIw/+MAEAKSAgAAvQAAAA8AAABMaWJlcmF0aW9uIE1vbm8AAAAAUgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9saWJlcmF0aW9uL0xpYmVyYXRpb25Nb25vLUl0YWxpYy50dGYAAAAAAQAAAAAAAAABAAAACgAAAAIHBAkCAgUJBASvAgCg+3gAQAAAAAAAAAAAnwAAYAAA19+QAQUABQgBAFgCZAJE/wwBEAKSAgAAvgAAAA8AAABMaWJlcmF0aW9uIE1vbm8AAAAAUwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9saWJlcmF0aW9uL0xpYmVyYXRpb25Nb25vLVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAQAAAAoAAAACBwQJAgIFAgQErwIAoPt4AEAAAAAAAAAAAJ8AAGAAANffkAEFAAUIAQBYAmQCRP8MARACkgIAALsAAAAPAAAATGliZXJhdGlvbiBTYW5zAAAAAFAAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbGliZXJhdGlvbi9MaWJlcmF0aW9uU2Fucy1Cb2xkLnR0ZgAAAAAAAAAAAQAAAAAAAAAKAAAAAgsHBAICAgICBK8CAKD7eABQAAAAAAAAAACfAABgAADX37wCBQAFCAEAZALYAi7/lQAQAq8CAADBAAAADwAAAExpYmVyYXRpb24gU2FucwAAAABWAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2xpYmVyYXRpb24vTGliZXJhdGlvblNhbnMtQm9sZEl0YWxpYy50dGYAAAAAAQAAAAEAAAAAAAAACgAAAAILBwQCAgIJAgSvAgCg+3gAUAAAAAAAAAAAnwAAYAAA19+8AgUABQgBAGYC2AIu/5UAEAKvAgAAvQAAAA8AAABMaWJlcmF0aW9uIFNhbnMAAAAAUgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9saWJlcmF0aW9uL0xpYmVyYXRpb25TYW5zLUl0YWxpYy50dGYAAAAAAQAAAAAAAAAAAAAACgAAAAILBgQCAgIJAgSvAgCg+3gAUAAAAAAAAAAAnwAAYAAA19+QAQUABQgBAE4C2AIx/5UAEAKvAgAAvgAAAA8AAABMaWJlcmF0aW9uIFNhbnMAAAAAUwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9saWJlcmF0aW9uL0xpYmVyYXRpb25TYW5zLVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwYEAgICAgIErwIAoPt4AFAAAAAAAAAAAJ8AAGAAANffkAEFAAUIAQBNAtgCLv+VABACrwIAAMgAAAAWAAAATGliZXJhdGlvbiBTYW5zIE5hcnJvdwAAAABWAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2xpYmVyYXRpb24vTGliZXJhdGlvblNhbnNOYXJyb3ctQm9sZC50dGYAAAAAAAAAAAEAAAAAAAAACgAAAAILBwYCAgIDAgSvAgCg+3gAUAAAAAAAAAAAnwAAYAAA19+8AgMABQgBAIgB2AIu/4MAAAAAAAAAzgAAABYAAABMaWJlcmF0aW9uIFNhbnMgTmFycm93AAAAAFwAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbGliZXJhdGlvbi9MaWJlcmF0aW9uU2Fuc05hcnJvdy1Cb2xkSXRhbGljLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAgsHBgICAgoCBK8CAKD7eABQAAAAAAAAAACfAABgAADX37wCAwAFCAEAiAHYAi7/gwAAAAAAAADKAAAAFgAAAExpYmVyYXRpb24gU2FucyBOYXJyb3cAAAAAWAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9saWJlcmF0aW9uL0xpYmVyYXRpb25TYW5zTmFycm93LUl0YWxpYy50dGYAAAAAAQAAAAAAAAAAAAAACgAAAAILBgYCAgIKAgSvAgCg+3gAUAAAAAAAAAAAnwAAYAAA19+QAQMABQgBAGkB2AIu/4MAAAAAAAAAywAAABYAAABMaWJlcmF0aW9uIFNhbnMgTmFycm93AAAAAFkAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbGliZXJhdGlvbi9MaWJlcmF0aW9uU2Fuc05hcnJvdy1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsGBgICAgMCBK8CAKD7eABQAAAAAAAAAACfAABgAADX35ABAwAFCAEAaQHYAi7/gwAAAAAAAAC9AAAAEAAAAExpYmVyYXRpb24gU2VyaWYAAAAAUQAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9saWJlcmF0aW9uL0xpYmVyYXRpb25TZXJpZi1Cb2xkLnR0ZgAAAAAAAAAAAQAAAAAAAAAKAAAAAgIIAwcFBQIDBK8CAKD7eABQAAAAAAAAAACfAABgAADX37wCBQAFAQEAUgKlAin/lQDKAY4CAADDAAAAEAAAAExpYmVyYXRpb24gU2VyaWYAAAAAVwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9saWJlcmF0aW9uL0xpYmVyYXRpb25TZXJpZi1Cb2xkSXRhbGljLnR0ZgAAAAABAAAAAQAAAAAAAAAKAAAAAgIHAwYFBQkDBK8CAKD7eABQAAAAAAAAAACfAABgAADX37wCBQAFAQEAQgKlAin/lQDKAY4CAAC/AAAAEAAAAExpYmVyYXRpb24gU2VyaWYAAAAAUwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9saWJlcmF0aW9uL0xpYmVyYXRpb25TZXJpZi1JdGFsaWMudHRmAAAAAAEAAAAAAAAAAAAAAAoAAAACAgUDBQQFCQMErwIAoPt4AFAAAAAAAAAAAJ8AAGAAANffkAEFAAUBAQAvArYCKf+VAMoBjgIAAMAAAAAQAAAATGliZXJhdGlvbiBTZXJpZgAAAABUAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2xpYmVyYXRpb24vTGliZXJhdGlvblNlcmlmLVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACAgYDBQQFAgMErwIAoPt4AFAAAAAAAAAAAJ8AAGAAANffkAEFAAUBAQA3ArUCKf+VAMoBjgIAALkAAAAOAAAATG9oaXQgQXNzYW1lc2UAAAAATwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9sb2hpdC1hc3NhbWVzZS9Mb2hpdC1Bc3NhbWVzZS50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBgAAAAAAAAADgAGAQiAAAAAAAAAAAAAAAQAAAAAAAACQAQUAAAABAGgCzwOc/gAAAAAAAAAAtgAAAA0AAABMb2hpdCBCZW5nYWxpAAAAAE0AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbG9oaXQtYmVuZ2FsaS9Mb2hpdC1CZW5nYWxpLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsGAAAAAAAAAAOAAYBCIAAAAAAAAAAAAAABAAAAAAAAAJABBQAAAAEAaALPA5z+AAAAAAAAAAC/AAAAEAAAAExvaGl0IERldmFuYWdhcmkAAAAAUwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9sb2hpdC1kZXZhbmFnYXJpL0xvaGl0LURldmFuYWdhcmkudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwYAAAAAAAAAI4AAgEIgAAAAAAAAAAAAAAEAAAAAAAAAkAEFAAAAAQALAs8DnP4AAOgBigIAALkAAAAOAAAATG9oaXQgR3VqYXJhdGkAAAAATwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9sb2hpdC1ndWphcmF0aS9Mb2hpdC1HdWphcmF0aS50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBgAAAAAAAAADgASAQiAAAAAAAAAAAAAAAQAAAAAAAACQAQUAAAABAIcChAO4/gAAAAAAAAAAtgAAAA0AAABMb2hpdCBLYW5uYWRhAAAAAE0AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbG9oaXQta2FubmFkYS9Mb2hpdC1LYW5uYWRhLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsGAAAAAAAAAAOAQIACIAAAAAAAAAAAAAABAAAAAAAAAJABBQAAAAEAsAJuA1X9wwAAAAAAAAC8AAAADwAAAExvaGl0IE1hbGF5YWxhbQAAAABRAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2xvaGl0LW1hbGF5YWxhbS9Mb2hpdC1NYWxheWFsYW0udHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwYAAAAAAAAAAYCAgAAgAAAAAAAAAAAAAAEAAAAAAAAAkAEFAAAAAQB2A3oCk/4AAAAAAAAAAK4AAAAKAAAATG9oaXQgT2RpYQAAAABIAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2xvaGl0LW9yaXlhL0xvaGl0LU9kaWEudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwYAAAAAAAAAAYAIgAIgAAAAAAAAAAAAAAEAAAAAAAAAkAEFAAAAAQCkAvcCEP8AAAAAAAAAALgAAAAOAAAATG9oaXQgR3VybXVraGkAAAAATgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9sb2hpdC1wdW5qYWJpL0xvaGl0LUd1cm11a2hpLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsGAAAAAAAAAAOAAoBCIAAAAAAAAAAAAAABAAAAAAAAAJABBQAAAAEAdQKSBHb9BAEAAAAAAADOAAAAFQAAAExvaGl0IFRhbWlsIENsYXNzaWNhbAAAAABdAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL2xvaGl0LXRhbWlsLWNsYXNzaWNhbC9Mb2hpdC1UYW1pbC1DbGFzc2ljYWwudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwYAAAAAAAAAA4AQgEIgAAAAAAAAAAAAAAEAAAAAAAAAkAEFAAAAAQDsAlcFiP0TAAAAAAAAALAAAAALAAAATG9oaXQgVGFtaWwAAAAASQAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9sb2hpdC10YW1pbC9Mb2hpdC1UYW1pbC50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBgAAAAAAAABjgBCAQyAAEAAAAAAAAAAAAQAAgAAAAACQAQUAAAABAMQCVwWI/RMAAAAAAAAAswAAAAwAAABMb2hpdCBUZWx1Z3UAAAAASwAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9sb2hpdC10ZWx1Z3UvTG9oaXQtVGVsdWd1LnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsGAAAAAAAAAC+AIIACIAAAAAAAAAAAAACTAAAAAAAAAJABBQAAAAEAEwIrBgP9EwDoAYoCAADKAAAAEAAAAE5hbnVtQmFydW5Hb3RoaWMBAAAAEgAAAOuCmOuIlOuwlOuluOqzoOuUlUgAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbmFudW0vTmFudW1CYXJ1bkdvdGhpYy50dGYAAAAA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/QAAAAAAAAAA0gAAABEAAABOb3RvIE5hc2toIEFyYWJpYwAAAABlAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b05hc2toQXJhYmljLWhpbnRlZC9Ob3RvTmFza2hBcmFiaWMtUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBQIEBQQCAgQDIACAACAAgAgAAAAAAAAAQQAAAAAACACQAQUAAggBAPQCLASH/QAAAAAAAAAA1AAAABQAAABOb3RvIE5hc2toIEFyYWJpYyBVSQAAAABkAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b05hc2toQXJhYmljLWhpbnRlZC9Ob3RvTmFza2hBcmFiaWNVSS1Cb2xkLnR0ZgAAAAAAAAAAAQAAAAAAAAAKAAAAAgsIAgQFBAICBAMgAIAAIACACAAAAAAAAABBAAAAAAAIALwCBQACCAEABwMsBNz+AAAAAAAAAADXAAAAFAAAAE5vdG8gTmFza2ggQXJhYmljIFVJAAAAAGcAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbm90by9Ob3RvTmFza2hBcmFiaWMtaGludGVkL05vdG9OYXNraEFyYWJpY1VJLVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwUCBAUEAgIEAyAAgAAgAIAIAAAAAAAAAEEAAAAAAAgAkAEFAAIIAQDyAiwE3P4AAAAAAAAAAMgAAAAYAAAATm90byBTYW5zIEFkbGFtIFVuam9pbmVkAAAAAFQAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbm90by9Ob3RvU2Fuc0FkbGFtVW5qb2luZWQtUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBQIEBQQCAgQDIACAAAAAAgAAAAAAAAAAAAAAAAAAAACQAQUAAAABAE8CpwM4/wAAGALfAgAAywAAABQAAABOb3RvIFNhbnMgQW5hdG9IaWVybwAAAABbAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b1NhbnNBbmF0b2xpYW5IaWVyb2dseXBocy1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgQFBAICBAMAAIAAAAACAAAAAAAAAAABAAAAAAAAAJABBQAAAAEAIgOBBAP/AAAYAsoCAAC7AAAAEQAAAE5vdG8gU2FucyBBdmVzdGFuAAAAAE4AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbm90by9Ob3RvU2Fuc0F2ZXN0YW4tUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBQIEBQQCAgQDAACAAAAAAgAAAAAAAAAAAQAAAAAAAACQAQUAAAABAKkCLQTb/gAAGAKMAgAAtwAAAA8AAABOb3RvIFNhbnMgQmFtdW0AAAAATAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zQmFtdW0tUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBQIEBQQCAgQDAAAAAAAAAgAAAAAAAAAAAQAAAAAAAACQAQUAAAABALwCLQTb/gAAGALKAgAAuQAAABAAAABOb3RvIFNhbnMgQnJhaG1pAAAAAE0AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbm90by9Ob3RvU2Fuc0JyYWhtaS1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgQFBAICBAAAAAAAAAACAAAAAAAAAAABAAAAAAAAAJABBQAAAAEAlQIsBNz+AAD0AbwCAAC9AAAAEgAAAE5vdG8gU2FucyBCdWdpbmVzZQAAAABPAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b1NhbnNCdWdpbmVzZS1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgQFBAICBAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAJABBQAAAAEAEAQsBNz+AACvAtYDAADSAAAAHQAAAE5vdG8gU2FucyBDYW5hZGlhbiBBYm9yaWdpbmFsAAAAAFkAAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbm90by9Ob3RvU2Fuc0NhbmFkaWFuQWJvcmlnaW5hbC1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgQFBAICBAAAAAAAAAAAACAAIAAAAAABAAAAAAAAAJABBQAAAAEA2QIsBNz+AAC2AuEDAAC5AAAAEAAAAE5vdG8gU2FucyBDaGFrbWEAAAAATQAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zQ2hha21hLVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwUCBAUEAgIEAwABgAAgAAIABAAAAAAAAAAAAAAAAAAAkAEFAAAAAQD7AnQEwP4AABgCygIAAL8AAAATAAAATm90byBTYW5zIEN1bmVpZm9ybQAAAABQAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b1NhbnNDdW5laWZvcm0tUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBQIEBQQCAgQDAAAAAAAAAgAAAAAAQAAAAQAAAAAAAACQAQUAAAABAEQGPAZO/QAAGALKAgAAuwAAABEAAABOb3RvIFNhbnMgQ3lwcmlvdAAAAABOAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b1NhbnNDeXByaW90LVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwUCBAUEAgIEAwAAAAAAAAIAAAAAAAgAAAAAAAAAAAAAkAEFAAAAAQC2Ai0E2/4AABgC4AIAAMoAAAAUAAAATm90byBTYW5zIEVneXB0SGllcm8AAAAAWgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zRWd5cHRpYW5IaWVyb2dseXBocy1SZWd1bGFyLnR0ZgAAAAAAAAAA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AgAAuQAAABAAAABOb3RvIFNhbnMgTHlkaWFuAAAAAE0AAAAvdmFyL3d3dy9vbmx5b2ZmaWNlL2RvY3VtZW50c2VydmVyL2NvcmUtZm9udHMvbm90by9Ob3RvU2Fuc0x5ZGlhbi1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgQFBAICBAMAAAAAAAACAAAAAAAAAAIBAAAAAAAAAJABBQAAAAEASAItBNv+AAAYAsoCAAC/AAAAEwAAAE5vdG8gU2FucyBNb25nb2xpYW4AAAAAUAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zTW9uZ29saWFuLVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwUCBAUEAgIEAAAAAAAAAAAAAAIAAAAAAAEAAAAAAAAAkAEFAAAAAQAgAywE3P4AAOUCIwQAAL8AAAATAAAATm90byBTYW5zIE5ld1RhaUx1ZQAAAABQAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b1NhbnNOZXdUYWlMdWUtUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBQIEBQQCAgQDAACAACAAAAAAAIAAAAAAAQAAAAAAAACQAQUAAAABAKICLQTb/gAAGALKAgAAtwAAAA8AAABOb3RvIFNhbnMgT3NhZ2UAAAAATAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zT3NhZ2UtUmVndWxhci50dGYAAAAAAAAAAAAAAAAAAAAACgAAAAILBQIEBQQCAgRDAAAAACAAAgAAAAAAAAAAAAAAAAAAAACQAQUAAAABAGUCLQTb/gAAGALKAgAAuwAAABEAAABOb3RvIFNhbnMgT3NtYW55YQAAAABOAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b1NhbnNPc21hbnlhLVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwUCBAUEAgIEAwAAAAAAAAIAAAAAAAQAAAAAAAAAAAAAkAEFAAAAAQA/Ai0E2/4AABgCygIAAMEAAAAUAAAATm90byBTYW5zIFBob2VuaWNpYW4AAAAAUQAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zUGhvZW5pY2lhbi1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgQFBAICBAMAAAAAAAAGAAAAAAAAAAABAAAAAAAAAJABBQAAAAEAVwItBNv+AAAYAs8CAAC5AAAAEAAAAE5vdG8gU2FucyBSZWphbmcAAAAATQAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zUmVqYW5nLVJlZ3VsYXIudHRmAAAAAAAAAAAAAAAAAAAAAAoAAAACCwUCBAUEAgIEAAAAAAAAAAAAAAAAAAAgAAEAAAAAAAAAkAEFAAAAAQAzAiwE3P4AABgCyQIAALsAAAARAAAATm90byBTYW5zIFRhZ2Fsb2cAAAAATgAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zVGFnYWxvZy1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgQFBAICBAAAAAAAAAAAAAAQAAAAAAABAAAAAAAAAJABBQAAAAEANQMsBNz+AAD0AbwCAAC9AAAAEgAAAE5vdG8gU2FucyBUYWdiYW53YQAAAABPAAAAL3Zhci93d3cvb25seW9mZmljZS9kb2N1bWVudHNlcnZlci9jb3JlLWZvbnRzL25vdG8vTm90b1NhbnNUYWdiYW53YS1SZWd1bGFyLnR0ZgAAAAAAAAAAAAAAAAAAAAAKAAAAAgsFAgQFBAICBAAAAAAAAAAAAAAQAAAAAAABAAAAAAAAAJABBQAAAAEA7QIsBNz+AAD0AbwCAAC4AAAAEAAAAE5vdG8gU2FucyBUYWkgTGUAAAAATAAAAC92YXIvd3d3L29ubHlvZmZpY2UvZG9jdW1lbnRzZXJ2ZXIvY29yZS1mb250cy9ub3RvL05vdG9TYW5zVGFpTGUtUmVndWxhci50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"; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/Externals.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/Externals.js deleted file mode 100644 index 4c8bb4f5fd..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/Externals.js +++ /dev/null @@ -1,1240 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -(function(window, document){ - - // Import - var FontStyle = AscFonts.FontStyle; - - // глобальные мапы для быстрого поиска - var g_map_font_index = {}; - var g_fonts_streams = []; - - var bIsLocalFontsUse = false; - - function _is_support_cors() - { - if (window["NATIVE_EDITOR_ENJINE"] === true) - return false; - - var xhrSupported = new XMLHttpRequest(); - return !!xhrSupported && ("withCredentials" in xhrSupported); - } - var bIsSupportOriginalFormatFonts = _is_support_cors(); - - function postLoadScript(scriptName) - { - window.postMessage({type: "FROM_PAGE_LOAD_SCRIPT", text: scriptName}, "*"); - } - - /*window.addEventListener("message", function(event) { - // We only accept messages from ourselves - if (event.source != window) - return; - - if (event.data.type && (event.data.type == "FROM_SCRIPT_LOAD_SCRIPT")) - { - var _mess = event.data.text; - var _files = window.g_font_files; - - // потом сделать мап, при первом обращении - for (var i = 0; i < _files.length; i++) - { - if (_files[i].Id == _mess) - { - var bIsUseOrigF = false; - if (_files[i].CanUseOriginalFormat && // false if load embedded fonts - bIsSupportOriginalFormatFonts) // false if work on ie9 - bIsUseOrigF = true; - - if (!bIsUseOrigF) - { - _files[i]._callback_font_load(); - } - else - { - bIsLocalFontsUse = false; - _files[i].LoadFontAsync(event.data.src, null); - bIsLocalFontsUse = true; - } - - break; - } - - } - } - else if (event.data.type && (event.data.type == "FROM_SCRIPT_IS_EXIST")) - { - bIsLocalFontsUse = true; - } - }, false);*/ - - function CFontFileLoader(id) - { - this.LoadingCounter = 0; - this.Id = id; - this.Status = -1; // -1 - notloaded, 0 - loaded, 1 - error, 2 - loading - this.stream_index = -1; - this.callback = null; - this.IsNeedAddJSToFontPath = true; - - this.CanUseOriginalFormat = true; - - var oThis = this; - - this.CheckLoaded = function() - { - return (0 == this.Status || 1 == this.Status); - }; - - this._callback_font_load = function() - { - if (!window[oThis.Id]) - { - oThis.LoadingCounter++; - if (oThis.LoadingCounter < oThis.GetMaxLoadingCount()) - { - //console.log("font loaded: one more attemption"); - oThis.Status = -1; - return; - } - - oThis.Status = 2; // aka loading... - var _editor = window["Asc"]["editor"] ? window["Asc"]["editor"] : window.editor; - _editor.sendEvent("asc_onError", Asc.c_oAscError.ID.CoAuthoringDisconnect, Asc.c_oAscError.Level.Critical); - return; - } - - var __font_data_idx = g_fonts_streams.length; - g_fonts_streams[__font_data_idx] = AscFonts.CreateFontData4(window[oThis.Id]); - oThis.SetStreamIndex(__font_data_idx); - - oThis.Status = 0; - - // удаляем строку - delete window[oThis.Id]; - - if (null != oThis.callback) - oThis.callback(); - }; - - this.LoadFontAsync2 = function(basePath, _callback) - { - this.callback = _callback; - if (-1 != this.Status) - return true; - - if (bIsLocalFontsUse) - { - postLoadScript(this.Id); - return; - } - this.Status = 2; - - var xhr = new XMLHttpRequest(); - - xhr.open('GET', basePath + this.Id, true); // TODO: - - if (typeof ArrayBuffer !== 'undefined' && !window.opera) - xhr.responseType = 'arraybuffer'; - - if (xhr.overrideMimeType) - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - else - xhr.setRequestHeader('Accept-Charset', 'x-user-defined'); - - xhr.onload = function() - { - if (this.status != 200) - { - return this.onerror(); - } - - oThis.Status = 0; - - if (typeof ArrayBuffer !== 'undefined' && !window.opera && this.response) - { - var __font_data_idx = g_fonts_streams.length; - var _uintData = new Uint8Array(this.response); - g_fonts_streams[__font_data_idx] = new AscFonts.FontStream(_uintData, _uintData.length); - oThis.SetStreamIndex(__font_data_idx); - } - else if (AscCommon.AscBrowser.isIE) - { - var _response = new VBArray(this["responseBody"]).toArray(); - - var srcLen = _response.length; - var stream = new AscFonts.FontStream(AscFonts.allocate(srcLen), srcLen); - - var dstPx = stream.data; - var index = 0; - - while (index < srcLen) - { - dstPx[index] = _response[index]; - index++; - } - - var __font_data_idx = g_fonts_streams.length; - g_fonts_streams[__font_data_idx] = stream; - oThis.SetStreamIndex(__font_data_idx); - } - else - { - var __font_data_idx = g_fonts_streams.length; - g_fonts_streams[__font_data_idx] = AscFonts.CreateFontData3(this.responseText); - oThis.SetStreamIndex(__font_data_idx); - } - - // decode - var guidOdttf = [0xA0, 0x66, 0xD6, 0x20, 0x14, 0x96, 0x47, 0xfa, 0x95, 0x69, 0xB8, 0x50, 0xB0, 0x41, 0x49, 0x48]; - var _stream = g_fonts_streams[g_fonts_streams.length - 1]; - var _data = _stream.data; - - var _count_decode = Math.min(32, _stream.size); - for (var i = 0; i < _count_decode; ++i) - _data[i] ^= guidOdttf[i % 16]; - - if (null != oThis.callback) - oThis.callback(); - }; - xhr.onerror = function() - { - oThis.LoadingCounter++; - if (oThis.LoadingCounter < oThis.GetMaxLoadingCount()) - { - //console.log("font loaded: one more attemption"); - oThis.Status = -1; - return; - } - - oThis.Status = 2; // aka loading... - var _editor = window["Asc"]["editor"] ? window["Asc"]["editor"] : window.editor; - _editor.sendEvent("asc_onError", Asc.c_oAscError.ID.LoadingFontError, Asc.c_oAscError.Level.Critical); - return; - }; - - xhr.send(null); - }; - - this.LoadFontNative = function() - { - var __font_data_idx = g_fonts_streams.length; - var _data = window["native"]["GetFontBinary"](this.Id); - g_fonts_streams[__font_data_idx] = new AscFonts.FontStream(_data, _data.length); - this.SetStreamIndex(__font_data_idx); - this.Status = 0; - }; - } - - CFontFileLoader.prototype.GetMaxLoadingCount = function() - { - return 3; - }; - - CFontFileLoader.prototype.SetStreamIndex = function(index) - { - this.stream_index = index; - }; - CFontFileLoader.prototype.LoadFontAsync = function(basePath, _callback, isEmbed) - { - var oThis = this; - if (window["AscDesktopEditor"] !== undefined && this.CanUseOriginalFormat) - { - if (-1 != this.Status) - return true; - - this.callback = _callback; - this.Status = 2; - window["AscDesktopEditor"]["LoadFontBase64"](this.Id); - this._callback_font_load(); - return; - } - - if (this.CanUseOriginalFormat && // false if load embedded fonts - bIsSupportOriginalFormatFonts) // false if work on ie9 - { - this.LoadFontAsync2(basePath, _callback); - return; - } - - this.callback = _callback; - if (-1 != this.Status) - return true; - - this.Status = 2; - if (bIsLocalFontsUse) - { - postLoadScript(this.Id); - return; - } - - var scriptElem = document.createElement('script'); - - if (scriptElem.readyState && false) - { - scriptElem.onreadystatechange = function () { - if (this.readyState == 'complete' || this.readyState == 'loaded') - { - scriptElem.onreadystatechange = null; - setTimeout(oThis._callback_font_load, 0); - } - } - } - scriptElem.onload = scriptElem.onerror = oThis._callback_font_load; - - var src = basePath + this.Id + ".js"; - if(isEmbed) - src = AscCommon.g_oDocumentUrls.getUrl(src); - scriptElem.setAttribute('src', src); - scriptElem.setAttribute('type','text/javascript'); - document.getElementsByTagName('head')[0].appendChild(scriptElem); - return false; - }; - - CFontFileLoader.prototype["LoadFontAsync"] = CFontFileLoader.prototype.LoadFontAsync; - CFontFileLoader.prototype["GetID"] = function() { return this.Id; }; - CFontFileLoader.prototype["GetStatus"] = function() { return this.Status; }; - CFontFileLoader.prototype["GetStreamIndex"] = function() { return this.stream_index; }; - - - var FONT_TYPE_ADDITIONAL = 0; - var FONT_TYPE_STANDART = 1; - var FONT_TYPE_EMBEDDED = 2; - var FONT_TYPE_ADDITIONAL_CUT = 3; - - var fontstyle_mask_regular = 1; - var fontstyle_mask_italic = 2; - var fontstyle_mask_bold = 4; - var fontstyle_mask_bolditalic = 8; - - function GenerateMapId(api, name, style, size) - { - var fontInfo = api.FontLoader.fontInfos[api.FontLoader.map_font_index[name]]; - var index = -1; - - // подбираем шрифт по стилю - var bNeedBold = false; - var bNeedItalic = false; - - var index = -1; - var faceIndex = 0; - - var bSrcItalic = false; - var bSrcBold = false; - - switch (style) - { - case FontStyle.FontStyleBoldItalic: - { - bSrcItalic = true; - bSrcBold = true; - - bNeedBold = true; - bNeedItalic = true; - if (-1 != fontInfo.indexBI) - { - index = fontInfo.indexBI; - faceIndex = fontInfo.faceIndexBI; - bNeedBold = false; - bNeedItalic = false; - } - else if (-1 != fontInfo.indexB) - { - index = fontInfo.indexB; - faceIndex = fontInfo.faceIndexB; - bNeedBold = false; - } - else if (-1 != fontInfo.indexI) - { - index = fontInfo.indexI; - faceIndex = fontInfo.faceIndexI; - bNeedItalic = false; - } - else - { - index = fontInfo.indexR; - faceIndex = fontInfo.faceIndexR; - } - break; - } - case FontStyle.FontStyleBold: - { - bSrcBold = true; - - bNeedBold = true; - bNeedItalic = false; - if (-1 != fontInfo.indexB) - { - index = fontInfo.indexB; - faceIndex = fontInfo.faceIndexB; - bNeedBold = false; - } - else if (-1 != fontInfo.indexR) - { - index = fontInfo.indexR; - faceIndex = fontInfo.faceIndexR; - } - else if (-1 != fontInfo.indexBI) - { - index = fontInfo.indexBI; - faceIndex = fontInfo.faceIndexBI; - bNeedBold = false; - } - else - { - index = fontInfo.indexI; - faceIndex = fontInfo.faceIndexI; - } - break; - } - case FontStyle.FontStyleItalic: - { - bSrcItalic = true; - - bNeedBold = false; - bNeedItalic = true; - if (-1 != fontInfo.indexI) - { - index = fontInfo.indexI; - faceIndex = fontInfo.faceIndexI; - bNeedItalic = false; - } - else if (-1 != fontInfo.indexR) - { - index = fontInfo.indexR; - faceIndex = fontInfo.faceIndexR; - } - else if (-1 != fontInfo.indexBI) - { - index = fontInfo.indexBI; - faceIndex = fontInfo.faceIndexBI; - bNeedItalic = false; - } - else - { - index = fontInfo.indexB; - faceIndex = fontInfo.faceIndexB; - } - break; - } - case FontStyle.FontStyleRegular: - { - bNeedBold = false; - bNeedItalic = false; - if (-1 != fontInfo.indexR) - { - index = fontInfo.indexR; - faceIndex = fontInfo.faceIndexR; - } - else if (-1 != fontInfo.indexI) - { - index = fontInfo.indexI; - faceIndex = fontInfo.faceIndexI; - } - else if (-1 != fontInfo.indexB) - { - index = fontInfo.indexB; - faceIndex = fontInfo.faceIndexB; - } - else - { - index = fontInfo.indexBI; - faceIndex = fontInfo.faceIndexBI; - } - } - } - - var _ext = ""; - if (bNeedBold) - _ext += "nbold"; - if (bNeedItalic) - _ext += "nitalic"; - - // index != -1 (!!!) - var fontfile = api.FontLoader.fontFiles[index]; - return fontfile.Id + faceIndex + size + _ext; - } - - function CFontInfo(sName, thumbnail, type, indexR, faceIndexR, indexI, faceIndexI, indexB, faceIndexB, indexBI, faceIndexBI) - { - this.Name = sName; - this.Thumbnail = thumbnail; - this.Type = type; - this.NeedStyles = 0; - - this.indexR = indexR; - this.faceIndexR = faceIndexR; - this.needR = false; - - this.indexI = indexI; - this.faceIndexI = faceIndexI; - this.needI = false; - - this.indexB = indexB; - this.faceIndexB = faceIndexB; - this.needB = false; - - this.indexBI = indexBI; - this.faceIndexBI= faceIndexBI; - this.needBI = false; - } - - CFontInfo.prototype = - { - CheckFontLoadStyles : function(global_loader) - { - if ((this.NeedStyles & 0x0F) == 0x0F) - { - this.needR = true; - this.needI = true; - this.needB = true; - this.needBI = true; - } - else - { - if ((this.NeedStyles & 1) != 0) - { - // нужен стиль regular - if (false === this.needR) - { - this.needR = true; - if (-1 == this.indexR) - { - if (-1 != this.indexI) - { - this.needI = true; - } - else if (-1 != this.indexB) - { - this.needB = true; - } - else - { - this.needBI = true; - } - } - } - } - if ((this.NeedStyles & 2) != 0) - { - // нужен стиль italic - if (false === this.needI) - { - this.needI = true; - if (-1 == this.indexI) - { - if (-1 != this.indexR) - { - this.needR = true; - } - else if (-1 != this.indexBI) - { - this.needBI = true; - } - else - { - this.needB = true; - } - } - } - } - if ((this.NeedStyles & 4) != 0) - { - // нужен стиль bold - if (false === this.needB) - { - this.needB = true; - if (-1 == this.indexB) - { - if (-1 != this.indexR) - { - this.needR = true; - } - else if (-1 != this.indexBI) - { - this.needBI = true; - } - else - { - this.needI = true; - } - } - } - } - if ((this.NeedStyles & 8) != 0) - { - // нужен стиль bold - if (false === this.needBI) - { - this.needBI = true; - if (-1 == this.indexBI) - { - if (-1 != this.indexB) - { - this.needB = true; - } - else if (-1 != this.indexI) - { - this.needI = true; - } - else - { - this.needR = true; - } - } - } - } - } - - var isEmbed = (FONT_TYPE_EMBEDDED == this.Type); - var fonts = isEmbed ? global_loader.embeddedFontFiles : global_loader.fontFiles; - var basePath = isEmbed ? global_loader.embeddedFilesPath : global_loader.fontFilesPath; - var isNeed = false; - if ((this.needR === true) && (-1 != this.indexR) && (fonts[this.indexR].CheckLoaded() === false)) - { - fonts[this.indexR].LoadFontAsync(basePath, null, isEmbed); - isNeed = true; - } - if ((this.needI === true) && (-1 != this.indexI) && (fonts[this.indexI].CheckLoaded() === false)) - { - fonts[this.indexI].LoadFontAsync(basePath, null, isEmbed); - isNeed = true; - } - if ((this.needB === true) && (-1 != this.indexB) && (fonts[this.indexB].CheckLoaded() === false)) - { - fonts[this.indexB].LoadFontAsync(basePath, null, isEmbed); - isNeed = true; - } - if ((this.needBI === true) && (-1 != this.indexBI) && (fonts[this.indexBI].CheckLoaded() === false)) - { - fonts[this.indexBI].LoadFontAsync(basePath, null, isEmbed); - isNeed = true; - } - - return isNeed; - }, - - CheckFontLoadStylesNoLoad : function(global_loader) - { - var fonts = (FONT_TYPE_EMBEDDED == this.Type) ? global_loader.embeddedFontFiles : global_loader.fontFiles; - var _isNeed = false; - if ((-1 != this.indexR) && (fonts[this.indexR].CheckLoaded() === false)) - { - _isNeed = true; - } - if ((-1 != this.indexI) && (fonts[this.indexI].CheckLoaded() === false)) - { - _isNeed = true; - } - if ((-1 != this.indexB) && (fonts[this.indexB].CheckLoaded() === false)) - { - _isNeed = true; - } - if ((-1 != this.indexBI) && (fonts[this.indexBI].CheckLoaded() === false)) - { - _isNeed = true; - } - - return _isNeed; - }, - - LoadFontsFromServer : function(global_loader) - { - var fonts = global_loader.fontFiles; - var basePath = global_loader.fontFilesPath; - if ((-1 != this.indexR) && (fonts[this.indexR].CheckLoaded() === false)) - { - fonts[this.indexR].LoadFontAsync(basePath, null); - } - if ((-1 != this.indexI) && (fonts[this.indexI].CheckLoaded() === false)) - { - fonts[this.indexI].LoadFontAsync(basePath, null); - } - if ((-1 != this.indexB) && (fonts[this.indexB].CheckLoaded() === false)) - { - fonts[this.indexB].LoadFontAsync(basePath, null); - } - if ((-1 != this.indexBI) && (fonts[this.indexBI].CheckLoaded() === false)) - { - fonts[this.indexBI].LoadFontAsync(basePath, null); - } - }, - - LoadFont : function(font_loader, fontManager, fEmSize, lStyle, dHorDpi, dVerDpi, transform, isNoSetupToManager) - { - // подбираем шрифт по стилю - var sReturnName = this.Name; - var bNeedBold = false; - var bNeedItalic = false; - - var index = -1; - var faceIndex = 0; - - var bSrcItalic = false; - var bSrcBold = false; - - switch (lStyle) - { - case FontStyle.FontStyleBoldItalic: - { - bSrcItalic = true; - bSrcBold = true; - - bNeedBold = true; - bNeedItalic = true; - if (-1 != this.indexBI) - { - index = this.indexBI; - faceIndex = this.faceIndexBI; - bNeedBold = false; - bNeedItalic = false; - } - else if (-1 != this.indexB) - { - index = this.indexB; - faceIndex = this.faceIndexB; - bNeedBold = false; - } - else if (-1 != this.indexI) - { - index = this.indexI; - faceIndex = this.faceIndexI; - bNeedItalic = false; - } - else - { - index = this.indexR; - faceIndex = this.faceIndexR; - } - break; - } - case FontStyle.FontStyleBold: - { - bSrcBold = true; - - bNeedBold = true; - bNeedItalic = false; - if (-1 != this.indexB) - { - index = this.indexB; - faceIndex = this.faceIndexB; - bNeedBold = false; - } - else if (-1 != this.indexR) - { - index = this.indexR; - faceIndex = this.faceIndexR; - } - else if (-1 != this.indexBI) - { - index = this.indexBI; - faceIndex = this.faceIndexBI; - bNeedBold = false; - } - else - { - index = this.indexI; - faceIndex = this.faceIndexI; - } - break; - } - case FontStyle.FontStyleItalic: - { - bSrcItalic = true; - - bNeedBold = false; - bNeedItalic = true; - if (-1 != this.indexI) - { - index = this.indexI; - faceIndex = this.faceIndexI; - bNeedItalic = false; - } - else if (-1 != this.indexR) - { - index = this.indexR; - faceIndex = this.faceIndexR; - } - else if (-1 != this.indexBI) - { - index = this.indexBI; - faceIndex = this.faceIndexBI; - bNeedItalic = false; - } - else - { - index = this.indexB; - faceIndex = this.faceIndexB; - } - break; - } - case FontStyle.FontStyleRegular: - { - bNeedBold = false; - bNeedItalic = false; - if (-1 != this.indexR) - { - index = this.indexR; - faceIndex = this.faceIndexR; - } - else if (-1 != this.indexI) - { - index = this.indexI; - faceIndex = this.faceIndexI; - } - else if (-1 != this.indexB) - { - index = this.indexB; - faceIndex = this.faceIndexB; - } - else - { - index = this.indexBI; - faceIndex = this.faceIndexBI; - } - } - } - - // index != -1 (!!!) - var fontfile = null; - if (this.Type == FONT_TYPE_EMBEDDED) - fontfile = font_loader.embeddedFontFiles[index]; - else - fontfile = font_loader.fontFiles[index]; - - if (window["NATIVE_EDITOR_ENJINE"] && fontfile.Status != 0) - { - fontfile.LoadFontNative(); - } - - var pFontFile = fontManager.LoadFont(fontfile, faceIndex, fEmSize, bSrcBold, bSrcItalic, bNeedBold, bNeedItalic, isNoSetupToManager); - - if (!pFontFile && -1 === fontfile.stream_index && true === AscFonts.IsLoadFontOnCheckSymbols && true != AscFonts.IsLoadFontOnCheckSymbolsWait) - { - // в форматах pdf/xps - не прогоняем символы через чеккер при открытии, - // так как там должны быть символы в встроенном шрифте. Но вдруг? - // тогда при отрисовке СРАЗУ грузим шрифт - и при загрузке перерисовываемся - // сюда попали только если символ попал в чеккер - AscFonts.IsLoadFontOnCheckSymbols = false; - AscFonts.IsLoadFontOnCheckSymbolsWait = true; - AscFonts.FontPickerByCharacter.loadFonts(window.editor, function () - { - AscFonts.IsLoadFontOnCheckSymbolsWait = false; - this.WordControl && this.WordControl.private_RefreshAll(); - }); - } - - if (pFontFile && (true !== isNoSetupToManager)) - { - var newEmSize = fontManager.UpdateSize(fEmSize, dVerDpi, dVerDpi); - pFontFile.SetSizeAndDpi(newEmSize, dHorDpi, dVerDpi); - - if (undefined !== transform) - { - fontManager.SetTextMatrix2(transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty); - } - else - { - fontManager.SetTextMatrix(1, 0, 0, 1, 0, 0); - } - } - - return pFontFile; - }, - - GetFontID : function(font_loader, lStyle) - { - // подбираем шрифт по стилю - var sReturnName = this.Name; - var bNeedBold = false; - var bNeedItalic = false; - - var index = -1; - var faceIndex = 0; - - var bSrcItalic = false; - var bSrcBold = false; - - switch (lStyle) - { - case FontStyle.FontStyleBoldItalic: - { - bSrcItalic = true; - bSrcBold = true; - - bNeedBold = true; - bNeedItalic = true; - if (-1 != this.indexBI) - { - index = this.indexBI; - faceIndex = this.faceIndexBI; - bNeedBold = false; - bNeedItalic = false; - } - else if (-1 != this.indexB) - { - index = this.indexB; - faceIndex = this.faceIndexB; - bNeedBold = false; - } - else if (-1 != this.indexI) - { - index = this.indexI; - faceIndex = this.faceIndexI; - bNeedItalic = false; - } - else - { - index = this.indexR; - faceIndex = this.faceIndexR; - } - break; - } - case FontStyle.FontStyleBold: - { - bSrcBold = true; - - bNeedBold = true; - bNeedItalic = false; - if (-1 != this.indexB) - { - index = this.indexB; - faceIndex = this.faceIndexB; - bNeedBold = false; - } - else if (-1 != this.indexR) - { - index = this.indexR; - faceIndex = this.faceIndexR; - } - else if (-1 != this.indexBI) - { - index = this.indexBI; - faceIndex = this.faceIndexBI; - bNeedBold = false; - } - else - { - index = this.indexI; - faceIndex = this.faceIndexI; - } - break; - } - case FontStyle.FontStyleItalic: - { - bSrcItalic = true; - - bNeedBold = false; - bNeedItalic = true; - if (-1 != this.indexI) - { - index = this.indexI; - faceIndex = this.faceIndexI; - bNeedItalic = false; - } - else if (-1 != this.indexR) - { - index = this.indexR; - faceIndex = this.faceIndexR; - } - else if (-1 != this.indexBI) - { - index = this.indexBI; - faceIndex = this.faceIndexBI; - bNeedItalic = false; - } - else - { - index = this.indexB; - faceIndex = this.faceIndexB; - } - break; - } - case FontStyle.FontStyleRegular: - { - bNeedBold = false; - bNeedItalic = false; - if (-1 != this.indexR) - { - index = this.indexR; - faceIndex = this.faceIndexR; - } - else if (-1 != this.indexI) - { - index = this.indexI; - faceIndex = this.faceIndexI; - } - else if (-1 != this.indexB) - { - index = this.indexB; - faceIndex = this.faceIndexB; - } - else - { - index = this.indexBI; - faceIndex = this.faceIndexBI; - } - } - } - - // index != -1 (!!!) - var fontfile = (this.Type == FONT_TYPE_EMBEDDED) ? font_loader.embeddedFontFiles[index] : font_loader.fontFiles[index]; - return { id: fontfile.Id, faceIndex : faceIndex, file : fontfile }; - }, - - GetBaseStyle : function(lStyle) - { - switch (lStyle) - { - case FontStyle.FontStyleBoldItalic: - { - if (-1 != this.indexBI) - { - return FontStyle.FontStyleBoldItalic; - } - else if (-1 != this.indexB) - { - return FontStyle.FontStyleBold; - } - else if (-1 != this.indexI) - { - return FontStyle.FontStyleItalic; - } - else - { - return FontStyle.FontStyleRegular; - } - break; - } - case FontStyle.FontStyleBold: - { - if (-1 != this.indexB) - { - return FontStyle.FontStyleBold; - } - else if (-1 != this.indexR) - { - return FontStyle.FontStyleRegular; - } - else if (-1 != this.indexBI) - { - return FontStyle.FontStyleBoldItalic; - } - else - { - return FontStyle.FontStyleItalic; - } - break; - } - case FontStyle.FontStyleItalic: - { - if (-1 != this.indexI) - { - return FontStyle.FontStyleItalic; - } - else if (-1 != this.indexR) - { - return FontStyle.FontStyleRegular; - } - else if (-1 != this.indexBI) - { - return FontStyle.FontStyleBoldItalic; - } - else - { - return FontStyle.FontStyleBold; - } - break; - } - case FontStyle.FontStyleRegular: - { - if (-1 != this.indexR) - { - return FontStyle.FontStyleRegular; - } - else if (-1 != this.indexI) - { - return FontStyle.FontStyleItalic; - } - else if (-1 != this.indexB) - { - return FontStyle.FontStyleBold; - } - else - { - return FontStyle.FontStyleBoldItalic; - } - } - } - return FontStyle.FontStyleRegular; - } - }; - - // здесь если type == FONT_TYPE_EMBEDDED, то thumbnail - это base64 картинка, - // иначе - это позиция (y) в общем табнейле всех шрифтов (ADDITIONAL и STANDART) - function CFont(name, id, type, thumbnail, style) - { - this.name = name; - this.id = id; - this.type = type; - this.thumbnail = thumbnail; - if(null != style) - this.NeedStyles = style; - else - this.NeedStyles = fontstyle_mask_regular | fontstyle_mask_italic | fontstyle_mask_bold | fontstyle_mask_bolditalic; - } - CFont.prototype.asc_getFontId = function() { return this.id; }; - CFont.prototype.asc_getFontName = function() - { - var _name = AscFonts.g_fontApplication ? AscFonts.g_fontApplication.NameToInterface[this.name] : null; - return _name ? _name : this.name; - }; - CFont.prototype.asc_getFontThumbnail = function() { return this.thumbnail; }; - CFont.prototype.asc_getFontType = function() { return this.type; }; - - var ImageLoadStatus = - { - Loading : 0, - Complete : 1 - }; - - function CImage(src) - { - this.src = src; - this.Image = null; - this.Status = ImageLoadStatus.Complete; - } - - var g_font_files, g_font_infos; - function checkAllFonts() - { - var i, l; - var files = window["__fonts_files"]; - if (!files && window["native"] && window["native"]["GenerateAllFonts"]) - { - // тогда должны быть глобальные переменные такие, без window - window["native"]["GenerateAllFonts"](); - } - - files = window["__fonts_files"]; - l = files ? files.length : 0; - g_font_files = new Array(l); - for (i = 0; i < l; i++) - { - g_font_files[i] = new CFontFileLoader(files[i]); - } - - files = window["__fonts_infos"]; - l = files ? files.length : 0; - g_font_infos = new Array(l); - - var curIndex = 0; - var ascFontFath = "ASC.ttf"; - for (i = 0; i < l; i++) - { - var _info = files[i]; - if ("ASCW3" === _info[0]) - { - ascFontFath = g_font_files[_info[1]].Id; - continue; - } - - g_font_infos[curIndex] = new CFontInfo(_info[0], i, 0, _info[1], _info[2], _info[3], _info[4], _info[5], _info[6], _info[7], _info[8]); - g_map_font_index[_info[0]] = curIndex; - curIndex++; - } - - g_font_infos.length = curIndex; - - ///////////////////////////////////////////////////////////////////// - // а вот это наш шрифт - аналог wingdings3 - var _wngds3 = new CFontFileLoader(ascFontFath); - _wngds3.Status = 0; - l = g_fonts_streams.length; - g_fonts_streams[l] = AscFonts.CreateFontData2("AAEAAAARAQAABAAQTFRTSOGXTFYAAAIgAAAADk9TLzJ0/uscAAABmAAAAGBWRE1Yblp14wAAAjAAAAXgY21hcNCBcnoAAAksAAAAaGN2dCBBCTniAAAUWAAAAohmcGdtu26+2AAACZQAAAi4Z2FzcAAPABYAAB9cAAAADGdseWaWCCxJAAAW4AAABQBoZG1466dcHQAACBAAAAEcaGVhZBMko9YAAAEcAAAANmhoZWEOeQN0AAABVAAAACRobXR4MfIEPAAAAfgAAAAobG9jYQVeBDYAABvgAAAAFm1heHAIXQkWAAABeAAAACBuYW1lZvQXkQAAG/gAAALocG9zdKnSYBIAAB7gAAAAenByZXDMvTRHAAASTAAAAgsAAQAAAAEAAFPp5kFfDzz1ABsIAAAAAADPTriwAAAAAN2yoHYAgP/nBnUFyAAAAAwAAQAAAAAAAAABAAAHPv5OAEMHIQCA/foGdQABAAAAAAAAAAAAAAAAAAAACgABAAAACgBIAAMAAAAAAAIAEAAUAFcAAAfoCLgAAAAAAAMFjAGQAAUAAATOBM4AAAMWBM4EzgAAAxYAZgISDAAFBAECAQgHBwcHAAAAAAAAAAAAAAAAAAAAAE1TICAAQCXJ8DgF0/5RATMHPgGygAAAAAAAAAAEJgW7AAAAIAAABAAAgAAAAAAE0gAAAgAAAAchAK0EbwCtBuQAjAbkAIwG5AClBuQApQAAAApLAQEBS0tLS0tLAAAAAAABAAEBAQEBAAwA+Aj/AAgACP/+AAkACf/+AAoACv/9AAsACv/9AAwAC//9AA0ADP/9AA4ADf/9AA8ADv/8ABAAD//8ABEAEP/8ABIAEf/8ABMAEv/7ABQAE//7ABUAFP/7ABYAFP/7ABcAFf/7ABgAFv/6ABkAF//6ABoAGP/6ABsAGf/6ABwAGv/6AB0AG//5AB4AHP/5AB8AHf/5ACAAHf/5ACEAHv/5ACIAH//4ACMAIP/4ACQAIf/4ACUAIv/4ACYAI//3ACcAJP/3ACgAJf/3ACkAJv/3ACoAJ//3ACsAJ//2ACwAKP/2AC0AKf/2AC4AKv/2AC8AK//2ADAALP/1ADEALf/1ADIALv/1ADMAL//1ADQAMP/0ADUAMP/0ADYAMf/0ADcAMv/0ADgAM//0ADkANP/zADoANf/zADsANv/zADwAN//zAD0AOP/zAD4AOf/yAD8AOv/yAEAAOv/yAEEAO//yAEIAPP/yAEMAPf/xAEQAPv/xAEUAP//xAEYAQP/xAEcAQf/wAEgAQv/wAEkAQ//wAEoAQ//wAEsARP/wAEwARf/vAE0ARv/vAE4AR//vAE8ASP/vAFAASf/vAFEASv/uAFIAS//uAFMATP/uAFQATf/uAFUATf/tAFYATv/tAFcAT//tAFgAUP/tAFkAUf/tAFoAUv/sAFsAU//sAFwAVP/sAF0AVf/sAF4AVv/sAF8AV//rAGAAV//rAGEAWP/rAGIAWf/rAGMAWv/rAGQAW//qAGUAXP/qAGYAXf/qAGcAXv/qAGgAX//pAGkAYP/pAGoAYP/pAGsAYf/pAGwAYv/pAG0AY//oAG4AZP/oAG8AZf/oAHAAZv/oAHEAZ//oAHIAaP/nAHMAaf/nAHQAav/nAHUAav/nAHYAa//mAHcAbP/mAHgAbf/mAHkAbv/mAHoAb//mAHsAcP/lAHwAcf/lAH0Acv/lAH4Ac//lAH8Ac//lAIAAdP/kAIEAdf/kAIIAdv/kAIMAd//kAIQAeP/kAIUAef/jAIYAev/jAIcAe//jAIgAfP/jAIkAff/iAIoAff/iAIsAfv/iAIwAf//iAI0AgP/iAI4Agf/hAI8Agv/hAJAAg//hAJEAhP/hAJIAhf/hAJMAhv/gAJQAhv/gAJUAh//gAJYAiP/gAJcAif/gAJgAiv/fAJkAi//fAJoAjP/fAJsAjf/fAJwAjv/eAJ0Aj//eAJ4AkP/eAJ8AkP/eAKAAkf/eAKEAkv/dAKIAk//dAKMAlP/dAKQAlf/dAKUAlv/dAKYAl//cAKcAmP/cAKgAmf/cAKkAmf/cAKoAmv/bAKsAm//bAKwAnP/bAK0Anf/bAK4Anv/bAK8An//aALAAoP/aALEAof/aALIAov/aALMAo//aALQAo//ZALUApP/ZALYApf/ZALcApv/ZALgAp//ZALkAqP/YALoAqf/YALsAqv/YALwAq//YAL0ArP/XAL4Arf/XAL8Arf/XAMAArv/XAMEAr//XAMIAsP/WAMMAsf/WAMQAsv/WAMUAs//WAMYAtP/WAMcAtf/VAMgAtv/VAMkAtv/VAMoAt//VAMsAuP/UAMwAuf/UAM0Auv/UAM4Au//UAM8AvP/UANAAvf/TANEAvv/TANIAv//TANMAwP/T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"); - _wngds3.SetStreamIndex(l); - g_font_files.push(_wngds3); - - l = g_font_infos.length; - g_font_infos[l] = new CFontInfo("ASCW3", 0, FONT_TYPE_ADDITIONAL, g_font_files.length - 1, 0, -1, -1, -1, -1, -1, -1); - g_map_font_index["ASCW3"] = l; - ///////////////////////////////////////////////////////////////////// - - if (AscFonts.FontPickerByCharacter) - AscFonts.FontPickerByCharacter.init(window["__fonts_infos"]); - - // удаляем временные переменные - delete window["__fonts_files"]; - delete window["__fonts_infos"]; - - window['AscFonts'].g_font_files = g_font_files; - window['AscFonts'].g_font_infos = g_font_infos; - } - - //------------------------------------------------------export------------------------------------------------------ - window['AscFonts'] = window['AscFonts'] || {}; - window['AscFonts'].g_map_font_index = g_map_font_index; - window['AscFonts'].g_fonts_streams = g_fonts_streams; - - window['AscFonts'].FONT_TYPE_ADDITIONAL = FONT_TYPE_ADDITIONAL; - window['AscFonts'].FONT_TYPE_STANDART = FONT_TYPE_STANDART; - window['AscFonts'].FONT_TYPE_EMBEDDED = FONT_TYPE_EMBEDDED; - window['AscFonts'].FONT_TYPE_ADDITIONAL_CUT = FONT_TYPE_ADDITIONAL_CUT; - - window['AscFonts'].CFontFileLoader = CFontFileLoader; - window['AscFonts'].GenerateMapId = GenerateMapId; - window['AscFonts'].CFontInfo = CFontInfo; - window['AscFonts'].CFont = CFont; - - var prot = CFont.prototype; - prot['asc_getFontId'] = prot.asc_getFontId; - prot['asc_getFontName'] = prot.asc_getFontName; - prot['asc_getFontThumbnail'] = prot.asc_getFontThumbnail; - prot['asc_getFontType'] = prot.asc_getFontType; - window['AscFonts'].ImageLoadStatus = ImageLoadStatus; - - window['AscFonts'].CImage = CImage; - - window['AscFonts'].checkAllFonts = checkAllFonts; - - checkAllFonts(); - -})(window, window.document); - -// сначала хотел писать "вытеснение" из этого мапа. -// но тогда нужно хранить base64 строки. Это не круто. По памяти - даже -// выигрыш будет. Не особо то шрифты жмутся lzw или deflate -// поэтому лучше из памяти будем удалять base64 строки -// ---------------------------------------------------------------------------- diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/GlobalLoaders.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/GlobalLoaders.js deleted file mode 100644 index 299fc22413..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/GlobalLoaders.js +++ /dev/null @@ -1,782 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -(function(window, document){ - // Import - var g_fontApplication = AscFonts.g_fontApplication; - var CFontFileLoader = AscFonts.CFontFileLoader; - var FONT_TYPE_EMBEDDED = AscFonts.FONT_TYPE_EMBEDDED; - var CFontInfo = AscFonts.CFontInfo; - var ImageLoadStatus = AscFonts.ImageLoadStatus; - var CImage = AscFonts.CImage; - - function CGlobalFontLoader() - { - // сначала хотел писать "вытеснение" из этого мапа. - // но тогда нужно хранить base64 строки. Это не круто. По памяти - даже - // выигрыш будет. Не особо то шрифты жмутся lzw или deflate - // поэтому лучше из памяти будем удалять base64 строки - this.fonts_streams = []; - - // теперь вся информация о всех возможных шрифтах. Они во всех редакторах должны быть одни и те же - this.fontFilesPath = "../../../../fonts/"; - this.fontFiles = AscFonts.g_font_files; - this.fontInfos = AscFonts.g_font_infos; - this.map_font_index = AscFonts.g_map_font_index; - - // теперь вся информация о всех встроенных шрифтах. Они должны удаляться при подгрузке нового файла - this.embeddedFilesPath = ""; - this.embeddedFontFiles = []; - this.embeddedFontInfos = []; - - // динамическая подгрузка шрифтов - this.ThemeLoader = null; - this.Api = null; - this.fonts_loading = []; - this.fonts_loading_after_style = []; - this.bIsLoadDocumentFirst = false; - this.currentInfoLoaded = null; - - this.loadFontCallBack = null; - this.loadFontCallBackArgs = null; - - this.IsLoadDocumentFonts2 = false; - - this.check_loaded_timer_id = -1; - this.endLoadingCallback = null; - - this.perfStart = 0; - - this.put_Api = function(_api) - { - this.Api = _api; - }; - - this.LoadEmbeddedFonts = function(url, _fonts) - { - this.embeddedFilesPath = url; - - var _count = _fonts.length; - - if (0 == _count) - return; - - this.embeddedFontInfos = new Array(_count); - - var map_files = {}; - for (var i = 0; i < _count; i++) - map_files[_fonts[i].id] = _fonts[i].id; - - var index = 0; - for (var i in map_files) - { - this.embeddedFontFiles[index] = new CFontFileLoader(map_files[i]); - this.embeddedFontFiles[index].CanUseOriginalFormat = false; - this.embeddedFontFiles[index].IsNeedAddJSToFontPath = false; - map_files[i] = index++; - } - - for (var i = 0; i < _count; i++) - { - var lStyle = 0;//_fonts[i].Style; - if (0 == lStyle) - this.embeddedFontInfos[i] = new CFontInfo(_fonts[i].name, "", FONT_TYPE_EMBEDDED, map_files[_fonts[i].id], 0, -1, -1, -1, -1, -1, -1); - else if (2 == lStyle) - this.embeddedFontInfos[i] = new CFontInfo(_fonts[i].name, "", FONT_TYPE_EMBEDDED, -1, -1, map_files[_fonts[i].id], _fonts[i].faceindex, -1, -1, -1, -1); - else if (1 == lStyle) - this.embeddedFontInfos[i] = new CFontInfo(_fonts[i].name, "", FONT_TYPE_EMBEDDED, -1, -1, -1, -1, map_files[_fonts[i].id], _fonts[i].faceindex, -1, -1); - else - this.embeddedFontInfos[i] = new CFontInfo(_fonts[i].name, "", FONT_TYPE_EMBEDDED, -1, -1, -1, -1, -1, -1, map_files[_fonts[i].id], _fonts[i].faceindex); - } - - var _count_infos_ = this.fontInfos.length; - for (var i = 0; i < _count; i++) - { - this.map_font_index[_fonts[i].name] = i + _count_infos_; - this.fontInfos[i + _count_infos_] = this.embeddedFontInfos[i]; - } - }; - - this.SetStandartFonts = function() - { - //В стандартных шрифтах закоментированы те шрифты, которые были добавлены на docs.teamlab.com - var standarts = window["standarts"]; - - if (undefined == standarts) - { - standarts = []; - for (var i = 0; i < this.fontInfos.length; i++) - { - if (this.fontInfos[i].Name != "ASCW3") - standarts.push(this.fontInfos[i].Name); - } - } - - var _count = standarts.length; - var _infos = this.fontInfos; - var _map = this.map_font_index; - for (var i = 0; i < _count; i++) - { - _infos[_map[standarts[i]]].Type = AscFonts.FONT_TYPE_STANDART; - } - }; - - this.AddLoadFonts = function(name, need_styles) - { - var fontinfo = g_fontApplication.GetFontInfo(name); - - this.fonts_loading[this.fonts_loading.length] = fontinfo; - this.fonts_loading[this.fonts_loading.length - 1].NeedStyles = (need_styles == undefined) ? 0x0F : need_styles; - return fontinfo; - }; - - this.AddLoadFontsNotPick = function(info, need_styles) - { - this.fonts_loading[this.fonts_loading.length] = info; - this.fonts_loading[this.fonts_loading.length - 1].NeedStyles = (need_styles == undefined) ? 0x0F : need_styles; - }; - - this.LoadDocumentFonts = function(_fonts, is_default) - { - if (this.IsLoadDocumentFonts2) - return this.LoadDocumentFonts2(_fonts); - - // в конце метода нужно отдать список шрифтов - var gui_fonts = []; - var gui_count = 0; - for (var i = 0; i < this.fontInfos.length; i++) - { - var info = this.fontInfos[i]; - if (AscFonts.FONT_TYPE_STANDART == info.Type) - { - var __font = new AscFonts.CFont(info.Name, "", info.Type, info.Thumbnail); - gui_fonts[gui_count++] = __font; - } - } - - // сначала заполняем массив this.fonts_loading объекстами fontinfo - for (var i in _fonts) - { - if (_fonts[i].type != FONT_TYPE_EMBEDDED) - { - var info = this.AddLoadFonts(_fonts[i].name, _fonts[i].NeedStyles); - - if (info.Type == AscFonts.FONT_TYPE_ADDITIONAL) - { - if (info.name != "ASCW3") - { - var __font = new AscFonts.CFont(info.Name, "", info.Type, info.Thumbnail); - gui_fonts[gui_count++] = __font; - } - } - } - else - { - var ind = -1; - for (var j = 0; j < this.embeddedFontInfos.length; j++) - { - if (this.embeddedFontInfos[j].Name == _fonts[i].name) - { - this.AddLoadFontsNotPick(this.embeddedFontInfos[j], 0x0F); - break; - } - } - } - } - - this.Api.sync_InitEditorFonts(gui_fonts); - - // но только если редактор!!! - if (this.Api.IsNeedDefaultFonts()) - { - // теперь добавим шрифты, без которых редактор как без рук (спецсимволы + дефолтовые стили документа) - this.AddLoadFonts("Arial", 0x0F); - this.AddLoadFonts("Symbol", 0x0F); - this.AddLoadFonts("Wingdings", 0x0F); - this.AddLoadFonts("Courier New", 0x0F); - this.AddLoadFonts("Times New Roman", 0x0F); - } - - this.Api.asyncFontsDocumentStartLoaded(); - - this.bIsLoadDocumentFirst = true; - - this.CheckFontsNeedLoadingLoad(); - this._LoadFonts(); - }; - - this.CheckFontsNeedLoadingLoad = function() - { - var _fonts = this.fonts_loading; - var _fonts_len = _fonts.length; - - var _need = false; - for (var i = 0; i < _fonts_len; i++) - { - if (true == _fonts[i].CheckFontLoadStyles(this)) - _need = true; - } - return _need; - }; - - this.CheckFontsNeedLoading = function(_fonts) - { - for (var i in _fonts) - { - var info = g_fontApplication.GetFontInfo(_fonts[i].name); - var _isNeed = info.CheckFontLoadStylesNoLoad(this); - if (_isNeed === true) - return true; - } - return false; - }; - - this.LoadDocumentFonts2 = function(_fonts, _blockType, _callback) - { - if (this.isWorking()) - return; - - this.endLoadingCallback = (undefined !== _callback) ? _callback : null; - - this.BlockOperationType = _blockType; - // сначала заполняем массив this.fonts_loading объекстами fontinfo - for (var i in _fonts) - { - this.AddLoadFonts(_fonts[i].name, 0x0F); - } - - if (null == this.ThemeLoader) - this.Api.asyncFontsDocumentStartLoaded(this.BlockOperationType); - else - this.ThemeLoader.asyncFontsStartLoaded(); - - this.CheckFontsNeedLoadingLoad(); - this._LoadFonts(); - }; - - var oThis = this; - this._LoadFonts = function() - { - if (this.bIsLoadDocumentFirst === true && 0 === this.perfStart && this.fonts_loading.length > 0) { - this.perfStart = performance.now(); - } - if (0 == this.fonts_loading.length) - { - if (this.perfStart > 0) { - let perfEnd = performance.now(); - AscCommon.sendClientLog("debug", AscCommon.getClientInfoString("onLoadFonts", perfEnd - this.perfStart), this.Api); - this.perfStart = 0; - } - if (null != this.endLoadingCallback) - { - this.endLoadingCallback.call(this.Api); - this.endLoadingCallback = null; - } - else if (null == this.ThemeLoader) - this.Api.asyncFontsDocumentEndLoaded(this.BlockOperationType); - else - this.ThemeLoader.asyncFontsEndLoaded(); - - this.BlockOperationType = undefined; - - if (this.bIsLoadDocumentFirst === true) - { - var _count = this.fonts_loading_after_style.length; - for (var i = 0; i < _count; i++) - { - var _info = this.fonts_loading_after_style[i]; - _info.NeedStyles = 0x0F; - _info.CheckFontLoadStyles(this); - } - this.fonts_loading_after_style.splice(0, this.fonts_loading_after_style.length); - - this.bIsLoadDocumentFirst = false; - } - return; - } - - var fontinfo = this.fonts_loading[0]; - var IsNeed = fontinfo.CheckFontLoadStyles(this); - - if (IsNeed) - { - this.check_loaded_timer_id = setTimeout(oThis._check_loaded, 50); - } - else - { - if (this.bIsLoadDocumentFirst === true) - { - this.Api.OpenDocumentProgress.CurrentFont++; - this.Api.SendOpenProgress(); - } - - this.fonts_loading_after_style[this.fonts_loading_after_style.length] = this.fonts_loading[0]; - this.fonts_loading.shift(); - this._LoadFonts(); - } - }; - - this.isWorking = function() - { - return (this.check_loaded_timer_id !== -1) ? true : false; - }; - - this._check_loaded = function() - { - oThis.check_loaded_timer_id = -1; - if (0 == oThis.fonts_loading.length) - { - // значит асинхронно удалилось - oThis._LoadFonts(); - return; - } - - var current = oThis.fonts_loading[0]; - var IsNeed = current.CheckFontLoadStyles(oThis); - if (true === IsNeed) - { - oThis.check_loaded_timer_id = setTimeout(oThis._check_loaded, 50); - } - else - { - if (oThis.bIsLoadDocumentFirst === true) - { - oThis.Api.OpenDocumentProgress.CurrentFont++; - oThis.Api.SendOpenProgress(); - } - - oThis.fonts_loading_after_style[oThis.fonts_loading_after_style.length] = oThis.fonts_loading[0]; - oThis.fonts_loading.shift(); - oThis._LoadFonts(); - } - }; - - this.LoadFont = function(fontinfo, loadFontCallBack, loadFontCallBackArgs) - { - this.currentInfoLoaded = fontinfo; - - this.currentInfoLoaded = fontinfo; - this.currentInfoLoaded.NeedStyles = 15; // все стили - - var IsNeed = this.currentInfoLoaded.CheckFontLoadStyles(this); - - if ( undefined === loadFontCallBack ) - { - this.loadFontCallBack = this.Api.asyncFontEndLoaded; - this.loadFontCallBackArgs = this.currentInfoLoaded; - } - else - { - this.loadFontCallBack = loadFontCallBack; - this.loadFontCallBackArgs = loadFontCallBackArgs; - } - - if (IsNeed) - { - this.Api.asyncFontStartLoaded(); - setTimeout(this.check_loaded, 20); - return true; - } - else - { - this.currentInfoLoaded = null; - return false; - } - }; - this.check_loaded = function() - { - var current = oThis.currentInfoLoaded; - - if (null == current) - return; - - var IsNeed = current.CheckFontLoadStyles(oThis); - if (IsNeed) - { - setTimeout(oThis.check_loaded, 50); - } - else - { - oThis.loadFontCallBack.call( oThis.Api, oThis.loadFontCallBackArgs ); - oThis.currentInfoLoaded = null; - } - }; - - this.LoadFontsFromServer = function(_fonts) - { - var _count = _fonts.length; - for (var i = 0; i < _count; i++) - { - var _info = g_fontApplication.GetFontInfo(_fonts[i]); - if (undefined !== _info) - { - _info.LoadFontsFromServer(this); - } - } - } - } - CGlobalFontLoader.prototype.SetStreamIndexEmb = function(font_index, stream_index) - { - this.embeddedFontFiles[font_index].SetStreamIndex(stream_index); - }; - - function CGlobalImageLoader() - { - this.map_image_index = {}; - - // loading - this.Api = null; - this.ThemeLoader = null; - this.images_loading = null; - - this.bIsLoadDocumentFirst = false; - - this.bIsAsyncLoadDocumentImages = false; - - this.bIsLoadDocumentImagesNoByOrder = true; - this.nNoByOrderCounter = 0; - - this.isBlockchainSupport = false; - var oThis = this; - - if (window["AscDesktopEditor"] && - window["AscDesktopEditor"]["IsLocalFile"] && - window["AscDesktopEditor"]["isBlockchainSupport"]) - { - this.isBlockchainSupport = (window["AscDesktopEditor"]["isBlockchainSupport"]() && !window["AscDesktopEditor"]["IsLocalFile"]()); - - if (this.isBlockchainSupport) - { - Image.prototype.preload_crypto = function(_url) - { - window["crypto_images_map"] = window["crypto_images_map"] || {}; - if (!window["crypto_images_map"][_url]) - window["crypto_images_map"][_url] = []; - window["crypto_images_map"][_url].push(this); - - window["AscDesktopEditor"]["PreloadCryptoImage"](_url, AscCommon.g_oDocumentUrls.getLocal(_url)); - - oThis.Api.sync_StartAction(Asc.c_oAscAsyncActionType.BlockInteraction, Asc.c_oAscAsyncAction.LoadImage); - }; - - Image.prototype["onload_crypto"] = function(_src, _crypto_data) - { - if (_crypto_data && AscCommon.EncryptionWorker && AscCommon.EncryptionWorker.isCryptoImages()) - { - AscCommon.EncryptionWorker.decryptImage(_src, this, _crypto_data); - return; - } - this.crossOrigin = ""; - this.src = _src; - oThis.Api.sync_EndAction(Asc.c_oAscAsyncActionType.BlockInteraction, Asc.c_oAscAsyncAction.LoadImage); - }; - } - } - - this.put_Api = function(_api) - { - this.Api = _api; - - if (this.Api.IsAsyncOpenDocumentImages !== undefined) - { - this.bIsAsyncLoadDocumentImages = this.Api.IsAsyncOpenDocumentImages(); - if (this.bIsAsyncLoadDocumentImages) - { - if (undefined === this.Api.asyncImageEndLoadedBackground) - this.bIsAsyncLoadDocumentImages = false; - } - } - }; - - this.LoadDocumentImages = function(_images, isCheckExists) - { - if (isCheckExists) - { - for (var i = _images.length - 1; i >= 0; i--) - { - var _id = AscCommon.getFullImageSrc2(_images[i]); - if (this.map_image_index[_id] && (this.map_image_index[_id].Status === ImageLoadStatus.Complete)) - { - _images.splice(i, 1); - } - } - - if (0 === _images.length) - return; - } - - // сначала заполним массив - if (this.ThemeLoader == null) - this.Api.asyncImagesDocumentStartLoaded(); - else - this.ThemeLoader.asyncImagesStartLoaded(); - - this.images_loading = []; - - for (var id in _images) - { - this.images_loading[this.images_loading.length] = AscCommon.getFullImageSrc2(_images[id]); - } - - if (!this.bIsAsyncLoadDocumentImages) - { - this.nNoByOrderCounter = 0; - this._LoadImages(); - } - else - { - var _len = this.images_loading.length; - for (var i = 0; i < _len; i++) - { - this.LoadImageAsync(i); - } - - this.images_loading.splice(0, _len); - - if (this.ThemeLoader == null) - this.Api.asyncImagesDocumentEndLoaded(); - else - this.ThemeLoader.asyncImagesEndLoaded(); - } - }; - - this.loadImageByUrl = function(_image, _url, isDisableCrypto) - { - if (this.isBlockchainSupport && (true !== isDisableCrypto)) - _image.preload_crypto(_url); - else - _image.src = _url; - }; - - this._LoadImages = function() - { - for (var i = 0; i < this.images_loading.length; i++) - { - var _id = this.images_loading[i]; - if (this.map_image_index[_id] && (this.map_image_index[_id].Status === ImageLoadStatus.Complete)) - { - this.images_loading.splice(i, 1); - } - } - var _count_images = this.images_loading.length; - - if (0 == _count_images) - { - this.nNoByOrderCounter = 0; - - if (this.ThemeLoader == null) - this.Api.asyncImagesDocumentEndLoaded(); - else - this.ThemeLoader.asyncImagesEndLoaded(); - - return; - } - - for (var i = 0; i < _count_images; i++) - { - var _id = this.images_loading[i]; - var oImage = new CImage(_id); - oImage.Status = ImageLoadStatus.Loading; - oImage.Image = new Image(); - oThis.map_image_index[oImage.src] = oImage; - oImage.Image.parentImage = oImage; - oImage.Image.onload = function () - { - this.parentImage.Status = ImageLoadStatus.Complete; - oThis.nNoByOrderCounter++; - - if (oThis.bIsLoadDocumentFirst === true) - { - oThis.Api.OpenDocumentProgress.CurrentImage++; - oThis.Api.SendOpenProgress(); - } - - if (!oThis.bIsLoadDocumentImagesNoByOrder) - { - oThis.images_loading.shift(); - oThis._LoadImages(); - } - else if (oThis.nNoByOrderCounter == oThis.images_loading.length) - { - oThis.images_loading = []; - oThis._LoadImages(); - } - }; - oImage.Image.onerror = function () - { - this.parentImage.Status = ImageLoadStatus.Complete; - this.parentImage.Image = null; - oThis.nNoByOrderCounter++; - - if (oThis.bIsLoadDocumentFirst === true) - { - oThis.Api.OpenDocumentProgress.CurrentImage++; - oThis.Api.SendOpenProgress(); - } - - if (!oThis.bIsLoadDocumentImagesNoByOrder) - { - oThis.images_loading.shift(); - oThis._LoadImages(); - } - else if (oThis.nNoByOrderCounter == oThis.images_loading.length) - { - oThis.images_loading = []; - oThis._LoadImages(); - } - }; - AscCommon.backoffOnErrorImg(oImage.Image, function(img) { - oThis.loadImageByUrl(img, img.src); - }); - //oImage.Image.crossOrigin = 'anonymous'; - oThis.loadImageByUrl(oImage.Image, oImage.src); - - if (!oThis.bIsLoadDocumentImagesNoByOrder) - return; - } - }; - - this.LoadImage = function(src, Type) - { - var _image = this.map_image_index[src]; - if (undefined != _image) - return _image; - - this.Api.asyncImageStartLoaded(); - - var oImage = new CImage(src); - oImage.Type = Type; - oImage.Image = new Image(); - oImage.Status = ImageLoadStatus.Loading; - oThis.map_image_index[oImage.src] = oImage; - - oImage.Image.onload = function(){ - oImage.Status = ImageLoadStatus.Complete; - oThis.Api.asyncImageEndLoaded(oImage); - }; - oImage.Image.onerror = function(){ - oImage.Image = null; - oImage.Status = ImageLoadStatus.Complete; - oThis.Api.asyncImageEndLoaded(oImage); - }; - AscCommon.backoffOnErrorImg(oImage.Image, function(img) { - oThis.loadImageByUrl(img, img.src); - }); - //oImage.Image.crossOrigin = 'anonymous'; - this.loadImageByUrl(oImage.Image, oImage.src); - return null; - }; - - this.LoadImageAsync = function(i) - { - var _id = oThis.images_loading[i]; - var oImage = new CImage(_id); - oImage.Status = ImageLoadStatus.Loading; - oImage.Image = new Image(); - oThis.map_image_index[oImage.src] = oImage; - oImage.Image.onload = function(){ - oImage.Status = ImageLoadStatus.Complete; - oThis.Api.asyncImageEndLoadedBackground(oImage); - }; - oImage.Image.onerror = function(){ - oImage.Status = ImageLoadStatus.Complete; - oImage.Image = null; - oThis.Api.asyncImageEndLoadedBackground(oImage); - }; - AscCommon.backoffOnErrorImg(oImage.Image, function(img) { - oThis.loadImageByUrl(img, img.src); - }); - //oImage.Image.crossOrigin = 'anonymous'; - oThis.loadImageByUrl(oImage.Image, oImage.src); - }; - - this.LoadImagesWithCallback = function(arr, loadImageCallBack, loadImageCallBackArgs, isDisableCrypto) - { - var arrAsync = []; - var i = 0; - for (i = 0; i < arr.length; i++) - { - if (this.map_image_index[arr[i]] === undefined) - arrAsync.push(arr[i]); - } - - if (arrAsync.length == 0) - { - loadImageCallBack.call(this.Api, loadImageCallBackArgs); - return; - } - - let asyncImageCounter = arrAsync.length; - const callback = loadImageCallBack.bind(this.Api, loadImageCallBackArgs); - - for (i = 0; i < arrAsync.length; i++) - { - var oImage = new CImage(arrAsync[i]); - oImage.Image = new Image(); - oImage.Image.parentImage = oImage; - oImage.Status = ImageLoadStatus.Loading; - this.map_image_index[oImage.src] = oImage; - - oImage.Image.onload = function () - { - this.parentImage.Status = ImageLoadStatus.Complete; - asyncImageCounter--; - - if (asyncImageCounter === 0) - callback(); - }; - oImage.Image.onerror = function () - { - this.parentImage.Image = null; - this.parentImage.Status = ImageLoadStatus.Complete; - asyncImageCounter--; - - if (asyncImageCounter === 0) - callback(); - }; - AscCommon.backoffOnErrorImg(oImage.Image, function(img) { - oThis.loadImageByUrl(img, img.src); - }); - //oImage.Image.crossOrigin = 'anonymous'; - this.loadImageByUrl(oImage.Image, oImage.src, isDisableCrypto); - } - }; - } - - //---------------------------------------------------------export--------------------------------------------------- - window['AscCommon'] = window['AscCommon'] || {}; - window['AscCommon'].CGlobalFontLoader = CGlobalFontLoader; - window['AscCommon'].g_font_loader = new CGlobalFontLoader(); - window['AscCommon'].g_image_loader = new CGlobalImageLoader(); -})(window, window.document); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/Overlay.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/Overlay.js deleted file mode 100644 index 4bab0ae815..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/Overlay.js +++ /dev/null @@ -1,3385 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -(function(window, undefined){ - var AscBrowser = AscCommon.AscBrowser; - -var TRACK_CIRCLE_RADIUS = 5; -var TRACK_RECT_SIZE2 = 4; -var TRACK_RECT_SIZE = 8; -var TRACK_RECT_SIZE_FORM = 6; -var TRACK_RECT_SIZE_CT = 6; -var TRACK_DISTANCE_ROTATE = 25; -var TRACK_DISTANCE_ROTATE2 = 25; -var TRACK_ADJUSTMENT_SIZE = 10; -var TRACK_WRAPPOINTS_SIZE = 6; -var ROTATE_TRACK_W = 21; - -var bIsUseImageRotateTrack = true; -if (bIsUseImageRotateTrack) -{ - window.g_track_rotate_marker = new Image(); - window.g_track_rotate_marker; - window.g_track_rotate_marker.asc_complete = false; - window.g_track_rotate_marker.onload = function(){ - window.g_track_rotate_marker.asc_complete = true; - }; - window.g_track_rotate_marker.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAMAAACeyVWkAAAAVFBMVEUAAAD///////////////////////////////////////////////////////98fHy2trb09PTT09OysrKqqqqJiYng4ODr6+uamprGxsbi4uKGhoYjgM0eAAAADnRSTlMAy00k7/z0jbeuMzDljsugwZgAAACpSURBVBjTdZHbEoMgDESDAl6bgIqX9v//s67UYpm6D0xyYMImoaiuUr3pVdVRUtnwqaY8YaE5SRcfaPgqc+DSIh7WIGGaEVoUqRGN4oZlcDIiqYlaPjQz5CNu6cFJwLiuSO3nlLBDrKhn3l4rcnH4NcAdGd5EZMfCsoMFBxM6CD57G+u6vC48PMVnHtrYhP/x+7+3cw7zdJnD3cyA7QXa4nYXaW+a9Xdvb6zqE5Jb7LmzAAAAAElFTkSuQmCC"; - - window.g_track_rotate_marker2 = new Image(); - window.g_track_rotate_marker2; - window.g_track_rotate_marker2.asc_complete = false; - window.g_track_rotate_marker2.onload = function(){ - window.g_track_rotate_marker2.asc_complete = true; - }; - window.g_track_rotate_marker2.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAeFBMVEUAAAD///////////////////////////////////////////////////////////////////////////+Tk5Obm5v8/PzAwMD5+fmWlpbt7e3k5OSfn5/z8/PLy8vn5+fExMSsrKyqqqrf39+vr6+9vb2urq7c3NxSmuRpAAAAE3RSTlMA+u2XA+PTrId4WBwTN7EKtLY4iqQP6AAAAWhJREFUOMudVe2SgjAMLN+goN51CxTLp3r3/m943BAqIJTR/RU6O02yTRY2g5tEgW9blu0HUeKyLRxDj0/ghcdVWuxYfAHLiV95B5uvwD4saK7DN+DMSj1f+CYu58l9J27A6XnnJG9R3ZWU6l4Vk+y6D310baHRXvUxdRSP/aYZILJbmebFLRNAlo69x7PEeQdZ5Xz8qiS6fJr8aOnEquATFApdSsr/v1HINUo+Q6nwoDDspfH4JmoJ6shzWcINaNBSlLCI6uvLfyXmAlR2xIKBB/A1ZKiGIGA+8QCtphBawRt+hsBnNvE0M0OPZmwcijRnFvE0U6CuIcbrIUlJRnJL9L0YifTQCgU3p/aH4I7fnWaCIajwMMszCl5A7Aj+TWctGuMT6qG4QtbGodBj9oAyjpke3LSDYXCXq9A8V6GZrsLGcqXlcrneW9elAQgpxdwA3rcUdv4ymdQHtrdvpPvW/LHZ7/8+/gBTWGFPbAkGiAAAAABJRU5ErkJggg=="; - - - TRACK_DISTANCE_ROTATE2 = 18; -} - - -function COverlay() -{ - this.m_oControl = null; - this.m_oContext = null; - - this.min_x = 0xFFFF; - this.min_y = 0xFFFF; - this.max_x = -0xFFFF; - this.max_y = -0xFFFF; - - this.m_bIsShow = false; - this.m_bIsAlwaysUpdateOverlay = false; - - this.m_oHtmlPage = null; - - this.DashLineColor = "#000000"; - this.ClearAll = false; - - this.IsCellEditor = false; -} - -COverlay.prototype = -{ - init : function(context, controlName, x, y, w_pix, h_pix, w_mm, h_mm) - { - this.m_oContext = context; - this.m_oControl = AscCommon.CreateControl(controlName); - - this.m_oHtmlPage = new AscCommon.CHtmlPage(); - this.m_oHtmlPage.init(x, y, w_pix, h_pix, w_mm, h_mm); - }, - - Clear : function() - { - if (null == this.m_oContext) - { - this.m_oContext = this.m_oControl.HtmlElement.getContext('2d'); - - this.m_oContext.imageSmoothingEnabled = false; - this.m_oContext.mozImageSmoothingEnabled = false; - this.m_oContext.oImageSmoothingEnabled = false; - this.m_oContext.webkitImageSmoothingEnabled = false; - } - - this.SetBaseTransform(); - this.m_oContext.beginPath(); - if (this.max_x != -0xFFFF && this.max_y != -0xFFFF) - { - if (this.ClearAll === true) - { - this.m_oContext.clearRect(0, 0, this.m_oControl.HtmlElement.width, this.m_oControl.HtmlElement.height); - this.ClearAll = false; - } - else - { - var _eps = 5; - this.m_oContext.clearRect(this.min_x - _eps, this.min_y - _eps, this.max_x - this.min_x + 2*_eps, this.max_y - this.min_y + 2 * _eps); - } - } - this.min_x = 0xFFFF; - this.min_y = 0xFFFF; - this.max_x = -0xFFFF; - this.max_y = -0xFFFF; - }, - - GetImageTrackRotationImage : function() - { - return AscCommon.AscBrowser.isCustomScalingAbove2() ? window.g_track_rotate_marker2 : window.g_track_rotate_marker; - }, - - SetTransform : function(sx, shy, shx, sy, tx, ty) - { - this.SetBaseTransform(); - this.m_oContext.setTransform(sx, shy, shx, sy, tx, ty); - - }, - - SetBaseTransform : function() - { - this.m_oContext.setTransform(1, 0, 0, 1, 0, 0); - }, - - Show : function() - { - if (this.m_bIsShow) - return; - - this.m_bIsShow = true; - this.m_oControl.HtmlElement.style.display = "block"; - }, - UnShow : function() - { - if (!this.m_bIsShow) - return; - - this.m_bIsShow = false; - this.m_oControl.HtmlElement.style.display = "none"; - }, - - VertLine : function(position, bIsSimpleAdd) - { - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - if (bIsSimpleAdd !== true) - { - this.Clear(); - if (this.m_bIsAlwaysUpdateOverlay || true/*мало ли что есть на оверлее*/) - { - if (!editor.WordControl.OnUpdateOverlay()) - { - editor.WordControl.EndUpdateOverlay(); - } - } - } - position *= rPR; - if (this.min_x > position) - this.min_x = position; - if (this.max_x < position) - this.max_x = position; - - //this.min_x = position; - //this.max_x = position; - this.min_y = 0; - this.max_y = this.m_oControl.HtmlElement.height; - - this.m_oContext.lineWidth = Math.round(rPR); - var x = ((position + 0.5 * this.m_oContext.lineWidth) >> 0) + 0.5 * this.m_oContext.lineWidth; - var y = 0; - - this.m_oContext.strokeStyle = this.DashLineColor; - this.m_oContext.beginPath(); - - var lineWidth = this.m_oContext.lineWidth; - while (y < this.max_y) - { - this.m_oContext.moveTo(x, y); y += lineWidth; - this.m_oContext.lineTo(x, y); y += lineWidth; - this.m_oContext.moveTo(x, y); y += lineWidth; - this.m_oContext.lineTo(x, y); y += lineWidth; - this.m_oContext.moveTo(x, y); y += lineWidth; - this.m_oContext.lineTo(x, y); y += lineWidth; - - y += 5 * lineWidth; - } - - this.m_oContext.stroke(); - - y = lineWidth; - this.m_oContext.strokeStyle = "#FFFFFF"; - this.m_oContext.beginPath(); - - while (y < this.max_y) - { - this.m_oContext.moveTo(x, y); y += lineWidth; - this.m_oContext.lineTo(x, y); y += lineWidth; - this.m_oContext.moveTo(x, y); y += lineWidth; - this.m_oContext.lineTo(x, y); y += lineWidth; - this.m_oContext.moveTo(x, y); y += lineWidth; - this.m_oContext.lineTo(x, y); y += lineWidth; - - y += 5 * lineWidth; - } - - this.m_oContext.stroke(); - this.Show(); - }, - - VertLine2 : function(position) - { - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - position *= rPR; - if (this.min_x > position) - this.min_x = position; - if (this.max_x < position) - this.max_x = position; - - var _old_global = this.m_oContext.globalAlpha; - this.m_oContext.globalAlpha = 1; - - this.min_y = 0; - this.max_y = this.m_oControl.HtmlElement.height; - - this.m_oContext.lineWidth = Math.round(rPR); - var indent = 0.5 * this.m_oContext.lineWidth; - - var x = ((position + indent) >> 0) + indent; - var y = 0; - - /* - this.m_oContext.strokeStyle = "#FFFFFF"; - this.m_oContext.beginPath(); - this.m_oContext.moveTo(x, y); - this.m_oContext.lineTo(x, this.max_y); - this.m_oContext.stroke(); - */ - - this.m_oContext.strokeStyle = this.DashLineColor; - this.m_oContext.beginPath(); - - var dist = this.m_oContext.lineWidth; - - while (y < this.max_y) - { - this.m_oContext.moveTo(x, y); - y += dist; - this.m_oContext.lineTo(x, y); - y += dist; - } - - this.m_oContext.stroke(); - this.m_oContext.beginPath(); - this.Show(); - - this.m_oContext.globalAlpha = _old_global; - }, - - HorLine : function(position, bIsSimpleAdd) - { - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - - if (bIsSimpleAdd !== true) - { - this.Clear(); - if (this.m_bIsAlwaysUpdateOverlay || true/*мало ли что есть на оверлее*/) - { - if (!editor.WordControl.OnUpdateOverlay()) - { - editor.WordControl.EndUpdateOverlay(); - } - } - } - - this.min_x = 0; - this.max_x = this.m_oControl.HtmlElement.width; - - position *= rPR; - if (this.min_y > position) - this.min_y = position; - if (this.max_y < position) - this.max_y = position; - - this.m_oContext.lineWidth = Math.round(rPR); - var y = ((position + 0.5 * this.m_oContext.lineWidth) >> 0) + 0.5 * this.m_oContext.lineWidth; - var x = 0; - - this.m_oContext.strokeStyle = this.DashLineColor; - this.m_oContext.beginPath(); - var lineWidth = this.m_oContext.lineWidth; - while (x < this.max_x) - { - this.m_oContext.moveTo(x, y); x += lineWidth; - this.m_oContext.lineTo(x, y); x += lineWidth; - this.m_oContext.moveTo(x, y); x += lineWidth; - this.m_oContext.lineTo(x, y); x += lineWidth; - this.m_oContext.moveTo(x, y); x += lineWidth; - this.m_oContext.lineTo(x, y); x += lineWidth; - - x += 5 * lineWidth; - } - - this.m_oContext.stroke(); - - x = lineWidth; - this.m_oContext.strokeStyle = "#FFFFFF"; - this.m_oContext.beginPath(); - - while (x < this.max_x) - { - this.m_oContext.moveTo(x, y); x += lineWidth; - this.m_oContext.lineTo(x, y); x += lineWidth; - this.m_oContext.moveTo(x, y); x += lineWidth; - this.m_oContext.lineTo(x, y); x += lineWidth; - this.m_oContext.moveTo(x, y); x += lineWidth; - this.m_oContext.lineTo(x, y); x += lineWidth; - - x += 5 * lineWidth; - } - - this.m_oContext.stroke(); - this.Show(); - }, - - HorLine2 : function(position) - { - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - - position *= rPR; - if (this.min_y > position) - this.min_y = position; - if (this.max_y < position) - this.max_y = position; - - var _old_global = this.m_oContext.globalAlpha; - this.m_oContext.globalAlpha = 1; - - this.min_x = 0; - this.max_x = this.m_oControl.HtmlElement.width; - - this.m_oContext.lineWidth = Math.round(rPR); - var indent = 0.5 * this.m_oContext.lineWidth; - - var y = ((position + indent) >> 0) + indent; - var x = 0; - - /* - this.m_oContext.strokeStyle = "#FFFFFF"; - this.m_oContext.beginPath(); - this.m_oContext.moveTo(x, y); - this.m_oContext.lineTo(this.max_x, y); - this.m_oContext.stroke(); - */ - - this.m_oContext.strokeStyle = this.DashLineColor; - this.m_oContext.beginPath(); - - var dist = this.m_oContext.lineWidth; - - while (x < this.max_x) - { - this.m_oContext.moveTo(x, y); - x += dist; - this.m_oContext.lineTo(x, y); - x += dist; - } - - this.m_oContext.stroke(); - this.m_oContext.beginPath(); - this.Show(); - - this.m_oContext.globalAlpha = _old_global; - }, - - CheckPoint1 : function(x,y) - { - if (x < this.min_x) - this.min_x = x; - if (y < this.min_y) - this.min_y = y; - }, - CheckPoint2 : function(x,y) - { - if (x > this.max_x) - this.max_x = x; - if (y > this.max_y) - this.max_y = y; - }, - CheckPoint : function(x,y) - { - if (x < this.min_x) - this.min_x = x ; - if (y < this.min_y) - this.min_y = y; - if (x > this.max_x) - this.max_x = x; - if (y > this.max_y) - this.max_y = y; - }, - - AddRect2 : function(x,y,r) - { - var _x = x - ((r / 2) >> 0); - var _y = y - ((r / 2) >> 0); - this.CheckPoint1(_x,_y); - this.CheckPoint2(_x+r,_y+r); - - this.m_oContext.moveTo(_x,_y); - this.m_oContext.rect(_x,_y,r,r); - }, - - AddRect3 : function(x,y,r, ex1, ey1, ex2, ey2) - { - var _r = r / 2; - - var x1 = x + _r * (ex2 - ex1); - var y1 = y + _r * (ey2 - ey1); - - var x2 = x + _r * (ex2 + ex1); - var y2 = y + _r * (ey2 + ey1); - - var x3 = x + _r * (-ex2 + ex1); - var y3 = y + _r * (-ey2 + ey1); - - var x4 = x + _r * (-ex2 - ex1); - var y4 = y + _r * (-ey2 - ey1); - - this.CheckPoint(x1,y1); - this.CheckPoint(x2,y2); - this.CheckPoint(x3,y3); - this.CheckPoint(x4,y4); - - var ctx = this.m_oContext; - ctx.moveTo(x1,y1); - ctx.lineTo(x2,y2); - ctx.lineTo(x3,y3); - ctx.lineTo(x4,y4); - ctx.closePath(); - }, - - AddRect : function(x,y,w,h) - { - this.CheckPoint1(x,y); - this.CheckPoint2(x + w,y + h); - - this.m_oContext.moveTo(x,y); - this.m_oContext.rect(x,y,w,h); - //this.m_oContext.closePath(); - }, - CheckRectT : function(x,y,w,h,trans,eps) - { - var x1 = trans.TransformPointX(x, y); - var y1 = trans.TransformPointY(x, y); - - var x2 = trans.TransformPointX(x+w, y); - var y2 = trans.TransformPointY(x+w, y); - - var x3 = trans.TransformPointX(x+w, y+h); - var y3 = trans.TransformPointY(x+w, y+h); - - var x4 = trans.TransformPointX(x, y+h); - var y4 = trans.TransformPointY(x, y+h); - - this.CheckPoint(x1, y1); - this.CheckPoint(x2, y2); - this.CheckPoint(x3, y3); - this.CheckPoint(x4, y4); - - if (eps !== undefined) - { - this.min_x -= eps; - this.min_y -= eps; - this.max_x += eps; - this.max_y += eps; - } - }, - CheckRect : function(x,y,w,h) - { - this.CheckPoint1(x,y); - this.CheckPoint2(x + w,y + h); - }, - AddEllipse : function(x,y,r) - { - this.CheckPoint1(x-r,y-r); - this.CheckPoint2(x+r,y+r); - - this.m_oContext.moveTo(x+r,y); - this.m_oContext.arc(x,y,r,0,Math.PI*2,false); - //this.m_oContext.closePath(); - }, - AddEllipse2 : function(x,y,r) - { - this.m_oContext.moveTo(x+r,y); - this.m_oContext.arc(x,y,r,0,Math.PI*2,false); - //this.m_oContext.closePath(); - }, - - AddDiamond : function(x,y,r) - { - this.CheckPoint1(x-r,y-r); - this.CheckPoint2(x+r,y+r); - - this.m_oContext.moveTo(x-r,y); - this.m_oContext.lineTo(x, y-r); - this.m_oContext.lineTo(x+r, y); - this.m_oContext.lineTo(x, y+r); - this.m_oContext.lineTo(x-r, y); - //this.m_oContext.closePath(); - }, - - AddRoundRect : function(x, y, w, h, r) - { - if (w < (2 * r) || h < (2 * r)) - return this.AddRect(x, y, w, h); - - this.CheckPoint1(x,y); - this.CheckPoint2(x + w,y + h); - - var _ctx = this.m_oContext; - _ctx.moveTo(x + r, y); - _ctx.lineTo(x + w - r, y); - _ctx.quadraticCurveTo(x + w, y, x + w, y + r); - _ctx.lineTo(x + w, y + h - r); - _ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h); - _ctx.lineTo(x + r, y + h); - _ctx.quadraticCurveTo(x, y + h, x, y + h - r); - _ctx.lineTo(x, y + r); - _ctx.quadraticCurveTo(x, y, x + r, y); - _ctx.closePath(); - }, - - AddRoundRectCtx : function(ctx, x, y, w, h, r) - { - if (w < (2 * r) || h < (2 * r)) - return ctx.rect(x, y, w, h); - - var _ctx = this.m_oContext; - _ctx.moveTo(x + r, y); - _ctx.lineTo(x + w - r, y); - _ctx.quadraticCurveTo(x + w, y, x + w, y + r); - _ctx.lineTo(x + w, y + h - r); - _ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h); - _ctx.lineTo(x + r, y + h); - _ctx.quadraticCurveTo(x, y + h, x, y + h - r); - _ctx.lineTo(x, y + r); - _ctx.quadraticCurveTo(x, y, x + r, y); - _ctx.closePath(); - }, - DrawFrozenPlaceHorLine: function(y, left, right) - { - this.m_oContext.strokeStyle = "#AAAAAA"; - var nW = 2; - - nW = AscCommon.AscBrowser.convertToRetinaValue(nW, true); - this.CheckPoint1(left, y - nW); - this.CheckPoint2(right, y + nW); - this.m_oContext.lineWidth = nW; - this.m_oContext.beginPath(); - this.m_oContext.moveTo(left, y); - this.m_oContext.lineTo(right, y); - this.m_oContext.stroke(); - }, - DrawFrozenPlaceVerLine: function(x, top, bottom) - { - this.m_oContext.strokeStyle = "#AAAAAA"; - var nW = 2; - - nW = AscCommon.AscBrowser.convertToRetinaValue(nW, true); - this.CheckPoint1(x - nW, top); - this.CheckPoint2(x + nW, bottom); - this.m_oContext.lineWidth = nW; - this.m_oContext.beginPath(); - this.m_oContext.moveTo(x, top); - this.m_oContext.lineTo(x, bottom); - this.m_oContext.stroke(); - }, - drawArrow : function(ctx, x, y, len, rgb, needToCorrectLen) { - ctx.beginPath(); - var arrowSize = this.GetArrowSize(); - - if (needToCorrectLen && 0 == (len & 1) ) - len += 1; - var _data, px, - _x = Math.round((arrowSize - len) / 2), - _y = Math.floor(arrowSize / 2), - r, g, b; - var __x = _x, __y = _y, _len = len; - - // r = 147, g = 147, b = 147; - var r = rgb.r, g = rgb.g, b = rgb.b; - _data = ctx.createImageData(arrowSize, arrowSize); - px = _data.data; - - while (_len > 0) { - var ind = 4 * (arrowSize * __y + __x); - for (var i = 0; i < _len; i++) { - px[ind++] = r; - px[ind++] = g; - px[ind++] = b; - px[ind++] = 255; - } - - r = r >> 0; - g = g >> 0; - b = b >> 0; - - __x += 1; - __y -= 1; - _len -= 2; - } - - ctx.putImageData(_data, x, y); - }, - - GetArrowSize: function() - { - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - return Math.round(13 * rPR); - } -}; - -function CAutoshapeTrack() -{ - this.m_oContext = null; - this.m_oOverlay = null; - - this.Graphics = null; - - this.MaxEpsLine = 0; - this.IsTrack = true; - - this.PageIndex = -1; - this.CurrentPageInfo = null; - - this.ArrowCanvas = null; - this.RotatedArrowCanvas = null; -} - -CAutoshapeTrack.prototype = -{ - SetFont : function(font) - { - }, - - init : function(overlay, x, y, r, b, w_mm, h_mm) - { - this.m_oOverlay = overlay; - this.m_oContext = this.m_oOverlay.m_oContext; - - this.Graphics = new AscCommon.CGraphics(); - - var _scale = this.m_oOverlay.IsCellEditor ? 1 : AscCommon.AscBrowser.retinaPixelRatio; - - this.Graphics.init(this.m_oContext, _scale * (r - x), _scale * (b - y), w_mm, h_mm); - - this.Graphics.m_oCoordTransform.tx = _scale * x; - this.Graphics.m_oCoordTransform.ty = _scale * y; - - this.Graphics.SetIntegerGrid(false); - - - this.Graphics.globalAlpha = 0.5; - this.m_oContext.globalAlpha = 0.5; - }, - SetIntegerGrid : function(b) - { - }, - // draw styles - p_color : function(r,g,b,a) - { - this.Graphics.p_color(r, g, b, a); - }, - p_width : function(w) - { - this.Graphics.p_width(w); - - var xx1 = 0; - var yy1 = 0; - var xx2 = 1; - var yy2 = 1; - - var xxx1 = this.Graphics.m_oFullTransform.TransformPointX(xx1, yy1); - var yyy1 = this.Graphics.m_oFullTransform.TransformPointY(xx1, yy1); - var xxx2 = this.Graphics.m_oFullTransform.TransformPointX(xx2, yy2); - var yyy2 = this.Graphics.m_oFullTransform.TransformPointY(xx2, yy2); - - var _len2 = ((xxx2 - xxx1)*(xxx2 - xxx1) + (yyy2 - yyy1)*(yyy2 - yyy1)); - var koef = Math.sqrt(_len2 / 2); - - var _EpsLine = (w * koef / 1000) >> 0; - _EpsLine += 5; - - if (_EpsLine > this.MaxEpsLine) - this.MaxEpsLine = _EpsLine; - }, - p_dash : function(params) - { - this.Graphics.p_dash(params); - }, - b_color1 : function(r,g,b,a) - { - this.Graphics.b_color1(r,g,b,a); - }, - - // path commands - _s : function() - { - this.Graphics._s(); - }, - _e : function() - { - this.Graphics._e(); - }, - _z : function() - { - this.Graphics._z(); - }, - _m : function(x,y) - { - this.Graphics._m(x,y); - - var _x = this.Graphics.m_oFullTransform.TransformPointX(x,y); - var _y = this.Graphics.m_oFullTransform.TransformPointY(x,y); - this.m_oOverlay.CheckPoint(_x, _y); - }, - _l : function(x,y) - { - this.Graphics._l(x,y); - - var _x = this.Graphics.m_oFullTransform.TransformPointX(x,y); - var _y = this.Graphics.m_oFullTransform.TransformPointY(x,y); - this.m_oOverlay.CheckPoint(_x, _y); - }, - _c : function(x1,y1,x2,y2,x3,y3) - { - this.Graphics._c(x1,y1,x2,y2,x3,y3); - - var _x1 = this.Graphics.m_oFullTransform.TransformPointX(x1,y1); - var _y1 = this.Graphics.m_oFullTransform.TransformPointY(x1,y1); - - var _x2 = this.Graphics.m_oFullTransform.TransformPointX(x2,y2); - var _y2 = this.Graphics.m_oFullTransform.TransformPointY(x2,y2); - - var _x3 = this.Graphics.m_oFullTransform.TransformPointX(x3,y3); - var _y3 = this.Graphics.m_oFullTransform.TransformPointY(x3,y3); - - this.m_oOverlay.CheckPoint(_x1, _y1); - this.m_oOverlay.CheckPoint(_x2, _y2); - this.m_oOverlay.CheckPoint(_x3, _y3); - }, - _c2 : function(x1,y1,x2,y2) - { - this.Graphics._c2(x1,y1,x2,y2); - - var _x1 = this.Graphics.m_oFullTransform.TransformPointX(x1,y1); - var _y1 = this.Graphics.m_oFullTransform.TransformPointY(x1,y1); - - var _x2 = this.Graphics.m_oFullTransform.TransformPointX(x2,y2); - var _y2 = this.Graphics.m_oFullTransform.TransformPointY(x2,y2); - - this.m_oOverlay.CheckPoint(_x1, _y1); - this.m_oOverlay.CheckPoint(_x2, _y2); - }, - ds : function() - { - this.Graphics.ds(); - }, - df : function() - { - this.Graphics.df(); - }, - - // canvas state - save : function() - { - this.Graphics.save(); - }, - restore : function() - { - this.Graphics.restore(); - }, - clip : function() - { - this.Graphics.clip(); - }, - - // transform - reset : function() - { - this.Graphics.reset(); - }, - transform3 : function(m) - { - this.Graphics.transform3(m); - }, - transform : function(sx,shy,shx,sy,tx,ty) - { - this.Graphics.transform(sx,shy,shx,sy,tx,ty); - }, - drawImage : function(image, x, y, w, h, alpha, srcRect, nativeImage) - { - this.Graphics.drawImage(image, x, y, w, h, undefined, srcRect, nativeImage); - - var _x1 = this.Graphics.m_oFullTransform.TransformPointX(x,y); - var _y1 = this.Graphics.m_oFullTransform.TransformPointY(x,y); - - var _x2 = this.Graphics.m_oFullTransform.TransformPointX(x+w,y); - var _y2 = this.Graphics.m_oFullTransform.TransformPointY(x+w,y); - - var _x3 = this.Graphics.m_oFullTransform.TransformPointX(x+w,(y+h)); - var _y3 = this.Graphics.m_oFullTransform.TransformPointY(x+w,(y+h)); - - var _x4 = this.Graphics.m_oFullTransform.TransformPointX(x,(y+h)); - var _y4 = this.Graphics.m_oFullTransform.TransformPointY(x,(y+h)); - - this.m_oOverlay.CheckPoint(_x1, _y1); - this.m_oOverlay.CheckPoint(_x2, _y2); - this.m_oOverlay.CheckPoint(_x3, _y3); - this.m_oOverlay.CheckPoint(_x4, _y4); - }, - CorrectOverlayBounds : function() - { - this.m_oOverlay.SetBaseTransform(); - - this.m_oOverlay.min_x -= this.MaxEpsLine; - this.m_oOverlay.min_y -= this.MaxEpsLine; - this.m_oOverlay.max_x += this.MaxEpsLine; - this.m_oOverlay.max_y += this.MaxEpsLine; - }, - - SetCurrentPage : function(nPageIndex, isAttack) - { - if (nPageIndex == this.PageIndex && !isAttack) - return; - - var oPage = this.m_oOverlay.m_oHtmlPage.GetDrawingPageInfo(nPageIndex); - this.PageIndex = nPageIndex; - - var drawPage = oPage.drawingPage; - - this.Graphics = new AscCommon.CGraphics(); - - var _scale = this.m_oOverlay.IsCellEditor ? 1 : AscCommon.AscBrowser.retinaPixelRatio; - - this.Graphics.init(this.m_oContext, _scale * (drawPage.right - drawPage.left), _scale * (drawPage.bottom - drawPage.top), oPage.width_mm, oPage.height_mm); - - this.Graphics.m_oCoordTransform.tx = _scale * drawPage.left; - this.Graphics.m_oCoordTransform.ty = _scale * drawPage.top; - - this.Graphics.SetIntegerGrid(false); - - this.Graphics.globalAlpha = 0.5; - this.m_oContext.globalAlpha = 0.5; - }, - - init2 : function(overlay) - { - this.m_oOverlay = overlay; - this.m_oContext = this.m_oOverlay.m_oContext; - this.PageIndex = -1; - }, - - SetClip : function(r) - { - }, - AddClipRect : function() - { - }, - RemoveClip : function() - { - }, - - SavePen : function() - { - this.Graphics.SavePen(); - }, - RestorePen : function() - { - this.Graphics.RestorePen(); - }, - - SaveBrush : function() - { - this.Graphics.SaveBrush(); - }, - RestoreBrush : function() - { - this.Graphics.RestoreBrush(); - }, - - SavePenBrush : function() - { - this.Graphics.SavePenBrush(); - }, - RestorePenBrush : function() - { - this.Graphics.RestorePenBrush(); - }, - - SaveGrState : function() - { - this.Graphics.SaveGrState(); - }, - RestoreGrState : function() - { - this.Graphics.RestoreGrState(); - }, - - StartClipPath : function() - { - this.Graphics.StartClipPath(); - }, - - EndClipPath : function() - { - this.Graphics.EndClipPath(); - }, - - /*************************************************************************/ - /******************************** TRACKS *********************************/ - /*************************************************************************/ - DrawTrack : function(type, matrix, left, top, width, height, isLine, isCanRotate, isNoMove, isDrawHandles) - { - if (true === isNoMove) - return; - - var bDrawHandles = (isDrawHandles !== false); - if (bDrawHandles === false) - type = AscFormat.TYPE_TRACK.SHAPE; - - if (this.m_oOverlay.IsCellEditor) - { - left /= AscCommon.AscBrowser.retinaPixelRatio; - top /= AscCommon.AscBrowser.retinaPixelRatio; - width /= AscCommon.AscBrowser.retinaPixelRatio; - height /= AscCommon.AscBrowser.retinaPixelRatio; - - if (matrix) - { - matrix.tx /= AscCommon.AscBrowser.retinaPixelRatio; - matrix.ty /= AscCommon.AscBrowser.retinaPixelRatio; - } - } - - // с самого начала нужно понять, есть ли поворот. Потому что если его нет, то можно - // (и нужно!) рисовать все по-умному - var overlay = this.m_oOverlay; - overlay.Show(); - - var bIsClever = false; - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - - var drPage = this.CurrentPageInfo.drawingPage; - - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var xDst = this.m_oOverlay.IsCellEditor ? drPage.left : drPage.left * rPR; - var yDst = this.m_oOverlay.IsCellEditor ? drPage.top : drPage.top * rPR; - var wDst = (drPage.right - drPage.left) * rPR; - var hDst = (drPage.bottom - drPage.top) * rPR; - - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - - var r = left + width; - var b = top + height; - - // (x1,y1) --------- (x2,y2) - // | | - // | | - // (x3,y3) --------- (x4,y4) - - var dx1 = xDst + dKoefX * (matrix.TransformPointX(left, top)); - var dy1 = yDst + dKoefY * (matrix.TransformPointY(left, top)); - - var dx2 = xDst + dKoefX * (matrix.TransformPointX(r, top)); - var dy2 = yDst + dKoefY * (matrix.TransformPointY(r, top)); - - var dx3 = xDst + dKoefX * (matrix.TransformPointX(left, b)); - var dy3 = yDst + dKoefY * (matrix.TransformPointY(left, b)); - - var dx4 = xDst + dKoefX * (matrix.TransformPointX(r, b)); - var dy4 = yDst + dKoefY * (matrix.TransformPointY(r, b)); - - var x1 = dx1 >> 0; - var y1 = dy1 >> 0; - - var x2 = dx2 >> 0; - var y2 = dy2 >> 0; - - var x3 = dx3 >> 0; - var y3 = dy3 >> 0; - - var x4 = dx4 >> 0; - var y4 = dy4 >> 0; - - var _eps = 0.01; - if (Math.abs(dx1 - dx3) < _eps && - Math.abs(dx2 - dx4) < _eps && - Math.abs(dy1 - dy2) < _eps && - Math.abs(dy3 - dy4) < _eps && - x1 < x2 && y1 < y3) - { - x3 = x1; - x4 = x2; - y2 = y1; - y4 = y3; - bIsClever = true; - } - - var nIsCleverWithTransform = bIsClever; - var nType = 0; - if (!nIsCleverWithTransform && - Math.abs(dx1 - dx3) < _eps && - Math.abs(dx2 - dx4) < _eps && - Math.abs(dy1 - dy2) < _eps && - Math.abs(dy3 - dy4) < _eps) - { - x3 = x1; - x4 = x2; - y2 = y1; - y4 = y3; - nIsCleverWithTransform = true; - nType = 1; - - if (false) - { - if (x1 > x2) - { - var tmp = x1; - x1 = x2; x3 = x2; - x2 = tmp; x4 = tmp; - } - - if (y1 > y3) - { - var tmp = y1; - y1 = y3; y2 = y3; - y3 = tmp; y4 = tmp; - } - - nType = 0; - bIsClever = true; - } - } - if (!nIsCleverWithTransform && - Math.abs(dx1 - dx2) < _eps && - Math.abs(dx3 - dx4) < _eps && - Math.abs(dy1 - dy3) < _eps && - Math.abs(dy2 - dy4) < _eps) - { - x2 = x1; - x4 = x3; - y3 = y1; - y4 = y2; - nIsCleverWithTransform = true; - nType = 2; - } - - /* - if (x1 == x3 && x2 == x4 && y1 == y2 && y3 == y4 && x1 < x2 && y1 < y3) - bIsClever = true; - - var nIsCleverWithTransform = bIsClever; - var nType = 0; - if (!nIsCleverWithTransform && x1 == x3 && x2 == x4 && y1 == y2 && y3 == y4) - { - nIsCleverWithTransform = true; - nType = 1; - } - if (!nIsCleverWithTransform && x1 == x2 && x3 == x4 && y1 == y3 && y2 == y4) - { - nIsCleverWithTransform = true; - nType = 2; - } - */ - - var ctx = overlay.m_oContext; - - var bIsEllipceCorner = false; - //var _style_blue = "#4D7399"; - //var _style_blue = "#B2B2B2"; - var _style_blue = "#939393"; - var _style_green = "#84E036"; - var _style_white = "#FFFFFF"; - var _style_black = "#000000"; - - var _len_x = Math.sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2)); - var _len_y = Math.sqrt((x1 - x3)*(x1 - x3) + (y1 - y3)*(y1 - y3)); - - if (_len_x < 1) - _len_x = 1; - if (_len_y < 1) - _len_y = 1; - - var epsForCenter = 30 * rPR; - var bIsRectsTrackX = (_len_x >= epsForCenter) ? true : false; - var bIsRectsTrackY = (_len_y >= epsForCenter) ? true : false; - var bIsRectsTrack = (bIsRectsTrackX || bIsRectsTrackY) ? true : false; - - if (bIsRectsTrack && (type == AscFormat.TYPE_TRACK.CHART_TEXT)) - bIsRectsTrack = false; - - if (nType == 2) - { - var _tmp = bIsRectsTrackX; - bIsRectsTrackX = bIsRectsTrackY; - bIsRectsTrackY = _tmp; - } - - ctx.lineWidth = Math.round(rPR); - ctx.beginPath(); - - var _oldGlobalAlpha = ctx.globalAlpha; - ctx.globalAlpha = 1; - - var SCALE_TRACK_RECT_SIZE = Math.round(TRACK_RECT_SIZE * rPR), - SCALE_TRACK_RECT_SIZE_CT = Math.round(TRACK_RECT_SIZE_CT * rPR); - - var indent = 0.5 * Math.round(rPR); - - switch (type) - { - case AscFormat.TYPE_TRACK.FORM: - { - SCALE_TRACK_RECT_SIZE = Math.round(TRACK_RECT_SIZE_FORM * rPR); - type = AscFormat.TYPE_TRACK.SHAPE; - } - case AscFormat.TYPE_TRACK.SHAPE: - case AscFormat.TYPE_TRACK.GROUP: - case AscFormat.TYPE_TRACK.CHART_TEXT: - { - if (bIsClever) - { - overlay.CheckRect(x1, y1, x4 - x1, y4 - y1); - ctx.strokeStyle = _style_blue; - - if (!isLine) - { - ctx.rect(x1 + indent, y2 + indent, x4 - x1, y4 - y1); - ctx.stroke(); - ctx.beginPath(); - } - - if(bDrawHandles) - { - var xC = ((x1 + x2) / 2) >> 0; - - if (!isLine && isCanRotate) - { - if (!bIsUseImageRotateTrack) - { - ctx.beginPath(); - overlay.AddEllipse(xC, y1 - Math.round(TRACK_DISTANCE_ROTATE * rPR), Math.round(TRACK_CIRCLE_RADIUS * rPR)); - - ctx.fillStyle = _style_green; - ctx.fill(); - ctx.stroke(); - } - else - { - var _image_track_rotate = overlay.GetImageTrackRotationImage(); - if (_image_track_rotate.asc_complete) - { - var _w = Math.round(ROTATE_TRACK_W * rPR), - _xI = (xC + indent - _w / 2) >> 0, - _yI = y1 - Math.round(TRACK_DISTANCE_ROTATE * rPR), - radius = Math.round(6 * rPR); - - overlay.CheckRect(_xI, _yI - radius * 2, _w, _w); - ctx.fillStyle = "#939393"; - var cnvs = this.GetArrowCanvas(); - ctx.drawImage(cnvs, xC - Math.round(12.5 * rPR), _yI - Math.round(4.5 * rPR)) - ctx.beginPath(); - ctx.lineWidth = Math.round(rPR); - ctx.arc(xC, _yI + Math.round(rPR), radius, -3 / 4 * Math.PI, Math.PI); - ctx.stroke(); - ctx.beginPath(); - ctx.arc(xC, _yI + Math.round(rPR), _w / 16, 0, 2 * Math.PI); - ctx.stroke(); - ctx.closePath(); - - ctx.beginPath(); - ctx.globalCompositeOperation = "destination-over"; - ctx.arc(xC, _yI + Math.round(rPR), _w / 2, 0, 2 * Math.PI); - ctx.fillStyle = "#ffffff"; - ctx.fill(); - ctx.closePath(); - ctx.globalCompositeOperation = "source-over"; - } - } - - ctx.beginPath(); - ctx.moveTo(xC + indent, y1); - ctx.lineTo(xC + indent, y1 - Math.round(TRACK_DISTANCE_ROTATE2 * rPR)); - ctx.stroke(); - - ctx.beginPath(); - } - - - - ctx.fillStyle = (type != AscFormat.TYPE_TRACK.CHART_TEXT) ? _style_white : _style_blue; - var TRACK_RECT_SIZE_CUR = (type != AscFormat.TYPE_TRACK.CHART_TEXT) ? SCALE_TRACK_RECT_SIZE : SCALE_TRACK_RECT_SIZE_CT; - if (type == AscFormat.TYPE_TRACK.CHART_TEXT) - ctx.strokeStyle = _style_white; - - if (bIsEllipceCorner) - { - overlay.AddEllipse(x1, y1, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - if (!isLine) - { - overlay.AddEllipse(x2, y2, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x3, y3, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - overlay.AddEllipse(x4, y4, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - else - { - overlay.AddRect2(x1 + indent, y1 + indent, TRACK_RECT_SIZE_CUR); - if (!isLine) - { - overlay.AddRect2(x2 + indent, y2 + indent, TRACK_RECT_SIZE_CUR); - overlay.AddRect2(x3 + indent, y3 + indent, TRACK_RECT_SIZE_CUR); - } - overlay.AddRect2(x4 + indent, y4 + indent, TRACK_RECT_SIZE_CUR); - } - - if (bIsRectsTrack && !isLine) - { - var _xC = (((x1 + x2) / 2) >> 0) + indent; - var _yC = (((y1 + y3) / 2) >> 0) + indent; - - if (bIsRectsTrackX) - { - overlay.AddRect2(_xC, y1 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_xC, y3 + indent, SCALE_TRACK_RECT_SIZE); - } - - if (bIsRectsTrackY) - { - overlay.AddRect2(x2 + indent, _yC, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x1 + indent, _yC, SCALE_TRACK_RECT_SIZE); - } - } - } - - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - } - else - { - var _x1 = x1; - var _y1 = y1; - var _x2 = x2; - var _y2 = y2; - var _x3 = x3; - var _y3 = y3; - var _x4 = x4; - var _y4 = y4; - - if (nIsCleverWithTransform) - { - var _x1 = x1; - if (x2 < _x1) - _x1 = x2; - if (x3 < _x1) - _x1 = x3; - if (x4 < _x1) - _x1 = x4; - - var _x4 = x1; - if (x2 > _x4) - _x4 = x2; - if (x3 > _x4) - _x4 = x3; - if (x4 > _x4) - _x4 = x4; - - var _y1 = y1; - if (y2 < _y1) - _y1 = y2; - if (y3 < _y1) - _y1 = y3; - if (y4 < _y1) - _y1 = y4; - - var _y4 = y1; - if (y2 > _y4) - _y4 = y2; - if (y3 > _y4) - _y4 = y3; - if (y4 > _y4) - _y4 = y4; - - _x2 = _x4; - _y2 = _y1; - _x3 = _x1; - _y3 = _y4; - } - - ctx.strokeStyle = _style_blue; - - if (!isLine) - { - if (nIsCleverWithTransform) - { - ctx.rect(_x1 + indent, _y2 + indent, _x4 - _x1, _y4 - _y1); - ctx.stroke(); - ctx.beginPath(); - } - else - { - ctx.moveTo(x1, y1); - ctx.lineTo(x2, y2); - ctx.lineTo(x4, y4); - ctx.lineTo(x3, y3); - ctx.closePath(); - ctx.stroke(); - } - } - - overlay.CheckPoint(x1, y1); - overlay.CheckPoint(x2, y2); - overlay.CheckPoint(x3, y3); - overlay.CheckPoint(x4, y4); - - var ex1 = (x2 - x1) / _len_x; - var ey1 = (y2 - y1) / _len_x; - var ex2 = (x1 - x3) / _len_y; - var ey2 = (y1 - y3) / _len_y; - - var _bAbsX1 = Math.abs(ex1) < 0.01; - var _bAbsY1 = Math.abs(ey1) < 0.01; - var _bAbsX2 = Math.abs(ex2) < 0.01; - var _bAbsY2 = Math.abs(ey2) < 0.01; - - if (_bAbsX2 && _bAbsY2) - { - if (_bAbsX1 && _bAbsY1) - { - ex1 = 1; - ey1 = 0; - ex2 = 0; - ey2 = 1; - } - else - { - ex2 = -ey1; - ey2 = ex1; - } - } - else if (_bAbsX1 && _bAbsY1) - { - ex1 = ey2; - ey1 = -ex2; - } - - var xc1 = (x1 + x2) / 2; - var yc1 = (y1 + y2) / 2; - - ctx.beginPath(); - - if (bDrawHandles) - { - if (!isLine && isCanRotate) - { - if (!bIsUseImageRotateTrack) - { - ctx.beginPath(); - overlay.AddEllipse(xc1 + ex2 * TRACK_DISTANCE_ROTATE * rPR, yc1 + ey2 * TRACK_DISTANCE_ROTATE * rPR, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - - ctx.fillStyle = _style_green; - ctx.fill(); - ctx.stroke(); - } - else - { - var _image_track_rotate = overlay.GetImageTrackRotationImage(); - if (_image_track_rotate.asc_complete) - { - var _xI = Math.round(xc1 + ex2 * TRACK_DISTANCE_ROTATE * rPR); - var _yI = Math.round(yc1 + ey2 * TRACK_DISTANCE_ROTATE * rPR); - var _w = Math.round(ROTATE_TRACK_W * rPR); - var _w2 = Math.round(ROTATE_TRACK_W / 2 * rPR); - - if (nIsCleverWithTransform) - { - _xI >>= 0; - _yI >>= 0; - _w2 >>= 0; - _w2 += 1; - } - - var _matrix = matrix.CreateDublicate(); - _matrix.tx = 0; - _matrix.ty = 0; - var _xx = _matrix.TransformPointX(0, 1); - var _yy = _matrix.TransformPointY(0, 1); - var _angle = Math.atan2(_xx, -_yy) - Math.PI; - var _px = Math.cos(_angle); - var _py = Math.sin(_angle); - - ctx.save(); - - var cnvs = this.GetArrowCanvas(), - cnvsRotate = this.GetRotatedArrowCanvas(), - cntxRotate = cnvsRotate.getContext('2d'), - arrowSize = overlay.GetArrowSize(), - x = arrowSize / 2, - y = arrowSize / 2, - radius = Math.round(6 * rPR); - - ctx.beginPath(); - // rotate arrow depending on the angle - cntxRotate.translate(x, y) - cntxRotate.rotate(_angle); - cntxRotate.translate(-x, -y); - cntxRotate.drawImage(cnvs, 0, 0); - ctx.drawImage(cnvsRotate, Math.round(_xI - 6.4 * rPR - radius * _px), Math.round(_yI - 6.4 * rPR - radius * _py)); - - //draw semicircle - ctx.beginPath(); - ctx.lineWidth = Math.round(rPR); - ctx.arc(_xI, _yI, radius, -3 / 4 * Math.PI + _angle, Math.PI + _angle); - ctx.stroke(); - - //draw inner circle - ctx.beginPath(); - ctx.arc(_xI, _yI, _w / 16, 0, 2 * Math.PI); - ctx.stroke(); - - //draw circular background - ctx.globalCompositeOperation = "destination-over"; - ctx.arc(_xI, _yI, _w / 2, 0, 2 * Math.PI); - ctx.fillStyle = "#ffffff"; - ctx.fill(); - ctx.closePath(); - ctx.globalCompositeOperation = "source-over"; - - ctx.restore(); - - overlay.CheckRect(_xI - _w2, _yI - _w2, _w, _w); - } - } - - ctx.beginPath(); - - if (!nIsCleverWithTransform) - { - ctx.moveTo(xc1, yc1); - ctx.lineTo(xc1 + ex2 * (TRACK_DISTANCE_ROTATE2 * rPR + Math.round(rPR)), yc1 + ey2 * (TRACK_DISTANCE_ROTATE2 * rPR + Math.round(rPR))); - } - else - { - ctx.moveTo((xc1 >> 0) + indent, (yc1 >> 0) + indent); - ctx.lineTo(((xc1 + ex2 * TRACK_DISTANCE_ROTATE2 * rPR) >> 0) + indent, ((yc1 + ey2 * TRACK_DISTANCE_ROTATE2 * rPR) >> 0) + indent); - } - - ctx.stroke(); - - ctx.beginPath(); - } - - ctx.fillStyle = (type != AscFormat.TYPE_TRACK.CHART_TEXT) ? _style_white : _style_blue; - var TRACK_RECT_SIZE_CUR = (type != AscFormat.TYPE_TRACK.CHART_TEXT) ? SCALE_TRACK_RECT_SIZE : SCALE_TRACK_RECT_SIZE_CT; - if (type == AscFormat.TYPE_TRACK.CHART_TEXT) - ctx.strokeStyle = _style_white; - - if (!nIsCleverWithTransform) - { - if (bIsEllipceCorner) - { - overlay.AddEllipse(x1, y1, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - if (!isLine) - { - overlay.AddEllipse(x2, y2, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x3, y3, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - overlay.AddEllipse(x4, y4, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - else - { - overlay.AddRect3(x1, y1, TRACK_RECT_SIZE_CUR, ex1, ey1, ex2, ey2); - if (!isLine) - { - overlay.AddRect3(x2, y2, TRACK_RECT_SIZE_CUR, ex1, ey1, ex2, ey2); - overlay.AddRect3(x3, y3, TRACK_RECT_SIZE_CUR, ex1, ey1, ex2, ey2); - } - overlay.AddRect3(x4, y4, TRACK_RECT_SIZE_CUR, ex1, ey1, ex2, ey2); - } - } - else - { - if (bIsEllipceCorner) - { - overlay.AddEllipse(_x1, _y1, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - if (!isLine) - { - overlay.AddEllipse(_x2, _y2, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(_x3, _y3, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - overlay.AddEllipse(_x4, _y4, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - else - { - if (!isLine) - { - overlay.AddRect2(_x1 + indent, _y1 + indent, TRACK_RECT_SIZE_CUR); - overlay.AddRect2(_x2 + indent, _y2 + indent, TRACK_RECT_SIZE_CUR); - overlay.AddRect2(_x3 + indent, _y3 + indent, TRACK_RECT_SIZE_CUR); - overlay.AddRect2(_x4 + indent, _y4 + indent, TRACK_RECT_SIZE_CUR); - } - else - { - overlay.AddRect2(x1 + indent, y1 + indent, TRACK_RECT_SIZE_CUR); - overlay.AddRect2(x4 + indent, y4 + indent, TRACK_RECT_SIZE_CUR); - } - } - } - - if (!isLine) - { - if (!nIsCleverWithTransform) - { - if (bIsRectsTrack) - { - if (bIsRectsTrackX) - { - overlay.AddRect3((x1 + x2) / 2, (y1 + y2) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3((x3 + x4) / 2, (y3 + y4) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - } - if (bIsRectsTrackY) - { - overlay.AddRect3((x2 + x4) / 2, (y2 + y4) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3((x3 + x1) / 2, (y3 + y1) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - } - } - } - else - { - var _xC = (((_x1 + _x2) / 2) >> 0) + indent; - var _yC = (((_y1 + _y3) / 2) >> 0) + indent; - - if (bIsRectsTrackX) - { - overlay.AddRect2(_xC, _y1 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_xC, _y3 + indent, SCALE_TRACK_RECT_SIZE); - } - - if (bIsRectsTrackY) - { - overlay.AddRect2(_x2 + indent, _yC, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_x1 + indent, _yC, SCALE_TRACK_RECT_SIZE); - } - } - } - } - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - } - - break; - } - case AscFormat.TYPE_TRACK.TEXT: - case AscFormat.TYPE_TRACK.GROUP_PASSIVE: - { - if (bIsClever) - { - overlay.CheckRect(x1, y1, x4 - x1, y4 - y1); - ctx.strokeStyle = _style_blue; - - this.AddRectDashClever(ctx, x1, y1, x4, y4, 8, 3, true); - - ctx.beginPath(); - - if (isCanRotate) - { - var xC = ((x1 + x2) / 2) >> 0; - - if (!bIsUseImageRotateTrack) - { - ctx.beginPath(); - overlay.AddEllipse(xC, y1 - Math.round(TRACK_DISTANCE_ROTATE * rPR), Math.round(TRACK_CIRCLE_RADIUS * rPR)); - - ctx.fillStyle = _style_green; - ctx.fill(); - ctx.stroke(); - } - else - { - var _image_track_rotate = overlay.GetImageTrackRotationImage(); - if (_image_track_rotate.asc_complete) - { - var _w = Math.round(ROTATE_TRACK_W * rPR), - _xI = (xC + indent - _w / 2) >> 0, - _yI = y1 - Math.round(TRACK_DISTANCE_ROTATE * rPR), - radius = Math.round(6 * rPR); - - overlay.CheckRect(_xI, _yI - radius * 2, _w, _w); - - ctx.fillStyle = "#939393"; - var cnvs = this.GetArrowCanvas(); - ctx.drawImage(cnvs, xC - Math.round(12.5 * rPR), _yI - Math.round(4.5 * rPR)) - - ctx.beginPath(); - ctx.lineWidth = Math.round(rPR); - ctx.arc(xC, _yI + Math.round(rPR), radius, -3 / 4 * Math.PI, Math.PI); - ctx.stroke(); - ctx.beginPath(); - ctx.arc(xC, _yI + Math.round(rPR), _w / 16, 0, 2 * Math.PI); - ctx.stroke(); - ctx.closePath(); - - ctx.beginPath(); - ctx.globalCompositeOperation = "destination-over"; - ctx.arc(xC, _yI + Math.round(rPR), _w / 2, 0, 2 * Math.PI); - ctx.fillStyle = "#ffffff"; - ctx.fill(); - ctx.closePath(); - ctx.globalCompositeOperation = "source-over"; - } - } - - ctx.beginPath(); - - ctx.moveTo(xC + indent, y1); - ctx.lineTo(xC + indent, y1 - Math.round(TRACK_DISTANCE_ROTATE2 * rPR)); - ctx.stroke(); - - ctx.beginPath(); - } - - ctx.fillStyle = _style_white; - - if (bIsEllipceCorner) - { - overlay.AddEllipse(x1, y1, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x2, y2, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x3, y3, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x4, y4, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - else - { - overlay.AddRect2(x1 + indent, y1 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x2 + indent, y2 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x3 + indent, y3 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x4 + indent, y4 + indent, SCALE_TRACK_RECT_SIZE); - } - - if (bIsRectsTrack) - { - var _xC = (((x1 + x2) / 2) >> 0) + indent; - var _yC = (((y1 + y3) / 2) >> 0) + indent; - - if (bIsRectsTrackX) - { - overlay.AddRect2(_xC, y1 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_xC, y3 + indent, SCALE_TRACK_RECT_SIZE); - } - if (bIsRectsTrackY) - { - overlay.AddRect2(x2 + indent, _yC, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x1 + indent, _yC, SCALE_TRACK_RECT_SIZE); - } - } - - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - } - else - { - var _x1 = x1; - var _y1 = y1; - var _x2 = x2; - var _y2 = y2; - var _x3 = x3; - var _y3 = y3; - var _x4 = x4; - var _y4 = y4; - - if (nIsCleverWithTransform) - { - var _x1 = x1; - if (x2 < _x1) - _x1 = x2; - if (x3 < _x1) - _x1 = x3; - if (x4 < _x1) - _x1 = x4; - - var _x4 = x1; - if (x2 > _x4) - _x4 = x2; - if (x3 > _x4) - _x4 = x3; - if (x4 > _x4) - _x4 = x4; - - var _y1 = y1; - if (y2 < _y1) - _y1 = y2; - if (y3 < _y1) - _y1 = y3; - if (y4 < _y1) - _y1 = y4; - - var _y4 = y1; - if (y2 > _y4) - _y4 = y2; - if (y3 > _y4) - _y4 = y3; - if (y4 > _y4) - _y4 = y4; - - _x2 = _x4; - _y2 = _y1; - _x3 = _x1; - _y3 = _y4; - } - - overlay.CheckPoint(x1, y1); - overlay.CheckPoint(x2, y2); - overlay.CheckPoint(x3, y3); - overlay.CheckPoint(x4, y4); - - ctx.strokeStyle = _style_blue; - if (!nIsCleverWithTransform) - { - this.AddRectDash(ctx, x1, y1, x2, y2, x3, y3, x4, y4, 8, 3, true); - } - else - { - this.AddRectDashClever(ctx, _x1, _y1, _x4, _y4, 8, 3, true); - } - - var ex1 = (x2 - x1) / _len_x; - var ey1 = (y2 - y1) / _len_x; - var ex2 = (x1 - x3) / _len_y; - var ey2 = (y1 - y3) / _len_y; - - var _bAbsX1 = Math.abs(ex1) < 0.01; - var _bAbsY1 = Math.abs(ey1) < 0.01; - var _bAbsX2 = Math.abs(ex2) < 0.01; - var _bAbsY2 = Math.abs(ey2) < 0.01; - - if (_bAbsX2 && _bAbsY2) - { - if (_bAbsX1 && _bAbsY1) - { - ex1 = 1; - ey1 = 0; - ex2 = 0; - ey2 = 1; - } - else - { - ex2 = -ey1; - ey2 = ex1; - } - } - else if (_bAbsX1 && _bAbsY1) - { - ex1 = ey2; - ey1 = -ex2; - } - - var xc1 = (x1 + x2) / 2; - var yc1 = (y1 + y2) / 2; - - ctx.beginPath(); - - if (isCanRotate) - { - if (!bIsUseImageRotateTrack) - { - ctx.beginPath(); - overlay.AddEllipse(xc1 + ex2 * TRACK_DISTANCE_ROTATE * rPR, yc1 + ey2 * TRACK_DISTANCE_ROTATE * rPR, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - - ctx.fillStyle = _style_green; - ctx.fill(); - ctx.stroke(); - } - else - { - var _image_track_rotate = overlay.GetImageTrackRotationImage(); - if (_image_track_rotate.asc_complete) - { - var _xI = Math.round(xc1 + ex2 * TRACK_DISTANCE_ROTATE * rPR); - var _yI = Math.round(yc1 + ey2 * TRACK_DISTANCE_ROTATE * rPR); - var _w = Math.round(ROTATE_TRACK_W * rPR); - var _w2 = Math.round(ROTATE_TRACK_W / 2 * rPR); - - if (nIsCleverWithTransform) - { - _xI >>= 0; - _yI >>= 0; - _w2 >>= 0; - _w2 += 1; - } - - //ctx.setTransform(ex1, ey1, -ey1, ex1, _xI, _yI); - - var _matrix = matrix.CreateDublicate(); - _matrix.tx = 0; - _matrix.ty = 0; - var _xx = _matrix.TransformPointX(0, 1); - var _yy = _matrix.TransformPointY(0, 1); - var _angle = Math.atan2(_xx, -_yy) - Math.PI; - var _px = Math.cos(_angle); - var _py = Math.sin(_angle); - - ctx.save(); - - var cnvs = this.GetArrowCanvas(), - cnvsRotate = this.GetRotatedArrowCanvas(), - cntxRotate = cnvsRotate.getContext('2d'), - arrowSize = overlay.GetArrowSize(), - x = arrowSize / 2, - y = arrowSize / 2, - radius = Math.round(6 * rPR); - - ctx.beginPath(); - - // rotate arrow depending on the angle - cntxRotate.translate(x, y) - cntxRotate.rotate(_angle); - cntxRotate.translate(-x, -y); - cntxRotate.drawImage(cnvs, 0, 0); - ctx.drawImage(cnvsRotate, Math.round(_xI - 6.4 * rPR - radius * _px), Math.round(_yI - 6.4 * rPR - radius * _py)); - - //draw semicircle - ctx.beginPath(); - ctx.lineWidth = Math.round(rPR); - ctx.arc(_xI, _yI, radius, -3 / 4 * Math.PI + _angle, Math.PI + _angle); - ctx.stroke(); - - //draw inner circle - ctx.beginPath(); - ctx.arc(_xI, _yI, _w / 16, 0, 2 * Math.PI); - ctx.stroke(); - - //draw circular background - ctx.globalCompositeOperation = "destination-over"; - ctx.arc(_xI, _yI, _w / 2, 0, 2 * Math.PI); - ctx.fillStyle = "#ffffff"; - ctx.fill(); - ctx.closePath(); - ctx.globalCompositeOperation = "source-over"; - - ctx.restore(); - - overlay.CheckRect(_xI - _w2, _yI - _w2, _w, _w); - } - } - - ctx.beginPath(); - - if (!nIsCleverWithTransform) - { - ctx.moveTo(xc1, yc1); - ctx.lineTo(xc1 + ex2 * (TRACK_DISTANCE_ROTATE2 * rPR + Math.round(rPR)), yc1 + ey2 * (TRACK_DISTANCE_ROTATE2 * rPR + Math.round(rPR))); - } - else - { - ctx.moveTo((xc1 >> 0) + indent, (yc1 >> 0) + indent); - ctx.lineTo(((xc1 + ex2 * TRACK_DISTANCE_ROTATE2 * rPR) >> 0) + indent, ((yc1 + ey2 * TRACK_DISTANCE_ROTATE2 * rPR) >> 0) + indent); - } - - ctx.stroke(); - - ctx.beginPath(); - - } - - ctx.fillStyle = _style_white; - - if (!nIsCleverWithTransform) - { - if (bIsEllipceCorner) - { - overlay.AddEllipse(x1, y1, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x2, y2, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x3, y3, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x4, y4, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - else - { - overlay.AddRect3(x1, y1, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3(x2, y2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3(x3, y3, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3(x4, y4, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - } - } - else - { - if (bIsEllipceCorner) - { - overlay.AddEllipse(x1, y1, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x2, y2, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x3, y3, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x4, y4, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - else - { - overlay.AddRect2(_x1 + indent, _y1 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_x2 + indent, _y2 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_x3 + indent, _y3 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_x4 + indent, _y4 + indent, SCALE_TRACK_RECT_SIZE); - } - } - - if (!nIsCleverWithTransform) - { - if (bIsRectsTrack) - { - if (bIsRectsTrackX) - { - overlay.AddRect3((x1 + x2) / 2, (y1 + y2) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3((x3 + x4) / 2, (y3 + y4) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - } - if (bIsRectsTrackY) - { - overlay.AddRect3((x2 + x4) / 2, (y2 + y4) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3((x3 + x1) / 2, (y3 + y1) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - } - } - } - else - { - if (bIsRectsTrack) - { - var _xC = (((_x1 + _x2) / 2) >> 0) + indent; - var _yC = (((_y1 + _y3) / 2) >> 0) + indent; - - if (bIsRectsTrackX) - { - overlay.AddRect2(_xC, _y1 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_xC, _y3 + indent, SCALE_TRACK_RECT_SIZE); - } - if (bIsRectsTrackY) - { - overlay.AddRect2(_x2 + indent, _yC, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_x1 + indent, _yC, SCALE_TRACK_RECT_SIZE); - } - } - } - - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - } - - break; - } - case AscFormat.TYPE_TRACK.EMPTY_PH: - { - if (bIsClever) - { - overlay.CheckRect(x1, y1, x4 - x1, y4 - y1); - ctx.rect(x1 + indent, y2 + indent, x4 - x1 + 1, y4 - y1); - ctx.fillStyle = _style_white; - ctx.stroke(); - - ctx.beginPath(); - - ctx.strokeStyle = _style_blue; - this.AddRectDashClever(ctx, x1, y1, x4, y4, 8, 3, true); - - ctx.beginPath(); - - var xC = ((x1 + x2) / 2) >> 0; - - if (!bIsUseImageRotateTrack) - { - ctx.beginPath(); - overlay.AddEllipse(xC, y1 - Math.round(TRACK_DISTANCE_ROTATE * rPR)); - - ctx.fillStyle = _style_green; - ctx.fill(); - ctx.stroke(); - } - else - { - var _image_track_rotate = overlay.GetImageTrackRotationImage(); - if (_image_track_rotate.asc_complete) - { - var _w = Math.round(ROTATE_TRACK_W * rPR); - var _xI = (xC + indent - _w / 2) >> 0; - var _yI = y1 - Math.round(TRACK_DISTANCE_ROTATE * rPR) - (_w >> 1); - - overlay.CheckRect(_xI, _yI, _w, _w); - ctx.drawImage(_image_track_rotate, _xI, _yI, _w, _w); - } - } - - ctx.beginPath(); - ctx.moveTo(xC + indent, y1); - ctx.lineTo(xC + indent, y1 - Math.round(TRACK_DISTANCE_ROTATE2 * rPR)); - ctx.stroke(); - - ctx.beginPath(); - - ctx.fillStyle = _style_white; - - if (bIsEllipceCorner) - { - overlay.AddEllipse(x1, y1, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x2, y2, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x3, y3, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x4, y4, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - else - { - overlay.AddRect2(x1 + indent, y1 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x2 + indent, y2 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x3 + indent, y3 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x4 + indent, y4 + indent, SCALE_TRACK_RECT_SIZE); - } - - if (bIsRectsTrack && false) - { - var _xC = (((x1 + x2) / 2) >> 0) + indent; - var _yC = (((y1 + y3) / 2) >> 0) + indent; - - overlay.AddRect2(_xC, y1 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x2 + indent, _yC, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(_xC, y3 + indent, SCALE_TRACK_RECT_SIZE); - overlay.AddRect2(x1 + indent, _yC, SCALE_TRACK_RECT_SIZE); - } - - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - } - else - { - overlay.CheckPoint(x1, y1); - overlay.CheckPoint(x2, y2); - overlay.CheckPoint(x3, y3); - overlay.CheckPoint(x4, y4); - - ctx.moveTo(x1, y1); - ctx.lineTo(x2, y2); - ctx.lineTo(x3, y3); - ctx.lineTo(x4, y4); - ctx.closePath(); - - overlay.CheckPoint(x1, y1); - overlay.CheckPoint(x2, y2); - overlay.CheckPoint(x3, y3); - overlay.CheckPoint(x4, y4); - - ctx.strokeStyle = _style_white; - ctx.stroke(); - - ctx.beginPath(); - - ctx.strokeStyle = _style_blue; - this.AddRectDash(ctx, x1, y1, x2, y2, x3, y3, x4, y4, 8, 3, true); - - ctx.beginPath(); - - var ex1 = (x2 - x1) / _len_x; - var ey1 = (y2 - y1) / _len_x; - var ex2 = (x1 - x3) / _len_y; - var ey2 = (y1 - y3) / _len_y; - - var _bAbsX1 = Math.abs(ex1) < 0.01; - var _bAbsY1 = Math.abs(ey1) < 0.01; - var _bAbsX2 = Math.abs(ex2) < 0.01; - var _bAbsY2 = Math.abs(ey2) < 0.01; - - if (_bAbsX2 && _bAbsY2) - { - if (_bAbsX1 && _bAbsY1) - { - ex1 = 1; - ey1 = 0; - ex2 = 0; - ey2 = 1; - } - else - { - ex2 = -ey1; - ey2 = ex1; - } - } - else if (_bAbsX1 && _bAbsY1) - { - ex1 = ey2; - ey1 = -ex2; - } - - var xc1 = (x1 + x2) / 2; - var yc1 = (y1 + y2) / 2; - - ctx.beginPath(); - - if (!bIsUseImageRotateTrack) - { - ctx.beginPath(); - overlay.AddEllipse(xc1 + ex2 * TRACK_DISTANCE_ROTATE * rPR, yc1 + ey2 * TRACK_DISTANCE_ROTATE * rPR, Math.round(TRACK_DISTANCE_ROTATE * rPR)); - - ctx.fillStyle = _style_green; - ctx.fill(); - ctx.stroke(); - } - else - { - var _image_track_rotate = overlay.GetImageTrackRotationImage(); - if (_image_track_rotate.asc_complete) - { - var _xI = xc1 + ex2 * TRACK_DISTANCE_ROTATE * rPR; - var _yI = yc1 + ey2 * TRACK_DISTANCE_ROTATE * rPR; - var _w = Math.round(ROTATE_TRACK_W * rPR); - var _w2 = Math.round(ROTATE_TRACK_W / 2 * rPR); - - ctx.save(); - - overlay.transform(ex1, ey1, -ey1, ex1, _xI, _yI); - ctx.drawImage(_image_track_rotate, -_w2, -_w2, _w, _w); - overlay.SetBaseTransform(); - - ctx.restore(); - - overlay.CheckRect(_xI - _w2, _yI - _w2, _w, _w); - } - } - - ctx.beginPath(); - ctx.moveTo(xc1, yc1); - ctx.lineTo(xc1 + ex2 * TRACK_DISTANCE_ROTATE2 * rPR, yc1 + ey2 * TRACK_DISTANCE_ROTATE2 * rPR); - ctx.stroke(); - - ctx.beginPath(); - - ctx.fillStyle = _style_white; - - if (bIsEllipceCorner) - { - overlay.AddEllipse(x1, y1, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x2, y2, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x3, y3, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - overlay.AddEllipse(x4, y4, Math.round(TRACK_CIRCLE_RADIUS * rPR)); - } - else - { - overlay.AddRect3(x1, y1, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3(x2, y2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3(x3, y3, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3(x4, y4, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - } - - if (bIsRectsTrack) - { - overlay.AddRect3((x1 + x2) / 2, (y1 + y2) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3((x2 + x4) / 2, (y2 + y4) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3((x3 + x4) / 2, (y3 + y4) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - overlay.AddRect3((x3 + x1) / 2, (y3 + y1) / 2, SCALE_TRACK_RECT_SIZE, ex1, ey1, ex2, ey2); - } - - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - } - - break; - } - case AscFormat.TYPE_TRACK.CROP: - { - if (bIsClever) - { - overlay.CheckRect(x1, y1, x4 - x1, y4 - y1); - var widthCorner = (x4 - x1 + 1) >> 1; - var isCentralMarkerX = widthCorner > Math.round(40 * rPR) ? true : false; - var cropMarkerSize = Math.round(17 * rPR); - if (widthCorner > cropMarkerSize) - widthCorner = cropMarkerSize; - var heightCorner = (y4 - y1 + 1) >> 1; - var isCentralMarkerY = heightCorner > Math.round(40 * rPR) ? true : false; - if (heightCorner > cropMarkerSize) - heightCorner = cropMarkerSize; - - ctx.rect(x1 + indent, y2 + indent, x4 - x1 + 1, y4 - y1); - ctx.strokeStyle = _style_black; - ctx.stroke(); - - ctx.beginPath(); - - ctx.strokeStyle = _style_white; - ctx.fillStyle = _style_black; - - var roundRPR = Math.round(rPR); - ctx.moveTo(x1 + indent, y1 + indent); - ctx.lineTo(x1 + widthCorner + indent, y1 + indent); - ctx.lineTo(x1 + widthCorner + indent, y1 + 5.5 * roundRPR); - ctx.lineTo(x1 + 5.5 * roundRPR, y1 + 5.5 * roundRPR); - ctx.lineTo(x1 + 5.5 * roundRPR, y1 + widthCorner + indent); - ctx.lineTo(x1 + indent, y1 + widthCorner + indent); - ctx.closePath(); - - ctx.moveTo(x2 - widthCorner + indent, y2 + indent); - ctx.lineTo(x2 + indent, y2 + indent); - ctx.lineTo(x2 + indent, y2 + heightCorner + indent); - ctx.lineTo(x2 - 4.5 * roundRPR, y2 + heightCorner + indent); - ctx.lineTo(x2 - 4.5 * roundRPR, y2 + 5.5 * roundRPR); - ctx.lineTo(x2 - widthCorner + indent, y2 + 5.5 * roundRPR); - ctx.closePath(); - - ctx.moveTo(x4 - 4.5 * roundRPR, y4 - heightCorner + indent); - ctx.lineTo(x4 + indent, y4 - heightCorner + indent); - ctx.lineTo(x4 + indent, y4 + indent); - ctx.lineTo(x4 - widthCorner + indent, y4 + indent); - ctx.lineTo(x4 - widthCorner + indent, y4 - 4.5 * roundRPR); - ctx.lineTo(x4 - 4.5 * roundRPR, y4 - 4.5 * roundRPR); - ctx.closePath(); - - ctx.moveTo(x3 + indent, y3 - heightCorner + indent); - ctx.lineTo(x3 + 5.5 * roundRPR, y3 - heightCorner + indent); - ctx.lineTo(x3 + 5.5 * roundRPR, y3 - 4.5 * roundRPR); - ctx.lineTo(x3 + widthCorner + indent, y3 - 4.5 * roundRPR); - ctx.lineTo(x3 + widthCorner + indent, y3 + indent); - ctx.lineTo(x3 + indent, y3 + indent); - ctx.closePath(); - - if (isCentralMarkerX) - { - var xCentral = (x4 + x1 - widthCorner) >> 1; - ctx.moveTo(xCentral + indent, y1 + indent); - ctx.lineTo(xCentral + widthCorner + indent, y1 + indent); - ctx.lineTo(xCentral + widthCorner + indent, y1 + 5.5 * roundRPR); - ctx.lineTo(xCentral + indent, y1 + 5.5 * roundRPR); - ctx.closePath(); - - ctx.moveTo(xCentral + indent, y4 - 4.5 * roundRPR); - ctx.lineTo(xCentral + widthCorner + indent, y4 - 4.5 * roundRPR); - ctx.lineTo(xCentral + widthCorner + indent, y4); - ctx.lineTo(xCentral + indent, y4 + indent); - ctx.closePath(); - } - - if (isCentralMarkerY) - { - var yCentral = (y4 + y1 - heightCorner) >> 1; - ctx.moveTo(x1 + indent, yCentral + indent); - ctx.lineTo(x1 + 5.5 * roundRPR, yCentral + indent); - ctx.lineTo(x1 + 5.5 * roundRPR, yCentral + heightCorner + indent); - ctx.lineTo(x1 + indent, yCentral + heightCorner + indent); - ctx.closePath(); - - ctx.moveTo(x4 - 4.5 * roundRPR, yCentral + indent); - ctx.lineTo(x4 + indent, yCentral + indent); - ctx.lineTo(x4 + indent, yCentral + heightCorner + indent); - ctx.lineTo(x4 - 4.5 * roundRPR, yCentral + heightCorner + indent); - ctx.closePath(); - } - - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - } - else - { - overlay.CheckPoint(x1, y1); - overlay.CheckPoint(x2, y2); - overlay.CheckPoint(x3, y3); - overlay.CheckPoint(x4, y4); - - var ex1 = (x2 - x1) / _len_x; - var ey1 = (y2 - y1) / _len_x; - var ex2 = (x1 - x3) / _len_y; - var ey2 = (y1 - y3) / _len_y; - - var _bAbsX1 = Math.abs(ex1) < 0.01; - var _bAbsY1 = Math.abs(ey1) < 0.01; - var _bAbsX2 = Math.abs(ex2) < 0.01; - var _bAbsY2 = Math.abs(ey2) < 0.01; - - if (_bAbsX2 && _bAbsY2) - { - if (_bAbsX1 && _bAbsY1) - { - ex1 = 1; - ey1 = 0; - ex2 = 0; - ey2 = 1; - } - else - { - ex2 = -ey1; - ey2 = ex1; - } - } - else if (_bAbsX1 && _bAbsY1) - { - ex1 = ey2; - ey1 = -ex2; - } - - var widthCorner = _len_x >> 1; - var isCentralMarkerX = widthCorner > Math.round(40 * rPR) ? true : false; - var cropMarkerSize = Math.round(17 * rPR); - if (widthCorner > cropMarkerSize) - widthCorner = cropMarkerSize; - var heightCorner = _len_y >> 1; - var isCentralMarkerY = heightCorner > Math.round(40 * rPR) ? true : false; - if (heightCorner > cropMarkerSize) - heightCorner = cropMarkerSize; - - ctx.moveTo(x1, y1); - ctx.lineTo(x2, y2); - ctx.lineTo(x4, y4); - ctx.lineTo(x3, y3); - ctx.closePath(); - ctx.strokeStyle = _style_black; - ctx.stroke(); - - ctx.beginPath(); - - ctx.strokeStyle = _style_white; - ctx.fillStyle = _style_black; - - var xOff1 = widthCorner * ex1; - var xOff2 = 5 * ex1; - var xOff3 = -heightCorner * ex2; - var xOff4 = -5 * ex2; - var yOff1 = widthCorner * ey1; - var yOff2 = 5 * ey1; - var yOff3 = -heightCorner * ey2; - var yOff4 = -5 * ey2; - - ctx.moveTo(x1, y1); - ctx.lineTo(x1 + xOff1, y1 + yOff1); - ctx.lineTo(x1 + xOff1 + xOff4, y1 + yOff1 + yOff4); - ctx.lineTo(x1 + xOff2 + xOff4, y1 + yOff2 + yOff4); - ctx.lineTo(x1 + xOff2 + xOff3, y1 + yOff2 + yOff3); - ctx.lineTo(x1 + xOff3, y1 + yOff3); - ctx.closePath(); - - ctx.moveTo(x2 - xOff1, y2 - yOff1); - ctx.lineTo(x2, y2); - ctx.lineTo(x2 + xOff3, y2 + yOff3); - ctx.lineTo(x2 + xOff3 - xOff2, y2 + yOff3 - yOff2); - ctx.lineTo(x2 - xOff2 + xOff4, y2 - yOff2 + yOff4); - ctx.lineTo(x2 - xOff1 + xOff4, y2 - yOff1 + yOff4); - ctx.closePath(); - - ctx.moveTo(x4 - xOff3 - xOff2, y4 - yOff3 - yOff2); - ctx.lineTo(x4 - xOff3, y4 - yOff3); - ctx.lineTo(x4, y4); - ctx.lineTo(x4 - xOff1, y4 - yOff1); - ctx.lineTo(x4 - xOff1 - xOff4, y4 - yOff1 - yOff4); - ctx.lineTo(x4 - xOff2 - xOff4, y4 - yOff2 - yOff4); - ctx.closePath(); - - ctx.moveTo(x3 - xOff3, y3 - yOff3); - ctx.lineTo(x3 - xOff3 + xOff2, y3 - yOff3 + yOff2); - ctx.lineTo(x3 - xOff4 + xOff2, y3 - yOff4 + yOff2); - ctx.lineTo(x3 + xOff1 - xOff4, y3 + yOff1 - yOff4); - ctx.lineTo(x3 + xOff1, y3 + yOff1); - ctx.lineTo(x3, y3); - ctx.closePath(); - - if (isCentralMarkerX) - { - var xCentral = x1 + (ex1 * (_len_x - widthCorner) / 2); - var yCentral = y1 + (ey1 * (_len_x - widthCorner) / 2); - ctx.moveTo(xCentral, yCentral); - ctx.lineTo(xCentral + xOff1, yCentral + yOff1); - ctx.lineTo(xCentral + xOff1 + xOff4, yCentral + yOff1 + yOff4); - ctx.lineTo(xCentral + xOff4, yCentral + yOff4); - ctx.closePath(); - - xCentral = x3 + (ex1 * (_len_x - widthCorner) / 2) - xOff4; - yCentral = y3 + (ey1 * (_len_x - widthCorner) / 2) - yOff4; - ctx.moveTo(xCentral, yCentral); - ctx.lineTo(xCentral + xOff1, yCentral + yOff1); - ctx.lineTo(xCentral + xOff1 + xOff4, yCentral + yOff1 + yOff4); - ctx.lineTo(xCentral + xOff4, yCentral + yOff4); - ctx.closePath(); - } - - if (isCentralMarkerY) - { - var xCentral = x1 - (ex2 * (_len_y - heightCorner) / 2); - var yCentral = y1 - (ey2 * (_len_y - heightCorner) / 2); - ctx.moveTo(xCentral, yCentral); - ctx.lineTo(xCentral + xOff2, yCentral + yOff2); - ctx.lineTo(xCentral + xOff2 + xOff3, yCentral + yOff2 + yOff3); - ctx.lineTo(xCentral + xOff3, yCentral + yOff3); - ctx.closePath(); - - xCentral = x2 - (ex2 * (_len_y - heightCorner) / 2) - xOff2; - yCentral = y2 - (ey2 * (_len_y - heightCorner) / 2) - yOff2; - ctx.moveTo(xCentral, yCentral); - ctx.lineTo(xCentral + xOff2, yCentral + yOff2); - ctx.lineTo(xCentral + xOff2 + xOff3, yCentral + yOff2 + yOff3); - ctx.lineTo(xCentral + xOff3, yCentral + yOff3); - ctx.closePath(); - } - - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - } - - break; - } - - default: - break; - } - - ctx.globalAlpha = _oldGlobalAlpha; - - if (this.m_oOverlay.IsCellEditor) - { - this.m_oOverlay.SetBaseTransform(); - - if (matrix) - { - matrix.tx *= AscCommon.AscBrowser.retinaPixelRatio; - matrix.ty *= AscCommon.AscBrowser.retinaPixelRatio; - } - } - }, - - DrawTrackSelectShapes : function(x, y, w, h) - { - var overlay = this.m_oOverlay; - overlay.Show(); - - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - - var drPage = this.CurrentPageInfo.drawingPage; - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var xDst = drPage.left * rPR; - var yDst = drPage.top * rPR; - var wDst = (drPage.right - drPage.left) * rPR; - var hDst = (drPage.bottom - drPage.top) * rPR; - var indent = 0.5 * Math.round(rPR); - - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - - var x1 = (xDst + dKoefX * x) >> 0; - var y1 = (yDst + dKoefY * y) >> 0; - - var x2 = (xDst + dKoefX * (x + w)) >> 0; - var y2 = (yDst + dKoefY * (y + h)) >> 0; - - if (x1 > x2) - { - var tmp = x1; - x1 = x2; - x2 = tmp; - } - if (y1 > y2) - { - var tmp = y1; - y1 = y2; - y2 = tmp; - } - - overlay.CheckRect(x1, y1, x2 - x1, y2 - y1); - var ctx = overlay.m_oContext; - overlay.SetBaseTransform(); - - var globalAlphaOld = ctx.globalAlpha; - ctx.globalAlpha = 0.5; - ctx.beginPath(); - ctx.fillStyle = "rgba(51,102,204,255)"; - ctx.strokeStyle = "#9ADBFE"; - ctx.lineWidth = 1; - ctx.fillRect(x1, y1, x2 - x1, y2 - y1); - ctx.beginPath(); - ctx.strokeRect(x1 - indent, y1 - indent, x2 - x1 + 1, y2 - y1 + 1); - ctx.globalAlpha = globalAlphaOld; - }, - - AddRect : function(ctx, x, y, r, b, bIsClever) - { - if (bIsClever) { - var indent = 0.5 * Math.round(AscCommon.AscBrowser.retinaPixelRatio); - ctx.rect(x + indent, y + indent, r - x + 1, b - y + 1); - } - else - { - ctx.moveTo(x,y); - ctx.rect(x, y, r - x + 1, b - y + 1); - } - }, - - AddRectDashClever : function(ctx, x, y, r, b, w_dot, w_dist, bIsStrokeAndCanUseNative) - { - var _support_native_dash = (undefined !== ctx.setLineDash); - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var indent = 0.5 * Math.round(rPR); - // здесь расчитано на толщину линии в один пиксел! - w_dot *= Math.round(rPR); - w_dist *= Math.round(rPR); - var _x = x + indent; - var _y = y + indent; - var _r = r + indent; - var _b = b + indent; - - if (_support_native_dash && bIsStrokeAndCanUseNative === true) - { - ctx.setLineDash([w_dot, w_dist]); - - // ctx.rect(x + indent, y + indent, r - x, b - y); - ctx.moveTo(x, _y); - ctx.lineTo(r - 1, _y); - - ctx.moveTo(_r, y); - ctx.lineTo(_r, b - 1); - - ctx.moveTo(r + 1, _b); - ctx.lineTo(x + 2, _b); - - ctx.moveTo(_x, b + 1); - ctx.lineTo(_x, y + 2); - - ctx.stroke(); - ctx.setLineDash([]); - return; - } - - for (var i = x; i < r; i += w_dist) - { - ctx.moveTo(i, _y); - i += w_dot; - - if (i > (r - 1)) - i = r - 1; - - ctx.lineTo(i, _y); - } - for (var i = y; i < b; i += w_dist) - { - ctx.moveTo(_r, i); - i += w_dot; - - if (i > (b - 1)) - i = b - 1; - - ctx.lineTo(_r, i); - } - for (var i = r + 1; i > (x + 1); i -= w_dist) - { - ctx.moveTo(i, _b); - i -= w_dot; - - if (i < (x + 2)) - i = x + 2; - - ctx.lineTo(i, _b); - } - for (var i = b + 1; i > (y + 1); i -= w_dist) - { - ctx.moveTo(_x, i); - i -= w_dot; - - if (i < (y + 2)) - i = y + 2; - - ctx.lineTo(_x, i); - } - - if (bIsStrokeAndCanUseNative) - ctx.stroke(); - }, - - AddLineDash : function(ctx, x1, y1, x2, y2, w_dot, w_dist) - { - var len = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); - if (len < 1) - len = 1; - - var len_x1 = Math.abs(w_dot*(x2-x1)/len); - var len_y1 = Math.abs(w_dot*(y2-y1)/len); - var len_x2 = Math.abs(w_dist*(x2-x1)/len); - var len_y2 = Math.abs(w_dist*(y2-y1)/len); - - if (len_x1 < 0.01 && len_y1 < 0.01) - return; - if (len_x2 < 0.01 && len_y2 < 0.01) - return; - - if (x1 <= x2 && y1 <= y2) - { - for (var i = x1, j = y1; i <= x2 && j <= y2; i += len_x2, j += len_y2) - { - ctx.moveTo(i, j); - - i += len_x1; - j += len_y1; - - if (i > x2) - i = x2; - if (j > y2) - j = y2; - - ctx.lineTo(i, j); - } - } - else if (x1 <= x2 && y1 > y2) - { - for (var i = x1, j = y1; i <= x2 && j >= y2; i += len_x2, j -= len_y2) - { - ctx.moveTo(i, j); - - i += len_x1; - j -= len_y1; - - if (i > x2) - i = x2; - if (j < y2) - j = y2; - - ctx.lineTo(i, j); - } - } - else if (x1 > x2 && y1 <= y2) - { - for (var i = x1, j = y1; i >= x2 && j <= y2; i -= len_x2, j += len_y2) - { - ctx.moveTo(i, j); - - i -= len_x1; - j += len_y1; - - if (i < x2) - i = x2; - if (j > y2) - j = y2; - - ctx.lineTo(i, j); - } - } - else - { - for (var i = x1, j = y1; i >= x2 && j >= y2; i -= len_x2, j -= len_y2) - { - ctx.moveTo(i, j); - - i -= len_x1; - j -= len_y1; - - if (i < x2) - i = x2; - if (j < y2) - j = y2; - - ctx.lineTo(i, j); - } - } - }, - - AddRectDash : function(ctx, x1, y1, x2, y2, x3, y3, x4, y4, w_dot, w_dist, bIsStrokeAndCanUseNative) - { - var _support_native_dash = (undefined !== ctx.setLineDash); - - if (_support_native_dash && bIsStrokeAndCanUseNative === true) - { - ctx.setLineDash([w_dot, w_dist]); - - ctx.moveTo(x1, y1); - ctx.lineTo(x2, y2); - ctx.lineTo(x4, y4); - ctx.lineTo(x3, y3); - ctx.closePath(); - - ctx.stroke(); - ctx.setLineDash([]); - return; - } - - this.AddLineDash(ctx, x1, y1, x2, y2, w_dot, w_dist); - this.AddLineDash(ctx, x2, y2, x4, y4, w_dot, w_dist); - this.AddLineDash(ctx, x4, y4, x3, y3, w_dot, w_dist); - this.AddLineDash(ctx, x3, y3, x1, y1, w_dot, w_dist); - - if (bIsStrokeAndCanUseNative) - ctx.stroke(); - }, - - DrawAdjustment : function(matrix, x, y, bTextWarp) - { - var overlay = this.m_oOverlay; - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - - var drPage = this.CurrentPageInfo.drawingPage; - - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var xDst = drPage.left; - var yDst = drPage.top; - var wDst = drPage.right - drPage.left; - var hDst = drPage.bottom - drPage.top; - - if (!overlay.IsCellEditor) { - xDst *= rPR; - yDst *= rPR; - wDst *= rPR; - hDst *= rPR; - } - - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - - var cx = (xDst + dKoefX * (matrix.TransformPointX(x, y))) >> 0; - var cy = (yDst + dKoefY * (matrix.TransformPointY(x, y))) >> 0; - - var _style_blue = "#4D7399"; - var _style_yellow = "#FDF54A"; - var _style_text_adj = "#F888FF"; - - var ctx = overlay.m_oContext; - - var dist = TRACK_ADJUSTMENT_SIZE * rPR / 2; - - ctx.lineWidth = Math.round(rPR); - ctx.moveTo(cx - dist, cy); - ctx.lineTo(cx, cy - dist); - ctx.lineTo(cx + dist, cy); - ctx.lineTo(cx, cy + dist); - ctx.closePath(); - - overlay.CheckRect(cx - dist, cy - dist, Math.round(TRACK_ADJUSTMENT_SIZE * rPR), Math.round(TRACK_ADJUSTMENT_SIZE * rPR)); - - - if(bTextWarp === true) - { - ctx.fillStyle = _style_text_adj; - } - else - { - ctx.fillStyle = _style_yellow; - } - ctx.strokeStyle = _style_blue; - - ctx.fill(); - ctx.stroke(); - ctx.beginPath(); - }, - - DrawGeomEditPoint: function(matrix, gmEditPoint) { - var overlay = this.m_oOverlay; - var ctx = overlay.m_oContext; - - //todo: remove duplicate code - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - var drPage = this.CurrentPageInfo.drawingPage; - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var xDst = drPage.left; - var yDst = drPage.top; - var wDst = drPage.right - drPage.left; - var hDst = drPage.bottom - drPage.top; - if (!overlay.IsCellEditor) { - xDst *= rPR; - yDst *= rPR; - wDst *= rPR; - hDst *= rPR; - } - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - // - - - var firstGuide, secondGuide; - if (gmEditPoint.g1X !== undefined && gmEditPoint.g1Y !== undefined) { - firstGuide = true; - } - if (gmEditPoint.g2X !== undefined && gmEditPoint.g2Y !== undefined) { - secondGuide = true; - } - var curPointX = (xDst + dKoefX * (matrix.TransformPointX(gmEditPoint.X, gmEditPoint.Y))) >> 0; - var curPointY = (yDst + dKoefY * (matrix.TransformPointY(gmEditPoint.X, gmEditPoint.Y))) >> 0; - - var commandPointX1 = (xDst + dKoefX * (matrix.TransformPointX(gmEditPoint.g1X, gmEditPoint.g1Y))) >> 0; - var commandPointY1 = (yDst + dKoefY * (matrix.TransformPointY(gmEditPoint.g1X, gmEditPoint.g1Y))) >> 0; - var commandPointX2 = (xDst + dKoefX * (matrix.TransformPointX(gmEditPoint.g2X, gmEditPoint.g2Y))) >> 0; - var commandPointY2 = (yDst + dKoefY * (matrix.TransformPointY(gmEditPoint.g2X, gmEditPoint.g2Y))) >> 0; - - ctx.strokeStyle = "#1873c0"; - - if (firstGuide) { - ctx.beginPath(); - ctx.moveTo(curPointX, curPointY); - ctx.lineTo(commandPointX1, commandPointY1); - ctx.stroke(); - } - if (secondGuide) { - ctx.beginPath(); - ctx.moveTo(curPointX, curPointY); - ctx.lineTo(commandPointX2, commandPointY2); - ctx.stroke(); - } - - ctx.closePath(); - ctx.beginPath(); - ctx.fillStyle = "#ffffff"; - ctx.strokeStyle = "#000000"; - - var SCALE_TRACK_RECT_SIZE = Math.round(TRACK_RECT_SIZE * rPR); - if (firstGuide) - overlay.AddRect2(commandPointX1, commandPointY1, SCALE_TRACK_RECT_SIZE); - - if (secondGuide) - overlay.AddRect2(commandPointX2, commandPointY2, SCALE_TRACK_RECT_SIZE); - - ctx.stroke(); - ctx.fill(); - }, - - DrawGeometryEdit: function (matrix, pathLst, gmEditList, gmEditPoint, oBounds) { - var overlay = this.m_oOverlay; - var ctx = overlay.m_oContext; - ctx.lineWidth = Math.round(rPR); - - //todo: remove duplicate code - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - var drPage = this.CurrentPageInfo.drawingPage; - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var xDst = drPage.left; - var yDst = drPage.top; - var wDst = drPage.right - drPage.left; - var hDst = drPage.bottom - drPage.top; - if (!overlay.IsCellEditor) { - xDst *= rPR; - yDst *= rPR; - wDst *= rPR; - hDst *= rPR; - } - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - // - - ctx.lineWidth = Math.round(rPR); - - //red outline - overlay.m_oContext.strokeStyle = '#ff0000'; - var t = this; - for (var i = 0; i < pathLst.length; i++) { - pathLst[i].ArrPathCommand.forEach(function (elem) { - if (elem.id === 0) { - var pointX = (xDst + dKoefX * (matrix.TransformPointX(elem.X, elem.Y))) >> 0; - var pointY = (yDst + dKoefY * (matrix.TransformPointY(elem.X, elem.Y))) >> 0; - ctx.moveTo(pointX + 0.5, pointY + 0.5); - } else if (elem.id === 4) - var pointX0 = (xDst + dKoefX * (matrix.TransformPointX(elem.X0, elem.Y0))) >> 0; - var pointY0 = (yDst + dKoefY * (matrix.TransformPointY(elem.X0, elem.Y0))) >> 0; - var pointX1 = (xDst + dKoefX * (matrix.TransformPointX(elem.X1, elem.Y1))) >> 0; - var pointY1 = (yDst + dKoefY * (matrix.TransformPointY(elem.X1, elem.Y1))) >> 0; - var pointX2 = (xDst + dKoefX * (matrix.TransformPointX(elem.X2, elem.Y2))) >> 0; - var pointY2 = (yDst + dKoefY * (matrix.TransformPointY(elem.X2, elem.Y2))) >> 0; - ctx.bezierCurveTo(pointX0 + 0.5, pointY0 + 0.5, pointX1 + 0.5, pointY1 + 0.5, pointX2 + 0.5, pointY2 + 0.5); - }) - } - ctx.stroke(); - ctx.closePath(); - - ctx.beginPath(); - - if (gmEditPoint) { - this.DrawGeomEditPoint(matrix, gmEditPoint); - } - - ctx.closePath(); - ctx.beginPath(); - ctx.strokeStyle = "#ffffff"; - ctx.fillStyle = "#000000"; - - var SCALE_TRACK_RECT_SIZE = Math.round(TRACK_RECT_SIZE * rPR); - for (var i = 0; i < gmEditList.length; i++) { - - var gmEditPointX = (xDst + dKoefX * (matrix.TransformPointX(gmEditList[i].X, gmEditList[i].Y))) >> 0; - var gmEditPointY = (yDst + dKoefY * (matrix.TransformPointY(gmEditList[i].X, gmEditList[i].Y))) >> 0; - overlay.AddRect2(gmEditPointX, gmEditPointY, SCALE_TRACK_RECT_SIZE); - } - ctx.stroke(); - ctx.fill(); - var pointX1 = (xDst + dKoefX * oBounds.min_x) >> 0; - var pointY1 = (yDst + dKoefY * oBounds.min_y) >> 0; - var pointX2 = (xDst + dKoefX * oBounds.max_x + 0.5) >> 0; - var pointY2 = (yDst + dKoefY * oBounds.max_y + 0.5) >> 0; - overlay.CheckRect(pointX1, pointY1, pointX2 - pointX1, pointY2 - pointY1); - }, - - DrawEditWrapPointsPolygon : function(points, matrix) - { - var _len = points.length; - if (0 == _len) - return; - - var overlay = this.m_oOverlay; - overlay.SetBaseTransform(); - var ctx = overlay.m_oContext; - - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var indent = 0.5 * Math.round(rPR); - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - - var drPage = this.CurrentPageInfo.drawingPage; - - var xDst = drPage.left * rPR; - var yDst = drPage.top * rPR; - var wDst = (drPage.right - drPage.left) * rPR; - var hDst = (drPage.bottom - drPage.top) * rPR; - - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - - var _tr_points_x = new Array(_len); - var _tr_points_y = new Array(_len); - for (var i = 0; i < _len; i++) - { - _tr_points_x[i] = (xDst + dKoefX * (matrix.TransformPointX(points[i].x, points[i].y))) >> 0; - _tr_points_y[i] = (yDst + dKoefY * (matrix.TransformPointY(points[i].x, points[i].y))) >> 0; - } - - ctx.beginPath(); - for (var i = 0; i < _len; i++) - { - if (0 == i) - ctx.moveTo(_tr_points_x[i], _tr_points_y[i]); - else - ctx.lineTo(_tr_points_x[i], _tr_points_y[i]); - - overlay.CheckPoint(_tr_points_x[i], _tr_points_y[i]); - } - - ctx.closePath(); - ctx.lineWidth = Math.round(rPR); - ctx.strokeStyle = "#FF0000"; - ctx.stroke(); - - ctx.beginPath(); - for (var i = 0; i < _len; i++) - { - overlay.AddRect2(_tr_points_x[i] + indent, _tr_points_y[i] + indent, Math.round(TRACK_WRAPPOINTS_SIZE * rPR)); - } - ctx.strokeStyle = "#FFFFFF"; - ctx.fillStyle = "#000000"; - ctx.fill(); - ctx.stroke(); - - ctx.beginPath(); - }, - - DrawEditWrapPointsTrackLines : function(points, matrix) - { - var _len = points.length; - if (0 == _len) - return; - - var overlay = this.m_oOverlay; - overlay.SetBaseTransform(); - var ctx = overlay.m_oContext; - - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - - var drPage = this.CurrentPageInfo.drawingPage; - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - - var xDst = drPage.left * rPR; - var yDst = drPage.top * rPR; - var wDst = (drPage.right - drPage.left) * rPR; - var hDst = (drPage.bottom - drPage.top) * rPR; - - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - - var _tr_points_x = new Array(_len); - var _tr_points_y = new Array(_len); - for (var i = 0; i < _len; i++) - { - _tr_points_x[i] = (xDst + dKoefX * (matrix.TransformPointX(points[i].x, points[i].y))) >> 0; - _tr_points_y[i] = (yDst + dKoefY * (matrix.TransformPointY(points[i].x, points[i].y))) >> 0; - } - - var globalAlpha = ctx.globalAlpha; - ctx.globalAlpha = 1.0; - - ctx.beginPath(); - for (var i = 0; i < _len; i++) - { - if (0 == i) - ctx.moveTo(_tr_points_x[i], _tr_points_y[i]); - else - ctx.lineTo(_tr_points_x[i], _tr_points_y[i]); - - overlay.CheckPoint(_tr_points_x[i], _tr_points_y[i]); - } - ctx.lineWidth = 1; - ctx.strokeStyle = "#FFFFFF"; - ctx.stroke(); - - ctx.beginPath(); - for (var i = 1; i < _len; i++) - { - this.AddLineDash(ctx, _tr_points_x[i-1], _tr_points_y[i-1], _tr_points_x[i], _tr_points_y[i], 4, 4); - } - ctx.lineWidth = Math.round(rPR); - ctx.strokeStyle = "#000000"; - ctx.stroke(); - - ctx.beginPath(); - - ctx.globalAlpha = globalAlpha; - }, - - DrawInlineMoveCursor : function(x, y, h, matrix, overlayNotes) - { - var overlay = this.m_oOverlay; - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - - var drPage = this.CurrentPageInfo.drawingPage; - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - - var xDst = drPage.left * rPR; - var yDst = drPage.top * rPR; - var wDst = (drPage.right - drPage.left) * rPR; - var hDst = (drPage.bottom - drPage.top) * rPR; - - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - - if (overlayNotes) - { - dKoefX = AscCommon.g_dKoef_mm_to_pix * rPR; - dKoefY = AscCommon.g_dKoef_mm_to_pix * rPR; - - overlay = overlayNotes; - - var offsets = overlayNotes.getNotesOffsets(); - xDst = offsets.X; - yDst = offsets.Y; - } - - var bIsIdentMatr = true; - if (matrix !== undefined && matrix != null) - { - if (matrix.IsIdentity2()) - { - x += matrix.tx; - y += matrix.ty; - } - else - { - bIsIdentMatr = false; - } - } - - overlay.SetBaseTransform(); - - if (bIsIdentMatr) - { - var __x = (xDst + dKoefX * x) >> 0; - var __y = (yDst + dKoefY * y) >> 0; - var __h = (h * dKoefY) >> 0; - - overlay.CheckRect(__x,__y,2,__h); - - var ctx = overlay.m_oContext; - - var _oldAlpha = ctx.globalAlpha; - ctx.globalAlpha = 1; - - ctx.lineWidth = Math.round(rPR); - ctx.strokeStyle = "#000000"; - var indent = 0.5 * Math.round(rPR); - - var step = Math.round(rPR); - for (var i = 0; i < __h; i += (2 * step)) - { - ctx.moveTo(__x,__y + i + indent); - ctx.lineTo(__x + 2 * step, __y + i + indent); - } - ctx.stroke(); - - ctx.beginPath(); - ctx.strokeStyle = "#FFFFFF"; - for (var i = step; i < __h; i += (2 * step)) - { - ctx.moveTo(__x,__y + i + indent); - ctx.lineTo(__x + 2 * step, __y + i + indent); - } - ctx.stroke(); - - ctx.globalAlpha = _oldAlpha; - } - else - { - var _x1 = matrix.TransformPointX(x, y); - var _y1 = matrix.TransformPointY(x, y); - - var _x2 = matrix.TransformPointX(x, y + h); - var _y2 = matrix.TransformPointY(x, y + h); - - _x1 = xDst + dKoefX * _x1; - _y1 = yDst + dKoefY * _y1; - _x2 = xDst + dKoefX * _x2; - _y2 = yDst + dKoefY * _y2; - - overlay.CheckPoint(_x1, _y1); - overlay.CheckPoint(_x2, _y2); - - var ctx = overlay.m_oContext; - - var _oldAlpha = ctx.globalAlpha; - ctx.globalAlpha = 1; - - ctx.lineWidth = 2 * Math.round(rPR); - ctx.beginPath(); - ctx.strokeStyle = "#FFFFFF"; - ctx.moveTo(_x1, _y1); - ctx.lineTo(_x2, _y2); - ctx.stroke(); - ctx.beginPath(); - - ctx.strokeStyle = "#000000"; - - var _vec_len = Math.sqrt((_x2 - _x1)*(_x2 - _x1) + (_y2 - _y1)*(_y2 - _y1)); - var _dx = ((_x2 - _x1) / _vec_len); - var _dy = ((_y2 - _y1) / _vec_len); - - var __x = _x1; - var __y = _y1; - - var step = rPR; - _dx *= step; - _dy *= step; - for (var i = 0; i < _vec_len; i += (2 * step)) - { - ctx.moveTo(__x, __y); - - __x += _dx; - __y += _dy; - - ctx.lineTo(__x, __y); - - __x += _dx; - __y += _dy; - } - ctx.stroke(); - - ctx.globalAlpha = _oldAlpha; - } - }, - - drawFlowAnchor : function(x, y) - { - var _flow_anchor = (AscCommon.OverlayRasterIcons && AscCommon.OverlayRasterIcons.Anchor) ? AscCommon.OverlayRasterIcons.Anchor.get() : undefined; - if (!_flow_anchor || (!editor || !editor.ShowParaMarks)) - return; - - var overlay = this.m_oOverlay; - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - - var drPage = this.CurrentPageInfo.drawingPage; - - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var xDst = drPage.left * rPR; - var yDst = drPage.top * rPR; - var wDst = (drPage.right - drPage.left) * rPR; - var hDst = (drPage.bottom - drPage.top) * rPR; - - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - - var __x = (xDst + dKoefX * x) >> 0; - var __y = (yDst + dKoefY * y) >> 0; - - __x -= Math.round(8 * rPR); - - overlay.CheckRect(__x,__y, Math.round(13 * rPR), Math.round(15 * rPR)); - - var ctx = overlay.m_oContext; - var _oldAlpha = ctx.globalAlpha; - ctx.globalAlpha = 1; - - overlay.SetBaseTransform(); - - var _w = Math.round(13 * rPR); - var _h = Math.round(15 * rPR); - if (Math.abs(_w - _flow_anchor.width) < 2) - _w = _flow_anchor.width; - if (Math.abs(_h - _flow_anchor.height) < 2) - _h = _flow_anchor.height; - - ctx.drawImage(_flow_anchor, __x, __y, _w, _h); - ctx.globalAlpha = _oldAlpha; - }, - - DrawPresentationComment : function(type, x, y, w, h) - { - if (!AscCommon.g_comment_image || !AscCommon.g_comment_image.asc_complete) - return; - - var overlay = this.m_oOverlay; - this.CurrentPageInfo = overlay.m_oHtmlPage.GetDrawingPageInfo(this.PageIndex); - - var drPage = this.CurrentPageInfo.drawingPage; - - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - var xDst = drPage.left * rPR; - var yDst = drPage.top * rPR; - var wDst = (drPage.right - drPage.left) * rPR; - var hDst = (drPage.bottom - drPage.top) * rPR; - - var dKoefX = wDst / this.CurrentPageInfo.width_mm; - var dKoefY = hDst / this.CurrentPageInfo.height_mm; - - var __x = (xDst + dKoefX * x) >> 0; - var __y = (yDst + dKoefY * y) >> 0; - - var ctx = overlay.m_oContext; - var _oldAlpha = ctx.globalAlpha; - ctx.globalAlpha = 0.5; - - overlay.SetBaseTransform(); - - var _index = 0; - if ((type & 0x02) == 0x02) - _index = 2; - if ((type & 0x01) == 0x01) - _index += 1; - - var _offset = AscCommon.g_comment_image_offsets[_index]; - overlay.CheckRect(__x, __y, rPR *_offset[2], rPR *_offset[3]); - - this.m_oContext.drawImage(AscCommon.g_comment_image, _offset[0], _offset[1], _offset[2], _offset[3], __x, __y, rPR * _offset[2], rPR * _offset[3]); - - ctx.globalAlpha = _oldAlpha; - }, - - GetArrowCanvas: function() - { - if(!this.ArrowCanvas || - this.ArrowCanvas.width !== this.m_oOverlay.GetArrowSize()) - { - this.ArrowCanvas = this.CreateArrowCanvas(); - } - return this.ArrowCanvas; - }, - GetRotatedArrowCanvas: function() - { - if(!this.RotatedArrowCanvas || - this.RotatedArrowCanvas.width !== this.m_oOverlay.GetArrowSize()) - { - this.RotatedArrowCanvas = this.CreateEmptyArrowCanvas(); - } - var oCtx = this.RotatedArrowCanvas.getContext('2d'); - oCtx.setTransform(1, 0, 0, 1, 0, 0); - oCtx.clearRect(0, 0, this.RotatedArrowCanvas.width, this.RotatedArrowCanvas.height); - return this.RotatedArrowCanvas; - }, - CreateEmptyArrowCanvas: function() - { - var arrowSize = this.m_oOverlay.GetArrowSize(); - var oCanvas = document.createElement('canvas'); - oCanvas.width = arrowSize; - oCanvas.height = arrowSize; - return oCanvas; - }, - CreateArrowCanvas: function() - { - var oCanvas = this.CreateEmptyArrowCanvas(); - var cntx = oCanvas.getContext('2d'); - var rPR = AscCommon.AscBrowser.retinaPixelRatio; - this.m_oOverlay.drawArrow(cntx, 0, 0, Math.round(4 * rPR), {r: 147, g: 147, b: 147}, true); - return oCanvas; - } -}; - - function DrawTextByCenter() // this! - { - var shape = new AscFormat.CShape(); - shape.setTxBody(AscFormat.CreateTextBodyFromString("", this, shape)); - var par = shape.txBody.content.Content[0]; - par.Reset(0, 0, 1000, 1000, 0); - par.MoveCursorToStartPos(); - var _paraPr = new CParaPr(); - par.Pr = _paraPr; - var _textPr = new CTextPr(); - _textPr.FontFamily = { Name : this.Font, Index : -1 }; - _textPr.RFonts.Ascii = { Name : this.Font, Index : -1 }; - _textPr.RFonts.EastAsia = { Name : this.Font, Index : -1 }; - _textPr.RFonts.CS = { Name : this.Font, Index : -1 }; - _textPr.RFonts.HAnsi = { Name : this.Font, Index : -1 }; - - _textPr.Bold = this.Bold; - _textPr.Italic = this.Italic; - - _textPr.FontSize = this.Size; - _textPr.FontSizeCS = this.Size; - - var parRun = new ParaRun(par); var Pos = 0; - parRun.Set_Pr(_textPr); - parRun.AddText(this.Text); - par.AddToContent(0, parRun); - - par.Recalculate_Page(0); - par.Recalculate_Page(0); - - var _bounds = par.Get_PageBounds(0); - - var _canvas = this.getCanvas(); - var _ctx = _canvas.getContext('2d'); - var _wPx = _canvas.width; - var _hPx = _canvas.height; - - var _wMm = _wPx * AscCommon.g_dKoef_pix_to_mm; - var _hMm = _hPx * AscCommon.g_dKoef_pix_to_mm; - - _ctx.clearRect(0, 0, _wPx, _hPx); - - var _pxBoundsW = par.Lines[0].Ranges[0].W * AscCommon.g_dKoef_mm_to_pix;//(_bounds.Right - _bounds.Left) * g_dKoef_mm_to_pix; - var _pxBoundsH = (_bounds.Bottom - _bounds.Top) * AscCommon.g_dKoef_mm_to_pix; - - var _yOffset = (_hPx - _pxBoundsH) >> 1; - var _xOffset = (_wPx - _pxBoundsW) >> 1; - - var graphics = new AscCommon.CGraphics(); - graphics.init(_ctx, _wPx, _hPx, _wMm, _hMm); - graphics.m_oFontManager = AscCommon.g_fontManager; - - graphics.m_oCoordTransform.tx = _xOffset; - graphics.m_oCoordTransform.ty = _yOffset; - - graphics.transform(1,0,0,1,0,0); - - par.Draw(0, graphics); - } - - //--------------------------------------------------------export---------------------------------------------------- - window['AscCommon'] = window['AscCommon'] || {}; - window['AscCommon'].TRACK_CIRCLE_RADIUS = TRACK_CIRCLE_RADIUS; - window['AscCommon'].TRACK_DISTANCE_ROTATE = TRACK_DISTANCE_ROTATE; - window['AscCommon'].COverlay = COverlay; - window['AscCommon'].CAutoshapeTrack = CAutoshapeTrack; - - window['AscCommon'].DrawTextByCenter = DrawTextByCenter; -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/SerializeCommonWordExcel.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/SerializeCommonWordExcel.js deleted file mode 100644 index ecd509e29e..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/SerializeCommonWordExcel.js +++ /dev/null @@ -1,1580 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; -(function(window, undefined){ - -//зависимости -//stream -//memory -//c_oAscChartType -//todo -//BinaryCommonWriter - - function inherit(proto) { - function F() {} - F.prototype = proto; - return new F; - } - if (!Object.create || !Object['create']) Object['create'] = Object.create = inherit; - -var c_oSerConstants = { - ErrorFormat: -2, - ErrorUnknown: -1, - ReadOk:0, - ReadUnknown:1, - ErrorStream:0x55 -}; -var c_oSerPropLenType = { - Null:0, - Byte:1, - Short:2, - Three:3, - Long:4, - Double:5, - Variable:6, - Double64: 7, - Long64: 8 -}; -var c_oSer_ColorObjectType = -{ - Rgb: 0, - Type: 1, - Theme: 2, - Tint: 3 -}; -var c_oSer_ColorType = -{ - Auto: 0 -}; -var c_oSerBorderType = { - Color: 0, - Space: 1, - Size: 2, - Value: 3, - ColorTheme: 4, - SpacePoint: 5, - Size8Point: 6 -}; -var c_oSerBordersType = { - left: 0, - top: 1, - right: 2, - bottom: 3, - insideV: 4, - insideH: 5, - start: 6, - end: 7, - tl2br: 8, - tr2bl: 9, - bar: 10, - between: 11 -}; -var c_oSerPaddingType = { - left: 0, - top: 1, - right: 2, - bottom: 3, - leftTwips: 4, - topTwips: 5, - rightTwips: 6, - bottomTwips: 7 -}; -var c_oSerShdType = { - Value: 0, - Color: 1, - ColorTheme: 2, - Fill: 3, - FillTheme: 4 -}; - var c_oSer_ColorThemeType = { - Auto: 0, - Color: 1, - Tint: 2, - Shade: 3 - }; - var c_oSerBookmark = { - Id: 0, - Name: 1, - DisplacedByCustomXml: 2, - ColFirst: 3, - ColLast: 4 - }; - - var c_nodeAttribute = { - nodeAttributeStart: 0xFA, - nodeAttributeEnd: 0xFB - }; - - var c_oSerAlgorithmNameTypes = { - MD2: 1, - MD4: 2, - MD5: 3, - RIPEMD_128: 4, - RIPEMD_160: 5, - SHA_1: 6, - SHA_256: 7, - SHA_384: 8, - SHA_512: 9, - WHIRLPOOL: 10 - }; - - var c_oSerCryptAlgorithmSid = { - MD2: 1, - MD4: 2, - MD5: 3, - SHA_1: 4, - MAC: 5, - RIPEMD: 6, - RIPEMD_160: 7, - //SHA_384: 8, - HMAC: 9, - SHA_256: 12, - SHA_384: 13, - SHA_512: 14, - }; - - -function BinaryCommonWriter(memory) -{ - this.memory = memory; -} -BinaryCommonWriter.prototype.WriteItem = function(type, fWrite) -{ - //type - this.memory.WriteByte(type); - this.WriteItemWithLength(fWrite); -}; -BinaryCommonWriter.prototype.WriteItemStart = function(type, fWrite) -{ - this.memory.WriteByte(type); - return this.WriteItemWithLengthStart(fWrite); -}; -BinaryCommonWriter.prototype.WriteItemEnd = function(nStart) -{ - this.WriteItemWithLengthEnd(nStart); -}; -BinaryCommonWriter.prototype.WriteItemWithLength = function(fWrite) -{ - var nStart = this.WriteItemWithLengthStart(); - fWrite(); - this.WriteItemWithLengthEnd(nStart); -}; -BinaryCommonWriter.prototype.WriteItemWithLengthStart = function() -{ - //Запоминаем позицию чтобы в конце записать туда длину - var nStart = this.memory.GetCurPosition(); - this.memory.Skip(4); - return nStart; -}; -BinaryCommonWriter.prototype.WriteItemWithLengthEnd = function(nStart) -{ - //Length - var nEnd = this.memory.GetCurPosition(); - this.memory.Seek(nStart); - this.memory.WriteLong(nEnd - nStart - 4); - this.memory.Seek(nEnd); -}; -BinaryCommonWriter.prototype.WriteBorder = function(border) -{ - var _this = this; - if(null != border.Value) - { - var color = null; - if (null != border.Color) - color = border.Color; - else if (null != border.Unifill) { - var doc = window.editor.WordControl.m_oLogicDocument; - border.Unifill.check(doc.Get_Theme(), doc.Get_ColorMap()); - var RGBA = border.Unifill.getRGBAColor(); - color = new window['AscCommonWord'].CDocumentColor(RGBA.R, RGBA.G, RGBA.B); - } - if (null != color && !color.Auto) - this.WriteColor(c_oSerBorderType.Color, color); - if (null != border.Space) { - this.memory.WriteByte(c_oSerBorderType.SpacePoint); - this.memory.WriteByte(c_oSerPropLenType.Long); - this.memory.WriteLong(border.getSpaceInPoint()); - } - if (null != border.Size) { - this.memory.WriteByte(c_oSerBorderType.Size8Point); - this.memory.WriteByte(c_oSerPropLenType.Long); - this.memory.WriteLong(border.getSizeIn8Point()); - } - if (null != border.Unifill || (null != border.Color && border.Color.Auto)) { - this.memory.WriteByte(c_oSerBorderType.ColorTheme); - this.memory.WriteByte(c_oSerPropLenType.Variable); - this.WriteItemWithLength(function () { _this.WriteColorTheme(border.Unifill, border.Color); }); - } - - this.memory.WriteByte(c_oSerBorderType.Value); - this.memory.WriteByte(c_oSerPropLenType.Byte); - this.memory.WriteByte(border.Value); - } -}; -BinaryCommonWriter.prototype.WriteBorders = function(Borders) -{ - var oThis = this; - //Left - if(null != Borders.Left) - this.WriteItem(c_oSerBordersType.left, function(){oThis.WriteBorder(Borders.Left);}); - //Top - if(null != Borders.Top) - this.WriteItem(c_oSerBordersType.top, function(){oThis.WriteBorder(Borders.Top);}); - //Right - if(null != Borders.Right) - this.WriteItem(c_oSerBordersType.right, function(){oThis.WriteBorder(Borders.Right);}); - //Bottom - if(null != Borders.Bottom) - this.WriteItem(c_oSerBordersType.bottom, function(){oThis.WriteBorder(Borders.Bottom);}); - //InsideV - if(null != Borders.InsideV) - this.WriteItem(c_oSerBordersType.insideV, function(){oThis.WriteBorder(Borders.InsideV);}); - //InsideH - if(null != Borders.InsideH) - this.WriteItem(c_oSerBordersType.insideH, function(){oThis.WriteBorder(Borders.InsideH);}); - //Between - if(null != Borders.Between) - this.WriteItem(c_oSerBordersType.between, function(){oThis.WriteBorder(Borders.Between);}); -}; -BinaryCommonWriter.prototype.WriteColor = function(type, color) -{ - this.memory.WriteByte(type); - this.memory.WriteByte(c_oSerPropLenType.Three); - this.memory.WriteByte(color.r); - this.memory.WriteByte(color.g); - this.memory.WriteByte(color.b); -}; -BinaryCommonWriter.prototype.WriteShd = function(Shd) -{ - var _this = this; - //Value - if(null != Shd.Value) - { - this.memory.WriteByte(c_oSerShdType.Value); - this.memory.WriteByte(c_oSerPropLenType.Byte); - this.memory.WriteByte(Shd.Value); - } - //Value - var color = null; - if (null != Shd.Color) - color = Shd.Color; - else if (null != Shd.Unifill) { - var doc = editor.WordControl.m_oLogicDocument; - Shd.Unifill.check(doc.Get_Theme(), doc.Get_ColorMap()); - var RGBA = Shd.Unifill.getRGBAColor(); - color = new AscCommonWord.CDocumentColor(RGBA.R, RGBA.G, RGBA.B); - } - var fill = null; - if (null != Shd.Fill) - fill = Shd.Fill; - else if (null != Shd.ThemeFill) { - var doc = editor.WordControl.m_oLogicDocument; - Shd.ThemeFill.check(doc.Get_Theme(), doc.Get_ColorMap()); - var RGBA = Shd.ThemeFill.getRGBAColor(); - fill = new AscCommonWord.CDocumentColor(RGBA.R, RGBA.G, RGBA.B); - } - if (null != color && !color.Auto) - this.WriteColor(c_oSerShdType.Color, color); - if (null != fill && !fill.Auto) - this.WriteColor(c_oSerShdType.Fill, fill); - - if(Shd.Unifill || (Shd.Color && Shd.Color.Auto)) - { - this.memory.WriteByte(c_oSerShdType.ColorTheme); - this.memory.WriteByte(c_oSerPropLenType.Variable); - this.WriteItemWithLength(function() - { - _this.WriteColorTheme(Shd.Unifill, Shd.Color); - }); - } - - if (Shd.ThemeFill || (Shd.Fill && Shd.Fill.Auto)) - { - this.memory.WriteByte(c_oSerShdType.FillTheme); - this.memory.WriteByte(c_oSerPropLenType.Variable); - this.WriteItemWithLength(function() - { - _this.WriteColorTheme(Shd.ThemeFill, Shd.Fill); - }); - } -}; -BinaryCommonWriter.prototype.WritePaddings = function(Paddings) -{ - //left - if(null != Paddings.L) - { - this.memory.WriteByte(c_oSerPaddingType.leftTwips); - this.memory.WriteByte(c_oSerPropLenType.Long); - this.writeMmToTwips(Paddings.L); - } - //top - if(null != Paddings.T) - { - this.memory.WriteByte(c_oSerPaddingType.topTwips); - this.memory.WriteByte(c_oSerPropLenType.Long); - this.writeMmToTwips(Paddings.T); - } - //Right - if(null != Paddings.R) - { - this.memory.WriteByte(c_oSerPaddingType.rightTwips); - this.memory.WriteByte(c_oSerPropLenType.Long); - this.writeMmToTwips(Paddings.R); - } - //bottom - if(null != Paddings.B) - { - this.memory.WriteByte(c_oSerPaddingType.bottomTwips); - this.memory.WriteByte(c_oSerPropLenType.Long); - this.writeMmToTwips(Paddings.B); - } -}; -BinaryCommonWriter.prototype.WriteColorSpreadsheet = function(color) -{ - if (!color) { - this.memory.WriteByte(c_oSer_ColorObjectType.Type); - this.memory.WriteByte(c_oSerPropLenType.Byte); - this.memory.WriteByte(c_oSer_ColorType.Auto); - return; - } - if(color instanceof AscCommonExcel.ThemeColor) - { - if(null != color.theme) - { - this.memory.WriteByte(c_oSer_ColorObjectType.Theme); - this.memory.WriteByte(c_oSerPropLenType.Byte); - this.memory.WriteByte(color.theme); - } - if(null != color.tint) - { - this.memory.WriteByte(c_oSer_ColorObjectType.Tint); - this.memory.WriteByte(c_oSerPropLenType.Double); - this.memory.WriteDouble2(color.tint); - } - } - else - { - this.memory.WriteByte(c_oSer_ColorObjectType.Rgb); - this.memory.WriteByte(c_oSerPropLenType.Long); - this.memory.WriteLong(color.getRgb()); - } -}; -BinaryCommonWriter.prototype.WriteColorTheme = function(unifill, color) -{ - if(null != color && color.Auto){ - this.memory.WriteByte(c_oSer_ColorThemeType.Auto); - this.memory.WriteByte(c_oSerPropLenType.Null); - } - var obj = AscCommonWord.CreateFromThemeUnifill(unifill); - if (null !== obj.Color) { - this.memory.WriteByte(c_oSer_ColorThemeType.Color); - this.memory.WriteByte(c_oSerPropLenType.Byte); - this.memory.WriteByte(obj.Color); - } - if (null !== obj.Tint) { - this.memory.WriteByte(c_oSer_ColorThemeType.Tint); - this.memory.WriteByte(c_oSerPropLenType.Byte); - this.memory.WriteByte(obj.Tint); - } - if (null !== obj.Shade) { - this.memory.WriteByte(c_oSer_ColorThemeType.Shade); - this.memory.WriteByte(c_oSerPropLenType.Byte); - this.memory.WriteByte(obj.Shade); - } -}; -BinaryCommonWriter.prototype.WriteBookmark = function(bookmark) { - var oThis = this; - if (null !== bookmark.BookmarkId) { - this.WriteItem(c_oSerBookmark.Id, function() { - oThis.memory.WriteLong(bookmark.BookmarkId); - }); - } - if (bookmark.IsStart() && null !== bookmark.BookmarkName) { - this.memory.WriteByte(c_oSerBookmark.Name); - this.memory.WriteString2(bookmark.BookmarkName); - } -}; -BinaryCommonWriter.prototype.mmToTwips = function(val) { - return Math.round(AscCommonWord.g_dKoef_mm_to_twips * val); -}; -BinaryCommonWriter.prototype.writeMmToTwips = function(val) { - return this.memory.WriteLong(this.mmToTwips(val)); -}; -BinaryCommonWriter.prototype.writeMmToPt = function(val) { - return this.memory.WriteLong(Math.round(AscCommonWord.g_dKoef_mm_to_pt * val)); -}; -BinaryCommonWriter.prototype.writeMmToEmu = function(val) { - return this.memory.WriteLong(Math.round(AscCommonWord.g_dKoef_mm_to_emu * val)); -}; -BinaryCommonWriter.prototype.writeMmToUEmu = function(val) { - return this.memory.WriteULong(Math.round(AscCommonWord.g_dKoef_mm_to_emu * val)); -}; -function Binary_CommonReader(stream) -{ - this.stream = stream; -} - -Binary_CommonReader.prototype.ReadTable = function(fReadContent) -{ - var res = c_oSerConstants.ReadOk; - //stLen - res = this.stream.EnterFrame(4); - if(c_oSerConstants.ReadOk != res) - return res; - var stLen = this.stream.GetULongLE(); - //Смотрим есть ли данные под всю таблицу в дальнейшем спокойно пользуемся get функциями - res = this.stream.EnterFrame(stLen); - if(c_oSerConstants.ReadOk != res) - return res; - return this.Read1(stLen, fReadContent); -}; -Binary_CommonReader.prototype.Read1 = function(stLen, fRead) -{ - var res = c_oSerConstants.ReadOk; - var stCurPos = 0; - while(stCurPos < stLen) - { - this.stream.bLast = false; - //stItem - var type = this.stream.GetUChar(); - var length = this.stream.GetULongLE(); - if (stCurPos + length + 5 >= stLen) - this.stream.bLast = true; - res = fRead(type, length); - if(res === c_oSerConstants.ReadUnknown) - { - res = this.stream.Skip2(length); - if(c_oSerConstants.ReadOk != res) - return res; - } - else if(res !== c_oSerConstants.ReadOk) - return res; - stCurPos += length + 5; - } - return res; -}; -Binary_CommonReader.prototype.Read2 = function(stLen, fRead) -{ - var res = c_oSerConstants.ReadOk; - var stCurPos = 0; - while(stCurPos < stLen) - { - //stItem - var type = this.stream.GetUChar(); - var lenType = this.stream.GetUChar(); - var nCurPosShift = 2; - var nRealLen; - switch(lenType) - { - case c_oSerPropLenType.Null: nRealLen = 0;break; - case c_oSerPropLenType.Byte: nRealLen = 1;break; - case c_oSerPropLenType.Short: nRealLen = 2;break; - case c_oSerPropLenType.Three: nRealLen = 3;break; - case c_oSerPropLenType.Long: - case c_oSerPropLenType.Double: nRealLen = 4;break; - case c_oSerPropLenType.Double64: nRealLen = 8;break; - case c_oSerPropLenType.Long: nRealLen = 8;break; - case c_oSerPropLenType.Variable: - nRealLen = this.stream.GetULongLE(); - nCurPosShift += 4; - break; - default:return c_oSerConstants.ErrorUnknown; - } - res = fRead(type, nRealLen); - if(res === c_oSerConstants.ReadUnknown) - { - res = this.stream.Skip2(nRealLen); - if(c_oSerConstants.ReadOk != res) - return res; - } - else if(res !== c_oSerConstants.ReadOk) - return res; - stCurPos += nRealLen + nCurPosShift; - } - return res; -}; -Binary_CommonReader.prototype.Read2Spreadsheet = function(stLen, fRead) -{ - var res = c_oSerConstants.ReadOk; - var stCurPos = 0; - while(stCurPos < stLen) - { - //stItem - var type = this.stream.GetUChar(); - var lenType = this.stream.GetUChar(); - var nCurPosShift = 2; - var nRealLen; - switch(lenType) - { - case c_oSerPropLenType.Null: nRealLen = 0;break; - case c_oSerPropLenType.Byte: nRealLen = 1;break; - case c_oSerPropLenType.Short: nRealLen = 2;break; - case c_oSerPropLenType.Three: nRealLen = 3;break; - case c_oSerPropLenType.Long: nRealLen = 4;break; - case c_oSerPropLenType.Double: nRealLen = 8;break; - case c_oSerPropLenType.Double64: nRealLen = 8;break; - case c_oSerPropLenType.Long: nRealLen = 8;break; - case c_oSerPropLenType.Variable: - nRealLen = this.stream.GetULongLE(); - nCurPosShift += 4; - break; - default:return c_oSerConstants.ErrorUnknown; - } - res = fRead(type, nRealLen); - if(res === c_oSerConstants.ReadUnknown) - { - res = this.stream.Skip2(nRealLen); - if(c_oSerConstants.ReadOk != res) - return res; - } - else if(res !== c_oSerConstants.ReadOk) - return res; - stCurPos += nRealLen + nCurPosShift; - } - return res; -}; -Binary_CommonReader.prototype.ReadDouble = function() -{ - var dRes = 0.0; - dRes |= this.stream.GetUChar(); - dRes |= this.stream.GetUChar() << 8; - dRes |= this.stream.GetUChar() << 16; - dRes |= this.stream.GetUChar() << 24; - dRes /= 100000; - return dRes; -}; -Binary_CommonReader.prototype.ReadColor = function() -{ - var r = this.stream.GetUChar(); - var g = this.stream.GetUChar(); - var b = this.stream.GetUChar(); - return new AscCommonWord.CDocumentColor(r, g, b); -}; -Binary_CommonReader.prototype.ReadShd = function(type, length, Shd, themeColor, themeFill) -{ - var res = c_oSerConstants.ReadOk; - var oThis = this; - switch(type) - { - case c_oSerShdType.Value: Shd.Value = this.stream.GetUChar();break; - case c_oSerShdType.Color: Shd.Color = this.ReadColor();break; - case c_oSerShdType.ColorTheme: - res = this.Read2(length, function(t, l){ - return oThis.ReadColorTheme(t, l, themeColor); - }); - break; - case c_oSerShdType.Fill: - Shd.Fill = this.ReadColor(); - break; - case c_oSerShdType.FillTheme: - res = this.Read2(length, function(t, l){ - return oThis.ReadColorTheme(t, l, themeFill); - }); - break; - default: - res = c_oSerConstants.ReadUnknown; - break; - } - return res; -}; -Binary_CommonReader.prototype.ReadColorSpreadsheet = function(type, length, color) -{ - var res = c_oSerConstants.ReadOk; - if ( c_oSer_ColorObjectType.Type == type ) - color.auto = (c_oSer_ColorType.Auto == this.stream.GetUChar()); - else if ( c_oSer_ColorObjectType.Rgb == type ) - color.rgb = 0xffffff & this.stream.GetULongLE(); - else if ( c_oSer_ColorObjectType.Theme == type ) - color.theme = this.stream.GetUChar(); - else if ( c_oSer_ColorObjectType.Tint == type ) - color.tint = this.stream.GetDoubleLE(); - else - res = c_oSerConstants.ReadUnknown; - return res; -}; -Binary_CommonReader.prototype.ReadColorTheme = function(type, length, color) -{ - var res = c_oSerConstants.ReadOk; - if ( c_oSer_ColorThemeType.Auto == type ) - color.Auto = true; - else if ( c_oSer_ColorThemeType.Color == type ) - color.Color = this.stream.GetByte(); - else if ( c_oSer_ColorThemeType.Tint == type ) - color.Tint = this.stream.GetByte(); - else if ( c_oSer_ColorThemeType.Shade == type ) - color.Shade = this.stream.GetByte(); - else - res = c_oSerConstants.ReadUnknown; - return res; -}; -Binary_CommonReader.prototype.ReadBookmark = function(type, length, bookmark) { - var res = c_oSerConstants.ReadOk; - if (c_oSerBookmark.Id === type) { - bookmark.BookmarkId = this.stream.GetULongLE(); - } else if (c_oSerBookmark.Name === type) { - bookmark.BookmarkName = this.stream.GetString2LE(length); - } else { - res = c_oSerConstants.ReadUnknown; - } - return res; -}; -/** @constructor */ -function FT_Stream2(data, size) { - this.obj = null; - this.data = data; - this.size = size; - this.pos = 0; - this.cur = 0; - this.bLast = false; -} - -FT_Stream2.prototype.Seek = function(_pos) { - if (_pos > this.size) - return c_oSerConstants.ErrorStream; - this.pos = _pos; - return c_oSerConstants.ReadOk; -}; -FT_Stream2.prototype.Seek2 = function(_cur) { - if (_cur > this.size) - return c_oSerConstants.ErrorStream; - this.cur = _cur; - return c_oSerConstants.ReadOk; -}; -FT_Stream2.prototype.Skip = function(_skip) { - if (_skip < 0) - return c_oSerConstants.ErrorStream; - return this.Seek(this.pos + _skip); -}; -FT_Stream2.prototype.Skip2 = function(_skip) { - if (_skip < 0) - return c_oSerConstants.ErrorStream; - return this.Seek2(this.cur + _skip); -}; -FT_Stream2.prototype.SkipRecord = function() { - var _len = this.GetULong(); - this.Skip2(_len); -}; - -// 1 bytes -FT_Stream2.prototype.GetUChar = function() { - if (this.cur >= this.size) - return 0; - return this.data[this.cur++]; -}; -FT_Stream2.prototype.GetChar = function() { - if (this.cur >= this.size) - return 0; - var m = this.data[this.cur++]; - if (m > 127) - m -= 256; - return m; -}; -FT_Stream2.prototype.GetByte = function() { - return this.GetUChar(); -}; -FT_Stream2.prototype.GetBool = function() { - var Value = this.GetUChar(); - return ( Value == 0 ? false : true ); -}; -// 2 byte -FT_Stream2.prototype.GetUShortLE = function() { - if (this.cur + 1 >= this.size) - return 0; - return (this.data[this.cur++] | this.data[this.cur++] << 8); -}; -FT_Stream2.prototype.GetShortLE = function() { - return AscFonts.FT_Common.UShort_To_Short(this.GetUShortLE()); -} -// 4 byte -FT_Stream2.prototype.GetULongLE = function() { - if (this.cur + 3 >= this.size) - return 0; - return (this.data[this.cur++] | this.data[this.cur++] << 8 | this.data[this.cur++] << 16 | this.data[this.cur++] << 24); -}; -FT_Stream2.prototype.GetLongLE = function() { - return AscFonts.FT_Common.UintToInt(this.GetULongLE()); -}; -FT_Stream2.prototype.GetLong = function() { - return this.GetULongLE(); -}; -FT_Stream2.prototype.GetULong = function() { - return this.GetULongLE(); -} - var tempHelp = new ArrayBuffer(8); - var tempHelpUnit = new Uint8Array(tempHelp); - var tempHelpFloat = new Float64Array(tempHelp); -FT_Stream2.prototype.GetDoubleLE = function() { - if (this.cur + 7 >= this.size) - return 0; - tempHelpUnit[0] = this.GetUChar(); - tempHelpUnit[1] = this.GetUChar(); - tempHelpUnit[2] = this.GetUChar(); - tempHelpUnit[3] = this.GetUChar(); - tempHelpUnit[4] = this.GetUChar(); - tempHelpUnit[5] = this.GetUChar(); - tempHelpUnit[6] = this.GetUChar(); - tempHelpUnit[7] = this.GetUChar(); - return tempHelpFloat[0]; - - var arr = []; - for(var i = 0; i < 8; ++i) - arr.push(this.GetUChar()); - return this.doubleDecodeLE754(arr); -}; -FT_Stream2.prototype.doubleDecodeLE754 = function(a) { - var s, e, m, i, d, nBits, mLen, eLen, eBias, eMax; - var el = {len:8, mLen:52, rt:0}; - mLen = el.mLen, eLen = el.len*8-el.mLen-1, eMax = (1<>1; - - i = (el.len-1); d = -1; s = a[i]; i+=d; nBits = -7; - for (e = s&((1<<(-nBits))-1), s>>=(-nBits), nBits += eLen; nBits > 0; e=e*256+a[i], i+=d, nBits-=8); - for (m = e&((1<<(-nBits))-1), e>>=(-nBits), nBits += mLen; nBits > 0; m=m*256+a[i], i+=d, nBits-=8); - - switch (e) - { - case 0: - // Zero, or denormalized number - e = 1-eBias; - break; - case eMax: - // NaN, or +/-Infinity - return m?NaN:((s?-1:1)*Infinity); - default: - // Normalized number - m = m + Math.pow(2, mLen); - e = e - eBias; - break; - } - return (s?-1:1) * m * Math.pow(2, e-mLen); -}; -// 3 byte -FT_Stream2.prototype.GetUOffsetLE = function() { - if (this.cur + 2 >= this.size) - return c_oSerConstants.ReadOk; - return (this.data[this.cur++] | this.data[this.cur++] << 8 | this.data[this.cur++] << 16); -}; -FT_Stream2.prototype.GetString2 = function() { - var Len = this.GetLong(); - return this.GetString2LE(Len); -}; -//String -FT_Stream2.prototype.GetString2LE = function(len) { - if (this.cur + len > this.size) - return ""; - var a = []; - for (var i = 0; i + 1 < len; i+=2) - a.push(String.fromCharCode(this.data[this.cur + i] | this.data[this.cur + i + 1] << 8)); - this.cur += len; - return a.join(""); -}; -FT_Stream2.prototype.GetString = function() { - var Len = this.GetLong(); - if (this.cur + 2 * Len > this.size) - return ""; - var t = ""; - for (var i = 0; i + 1 < 2 * Len; i+=2) { - var uni = this.data[this.cur + i]; - uni |= this.data[this.cur + i + 1] << 8; - t += String.fromCharCode(uni); - } - this.cur += 2 * Len; - return t; -}; -FT_Stream2.prototype.GetString2A = function() { - var len = this.GetULong(); - return this.GetString1(len); -} -FT_Stream2.prototype.GetString1 = function(len) { - if (this.cur + len > this.size) - return ""; - var t = ""; - for (var i = 0; i < len; i++) - { - var _c = this.data[this.cur + i]; - if (_c == 0) - continue; - - t += String.fromCharCode(_c); - } - this.cur += len; - return t; -} -FT_Stream2.prototype.GetCurPos = function() { - return this.cur; -}; -FT_Stream2.prototype.GetSize = function() { - return this.size; -}; -FT_Stream2.prototype.EnterFrame = function(count) { - if (this.size - this.pos < count) - return c_oSerConstants.ErrorStream; - - this.cur = this.pos; - this.pos += count; - return c_oSerConstants.ReadOk; -}; -FT_Stream2.prototype.GetDouble = function() { - var dRes = 0.0; - dRes |= this.GetUChar(); - dRes |= this.GetUChar() << 8; - dRes |= this.GetUChar() << 16; - dRes |= this.GetUChar() << 24; - dRes /= 100000; - return dRes; -}; -FT_Stream2.prototype.GetBuffer = function(length) { - var res = new Array(length); - for(var i = 0 ; i < length ;++i){ - res[i] = this.data[this.cur++] - } - return res; -}; -FT_Stream2.prototype.GetBufferUint8 = function(length) { - let pos = this.GetCurPos(); - return this.data.slice(pos, pos + length); -}; -FT_Stream2.prototype.ToFileStream = function() { - var res = new AscCommon.FileStream(); - this.ToFileStream2(res); - return res; -}; -FT_Stream2.prototype.ToFileStream2 = function(stream) { - stream.obj = this.obj; - stream.data = this.data; - stream.size = this.size; - stream.pos = this.pos; - stream.cur = this.cur; -}; -FT_Stream2.prototype.FromFileStream = function(stream) { - this.obj = stream.obj; - this.data = stream.data; - this.size = stream.size; - this.pos = stream.pos; - this.cur = stream.cur; -}; - FT_Stream2.prototype.XlsbReadRecordType = function() { - var nValue = this.GetUChar(); - if(0 != (nValue & 0x80)) - { - var nPart = this.GetUChar(); - nValue = (nValue & 0x7F) | ((nPart & 0x7F) << 7); - } - return nValue; - }; - FT_Stream2.prototype.XlsbSkipRecord = function() { - this.Skip2(this.XlsbReadRecordLength()); - }; - FT_Stream2.prototype.XlsbReadRecordLength = function() { - var nValue = 0; - for (var i = 0; i < 4; ++i) - { - var nPart = this.GetUChar(); - nValue |= (nPart & 0x7F) << (7 * i); - if(0 == (nPart & 0x80)) - { - break; - } - } - return nValue; - }; -var gc_nMaxRow = 1048576; -var gc_nMaxCol = 16384; -var gc_nMaxRow0 = gc_nMaxRow - 1; -var gc_nMaxCol0 = gc_nMaxCol - 1; -/** - * @constructor - */ -function CellAddressUtils(){ - this._oCodeA = 'A'.charCodeAt(0); - this._aColnumToColstr = []; - this.oCellAddressCache = {}; - this.colnumToColstrFromWsView = function (col) { - var sResult = this._aColnumToColstr[col]; - if (null != sResult) - return sResult; - - if(col == 0) return ""; - - var col0 = col - 1; - var text = String.fromCharCode(65 + (col0 % 26)); - return (this._aColnumToColstr[col] = (col0 < 26 ? text : this.colnumToColstrFromWsView(Math.floor(col0 / 26)) + text)); - }; - this.colnumToColstr = function(num){ - var sResult = this._aColnumToColstr[num]; - if(!sResult){ - // convert 1 to A, 2 to B, ..., 27 to AA etc. - sResult = ""; - if(num > 0){ - var columnNumber = num; - var currentLetterNumber; - while(columnNumber > 0){ - currentLetterNumber = (columnNumber - 1) % 26; - sResult = String.fromCharCode(currentLetterNumber + 65) + sResult; - columnNumber = (columnNumber - (currentLetterNumber + 1)) / 26; - } - } - this._aColnumToColstr[num] = sResult; - } - return sResult; - }; - this.colstrToColnum = function(col_str) { - //convert A to 1; AA to 27 - var col_num = 0; - for (var i = 0; i < col_str.length; ++i) - col_num = 26 * col_num + (col_str.charCodeAt(i) - this._oCodeA + 1); - return col_num; - }; - this.getCellId = function(row, col){ - return g_oCellAddressUtils.colnumToColstr(col + 1) + (row + 1); - }; - this.getCellAddress = function(sId) - { - var oRes = this.oCellAddressCache[sId]; - if(null == oRes) - { - oRes = new CellAddress(sId); - this.oCellAddressCache[sId] = oRes; - } - return oRes; - }; -} -var g_oCellAddressUtils = new CellAddressUtils(); - - function CellBase(r, c) { - this.row = r; - this.col = c; - } - CellBase.prototype.clean = function() { - this.row = 0; - this.col = 0; - }; - CellBase.prototype.clone = function() { - return new CellBase(this.row, this.col); - }; - CellBase.prototype.isEqual = function(cell) { - return this.row === cell.row && this.col === cell.col; - }; - CellBase.prototype.isEmpty = function() { - return 0 === this.row && 0 === this.col; - }; - CellBase.prototype.getName = function() { - return g_oCellAddressUtils.colnumToColstr(this.col + 1) + (this.row + 1); - }; - CellBase.prototype.fromRefA1 = function(val) { - this.clean(); - var index = 0; - var char = val.charCodeAt(index); - while (65 <= char && char <= 90) {//'A'<'Z' - this.col = 26 * this.col + char - 64; - char = val.charCodeAt(++index); - } - while (97 <= char && char <= 122) {//'a'<'z' - this.col = 26 * this.col + char - 96; - char = val.charCodeAt(++index); - } - while (48 <= char && char <= 57) {//'0'<'9' - this.row = 10 * this.row + char - 48; - char = val.charCodeAt(++index); - } - this.row -= 1; - this.col -= 1; - this.row = Math.min(this.row, gc_nMaxRow0); - this.row = Math.max(this.row, 0); - this.col = Math.min(this.col, gc_nMaxCol0); - this.col = Math.max(this.col, 0); - }; - CellBase.prototype.toRefA1 = function (row, col) { - //TODO функция неверно работает, если кол-во столбцов превышает 26 - var res = ''; - do { - res += String.fromCharCode(col % 26 + 65); - col = Math.floor(col / 26); - } while (col > 0); - return res + (row + 1); - }; -/** - * @constructor - */ -function CellAddress(){ - var argc = arguments.length; - this._valid = true; - this._invalidId = false; - this._invalidCoord = false; - this.id = null; - this.row = null; - this.col = null; - this.bRowAbs = false; - this.bColAbs = false; - this.bIsCol = false; - this.bIsRow = false; - this.colLetter = null; - if(1 == argc){ - //Сразу пришло ID вида "A1" - this.id = arguments[0].toUpperCase(); - this._invalidCoord = true; - this._checkId(); - } - else if(2 == argc){ - //адрес вида (1,1) = "A1". Внутренний формат начинается с 1 - this.row = arguments[0]; - this.col = arguments[1]; - this._checkCoord(); - this._invalidId = true; - } - else if(3 == argc){ - //тоже самое что и 2 аргумента, только 0-based - this.row = arguments[0] + 1; - this.col = arguments[1] + 1; - this._checkCoord(); - this._invalidId = true; - } -} -CellAddress.prototype = Object.create(CellBase.prototype); -CellAddress.prototype.constructor = CellAddress; -CellAddress.prototype._isDigit=function(symbol){ - return '0' <= symbol && symbol <= '9'; -}; -CellAddress.prototype._isAlpha=function(symbol){ - return 'A' <= symbol && symbol <= 'Z'; -}; -CellAddress.prototype._checkId=function(){ - this._invalidCoord = true; - this._recalculate(true, false); - this._checkCoord(); -}; -CellAddress.prototype._checkCoord=function(){ - if( !(this.row >= 1 && this.row <= gc_nMaxRow) ) - this._valid = false; - else if( !(this.col >= 1 && this.col <= gc_nMaxCol) ) - this._valid = false; - else - this._valid = true; -}; -CellAddress.prototype._recalculate=function(bCoord, bId){ - if(bCoord && this._invalidCoord){ - this._invalidCoord = false; - var sId = this.id; - this.row = this.col = 0;//выставляем невалидные значения, чтобы не присваивать их при каждом else - var indexes = {}, i = -1, indexesCount = 0; - while ((i = sId.indexOf("$", i + 1)) != -1) { - indexes[i - indexesCount++] = 1;//отнимаем количество, чтобы индексы указывали на следующий после них символ после удаления $ - } - if (indexesCount <= 2) { - if (indexesCount > 0) - sId = sId.replace(/\$/g, ""); - var nIdLength = sId.length; - if (nIdLength > 0) { - var nIndex = 0; - while (this._isAlpha(sId.charAt(nIndex)) && nIndex < nIdLength) - nIndex++; - if (0 == nIndex) { - // (1,Infinity) - this.bIsRow = true; - this.col = 1; - this.colLetter = g_oCellAddressUtils.colnumToColstr(this.col); - this.row = sId.substring(nIndex) - 0; - //this.id = this.colLetter + this.row; - if (null != indexes[0]) { - this.bRowAbs = true; - indexesCount--; - } - } - else if (nIndex == nIdLength) { - // (Infinity,1) - this.bIsCol = true; - this.colLetter = sId; - this.col = g_oCellAddressUtils.colstrToColnum(this.colLetter); - this.row = 1; - //this.id = this.colLetter + this.row; - if (null != indexes[0]) { - this.bColAbs = true; - indexesCount--; - } - } - else { - this.colLetter = sId.substring(0, nIndex); - this.col = g_oCellAddressUtils.colstrToColnum(this.colLetter); - this.row = sId.substring(nIndex) - 0; - if (null != indexes[0]) { - this.bColAbs = true; - indexesCount--; - } - if (null != indexes[nIndex]) { - this.bRowAbs = true; - indexesCount--; - } - } - if (indexesCount > 0) { - this.row = this.col = 0; - } - } - } - } - else if(bId && this._invalidId){ - this._invalidId = false; - this.colLetter = g_oCellAddressUtils.colnumToColstr(this.col); - if(this.bIsCol) - this.id = this.colLetter; - else if(this.bIsRow) - this.id = this.row; - else - this.id = this.colLetter + this.row; - } -}; -CellAddress.prototype.isValid=function(){ - return this._valid; -}; -CellAddress.prototype.getID=function(){ - this._recalculate(false, true); - return this.id; -}; -CellAddress.prototype.getIDAbsolute=function(){ - this._recalculate(true, false); - return "$" + this.getColLetter() + "$" + this.getRow(); -}; -CellAddress.prototype.getRow=function(){ - this._recalculate(true, false); - return this.row; -}; -CellAddress.prototype.getRow0=function(){ - //0 - based - this._recalculate(true, false); - return this.row - 1; -}; -CellAddress.prototype.getRowAbs=function(){ - this._recalculate(true, false); - return this.bRowAbs; -}; -CellAddress.prototype.getIsRow=function(){ - this._recalculate(true, false); - return this.bIsRow; -}; -CellAddress.prototype.getCol=function(){ - this._recalculate(true, false); - return this.col; -}; -CellAddress.prototype.getCol0=function(){ - //0 - based - this._recalculate(true, false); - return this.col - 1; -}; -CellAddress.prototype.getColAbs=function(){ - this._recalculate(true, false); - return this.bColAbs; -}; -CellAddress.prototype.getIsCol=function(){ - this._recalculate(true, false); - return this.bIsCol; -}; -CellAddress.prototype.getColLetter=function(){ - this._recalculate(false, true); - return this.colLetter; -}; -CellAddress.prototype.setRow=function(val){ - if( !(this.row >= 0 && this.row <= gc_nMaxRow) ) - this._valid = false; - this._invalidId = true; - this.row = val; -}; -CellAddress.prototype.setCol=function(val){ - if( !(val >= 0 && val <= gc_nMaxCol) ) - return; - this._invalidId = true; - this.col = val; -}; -CellAddress.prototype.setId=function(val){ - this._invalidCoord = true; - this.id = val; - this._checkId(); -}; -CellAddress.prototype.moveRow=function(diff){ - var val = this.row + diff; - if( !(val >= 0 && val <= gc_nMaxRow) ) - return; - this._invalidId = true; - this.row = val; -}; -CellAddress.prototype.moveCol=function(diff){ - var val = this.col + diff; - if( !( val >= 0 && val <= gc_nMaxCol) ) - return; - this._invalidId = true; - this.col = val; -}; - -function isRealObject(obj) -{ - return obj !== null && typeof obj === "object"; -} - - function FileStream(data, size) - { - this.obj = null; - this.data = data; - this.size = size; - this.pos = 0; - this.cur = 0; - - this.GetCurPos = function() - { - return this.cur; - } - this.Seek = function(_pos) - { - if (_pos > this.size) - return 1; - this.pos = _pos; - return 0; - } - this.Seek2 = function(_cur) - { - if (_cur > this.size) - return 1; - this.cur = _cur; - return 0; - } - this.Skip = function(_skip) - { - if (_skip < 0) - return 1; - return this.Seek(this.pos + _skip); - } - this.Skip2 = function(_skip) - { - if (_skip < 0) - return 1; - return this.Seek2(this.cur + _skip); - } - - // 1 bytes - this.GetUChar = function() - { - if (this.cur >= this.size) - return 0; - return this.data[this.cur++]; - } - this.GetBool = function() - { - if (this.cur >= this.size) - return 0; - return (this.data[this.cur++] == 1) ? true : false; - } - - // 2 byte - this.GetUShort = function() - { - if (this.cur + 1 >= this.size) - return 0; - return (this.data[this.cur++] | this.data[this.cur++] << 8); - } - - // 4 byte - this.GetULong = function() - { - if (this.cur + 3 >= this.size) - return 0; - var r = (this.data[this.cur++] | this.data[this.cur++] << 8 | this.data[this.cur++] << 16 | this.data[this.cur++] << 24); - if (r < 0) - r += (0xFFFFFFFF + 1); - return r; - } - - this.ReadIntFromPPTY = function () - { - var value = 0; - var end = this.cur + this.GetULong() + 4; - this.Skip2(1); - while (true) - { - var _at = this.GetUChar(); - if (_at === c_nodeAttribute.nodeAttributeEnd) - { - break; - } - else if (0 === _at) - { - value = this.GetULong(); - } - } - this.Seek2(end); - return value; - } - - this.ReadByteFromPPTY = function () - { - var value = 0; - var end = this.cur + this.GetULong() + 4; - this.Skip2(1); - while (true) - { - var _at = this.GetUChar(); - if (_at === c_nodeAttribute.nodeAttributeEnd) - { - break; - } else if (0 === _at) - { - value = this.GetUChar(); - } - } - this.Seek2(end); - return value; - } - - this.GetLong = function() - { - if (this.cur + 3 >= this.size) - return 0; - return (this.data[this.cur++] | this.data[this.cur++] << 8 | this.data[this.cur++] << 16 | this.data[this.cur++] << 24); - } - - this.GetDouble = function() - { - if (this.cur + 7 >= this.size) - return 0; - tempHelpUnit[0] = this.GetUChar(); - tempHelpUnit[1] = this.GetUChar(); - tempHelpUnit[2] = this.GetUChar(); - tempHelpUnit[3] = this.GetUChar(); - tempHelpUnit[4] = this.GetUChar(); - tempHelpUnit[5] = this.GetUChar(); - tempHelpUnit[6] = this.GetUChar(); - tempHelpUnit[7] = this.GetUChar(); - return tempHelpFloat[0]; - } - - //String - this.GetString = function(len) - { - len *= 2; - if (this.cur + len > this.size) - return ""; - var t = ""; - for (var i = 0; i < len; i+=2) - { - var _c = this.data[this.cur + i + 1] << 8 | this.data[this.cur + i]; - if (_c == 0) - break; - - t += String.fromCharCode(_c); - } - this.cur += len; - return t; - } - this.GetString1 = function(len) - { - if (this.cur + len > this.size) - return ""; - var t = ""; - for (var i = 0; i < len; i++) - { - var _c = this.data[this.cur + i]; - if (_c == 0) - break; - - t += String.fromCharCode(_c); - } - this.cur += len; - return t; - } - this.GetString2 = function() - { - var len = this.GetULong(); - return this.GetString(len); - } - - this.GetString2A = function() - { - var len = this.GetULong(); - return this.GetString1(len); - } - this.GetBuffer = function (length) { - var res = new Array(length); - for (var i = 0; i < length; ++i) { - res[i] = this.data[this.cur++] - } - return res; - }; - this.GetBufferUint8 = function (length) { - let pos = this.GetCurPos(); - return this.data.slice(pos, pos + length); - }; - - this.EnterFrame = function(count) - { - if (this.pos >= this.size || this.size - this.pos < count) - return 1; - - this.cur = this.pos; - this.pos += count; - return 0; - } - - this.SkipRecord = function() - { - var _len = this.GetULong(); - this.Skip2(_len); - } - - this.GetPercentage = function() - { - var s = this.GetString2(); - var _len = s.length; - if (_len == 0) - return null; - - var _ret = null; - if ((_len - 1) == s.indexOf("%")) - { - s.substring(0, _len - 1); - _ret = parseFloat(s); - if (isNaN(_ret)) - _ret = null; - } - else - { - _ret = parseFloat(s); - if (isNaN(_ret)) - _ret = null; - else - _ret /= 1000; - } - - return _ret; - } - } - function GetUTF16_fromUnicodeChar(code) { - if (code < 0x10000) { - return String.fromCharCode(code); - } else { - code -= 0x10000; - return String.fromCharCode(0xD800 | ((code >> 10) & 0x03FF)) + - String.fromCharCode(0xDC00 | (code & 0x03FF)); - } - }; - function GetStringUtf8(reader, len) { - if (reader.cur + len > reader.size) { - return ""; - } - var _res = ""; - - var end = reader.cur + len; - var val = 0; - while (reader.cur < end) { - var byteMain = reader.data[reader.cur]; - if (0x00 == (byteMain & 0x80)) { - // 1 byte - _res += GetUTF16_fromUnicodeChar(byteMain); - ++reader.cur; - } - else if (0x00 == (byteMain & 0x20)) { - // 2 byte - val = (((byteMain & 0x1F) << 6) | - (reader.data[reader.cur + 1] & 0x3F)); - _res += GetUTF16_fromUnicodeChar(val); - reader.cur += 2; - } - else if (0x00 == (byteMain & 0x10)) { - // 3 byte - val = (((byteMain & 0x0F) << 12) | - ((reader.data[reader.cur + 1] & 0x3F) << 6) | - (reader.data[reader.cur + 2] & 0x3F)); - - _res += GetUTF16_fromUnicodeChar(val); - reader.cur += 3; - } - else if (0x00 == (byteMain & 0x08)) { - // 4 byte - val = (((byteMain & 0x07) << 18) | - ((reader.data[reader.cur + 1] & 0x3F) << 12) | - ((reader.data[reader.cur + 2] & 0x3F) << 6) | - (reader.data[reader.cur + 3] & 0x3F)); - - _res += GetUTF16_fromUnicodeChar(val); - reader.cur += 4; - } - else if (0x00 == (byteMain & 0x04)) { - // 5 byte - val = (((byteMain & 0x03) << 24) | - ((reader.data[reader.cur + 1] & 0x3F) << 18) | - ((reader.data[reader.cur + 2] & 0x3F) << 12) | - ((reader.data[reader.cur + 3] & 0x3F) << 6) | - (reader.data[reader.cur + 4] & 0x3F)); - - _res += GetUTF16_fromUnicodeChar(val); - reader.cur += 5; - } - else { - // 6 byte - val = (((byteMain & 0x01) << 30) | - ((reader.data[reader.cur + 1] & 0x3F) << 24) | - ((reader.data[reader.cur + 2] & 0x3F) << 18) | - ((reader.data[reader.cur + 3] & 0x3F) << 12) | - ((reader.data[reader.cur + 4] & 0x3F) << 6) | - (reader.data[reader.cur + 5] & 0x3F)); - - _res += GetUTF16_fromUnicodeChar(val); - reader.cur += 6; - } - } - - return _res; - }; - - //----------------------------------------------------------export---------------------------------------------------- - window['AscCommon'] = window['AscCommon'] || {}; - window['AscCommon'].c_oSerConstants = c_oSerConstants; - window['AscCommon'].c_oSerPropLenType = c_oSerPropLenType; - window['AscCommon'].c_oSer_ColorType = c_oSer_ColorType; - window['AscCommon'].c_oSerBorderType = c_oSerBorderType; - window['AscCommon'].c_oSerBordersType = c_oSerBordersType; - window['AscCommon'].c_oSerPaddingType = c_oSerPaddingType; - window['AscCommon'].BinaryCommonWriter = BinaryCommonWriter; - window['AscCommon'].Binary_CommonReader = Binary_CommonReader; - window['AscCommon'].FT_Stream2 = FT_Stream2; - window['AscCommon'].gc_nMaxRow = gc_nMaxRow; - window['AscCommon'].gc_nMaxCol = gc_nMaxCol; - window['AscCommon'].gc_nMaxRow0 = gc_nMaxRow0; - window['AscCommon'].gc_nMaxCol0 = gc_nMaxCol0; - window['AscCommon'].g_oCellAddressUtils = g_oCellAddressUtils; - window['AscCommon'].CellBase = CellBase; - window['AscCommon'].CellAddress = CellAddress; - window['AscCommon'].isRealObject = isRealObject; - window['AscCommon'].FileStream = FileStream; - window['AscCommon'].GetStringUtf8 = GetStringUtf8; - window['AscCommon'].g_nodeAttributeStart = c_nodeAttribute.nodeAttributeStart; - window['AscCommon'].g_nodeAttributeEnd = c_nodeAttribute.nodeAttributeEnd; - window['AscCommon'].c_oSerAlgorithmNameTypes = c_oSerAlgorithmNameTypes; - window['AscCommon'].c_oSerCryptAlgorithmSid = c_oSerCryptAlgorithmSid; - - -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/WorkEvents.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/WorkEvents.js deleted file mode 100644 index 76979fd830..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/WorkEvents.js +++ /dev/null @@ -1,769 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -(function(window, undefined) -{ - AscCommon.isTouch = false; - AscCommon.isTouchMove = false; - AscCommon.TouchStartTime = -1; - // Import - var AscBrowser = AscCommon.AscBrowser; - - // константы для мыши - var g_mouse_event_type_down = 0; - var g_mouse_event_type_move = 1; - var g_mouse_event_type_up = 2; - var g_mouse_event_type_wheel = 3; - - var g_mouse_button_left = 0; - var g_mouse_button_center = 1; - var g_mouse_button_right = 2; - - var MouseUpLock = { - MouseUpLockedSend : false - }; - - AscCommon.stopEvent = function(e) - { - if (!e) - return; - if (e.preventDefault) - e.preventDefault(); - if (e.stopPropagation) - e.stopPropagation(); - }; - - // для мозиллы пока отключаем, так как браузер не распознает это как "юзерское действие". (window.open, input[file].click) - var isUsePointerEvents = (AscBrowser.isChrome && (AscBrowser.chromeVersion > 70)/* || AscBrowser.isMozilla*/) ? true : false; - - AscCommon.addMouseEvent = function(elem, type, handler) - { - var _type = (isUsePointerEvents ? "onpointer" : "onmouse") + type; - elem[_type] = handler; - }; - AscCommon.removeMouseEvent = function(elem, type) - { - var _type = (isUsePointerEvents ? "onpointer" : "onmouse") + type; - if (elem[_type]) - delete elem[_type]; - }; - AscCommon.getMouseEvent = function(elem, type) - { - var _type = (isUsePointerEvents ? "onpointer" : "onmouse") + type; - return elem[_type]; - }; - - function CMouseEventHandler() - { - this.X = 0; // позиция курсора X - this.Y = 0; // позиция курсора Y - - this.Button = g_mouse_button_left; // кнопка мыши - this.Type = g_mouse_event_type_move; // тип евента - - this.AltKey = false; // нажата ли кнопка alt - this.CtrlKey = false; // нажата ли кнопка ctrl - this.ShiftKey = false; // нажата ли кнопка shift - - this.Sender = null; // от какого html элемента пришел евент - - this.LastClickTime = -1; // время последнего mousedown - this.ClickCount = 0; // количество кликов - - this.WheelDelta = 0; - - // координаты мышки при предыдущем mousedown (для mousemove) - this.IsPressed = false; // была ли зажата кнопка - this.LastX = 0; - this.LastY = 0; - - this.KoefPixToMM = 1; - - this.IsLocked = false; - this.IsLockedEvent = false; - - this.buttonObject = null; - - this.AscHitToHandlesEpsilon = 0; - - this.LockMouse = function() - { - if (!this.IsLocked) - { - this.IsLocked = true; - - if (window.captureEvents) - window.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP); - - if (window.g_asc_plugins) - window.g_asc_plugins.disablePointerEvents(); - - /* - var parent = window; - while (true) - { - if (!parent) - break; - - if (parent.captureEvents) - parent.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP); - - if (parent == parent.parent) - break; - - parent = parent.parent; - } - */ - - return true; - } - return false; - }; - this.UnLockMouse = function() - { - if (this.IsLocked) - { - this.IsLocked = false; - - if (window.releaseEvents) - window.releaseEvents(Event.MOUSEMOVE); - - if (window.g_asc_plugins) - window.g_asc_plugins.enablePointerEvents(); - - /* - var parent = window; - while (true) - { - if (!parent) - break; - - if (parent.releaseEvents) - parent.releaseEvents(Event.MOUSEMOVE); - - if (parent == parent.parent) - break; - - parent = parent.parent; - } - */ - - return true; - } - return false; - }; - } - - function CKeyboardEvent() - { - this.AltKey = false; // нажата ли кнопка alt - this.CtrlKey = false; // нажата ли кнопка ctrl - this.ShiftKey = false; // нажата ли кнопка shift - this.MacCmdKey = false; - this.AltGr = false; - - this.Sender = null; // от какого html элемента пришел евент - - this.CharCode = 0; - this.KeyCode = 0; - } - - CKeyboardEvent.prototype.Up = function() - { - this.AltKey = false; - this.CtrlKey = false; - this.ShiftKey = false; - this.AltGr = false; - this.MacCmdKey = false; - }; - CKeyboardEvent.prototype.IsCtrl = function() - { - return (this.CtrlKey || (this.AltKey && this.AltGr)); - }; - CKeyboardEvent.prototype.IsShift = function() - { - return this.ShiftKey; - }; - CKeyboardEvent.prototype.IsAlt = function() - { - return this.AltKey; - }; - CKeyboardEvent.prototype.GetKeyCode = function() - { - return this.KeyCode; - }; - - - var global_mouseEvent = new CMouseEventHandler(); - var global_keyboardEvent = new CKeyboardEvent(); - - function check_KeyboardEvent(e) - { - global_keyboardEvent.AltKey = e.altKey; - global_keyboardEvent.AltGr = AscCommon.getAltGr(e); - global_keyboardEvent.CtrlKey = !global_keyboardEvent.AltGr && (e.metaKey || e.ctrlKey); - global_keyboardEvent.MacCmdKey = AscCommon.AscBrowser.isMacOs && e.metaKey; - - global_keyboardEvent.ShiftKey = e.shiftKey; - - global_keyboardEvent.Sender = (e.srcElement) ? e.srcElement : e.target; - - global_keyboardEvent.CharCode = e.charCode; - global_keyboardEvent.KeyCode = e.keyCode; - global_keyboardEvent.Which = e.which; - } - - function check_KeyboardEvent2(e) - { - global_keyboardEvent.AltKey = e.altKey; - - if (e.metaKey !== undefined) - global_keyboardEvent.CtrlKey = e.ctrlKey || e.metaKey; - else - global_keyboardEvent.CtrlKey = e.ctrlKey; - - global_keyboardEvent.MacCmdKey = AscCommon.AscBrowser.isMacOs && e.metaKey; - - global_keyboardEvent.ShiftKey = e.shiftKey; - - global_keyboardEvent.AltGr = (global_keyboardEvent.CtrlKey && global_keyboardEvent.AltKey) ? true : false; - - if (global_keyboardEvent.CtrlKey && global_keyboardEvent.AltKey) - global_keyboardEvent.CtrlKey = false; - } - - function check_MouseMoveEvent(e) - { - // если мышь залочена, то евент придет от окна. - if (e.IsLocked && !e.IsLockedEvent) - return; - - if (e.pageX || e.pageY) - { - global_mouseEvent.X = e.pageX; - global_mouseEvent.Y = e.pageY; - } - else if (e.clientX || e.clientY) - { - global_mouseEvent.X = e.clientX; - global_mouseEvent.Y = e.clientY; - } - - global_mouseEvent.X = (global_mouseEvent.X * AscBrowser.zoom) >> 0; - global_mouseEvent.Y = (global_mouseEvent.Y * AscBrowser.zoom) >> 0; - - global_mouseEvent.AltKey = e.altKey; - global_mouseEvent.ShiftKey = e.shiftKey; - global_mouseEvent.CtrlKey = e.ctrlKey || e.metaKey; - - global_mouseEvent.Type = g_mouse_event_type_move; - - if (!global_mouseEvent.IsLocked) - { - global_mouseEvent.Sender = (e.srcElement) ? e.srcElement : e.target; - } - - var _eps = 3 * global_mouseEvent.KoefPixToMM; - if ((Math.abs(global_mouseEvent.X - global_mouseEvent.LastX) > _eps) || (Math.abs(global_mouseEvent.Y - global_mouseEvent.LastY) > _eps)) - { - global_mouseEvent.LastClickTime = -1; - global_mouseEvent.ClickCount = 0; - } - } - - function CreateMouseUpEventObject(x, y) - { - var e = {}; - e.PageX = x; - e.PageY = y; - - e.altKey = global_mouseEvent.AltKey; - e.shiftKey = global_mouseEvent.ShiftKey; - e.ctrlKey = global_mouseEvent.CtrlKey; - - e.srcElement = global_mouseEvent.Sender; - e.button = 0; - return e; - } - - function getMouseButton(e) - { - var res = e.button; - return (res && -1 !== res) ? res : 0; - } - - function check_MouseUpEvent(e) - { - if (e.pageX || e.pageY) - { - global_mouseEvent.X = e.pageX; - global_mouseEvent.Y = e.pageY; - } - else if (e.clientX || e.clientY) - { - global_mouseEvent.X = e.clientX; - global_mouseEvent.Y = e.clientY; - } - - global_mouseEvent.X = (global_mouseEvent.X * AscBrowser.zoom) >> 0; - global_mouseEvent.Y = (global_mouseEvent.Y * AscBrowser.zoom) >> 0; - - global_mouseEvent.AltKey = e.altKey; - global_mouseEvent.ShiftKey = e.shiftKey; - global_mouseEvent.CtrlKey = e.ctrlKey || e.metaKey; - - global_keyboardEvent.AltKey = global_mouseEvent.AltKey; - global_keyboardEvent.ShiftKey = global_mouseEvent.ShiftKey; - global_keyboardEvent.CtrlKey = global_mouseEvent.CtrlKey; - - global_mouseEvent.Type = g_mouse_event_type_up; - global_mouseEvent.Button = getMouseButton(e); - - var lockedElement = null; - - var newSender = (e.srcElement) ? e.srcElement : e.target; - if (!newSender) - newSender = { id : "emulation_oo_id" }; - - if (global_mouseEvent.Sender && global_mouseEvent.Sender.id == newSender.id) - { - lockedElement = global_mouseEvent.Sender; - } - - if (global_mouseEvent.IsLocked == true && global_mouseEvent.Sender != newSender && false === MouseUpLock.MouseUpLockedSend) - { - Window_OnMouseUp(e); - } - MouseUpLock.MouseUpLockedSend = true; - global_mouseEvent.Sender = newSender; - - global_mouseEvent.UnLockMouse(); - - global_mouseEvent.IsPressed = false; - - return lockedElement; - } - - function check_MouseClickOnUp() - { - // call after check mouseUp - if (0 == global_mouseEvent.ClickCount) - return false; - - var _eps = 3 * global_mouseEvent.KoefPixToMM; - if ((Math.abs(global_mouseEvent.X - global_mouseEvent.LastX) > _eps) || (Math.abs(global_mouseEvent.Y - global_mouseEvent.LastY) > _eps)) - return false; - - var CurTime = new Date().getTime(); - if (500 < (CurTime - global_mouseEvent.LastClickTime)) - return false; - - return true; - } - - function check_MouseDownEvent(e, isClicks) - { - if (e.pageX || e.pageY) - { - global_mouseEvent.X = e.pageX; - global_mouseEvent.Y = e.pageY; - } - else if (e.clientX || e.clientY) - { - global_mouseEvent.X = e.clientX; - global_mouseEvent.Y = e.clientY; - } - - global_mouseEvent.X = (global_mouseEvent.X * AscBrowser.zoom) >> 0; - global_mouseEvent.Y = (global_mouseEvent.Y * AscBrowser.zoom) >> 0; - - var _eps = 3 * global_mouseEvent.KoefPixToMM; - if ((Math.abs(global_mouseEvent.X - global_mouseEvent.LastX) > _eps) || (Math.abs(global_mouseEvent.Y - global_mouseEvent.LastY) > _eps)) - { - // not only move!!! (touch - fast click in different places) - global_mouseEvent.LastClickTime = -1; - global_mouseEvent.ClickCount = 0; - } - - global_mouseEvent.LastX = global_mouseEvent.X; - global_mouseEvent.LastY = global_mouseEvent.Y; - - global_mouseEvent.AltKey = e.altKey; - global_mouseEvent.ShiftKey = e.shiftKey; - global_mouseEvent.CtrlKey = e.ctrlKey || e.metaKey; - - global_keyboardEvent.AltKey = global_mouseEvent.AltKey; - global_keyboardEvent.ShiftKey = global_mouseEvent.ShiftKey; - global_keyboardEvent.CtrlKey = global_mouseEvent.CtrlKey; - - global_mouseEvent.Type = g_mouse_event_type_down; - let oldButton = global_mouseEvent.Button; - global_mouseEvent.Button = getMouseButton(e); - - if (!global_mouseEvent.IsLocked || !global_mouseEvent.Sender) - global_mouseEvent.Sender = (e.srcElement) ? e.srcElement : e.target; - - if (isClicks) - { - var CurTime = new Date().getTime(); - if (0 === global_mouseEvent.ClickCount) - { - global_mouseEvent.ClickCount = 1; - global_mouseEvent.LastClickTime = CurTime; - } - else - { - if ((500 > (CurTime - global_mouseEvent.LastClickTime)) && oldButton === global_mouseEvent.Button) - { - global_mouseEvent.LastClickTime = CurTime; - global_mouseEvent.ClickCount++; - } - else - { - global_mouseEvent.ClickCount = 1; - global_mouseEvent.LastClickTime = CurTime; - } - } - } - else - { - global_mouseEvent.LastClickTime = -1; - global_mouseEvent.ClickCount = 1; - } - - MouseUpLock.MouseUpLockedSend = false; - } - - function check_MouseDownEvent2(x, y) - { - global_mouseEvent.X = x; - global_mouseEvent.Y = y; - - global_mouseEvent.LastX = global_mouseEvent.X; - global_mouseEvent.LastY = global_mouseEvent.Y; - - global_mouseEvent.Type = g_mouse_event_type_down; - - global_mouseEvent.Sender = editor.WordControl.m_oEditor.HtmlElement; - - global_mouseEvent.LastClickTime = -1; - global_mouseEvent.ClickCount = 1; - - MouseUpLock.MouseUpLockedSend = false; - } - - function global_OnMouseWheel(e) - { - global_mouseEvent.AltKey = e.altKey; - global_mouseEvent.ShiftKey = e.shiftKey; - global_mouseEvent.CtrlKey = e.ctrlKey || e.metaKey; - - if (undefined != e.wheelDelta) - global_mouseEvent.WheelDelta = (e.wheelDelta > 0) ? -45 : 45; - else - global_mouseEvent.WheelDelta = (e.detail > 0) ? 45 : -45; - - global_mouseEvent.type = g_mouse_event_type_wheel; - - global_mouseEvent.Sender = (e.srcElement) ? e.srcElement : e.target; - - global_mouseEvent.LastClickTime = -1; - global_mouseEvent.ClickCount = 0; - } - - function InitCaptureEvents() - { - AscCommon.addMouseEvent(window, "move", Window_OnMouseMove); - AscCommon.addMouseEvent(window, "up", Window_OnMouseUp); - } - - function Window_OnMouseMove(e) - { - if (!global_mouseEvent.IsLocked || !global_mouseEvent.Sender) - return; - - var types = isUsePointerEvents ? ["onpointermove", "onmousemove"] : ["onmousemove", "onpointermove"]; - for (var i = 0; i < 2; i++) - { - if (global_mouseEvent.Sender[types[i]]) - { - global_mouseEvent.IsLockedEvent = true; - global_mouseEvent.Sender[types[i]](e); - global_mouseEvent.IsLockedEvent = false; - break; - } - } - } - - function Window_OnMouseUp(e) - { - if (false === MouseUpLock.MouseUpLockedSend) - { - MouseUpLock.MouseUpLockedSend = true; - if (global_mouseEvent.IsLocked && global_mouseEvent.Sender) - { - var types = isUsePointerEvents ? ["onpointerup", "onmouseup"] : ["onmouseup", "onpointerup"]; - for (var i = 0; i < 2; i++) - { - if (global_mouseEvent.Sender[types[i]]) - { - global_mouseEvent.Sender[types[i]](e, true); - if (global_mouseEvent.IsLocked) - global_mouseEvent.UnLockMouse(); - break; - } - } - } - } - - if (window.g_asc_plugins) - window.g_asc_plugins.onExternalMouseUp(); - } - - InitCaptureEvents(); - - function button_eventHandlers(disable_pos, norm_pos, over_pos, down_pos, control, click_func_delegate) - { - this.state_normal = norm_pos; - this.state_over = over_pos; - this.state_down = down_pos; - - this.Click_func = click_func_delegate; - this.Control = control; - this.IsPressed = false; - - var oThis = this; - - this.Control.HtmlElement.onmouseover = function(e) - { - check_MouseMoveEvent(e); - - if (global_mouseEvent.IsLocked) - { - if (global_mouseEvent.Sender.id != oThis.Control.HtmlElement.id) - { - // это не залоченная кнопка - return; - } - // залоченная кнопка - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_down; - return; - } - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_over; - } - this.Control.HtmlElement.onmouseout = function(e) - { - check_MouseMoveEvent(e); - - if (global_mouseEvent.IsLocked) - { - if (global_mouseEvent.Sender.id != oThis.Control.HtmlElement.id) - { - // это не залоченная кнопка - return; - } - // залоченная кнопка - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_over; - return; - } - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_normal; - } - this.Control.HtmlElement.onmousedown = function(e) - { - check_MouseDownEvent(e); - global_mouseEvent.LockMouse(); - global_mouseEvent.buttonObject = oThis; - - AscCommon.stopEvent(e); - - if (global_mouseEvent.IsLocked) - { - if (global_mouseEvent.Sender.id != oThis.Control.HtmlElement.id) - { - // это не залоченная кнопка - return; - } - // залоченная кнопка - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_down; - return; - } - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_down; - } - this.Control.HtmlElement.onmouseup = function(e) - { - var lockedElement = check_MouseUpEvent(e); - - if (e.preventDefault) - e.preventDefault(); - else - e.returnValue = false; - - if (null != lockedElement && global_mouseEvent.buttonObject != null) - { - oThis.Click_func(); - } - - if (null != lockedElement) - { - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_over; - } - else - { - if (null != global_mouseEvent.buttonObject) - global_mouseEvent.buttonObject.Control.HtmlElement.style.backgroundPosition = global_mouseEvent.buttonObject.state_normal; - - if ((global_mouseEvent.buttonObject == null) || (oThis.Control.HtmlElement.id != global_mouseEvent.buttonObject.Control.HtmlElement.id)) - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_over; - } - global_mouseEvent.buttonObject = null; - } - - // теперь touch - this.Control.HtmlElement.ontouchstart = function(e) - { - oThis.Control.HtmlElement.onmousedown(e.touches[0]); - return false; - } - this.Control.HtmlElement.ontouchend = function(e) - { - var lockedElement = check_MouseUpEvent(e.changedTouches[0]); - - if (null != lockedElement) - { - oThis.Click_func(); - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_normal; - } - else - { - if (null != global_mouseEvent.buttonObject) - global_mouseEvent.buttonObject.Control.HtmlElement.style.backgroundPosition = global_mouseEvent.buttonObject.state_normal; - - if (oThis.Control.HtmlElement.id != global_mouseEvent.buttonObject.Control.HtmlElement.id) - oThis.Control.HtmlElement.style.backgroundPosition = oThis.state_normal; - } - global_mouseEvent.buttonObject = null; - return false; - } - } - - function emulateKeyDown(_code, _element) - { - var oEvent = document.createEvent('KeyboardEvent'); - - // Chromium Hack - Object.defineProperty(oEvent, 'keyCode', { - get : function() - { - return this.keyCodeVal; - } - }); - Object.defineProperty(oEvent, 'which', { - get : function() - { - return this.keyCodeVal; - } - }); - Object.defineProperty(oEvent, 'shiftKey', { - get : function() - { - return false; - } - }); - Object.defineProperty(oEvent, 'altKey', { - get : function() - { - return false; - } - }); - Object.defineProperty(oEvent, 'metaKey', { - get : function() - { - return false; - } - }); - Object.defineProperty(oEvent, 'ctrlKey', { - get : function() - { - return false; - } - }); - - if (AscCommon.AscBrowser.isIE) - { - oEvent.preventDefault = function () { - Object.defineProperty(this, "defaultPrevented", {get: function () {return true;}}); - }; - } - - if (oEvent.initKeyboardEvent) - { - oEvent.initKeyboardEvent("keydown", true, true, window, false, false, false, false, _code, _code); - } - else - { - oEvent.initKeyEvent("keydown", true, true, window, false, false, false, false, _code, 0); - } - - oEvent.keyCodeVal = _code; - - _element.dispatchEvent(oEvent); - return oEvent.defaultPrevented; - } - - //--------------------------------------------------------export---------------------------------------------------- - window['AscCommon'] = window['AscCommon'] || {}; - window['AscCommon'].g_mouse_event_type_down = g_mouse_event_type_down; - window['AscCommon'].g_mouse_event_type_move = g_mouse_event_type_move; - window['AscCommon'].g_mouse_event_type_up = g_mouse_event_type_up; - window['AscCommon'].g_mouse_button_left = g_mouse_button_left; - window['AscCommon'].g_mouse_button_center = g_mouse_button_center; - window['AscCommon'].g_mouse_button_right = g_mouse_button_right; - window['AscCommon'].MouseUpLock = MouseUpLock; - window['AscCommon'].CMouseEventHandler = CMouseEventHandler; - window['AscCommon'].CKeyboardEvent = CKeyboardEvent; - window['AscCommon'].global_mouseEvent = global_mouseEvent; - window['AscCommon'].global_keyboardEvent = global_keyboardEvent; - window['AscCommon'].check_KeyboardEvent = check_KeyboardEvent; - window['AscCommon'].check_KeyboardEvent2 = check_KeyboardEvent2; - window['AscCommon'].check_MouseMoveEvent = check_MouseMoveEvent; - window['AscCommon'].CreateMouseUpEventObject = CreateMouseUpEventObject; - window['AscCommon'].getMouseButton = getMouseButton; - window['AscCommon'].check_MouseUpEvent = check_MouseUpEvent; - window['AscCommon'].check_MouseDownEvent = check_MouseDownEvent; - window['AscCommon'].Window_OnMouseUp = Window_OnMouseUp; - window['AscCommon'].button_eventHandlers = button_eventHandlers; - window['AscCommon'].emulateKeyDown = emulateKeyDown; - window['AscCommon'].check_MouseClickOnUp = check_MouseClickOnUp; - -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/api.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/api.js deleted file mode 100644 index 31860f6cd3..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/api.js +++ /dev/null @@ -1,282 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -(function(){ - - function setCanvasSize(element, width, height, is_correction) - { - if (element.width === width && element.height === height) - return; - - if (true !== is_correction) - { - element.width = width; - element.height = height; - return; - } - - var data = element.getContext("2d").getImageData(0, 0, element.width, element.height); - element.width = width; - element.height = height; - element.getContext("2d").putImageData(data, 0, 0); - }; - - AscCommon.calculateCanvasSize = function(element, is_correction, is_wait_correction) - { - if (true !== is_correction && undefined !== element.correctionTimeout) - { - clearTimeout(element.correctionTimeout); - element.correctionTimeout = undefined; - } - - var scale = AscCommon.AscBrowser.retinaPixelRatio; - if (Math.abs(scale - (scale >> 0)) < 0.001) - { - setCanvasSize(element, - scale * parseInt(element.style.width), - scale * parseInt(element.style.height), - is_correction); - return; - } - - var rect = element.getBoundingClientRect(); - var isCorrectRect = (rect.width === 0 && rect.height === 0) ? false : true; - if (is_wait_correction || !isCorrectRect) - { - var isNoVisibleElement = false; - if (element.style.display === "none") - isNoVisibleElement = true; - else if (element.parentNode && element.parentNode.style.display === "none") - isNoVisibleElement = true; - - if (!isNoVisibleElement) - { - element.correctionTimeout = setTimeout(function (){ - AscCommon.calculateCanvasSize(element, true); - }, 100); - } - - if (!isCorrectRect) - { - var style_width = parseInt(element.style.width); - var style_height = parseInt(element.style.height); - - rect = { - x: 0, left: 0, - y: 0, top: 0, - width: style_width, right: style_width, - height: style_height, bottom: style_height - }; - } - } - - setCanvasSize(element, - Math.round(scale * rect.right) - Math.round(scale * rect.left), - Math.round(scale * rect.bottom) - Math.round(scale * rect.top), - is_correction); - }; - - function loadScript(url, onSuccess, onError) - { - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.src = url; - script.onload = onSuccess; - script.onerror = onError; - - document.head.appendChild(script); - } - - var documentScriptUrl = document.currentScript ? document.currentScript.src : ""; - - function CViewer(parent, options) - { - this.isLoadAllFonts = (AscFonts.g_font_files.length > 1) ? true : false; - this.allFontsUrl = ""; - this.fontsErrorCounter = 0; - this.fontsErrorMax = 3; - - this.options = options; - this.api = this.checkOptions(); - - this.viewer = new AscCommon.CViewer(parent, this.api); - } - - CViewer.prototype.isInitFonts = false; - CViewer.prototype["open"] = function(data) - { - if (!this.isLoadAllFonts && this.allFontsUrl !== "") - { - this.data = data; - this.checkFonts(); - return; - } - - this.initFonts(); - this.viewer.open(data); - }; - CViewer.prototype["createThumbnails"] = function(parent) - { - var oThumbnails = new AscCommon.ThumbnailsControl(parent) - this.viewer.setThumbnailsControl(oThumbnails); - return oThumbnails; - }; - CViewer.prototype["registerEvent"] = function(name, callback) - { - this.viewer.registerEvent(name, callback); - }; - CViewer.prototype["resize"] = function() - { - this.viewer.resize(); - }; - CViewer.prototype["navigate"] = function(node) - { - return this.viewer.navigate(node); - }; - CViewer.prototype["getEngine"] = function() - { - return this.viewer; - }; - - // private - CViewer.prototype.initFonts = function() - { - if (!this.isInitFonts) - { - this.isInitFonts = true; - AscFonts.checkAllFonts(); - AscFonts.g_fontApplication.Init(); - - AscCommon.g_font_loader.fontFiles = AscFonts.g_font_files; - AscCommon.g_font_loader.fontInfos = AscFonts.g_font_infos; - AscCommon.g_font_loader.map_font_index = AscFonts.g_map_font_index; - } - }; - CViewer.prototype.checkFonts = function() - { - var onSuccess = function() { - this.isLoadAllFonts = true; - this.open(this.data); - delete this.data; - }; - var onError = function() { - this.fontsErrorCounter++; - if (this.fontsErrorCounter === this.fontsErrorMax) - { - console.error("cannot load AllFonts.js"); - return; - } - this.checkFonts(); - }; - - loadScript(this.allFontsUrl, onSuccess.bind(this), onError.bind(this)); - }; - CViewer.prototype.checkOptions = function() - { - if (this.options) - { - var sAllFontsUrl = ""; - var sModuleUrl = ""; - var sFontsPath = ""; - - if (this.options["sdkjsPath"]) - { - sAllFontsUrl = this.options["sdkjsPath"] + "/common/AllFonts.js"; - sModuleUrl = this.options["sdkjsPath"] + "/pdf/src/engine/"; - sFontsPath = this.options["sdkjsPath"] + "/../fonts/" - } - - if (this.options["enginePath"]) - sModuleUrl = this.options["enginePath"]; - - if (this.options["fontsPath"]) - sFontsPath = this.options["fontsPath"]; - - if (documentScriptUrl !== "") - { - var scriptDirectory = documentScriptUrl; - scriptDirectory = scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/") + 1); - - if (sAllFontsUrl === "") - sAllFontsUrl = scriptDirectory + "../../../common/AllFonts.js"; - if (sModuleUrl === "") - sModuleUrl = scriptDirectory; - if (sFontsPath === "") - sFontsPath = scriptDirectory + "../../../../fonts/"; - } - - this.allFontsUrl = sAllFontsUrl; - - if (sModuleUrl !== "") - window["AscViewer"]["baseEngineUrl"] = sModuleUrl; - - if (sFontsPath !== "") - AscCommon.g_font_loader.fontFilesPath = sFontsPath; - - if (this.options["theme"]) - AscCommon.updateGlobalSkin(this.options["theme"]); - } - - return { - isMobileVersion : false, - isSeparateModule : true, - - baseFontsPath : (this.options && this.options["fontsPath"]) ? this.options["fontsPath"] : undefined, - - getPageBackgroundColor : function() { - // TODO: get color from theme - if (this.isDarkMode) - return [0x3A, 0x3A, 0x3A]; - return [0xFF, 0xFF, 0xFF]; - }, - - WordControl : { - NoneRepaintPages : false - }, - - sendEvent : function() { - } - }; - }; - - window["AscViewer"] = window["AscViewer"] || {}; - window["AscViewer"]["CViewer"] = CViewer; - - window["AscViewer"]["checkApplicationScale"] = function() - { - var zoomValue = AscCommon.checkDeviceScale(); - AscCommon.AscBrowser.retinaPixelRatio = zoomValue.applicationPixelRatio; - AscCommon.AscBrowser.zoom = zoomValue.zoom; - AscCommon.correctApplicationScale(zoomValue); - }; - -})(); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/bookmarks.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/bookmarks.js deleted file mode 100644 index 4afcc94c6b..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/bookmarks.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -window.AscInterface = window.AscInterface || {}; - -AscInterface.updateStructure = function(structure) -{ - var elem = document.getElementById("bookmarksTree"); - elem.innerHTML = ""; - - if (!structure) - return; - - var jsonStructure = { children: [], parent: jsonStructure }; - var currentLevel = 0; - var currentElement = jsonStructure; - var parent, newElem, item, level; - - function makeFolder(obj) { - obj.open = false; - obj.type = Tree.FOLDER; - obj.selected = true; - } - - for (var len = structure.length, index = 0; index < len; index++) - { - item = structure[index]; - level = item.level; - if (currentLevel == level) - { - // такой же уровень - общий родитель - parent = currentElement.parent; - } - else if ((currentLevel + 1) == level) - { - // следующий уровень - parent = currentElement; - } - else - { - // возврат на нужный уровень - parent = currentElement; - while (level < parent.level) - parent = parent.parent; - parent = parent.parent; - } - - newElem = { name: item.description, id: index, children : [], parent: parent, level : level }; - parent.children.push(newElem); - makeFolder(parent); - currentLevel = item.level; - currentElement = newElem; - } - - var treeElem = new Tree(elem, { navigate: true }); - treeElem.json(jsonStructure.children); - - // подписываемся после - treeElem.on('select', function(node) { - window.Viewer.navigate(parseInt(node.getAttribute("nodeId"))); - }); -}; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/browser.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/browser.js deleted file mode 100644 index a2c706dd0c..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/browser.js +++ /dev/null @@ -1,203 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; -( -/** -* @param {Window} window -* @param {undefined} undefined -*/ -function (window, undefined) { -var AscBrowser = { - userAgent : "", - isIE : false, - isMacOs : false, - isSafariMacOs : false, - isAppleDevices : false, - isAndroid : false, - isMobile : false, - isGecko : false, - isChrome : false, - isOpera : false, - isOperaOld : false, - isWebkit : false, - isSafari : false, - isArm : false, - isMozilla : false, - isLinuxOS : false, - retinaPixelRatio : 1, - isVivaldiLinux : false, - isSailfish : false, - isEmulateDevicePixelRatio : false, - isNeedEmulateUpload : false, - chromeVersion : 70, - iosVersion : 13, - isAndroidNativeApp : false -}; - -// user agent lower case -AscBrowser.userAgent = navigator.userAgent.toLowerCase(); - -// ie detect -AscBrowser.isIE = (AscBrowser.userAgent.indexOf("msie") > -1 || - AscBrowser.userAgent.indexOf("trident") > -1 || - AscBrowser.userAgent.indexOf("edge") > -1); - -AscBrowser.isIeEdge = (AscBrowser.userAgent.indexOf("edge/") > -1); - -AscBrowser.isIE9 = (AscBrowser.userAgent.indexOf("msie9") > -1 || AscBrowser.userAgent.indexOf("msie 9") > -1); -AscBrowser.isIE10 = (AscBrowser.userAgent.indexOf("msie10") > -1 || AscBrowser.userAgent.indexOf("msie 10") > -1); - -// macOs detect -AscBrowser.isMacOs = (AscBrowser.userAgent.indexOf('mac') > -1); - -// chrome detect -AscBrowser.isChrome = !AscBrowser.isIE && (AscBrowser.userAgent.indexOf("chrome") > -1); -if (AscBrowser.isChrome) -{ - var checkVersion = AscBrowser.userAgent.match(/chrom(e|ium)\/([0-9]+)\./); - if (checkVersion && checkVersion[2]) - AscBrowser.chromeVersion = parseInt(checkVersion[2], 10); -} - -// safari detect -AscBrowser.isSafari = !AscBrowser.isIE && !AscBrowser.isChrome && (AscBrowser.userAgent.indexOf("safari") > -1); - -// macOs safari detect -AscBrowser.isSafariMacOs = (AscBrowser.isSafari && AscBrowser.isMacOs); - -// apple devices detect -AscBrowser.isAppleDevices = (AscBrowser.userAgent.indexOf("ipad") > -1 || - AscBrowser.userAgent.indexOf("iphone") > -1 || - AscBrowser.userAgent.indexOf("ipod") > -1); -if (!AscBrowser.isAppleDevices && AscBrowser.isSafariMacOs && navigator.platform === "MacIntel" && (navigator.maxTouchPoints > 1)) - AscBrowser.isAppleDevices = true; - -if (AscBrowser.isAppleDevices) -{ - var iosversion = AscBrowser.iosVersion; - try - { - var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/); - if (!v) v = (navigator.appVersion).match(/Version\/(\d+).(\d+)/); - //[parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)]; - iosversion = parseInt(v[1], 10); - } - catch (err) - { - } - AscBrowser.iosVersion = iosversion; -} - -// android devices detect -AscBrowser.isAndroid = (AscBrowser.userAgent.indexOf("android") > -1); - -// mobile detect -AscBrowser.isMobile = /android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent || navigator.vendor || window.opera); - -// gecko detect -AscBrowser.isGecko = (AscBrowser.userAgent.indexOf("gecko/") > -1); - -// opera detect -AscBrowser.isOpera = (!!window.opera || AscBrowser.userAgent.indexOf("opr/") > -1); -AscBrowser.isOperaOld = (!!window.opera); - -// webkit detect -AscBrowser.isWebkit = !AscBrowser.isIE && (AscBrowser.userAgent.indexOf("webkit") > -1); - -// arm detect -AscBrowser.isArm = (AscBrowser.userAgent.indexOf("arm") > -1); - -AscBrowser.isMozilla = !AscBrowser.isIE && (AscBrowser.userAgent.indexOf("firefox") > -1); - -AscBrowser.isLinuxOS = (AscBrowser.userAgent.indexOf(" linux ") > -1); - -AscBrowser.isVivaldiLinux = AscBrowser.isLinuxOS && (AscBrowser.userAgent.indexOf("vivaldi") > -1); - -AscBrowser.isSailfish = (AscBrowser.userAgent.indexOf("sailfish") > -1); - -AscBrowser.isEmulateDevicePixelRatio = (AscBrowser.userAgent.indexOf("emulatedevicepixelratio") > -1); - -AscBrowser.isNeedEmulateUpload = (AscBrowser.userAgent.indexOf("needemulateupload") > -1); - -AscBrowser.isAndroidNativeApp = (AscBrowser.userAgent.indexOf("ascandroidwebview") > -1); - -AscBrowser.zoom = 1; - -AscBrowser.isCustomScaling = function() -{ - return (Math.abs(AscBrowser.retinaPixelRatio - 1) > 0.001) ? true : false; -}; - -AscBrowser.isCustomScalingAbove2 = function() -{ - return (AscBrowser.retinaPixelRatio > 1.999) ? true : false; -}; - -AscBrowser.checkZoom = function() -{ - if (AscBrowser.isSailfish && AscBrowser.isEmulateDevicePixelRatio) - { - var scale = 1; - if (screen.width <= 540) - scale = 1.5; - else if (screen.width > 540 && screen.width <= 768) - scale = 2; - else if (screen.width > 768) - scale = 3; - - AscBrowser.retinaPixelRatio = scale; - window.devicePixelRatio = scale; - return; - } - - var zoomValue = AscCommon.checkDeviceScale(); - AscBrowser.retinaPixelRatio = zoomValue.applicationPixelRatio; - AscBrowser.zoom = zoomValue.zoom; - - AscCommon.correctApplicationScale(zoomValue); -}; - -AscBrowser.checkZoom(); - -AscBrowser.convertToRetinaValue = function(value, isScale) -{ - if (isScale === true) - return ((value * AscBrowser.retinaPixelRatio) + 0.5) >> 0; - else - return ((value / AscBrowser.retinaPixelRatio) + 0.5) >> 0; -}; - - //--------------------------------------------------------export---------------------------------------------------- - window['AscCommon'] = window['AscCommon'] || {}; - window['AscCommon'].AscBrowser = AscBrowser; -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/device_scale.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/device_scale.js deleted file mode 100644 index 6e01a79ab5..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/device_scale.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; -(function (window, undefined) { - var supportedScaleValues = [1, 1.25, 1.5, 1.75, 2, 2.5, 3, 3.5, 4, 4.5, 5]; - if (window["AscDesktopEditor"] && window["AscDesktopEditor"]["GetSupportedScaleValues"]) - supportedScaleValues = window["AscDesktopEditor"]["GetSupportedScaleValues"](); - - // uncomment to debug all scales - //supportedScaleValues = []; - - var isCorrectApplicationScaleEnabled = (function(){ - - if (supportedScaleValues.length === 0) - return false; - - var userAgent = navigator.userAgent.toLowerCase(); - var isAndroid = (userAgent.indexOf("android") > -1); - var isIE = (userAgent.indexOf("msie") > -1 || userAgent.indexOf("trident") > -1 || userAgent.indexOf("edge") > -1); - var isChrome = !isIE && (userAgent.indexOf("chrome") > -1); - var isOperaOld = (!!window.opera); - var isMobile = /android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent || navigator.vendor || window.opera); - - if (isAndroid || !isChrome || isOperaOld || isMobile || !document || !document.firstElementChild || !document.body) - return false; - - return true; - - })(); - - window['AscCommon'] = window['AscCommon'] || {}; - window['AscCommon'].checkDeviceScale = function() - { - var retValue = { - zoom: 1, - devicePixelRatio: window.devicePixelRatio, - applicationPixelRatio: window.devicePixelRatio, - correct : false - }; - - if (!isCorrectApplicationScaleEnabled) - return retValue; - - var systemScaling = window.devicePixelRatio; - var bestIndex = 0; - var bestDistance = Math.abs(supportedScaleValues[0] - systemScaling); - var currentDistance = 0; - for (var i = 1, len = supportedScaleValues.length; i < len; i++) - { - if (true) - { - // это "подстройка под интерфейс" - после убирания этого в общий код - удалить - if (Math.abs(supportedScaleValues[i] - systemScaling) > 0.0001) - { - if (supportedScaleValues[i] > (systemScaling - 0.0001)) - break; - } - } - - currentDistance = Math.abs(supportedScaleValues[i] - systemScaling); - if (currentDistance < (bestDistance - 0.0001)) - { - bestDistance = currentDistance; - bestIndex = i; - } - } - - retValue.applicationPixelRatio = supportedScaleValues[bestIndex]; - if (Math.abs(retValue.devicePixelRatio - retValue.applicationPixelRatio) > 0.01) - { - retValue.zoom = retValue.devicePixelRatio / retValue.applicationPixelRatio; - retValue.correct = true; - } - return retValue; - }; - - var oldZoomValue = 1; - window['AscCommon'].correctApplicationScale = function(zoomValue) - { - if (!zoomValue.correct && Math.abs(zoomValue.zoom - oldZoomValue) < 0.0001) - return; - oldZoomValue = zoomValue.zoom; - var firstElemStyle = document.firstElementChild.style; - if (Math.abs(oldZoomValue - 1) < 0.001) - firstElemStyle.zoom = "normal"; - else - firstElemStyle.zoom = 1.0 / oldZoomValue; - }; -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/file.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/file.js deleted file mode 100644 index b45fb04615..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/file.js +++ /dev/null @@ -1,2460 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -(function(window, undefined) { - - function TextStreamReader(data, size) - { - this.data = data; - this.size = size; - this.pos = 0; - - this.Seek = function(pos) - { - if (pos > this.size) - return 1; - this.pos = pos; - return 0; - }; - this.Skip = function(skip) - { - return this.Seek(this.pos + skip); - }; - - // 1 bytes - this.GetUChar = function() - { - if (this.pos >= this.size) - return 0; - return this.data[this.pos++]; - }; - this.GetChar = function() - { - if (this.pos >= this.size) - return 0; - var m = this.data[this.pos++]; - if (m > 0x7F) - m -= 256; - return m; - }; - - // 2 byte - this.GetUShort = function() - { - if (this.pos + 1 >= this.size) - return 0; - return (this.data[this.pos++] | this.data[this.pos++] << 8); - }; - this.GetShort = function() - { - if (this.pos + 1 >= this.size) - return 0; - var _c = (this.data[this.pos++] | this.data[this.pos++] << 8); - - if (_c > 0x7FFF) - return _c - 65536; - return _c; - }; - - // 4 byte - this.GetULong = function() - { - if (this.pos + 3 >= this.size) - return 0; - var s = (this.data[this.pos++] | this.data[this.pos++] << 8 | this.data[this.pos++] << 16 | this.data[this.pos++] << 24); - if (s < 0) - s += (0xFFFFFFFF + 1); - return s; - }; - this.GetLong = function() - { - return (this.data[this.pos++] | this.data[this.pos++] << 8 | this.data[this.pos++] << 16 | this.data[this.pos++] << 24); - }; - - // double - this.GetDouble = function() - { - return this.GetLong() / 10000; - }; - this.GetDouble2 = function() - { - return this.GetShort() / 100; - }; - } - - function CSpan() - { - this.fontName = 0; - this.fontSize = 0; - - this.colorR = 0; - this.colorG = 0; - this.colorB = 0; - - this.inner = ""; - - this.CreateDublicate = function() - { - var ret = new CSpan(); - - ret.fontName = this.fontName; - ret.fontSize = this.fontSize; - - ret.colorR = this.colorR; - ret.colorG = this.colorG; - ret.colorB = this.colorB; - - ret.inner = this.inner; - - return ret; - } - } - - var supportImageDataConstructor = (AscCommon.AscBrowser.isIE && !AscCommon.AscBrowser.isIeEdge) ? false : true; - - function CFile() - { - this.nativeFile = 0; - this.pages = []; - this.zoom = 1; - this.isUse3d = false; - this.cacheManager = null; - this.logging = true; - - this.Selection = { - Page1 : 0, - Line1 : 0, - Glyph1 : 0, - - Page2 : 0, - Line2 : 0, - Glyph2 : 0, - - IsSelection : false - }; - this.SearchResults = { - IsSearch : false, - Text : "", - MachingCase : false, - Pages : [], - CurrentPage : -1, - Current : -1, - Show : false, - Count : 0 - }; - this.viewer = null; - - this.maxCanvasSize = 0; - if (AscCommon.AscBrowser.isAppleDevices || AscCommon.AscBrowser.isAndroid) - this.maxCanvasSize = 4096; - } - - // interface - CFile.prototype.close = function() - { - if (this.nativeFile) - { - this.nativeFile["close"](); - this.nativeFile = null; - this.pages = []; - } - }; - CFile.prototype.getFileBinary = function() - { - return this.nativeFile ? this.nativeFile["getFileAsBase64"]() : null; - }; - CFile.prototype.memory = function() - { - return this.nativeFile ? this.nativeFile["memory"]() : null; - }; - CFile.prototype.free = function(pointer) - { - this.nativeFile && this.nativeFile["free"](pointer); - }; - CFile.prototype.getStructure = function() - { - return this.nativeFile ? this.nativeFile["getStructure"]() : []; - }; - CFile.prototype.getDocumentInfo = function() - { - return this.nativeFile ? this.nativeFile["getDocumentInfo"]() : null; - }; - CFile.prototype.isNeedCMap = function() - { - return this.nativeFile ? this.nativeFile["isNeedCMap"]() : false; - }; - CFile.prototype.setCMap = function(data) - { - if (this.nativeFile) - this.nativeFile["setCMap"](data); - }; - - CFile.prototype.getPage = function(pageIndex, width, height, isNoUseCacheManager, backgroundColor) - { - if (!this.nativeFile) - return null; - if (pageIndex < 0 || pageIndex >= this.pages.length) - return null; - - if (!width) width = this.pages[pageIndex].W; - if (!height) height = this.pages[pageIndex].H; - - var requestW = width; - var requestH = height; - - if (this.maxCanvasSize > 0) - { - if (width > this.maxCanvasSize || height > this.maxCanvasSize) - { - var maxKoef = Math.max(width / this.maxCanvasSize, height / this.maxCanvasSize); - width = (0.5 + (width / maxKoef)) >> 0; - height = (0.5 + (height / maxKoef)) >> 0; - - if (width > this.maxCanvasSize) width = this.maxCanvasSize; - if (height > this.maxCanvasSize) height = this.maxCanvasSize; - } - } - - var t0 = performance.now(); - var pixels = this.nativeFile["getPagePixmap"](pageIndex, width, height, backgroundColor); - if (!pixels) - return null; - - var image = null; - if (!this.logging) - { - image = this._pixelsToCanvas(pixels, width, height, isNoUseCacheManager); - } - else - { - var t1 = performance.now(); - image = this._pixelsToCanvas(pixels, width, height, isNoUseCacheManager); - var t2 = performance.now(); - //console.log("time: " + (t1 - t0) + ", " + (t2 - t1)); - } - this.free(pixels); - - image.requestWidth = requestW; - image.requestHeight = requestH; - return image; - }; - - CFile.prototype.getLinks = function(pageIndex) - { - return this.nativeFile ? this.nativeFile["getLinks"](pageIndex) : []; - }; - - CFile.prototype.getText = function(pageIndex) - { - return this.nativeFile ? this.nativeFile["getGlyphs"](pageIndex) : []; - }; - - CFile.prototype.destroyText = function() - { - if (this.nativeFile) - this.nativeFile["destroyTextInfo"](); - }; - - CFile.prototype.getPageBase64 = function(pageIndex, width, height) - { - var _canvas = this.getPage(pageIndex, width, height); - if (!_canvas) - return ""; - - try - { - return _canvas.toDataURL("image/png"); - } - catch (err) - { - } - - return ""; - }; - CFile.prototype.isValid = function() - { - return this.pages.length > 0; - }; - - // private functions - CFile.prototype._pixelsToCanvas2d = function(pixels, width, height, isNoUseCacheManager) - { - var canvas = null; - if (this.cacheManager && isNoUseCacheManager !== true) - { - canvas = this.cacheManager.lock(width, height); - } - else - { - canvas = document.createElement("canvas"); - canvas.width = width; - canvas.height = height; - } - - var ctx = canvas.getContext("2d"); - var mappedBuffer = new Uint8ClampedArray(this.memory().buffer, pixels, 4 * width * height); - var imageData = null; - if (supportImageDataConstructor) - { - imageData = new ImageData(mappedBuffer, width, height); - } - else - { - imageData = ctx.createImageData(width, height); - imageData.data.set(mappedBuffer, 0); - } - if (ctx) - ctx.putImageData(imageData, 0, 0); - return canvas; - }; - - CFile.prototype._pixelsToCanvas3d = function(pixels, width, height, isNoUseCacheManager) - { - var vs_source = "\ -attribute vec2 aVertex;\n\ -attribute vec2 aTex;\n\ -varying vec2 vTex;\n\ -void main() {\n\ - gl_Position = vec4(aVertex, 0.0, 1.0);\n\ - vTex = aTex;\n\ -}"; - - var fs_source = "\ -precision mediump float;\n\ -uniform sampler2D uTexture;\n\ -varying vec2 vTex;\n\ -void main() {\n\ - gl_FragColor = texture2D(uTexture, vTex);\n\ -}"; - var canvas = null; - if (this.cacheManager && isNoUseCacheManager !== true) - { - canvas = this.cacheManager.lock(width, height); - } - else - { - canvas = document.createElement("canvas"); - canvas.width = width; - canvas.height = height; - } - - var gl = canvas.getContext('webgl', { preserveDrawingBuffer : true }); - if (!gl) - throw new Error('FAIL: could not create webgl canvas context'); - - var colorCorrect = gl.BROWSER_DEFAULT_WEBGL; - gl.pixelStorei(gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, colorCorrect); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); - - gl.viewport(0, 0, canvas.width, canvas.height); - gl.clearColor(0, 0, 0, 1); - gl.clear(gl.COLOR_BUFFER_BIT); - - if (gl.getError() != gl.NONE) - throw new Error('FAIL: webgl canvas context setup failed'); - - function createShader(source, type) { - var shader = gl.createShader(type); - gl.shaderSource(shader, source); - gl.compileShader(shader); - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) - throw new Error('FAIL: shader compilation failed'); - return shader; - } - - var program = gl.createProgram(); - gl.attachShader(program, createShader(vs_source, gl.VERTEX_SHADER)); - gl.attachShader(program, createShader(fs_source, gl.FRAGMENT_SHADER)); - gl.linkProgram(program); - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) - throw new Error('FAIL: webgl shader program linking failed'); - gl.useProgram(program); - - var texture = gl.createTexture(); - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(this.memory().buffer, pixels, 4 * width * height)); - - if (gl.getError() != gl.NONE) - throw new Error('FAIL: creating webgl image texture failed'); - - function createBuffer(data) { - var buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW); - return buffer; - } - - var vertexCoords = new Float32Array([-1, 1, -1, -1, 1, -1, 1, 1]); - var vertexBuffer = createBuffer(vertexCoords); - var location = gl.getAttribLocation(program, 'aVertex'); - gl.enableVertexAttribArray(location); - gl.vertexAttribPointer(location, 2, gl.FLOAT, false, 0, 0); - - if (gl.getError() != gl.NONE) - throw new Error('FAIL: vertex-coord setup failed'); - - var texCoords = new Float32Array([0, 1, 0, 0, 1, 0, 1, 1]); - var texBuffer = createBuffer(texCoords); - var location = gl.getAttribLocation(program, 'aTex'); - gl.enableVertexAttribArray(location); - gl.vertexAttribPointer(location, 2, gl.FLOAT, false, 0, 0); - - if (gl.getError() != gl.NONE) - throw new Error('FAIL: tex-coord setup setup failed'); - - gl.drawArrays(gl.TRIANGLE_FAN, 0, 4); - return canvas; - }; - - CFile.prototype._pixelsToCanvas = function(pixels, width, height, isNoUseCacheManager) - { - if (!this.isUse3d) - { - return this._pixelsToCanvas2d(pixels, width, height, isNoUseCacheManager); - } - - try - { - return this._pixelsToCanvas3d(pixels, width, height, isNoUseCacheManager); - } - catch (err) - { - this.isUse3d = false; - if (this.cacheManager) - this.cacheManager.clear(); - return this._pixelsToCanvas(pixels, width, height, isNoUseCacheManager); - } - }; - - CFile.prototype.isNeedPassword = function() - { - return this.nativeFile ? this.nativeFile["isNeedPassword"]() : false; - }; - - // TEXT - CFile.prototype.logTextCommands = function(commands) - { - var stream = new TextStreamReader(commands, commands.length); - var lineCharCount = 0; - var lineGidExist = false; - var lineText = ""; - while (stream.pos < stream.size) - { - var command = stream.GetUChar(); - - switch (command) - { - case 41: // ctFontName - { - stream.Skip(12); - break; - } - case 22: // ctBrushColor1 - { - stream.Skip(4); - break; - } - case 80: // ctDrawText - { - if (0 != lineCharCount) - stream.Skip(2); - - lineCharCount++; - - var char = stream.GetUShort(); - if (char !== 0xFFFF) - lineText += String.fromCharCode(char); - if (lineGidExist) - stream.Skip(2); - - stream.Skip(2); - break; - } - case 160: // ctCommandTextLine - { - lineText = ""; - lineCharCount = 0; - var mask = stream.GetUChar(); - stream.Skip(8); - - if ((mask & 0x01) == 0) - { - stream.Skip(8); - } - - stream.Skip(8); - - if ((mask & 0x04) != 0) - stream.Skip(4); - - if ((mask & 0x02) != 0) - lineGidExist = true; - else - lineGidExist = false; - - break; - } - case 161: // ctCommandTextTransform - { - // text transform - stream.Skip(16); - break; - } - case 162: // ctCommandTextLineEnd - { - console.log(lineText); - break; - } - default: - { - stream.pos = stream.size; - } - } - } - }; - - CFile.prototype.onMouseDown = function(pageIndex, x, y) - { - var ret = this.getNearestPos(pageIndex, x, y); - var sel = this.Selection; - - sel.Page1 = pageIndex; - sel.Line1 = ret.Line; - sel.Glyph1 = ret.Glyph; - - sel.Page2 = pageIndex; - sel.Line2 = ret.Line; - sel.Glyph2 = ret.Glyph; - - sel.IsSelection = true; - - this.onUpdateSelection(); - this.onUpdateOverlay(); - }; - - CFile.prototype.onMouseMove = function(pageIndex, x, y) - { - if (false === this.Selection.IsSelection) - return; - - var ret = this.getNearestPos(pageIndex, x, y); - var sel = this.Selection; - - sel.Page2 = pageIndex; - sel.Line2 = ret.Line; - sel.Glyph2 = ret.Glyph; - - this.onUpdateOverlay(); - }; - - CFile.prototype.onMouseUp = function() - { - this.Selection.IsSelection = false; - this.onUpdateSelection(); - this.onUpdateOverlay(); - }; - - CFile.prototype.getPageTextStream = function(pageIndex) - { - var textCommands = this.pages[pageIndex].text; - if (!textCommands) - return null; - - return new TextStreamReader(textCommands, textCommands.length); - }; - - CFile.prototype.getNearestPos = function(pageIndex, x, y) - { - var stream = this.getPageTextStream(pageIndex); - if (!stream) - return { Line : -1, Glyph : -1 }; - - // textline parameters - var _line = -1; - var _glyph = -1; - var _minDist = 0xFFFFFF; - - // textline parameters - var _lineX = 0; - var _lineY = 0; - var _lineEx = 0; - var _lineEy = 0; - var _lineAscent = 0; - var _lineDescent = 0; - var _lineWidth = 0; - var _lineGidExist = false; - var _linePrevCharX = 0; - var _lineCharCount = 0; - var _lineLastGlyphWidth = 0; - var _arrayGlyphOffsets = []; - - var _numLine = -1; - - var _lenGls = 0; - var tmp = 0; - - while (stream.pos < stream.size) - { - var command = stream.GetUChar(); - - switch (command) - { - case 41: // ctFontName - { - stream.Skip(12); - break; - } - case 22: // ctBrushColor1 - { - stream.Skip(4); - break; - } - case 80: // ctDrawText - { - if (0 != _lineCharCount) - _linePrevCharX += stream.GetDouble2(); - - _arrayGlyphOffsets[_lineCharCount] = _linePrevCharX; - - _lineCharCount++; - - if (_lineGidExist) - stream.Skip(4); - else - stream.Skip(2); - - if (0 == _lineWidth) - _lineLastGlyphWidth = stream.GetDouble2(); - else - stream.Skip(2); - - break; - } - case 160: - { - // textline - _linePrevCharX = 0; - _lineCharCount = 0; - _lineWidth = 0; - - _arrayGlyphOffsets.splice(0, _arrayGlyphOffsets.length); - - ++_numLine; - - var mask = stream.GetUChar(); - _lineX = stream.GetDouble(); - _lineY = stream.GetDouble(); - - if ((mask & 0x01) != 0) - { - _lineEx = 1; - _lineEy = 0; - } - else - { - _lineEx = stream.GetDouble(); - _lineEy = stream.GetDouble(); - } - - _lineAscent = stream.GetDouble(); - _lineDescent = stream.GetDouble(); - - if ((mask & 0x04) != 0) - _lineWidth = stream.GetDouble(); - - if ((mask & 0x02) != 0) - _lineGidExist = true; - else - _lineGidExist = false; - - break; - } - case 162: - { - // textline end - - // все подсчитано - if (0 == _lineWidth) - _lineWidth = _linePrevCharX + _lineLastGlyphWidth; - - // в принципе код один и тот же. Но почти всегда линии горизонтальные. - // а для горизонтальной линии все можно пооптимизировать - if (_lineEx == 1 && _lineEy == 0) - { - var _distX = x - _lineX; - if (y >= (_lineY - _lineAscent) && y <= (_lineY + _lineDescent) && _distX >= 0 && _distX <= _lineWidth) - { - // попали внутрь линии. Теперь нужно найти глиф - _line = _numLine; - - _lenGls = _arrayGlyphOffsets.length; - for (_glyph = 0; _glyph < _lenGls; _glyph++) - { - if (_arrayGlyphOffsets[_glyph] > _distX) - break; - } - if (_glyph > 0) - --_glyph; - - return { Line : _line, Glyph : _glyph }; - } - - if (_distX >= 0 && _distX <= _lineWidth) - tmp = Math.abs(y - _lineY); - else if (_distX < 0) - { - tmp = Math.sqrt((x - _lineX) * (x - _lineX) + (y - _lineY) * (y - _lineY)); - } - else - { - var _xx1 = _lineX + _lineWidth; - tmp = Math.sqrt((x - _xx1) * (x - _xx1) + (y - _lineY) * (y - _lineY)); - } - - if (tmp < _minDist) - { - _minDist = tmp; - _line = _numLine; - - if (_distX < 0) - _glyph = -2; - else if (_distX > _lineWidth) - { - _glyph = -1; - } - else - { - _lenGls = _arrayGlyphOffsets.length; - for (_glyph = 0; _glyph < _lenGls; _glyph++) - { - if (_arrayGlyphOffsets[_glyph] > _distX) - break; - } - - if (_glyph > 0) - _glyph--; - } - } - - // Ничего не надо делать, уже найдена более "ближняя" линия - } - else - { - // определяем точки descent линии - var ortX = -_lineEy; - var ortY = _lineEx; - - var _dx = _lineX + ortX * _lineDescent; - var _dy = _lineY + ortY * _lineDescent; - - // теперь проекции (со знаком) на линию descent - var h = -((x - _dx) * ortX + (y - _dy) * ortY); - var w = (x - _dx) * _lineEx + (y - _dy) * _lineEy; - - if (w >= 0 && w <= _lineWidth && h >= 0 && h <= (_lineDescent + _lineAscent)) - { - // попали внутрь линии. Теперь нужно найти глиф - _line = _numLine; - - _lenGls = _arrayGlyphOffsets.length; - for (_glyph = 0; _glyph < _lenGls; _glyph++) - { - if (_arrayGlyphOffsets[_glyph] > w) - break; - } - - if (_glyph > 0) - _glyph--; - - return { Line : _line, Glyph : _glyph }; - } - - if (w >= 0 && w <= _lineWidth) - tmp = Math.abs(h - _lineDescent); - else if (w < 0) - { - tmp = Math.sqrt((x - _lineX) * (x - _lineX) + (y - _lineY) * (y - _lineY)); - } - else - { - var _tmpX = _lineX + _lineWidth * _lineEx; - var _tmpY = _lineY + _lineWidth * _lineEy; - tmp = Math.sqrt((x - _tmpX) * (x - _tmpX) + (y - _tmpY) * (y - _tmpY)); - } - - //tmp = Math.abs(h - _lineDescent); - if (tmp < _minDist) - { - _minDist = tmp; - _line = _numLine; - - if (w < 0) - _glyph = -2; - else if (w > _lineWidth) - _glyph = -1; - else - { - _lenGls = _arrayGlyphOffsets.length; - for (_glyph = 0; _glyph < _lenGls; _glyph++) - { - if (_arrayGlyphOffsets[_glyph] > w) - break; - } - - if (_glyph > 0) - _glyph--; - } - } - - // Ничего не надо делать, уже найдена более "ближняя" линия - } - - break; - } - case 161: - { - // text transform - stream.Skip(16); - break; - } - default: - { - stream.pos = stream.size; - } - } - } - - return { Line : _line, Glyph : _glyph }; - }; - - CFile.prototype.drawSelection = function(pageIndex, overlay, x, y, width, height) - { - var stream = this.getPageTextStream(pageIndex); - if (!stream) - return; - - var sel = this.Selection; - var Page1 = 0; - var Page2 = 0; - var Line1 = 0; - var Line2 = 0; - var Glyph1 = 0; - var Glyph2 = 0; - - if (sel.Page2 > sel.Page1) - { - Page1 = sel.Page1; - Page2 = sel.Page2; - Line1 = sel.Line1; - Line2 = sel.Line2; - Glyph1 = sel.Glyph1; - Glyph2 = sel.Glyph2; - } - else if (sel.Page2 < sel.Page1) - { - Page1 = sel.Page2; - Page2 = sel.Page1; - Line1 = sel.Line2; - Line2 = sel.Line1; - Glyph1 = sel.Glyph2; - Glyph2 = sel.Glyph1; - } - else if (sel.Page1 === sel.Page2) - { - Page1 = sel.Page1; - Page2 = sel.Page2; - - if (sel.Line1 < sel.Line2) - { - Line1 = sel.Line1; - Line2 = sel.Line2; - Glyph1 = sel.Glyph1; - Glyph2 = sel.Glyph2; - } - else if (sel.Line2 < sel.Line1) - { - Line1 = sel.Line2; - Line2 = sel.Line1; - Glyph1 = sel.Glyph2; - Glyph2 = sel.Glyph1; - } - else - { - Line1 = sel.Line1; - Line2 = sel.Line2; - - if (-1 === sel.Glyph1) - { - Glyph1 = sel.Glyph2; - Glyph2 = sel.Glyph1; - } - else if (-1 === sel.Glyph2) - { - Glyph1 = sel.Glyph1; - Glyph2 = sel.Glyph2; - } - else if (sel.Glyph1 < sel.Glyph2) - { - Glyph1 = sel.Glyph1; - Glyph2 = sel.Glyph2; - } - else - { - Glyph1 = sel.Glyph2; - Glyph2 = sel.Glyph1; - } - } - } - - if (Page1 > pageIndex || Page2 < pageIndex) - return; - - if (Page1 < pageIndex) - { - Page1 = pageIndex; - Line1 = 0; - Glyph1 = -2; - } - var bIsFillToEnd = false; - if (Page2 > pageIndex) - bIsFillToEnd = true; - - // textline parameters - var _lineX = 0; - var _lineY = 0; - var _lineEx = 0; - var _lineEy = 0; - var _lineAscent = 0; - var _lineDescent = 0; - var _lineWidth = 0; - var _lineGidExist = false; - var _linePrevCharX = 0; - var _lineCharCount = 0; - var _lineLastGlyphWidth = 0; - var _arrayGlyphOffsets = []; - - var _numLine = -1; - - var dKoefX = width / this.pages[pageIndex].W; - var dKoefY = height / this.pages[pageIndex].H; - dKoefX *= (this.pages[pageIndex].Dpi / 25.4); - dKoefY *= (this.pages[pageIndex].Dpi / 25.4); - - while (stream.pos < stream.size) - { - var command = stream.GetUChar(); - - switch (command) - { - case 41: - { - stream.Skip(12); - break; - } - case 22: - { - stream.Skip(4); - break; - } - case 80: - { - if (0 != _lineCharCount) - _linePrevCharX += stream.GetDouble2(); - - _arrayGlyphOffsets[_lineCharCount] = _linePrevCharX; - - _lineCharCount++; - - if (_lineGidExist) - stream.Skip(4); - else - stream.Skip(2); - - if (0 == _lineWidth) - _lineLastGlyphWidth = stream.GetDouble2(); - else - stream.Skip(2); - - break; - } - case 160: - { - // textline - _linePrevCharX = 0; - _lineCharCount = 0; - _lineWidth = 0; - - _arrayGlyphOffsets.splice(0, _arrayGlyphOffsets.length); - - ++_numLine; - - var mask = stream.GetUChar(); - _lineX = stream.GetDouble(); - _lineY = stream.GetDouble(); - - if ((mask & 0x01) != 0) - { - _lineEx = 1; - _lineEy = 0; - } - else - { - _lineEx = stream.GetDouble(); - _lineEy = stream.GetDouble(); - } - - _lineAscent = stream.GetDouble(); - _lineDescent = stream.GetDouble(); - - if ((mask & 0x04) != 0) - _lineWidth = stream.GetDouble(); - - if ((mask & 0x02) != 0) - _lineGidExist = true; - else - _lineGidExist = false; - - break; - } - case 162: - { - // textline end - var off1 = 0; - var off2 = 0; - - if (_numLine < Line1) - break; - if (_numLine > Line2 && !bIsFillToEnd) - return; - - // все подсчитано - if (0 == _lineWidth) - _lineWidth = _linePrevCharX + _lineLastGlyphWidth; - - if (Line1 == _numLine) - { - if (-2 == Glyph1) - off1 = 0; - else if (-1 == Glyph1) - off1 = _lineWidth; - else - off1 = _arrayGlyphOffsets[Glyph1]; - } - if (bIsFillToEnd || Line2 != _numLine) - off2 = _lineWidth; - else - { - if (Glyph2 == -2) - off2 = 0; - else if (Glyph2 == -1) - off2 = _lineWidth; - else - { - off2 = _arrayGlyphOffsets[Glyph2]; - /* - if (Glyph2 >= (_arrayGlyphOffsets.length - 1)) - off2 = _lineWidth; - else - off2 = _arrayGlyphOffsets[Glyph2 + 1]; - */ - } - } - - if (off2 <= off1) - break; - - // в принципе код один и тот же. Но почти всегда линии горизонтальные. - // а для горизонтальной линии все можно пооптимизировать - if (_lineEx == 1 && _lineEy == 0) - { - var _x = (x + dKoefX * (_lineX + off1)) >> 0; - var _r = (x + dKoefX * (_lineX + off2)) >> 0; - var _y = (y + dKoefY * (_lineY - _lineAscent)) >> 0; - var _b = (y + dKoefY * (_lineY + _lineDescent)) >> 0; - - if (_x < overlay.min_x) - overlay.min_x = _x; - if (_r > overlay.max_x) - overlay.max_x = _r; - - if (_y < overlay.min_y) - overlay.min_y = _y; - if (_b > overlay.max_y) - overlay.max_y = _b; - - overlay.m_oContext.rect(_x,_y,_r-_x,_b-_y); - } - else - { - // определяем точки descent линии - var ortX = -_lineEy; - var ortY = _lineEx; - - var _dx = _lineX + ortX * _lineDescent; - var _dy = _lineY + ortY * _lineDescent; - - var _x1 = _dx + off1 * _lineEx; - var _y1 = _dy + off1 * _lineEy; - - var _x2 = _x1 - ortX * (_lineAscent + _lineDescent); - var _y2 = _y1 - ortY * (_lineAscent + _lineDescent); - - var _x3 = _x2 + (off2 - off1) * _lineEx; - var _y3 = _y2 + (off2 - off1) * _lineEy; - - var _x4 = _x3 + ortX * (_lineAscent + _lineDescent); - var _y4 = _y3 + ortY * (_lineAscent + _lineDescent); - - _x1 = (x + dKoefX * _x1); - _x2 = (x + dKoefX * _x2); - _x3 = (x + dKoefX * _x3); - _x4 = (x + dKoefX * _x4); - - _y1 = (y + dKoefY * _y1); - _y2 = (y + dKoefY * _y2); - _y3 = (y + dKoefY * _y3); - _y4 = (y + dKoefY * _y4); - - overlay.CheckPoint(_x1, _y1); - overlay.CheckPoint(_x2, _y2); - overlay.CheckPoint(_x3, _y3); - overlay.CheckPoint(_x4, _y4); - - var ctx = overlay.m_oContext; - ctx.moveTo(_x1, _y1); - ctx.lineTo(_x2, _y2); - ctx.lineTo(_x3, _y3); - ctx.lineTo(_x4, _y4); - ctx.closePath(); - } - - break; - } - case 161: - { - // text transform - stream.Skip(16); - break; - } - default: - { - stream.pos = stream.size; - } - } - } - }; - - CFile.prototype.copySelection = function(pageIndex, _text_format) - { - var stream = this.getPageTextStream(pageIndex); - if (!stream) - return; - - var ret = ""; - - var sel = this.Selection; - var Page1 = 0; - var Page2 = 0; - var Line1 = 0; - var Line2 = 0; - var Glyph1 = 0; - var Glyph2 = 0; - - if (sel.Page2 > sel.Page1) - { - Page1 = sel.Page1; - Page2 = sel.Page2; - Line1 = sel.Line1; - Line2 = sel.Line2; - Glyph1 = sel.Glyph1; - Glyph2 = sel.Glyph2; - } - else if (sel.Page2 < sel.Page1) - { - Page1 = sel.Page2; - Page2 = sel.Page1; - Line1 = sel.Line2; - Line2 = sel.Line1; - Glyph1 = sel.Glyph2; - Glyph2 = sel.Glyph1; - } - else if (sel.Page1 == sel.Page2) - { - Page1 = sel.Page1; - Page2 = sel.Page2; - - if (sel.Line1 < sel.Line2) - { - Line1 = sel.Line1; - Line2 = sel.Line2; - Glyph1 = sel.Glyph1; - Glyph2 = sel.Glyph2; - } - else if (sel.Line2 < sel.Line1) - { - Line1 = sel.Line2; - Line2 = sel.Line1; - Glyph1 = sel.Glyph2; - Glyph2 = sel.Glyph1; - } - else - { - Line1 = sel.Line1; - Line2 = sel.Line2; - - if (((sel.Glyph1 != -1) && (sel.Glyph1 < sel.Glyph2)) || (-1 == sel.Glyph2)) - { - Glyph1 = sel.Glyph1; - Glyph2 = sel.Glyph2; - } - else - { - Glyph1 = sel.Glyph2; - Glyph2 = sel.Glyph1; - } - } - } - - if (Page1 > pageIndex || Page2 < pageIndex) - return; - - if (Page1 < pageIndex) - { - Page1 = pageIndex; - Line1 = 0; - Glyph1 = -2; - } - var bIsFillToEnd = false; - if (Page2 > pageIndex) - bIsFillToEnd = true; - - - var lineSpans = []; - var curSpan = new CSpan(); - var isChangeSpan = false; - - var _lineCharCount = 0; - var _lineGidExist = false; - - var _numLine = -1; - - while (stream.pos < stream.size) - { - var command = stream.GetUChar(); - - switch (command) - { - case 41: - { - curSpan.fontName = stream.GetULong(); - stream.Skip(4); - curSpan.fontSize = stream.GetDouble(); - isChangeSpan = true; - break; - } - case 22: - { - curSpan.colorR = stream.GetUChar(); - curSpan.colorG = stream.GetUChar(); - curSpan.colorB = stream.GetUChar(); - stream.Skip(1); - isChangeSpan = true; - break; - } - case 80: - { - if (0 != _lineCharCount) - stream.Skip(2); - - _lineCharCount++; - if (isChangeSpan) - { - lineSpans[lineSpans.length] = curSpan.CreateDublicate(); - } - var sp = lineSpans[lineSpans.length - 1]; - - var _char = stream.GetUShort(); - if (0xFFFF == _char) - sp.inner += " "; - else - sp.inner += String.fromCharCode(_char); - - if (_lineGidExist) - stream.Skip(2); - - stream.Skip(2); - - isChangeSpan = false; - break; - } - case 160: - { - // textline - isChangeSpan = true; - lineSpans.splice(0, lineSpans.length); - _lineCharCount = 0; - ++_numLine; - - var mask = stream.GetUChar(); - stream.Skip(8); - - if ((mask & 0x01) == 0) - { - stream.Skip(8); - } - - stream.Skip(8); - - if ((mask & 0x04) != 0) - stream.Skip(4); - - if ((mask & 0x02) != 0) - _lineGidExist = true; - else - _lineGidExist = false; - - break; - } - case 162: - { - // textline end - // спаны набиты. теперь нужно сформировать линию и сгенерировать нужную строку. - if (Line1 <= _numLine && ((!bIsFillToEnd && Line2 >= _numLine) || bIsFillToEnd)) - { - var _g1 = -2; - var _g2 = -1; - if (Line1 == _numLine) - { - _g1 = Glyph1; - } - if (bIsFillToEnd || Line2 != _numLine) - { - _g2 = -1; - } - else - { - _g2 = Glyph2; - } - - if (_g1 != -1 && _g2 != -2) - { - var textLine = "

"; - - if (-2 == _g1 && -1 == _g2) - { - var countSpans = lineSpans.length; - for (var i = 0; i < countSpans; i++) - { - textLine += ""; - textLine += lineSpans[i].inner; - textLine += ""; - - if (_text_format) - _text_format.Text += lineSpans[i].inner; - } - } - else - { - var curIndex = 0; - var countSpans = lineSpans.length; - for (var i = 0; i < countSpans; i++) - { - var old = curIndex; - var start = curIndex; - var end = start + lineSpans[i].inner.length; - curIndex = end; - - if (_g1 > start) - start = _g1; - if (_g2 != -1 && _g2 < end) - end = _g2; - - if (start > end) - continue; - - start -= old; - end -= old; - - textLine += ""; - textLine += lineSpans[i].inner.substring(start, end); - textLine += ""; - - if (_text_format) - _text_format.Text += lineSpans[i].inner.substring(start, end); - } - } - - textLine += "

"; - - if (_text_format) - _text_format.Text += "\n"; - - ret += textLine; - } - } - - break; - } - case 161: - { - // text transform - stream.Skip(16); - break; - } - default: - { - stream.pos = stream.size; - } - } - } - return ret; - }; - - CFile.prototype.copy = function(_text_format) - { - var sel = this.Selection; - var page1 = sel.Page1; - var page2 = sel.Page2; - - if (page2 < page1) - { - page1 = page2; - page2 = sel.Page1; - } - - var ret = "
"; - for (var i = page1; i <= page2; i++) - { - ret += this.copySelection(i, _text_format); - } - ret += "
"; - - //console.log(ret); - return ret; - }; - - CFile.prototype.getCountLines = function(pageIndex) - { - var stream = this.getPageTextStream(pageIndex); - if (!stream) - return -1; - - var _lineGidExist = false; - var _lineCharCount = 0; - var _numLine = -1; - - while (stream.pos < stream.size) - { - var command = stream.GetUChar(); - - switch (command) - { - case 41: - { - stream.Skip(12); - break; - } - case 22: - { - stream.Skip(4); - break; - } - case 80: - { - if (0 != _lineCharCount) - stream.Skip(2); - - _lineCharCount++; - stream.Skip(_lineGidExist ? 6 : 4); - break; - } - case 160: - { - // textline - _lineCharCount = 0; - ++_numLine; - - var mask = stream.GetUChar(); - stream.Skip(8); - - if ((mask & 0x01) == 0) - stream.Skip(8); - - stream.Skip(8); - - if ((mask & 0x04) != 0) - stream.Skip(4); - - if ((mask & 0x02) != 0) - _lineGidExist = true; - else - _lineGidExist = false; - - break; - } - case 162: - { - break; - } - case 161: - { - // text transform - stream.Skip(16); - break; - } - default: - { - stream.pos = stream.size; - } - } - } - - return _numLine; - }; - - CFile.prototype.selectAll = function() - { - var sel = this.Selection; - - sel.Page1 = 0; - sel.Line1 = 0; - sel.Glyph1 = 0; - - sel.Page2 = 0; - sel.Line2 = 0; - sel.Glyph2 = 0; - - sel.IsSelection = false; - - var pagesCount = this.pages.length; - if (0 != pagesCount) - { - var lLinesLastPage = this.getCountLines(pagesCount - 1); - if (1 != pagesCount || 0 != lLinesLastPage) - { - sel.Glyph1 = -2; - sel.Page2 = pagesCount - 1; - sel.Line2 = lLinesLastPage; - sel.Glyph2 = -1; - } - } - - this.onUpdateSelection(); - this.onUpdateOverlay(); - }; - - CFile.prototype.onUpdateOverlay = function() - { - this.viewer.onUpdateOverlay(); - }; - - CFile.prototype.onUpdateSelection = function() - { - if (this.viewer.Api) - this.viewer.Api.sendEvent("asc_onSelectionEnd"); - }; - - // SEARCH - CFile.prototype.startSearch = function(text) - { - this.viewer.StartSearch(); - - this.SearchInfo.Text = text; - this.SearchInfo.Page = 0; - - var oThis = this; - this.SearchInfo.Id = setTimeout(function(){oThis.onSearchPage();}, 1); - }; - - CFile.prototype.onSearchPage = function() - { - this.SearchPage(this.SearchInfo.Page, this.SearchInfo.Text); - this.SearchInfo.Page++; - - if (this.SearchInfo.Page >= this.pages.length) - { - this.stopSearch(); - return; - } - - var oThis = this; - this.SearchInfo.Id = setTimeout(function(){oThis.onSearchPage();}, 1); - }; - - CFile.prototype.stopSearch = function() - { - if (null != this.SearchInfo.Id) - { - clearTimeout(this.SearchInfo.Id); - this.SearchInfo.Id = null; - } - this.viewer.EndSearch(false); - }; - - CFile.prototype.searchPage = function(pageIndex) - { - var stream = this.getPageTextStream(pageIndex); - if (!stream) - return; - - var _searchResults = this.SearchResults; - var _navRects = _searchResults.Pages[pageIndex]; - if (_searchResults.PagesLines == null) - _searchResults.PagesLines = {}; - - _searchResults.PagesLines[pageIndex] = []; - - var glyphsEqualFound = 0; - var text = _searchResults.Text; - var glyphsFindCount = text.length; - - if (!_searchResults.MachingCase) - { - text = text.toLowerCase(); - } - - if (0 == glyphsFindCount) - return; - - var _numLine = -1; - var _lineGidExist = false; - var _linePrevCharX = 0; - var _lineCharCount = 0; - var _lineLastGlyphWidth = 0; - - var _findLine = 0; - var _findLineOffsetX = 0; - var _findLineOffsetR = 0; - var _findGlyphIndex = 0; - - var _SeekToNextPoint = 0; - var _SeekLinePrevCharX = 0; - - var curLine = null; - - while (stream.pos < stream.size) - { - var command = stream.GetUChar(); - - switch (command) - { - case 41: - { - stream.Skip(12); - break; - } - case 22: - { - stream.Skip(4); - break; - } - case 80: - { - if (0 != _lineCharCount) - _linePrevCharX += stream.GetDouble2(); - - _lineCharCount++; - - var _char = stream.GetUShort(); - if (_lineGidExist) - stream.Skip(2); - - if (0xFFFF == _char) - curLine.text += " "; - else - curLine.text += String.fromCharCode(_char); - - if (curLine.W != 0) - stream.Skip(2); - else - curLine.W = stream.GetDouble2(); - - break; - } - case 160: - { - _linePrevCharX = 0; - _lineCharCount = 0; - - _searchResults.PagesLines[pageIndex][_searchResults.PagesLines[pageIndex].length] = new CLineInfo(); - curLine = _searchResults.PagesLines[pageIndex][_searchResults.PagesLines[pageIndex].length - 1]; - - var mask = stream.GetUChar(); - curLine.X = stream.GetDouble(); - curLine.Y = stream.GetDouble(); - - if ((mask & 0x01) == 1) - { - var dAscent = stream.GetDouble(); - var dDescent = stream.GetDouble(); - - curLine.Y -= dAscent; - curLine.H = dAscent + dDescent; - } - else - { - curLine.Ex = stream.GetDouble(); - curLine.Ey = stream.GetDouble(); - - var dAscent = stream.GetDouble(); - var dDescent = stream.GetDouble(); - - curLine.X = curLine.X + dAscent * curLine.Ey; - curLine.Y = curLine.Y - dAscent * curLine.Ex; - - curLine.H = dAscent + dDescent; - } - - if ((mask & 0x04) != 0) - curLine.W = stream.GetDouble(); - - if ((mask & 0x02) != 0) - _lineGidExist = true; - else - _lineGidExist = false; - - break; - } - case 162: - { - break; - } - case 161: - { - // text transform - stream.Skip(16); - break; - } - default: - { - stream.pos = stream.size; - } - } - } - - // текст заполнен. теперь нужно просто пробегаться и смотреть - // откуда совпадение началось и где закончилось - _linePrevCharX = 0; - _lineCharCount = 0; - _numLine = 0; - - // переменные для случаев, когда присутсвует небольшое смещение по y, что мы можем считать строку условно неделимой - var tmpLineCurCharX = 0; - var tmpLinePrevCharX = 0; - var tmpLineCurGlyphWidth = 0; - var tmpLinePrevGlyphWidth = 0; - var tmpLineCharCount = 0; // всего символов в условно неделимой строке. - - stream.Seek(0); - - // если текст, который ищем разбит на строки, то мапим в какой строке какую часть текста нашли, - // чтобы потом повторно не пробегаться по строкам в поисках текста для aroundtext - var oEqualStrByLine = {}; - - // для whole words - var isStartWhole = false; - - while (stream.pos < stream.size) - { - var command = stream.GetUChar(); - - switch (command) - { - case 41: // ctFontName - { - stream.Skip(12); - break; - } - case 22: // ctBrushColor1 - { - stream.Skip(4); - break; - } - case 80: // ctDrawText - { - if (0 != _lineCharCount) - _linePrevCharX += stream.GetDouble2(); - - var _char = stream.GetUShort(); - if (_lineGidExist) - stream.Skip(2); - - if (0xFFFF == _char) - _char = " ".charCodeAt(0); - - _lineLastGlyphWidth = stream.GetDouble2(); - tmpLineCurGlyphWidth = _lineLastGlyphWidth; - - if (tmpLineCharCount != 0) - tmpLineCurCharX += tmpLinePrevGlyphWidth; - - _lineCharCount++; - tmpLineCharCount++; - - let curLine = _searchResults.PagesLines[pageIndex][_numLine]; - let prevLine = _searchResults.PagesLines[pageIndex][_numLine - 1] - // если текущий символ позади предыдущего (или впереди больше чем на ширину предыдущего символа) значит это новая строка (иначе был бы пробел), обнуляем поиск - if (tmpLineCurCharX < tmpLinePrevCharX || tmpLineCurCharX > tmpLinePrevCharX + tmpLinePrevGlyphWidth) - { - glyphsEqualFound = 0; - isStartWhole = true; - } - else if (prevLine && (prevLine.Y < curLine.Y - (curLine.H / 2) || prevLine.Y - (prevLine.H / 2) > curLine.Y)) - { - tmpLineCharCount = _lineCharCount; - } - - // если пробел или пунктуация (или начало строки), значит это старт для whole words - if (_searchResults.WholeWords && (_char === " ".charCodeAt(0) || undefined !== AscCommon.g_aPunctuation[_char])) - { - isStartWhole = true; - oEqualStrByLine = {}; - break; - } - else if (tmpLineCharCount == 1) - { - isStartWhole = true; - } - - tmpLinePrevCharX = tmpLineCurCharX; - tmpLinePrevGlyphWidth = tmpLineCurGlyphWidth; - - if (_searchResults.WholeWords && isStartWhole === false) - break; - - var _isFound = false; - if (_searchResults.MachingCase) - { - if (_char == text.charCodeAt(glyphsEqualFound)) - _isFound = true; - } - else - { - var _strMem = String.fromCharCode(_char); - _strMem = _strMem.toLowerCase(); - if (_strMem.charCodeAt(0) == text.charCodeAt(glyphsEqualFound)) - _isFound = true; - } - - if (_isFound) - { - if (0 == glyphsEqualFound) - { - _findLine = _numLine; - _findLineOffsetX = _linePrevCharX; - _findGlyphIndex = _lineCharCount; - - _SeekToNextPoint = stream.pos; - _SeekLinePrevCharX = _linePrevCharX; - } - - glyphsEqualFound++; - if (!oEqualStrByLine[_numLine]) - oEqualStrByLine[_numLine] = ""; - oEqualStrByLine[_numLine] += String.fromCharCode(_char); - - _findLineOffsetR = _linePrevCharX + _lineLastGlyphWidth; - if (glyphsFindCount == glyphsEqualFound) - { - if (_searchResults.WholeWords) - { - var nCurStreamPos = stream.pos; - var isWhole = CheckWholeNextChar(stream); - stream.pos = nCurStreamPos; - if (!isWhole) - { - isStartWhole = false; - stream.pos = nCurStreamPos; - glyphsEqualFound = 0; - oEqualStrByLine = {}; - - break; - } - } - - var _rects = []; - var _prevL = null; - var isDiffLines = false; - for (var i = _findLine; i <= _numLine; i++) - { - var ps = 0; - if (_findLine == i) - ps = _findLineOffsetX; - var pe = _searchResults.PagesLines[pageIndex][i].W; - if (i == _numLine) - pe = _findLineOffsetR; - - var _l = _searchResults.PagesLines[pageIndex][i]; - if (_prevL && (_prevL.Y < _l.Y - (_l.H / 2) || _prevL.Y - (_prevL.H / 2) > _l.Y)) - { - isDiffLines = true; - break; - } - _prevL = _l; - - if (_l.Ex == 1 && _l.Ey == 0) - { - _rects[_rects.length] = { PageNum : pageIndex, X : _l.X + ps, Y : _l.Y, W : pe - ps, H : _l.H, LineNum: i, Text: oEqualStrByLine[i]}; - } - else - { - _rects[_rects.length] = { PageNum : pageIndex, X : _l.X + ps * _l.Ex, Y : _l.Y + ps * _l.Ey, W : pe - ps, H : _l.H, Ex : _l.Ex, Ey : _l.Ey, LineNum: i, Text: oEqualStrByLine[i]}; - } - } - - if (isDiffLines === false) - { - _navRects[_navRects.length] = _rects; - - // если isWhole !== true -> нужно вернуться и попробовать искать со след буквы. - if (!isWhole) - { - stream.pos = _SeekToNextPoint; - _linePrevCharX = _SeekLinePrevCharX; - _lineCharCount = _findGlyphIndex; - _numLine = _findLine; - } - } - - isStartWhole = false; - glyphsEqualFound = 0; - oEqualStrByLine = {}; - } - } - else - { - isStartWhole = false; - - if (0 != glyphsEqualFound) - { - // если isWhole !== true -> нужно вернуться и попробовать искать со след буквы. - if (!isWhole) - { - stream.pos = _SeekToNextPoint; - _linePrevCharX = _SeekLinePrevCharX; - _lineCharCount = _findGlyphIndex; - _numLine = _findLine; - } - - glyphsEqualFound = 0; - oEqualStrByLine = {}; - } - } - - break; - } - case 160: // ctCommandTextLine - { - _linePrevCharX = 0; - _lineCharCount = 0; - - var mask = stream.GetUChar(); - stream.Skip(8); - - if ((mask & 0x01) == 0) - stream.Skip(8); - - stream.Skip(8); - - if ((mask & 0x04) != 0) - stream.Skip(4); - - if ((mask & 0x02) != 0) - _lineGidExist = true; - else - _lineGidExist = false; - - if (text.charCodeAt(glyphsEqualFound) === " ".charCodeAt(0)) - { - glyphsEqualFound++; - for (let i = glyphsEqualFound; i < text.length; i++) - { - if (text.charCodeAt(i) === " ".charCodeAt(0)) - glyphsEqualFound++; - else - break; - } - } - - break; - } - case 162: // ctCommandTextLineEnd - { - ++_numLine; - break; - } - case 161: // ctCommandTextTransform - { - stream.Skip(16); - break; - } - default: - { - stream.pos = stream.size; - } - } - } - - // проверка следующего символа на совпадение условий для whole words - function CheckWholeNextChar(stream) - { - let n_linePrevCharX = _linePrevCharX; - let n_lineCharCount = _lineCharCount; - let n_lineLastGlyphWidth = _lineLastGlyphWidth; - let nTmpLineCurCharX = tmpLineCurCharX; - let nTmpLineCharCount = tmpLineCharCount; - let b_lineGidExist = _lineGidExist; - let n_numLine = _numLine; - let nTmpLinePrevCharX = tmpLinePrevCharX; - - while (stream.pos < stream.size) - { - var command = stream.GetUChar(); - - switch (command) - { - case 41: // ctFontName - { - stream.Skip(12); - break; - } - case 22: // ctBrushColor1 - { - stream.Skip(4); - break; - } - case 80: // ctDrawText - { - if (0 != n_lineCharCount) - n_linePrevCharX += stream.GetDouble2(); - - var _char = stream.GetUShort(); - if (b_lineGidExist) - stream.Skip(2); - - if (0xFFFF == _char) - _char = " ".charCodeAt(0); - - n_lineLastGlyphWidth = stream.GetDouble2(); - - if (nTmpLineCharCount != 0) - nTmpLineCurCharX += tmpLinePrevGlyphWidth; - - n_lineCharCount++; - nTmpLineCharCount++; - - let curLine = _searchResults.PagesLines[pageIndex][n_numLine]; - let prevLine = _searchResults.PagesLines[pageIndex][n_numLine - 1] - // если текущий символ позади предыдущего (или впереди) больше чем на ширину предыдущего символа значит это другая строка (иначе был бы пробел), - // whole words условия выполнены - if (nTmpLineCurCharX < nTmpLinePrevCharX || nTmpLineCurCharX > nTmpLinePrevCharX + tmpLinePrevGlyphWidth) - { - return true; - } - else if (prevLine && (prevLine.Y < curLine.Y - (curLine.H / 2) || prevLine.Y - (prevLine.H / 2) > curLine.Y)) - { - nTmpLineCharCount = n_lineCharCount; - } - - // если пробел или пунктуация (или начало строки), значит это старт для whole words - if (_searchResults.WholeWords && (_char === " ".charCodeAt(0) || undefined !== AscCommon.g_aPunctuation[_char])) - return true; - else if (nTmpLineCharCount == 1) - return true; - - return false; - } - case 160: // ctCommandTextLine - { - n_linePrevCharX = 0; - n_lineCharCount = 0; - - var mask = stream.GetUChar(); - stream.Skip(8); - - if ((mask & 0x01) == 0) - stream.Skip(8); - - stream.Skip(8); - - if ((mask & 0x04) != 0) - stream.Skip(4); - - if ((mask & 0x02) != 0) - b_lineGidExist = true; - else - b_lineGidExist = false; - - break; - } - case 162: // ctCommandTextLineEnd - { - ++n_numLine; - break; - } - case 161: // ctCommandTextTransform - { - stream.Skip(16); - break; - } - default: - { - stream.pos = stream.size; - } - } - } - return true; - } - }; - - CFile.prototype.findText = function(text, isMachingCase, isWholeWords, isNext) - { - this.SearchResults.IsSearch = true; - var pagesCount = this.pages.length; - if (text === this.SearchResults.Text && isMachingCase === this.SearchResults.MachingCase && isWholeWords == this.SearchResults.WholeWords) - { - if (this.SearchResults.Count === 0) - { - this.viewer.CurrentSearchNavi = null; - this.SearchResults.CurrentPage = -1; - this.SearchResults.Current = -1; - return; - } - - // поиск совпал, просто делаем навигацию к нужному месту - if (isNext) - { - if ((this.SearchResults.Current + 1) < this.SearchResults.Pages[this.SearchResults.CurrentPage].length) - { - // результат на этой же странице - this.SearchResults.Current++; - } - else - { - var _pageFind = this.SearchResults.CurrentPage + 1; - var _bIsFound = false; - for (var i = _pageFind; i < pagesCount; i++) - { - if (0 < this.SearchResults.Pages[i].length) - { - this.SearchResults.Current = 0; - this.SearchResults.CurrentPage = i; - _bIsFound = true; - break; - } - } - if (!_bIsFound) - { - for (var i = 0; i < _pageFind; i++) - { - if (0 < this.SearchResults.Pages[i].length) - { - this.SearchResults.Current = 0; - this.SearchResults.CurrentPage = i; - _bIsFound = true; - break; - } - } - } - } - } - else - { - if (this.SearchResults.Current > 0) - { - // результат на этой же странице - this.SearchResults.Current--; - } - else - { - var _pageFind = this.SearchResults.CurrentPage - 1; - var _bIsFound = false; - for (var i = _pageFind; i >= 0; i--) - { - if (0 < this.SearchResults.Pages[i].length) - { - this.SearchResults.Current = this.SearchResults.Pages[i].length - 1; - this.SearchResults.CurrentPage = i; - _bIsFound = true; - break; - } - } - if (!_bIsFound) - { - for (var i = pagesCount - 1; i > _pageFind; i--) - { - if (0 < this.SearchResults.Pages[i].length) - { - this.SearchResults.Current = this.SearchResults.Pages[i].length - 1; - this.SearchResults.CurrentPage = i; - _bIsFound = true; - break; - } - } - } - } - } - - this.viewer.CurrentSearchNavi = this.SearchResults.Pages[this.SearchResults.CurrentPage][this.SearchResults.Current]; - - this.viewer.ToSearchResult(); - return; - } - // новый поиск - for (var i = 0; i < this.pages.length; i++) - { - this.SearchResults.Pages[i].splice(0, this.SearchResults.Pages[i].length); - } - this.SearchResults.Count = 0; - - this.SearchResults.CurrentPage = -1; - this.SearchResults.Current = -1; - - this.SearchResults.Text = text; - this.SearchResults.MachingCase = isMachingCase; - this.SearchResults.WholeWords = isWholeWords; - - for (var i = 0; i < this.pages.length; i++) - { - this.searchPage(i); - this.SearchResults.Count += this.SearchResults.Pages[i].length; - } - - if (this.SearchResults.Count == 0) - { - this.viewer.CurrentSearchNavi = null; - this.onUpdateOverlay(); - return; - } - - var currentPage = this.viewer.currentPage; - for (var i = currentPage; i < this.SearchResults.Pages.length; i++) - { - if (0 != this.SearchResults.Pages[i].length) - { - this.SearchResults.CurrentPage = i; - this.SearchResults.Current = 0; - break; - } - } - if (this.SearchResults.Current === -1) - { - for (var i = 0; i < currentPage; i++) - { - if (0 != this.SearchResults.Pages[i].length) - { - this.SearchResults.CurrentPage = i; - this.SearchResults.Current = 0; - break; - } - } - } - - this.viewer.CurrentSearchNavi = this.SearchResults.Pages[this.SearchResults.CurrentPage][this.SearchResults.Current]; - this.viewer.ToSearchResult(); - }; - - CFile.prototype.startTextAround = function() - { - var aTextAround = []; - var oPageMatches, oPart, oLineInfo, oLastPartInfo; - var sTempText, nAroundAdded; - for (var nPage = 0; nPage < this.SearchResults.Pages.length; nPage++) - { - oPageMatches = this.SearchResults.Pages[nPage]; - nAroundAdded = aTextAround.length; - // идём по всем совпадениям - for (var nMatch = 0; nMatch < oPageMatches.length; nMatch++) - { - sTempText = ""; - // найденный текст может быть разбит на части (строки) - for (var nPart = 0; nPart < oPageMatches[nMatch].length; nPart++) - { - oPart = oPageMatches[nMatch][nPart]; - // знаем в какой строке было найдено совпадение - oLineInfo = this.SearchResults.PagesLines[nPage][oPart.LineNum]; - - // если line изменился, тогда инфу обнуляем - if (oLastPartInfo && oPart.LineNum != oLastPartInfo.numLine) - oLastPartInfo = null; - - var nPosInLine; - // запоминаем позицию в строке у первого совпадения, чтобы расчитывать позиции следующих - if (!oLastPartInfo) - { - nPosInLine = this.SearchResults.MachingCase ? oLineInfo.text.indexOf(oPart.Text) : oLineInfo.text.toLowerCase().indexOf(oPart.Text.toLowerCase()); - if (this.SearchResults.WholeWords) - { - while (!CheckWholeWords(nPosInLine, oPart.Text, oLineInfo.text)) - { - nPosInLine = this.SearchResults.MachingCase ? oLineInfo.text.indexOf(oPart.Text, nPosInLine + 1) : oLineInfo.text.toLowerCase().indexOf(oPart.Text.toLowerCase(), nPosInLine + 1); - } - } - - oLastPartInfo = { - posInLine: nPosInLine, - numLine: oPart.LineNum, - text: oPart.Text - }; - } - else - { - nPosInLine = this.SearchResults.MachingCase ? oLineInfo.text.indexOf(oPart.Text, oLastPartInfo.posInLine + 1) : oLineInfo.text.toLowerCase().indexOf(oPart.Text.toLowerCase(), oLastPartInfo.posInLine + 1); - if (this.SearchResults.WholeWords) - { - while (!CheckWholeWords(nPosInLine, oPart.Text, oLineInfo.text)) - { - nPosInLine = this.SearchResults.MachingCase ? oLineInfo.text.indexOf(oPart.Text, nPosInLine + 1) : oLineInfo.text.toLowerCase().indexOf(oPart.Text.toLowerCase(), nPosInLine + 1); - } - } - - oLastPartInfo = { - posInLine: nPosInLine, - numLine: oPart.LineNum, - text: oPart.Text - } - } - - if (nPart == 0 && oPageMatches[nMatch].length == 1) - sTempText += oLineInfo.text.slice(0, oLastPartInfo.posInLine) + '' + oPart.Text + '' + oLineInfo.text.slice(oLastPartInfo.posInLine + oPart.Text.length); - else if (nPart == 0) - sTempText += oLineInfo.text.slice(0, oLastPartInfo.posInLine) + '' + oPart.Text; - else if (nPart == oPageMatches[nMatch].length - 1) - sTempText += oPart.Text + '' + oLineInfo.text.slice(oLastPartInfo.posInLine + oPart.Text.length); - else - sTempText += oPart.Text; - } - - aTextAround.push([nAroundAdded + nMatch, sTempText]); - } - } - - function CheckWholeWords(nMatchPos, sMatchStr, sParentSrt) - { - var charBeforeMatch = sParentSrt[nMatchPos - 1] ? sParentSrt[nMatchPos - 1].charCodeAt(0) : undefined; - var charAfterMatch = sParentSrt[nMatchPos + sMatchStr.length] ? sParentSrt[nMatchPos + sMatchStr.length].charCodeAt(0) : undefined; - - if (charBeforeMatch !== " ".charCodeAt(0) && charBeforeMatch !== undefined && undefined === AscCommon.g_aPunctuation[charBeforeMatch]) - return false; - if (charAfterMatch !== " ".charCodeAt(0) && charAfterMatch !== undefined && undefined === AscCommon.g_aPunctuation[charAfterMatch]) - return false; - - return true; - } - - this.viewer.Api.sync_startTextAroundSearch(); - this.viewer.Api.sync_getTextAroundSearchPack(aTextAround); - this.viewer.Api.sync_endTextAroundSearch(); - }; - - CFile.prototype.prepareSearch = function() - { - this.SearchResults.Pages = new Array(this.pages.length); - for (var i = this.pages.length - 1; i >= 0; i--) - { - this.SearchResults.Pages[i] = []; - } - }; - - window["AscViewer"] = window["AscViewer"] || {}; - - window["AscViewer"]["baseUrl"] = (typeof document !== 'undefined' && document.currentScript) ? "" : "./../src/engine/"; - window["AscViewer"]["baseEngineUrl"] = "./../src/engine/"; - - window["AscViewer"].createFile = function(data) - { - var file = new CFile(); - file.nativeFile = new window["AscViewer"]["CDrawingFile"](); - var error = file.nativeFile["loadFromData"](data); - if (0 === error) - { - file.nativeFile["onRepaintPages"] = function(pages) { - file.onRepaintPages && file.onRepaintPages(pages); - }; - file.nativeFile["onUpdateStatistics"] = function(par, word, symbol, space) { - file.onUpdateStatistics && file.onUpdateStatistics(par, word, symbol, space); - }; - file.pages = file.nativeFile["getPages"](); - - for (var i = 0, len = file.pages.length; i < len; i++) - { - var page = file.pages[i]; - page.W = page["W"]; - page.H = page["H"]; - page.Dpi = page["Dpi"]; - } - - file.prepareSearch(); - //file.cacheManager = new AscCommon.CCacheManager(); - return file; - } - else if (4 === error) - { - return file; - } - - file.close(); - return null; - }; - - window["AscViewer"].setFilePassword = function(file, password) - { - var error = file.nativeFile["loadFromDataWithPassword"](password); - if (0 === error) - { - file.nativeFile["onRepaintPages"] = function(pages) { - file.onRepaintPages && file.onRepaintPages(pages); - }; - file.nativeFile["onUpdateStatistics"] = function(par, word, symbol, space) { - file.onUpdateStatistics && file.onUpdateStatistics(par, word, symbol, space); - }; - file.pages = file.nativeFile["getPages"](); - - for (var i = 0, len = file.pages.length; i < len; i++) - { - var page = file.pages[i]; - page.W = page["W"]; - page.H = page["H"]; - page.Dpi = page["Dpi"]; - } - - file.prepareSearch(); - //file.cacheManager = new AscCommon.CCacheManager(); - } - }; - -})(window, undefined); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/character.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/character.js deleted file mode 100644 index cc90624808..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/character.js +++ /dev/null @@ -1,339 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -(function (window, undefined) -{ - /** - * @param {_start} start range value - * @param {_end} end range value - * @param {_name} not used range name - */ - function CSymbolRange(_start, _end, _name) - { - this.Start = _start; - this.End = _end; - this.Name = _name; - } - CSymbolRange.prototype["getStart"] = function() { return this.Start; }; - CSymbolRange.prototype["getEnd"] = function() { return this.End; }; - CSymbolRange.prototype["getName"] = function() { return this.Name; }; - - function CFontByCharacter() - { - this.Ranges = []; - this.UsedRanges = []; - this.LastRange = null; - - this.FontsByRange = {}; - this.FontsByRangeCount = 0; - this.ExtendFontsByRangeCount = 0; - - this.IsUseNoSquaresMode = true; - - this.CallbackObj = { _this : null, _callback : null }; - } - - CFontByCharacter.prototype = - { - init : function(infos) - { - var fonts = window["__fonts_ranges"]; - if (!fonts) - return; - - var index = 0; - var count = fonts.length / 3; - for (var i = 0; i < count; i++) - { - if (!infos[fonts[index + 2]]) - { - this.Ranges.splice(0, this.Ranges.length); - return; - } - this.Ranges.push(new CSymbolRange(fonts[index], fonts[index + 1], infos[fonts[index + 2]][0])); - index += 3; - } - - fonts = null; - delete window["__fonts_ranges"]; - }, - - getRangeBySymbol : function(_char, _array) - { - // search range by symbol - var _start = 0; - var _end = _array.length - 1; - - var _center = 0; - var _range = null; - - if (_start > _end) - return null; - - while (_start < _end) - { - _center = (_start + _end) >> 1; - _range = _array[_center]; - - if (_range.Start > _char) - _end = _center - 1; - else if (_range.End < _char) - _start = _center + 1; - else - return _array[_center]; - } - - if (_start > _end) - return null; - - _range = _array[_start]; - if (_range.Start > _char || _range.End < _char) - return null; - - return _array[_start]; - }, - - getFontBySymbol : function(_char) - { - if (!this.IsUseNoSquaresMode) - return ""; - - if (undefined === _char || 0 == _char) - return ""; - - if (this.LastRange) - { - if (this.LastRange.Start <= _char && _char <= this.LastRange.End) - return this.LastRange.Name; - } - - // ищем среди уже найденных - var _range = this.getRangeBySymbol(_char, this.UsedRanges); - if (_range != null) - { - this.LastRange = _range; - return _range.Name; - } - - _range = this.getRangeBySymbol(_char, this.Ranges); - if (!_range) - return ""; - - this.UsedRanges.push(_range); - this.LastRange = _range; - - if (!this.FontsByRange[_range.Name]) - { - this.FontsByRange[_range.Name] = _range.Name; - this.FontsByRangeCount++; - } - - return _range.Name; - }, - - getFontsByString : function(_text) - { - if (!this.IsUseNoSquaresMode) - return false; - - if (!_text) - return false; - - var oldCount = this.FontsByRangeCount; - for (var i = _text.getUnicodeIterator(); i.check(); i.next()) - { - AscFonts.FontPickerByCharacter.getFontBySymbol(i.value()); - } - return (this.FontsByRangeCount != oldCount); - }, - - getFontsByString2 : function(_array) - { - if (!this.IsUseNoSquaresMode) - return false; - - if (!_array) - return false; - - var oldCount = this.FontsByRangeCount; - for (var i = 0; i < _array.length; ++i) - { - if (32 === _array[i]) - continue; - AscFonts.FontPickerByCharacter.getFontBySymbol(_array[i]); - } - return (this.FontsByRangeCount != oldCount); - }, - - isExtendFonts : function() - { - return this.ExtendFontsByRangeCount != this.FontsByRangeCount; - }, - - extendFonts : function(fonts, isNoRealExtend) - { - if (this.ExtendFontsByRangeCount == this.FontsByRangeCount) - return; - - var isFound; - for (var i in this.FontsByRange) - { - isFound = false; - for (var j in fonts) - { - if (fonts[j].name == this.FontsByRange[i]) - { - isFound = true; - break; - } - } - - if (!isFound) - fonts[fonts.length] = new AscFonts.CFont(this.FontsByRange[i], 0, "", 0, null); - } - - if (true !== isNoRealExtend) - this.ExtendFontsByRangeCount = this.FontsByRangeCount; - }, - - checkTextLight : function(text, isCodes) - { - if (isCodes !== true) - { - if (!this.getFontsByString(text)) - return false; - } - else - { - if (!this.getFontsByString2(text)) - return false; - } - - var fonts = []; - this.extendFonts(fonts, true); - - if (false === AscCommon.g_font_loader.CheckFontsNeedLoading(fonts)) - return false; - - return true; - }, - - loadFonts : function(_this, _callback) - { - var fonts = []; - this.extendFonts(fonts); - - this.CallbackObj._this = _this; - this.CallbackObj._callback = _callback; - - var _editor = window["Asc"]["editor"] ? window["Asc"]["editor"] : window.editor; - _editor.asyncMethodCallback = function() { - - var _t = AscFonts.FontPickerByCharacter.CallbackObj; - _t._callback.call(_t._this); - - _t._this = null; - _t._callback = null; - - }; - - AscCommon.g_font_loader.LoadDocumentFonts2(fonts); - return true; - }, - - checkText : function(text, _this, _callback, isCodes, isOnlyAsync, isCheckSymbols) - { - if(window["NATIVE_EDITOR_ENJINE"]) - { - _callback.call(_this); - return false; - } - if (isCheckSymbols !== false) - { - if (isCodes !== true) - { - if (!this.getFontsByString(text)) - { - if (!isOnlyAsync) - _callback.call(_this); - return false; - } - } - else - { - if (!this.getFontsByString2(text)) - { - if (!isOnlyAsync) - _callback.call(_this); - return false; - } - } - } - - var fonts = []; - this.extendFonts(fonts); - - if (false === AscCommon.g_font_loader.CheckFontsNeedLoading(fonts)) - { - if (!isOnlyAsync) - _callback.call(_this); - return false; - } - - this.CallbackObj._this = _this; - this.CallbackObj._callback = _callback; - - var _editor = window["Asc"]["editor"] ? window["Asc"]["editor"] : window.editor; - _editor.asyncMethodCallback = function() { - - var _t = AscFonts.FontPickerByCharacter.CallbackObj; - _t._callback.call(_t._this); - - _t._this = null; - _t._callback = null; - - }; - - AscCommon.g_font_loader.LoadDocumentFonts2(fonts); - return true; - } - }; - - window['AscFonts'] = window['AscFonts'] || {}; - window['AscFonts'].IsCheckSymbols = false; - window['AscFonts'].FontPickerByCharacter = new CFontByCharacter(); - - window['AscFonts']['getSymbolRanges'] = function() { return window['AscFonts'].FontPickerByCharacter.Ranges; }; - -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/loader.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/loader.js deleted file mode 100644 index efdd035d14..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/loader.js +++ /dev/null @@ -1,233 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -(function (window, undefined) -{ - window['AscFonts'] = window['AscFonts'] || {}; - - window['AscFonts'].isEngineReady = false; - window['AscFonts'].api = null; - window['AscFonts'].onSuccess = null; - window['AscFonts'].onError = null; - window['AscFonts'].maxLoadingIndex = 2; // engine (1+1) - window['AscFonts'].curLoadingIndex = 0; - - window['AscFonts'].allocate = function(size) - { - if (typeof(Uint8Array) != 'undefined' && !window.opera) - return new Uint8Array(size); - - var arr = new Array(size); - for (var i=0;i2147483647)?v-4294967296:v; - }, - UShort_To_Short : function(v) - { - return (v>32767)?v-65536:v; - }, - IntToUInt : function(v) - { - return (v<0)?v+4294967296:v; - }, - Short_To_UShort : function(v) - { - return (v<0)?v+65536:v; - } - }; - - function CPointer() - { - this.obj = null; - this.data = null; - this.pos = 0; - } - - function FT_Memory() - { - this.canvas = document.createElement('canvas'); - this.canvas.width = 1; - this.canvas.height = 1; - this.ctx = this.canvas.getContext('2d'); - - this.Alloc = function(size) - { - var p = new CPointer(); - p.obj = this.ctx.createImageData(1, ((size + 3) >> 2)); - p.data = p.obj.data; - p.pos = 0; - return p; - }; - this.AllocHeap = function() - { - // TODO: нужно посмотреть, как эта память будет использоваться. - // нужно ли здесь делать стек, либо все время от нуля делать?? - }; - this.CreateStream = function(size) - { - var _size = ((size + 3) >> 2); - var obj = this.ctx.createImageData(1, _size); - return new FontStream(obj.data, _size); - }; - } - - window['AscFonts'].FT_Memory = FT_Memory; - window['AscFonts'].g_memory = new FT_Memory(); - - // память для растеризации буквы - function CRasterMemory() - { - this.width = 0; - this.height = 0; - this.pitch = 0; - - this.m_oBuffer = null; - this.CheckSize = function(w, h) - { - if (this.width < (w + 1) || this.height < (h + 1)) - { - this.width = Math.max(this.width, w + 1); - this.pitch = 4 * this.width; - this.height = Math.max(this.height, h + 1); - - this.m_oBuffer = null; - this.m_oBuffer = window['AscFonts'].g_memory.ctx.createImageData(this.width, this.height); - } - }; - } - window['AscFonts'].raster_memory = new CRasterMemory(); - - window['AscFonts'].registeredFontManagers = []; - window['AscFonts'].getDefaultBlitting = function() - { - var isUseMap = false; - if (AscCommon.AscBrowser.isAndroidNativeApp) - isUseMap = true; - else if (AscCommon.AscBrowser.isIE && !AscCommon.AscBrowser.isArm) - isUseMap = true; - return isUseMap; - }; - window['AscFonts'].setDefaultBlitting = function(value) - { - var defaultValue = window['AscFonts'].getDefaultBlitting(); - var newValue = value ? defaultValue : !defaultValue; - if (window['AscFonts'].use_map_blitting === newValue) - return; - - window['AscFonts'].use_map_blitting = newValue; - var arrManagers = window['AscFonts'].registeredFontManagers; - for (var i = 0, count = arrManagers.length; i < count; i++) - { - arrManagers[i].ClearFontsRasterCache(); - arrManagers[i].InitializeRasterMemory(); - } - }; - window['AscFonts'].use_map_blitting = window['AscFonts'].getDefaultBlitting(); - -})(window, undefined); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/map.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/map.js deleted file mode 100644 index 4bb61a2b96..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/font/map.js +++ /dev/null @@ -1,3103 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -(function(window, undefined){ - - // Import - var FT_Common = AscFonts.FT_Common; - - var FontStyle = - { - FontStyleRegular: 0, - FontStyleBold: 1, - FontStyleItalic: 2, - FontStyleBoldItalic: 3, - FontStyleUnderline: 4, - FontStyleStrikeout: 8 - }; - - // создаем стрим по обычной base64 строке - function CreateFontData2(input, len) - { - var memoryData = AscCommon.Base64.decode(input, false, len); - return new AscFonts.FontStream(memoryData, memoryData.length); - } - - // создаем стрим по обычной строке - function CreateFontData3(szSrc) - { - var srcLen = szSrc.length; - var stream = new AscFonts.FontStream(AscFonts.allocate(srcLen), srcLen); - - var dstPx = stream.data; - var index = 0; - - while (index < srcLen) - { - dstPx[index] = (szSrc.charCodeAt(index) & 0xFF); - index++; - } - - return stream; - } - - // создаем стрим по base64 строке, в начале которой идет префикс с информацией о длине стрима - function CreateFontData4(input) - { - var memoryData = AscCommon.Base64.decode(input, true); - return new AscFonts.FontStream(memoryData, memoryData.length); - } - - //----------------- FONT_MAP ---------------------------------------- - var FD_UNKNOWN_CHARSET = 3; - - function FD_FontInfo() - { - this.Name = ""; - this.IndexR = -1; - this.IndexI = -1; - this.IndexB = -1; - this.IndexBI = -1; - } - - function FD_FontDictionary() - { - this.FONTS_DICT_ASCII_NAMES_COUNT = 0; - this.FD_Ascii_Names = []; - - this.FD_Ascii_Names_Offsets = null; - if (typeof(Int32Array) != 'undefined' && !window.opera) - this.FD_Ascii_Names_Offsets = new Int32Array(256); - else - this.FD_Ascii_Names_Offsets = new Array(256); - - for (var i = 0; i < 256; i++) - this.FD_Ascii_Names_Offsets[i] = -1; - - this.FONTS_DICT_UNICODE_NAMES_COUNT = 0; - this.FD_Unicode_Names = []; - - this.FONTS_DICT_ASCII_FONTS_COUNT = 0; - this.FD_Ascii_Files = []; - - // шрифты в массиве this.FD_Ascii_Font_Like_Names - в порядке важности. - this.FD_Ascii_Font_Like_Names = [ - ["Cambria Math", "Asana Math", "XITS Math", "Latin Modern"], - ["OpenSymbol"], - ["Arial", "Liberation Sans", "Helvetica", "Nimbus Sans L"], - ["Times New Roman", "Liberation Serif"], - ["Courier New", "Liberation Mono"], - ["Segoe", "Segoe UI"], - ["Cambria", "Caladea"] - ]; - this.FD_Ascii_Font_Like_Main = { - "Cambria Math" : 0, - "Asana Math" : 0, - "XITS Math" : 0, - "Latin Modern" : 0, - - "Symbol" : 1, - "Wingdings" : 1, - - "Arial" : 2, - "Liberation Sans" : 2, - "Helvetica" : 2, - "Nimbus Sans L" : 2, - - "Times New Roman" : 3, - "Liberation Serif" : 3, - - "Courier New" : 4, - "Liberation Mono" : 4, - - "Segoe" : 5, - "Segoe UI" : 5, - - "Cambria" : 6, - "Caladea" : 6 - }; - - this.ChangeGlyphsMap = { - "Symbol" : [ - { Name : "OpenSymbol", IsSymbolSrc : true, MapSrc : [0xB7, 0xA8], MapDst : [0xE12C, 0xE442]}, - { Name : "-", IsSymbolSrc : true, IsSymbolDst : true } - //{ Name : "Standard Symbols PS", IsSymbolSrc : true, MapSrc : [0xF0B7, 0xF0A8], MapDst : [0xB7, 0xA8]} - ], - "Wingdings" : [ - { Name : "OpenSymbol", IsSymbolSrc : true, MapSrc : [0x76, 0x77, 0xD8, 0xA7, 0xFC, 0x71, 0x6C, 0x6F, 0x6E, 0xA1], - MapDst : [0xE441, 0xE442, 0xE25F, 0xE46F, 0xE330, 0x2751, 0xE12C, 0xE43A, 0xE439, 0xE469] } - ] - }; - - this.MainUnicodeRanges = { - "48" : 3000, - "49" : 3000, - "50" : 3000, - - "55" : 3000, - "59" : 3000, - - "28" : 3000, - - "13" : 3000, - "63" : 3000, - "67" : 3000 - }; - } - - FD_FontDictionary.prototype = - { - Init : function() - { - var _base64_data = "qwEAAA0AAABBR0EgQXJhYmVzcXVlGAAAAP///////////////xUAAABBR0EgQXJhYmVzcXVlIERlc2t0b3AbAAAA////////////////CQAAAEFnZW5jeSBGQgEAAAD/////AAAAAP////8HAAAAQWhhcm9uaf//////////AwAAAP////8JAAAAQWtoYmFyIE1U/////wQAAAD/////BQAAAAcAAABBbGRoYWJpBgAAAP///////////////wgAAABBbGdlcmlhbgcAAAD///////////////8FAAAAQW1pIFJZAQAA////////////////BwAAAEFuZGFsdXMIAAAA////////////////CwAAAEFuZ3NhbmEgTmV3CQAAAAsAAAAKAAAAEAAAAAoAAABBbmdzYW5hVVBDDAAAAA4AAAANAAAADwAAAAkAAABBcGFyYWppdGEUAAAAFwAAABUAAAAWAAAAEgAAAEFyYWJpYyBUcmFuc3BhcmVudCgAAAD/////JwAAAP////8SAAAAQXJhYmljIFR5cGVzZXR0aW5nGQAAAP///////////////wUAAABBcmlhbBwAAAAfAAAAHQAAAB4AAAALAAAAQXJpYWwgQmxhY2slAAAA////////////////DAAAAEFyaWFsIE5hcnJvdyAAAAAjAAAAIQAAACIAAAAVAAAAQXJpYWwgUm91bmRlZCBNVCBCb2xkJgAAAP///////////////xAAAABBcmlhbCBVbmljb2RlIE1TJAAAAP///////////////wQAAABBcnZvLAAAACsAAAApAAAAKgAAAAgAAABBc3Rvbi1GMS0AAAD///////////////8UAAAAQmFza2VydmlsbGUgT2xkIEZhY2UuAAAA////////////////BgAAAEJhdGFuZy8AAAD///////////////8JAAAAQmF0YW5nQ2hlMAAAAP///////////////woAAABCYXVoYXVzIDkzMwAAAP///////////////wcAAABCZWxsIE1UNAAAADYAAAA1AAAA/////w4AAABCZXJsaW4gU2FucyBGQk4AAAD/////TAAAAP////8TAAAAQmVybGluIFNhbnMgRkIgRGVtaf//////////TQAAAP////8UAAAAQmVybmFyZCBNVCBDb25kZW5zZWQ3AAAA////////////////EgAAAEJpY2toYW0gU2NyaXB0IFByb///////////OAAAAP////8aAAAAQmlja2hhbSBTY3JpcHQgUHJvIFJlZ3VsYXL//////////zgAAAD/////DgAAAEJsYWNrYWRkZXIgSVRDYwEAAP///////////////wkAAABCb2RvbmkgTVRFAAAAQwAAADsAAAA8AAAADwAAAEJvZG9uaSBNVCBCbGFjaz4AAAA9AAAA//////////8TAAAAQm9kb25pIE1UIENvbmRlbnNlZEIAAABBAAAAPwAAAEAAAAAbAAAAQm9kb25pIE1UIFBvc3RlciBDb21wcmVzc2VkRAAAAP///////////////w8AAABCb2xkIEl0YWxpYyBBcnQ6AAAA////////////////DAAAAEJvb2sgQW50aXF1YTkAAAATAAAAEQAAABIAAAARAAAAQm9va21hbiBPbGQgU3R5bGVGAAAASQAAAEcAAABIAAAAEgAAAEJvb2tzaGVsZiBTeW1ib2wgN1kAAAD///////////////8QAAAAQnJhZGxleSBIYW5kIElUQ0oAAAD///////////////8OAAAAQnJpdGFubmljIEJvbGRLAAAA////////////////CAAAAEJyb2Fkd2F5TwAAAP///////////////w0AAABCcm93YWxsaWEgTmV3UAAAAFIAAABRAAAAVwAAAAwAAABCcm93YWxsaWFVUENTAAAAVQAAAFQAAABWAAAADwAAAEJydXNoIFNjcmlwdCBNVP////9YAAAA//////////8HAAAAQ2FsaWJyaVoAAABcAAAAWwAAAF8AAAANAAAAQ2FsaWJyaSBMaWdodF0AAABeAAAA//////////8UAAAAQ2FsaWJyaSBMaWdodCBJdGFsaWP/////XgAAAP//////////DgAAAENhbGlmb3JuaWFuIEZCYgAAAGEAAABgAAAA/////woAAABDYWxpc3RvIE1UYwAAAGYAAABkAAAAZQAAAAcAAABDYW1icmlhZwAAAGoAAABpAAAAawAAAAwAAABDYW1icmlhIE1hdGhoAAAA////////////////BwAAAENhbmRhcmFsAAAAbgAAAG0AAABvAAAACQAAAENhc3RlbGxhcnAAAAD///////////////8HAAAAQ2VudGF1cnIAAAD///////////////8HAAAAQ2VudHVyeXMAAAD///////////////8OAAAAQ2VudHVyeSBHb3RoaWMYAQAAGwEAABkBAAAaAQAAEgAAAENlbnR1cnkgU2Nob29sYm9va3EAAAAmAgAAJAIAACUCAAAHAAAAQ2hpbGxlcnQAAAD///////////////8KAAAAQ29sb25uYSBNVHUAAAD///////////////8NAAAAQ29taWMgU2FucyBNU3YAAAB4AAAAdwAAAHkAAAAIAAAAQ29uc29sYXN6AAAAfAAAAHsAAAB9AAAACgAAAENvbnN0YW50aWF+AAAAgAAAAH8AAACBAAAADAAAAENvb3BlciBCbGFja4IAAAD///////////////8XAAAAQ29wcGVycGxhdGUgR290aGljIEJvbGSDAAAA////////////////GAAAAENvcHBlcnBsYXRlIEdvdGhpYyBMaWdodIQAAAD///////////////8GAAAAQ29yYmVshQAAAIcAAACGAAAAiAAAAAoAAABDb3JkaWEgTmV3iQAAAIsAAACKAAAAkAAAAAkAAABDb3JkaWFVUEOMAAAAjgAAAI0AAACPAAAACwAAAENvdXJpZXIgTmV3kQAAAJQAAACSAAAAkwAAAAYAAABDdXBydW2YAAAAlwAAAJUAAACWAAAACAAAAEN1cmx6IE1UmQAAAP///////////////wgAAABERkthaS1TQmkBAAD///////////////8OAAAARGFuY2luZyBTY3JpcHSbAAAA/////5oAAAD/////CAAAAERhdW5QZW5onAAAAP///////////////wUAAABEYXZpZJ0AAAD/////ngAAAP////8RAAAARGF2aWQgVHJhbnNwYXJlbnSfAAAA////////////////DgAAAERlY29UeXBlIE5hc2towwAAAP///////////////xkAAABEZWNvVHlwZSBOYXNraCBFeHRlbnNpb25zxgAAAP///////////////xYAAABEZWNvVHlwZSBOYXNraCBTcGVjaWFsxAAAAP///////////////xYAAABEZWNvVHlwZSBOYXNraCBTd2FzaGVzxwAAAP///////////////xcAAABEZWNvVHlwZSBOYXNraCBWYXJpYW50c8UAAAD///////////////8QAAAARGVjb1R5cGUgVGh1bHV0aMIAAAD///////////////8LAAAARGVqYVZ1IFNhbnOgAAAArAAAAKEAAACiAAAAFQAAAERlamFWdSBTYW5zIENvbmRlbnNlZKYAAAClAAAAowAAAKQAAAARAAAARGVqYVZ1IFNhbnMgTGlnaHSnAAAA////////////////EAAAAERlamFWdSBTYW5zIE1vbm+rAAAAqgAAAKgAAACpAAAADAAAAERlamFWdSBTZXJpZq0AAAC0AAAArgAAAK8AAAAWAAAARGVqYVZ1IFNlcmlmIENvbmRlbnNlZLMAAACyAAAAsAAAALEAAAALAAAARGlsbGVuaWFVUEN/AgAAfgIAAHwCAAB9AgAACAAAAERpbmdiYXRztQAAAP///////////////wsAAABEaXdhbmkgQmVudLYAAAD///////////////8NAAAARGl3YW5pIExldHRlcrcAAAD///////////////8VAAAARGl3YW5pIE91dGxpbmUgU2hhZGVkyAAAAP///////////////xUAAABEaXdhbmkgU2ltcGxlIE91dGxpbmXKAAAA////////////////FwAAAERpd2FuaSBTaW1wbGUgT3V0bGluZSAyyQAAAP///////////////xUAAABEaXdhbmkgU2ltcGxlIFN0cmlwZWTLAAAA////////////////CQAAAERva0NoYW1wYbgAAAD///////////////8FAAAARG90dW0iAQAA////////////////CAAAAERvdHVtQ2hlIwEAAP///////////////woAAABEcm9pZCBTYW5zvAAAAP////+7AAAA/////w8AAABEcm9pZCBTYW5zIE1vbm+9AAAA////////////////CwAAAERyb2lkIFNlcmlmwQAAAMAAAAC+AAAAvwAAAAYAAABFYnJpbWHMAAAA/////80AAAD/////FAAAAEVkd2FyZGlhbiBTY3JpcHQgSVRDZAEAAP///////////////wgAAABFbGVwaGFudM4AAADPAAAA//////////8MAAAARW5ncmF2ZXJzIE1U0AAAAP///////////////w0AAABFcmFzIEJvbGQgSVRD0QAAAP///////////////w0AAABFcmFzIERlbWkgSVRD0gAAAP///////////////w4AAABFcmFzIExpZ2h0IElUQ9MAAAD///////////////8PAAAARXJhcyBNZWRpdW0gSVRD1AAAAP///////////////xEAAABFc3RyYW5nZWxvIEVkZXNzYdUAAAD///////////////8LAAAARXVjcm9zaWFVUEODAgAAggIAAIACAACBAgAACAAAAEV1cGhlbWlh1gAAAP///////////////wYAAABFeHBvIE1WAQAA////////////////BwAAAEZaU2h1VGnsAAAA////////////////BwAAAEZaWWFvVGntAAAA////////////////CAAAAEZhbmdTb25nPAIAAP///////////////xEAAABGYXJzaSBTaW1wbGUgQm9sZOkAAAD///////////////8UAAAARmFyc2kgU2ltcGxlIE91dGxpbmXqAAAA////////////////DQAAAEZlbGl4IFRpdGxpbmfXAAAA////////////////GAAAAEZpeGVkIE1pcmlhbSBUcmFuc3BhcmVudMIBAAD///////////////8QAAAARmxlbWlzaFNjcmlwdCBCVNgAAAD///////////////8SAAAARm9vdGxpZ2h0IE1UIExpZ2h06wAAAP///////////////wUAAABGb3J0ZdkAAAD///////////////8KAAAARnJhbmtSdWVobOQAAAD///////////////8UAAAARnJhbmtsaW4gR290aGljIEJvb2vaAAAA2wAAAP//////////FAAAAEZyYW5rbGluIEdvdGhpYyBEZW1p3AAAAN4AAAD//////////xkAAABGcmFua2xpbiBHb3RoaWMgRGVtaSBDb25k3QAAAP///////////////xUAAABGcmFua2xpbiBHb3RoaWMgSGVhdnnfAAAA4AAAAP//////////FgAAAEZyYW5rbGluIEdvdGhpYyBNZWRpdW3hAAAA4wAAAP//////////GwAAAEZyYW5rbGluIEdvdGhpYyBNZWRpdW0gQ29uZOIAAAD///////////////8KAAAARnJlZXNpYVVQQ4cCAACGAgAAhAIAAIUCAAAQAAAARnJlZXN0eWxlIFNjcmlwdOYAAAD///////////////8QAAAARnJlbmNoIFNjcmlwdCBNVOgAAAD///////////////8LAAAAR09TVCB0eXBlIEEWAQAA////////////////CwAAAEdPU1QgdHlwZSBCFwEAAP///////////////wgAAABHYWJyaW9sYe4AAAD///////////////8GAAAAR2FkdWdp7wAAAP/////wAAAA/////wgAAABHYXJhbW9uZPIAAAD0AAAA8wAAAP////8HAAAAR2F1dGFtafUAAAD/////9gAAAP////8NAAAAR2VudGl1bSBCYXNpY/oAAAD5AAAA9wAAAPgAAAASAAAAR2VudGl1bSBCb29rIEJhc2lj/gAAAP0AAAD7AAAA/AAAAAcAAABHZW9yZ2lh/wAAAAEBAAAAAQAAAgEAAAQAAABHaWdpBgEAAP///////////////wwAAABHaWxsIFNhbnMgTVQNAQAACgEAAAgBAAAHAQAAFgAAAEdpbGwgU2FucyBNVCBDb25kZW5zZWQJAQAA////////////////HwAAAEdpbGwgU2FucyBNVCBFeHQgQ29uZGVuc2VkIEJvbGQUAQAA////////////////FAAAAEdpbGwgU2FucyBVbHRyYSBCb2xkDAEAAP///////////////x4AAABHaWxsIFNhbnMgVWx0cmEgQm9sZCBDb25kZW5zZWQLAQAA////////////////BQAAAEdpc2hhDgEAAP////8PAQAA/////x0AAABHbG91Y2VzdGVyIE1UIEV4dHJhIENvbmRlbnNlZBMBAAD///////////////8PAAAAR291ZHkgT2xkIFN0eWxlHAEAAB4BAAAdAQAA/////wsAAABHb3VkeSBTdG91dB8BAAD///////////////8FAAAAR3VsaW0gAQAA////////////////CAAAAEd1bGltQ2hlIQEAAP///////////////wcAAABHdW5nc3VoMQAAAP///////////////woAAABHdW5nc3VoQ2hlMgAAAP///////////////w8AAABHdXR0bWFuIEFoYXJvbmnxAAAA////////////////EAAAAEd1dHRtYW4gRHJvZ29saW66AAAA/////7kAAAD/////DQAAAEd1dHRtYW4gRnJhbmsDAQAA/////+UAAAD/////DQAAAEd1dHRtYW4gRnJuZXfnAAAA////////////////DAAAAEd1dHRtYW4gSGFpbQQBAAD///////////////8WAAAAR3V0dG1hbiBIYWltLUNvbmRlbnNlZAUBAAD///////////////8OAAAAR3V0dG1hbiBIYXR6dml2AgAA/////3UCAAD/////CwAAAEd1dHRtYW4gS2F2EgEAAP////8QAQAA/////xEAAABHdXR0bWFuIEthdi1MaWdodBEBAAD///////////////8NAAAAR3V0dG1hbiBMb2dvMY8BAAD///////////////8PAAAAR3V0dG1hbiBNYW50b3ZhpgEAAP////+kAQAA/////xUAAABHdXR0bWFuIE1hbnRvdmEtRGVjb3KlAQAA////////////////DgAAAEd1dHRtYW4gTWlyeWFtugEAAP////+4AQAA/////w8AAABHdXR0bWFuIE15YW1maXgVAQAA////////////////DQAAAEd1dHRtYW4gUmFzaGkWAgAA/////xcCAAD/////DAAAAEd1dHRtYW4gU3RhbU0CAAD///////////////8NAAAAR3V0dG1hbiBTdGFtMU4CAAD///////////////8NAAAAR3V0dG1hbiBWaWxuYaUCAAD/////pgIAAP////8LAAAAR3V0dG1hbiBZYWQlAQAA////////////////EQAAAEd1dHRtYW4gWWFkLUJydXNoJAEAAP///////////////xEAAABHdXR0bWFuIFlhZC1MaWdodCYBAAD///////////////8PAAAAR3V0dG1hbi1BaGFyb25p//////////8CAAAA/////wwAAABHdXR0bWFuLUFyYW0aAAAA////////////////DwAAAEd1dHRtYW4tQ291ck1pcrkBAAD///////////////8JAAAASEdHb3RoaWNFNwEAAP///////////////wkAAABIR0dvdGhpY006AQAA////////////////CwAAAEhHR3lvc2hvdGFpPQEAAP///////////////w0AAABIR0t5b2thc2hvdGFpQAEAAP///////////////xAAAABIR01hcnVHb3RoaWNNUFJPUwEAAP///////////////wkAAABIR01pbmNob0JDAQAA////////////////CQAAAEhHTWluY2hvRUYBAAD///////////////8KAAAASEdQR290aGljRTgBAAD///////////////8KAAAASEdQR290aGljTTsBAAD///////////////8MAAAASEdQR3lvc2hvdGFpPgEAAP///////////////w4AAABIR1BLeW9rYXNob3RhaUEBAAD///////////////8KAAAASEdQTWluY2hvQkQBAAD///////////////8KAAAASEdQTWluY2hvRUcBAAD///////////////8TAAAASEdQU29laUtha3Vnb3RoaWNVQlABAAD///////////////8RAAAASEdQU29laUtha3Vwb3B0YWlKAQAA////////////////EQAAAEhHUFNvZWlQcmVzZW5jZUVCTQEAAP///////////////woAAABIR1NHb3RoaWNFOQEAAP///////////////woAAABIR1NHb3RoaWNNPAEAAP///////////////wwAAABIR1NHeW9zaG90YWk/AQAA////////////////DgAAAEhHU0t5b2thc2hvdGFpQgEAAP///////////////woAAABIR1NNaW5jaG9CRQEAAP///////////////woAAABIR1NNaW5jaG9FSAEAAP///////////////xMAAABIR1NTb2VpS2FrdWdvdGhpY1VCUQEAAP///////////////xEAAABIR1NTb2VpS2FrdXBvcHRhaUsBAAD///////////////8RAAAASEdTU29laVByZXNlbmNlRUJOAQAA////////////////EQAAAEhHU2Vpa2Fpc2hvdGFpUFJPUgEAAP///////////////xIAAABIR1NvZWlLYWt1Z290aGljVUJPAQAA////////////////EAAAAEhHU29laUtha3Vwb3B0YWlJAQAA////////////////EAAAAEhHU29laVByZXNlbmNlRUJMAQAA////////////////DgAAAEhZR290aGljLUV4dHJhKQEAAP///////////////w8AAABIWUdvdGhpYy1NZWRpdW0qAQAA////////////////EAAAAEhZR3JhcGhpYy1NZWRpdW0nAQAA////////////////DQAAAEhZR3VuZ1NvLUJvbGQoAQAA////////////////EQAAAEhZSGVhZExpbmUtTWVkaXVtKwEAAP///////////////xAAAABIWU15ZW9uZ0pvLUV4dHJhLAEAAP///////////////w4AAABIWVBNb2tHYWstQm9sZC4BAAD///////////////8MAAAASFlQb3N0LUxpZ2h0LwEAAP///////////////w0AAABIWVBvc3QtTWVkaXVtMAEAAP///////////////xMAAABIWVNob3J0U2FtdWwtTWVkaXVtMQEAAP///////////////xQAAABIWVNpbk15ZW9uZ0pvLU1lZGl1bS0BAAD///////////////8QAAAASGFldHRlbnNjaHdlaWxlcjQBAAD///////////////8RAAAASGFuV2FuZ01pbmdNZWRpdW2wAgAA////////////////EwAAAEhhcmxvdyBTb2xpZCBJdGFsaWP/////MgEAAP//////////CgAAAEhhcnJpbmd0b24zAQAA////////////////CgAAAEhlYWRsaW5lIFJbAQAA////////////////DwAAAEhpZ2ggVG93ZXIgVGV4dFwBAABdAQAA//////////8GAAAASW1wYWN0XgEAAP///////////////xEAAABJbXByaW50IE1UIFNoYWRvd18BAAD///////////////8OAAAASW5mb3JtYWwgUm9tYW5gAQAA////////////////BwAAAElyaXNVUEOLAgAAigIAAIgCAACJAgAADAAAAElza29vbGEgUG90YWEBAAD/////YgEAAP////8SAAAASXRhbGljIE91dGxpbmUgQXJ0ZgEAAP///////////////woAAABKYXNtaW5lVVBDjwIAAI4CAACMAgAAjQIAAAgAAABKb2tlcm1hbmcBAAD///////////////8JAAAASnVpY2UgSVRDaAEAAP///////////////wUAAABLYWlUaT4CAAD///////////////8HAAAAS2FsaW5nYWoBAAD/////awEAAP////8HAAAAS2FydGlrYWwBAAD/////bQEAAP////8IAAAAS2htZXIgVUlwAQAA/////3EBAAD/////DAAAAEtvZGNoaWFuZ1VQQ5MCAACSAgAAkAIAAJECAAAGAAAAS29raWxhcgEAAHUBAABzAQAAdAEAAAsAAABLcmlzdGVuIElUQ2UBAAD///////////////8VAAAAS3VmaSBFeHRlbmRlZCBPdXRsaW5lbgEAAP///////////////xMAAABLdWZpIE91dGxpbmUgU2hhZGVkbwEAAP///////////////w8AAABLdW5zdGxlciBTY3JpcHR3AQAA////////////////BgAAAExhbyBVSXgBAAD/////eQEAAP////8FAAAATGF0aGF6AQAA/////3sBAAD/////DwAAAExlZCBJdGFsaWMgRm9udIIBAAD///////////////8KAAAATGVlbGF3YWRlZYMBAAD/////hAEAAP////8KAAAATGV2ZW5pbSBNVJkBAAD/////mgEAAP////8EAAAATGlTdT8CAAD///////////////8HAAAATGlseVVQQ5cCAACWAgAAlAIAAJUCAAAHAAAATG9ic3RlcooBAAD///////////////8LAAAATG9ic3RlciAxLjSKAQAA////////////////CwAAAExvYnN0ZXIgVHdvjgEAAI0BAACLAQAAjAEAAA0AAABMdWNpZGEgQnJpZ2h0fQEAAIABAAB+AQAAfwEAABIAAABMdWNpZGEgQ2FsbGlncmFwaHmBAQAA////////////////DgAAAEx1Y2lkYSBDb25zb2xlmAEAAP///////////////woAAABMdWNpZGEgRmF4hQEAAIgBAACGAQAAhwEAABIAAABMdWNpZGEgSGFuZHdyaXRpbmeJAQAA////////////////CwAAAEx1Y2lkYSBTYW5zkAEAAJMBAACRAQAAkgEAABYAAABMdWNpZGEgU2FucyBUeXBld3JpdGVylAEAAJcBAACVAQAAlgEAABMAAABMdWNpZGEgU2FucyBVbmljb2RlmwEAAP///////////////wkAAABNUyBHb3RoaWPEAQAA////////////////CQAAAE1TIE1pbmNob8sBAAD///////////////8KAAAATVMgT3V0bG9va/MBAAD///////////////8KAAAATVMgUEdvdGhpY8YBAAD///////////////8KAAAATVMgUE1pbmNob8wBAAD///////////////8XAAAATVMgUmVmZXJlbmNlIFNhbnMgU2VyaWYZAgAA////////////////FgAAAE1TIFJlZmVyZW5jZSBTcGVjaWFsdHkaAgAA////////////////DAAAAE1TIFVJIEdvdGhpY8UBAAD///////////////8HAAAATVYgQm9sadcBAAD///////////////8HAAAATWFnaWMgUloBAAD///////////////8HAAAATWFnbmV0b///////////nAEAAP////8LAAAATWFpYW5kcmEgR0SdAQAA////////////////DQAAAE1hbGd1biBHb3RoaWOgAQAA/////6EBAAD/////BgAAAE1hbmdhbKIBAAD/////owEAAP////8HAAAATWFybGV0dKcBAAD///////////////8ZAAAATWF0dXJhIE1UIFNjcmlwdCBDYXBpdGFsc6gBAAD///////////////8GAAAATWVpcnlvqQEAAKoBAACtAQAArgEAAAkAAABNZWlyeW8gVUmrAQAArAEAAK8BAACwAQAAEgAAAE1pY3Jvc29mdCBIaW1hbGF5YVQBAAD///////////////8SAAAATWljcm9zb2Z0IEpoZW5nSGVpxwEAAP/////JAQAA/////xUAAABNaWNyb3NvZnQgSmhlbmdIZWkgVUnIAQAA/////8oBAAD/////FQAAAE1pY3Jvc29mdCBOZXcgVGFpIEx1Zd4BAAD/////3wEAAP////8RAAAATWljcm9zb2Z0IFBoYWdzUGECAgAA/////wMCAAD/////FAAAAE1pY3Jvc29mdCBTYW5zIFNlcmlmsQEAAP///////////////xAAAABNaWNyb3NvZnQgVGFpIExlXgIAAP////9fAgAA/////xAAAABNaWNyb3NvZnQgVWlnaHVyzgEAAP/////NAQAA/////w8AAABNaWNyb3NvZnQgWWFIZWnPAQAA/////9EBAAD/////EgAAAE1pY3Jvc29mdCBZYUhlaSBVSdABAAD/////0gEAAP////8SAAAATWljcm9zb2Z0IFlpIEJhaXRp0wEAAP///////////////wcAAABNaW5nTGlVsgEAAP///////////////wwAAABNaW5nTGlVLUV4dEK1AQAA////////////////DQAAAE1pbmdMaVVfSEtTQ1O0AQAA////////////////EgAAAE1pbmdMaVVfSEtTQ1MtRXh0QrcBAAD///////////////8GAAAATWlyaWFtwAEAAP///////////////wwAAABNaXJpYW0gRml4ZWTBAQAA////////////////EgAAAE1pcmlhbSBUcmFuc3BhcmVudMMBAAD///////////////8HAAAATWlzdHJhbLsBAAD///////////////8NAAAATW9kZXJuIE5vLiAyML0BAAD///////////////8IAAAATW9ldW1UIFJVAQAA////////////////DwAAAE1vbmdvbGlhbiBCYWl0ab4BAAD///////////////8QAAAATW9ub3R5cGUgQ29yc2l2Yf/////UAQAA//////////8RAAAATW9ub3R5cGUgSGFkYXNzYWg1AQAA/////zYBAAD/////DgAAAE1vbm90eXBlIEtvdWZp/////3YBAAD//////////w4AAABNb25vdHlwZSBTb3J0c9UBAAD///////////////8JAAAATW9vbEJvcmFuvwEAAP///////////////wgAAABNdWRpciBNVP/////WAQAA//////////8MAAAATXlhbm1hciBUZXh0vAEAAP///////////////wcAAABOU2ltU3VuRAIAAP///////////////wgAAABOYXJraXNpbd0BAAD///////////////8JAAAATmV3IEd1bGlt2AEAAP///////////////xAAAABOaWFnYXJhIEVuZ3JhdmVk2QEAAP///////////////w0AAABOaWFnYXJhIFNvbGlk2gEAAP///////////////woAAABOaXJtYWxhIFVJ2wEAAP/////cAQAA/////wUAAABOeWFsYeABAAD///////////////8OAAAAT0NSIEEgRXh0ZW5kZWThAQAA////////////////BAAAAE9DUkLiAQAA////////////////DgAAAE9sZCBBbnRpYyBCb2xk4wEAAP///////////////xQAAABPbGQgQW50aWMgRGVjb3JhdGl2ZeQBAAD///////////////8RAAAAT2xkIEFudGljIE91dGxpbmXlAQAA////////////////GAAAAE9sZCBBbnRpYyBPdXRsaW5lIFNoYWRlZOcBAAD///////////////8TAAAAT2xkIEVuZ2xpc2ggVGV4dCBNVOYBAAD///////////////8EAAAAT255eOgBAAD///////////////8JAAAAT3BlbiBTYW5z7wEAAO4BAADpAQAA6gEAABMAAABPcGVuIFNhbnMgQ29uZGVuc2Vk///////////rAQAA/////xkAAABPcGVuIFNhbnMgQ29uZGVuc2VkIExpZ2h07AEAAO0BAAD//////////woAAABPcGVuU3ltYm9s8AEAAP///////////////wYAAABPc3dhbGTyAQAA//////EBAAD/////CAAAAFBNaW5nTGlVswEAAP///////////////w0AAABQTWluZ0xpVS1FeHRCtgEAAP///////////////wwAAABQVCBCb2xkIEFyY2gIAgAA////////////////DgAAAFBUIEJvbGQgQnJva2VuCQIAAP///////////////w0AAABQVCBCb2xkIER1c2t5CgIAAP///////////////w8AAABQVCBCb2xkIEhlYWRpbmcLAgAA////////////////DgAAAFBUIEJvbGQgTWlycm9yDAIAAP///////////////w0AAABQVCBCb2xkIFN0YXJzDQIAAP///////////////wcAAABQVCBTYW5zEgIAABECAAAPAgAAEAIAABMAAABQVCBTZXBhcmF0ZWQgQmFsb29uDgIAAP///////////////xQAAABQVCBTaW1wbGUgQm9sZCBSdWxlZEkCAAD///////////////8IAAAAUGFjaWZpY2/0AQAA////////////////EAAAAFBhbGFjZSBTY3JpcHQgTVT/////+QEAAP//////////EQAAAFBhbGF0aW5vIExpbm90eXBl9QEAAPgBAAD2AQAA9wEAAAcAAABQYXB5cnVz+gEAAP///////////////wkAAABQYXJjaG1lbnT7AQAA////////////////CAAAAFBlcnBldHVhAQIAAP4BAAD9AQAA/AEAABMAAABQZXJwZXR1YSBUaXRsaW5nIE1UAAIAAP//////AQAA/////xQAAABQbGFudGFnZW5ldCBDaGVyb2tlZQQCAAD///////////////8IAAAAUGxheWJpbGwFAgAA////////////////DAAAAFBvb3IgUmljaGFyZAYCAAD///////////////8IAAAAUHJpc3RpbmEHAgAA////////////////CAAAAFB5dW5qaSBSWAEAAP///////////////wUAAABSYWF2aRMCAAD/////FAIAAP////8LAAAAUmFnZSBJdGFsaWMVAgAA////////////////BQAAAFJhdmllGAIAAP///////////////wgAAABSb2Nrd2VsbB0CAAAhAgAAHgIAAB8CAAASAAAAUm9ja3dlbGwgQ29uZGVuc2VkHAIAAP////8bAgAA/////xMAAABSb2Nrd2VsbCBFeHRyYSBCb2xkIAIAAP///////////////wMAAABSb2QiAgAA////////////////DwAAAFJvZCBUcmFuc3BhcmVudCMCAAD///////////////8IAAAAU1RDYWl5dW5PAgAA////////////////CgAAAFNURmFuZ3NvbmdRAgAA////////////////BgAAAFNUSHVwb1ICAAD///////////////8HAAAAU1RLYWl0aVMCAAD///////////////8GAAAAU1RMaXRpVAIAAP///////////////wYAAABTVFNvbmdVAgAA////////////////BwAAAFNUWGloZWlWAgAA////////////////CQAAAFNUWGluZ2thaVcCAAD///////////////8IAAAAU1RYaW53ZWlYAgAA////////////////CwAAAFNUWmhvbmdzb25nWQIAAP///////////////w4AAABTYWtrYWwgTWFqYWxsYZ4BAAD/////nwEAAP////8OAAAAU2NyaXB0IE1UIEJvbGQnAgAA////////////////CwAAAFNlZ29lIFByaW50KAIAAP////8pAgAA/////wwAAABTZWdvZSBTY3JpcHQqAgAA/////ysCAAD/////CAAAAFNlZ29lIFVJLAIAAC4CAAAtAgAAMQIAAA4AAABTZWdvZSBVSSBMaWdodC8CAAAyAgAA//////////8RAAAAU2Vnb2UgVUkgU2VtaWJvbGQzAgAANAIAAP//////////EgAAAFNlZ29lIFVJIFNlbWlsaWdodDACAAA1AgAA//////////8PAAAAU2Vnb2UgVUkgU3ltYm9sNgIAAP///////////////w0AAABTaG9uYXIgQmFuZ2xhNwIAAP////84AgAA/////w8AAABTaG93Y2FyZCBHb3RoaWM5AgAA////////////////BgAAAFNocnV0aToCAAD/////OwIAAP////8GAAAAU2ltSGVpPQIAAP///////////////wYAAABTaW1TdW5DAgAA////////////////CwAAAFNpbVN1bi1FeHRCRQIAAP///////////////xMAAABTaW1wbGUgQm9sZCBKdXQgT3V0SAIAAP///////////////xUAAABTaW1wbGUgSW5kdXN0IE91dGxpbmVKAgAA////////////////FAAAAFNpbXBsZSBJbmR1c3QgU2hhZGVkSwIAAP///////////////xIAAABTaW1wbGUgT3V0bGluZSBQYXRMAgAA////////////////EQAAAFNpbXBsaWZpZWQgQXJhYmljQgIAAP////9AAgAA/////xcAAABTaW1wbGlmaWVkIEFyYWJpYyBGaXhlZEECAAD///////////////8IAAAAU25hcCBJVENHAgAA////////////////BwAAAFN0ZW5jaWxQAgAA////////////////BwAAAFN5bGZhZW5aAgAA////////////////BgAAAFN5bWJvbFsCAAD///////////////8GAAAAVGFob21hXAIAAP////9dAgAA/////wkAAABUYWxsIFBhdWxgAgAA////////////////DwAAAFRlbXB1cyBTYW5zIElUQ2gCAAD///////////////8PAAAAVGltZXMgTmV3IFJvbWFuaQIAAGwCAABqAgAAawIAABIAAABUcmFkaXRpb25hbCBBcmFiaWNuAgAA/////20CAAD/////DAAAAFRyZWJ1Y2hldCBNU28CAAByAgAAcAIAAHECAAAFAAAAVHVuZ2FzAgAA/////3QCAAD/////CQAAAFR3IENlbiBNVGcCAABmAgAAYgIAAGECAAATAAAAVHcgQ2VuIE1UIENvbmRlbnNlZGUCAAD/////YwIAAP////8eAAAAVHcgQ2VuIE1UIENvbmRlbnNlZCBFeHRyYSBCb2xkZAIAAP///////////////wYAAABVYnVudHV6AgAAeQIAAHcCAAB4AgAAEAAAAFVidW50dSBDb25kZW5zZWR7AgAA////////////////EAAAAFVyZHUgVHlwZXNldHRpbmeYAgAA////////////////BgAAAFV0c2FhaJkCAACcAgAAmgIAAJsCAAAEAAAAVmFuaZ0CAAD/////ngIAAP////8HAAAAVmVyZGFuYZ8CAAChAgAAoAIAAKICAAAGAAAAVmlqYXlhowIAAP////+kAgAA/////w4AAABWaW5lciBIYW5kIElUQ6cCAAD///////////////8HAAAAVml2YWxkaf////+oAgAA//////////8PAAAAVmxhZGltaXIgU2NyaXB0qQIAAP///////////////wYAAABWcmluZGGqAgAA/////6sCAAD/////CAAAAFdlYmRpbmdzrAIAAP///////////////woAAABXaWRlIExhdGlufAEAAP///////////////wkAAABXaW5nZGluZ3OtAgAA////////////////CwAAAFdpbmdkaW5ncyAyrgIAAP///////////////wsAAABXaW5nZGluZ3MgM68CAAD///////////////8FAAAAWWV0IFJXAQAA////////////////BwAAAFlvdVl1YW5GAgAA//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAAAAFQAAAC4AAABJAAAAaAAAAHQAAACIAAAAtwAAAOUAAADrAAAA7gAAAPgAAAAKAQAAOQEAAEABAABNAQAA/////2QBAABsAQAAjwEAAJkBAACdAQAApAEAAP////+pAQAA/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1sAAAAdAAAASEdQ5Ym16Iux6KeS7726776e7728772v7724VUJQAQAA////////////////HgAAAEhHUOWJteiLseinku++ju++n++9r+++jO++n+S9k0oBAAD///////////////8gAAAASEdQ5Ym16Iux776M776f776a772+776e776d7729RUJNAQAA////////////////DwAAAEhHUOaVmeenkeabuOS9k0EBAAD///////////////8KAAAASEdQ5piO5pydQkQBAAD///////////////8KAAAASEdQ5piO5pydRUcBAAD///////////////8MAAAASEdQ6KGM5pu45L2TPgEAAP///////////////xMAAABIR1Dvvbrvvp7vvbzvva/vvbhFOAEAAP///////////////xMAAABIR1Dvvbrvvp7vvbzvva/vvbhNOwEAAP///////////////x0AAABIR1PlibXoi7Hop5Lvvbrvvp7vvbzvva/vvbhVQlEBAAD///////////////8eAAAASEdT5Ym16Iux6KeS776O776f772v776M776f5L2TSwEAAP///////////////yAAAABIR1PlibXoi7Hvvozvvp/vvprvvb7vvp7vvp3vvb1FQk4BAAD///////////////8PAAAASEdT5pWZ56eR5pu45L2TQgEAAP///////////////woAAABIR1PmmI7mnJ1CRQEAAP///////////////woAAABIR1PmmI7mnJ1FSAEAAP///////////////wwAAABIR1PooYzmm7jkvZM/AQAA////////////////EwAAAEhHU++9uu++nu+9vO+9r++9uEU5AQAA////////////////EwAAAEhHU++9uu++nu+9vO+9r++9uE08AQAA////////////////GQAAAEhH5Li47726776e7728772v7724TS1QUk9TAQAA////////////////HAAAAEhH5Ym16Iux6KeS7726776e7728772v7724VUJPAQAA////////////////HQAAAEhH5Ym16Iux6KeS776O776f772v776M776f5L2TSQEAAP///////////////x8AAABIR+WJteiLse++jO++n+++mu+9vu++nu++ne+9vUVCTAEAAP///////////////w4AAABIR+aVmeenkeabuOS9k0ABAAD///////////////8JAAAASEfmmI7mnJ1CQwEAAP///////////////wkAAABIR+aYjuacnUVGAQAA////////////////EgAAAEhH5q2j5qW35pu45L2TLVBST1IBAAD///////////////8LAAAASEfooYzmm7jkvZM9AQAA////////////////EgAAAEhH7726776e7728772v7724RTcBAAD///////////////8SAAAASEfvvbrvvp7vvbzvva/vvbhNOgEAAP///////////////wsAAABIWeqyrOqzoOuUlSkBAAD///////////////8LAAAASFnqsqzrqoXsobAsAQAA////////////////CQAAAEhZ6raB7IScQigBAAD///////////////8MAAAASFnqt7jrnpjtlL1NJwEAAP///////////////w8AAABIWeuqqeqwge2MjOyehEIuAQAA////////////////CwAAAEhZ7Iug66qF7KGwLQEAAP///////////////w8AAABIWeyWleydgOyDmOusvE0xAQAA////////////////CQAAAEhZ7Je97IScTC8BAAD///////////////8JAAAASFnsl73shJxNMAEAAP///////////////wsAAABIWeykkeqzoOuUlSoBAAD///////////////8PAAAASFntl6Trk5zrnbzsnbhNKwEAAP///////////////wwAAADjg6HjgqTjg6rjgqqpAQAAqgEAAK0BAACuAQAABgAAAOS7v+WuizwCAAD///////////////8MAAAA5Y2O5paH5Lit5a6LWQIAAP///////////////wwAAADljY7mlofku7/lrotRAgAA////////////////DAAAAOWNjuaWh+Wui+S9k1UCAAD///////////////8MAAAA5Y2O5paH5b2p5LqRTwIAAP///////////////wwAAADljY7mlofmlrDprY9YAgAA////////////////DAAAAOWNjuaWh+alt+S9k1MCAAD///////////////8MAAAA5Y2O5paH55Cl54+AUgIAAP///////////////wwAAADljY7mlofnu4bpu5FWAgAA////////////////DAAAAOWNjuaWh+ihjOalt1cCAAD///////////////8MAAAA5Y2O5paH6Zq25LmmVAIAAP///////////////wYAAADlrovkvZNDAgAA////////////////BgAAAOW5vOWchkYCAAD///////////////8PAAAA5b6u6Luf5q2j6buR6auUxwEAAP/////JAQAA/////wwAAADlvq7ova/pm4Xpu5HPAQAA/////9EBAAD/////CQAAAOaWsOWui+S9k0QCAAD///////////////8MAAAA5paw57Sw5piO6auUswEAAP///////////////xEAAADmlrDntLDmmI7pq5QtRXh0QrYBAAD///////////////8MAAAA5pa55q2j5aea5L2T7QAAAP///////////////wwAAADmlrnmraPoiJLkvZPsAAAA////////////////BgAAAOalt+S9kz4CAAD///////////////8JAAAA5qiZ5qW36auUaQEAAP///////////////xUAAADnjovmvKLlrpfkuK3mmI7pq5TnuYGwAgAA////////////////CQAAAOe0sOaYjumrlLIBAAD///////////////8OAAAA57Sw5piO6auULUV4dEK1AQAA////////////////DwAAAOe0sOaYjumrlF9IS1NDU7QBAAD///////////////8UAAAA57Sw5piO6auUX0hLU0NTLUV4dEK3AQAA////////////////BgAAAOmatuS5pj8CAAD///////////////8GAAAA6buR5L2TPQIAAP///////////////wYAAADqtbTrprwgAQAA////////////////CQAAAOq1tOumvOyytCEBAAD///////////////8GAAAA6raB7IScMQAAAP///////////////wkAAADqtoHshJzssrQyAAAA////////////////BgAAAOuPi+ybgCIBAAD///////////////8JAAAA64+L7JuA7LK0IwEAAP///////////////w0AAADrp5HsnYAg6rOg65SVoAEAAP////+hAQAA/////wYAAADrsJTtg5UvAAAA////////////////CQAAAOuwlO2DleyytDAAAAD///////////////8JAAAA7IOI6rW066a82AEAAP///////////////xgAAADtnLTrqLzrkaXqt7ztl6Trk5zrnbzsnbhbAQAA////////////////DwAAAO2ctOuovOunpOyngeyytFoBAAD///////////////8NAAAA7Zy066i866qo7J2MVFUBAAD///////////////8PAAAA7Zy066i87JWE66+47LK0WQEAAP///////////////w8AAADtnLTrqLzsl5HsiqTtj6xWAQAA////////////////DAAAAO2ctOuovOyYm+yytFcBAAD///////////////8PAAAA7Zy066i87Y647KeA7LK0WAEAAP///////////////xMAAADvvK3vvLMg44K044K344OD44KvxAEAAP///////////////w0AAADvvK3vvLMg5piO5pydywEAAP///////////////xYAAADvvK3vvLMg77yw44K044K344OD44KvxgEAAP///////////////xAAAADvvK3vvLMg77yw5piO5pydzAEAAP///////////////7ECAAAJAAAAQWdlbmN5IEZCAAAAAAEAAAAAAAAAAAAAAAILCAQCAgICAgQDAAAAAAAAAAAAAAAAAAAAAQAAIAAAAAC8AgMAAAgBAFUB/AJM/1AAAAAAAAkAAABBZ2VuY3kgRkIAAAAAAAAAAAAAAAAAAAAAAgsFAwICAgICBAMAAAAAAAAAAAAAAAAAAAABAAAgAAAAAJABAwAACAEAPAH8Akz/UAAAAAAADwAAAEd1dHRtYW4tQWhhcm9uaQAAAAABAAAAAAAAAAAAAAACAQcBAQEBAQEBABgAAAAAAEAAAAAAAAAAACAAAAAAAAAAvAIFAAAAAQCMAeoCsP4AAAAAAAAHAAAAQWhhcm9uaQAAAAABAAAAAAAAAAAAAAACAQgDAgEEAwIDAQgAAAAAAAAAAAAAAAAAACAAAAAAACAAvAIFAAAAAQDdAd4C9/4AAAAAAAAJAAAAQWtoYmFyIE1UAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAACQAQUAAAABAJgBEQJi/n0AAAAAAAkAAABBa2hiYXIgTVQAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAALwCBQAAAAEAqQErApH+kwAAAAAABwAAAEFsZGhhYmkAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAG8gAKBLgACQAAAAAAAAAABBAAAAAAAAAJABBQAAAAEA/wGDApz+7gIGAYIBCAAAAEFsZ2VyaWFuAAAAAAAAAAAAAAAAAAAAAAQCBwUECgIGBwIDAAAAAAAAAAAAAAAAAAAAAQAAIAAAAACQAQIAAAABAB0CeAMh/9AAAAAAAAcAAABBbmRhbHVzAAAAAAAAAAAAAAAAAAAAAAICBgMFBAUCAwQDIAAAAAAAgAgAAAAAAAAAQQAA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"; - var _ft_stream = CreateFontData2(_base64_data); - var _file_stream = new AscCommon.FileStream(_ft_stream.data, _ft_stream.size); - var i = 0; - - this.FONTS_DICT_ASCII_NAMES_COUNT = _file_stream.GetLong(); - for (i = 0; i < this.FONTS_DICT_ASCII_NAMES_COUNT; i++) - { - var _nameInfo = new FD_FontInfo(); - var _name_len = _file_stream.GetLong(); - _nameInfo.Name = _file_stream.GetString1(_name_len); - _nameInfo.IndexR = _file_stream.GetLong(); - _nameInfo.IndexI = _file_stream.GetLong(); - _nameInfo.IndexB = _file_stream.GetLong(); - _nameInfo.IndexBI = _file_stream.GetLong(); - this.FD_Ascii_Names.push(_nameInfo); - } - - for (i = 0; i < 256; i++) - { - this.FD_Ascii_Names_Offsets[i] = _file_stream.GetLong(); - } - - this.FONTS_DICT_UNICODE_NAMES_COUNT = _file_stream.GetLong(); - for (i = 0; i < this.FONTS_DICT_UNICODE_NAMES_COUNT; i++) - { - var _nameInfo = new FD_FontInfo(); - _nameInfo.Name = this.GetString16(_file_stream); - _nameInfo.IndexR = _file_stream.GetLong(); - _nameInfo.IndexI = _file_stream.GetLong(); - _nameInfo.IndexB = _file_stream.GetLong(); - _nameInfo.IndexBI = _file_stream.GetLong(); - this.FD_Unicode_Names.push(_nameInfo); - } - - this.FONTS_DICT_ASCII_FONTS_COUNT = _file_stream.GetLong(); - for (i = 0; i < this.FONTS_DICT_ASCII_FONTS_COUNT; i++) - { - var _nameInfo = new CFontSelect(); - _nameInfo.fromStream(_file_stream, false); - this.FD_Ascii_Files.push(_nameInfo); - } - }, - - GetString16 : function(_file_stream) - { - var _len = _file_stream.GetLong(); - var _ret = this.GetUTF16_fromUTF8(_file_stream.data, _file_stream.cur, _len); - _file_stream.cur += _len; - return _ret; - }, - - GetUTF16_fromUnicodeChar : function(code) - { - if (code < 0x10000) - return String.fromCharCode(code); - else - { - code -= 0x10000; - return String.fromCharCode(0xD800 | ((code >> 10) & 0x03FF)) + String.fromCharCode(0xDC00 | (code & 0x03FF)); - } - }, - - GetUTF16_fromUTF8 : function(pBuffer, start, count) - { - var _res = ""; - - var lIndex = start; - var end = start + count; - var val = 0; - while (lIndex < end) - { - var byteMain = pBuffer[lIndex]; - if (0x00 == (byteMain & 0x80)) - { - // 1 byte - _res += this.GetUTF16_fromUnicodeChar(byteMain); - ++lIndex; - } - else if (0x00 == (byteMain & 0x20)) - { - // 2 byte - val = (((byteMain & 0x1F) << 6) | - (pBuffer[lIndex + 1] & 0x3F)); - _res += this.GetUTF16_fromUnicodeChar(val); - lIndex += 2; - } - else if (0x00 == (byteMain & 0x10)) - { - // 3 byte - val = (((byteMain & 0x0F) << 12) | - ((pBuffer[lIndex + 1] & 0x3F) << 6) | - (pBuffer[lIndex + 2] & 0x3F)); - - _res += this.GetUTF16_fromUnicodeChar(val); - lIndex += 3; - } - else if (0x00 == (byteMain & 0x08)) - { - // 4 byte - val = (((byteMain & 0x07) << 18) | - ((pBuffer[lIndex + 1] & 0x3F) << 12) | - ((pBuffer[lIndex + 2] & 0x3F) << 6) | - (pBuffer[lIndex + 3] & 0x3F)); - - _res += this.GetUTF16_fromUnicodeChar(val); - lIndex += 4; - } - else if (0x00 == (byteMain & 0x04)) - { - // 5 byte - val = (((byteMain & 0x03) << 24) | - ((pBuffer[lIndex + 1] & 0x3F) << 18) | - ((pBuffer[lIndex + 2] & 0x3F) << 12) | - ((pBuffer[lIndex + 3] & 0x3F) << 6) | - (pBuffer[lIndex + 4] & 0x3F)); - - _res += this.GetUTF16_fromUnicodeChar(val); - lIndex += 5; - } - else - { - // 6 byte - val = (((byteMain & 0x01) << 30) | - ((pBuffer[lIndex + 1] & 0x3F) << 24) | - ((pBuffer[lIndex + 2] & 0x3F) << 18) | - ((pBuffer[lIndex + 3] & 0x3F) << 12) | - ((pBuffer[lIndex + 4] & 0x3F) << 6) | - (pBuffer[lIndex + 5] & 0x3F)); - - _res += this.GetUTF16_fromUnicodeChar(val); - lIndex += 5; - } - } - - return _res; - }, - - CorrectParamsFromDictionary : function(oFormat) - { - if (undefined == oFormat.wsName) - return false; - - var nNameLen = oFormat.wsName.length; - if (nNameLen == 0) - return false; - - var bIsAscii = true; - var i = 0; - for (i = 0; i < nNameLen; ++i) - { - var _char_code = oFormat.wsName.charCodeAt(i); - if (_char_code > 255 || _char_code < 0) - { - bIsAscii = false; - break; - } - } - - var pFont = null; - - if (bIsAscii) - { - var nStartIndex = this.FD_Ascii_Names_Offsets[oFormat.wsName.charCodeAt(0)]; - - if (-1 != nStartIndex) - { - var nIndex = -1; - for (i = nStartIndex; i < this.FONTS_DICT_ASCII_NAMES_COUNT; i++) - { - if (this.FD_Ascii_Names[i].Name == oFormat.wsName) - { - nIndex = i; - break; - } - } - - if (nIndex != -1) - { - var pRec = this.FD_Ascii_Names[nIndex]; - var nFontIndex = -1; - - var nStyle = 0; - if (oFormat.bItalic === true) - nStyle |= 1; - if (oFormat.bBold === true) - nStyle |= 2; - - switch (nStyle) - { - case 1: - { - if (pRec.IndexI != -1) - nFontIndex = pRec.IndexI; - else if (pRec.IndexBI != -1) - nFontIndex = pRec.IndexBI; - else if (pRec.IndexR != -1) - nFontIndex = pRec.IndexR; - else - nFontIndex = pRec.IndexB; - break; - } - case 2: - { - if (pRec.IndexB != -1) - nFontIndex = pRec.IndexB; - else if (pRec.IndexBI != -1) - nFontIndex = pRec.IndexBI; - else if (pRec.IndexR != -1) - nFontIndex = pRec.IndexR; - else - nFontIndex = pRec.IndexI; - break; - } - case 3: - { - if (pRec.IndexBI != -1) - nFontIndex = pRec.IndexBI; - else if (pRec.IndexB != -1) - nFontIndex = pRec.IndexB; - else if (pRec.IndexI != -1) - nFontIndex = pRec.IndexI; - else - nFontIndex = pRec.IndexR; - break; - } - case 0: - default: - { - if (pRec.IndexR != -1) - nFontIndex = pRec.IndexR; - else if (pRec.IndexI != -1) - nFontIndex = pRec.IndexI; - else if (pRec.IndexB != -1) - nFontIndex = pRec.IndexB; - else - nFontIndex = pRec.IndexBI; - break; - } - } - - if (nFontIndex != -1) - pFont = this.FD_Ascii_Files[nFontIndex]; - } - } - } - else - { - var nIndex = -1; - for (i = 0; i < this.FONTS_DICT_UNICODE_NAMES_COUNT; i++) - { - if (this.FD_Unicode_Names[i].Name == oFormat.wsName) - { - nIndex = i; - break; - } - } - - if (nIndex != -1) - { - var pRec = this.FD_Unicode_Names[nIndex]; - var nFontIndex = -1; - - var nStyle = 0; - if (oFormat.bItalic === true) - nStyle |= 1; - if (oFormat.bBold === true) - nStyle |= 2; - - switch (nStyle) - { - case 1: - { - if (pRec.IndexI != -1) - nFontIndex = pRec.IndexI; - else if (pRec.IndexBI != -1) - nFontIndex = pRec.IndexBI; - else if (pRec.IndexR != -1) - nFontIndex = pRec.IndexR; - else - nFontIndex = pRec.IndexB; - break; - } - case 2: - { - if (pRec.IndexB != -1) - nFontIndex = pRec.IndexB; - else if (pRec.IndexBI != -1) - nFontIndex = pRec.IndexBI; - else if (pRec.IndexR != -1) - nFontIndex = pRec.IndexR; - else - nFontIndex = pRec.IndexI; - break; - } - case 3: - { - if (pRec.IndexBI != -1) - nFontIndex = pRec.IndexBI; - else if (pRec.IndexB != -1) - nFontIndex = pRec.IndexB; - else if (pRec.IndexI != -1) - nFontIndex = pRec.IndexI; - else - nFontIndex = pRec.IndexR; - break; - } - case 0: - default: - { - if (pRec.IndexR != -1) - nFontIndex = pRec.IndexR; - else if (pRec.IndexI != -1) - nFontIndex = pRec.IndexI; - else if (pRec.IndexB != -1) - nFontIndex = pRec.IndexB; - else - nFontIndex = pRec.IndexBI; - break; - } - } - - if (nFontIndex != -1) - pFont = this.FD_Ascii_Files[nFontIndex]; - } - } - - if (null == pFont) - return false; - - // может исходный шрифт (pFont) - не содержит такого имени - тогда допишем - if (oFormat.wsName !== pFont.m_wsFontName && !oFormat.wsAltName) - oFormat.wsAltName = oFormat.wsName; - oFormat.wsName = pFont.m_wsFontName; - - // fixed - oFormat.bFixedWidth = (pFont.m_bIsFixed == 1 ? true : false); - - // panose - oFormat.pPanose = pFont.m_aPanose; - - // ranges - oFormat.ulRange1 = pFont.m_ulUnicodeRange1; - oFormat.ulRange2 = pFont.m_ulUnicodeRange2; - oFormat.ulRange3 = pFont.m_ulUnicodeRange3; - oFormat.ulRange4 = pFont.m_ulUnicodeRange4; - oFormat.ulCodeRange1 = pFont.m_ulCodePageRange1; - oFormat.ulCodeRange2 = pFont.m_ulCodePageRange2; - - oFormat.usWeight = pFont.m_usWeigth; - oFormat.usWidth = pFont.m_usWidth; - - oFormat.shAvgCharWidth = pFont.m_shAvgCharWidth; - oFormat.shAscent = pFont.m_shAscent; - oFormat.shDescent = pFont.m_shDescent; - oFormat.shXHeight = pFont.m_shXHeight; - oFormat.shCapHeight = pFont.m_shCapHeight; - - return true; - }, - - GetFontIndex : function(oSelect, oList, DefaultIndex, isName0) - { - this.CorrectParamsFromDictionary(oSelect); - - var nMinIndex = 0; // Номер шрифта в списке с минимальным весом - var nMinPenalty = 0; // Минимальный вес - - var bIsFoundName0 = false; - - var nDefPenalty = 2147483647; - - var nFontsCount = oList.length; - for (var nIndex = 0; nIndex < nFontsCount; nIndex++) - { - var CurPenalty = oList[nIndex].GetPenalty(oSelect, this.MainUnicodeRanges); - - if (undefined !== DefaultIndex && nIndex === DefaultIndex) - nDefPenalty = CurPenalty.Penalty; - - if (isName0 === true && 0 === CurPenalty.NamePenalty && !bIsFoundName0) - { - // встретился первый шрифт с точно таким именем - и запрос с флагом isName0 - - // ставим его в минимальный и теперь будем смотреть ТОЛЬКО с NamePenalty === 0 - bIsFoundName0 = true; - nMinIndex = nIndex; - nMinPenalty = CurPenalty.Penalty; - - if (0 === nMinPenalty) - break; - - continue; - } - - if (bIsFoundName0 && 0 !== CurPenalty.NamePenalty) - continue; - - if (0 === nIndex) - { - nMinIndex = 0; - nMinPenalty = CurPenalty.Penalty; - } - else if (CurPenalty.Penalty < nMinPenalty) - { - nMinIndex = nIndex; - nMinPenalty = CurPenalty.Penalty; - } - - // Нашелся шрифт, удовлетворяющий всем параметрам, дальше искать нет смысла - if (0 === CurPenalty.Penalty) - break; - } - - if (undefined !== DefaultIndex && nDefPenalty === nMinPenalty) - nMinIndex = DefaultIndex; - - if (undefined === DefaultIndex) - return nMinIndex; - - return oList[nMinIndex]; - }, - - CheckLikeFonts : function(sFontName, sReqName) - { - var _index = this.FD_Ascii_Font_Like_Main[sReqName]; - if (undefined === _index) - return false; - - var _arr = this.FD_Ascii_Font_Like_Names[_index]; - var _len = _arr.length; - for (var i = 0; i < _len; i++) - { - // здесь точное равенство! - if (_arr[i] == sFontName) - return true; - } - return false; - } - }; - - //------------------------------------------------------------------- - - function CFontSelectFormat() - { - this.wsName = undefined; - this.wsAltName = undefined; - - this.wsFamilyClass = undefined; - this.sFamilyClass = undefined; - - this.bBold = undefined; - this.bItalic = undefined; - - this.bFixedWidth = undefined; - - this.pPanose = undefined; - - this.ulRange1 = undefined; - this.ulRange2 = undefined; - this.ulRange3 = undefined; - this.ulRange4 = undefined; - this.ulCodeRange1 = undefined; - this.ulCodeRange2 = undefined; - - this.usWeight = undefined; - this.usWidth = undefined; - - this.nFontFormat = undefined; - this.unCharset = undefined; - - this.shAvgCharWidth = undefined; - this.shAscent = undefined; - this.shDescent = undefined; - this.shLineGap = undefined; - this.shXHeight = undefined; - this.shCapHeight = undefined; - } - - // класс для подбора шрифтов - function CFontSelect() - { - this.m_wsFontName = ""; - - this.m_wsFontPath = ""; - this.m_lIndex = 0; - - this.m_bBold = false; - this.m_bItalic = false; - this.m_bIsFixed = false; - - this.m_aPanose = null; - - if (typeof(Int8Array) != 'undefined' && !window.opera) - { - this.m_aPanose = new Int8Array(10); - } - else - { - this.m_aPanose = new Array(10); - } - this.m_ulUnicodeRange1 = 0; - this.m_ulUnicodeRange2 = 0; - this.m_ulUnicodeRange3 = 0; - this.m_ulUnicodeRange4 = 0; - - this.m_ulCodePageRange1 = 0; - this.m_ulCodePageRange2 = 0; - - this.m_usWeigth = 0; - this.m_usWidth = 0; - - this.m_sFamilyClass = 0; - this.m_eFontFormat = 0; - - this.m_shAvgCharWidth = 0; - this.m_shAscent = 0; - this.m_shDescent = 0; - this.m_shLineGap = 0; - this.m_shXHeight = 0; - this.m_shCapHeight = 0; - - this.m_usType = 0; - - this.m_names = null; - } - CFontSelect.prototype = - { - _readStringUtf8 : function(stream, len) - { - if (undefined === len) - len = stream.GetLong(); - return AscCommon.GetStringUtf8(stream, len); - }, - - fromStream : function(fs, bIsDictionary) - { - var _version = window["__all_fonts_js_version__"]; - if (undefined === _version) - _version = 0; - - var recordLen = 0; - var currentPos = fs.cur; - - var bIsUseVersion = (bIsDictionary !== false) ? true : false; - if (!bIsUseVersion) - _version = 0; - - if (_version >= 2) - recordLen = fs.GetLong(); - - // name - var _len = fs.GetLong(); - - if (!bIsUseVersion) - this.m_wsFontName = fs.GetString1(_len); - else - { - switch (_version) - { - case 0: - { - this.m_wsFontName = fs.GetString(_len >> 1); - break; - } - default: - { - this.m_wsFontName = this._readStringUtf8(fs, _len); - - var _count = fs.GetLong(); - if (0 < _count) - this.m_names = []; - - for (var nameI = 0; nameI < _count; nameI++) - this.m_names.push(this._readStringUtf8(fs)); - - break; - } - } - } - - if (bIsUseVersion) - { - switch (_version) - { - case 0: - { - _len = fs.GetLong(); - this.m_wsFontPath = fs.GetString(_len >> 1); - break; - } - default: - { - this.m_wsFontPath = this._readStringUtf8(fs); - break; - } - } - - if (undefined === window["AscDesktopEditor"]) - { - // удаляем все, кроме имени файла - var _found1 = this.m_wsFontPath.lastIndexOf("/"); - var _found2 = this.m_wsFontPath.lastIndexOf("\\"); - var _found = Math.max(_found1, _found2); - - if (0 <= _found) - this.m_wsFontPath = this.m_wsFontPath.substring(_found + 1); - } - else - { - this.m_wsFontPath = this.m_wsFontPath.replace(/\\\\/g, "\\"); - this.m_wsFontPath = this.m_wsFontPath.replace(/\\/g, "/"); - } - } - - this.m_lIndex = fs.GetLong(); - - this.m_bItalic = (1 == fs.GetLong()); - this.m_bBold = (1 == fs.GetLong()); - this.m_bIsFixed = (1 == fs.GetLong()); - - var _panose_len = 10; - if (bIsUseVersion) - _panose_len = fs.GetLong(); // 10 - - for (var i = 0; i < _panose_len; i++) - this.m_aPanose[i] = fs.GetUChar(); - - this.m_ulUnicodeRange1 = fs.GetULong(); - this.m_ulUnicodeRange2 = fs.GetULong(); - this.m_ulUnicodeRange3 = fs.GetULong(); - this.m_ulUnicodeRange4 = fs.GetULong(); - - this.m_ulCodePageRange1 = fs.GetULong(); - this.m_ulCodePageRange2 = fs.GetULong(); - - this.m_usWeigth = fs.GetUShort(); - this.m_usWidth = fs.GetUShort(); - - this.m_sFamilyClass = FT_Common.UShort_To_Short(fs.GetUShort()); - this.m_eFontFormat = FT_Common.UShort_To_Short(fs.GetUShort()); - - this.m_shAvgCharWidth = FT_Common.UShort_To_Short(fs.GetUShort()); - this.m_shAscent = FT_Common.UShort_To_Short(fs.GetUShort()); - this.m_shDescent = FT_Common.UShort_To_Short(fs.GetUShort()); - this.m_shLineGap = FT_Common.UShort_To_Short(fs.GetUShort()); - this.m_shXHeight = FT_Common.UShort_To_Short(fs.GetUShort()); - this.m_shCapHeight = FT_Common.UShort_To_Short(fs.GetUShort()); - - if (_version >= 2) - { - this.m_usType = fs.GetUShort(); - } - - // if new versions - load addition data in this place - - if (_version >= 2) - { - fs.Seek2(currentPos + recordLen); - } - }, - - GetStyle : function() - { - if (this.m_bBold && this.m_bItalic) - return 3; - else if (this.Bold) - return 1; - else if (this.m_bItalic) - return 2; - else - return 0; - }, - - GetPenalty : function(oSelect, _main_ranges) - { - var nCurPenalty = 0; - - if (undefined !== oSelect.pPanose) - { - nCurPenalty += this.GetPanosePenalty(oSelect.pPanose); - } - - if (true) - { - if (undefined !== oSelect.ulRange1 && - undefined !== oSelect.ulRange2 && - undefined !== oSelect.ulRange3 && - undefined !== oSelect.ulRange4 && - undefined !== oSelect.ulCodeRange1 && - undefined !== oSelect.ulCodeRange2) - { - nCurPenalty += this.GetSigPenalty(oSelect, nCurPenalty >= 1000 ? 50 : 10, 10, _main_ranges); - } - } - - var unCharset = FD_UNKNOWN_CHARSET; - if (undefined !== oSelect.unCharset) - unCharset = oSelect.unCharset; - - if (undefined !== oSelect.bFixedWidth) - nCurPenalty += this.GetFixedPitchPenalty(oSelect.bFixedWidth); - - var nNamePenalty = 0; - if (oSelect.wsName !== undefined && oSelect.wsAltName !== undefined) - { - nNamePenalty += Math.min(this.GetFaceNamePenalty(oSelect.wsName), this.GetFaceNamePenalty(oSelect.wsAltName)); - } - else if (oSelect.wsName !== undefined) - nNamePenalty += this.GetFaceNamePenalty(oSelect.wsName); - else if (oSelect.wsAltName !== undefined) - nNamePenalty += this.GetFaceNamePenalty(oSelect.wsAltName); - - nCurPenalty += nNamePenalty; - - if (undefined != oSelect.usWidth) - nCurPenalty += this.GetWidthPenalty(oSelect.usWidth); - - if (undefined !== oSelect.usWeight) - nCurPenalty += this.GetWeightPenalty(oSelect.usWeight); - - if (undefined !== oSelect.bBold) - nCurPenalty += this.GetBoldPenalty(oSelect.bBold); - - if (undefined !== oSelect.bItalic) - nCurPenalty += this.GetItalicPenalty(oSelect.bItalic); - - if (undefined !== oSelect.wsFamilyClass) - nCurPenalty += this.GetFamilyUnlikelyPenalty(oSelect.wsFamilyClass); - else if (undefined !== oSelect.sFamilyClass) - nCurPenalty += this.GetFamilyUnlikelyPenalty1(oSelect.sFamilyClass); - - nCurPenalty += this.GetCharsetPenalty(unCharset); - - if (undefined !== oSelect.shAvgCharWidth) - nCurPenalty += this.GetAvgWidthPenalty(oSelect.shAvgCharWidth); - - if (undefined !== oSelect.shAscent) - nCurPenalty += this.GetAscentPenalty(oSelect.shAscent); - - if (undefined !== oSelect.shDescent) - nCurPenalty += this.GetDescentPenalty(oSelect.shDescent); - - if (undefined !== oSelect.shLineGap) - nCurPenalty += this.GetLineGapPenalty(oSelect.shLineGap); - - if (undefined !== oSelect.shXHeight) - nCurPenalty += this.GetXHeightPenalty(oSelect.shXHeight); - - if (undefined !== oSelect.shCapHeight) - nCurPenalty += this.GetCapHeightPenalty(oSelect.shCapHeight); - - // для математики - важнее наличие символов и похожих метрик, чем параметры - if (oSelect.wsName === "Cambria Math" && nNamePenalty < 1500) - nCurPenalty = nNamePenalty; - - return { Penalty : nCurPenalty, NamePenalty : nNamePenalty }; - }, - - // penalty detect functions - GetPanosePenalty : function(pReqPanose) - { - var nPenalty = 0; - for (var nIndex = 0; nIndex < 10; nIndex++) - { - if (this.m_aPanose[nIndex] != pReqPanose[nIndex] && 0 != pReqPanose[nIndex]) - { - var nKoef = Math.abs(this.m_aPanose[nIndex] - pReqPanose[nIndex]); - switch(nIndex) - { - case 0: nPenalty += 1000 * nKoef; break; - case 1: nPenalty += 100 * nKoef; break; - case 2: nPenalty += 100 * nKoef; break; - case 3: nPenalty += 100 * nKoef; break; - case 4: nPenalty += 100 * nKoef; break; - case 5: nPenalty += 100 * nKoef; break; - case 6: nPenalty += 100 * nKoef; break; - case 7: nPenalty += 100 * nKoef; break; - case 8: nPenalty += 100 * nKoef; break; - case 9: nPenalty += 100 * nKoef; break; - } - } - } - - return nPenalty; - }, - - GetSigPenalty : function(format, dRangeWeight, dRangeWeightSuferflouous, _main_ranges) - { - var dPenalty = 0; - - // Для начала просматриваем сколько вообще различных пространств надо. - // Исходя из их общего количества, находим вес 1 пропущеного пространства. - var arrCandidate = ((typeof(Int8Array) != 'undefined' && !window.opera)) ? new Uint8Array(192) : new Array(192); - var arrRequest = ((typeof(Int8Array) != 'undefined' && !window.opera)) ? new Uint8Array(192) : new Array(192); - - for (var i = 0; i < 192; i++) - { - arrCandidate[i] = 0; - arrRequest[i] = 0; - } - - var nRangesCount = 0; // Количество необходимых пространств - var nAddCount = 0; // количество дополнительных(ненужных) пространств у кандидата - - var ulCandRanges = [this.m_ulUnicodeRange1, this.m_ulUnicodeRange2, this.m_ulUnicodeRange3, this.m_ulUnicodeRange4, - this.m_ulCodePageRange1, this.m_ulCodePageRange2]; - var ulReqRanges = [format.ulRange1, format.ulRange2, format.ulRange3, format.ulRange4, - format.ulCodeRange1, format.ulCodeRange2]; - - var nIndex = 0; - for (var nIndex = 0; nIndex < 6; nIndex++) - { - for (var nBitCount = 0, nBit = 1; nBitCount < 32; nBitCount++, nBit *= 2) - { - var bReqAdd = false; - - if ( (ulReqRanges[nIndex] & nBit) != 0 ) - { - arrRequest[ nIndex * 32 + nBitCount ] = 1; - nRangesCount++; - bReqAdd = true; - } - - if ( (ulCandRanges[nIndex] & nBit) != 0 ) - { - arrCandidate[ nIndex * 32 + nBitCount ] = 1; - if ( !bReqAdd ) - nAddCount++; - } - } - } - - if ( 0 == nRangesCount ) - return 0; - - //double dRangeWeight = 1;//1000.0 / nRangesCount; - - for (nIndex = 0; nIndex < 192; nIndex++) - { - if (1 == arrRequest[nIndex] && 0 == arrCandidate[nIndex]) - { - if (undefined !== _main_ranges && undefined !== _main_ranges["" + nIndex]) - dPenalty += Math.max(_main_ranges["" + nIndex], dRangeWeight); - else - dPenalty += dRangeWeight; - } - else if (dRangeWeightSuferflouous != 0 && 0 == arrRequest[nIndex] && 1 == arrCandidate[nIndex]) - dPenalty += dRangeWeightSuferflouous; - } - - return dPenalty; - }, - - GetFixedPitchPenalty : function(bReqFixed) - { - var nPenalty = 0; - - // Если запрашивается моноширинный, а кандидат не моноширинный, то вес 15000 - // Если запрашивается не моноширинный, а кандидат моноширинный, то вес 350 - if ( bReqFixed && !this.m_bIsFixed ) - nPenalty = 15000; - if ( !bReqFixed && this.m_bIsFixed ) - nPenalty = 350; - - return nPenalty; - }, - - GetFaceNamePenalty_private : function(sReqName, sMyName) - { - // На MSDN написано, что если имена не совпадают, то вес 10000. - // Мы будем сравнивать сколько совпало символов у запрашиваемого - // имени и с именем кандидата, без учета решистра, пробелов, запятых - // и тире. - - /* - TODO: - sCandName.Remove(' '); sReqName.Remove(' '); - sCandName.Remove(','); sReqName.Remove(','); - sCandName.Remove('-'); sReqName.Remove('-'); - - sCandName.MakeLower(); sReqName.MakeLower(); - */ - - if ( 0 == sReqName.length ) - return 0; - - if ( 0 == sMyName.length ) - return 10000; - - if ( sReqName == sMyName ) - return 0; - - // check equals, inst - if (sReqName.replace(/[\s-,]/g, '').toLowerCase() == sMyName.replace(/[\s-,]/g, '').toLowerCase()) - return 100; - - if (-1 !== sReqName.indexOf(sMyName) || -1 !== sMyName.indexOf(sReqName)) - { - if (g_fontApplication.g_fontDictionary.CheckLikeFonts(sMyName, sReqName)) - return 700; - return 1000; - } - - if (g_fontApplication.g_fontDictionary.CheckLikeFonts(sMyName, sReqName)) - { - // заменяемые шрифты считаем ближе, чем те, что содержат имена в себе - return 999; - } - - return this.CheckEqualFonts2(sReqName, sMyName); - }, - - GetFaceNamePenalty : function(sReqName) - { - var min = this.GetFaceNamePenalty_private(sReqName, this.m_wsFontName); - if (this.m_names) - { - var tmpMin = 0; - for (var i = 0, len = this.m_names.length; i < len; i++) - { - tmpMin = this.GetFaceNamePenalty_private(sReqName, this.m_names[i]); - if (tmpMin < min) - min = tmpMin; - } - } - return min; - }, - - GetWidthPenalty : function(usReqWidth) - { - // Penalty * width difference (Penalty = 50) - return Math.abs(this.m_usWidth - usReqWidth) * 50; - }, - - GetWeightPenalty : function(usReqWeight) - { - // Penalty * ( weight difference / 10 ) (Penalty = 3) - return (3 * ( Math.abs(this.m_usWeigth - usReqWeight) / 10)); - }, - - GetItalicPenalty : function(bReqItalic) - { - // Penalty = 4 - if ( this.m_bItalic != bReqItalic ) - return 4; - return 0; - }, - - GetBoldPenalty : function(bReqBold) - { - // SmallPenalty - // Penalty = 1 - if ( this.m_bBold != bReqBold ) - return 1; - return 0; - }, - - GetFamilyUnlikelyPenalty1 : function(nReqFamilyClass) - { - // Requested a roman/modern/swiss family, but the candidate is - // decorative/script. Or requested decorative/script, and the - // candidate is roman/modern/swiss. Penalty = 50. - - var nReqClassID = nReqFamilyClass >> 8; - var nCandClassID = this.m_sFamilyClass >> 8; - - if ( 0 == nReqClassID ) // Unknown - return 0; - - if ( 0 == nCandClassID ) // Unknown - return 50; - - if ( ( nReqClassID <= 8 && nCandClassID > 8 ) || ( nReqClassID > 8 && nCandClassID <= 8 ) ) - return 50; - - return 0; - }, - - GetFamilyUnlikelyPenalty : function(sReqFamilyClass) - { - // Requested a roman/modern/swiss family, but the candidate is - // decorative/script. Or requested decorative/script, and the - // candidate is roman/modern/swiss. Penalty = 50. - - var nCandClassID = this.m_sFamilyClass >> 8; - - //sReqFamilyClass.MakeLower(); TODO: - if ("any" == sReqFamilyClass || "unknown" == sReqFamilyClass) - return 0; - else if (0 == nCandClassID) - return 50; - else if ((("swiss" == sReqFamilyClass || "roman" == sReqFamilyClass || "modern" == sReqFamilyClass) && nCandClassID > 8) || - (("decorative" == sReqFamilyClass || "script" == sReqFamilyClass) && nCandClassID <= 8)) - return 50; - - return 0; - }, - - GetCharsetPenalty : function(unReqCharset) - { - // Penalty = 65000 (это самый весомый параметр) - if ( FD_UNKNOWN_CHARSET == unReqCharset ) - return 0; - - var _ret = this.GetCodePageByCharset(unReqCharset); - - var nMult = 1 << _ret.ulBit; - if (nMult < 0) - nMult += 4294967296; - - var ulCandRanges = [this.m_ulUnicodeRange1, this.m_ulUnicodeRange2, this.m_ulUnicodeRange3, this.m_ulUnicodeRange4, - this.m_ulCodePageRange1, this.m_ulCodePageRange2]; - - if ( (ulCandRanges[_ret.unLongIndex] & nMult) == 0 ) - return 65000; - - return 0; - }, - - GetAvgWidthPenalty : function(shReqWidth) - { - if ( 0 == this.m_shAvgCharWidth && 0 != shReqWidth ) - return 4000; - - return Math.abs( this.m_shAvgCharWidth - shReqWidth ) * 4; - }, - - GetAscentPenalty : function(shReqAscent) - { - if ( 0 == this.m_shAscent && 0 != shReqAscent ) - return 100; - - return (Math.abs( this.m_shAscent - shReqAscent ) / 10) >> 0; - }, - - GetDescentPenalty : function(shReqDescent) - { - if ( 0 == this.m_shDescent && 0 != shReqDescent ) - return 100; - - return (Math.abs( this.m_shDescent - shReqDescent ) / 10) >> 0; - }, - - GetLineGapPenalty : function(shReqLineGap) - { - if ( 0 == this.m_shLineGap && 0 != shReqLineGap ) - return 100; - - return (Math.abs( this.m_shLineGap - shReqLineGap ) / 10) >> 0; - }, - - GetXHeightPenalty : function(shReqXHeight) - { - if ( 0 == this.shXHeight && 0 != shReqXHeight ) - return 50; - - return (Math.abs( this.m_shXHeight - shReqXHeight ) / 20) >> 0; - }, - - GetCapHeightPenalty : function(shReqCapHeight) - { - if ( 0 == this.m_shCapHeight && 0 != shReqCapHeight ) - return 50; - - return (Math.abs( this.m_shCapHeight - shReqCapHeight ) / 20) >> 0; - }, - - // common - GetCodePageByCharset : function(unCharset) - { - var ret = { ulBit : 0, unLongIndex : 4 }; - // Соответсвие CodePage -> ulCodePageRange1 : http://www.microsoft.com/Typography/otspec/os2.htm#cpr - - if ( unCharset == 1 ) - unCharset = this.GetDefaultCharset(); - - if (true) - { - switch( unCharset ) - { - case 0x00: ret.ulBit = 0; break; - case 0xEE: ret.ulBit = 1; break; - case 0xCC: ret.ulBit = 2; break; - case 0xA1: ret.ulBit = 3; break; - case 0xA2: ret.ulBit = 4; break; - case 0xB1: ret.ulBit = 5; break; - case 0xB2: ret.ulBit = 6; break; - case 0xBA: ret.ulBit = 7; break; - case 0xA3: ret.ulBit = 8; break; - case 0xDE: ret.ulBit = 16; break; - case 0x80: ret.ulBit = 17; break; - case 0x86: ret.ulBit = 18; break; - case 0x81: ret.ulBit = 19; break; - case 0x88: ret.ulBit = 20; break; - case 0x82: ret.ulBit = 21; break; - case 0x4D: ret.ulBit = 29; break; - case 0x02: ret.ulBit = 31; break; - case 0xFF: ret.ulBit = 30; break; - default: ret.ulBit = 0; break; - } - } - }, - - GetDefaultCharset : function(bUseDefCharset) - { - if ( !bUseDefCharset ) - return FD_UNKNOWN_CHARSET; - - return 0; - }, - - CheckEqualFonts2 : function(name1, name2) - { - var _res1 = name1.toLowerCase(); - var _res2 = name2.toLowerCase(); - - if (_res1 == _res2) - return 1500; - - if (_res1.replace(/[\s-]/g, '') == _res2.replace(/[\s-]/g, '')) - return 3000; - - return 10000; - }, - - Serialize : function() - { - var _obj = {}; - - _obj["m_wsFontName"] = this.m_wsFontName; - - _obj["m_wsFontPath"] = this.m_wsFontPath; - _obj["m_lIndex"] = this.m_lIndex; - - _obj["m_bBold"] = this.m_bBold; - _obj["m_bItalic"] = this.m_bItalic; - _obj["m_bIsFixed"] = this.m_bIsFixed; - - _obj["m_aPanose"] = new Array(10); - for (var i = 0; i < 10; i++) - { - _obj["m_aPanose"][i] = this.m_aPanose[i]; - } - - _obj["m_ulUnicodeRange1"] = this.m_ulUnicodeRange1; - _obj["m_ulUnicodeRange2"] = this.m_ulUnicodeRange2; - _obj["m_ulUnicodeRange3"] = this.m_ulUnicodeRange3; - _obj["m_ulUnicodeRange4"] = this.m_ulUnicodeRange4; - - _obj["m_ulCodePageRange1"] = this.m_ulCodePageRange1; - _obj["m_ulCodePageRange2"] = this.m_ulCodePageRange2; - - _obj["m_usWeigth"] = this.m_usWeigth; - _obj["m_usWidth"] = this.m_usWidth; - - _obj["m_sFamilyClass"] = this.m_sFamilyClass; - _obj["m_eFontFormat"] = this.m_eFontFormat; - - _obj["m_shAvgCharWidth"] = this.m_shAvgCharWidth; - _obj["m_shAscent"] = this.m_shAscent; - _obj["m_shDescent"] = this.m_shDescent; - _obj["m_shLineGap"] = this.m_shLineGap; - _obj["m_shXHeight"] = this.m_shXHeight; - _obj["m_shCapHeight"] = this.m_shCapHeight; - - return _obj; - } - }; - - function CLanguageFontSelect() - { - this.Type = 0; - this.Ranges = []; - this.CodePage1Mask = 0; - this.CodePage2Mask = 0; - this.DefaultFont = "Arial"; - - this.FullSupportPages = false; - } - - CLanguageFontSelect.prototype = - { - checkChar : function(_code) - { - var _len = this.Ranges.length; - for (var i = 0; i < _len; i += 2) - { - if (_code >= this.Ranges[i] && _code <= this.Ranges[i + 1]) - return true; - } - return false; - } - }; - - var LanguagesFontSelectTypes = - { - Unknown : -1, - Arabic : 1, - Korean : 2, - Japan : 3, - Chinese : 4, - - EastAsiaStart : 2, - EastAsiaEnd : 4 - }; - - function CFontSelectList() - { - this.List = []; - this.ListMap = {}; - - this.Languages = []; - - this.m_pRanges = null; - this.m_pRangesNums = null; - - this.IsInit = false; - this.CurrentLoadedObj = null; - } - - CFontSelectList.prototype = - { - SerializeList : function() - { - var _list = []; - var _len = this.List.length; - for (var k = 0; k < _len; k++) - _list.push(this.List[k].Serialize()); - return _list; - }, - - Init : function() - { - if (true == this.IsInit) - return; - - this.IsInit = true; - - if (window["g_fonts_selection_bin"] != "") - { - // read from stream - var _ft_stream = CreateFontData2(window["g_fonts_selection_bin"]); - var _file_stream = new AscCommon.FileStream(_ft_stream.data, _ft_stream.size); - - var count = _file_stream.GetLong(); - for (var i = 0; i < count; i++) - { - var _fs = new CFontSelect(); - _fs.fromStream(_file_stream); - - // корректируем плохие популярные шрифты - if (_fs.m_wsFontName == "Droid Sans Fallback") - { - if ((_fs.m_ulCodePageRange1 & (1 << 19)) == (1 << 19)) - _fs.m_ulCodePageRange1 -= (1 << 19); - } - - this.List.push(_fs); - this.ListMap[_fs.m_wsFontPath] = this.List.length - 1; - } - } - - // add languages - // 1) arabic - var _arabic_lang = new CLanguageFontSelect(); - _arabic_lang.Type = LanguagesFontSelectTypes.Arabic; - _arabic_lang.Ranges.push(0x0600); - _arabic_lang.Ranges.push(0x06FF); - _arabic_lang.Ranges.push(0x0750); - _arabic_lang.Ranges.push(0x077F); - _arabic_lang.Ranges.push(0x08A0); - _arabic_lang.Ranges.push(0x08FF); - _arabic_lang.Ranges.push(0xFB50); - _arabic_lang.Ranges.push(0xFDFF); - _arabic_lang.Ranges.push(0xFE70); - _arabic_lang.Ranges.push(0xFEFF); - _arabic_lang.CodePage1Mask = (1 << 6); - _arabic_lang.CodePage2Mask = (1 << 19) | (1 << 29); - _arabic_lang.DefaultFont = "Tahoma"; - this.Languages.push(_arabic_lang); - - // 2) korean - var _korean_lang = new CLanguageFontSelect(); - _korean_lang.Type = LanguagesFontSelectTypes.Korean; - _korean_lang.Ranges.push(0x1100); - _korean_lang.Ranges.push(0x11FF); - _korean_lang.Ranges.push(0x3130); - _korean_lang.Ranges.push(0x318F); - _korean_lang.Ranges.push(0xAC00); - _korean_lang.Ranges.push(0xD7AF); - _korean_lang.Ranges.push(0xFF00); - _korean_lang.Ranges.push(0xFFEF); - _korean_lang.CodePage1Mask = (1 << 19); - _korean_lang.CodePage2Mask = 0; - _korean_lang.DefaultFont = "Batang"; - this.Languages.push(_korean_lang); - - // 3) japan - var _japan_lang = new CLanguageFontSelect(); - _japan_lang.Type = LanguagesFontSelectTypes.Japan; - _japan_lang.Ranges.push(0x4E00); - _japan_lang.Ranges.push(0x9FBF); - - /* - _japan_lang.Ranges.push(0x3000);// punctuation - _japan_lang.Ranges.push(0x303F); - _japan_lang.Ranges.push(0x3040);// Hiragana - _japan_lang.Ranges.push(0x309F); - _japan_lang.Ranges.push(0x30A0);// Katakana - _japan_lang.Ranges.push(0x30FF); - */ - _japan_lang.Ranges.push(0x3000); - _japan_lang.Ranges.push(0x30FF); - _japan_lang.Ranges.push(0xFF00); - _japan_lang.Ranges.push(0xFFEF); - - _japan_lang.CodePage1Mask = (1 << 17) | (1 << 30); - _japan_lang.CodePage2Mask = 0; - _japan_lang.DefaultFont = "MS Mincho"; - _japan_lang.FullSupportPages = true; - this.Languages.push(_japan_lang); - - // 4) chinese http://stackoverflow.com/questions/1366068/whats-the-complete-range-for-chinese-characters-in-unicode - var _chinese_lang = new CLanguageFontSelect(); - _chinese_lang.Type = LanguagesFontSelectTypes.Chinese; - _chinese_lang.Ranges.push(0x4E00); - _chinese_lang.Ranges.push(0x9FFF); - _chinese_lang.Ranges.push(0x3400); - _chinese_lang.Ranges.push(0x4DFF); - _chinese_lang.Ranges.push(0x20000); - _chinese_lang.Ranges.push(0x2A6DF); - _chinese_lang.Ranges.push(0xF900); - _chinese_lang.Ranges.push(0xFAFF); - _chinese_lang.Ranges.push(0x2F800); - _chinese_lang.Ranges.push(0x2FA1F); - _chinese_lang.Ranges.push(0xFF00); - _chinese_lang.Ranges.push(0xFFEF); - _chinese_lang.CodePage1Mask = (1 << 18) | (1 << 20); - _chinese_lang.CodePage2Mask = 0; - _chinese_lang.DefaultFont = "SimSun"; - this.Languages.push(_chinese_lang); - - // debug!!! - /* - var _symbols = " `~><.,:;?!/\\|[](){}$€%#@&\'\"=+-*^_1234567890"; - console.log("start dump multisymbols -----------------------------"); - for (var i = 0; i < _symbols.length; i++) - console.log("" + _symbols.charCodeAt(i)); - console.log("end dump multisymbols -------------------------------"); - */ - - /* - var _array_results = []; - var _count_fonts = this.List.length; - for (var i = 0; i < _count_fonts; i++) - { - var f = this.List[i]; - - console.log(f.m_wsFontPath + "_" + f.m_lIndex + " codepage1: " + f.m_ulCodePageRange1 + ", codepage2: " + f.m_ulCodePageRange2); - } - */ - - // добавляем ASCW3 - var _fs = new CFontSelect(); - _fs.m_wsFontName = "ASCW3"; - this.List.push(_fs); - - //delete window["g_fonts_selection_bin"]; - }, - - isEnglishChar : function(_code) - { - if (97 <= _code && _code <= 122) - return true; - if (65 <= _code && _code <= 90) - return true; - return false; - }, - - isMultiLanguageSymbol : function(_code) - { - // здесь те символы, которые не влияют на язык - - switch (_code) - { - case 32: - case 96: - case 126: - case 62: - case 60: - case 46: - case 44: - case 58: - case 59: - case 63: - case 33: - case 47: - case 92: - case 124: - case 91: - case 93: - case 40: - case 41: - case 123: - case 125: - case 36: - case 37: - case 35: - case 64: - case 38: - case 39: - case 34: - case 61: - case 43: - case 45: - case 42: - case 94: - case 95: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - case 48: - return true; - default: - { - if (_code >= 0x2000 && _code <= 0x206F) // general punctuation - return true; - - if (_code >= 0x20A0 && _code <= 0x20CF) // Currency Symbols - return true; - - break; - } - } - return false; - }, - - checkText : function(text) - { - var _text_len = text.length; - if (_text_len == 0) - return LanguagesFontSelectTypes.Unknown; - - var _array_detect_languages = []; - var _detect_languages_length = this.Languages.length; - - for (var _lang = 0; _lang < _detect_languages_length; _lang++) - { - var _language = this.Languages[_lang]; - - var _is_support = true; - var _no_multi_symbols = 0; - var _percent_by_english = 0; - for (var i = 0; i < _text_len; i++) - { - var _code = text.charCodeAt(i); - if (!this.isMultiLanguageSymbol(_code)) - { - _no_multi_symbols++; - if (!_language.checkChar(_code)) - { - if (this.isEnglishChar(_code)) - _percent_by_english--; - else - { - _is_support = false; - break; - } - } - else - { - _percent_by_english++; - } - } - } - - if (0 == _no_multi_symbols) - return LanguagesFontSelectTypes.Unknown; - - if (_is_support && (_percent_by_english > 0)) - { - _array_detect_languages.push(_language.Type); - } - } - - var _len = _array_detect_languages.length; - if (0 == _len) - return LanguagesFontSelectTypes.Unknown; - - return _array_detect_languages[_len - 1]; - }, - - checkPasteText : function(textPr, langId) - { - var _ret_obj = { is_async : false, name : "", fontSlot : fontslot_ASCII }; - - if (!textPr.RFonts) - return _ret_obj; - - var _lang = null; - for (var i = 0; i < this.Languages.length; i++) - { - _lang = this.Languages[i]; - if (_lang.Type == langId) - { - break; - } - } - if (null == _lang) - { - // такого быть не должно - return _ret_obj; - } - - _ret_obj.fontSlot = fontslot_ASCII; - - if (langId >= LanguagesFontSelectTypes.EastAsiaStart && langId <= LanguagesFontSelectTypes.EastAsiaEnd) - _ret_obj.fontSlot = fontslot_EastAsia; - - if (langId == LanguagesFontSelectTypes.Arabic) - { - if (textPr.CS || textPr.RTL) - _ret_obj.fontSlot = fontslot_CS; - } - - var _fontFamily = undefined; - var bold = undefined; - var italic = undefined; - switch (_ret_obj.fontSlot) - { - case fontslot_ASCII: - { - _fontFamily = textPr.RFonts.Ascii; - bold = textPr.Bold; - italic = textPr.Italic; - break; - } - case fontslot_HAnsi: - { - _fontFamily = textPr.RFonts.HAnsi; - bold = textPr.Bold; - italic = textPr.Italic; - break; - } - case fontslot_CS: - { - _fontFamily = textPr.RFonts.CS; - bold = textPr.BoldCS; - italic = textPr.ItalicCS; - break; - } - case fontslot_EastAsia: - { - _fontFamily = textPr.RFonts.EastAsia; - bold = textPr.Bold; - italic = textPr.Italic; - break; - } - default: - break; - } - - if (undefined == _fontFamily) - return _ret_obj; - - var oFontStyle = FontStyle.FontStyleRegular; - if (!italic && bold) - oFontStyle = FontStyle.FontStyleBold; - else if (italic && !bold) - oFontStyle = FontStyle.FontStyleItalic; - else if (italic && bold) - oFontStyle = FontStyle.FontStyleBoldItalic; - - var _info = g_fontApplication.GetFontInfo(_fontFamily.Name, oFontStyle); - - var _id = _info.GetFontID(AscCommon.g_font_loader, oFontStyle); - var _select = this.List[this.ListMap[_id.id]]; - - if (0 != _lang.CodePage1Mask) - { - if (!_lang.FullSupportPages) - { - if (0 == (_lang.CodePage1Mask & _select.m_ulCodePageRange1)) - _ret_obj.is_async = true; - } - else - { - if (_lang.CodePage1Mask != (_lang.CodePage1Mask & _select.m_ulCodePageRange1)) - _ret_obj.is_async = true; - } - } - if (0 != _lang.CodePage2Mask) - { - if (!_lang.FullSupportPages) - { - if (0 == (_lang.CodePage2Mask & _select.m_ulCodePageRange2)) - _ret_obj.is_async = true; - } - else - { - if (_lang.CodePage2Mask != (_lang.CodePage2Mask & _select.m_ulCodePageRange2)) - _ret_obj.is_async = true; - } - } - - if (!_ret_obj.is_async) - return _ret_obj; - - _ret_obj.name = this.selectNeedFont(_lang, oFontStyle); - if (_ret_obj.name == "") - _ret_obj.is_async = false; - - return _ret_obj; - }, - - getSetupRFonts : function(obj) - { - var _rfonts = new CRFonts(); - switch (obj.fontSlot) - { - case fontslot_EastAsia: - { - _rfonts.EastAsia = { Name : obj.name, Index : -1 }; - break; - } - case fontslot_CS: - { - _rfonts.CS = { Name : obj.name, Index : -1 }; - break; - } - case fontslot_HAnsi: - { - _rfonts.HAnsi = { Name : obj.name, Index : -1 }; - break; - } - case fontslot_ASCII: - default: - { - _rfonts.Ascii = { Name : obj.name, Index : -1 }; - break; - } - } - return _rfonts; - }, - - selectNeedFont : function(_lang, _style) - { - var _error = 0x01000000; - var _name = ""; - - var _len = AscFonts.g_font_infos.length; - for (var i = 0; i < _len; i++) - { - var _info = AscFonts.g_font_infos[i]; - var _id = _info.GetFontID(AscCommon.g_font_loader, _style); - var _select = this.List[this.ListMap[_id.id]]; - - if (!_select) - continue; - - var _bIsNeed = false; - if (0 != _lang.CodePage1Mask) - { - if (!_lang.FullSupportPages) - { - if (0 == (_lang.CodePage1Mask & _select.m_ulCodePageRange1)) - _bIsNeed = true; - } - else - { - if (_lang.CodePage1Mask != (_lang.CodePage1Mask & _select.m_ulCodePageRange1)) - _bIsNeed = true; - } - } - if (0 != _lang.CodePage2Mask) - { - if (!_lang.FullSupportPages) - { - if (0 == (_lang.CodePage2Mask & _select.m_ulCodePageRange2)) - _bIsNeed = true; - } - else - { - if (_lang.CodePage2Mask != (_lang.CodePage2Mask & _select.m_ulCodePageRange2)) - _bIsNeed = true; - } - } - - if (!_bIsNeed) - { - var _tmp_error = 0; - if (_id.file.Status != 0) - _tmp_error += 0x00010000; - if (_info.Name != _lang.DefaultFont) - _tmp_error += 0x00000100; - - if (_tmp_error < _error) - { - _error = _tmp_error; - _name = _info.Name; - } - } - } - - if (_name == "") - { - _name = g_fontApplication.GetFontInfoName(_lang.DefaultFont); - } - - return _name; - }, - - checkText2 : function(text) - { - var r1 = 0; - var r2 = 0; - var r3 = 0; - var r4 = 0; - var codePage1 = 0; - var codePage2 = 0; - - var len = text.length; - for (var i = 0; i < len; i++) - { - var _code = text.charCodeAt(i); - - var lRangeNum = this.m_pRangesNums.data[_code]; - var lRange = this.m_pRanges.data[_code]; - - if (0xFF != lRangeNum) - { - if ((i == 0) && ((lRangeNum == 1) && (lRange == 28))) - { - codePage1 = 0x80000000; - } - else if (((lRangeNum == 2) && (lRange == 3)) || ((lRangeNum == 1) && (lRange == 31)) || ((lRangeNum == 0) && (lRange == 13))) - { - // arabic! - r1 |= (1 << 13); - r2 |= (1 << 31); - r3 |= (1 << 3); - } - else - { - if (0 == lRangeNum) - r1 |= 1 << lRange; - else if (1 == lRangeNum) - r2 |= 1 << lRange; - else if (2 == lRangeNum) - r3 |= 1 << lRange; - else - r4 |= 1 << lRange; - } - } - } - - var _array_results = []; - var _count_fonts = this.List.length; - for (var i = 0; i < _count_fonts; i++) - { - var f = this.List[i]; - - if (((f.m_ulUnicodeRange1 & r1) == r1) && - ((f.m_ulUnicodeRange2 & r2) == r2) && - ((f.m_ulUnicodeRange3 & r3) == r3) && - ((f.m_ulUnicodeRange4 & r4) == r4) && - ((f.m_ulCodePageRange1 & codePage1) == codePage1) && - ((f.m_ulCodePageRange2 & codePage2) == codePage2)) - { - _array_results.push(f.m_wsFontPath); - } - } - - //console.log(_array_results); - }, - - initRanges : function() - { - // пока не используем - /* - function memset(p, start, val, count) - { - var _data = p.data; - for (var i = 0; i < count; i++) - _data[i + start] = val; - } - - // пока только 2 байта - this.m_pRanges = g_memory.Alloc(0xFFFF); - this.m_pRangesNums = g_memory.Alloc(0xFFFF); - - memset(this.m_pRanges, 0, 0xFF, 0xFFFF); - memset(this.m_pRangesNums, 0, 0xFF, 0xFFFF); - - // теперь просто по порядку заполняем все рэнджи - var nStart = 0; - var nCount = 0; - - // rangeNum 0 - // case 00: sUCRName = "Basic Latin"; break; /: U+0020-U+007E :/ - nStart = 0x0020; - nCount = 0x007E - nStart + 1; - memset(this.m_pRanges, nStart, 0, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 01: sUCRName = "Latin-1 Supplement"; break; /: U+0080-U+00FF :/ - nStart = 0x0080; - nCount = 0x00FF - nStart + 1; - memset(this.m_pRanges, nStart, 1, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 02: sUCRName = "Latin Extended-A"; break; /: U+0100-U+017F :/ - nStart = 0x0100; - nCount = 0x017F - nStart + 1; - memset(this.m_pRanges, nStart, 2, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 03: sUCRName = "Latin Extended-B"; break; /: U+0180-U+024F :/ - nStart = 0x0180; - nCount = 0x024F - nStart + 1; - memset(this.m_pRanges, nStart, 3, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 04: sUCRName = "IPA Extensions"; break; /: U+0250-U+02AF :/ /: U+1D00-U+1D7F :/ /: U+1D80-U+1DBF :/ - nStart = 0x0250; - nCount = 0x02AF - nStart + 1; - memset(this.m_pRanges, nStart, 4, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x1D00; - nCount = 0x1D7F - nStart + 1; - memset(this.m_pRanges, nStart, 4, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x1D80; - nCount = 0x1DBF - nStart + 1; - memset(this.m_pRanges, nStart, 4, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 05: sUCRName = "Spacing Modifier Letters"; break; /: U+02B0-U+02FF :/ /: U+A700-U+A71F :/ - nStart = 0x02B0; - nCount = 0x02FF - nStart + 1; - memset(this.m_pRanges, nStart, 5, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0xA700; - nCount = 0xA71F - nStart + 1; - memset(this.m_pRanges, nStart, 5, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 06: sUCRName = "Combining Diacritical Marks"; break; /: U+0300-U+036F :/ /: U+1DC0-U+1DFF :/ - nStart = 0x0300; - nCount = 0x036F - nStart + 1; - memset(this.m_pRanges, nStart, 6, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x1DC0; - nCount = 0x1DFF - nStart + 1; - memset(this.m_pRanges, nStart, 6, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 07: sUCRName = "Greek and Coptic"; break; /: U+0370-U+03FF :/ - nStart = 0x0370; - nCount = 0x03FF - nStart + 1; - memset(this.m_pRanges, nStart, 7, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 08: sUCRName = "Coptic"; break; /: U+2C80-U+2CFF :/ - nStart = 0x2C80; - nCount = 0x2CFF - nStart + 1; - memset(this.m_pRanges, nStart, 8, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 09: sUCRName = "Cyrillic"; break; /: U+0400-U+04FF :/ /: U+0500-U+052F :/ /: U+2DE0-U+2DFF :/ /: U+A640-U+A69F :/ - nStart = 0x0400; - nCount = 0x04FF - nStart + 1; - memset(this.m_pRanges, nStart, 9, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x0500; - nCount = 0x052F - nStart + 1; - memset(this.m_pRanges, nStart, 9, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x2DE0; - nCount = 0x2DFF - nStart + 1; - memset(this.m_pRanges, nStart, 9, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0xA640; - nCount = 0xA69F - nStart + 1; - memset(this.m_pRanges, nStart, 9, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 10: sUCRName = "Armenian"; break; /: U+0530-U+058F :/ - nStart = 0x0530; - nCount = 0x058F - nStart + 1; - memset(this.m_pRanges, nStart, 10, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 11: sUCRName = "Hebrew"; break; /: U+0590-U+05FF :/ - nStart = 0x0590; - nCount = 0x05FF - nStart + 1; - memset(this.m_pRanges, nStart, 11, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 12: sUCRName = "Vai"; break; /: U+A500-U+A63F :/ - nStart = 0xA500; - nCount = 0xA63F - nStart + 1; - memset(this.m_pRanges, nStart, 12, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 13: sUCRName = "Arabic"; break; /: U+0600-U+06FF :/ /: U+0750-U+077F :/ - nStart = 0x0600; - nCount = 0x06FF - nStart + 1; - memset(this.m_pRanges, nStart, 13, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x0750; - nCount = 0x077F - nStart + 1; - memset(this.m_pRanges, nStart, 13, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 14: sUCRName = "NKo"; break; /: U+07C0-U+07FF :/ - nStart = 0x07C0; - nCount = 0x07FF - nStart + 1; - memset(this.m_pRanges, nStart, 14, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 15: sUCRName = "Devanagari"; break; /: U+0900-U+097F :/ - nStart = 0x0900; - nCount = 0x097F - nStart + 1; - memset(this.m_pRanges, nStart, 15, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 16: sUCRName = "Bengali"; break; /: U+0980-U+09FF :/ - nStart = 0x0980; - nCount = 0x09FF - nStart + 1; - memset(this.m_pRanges, nStart, 16, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 17: sUCRName = "Gurmukhi"; break; /: U+0A00-U+0A7F :/ - nStart = 0x0A00; - nCount = 0x0A7F - nStart + 1; - memset(this.m_pRanges, nStart, 17, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 18: sUCRName = "Gujarati"; break; /: U+0A80-U+0AFF :/ - nStart = 0x0A80; - nCount = 0x0AFF - nStart + 1; - memset(this.m_pRanges, nStart, 18, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 19: sUCRName = "Oriya"; break; /: U+0B00-U+0B7F :/ - nStart = 0x0B00; - nCount = 0x0B7F - nStart + 1; - memset(this.m_pRanges, nStart, 19, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 20: sUCRName = "Tamil"; break; /: U+0B80-U+0BFF :/ - nStart = 0x0B80; - nCount = 0x0BFF - nStart + 1; - memset(this.m_pRanges, nStart, 20, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 21: sUCRName = "Telugu"; break; /: U+0C00-U+0C7F :/ - nStart = 0x0C00; - nCount = 0x0C7F - nStart + 1; - memset(this.m_pRanges, nStart, 21, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 22: sUCRName = "Kannada"; break; /: U+0C80-U+0CFF :/ - nStart = 0x0C80; - nCount = 0x0CFF - nStart + 1; - memset(this.m_pRanges, nStart, 22, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 23: sUCRName = "Malayalam"; break; /: U+0D00-U+0D7F :/ - nStart = 0x0D00; - nCount = 0x0D7F - nStart + 1; - memset(this.m_pRanges, nStart, 23, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 24: sUCRName = "Thai"; break; /: U+0E00-U+0E7F :/ - nStart = 0x0E00; - nCount = 0x0E7F - nStart + 1; - memset(this.m_pRanges, nStart, 24, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 25: sUCRName = "Lao"; break; /: U+0E80-U+0EFF :/ - nStart = 0x0E80; - nCount = 0x0EFF - nStart + 1; - memset(this.m_pRanges, nStart, 25, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 26: sUCRName = "Georgian"; break; /: U+10A0-U+10FF :/ /: U+2D00-U+2D2F :/ - nStart = 0x10A0; - nCount = 0x10FF - nStart + 1; - memset(this.m_pRanges, nStart, 26, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x2D00; - nCount = 0x2D2F - nStart + 1; - memset(this.m_pRanges, nStart, 26, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 27: sUCRName = "Balinese"; break; /: U+1B00-U+1B7F :/ - nStart = 0x1B00; - nCount = 0x1B7F - nStart + 1; - memset(this.m_pRanges, nStart, 27, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 28: sUCRName = "Hangul Jamo"; break; /: U+1100-U+11FF :/ - nStart = 0x1100; - nCount = 0x11FF - nStart + 1; - memset(this.m_pRanges, nStart, 28, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 29: sUCRName = "Latin Extended Additional"; break; /: U+1E00-U+1EFF :/ /: U+2C60-U+2C7F :/ /: U+A720-U+A7FF :/ - nStart = 0x1E00; - nCount = 0x1EFF - nStart + 1; - memset(this.m_pRanges, nStart, 29, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x2C60; - nCount = 0x2C7F - nStart + 1; - memset(this.m_pRanges, nStart, 29, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0xA720; - nCount = 0xA7FF - nStart + 1; - memset(this.m_pRanges, nStart, 29, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 30: sUCRName = "Greek Extended"; break; /: U+1F00-U+1FFF :/ - nStart = 0x1F00; - nCount = 0x1FFF - nStart + 1; - memset(this.m_pRanges, nStart, 30, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - //case 31: sUCRName = "General Punctuation"; break; /: U+2000-U+206F :/ /: U+2E00-U+2E7F :/ - nStart = 0x2000; - nCount = 0x206F - nStart + 1; - memset(this.m_pRanges, nStart, 31, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - nStart = 0x2E00; - nCount = 0x2E7F - nStart + 1; - memset(this.m_pRanges, nStart, 31, nCount); - memset(this.m_pRangesNums, nStart, 0, nCount); - - // rangeNum 1 - //case 00: sUCRName = "Superscripts And Subscripts"; break; /: U+2070-U+209F :/ - nStart = 0x2070; - nCount = 0x209F - nStart + 1; - memset(this.m_pRanges, nStart, 0, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 01: sUCRName = "Currency Symbols"; break; /: U+20A0-U+20CF :/ - nStart = 0x20A0; - nCount = 0x20CF - nStart + 1; - memset(this.m_pRanges, nStart, 1, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 02: sUCRName = "Combining Diacritical Marks For Symbols"; break; /: U+20D0-U+20FF :/ - nStart = 0x20D0; - nCount = 0x20FF - nStart + 1; - memset(this.m_pRanges, nStart, 2, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 03: sUCRName = "Letterlike Symbols"; break; /: U+2100-U+214F :/ - nStart = 0x2100; - nCount = 0x214F - nStart + 1; - memset(this.m_pRanges, nStart, 3, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 04: sUCRName = "Number Forms"; break; /: U+2150-U+218F :/ - nStart = 0x2150; - nCount = 0x218F - nStart + 1; - memset(this.m_pRanges, nStart, 4, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 05: sUCRName = "Arrows"; break; /: U+2190-U+21FF :/ /: U+27F0-U+27FF :/ /: U+2900-U+297F :/ /: U+2B00-U+2BFF :/ - nStart = 0x2190; - nCount = 0x21FF - nStart + 1; - memset(this.m_pRanges, nStart, 5, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x27F0; - nCount = 0x27FF - nStart + 1; - memset(this.m_pRanges, nStart, 5, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x2900; - nCount = 0x297F - nStart + 1; - memset(this.m_pRanges, nStart, 5, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x2B00; - nCount = 0x2BFF - nStart + 1; - memset(this.m_pRanges, nStart, 5, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 06: sUCRName = "Mathematical Operators"; break; /: U+2200-U+22FF :/ /: U+2A00-U+2AFF :/ /: U+27C0-U+27EF :/ /: U+2980-U+29FF :/ - nStart = 0x2200; - nCount = 0x22FF - nStart + 1; - memset(this.m_pRanges, nStart, 6, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x2A00; - nCount = 0x2AFF - nStart + 1; - memset(this.m_pRanges, nStart, 6, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x27C0; - nCount = 0x27EF - nStart + 1; - memset(this.m_pRanges, nStart, 6, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x2980; - nCount = 0x29FF - nStart + 1; - memset(this.m_pRanges, nStart, 6, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 07: sUCRName = "Miscellaneous Technical"; break; /: U+2300-U+23FF :/ - nStart = 0x2300; - nCount = 0x23FF - nStart + 1; - memset(this.m_pRanges, nStart, 7, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 08: sUCRName = "Control Pictures"; break; /: U+2400-U+243F :/ - nStart = 0x2400; - nCount = 0x243F - nStart + 1; - memset(this.m_pRanges, nStart, 8, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 09: sUCRName = "Optical Character Recognition"; break; /: U+2440-U+245F :/ - nStart = 0x2440; - nCount = 0x245F - nStart + 1; - memset(this.m_pRanges, nStart, 9, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 10: sUCRName = "Enclosed Alphanumerics"; break; /: U+2460-U+24FF :/ - nStart = 0x2460; - nCount = 0x24FF - nStart + 1; - memset(this.m_pRanges, nStart, 10, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 11: sUCRName = "Box Drawing"; break; /: U+2500-U+257F :/ - nStart = 0x2500; - nCount = 0x257F - nStart + 1; - memset(this.m_pRanges, nStart, 11, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 12: sUCRName = "Block Elements"; break; /: U+2580-U+259F :/ - nStart = 0x2580; - nCount = 0x259F - nStart + 1; - memset(this.m_pRanges, nStart, 12, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 13: sUCRName = "Geometric Shapes"; break; /: U+25A0-U+25FF :/ - nStart = 0x25A0; - nCount = 0x25FF - nStart + 1; - memset(this.m_pRanges, nStart, 13, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 14: sUCRName = "Miscellaneous Symbols"; break; /: U+2600-U+26FF :/ - nStart = 0x2600; - nCount = 0x26FF - nStart + 1; - memset(this.m_pRanges, nStart, 14, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 15: sUCRName = "Dingbats"; break; /: U+2700-U+27BF :/ - nStart = 0x2700; - nCount = 0x27BF - nStart + 1; - memset(this.m_pRanges, nStart, 15, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 16: sUCRName = "CJK Symbols and Punctuation"; break; /: U+3000-U+303F :/ - nStart = 0x3000; - nCount = 0x303F - nStart + 1; - memset(this.m_pRanges, nStart, 16, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 17: sUCRName = "Hiragana"; break; /: U+3040-U+309F :/ - nStart = 0x3040; - nCount = 0x309F - nStart + 1; - memset(this.m_pRanges, nStart, 17, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 18: sUCRName = "Katakana"; break; /: U+30A0-U+30FF :/ /: U+31F0-U+31FF :/ - nStart = 0x30A0; - nCount = 0x30FF - nStart + 1; - memset(this.m_pRanges, nStart, 18, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x31F0; - nCount = 0x31FF - nStart + 1; - memset(this.m_pRanges, nStart, 18, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 19: sUCRName = "Bopomofo"; break; /: U+3100-U+312F :/ /: U+31A0-U+31BF :/ - nStart = 0x3100; - nCount = 0x312F - nStart + 1; - memset(this.m_pRanges, nStart, 19, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x31A0; - nCount = 0x31BF - nStart + 1; - memset(this.m_pRanges, nStart, 19, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 20: sUCRName = "Hangul Compatibility Jamo"; break; /: U+3130-U+318F :/ - nStart = 0x3130; - nCount = 0x318F - nStart + 1; - memset(this.m_pRanges, nStart, 20, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 21: sUCRName = "Phags-pa"; break; /: U+A840-U+A87F :/ - nStart = 0xA840; - nCount = 0xA87F - nStart + 1; - memset(this.m_pRanges, nStart, 21, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 22: sUCRName = "Enclosed CJK Letters and Months"; break; /: U+3200-U+32FF :/ - nStart = 0x3200; - nCount = 0x32FF - nStart + 1; - memset(this.m_pRanges, nStart, 22, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 23: sUCRName = "CJK Compatibility"; break; /: U+3300-U+33FF :/ - nStart = 0x3300; - nCount = 0x33FF - nStart + 1; - memset(this.m_pRanges, nStart, 23, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 24: sUCRName = "Hangul Syllables"; break; /: U+AC00-U+D7AF :/ - nStart = 0xAC00; - nCount = 0xD7AF - nStart + 1; - memset(this.m_pRanges, nStart, 24, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 25: sUCRName = "Non-Plane 0"; break; /: U+D800-U+DB7F :/ /: U+DB80-U+DBFF :/ /: U+DC00-U+DFFF :/ // Не юникодные символы - nStart = 0xD800; - nCount = 0xDB7F - nStart + 1; - memset(this.m_pRanges, nStart, 25, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0xDB80; - nCount = 0xDBFF - nStart + 1; - memset(this.m_pRanges, nStart, 25, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0xDC00; - nCount = 0xDFFF - nStart + 1; - memset(this.m_pRanges, nStart, 25, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 26: sUCRName = "Phoenician"; break; /:U+10900-U+1091F:/ - - //case 27: sUCRName = "CJK Unified Ideographs"; break; /: U+4E00-U+9FFF :/ /: U+2E80-U+2EFF :/ /: U+2F00-U+2FDF :/ /: U+2FF0-U+2FFF :/ /: U+3400-U+4DB5 :/ /:U+20000-U+2A6D6:/ /: U+3190-U+319F :/ - nStart = 0x4E00; - nCount = 0x9FFF - nStart + 1; - memset(this.m_pRanges, nStart, 27, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x2E80; - nCount = 0x2EFF - nStart + 1; - memset(this.m_pRanges, nStart, 27, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x2F00; - nCount = 0x2FDF - nStart + 1; - memset(this.m_pRanges, nStart, 27, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x2FF0; - nCount = 0x2FFF - nStart + 1; - memset(this.m_pRanges, nStart, 27, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x3400; - nCount = 0x4DB5 - nStart + 1; - memset(this.m_pRanges, nStart, 27, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0x3190; - nCount = 0x319F - nStart + 1; - memset(this.m_pRanges, nStart, 27, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 28: sUCRName = "Private Use Area (plane 0)"; break; /: U+E000-U+F8FF :/ // Не юникодные символы - nStart = 0xE000; - nCount = 0xF8FF - nStart + 1; - memset(this.m_pRanges, nStart, 28, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 29: sUCRName = "CJK Strokes"; break; /: U+31C0-U+31EF :/ /: U+F900-U+FAFF :/ /:U+2F800-U+2FA1F:/ - nStart = 0x31C0; - nCount = 0x31EF - nStart + 1; - memset(this.m_pRanges, nStart, 29, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - nStart = 0xF900; - nCount = 0xFAFF - nStart + 1; - memset(this.m_pRanges, nStart, 29, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 30: sUCRName = "Alphabetic Presentation Forms"; break; /: U+FB00-U+FB4F :/ - nStart = 0xFB00; - nCount = 0xFB4F - nStart + 1; - memset(this.m_pRanges, nStart, 30, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - //case 31: sUCRName = "Arabic Presentation Forms-A"; break; /: U+FB50-U+FDFF :/ - nStart = 0xFB50; - nCount = 0xFDFF - nStart + 1; - memset(this.m_pRanges, nStart, 31, nCount); - memset(this.m_pRangesNums, nStart, 1, nCount); - - // rangeNum 2 - //case 00: sUCRName = "Combining Half Marks"; break; /: U+FE20-U+FE2F :/ - nStart = 0xFE20; - nCount = 0xFE2F - nStart + 1; - memset(this.m_pRanges, nStart, 0, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 01: sUCRName = "Vertical forms"; break; /: U+FE10-U+FE1F :/ /: U+FE30-U+FE4F :/ - nStart = 0xFE10; - nCount = 0xFE1F - nStart + 1; - memset(this.m_pRanges, nStart, 1, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - nStart = 0xFE30; - nCount = 0xFE4F - nStart + 1; - memset(this.m_pRanges, nStart, 1, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 02: sUCRName = "Small Form Variants"; break; /: U+FE50-U+FE6F :/ - nStart = 0xFE50; - nCount = 0xFE6F - nStart + 1; - memset(this.m_pRanges, nStart, 2, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 03: sUCRName = "Arabic Presentation Forms-B"; break; /: U+FE70-U+FEFE :/ - nStart = 0xFE70; - nCount = 0xFEFE - nStart + 1; - memset(this.m_pRanges, nStart, 3, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 04: sUCRName = "Halfwidth and Fullwidth Forms"; break; /: U+FF00-U+FFEF :/ - nStart = 0xFF00; - nCount = 0xFFEF - nStart + 1; - memset(this.m_pRanges, nStart, 4, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 05: sUCRName = "Specials"; break; /: U+FFF0-U+FFFF :/ - nStart = 0xFFF0; - nCount = 0xFFFF - nStart + 1; - memset(this.m_pRanges, nStart, 5, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 06: sUCRName = "Tibetan"; break; /: U+0F00-U+0FFF :/ - nStart = 0x0F00; - nCount = 0x0FFF - nStart + 1; - memset(this.m_pRanges, nStart, 6, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 07: sUCRName = "Syriac"; break; /: U+0700-U+074F :/ - nStart = 0x0700; - nCount = 0x074F - nStart + 1; - memset(this.m_pRanges, nStart, 7, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 08: sUCRName = "Thaana"; break; /: U+0780-U+07BF :/ - nStart = 0x0780; - nCount = 0x07BF - nStart + 1; - memset(this.m_pRanges, nStart, 8, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 09: sUCRName = "Sinhala"; break; /: U+0D80-U+0DFF :/ - nStart = 0x0D80; - nCount = 0x0DFF - nStart + 1; - memset(this.m_pRanges, nStart, 9, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 10: sUCRName = "Myanmar"; break; /: U+1000-U+109F :/ - nStart = 0x1000; - nCount = 0x109F - nStart + 1; - memset(this.m_pRanges, nStart, 10, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 11: sUCRName = "Ethiopic"; break; /: U+1200-U+137F :/ /: U+1380-U+139F :/ /: U+2D80-U+2DDF :/ - nStart = 0x1200; - nCount = 0x137F - nStart + 1; - memset(this.m_pRanges, nStart, 11, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - nStart = 0x1380; - nCount = 0x139F - nStart + 1; - memset(this.m_pRanges, nStart, 11, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - nStart = 0x2D80; - nCount = 0x2DDF - nStart + 1; - memset(this.m_pRanges, nStart, 11, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 12: sUCRName = "Cherokee"; break; /: U+13A0-U+13FF :/ - nStart = 0x13A0; - nCount = 0x13FF - nStart + 1; - memset(this.m_pRanges, nStart, 12, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 13: sUCRName = "Unified Canadian Aboriginal Syllabics"; break; /: U+1400-U+167F :/ - nStart = 0x1400; - nCount = 0x167F - nStart + 1; - memset(this.m_pRanges, nStart, 13, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 14: sUCRName = "Ogham"; break; /: U+1680-U+169F :/ - nStart = 0x1680; - nCount = 0x169F - nStart + 1; - memset(this.m_pRanges, nStart, 14, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 15: sUCRName = "Runic"; break; /: U+16A0-U+16FF :/ - nStart = 0x16A0; - nCount = 0x16FF - nStart + 1; - memset(this.m_pRanges, nStart, 15, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 16: sUCRName = "Khmer"; break; /: U+1780-U+17FF :/ /: U+19E0-U+19FF :/ - nStart = 0x1780; - nCount = 0x17FF - nStart + 1; - memset(this.m_pRanges, nStart, 16, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - nStart = 0x19E0; - nCount = 0x19FF - nStart + 1; - memset(this.m_pRanges, nStart, 16, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 17: sUCRName = "Mongolian"; break; /: U+1800-U+18AF :/ - nStart = 0x1800; - nCount = 0x18AF - nStart + 1; - memset(this.m_pRanges, nStart, 17, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 18: sUCRName = "Braille Patterns"; break; /: U+2800-U+28FF :/ - nStart = 0x2800; - nCount = 0x28FF - nStart + 1; - memset(this.m_pRanges, nStart, 18, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 19: sUCRName = "Yi Syllables"; break; /: U+A000-U+A48F :/ /: U+A490-U+A4CF :/ - nStart = 0xA000; - nCount = 0xA48F - nStart + 1; - memset(this.m_pRanges, nStart, 19, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - nStart = 0xA490; - nCount = 0xA4CF - nStart + 1; - memset(this.m_pRanges, nStart, 19, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 20: sUCRName = "Tagalog"; break; /: U+1700-U+171F :/ /: U+1720-U+173F :/ /: U+1740-U+175F :/ /: U+1760-U+177F :/ - nStart = 0x1700; - nCount = 0x171F - nStart + 1; - memset(this.m_pRanges, nStart, 20, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - nStart = 0x1720; - nCount = 0x173F - nStart + 1; - memset(this.m_pRanges, nStart, 20, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - nStart = 0x1740; - nCount = 0x175F - nStart + 1; - memset(this.m_pRanges, nStart, 20, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - nStart = 0x1760; - nCount = 0x177F - nStart + 1; - memset(this.m_pRanges, nStart, 20, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 21: sUCRName = "Old Italic"; break; /:U+10300-U+1032F:/ - //case 22: sUCRName = "Gothic"; break; /:U+10330-U+1034F:/ - //case 23: sUCRName = "Deseret"; break; /:U+10400-U+1044F:/ - //case 24: sUCRName = "Byzantine Musical Symbols"; break; /:U+1D000-U+1D0FF:/ /:U+1D100-U+1D1FF:/ /:U+1D200-U+1D24F:/ - //case 25: sUCRName = "Mathematical Alphanumeric Symbols"; break; /:U+1D400-U+1D7FF:/ - //case 26: sUCRName = "Private Use (plane 15)"; break; /:U+F0000-U+FFFFD:/ /:U+100000-U+10FFFD:/ // Не юникодные символы - - //case 27: sUCRName = "Variation Selectors"; break; /: U+FE00-U+FE0F :/ /:U+E0100-U+E01EF:/ - nStart = 0xFE00; - nCount = 0xFE0F - nStart + 1; - memset(this.m_pRanges, nStart, 27, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 28: sUCRName = "Tags"; break; /:U+E0000-U+E007F:/ - //case 29: sUCRName = "Limbu"; break; /: U+1900-U+194F :/ - nStart = 0x1900; - nCount = 0x194F - nStart + 1; - memset(this.m_pRanges, nStart, 29, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 30: sUCRName = "Tai Le"; break; /: U+1950-U+197F :/ - nStart = 0x1950; - nCount = 0x197F - nStart + 1; - memset(this.m_pRanges, nStart, 30, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - //case 31: sUCRName = "New Tai Lue"; break; /: U+1980-U+19DF :/ - nStart = 0x1980; - nCount = 0x19DF - nStart + 1; - memset(this.m_pRanges, nStart, 31, nCount); - memset(this.m_pRangesNums, nStart, 2, nCount); - - // rangeNum 3 - //case 00: sUCRName = "Buginese"; break; /: U+1A00-U+1A1F :/ - nStart = 0x1A00; - nCount = 0x1A1F - nStart + 1; - memset(this.m_pRanges, nStart, 0, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 01: sUCRName = "Glagolitic"; break; /: U+2C00-U+2C5F :/ - nStart = 0x2C00; - nCount = 0x2C5F - nStart + 1; - memset(this.m_pRanges, nStart, 1, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 02: sUCRName = "Tifinagh"; break; /: U+2D30-U+2D7F :/ - nStart = 0x2D30; - nCount = 0x2D7F - nStart + 1; - memset(this.m_pRanges, nStart, 2, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 03: sUCRName = "Yijing Hexagram Symbols"; break; /: U+4DC0-U+4DFF :/ - nStart = 0x4DC0; - nCount = 0x4DFF - nStart + 1; - memset(this.m_pRanges, nStart, 3, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 04: sUCRName = "Syloti Nagri"; break; /: U+A800-U+A82F :/ - nStart = 0xA800; - nCount = 0xA82F - nStart + 1; - memset(this.m_pRanges, nStart, 4, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 05: sUCRName = "Linear B Syllabary"; break; /:U+10000-U+1007F:/ /:U+10080-U+100FF:/ /:U+10100-U+1013F:/ - //case 06: sUCRName = "Ancient Greek Numbers"; break; /:U+10140-U+1018F:/ - //case 07: sUCRName = "Ugaritic"; break; /:U+10380-U+1039F:/ - //case 08: sUCRName = "Old Persian"; break; /:U+103A0-U+103DF:/ - //case 09: sUCRName = "Shavian"; break; /:U+10450-U+1047F:/ - //case 10: sUCRName = "Osmanya"; break; /:U+10480-U+104AF:/ - //case 11: sUCRName = "Cypriot Syllabary"; break; /:U+10800-U+1083F:/ - //case 12: sUCRName = "Kharoshthi"; break; /:U+10A00-U+10A5F:/ - //case 13: sUCRName = "Tai Xuan Jing Symbols"; break; /:U+1D300-U+1D35F:/ - //case 14: sUCRName = "Cuneiform"; break; /:U+12000-U+123FF:/ /:U+12400-U+1247F:/ - //case 15: sUCRName = "Counting Rod Numerals"; break; /:U+1D360-U+1D37F:/ - - //case 16: sUCRName = "Sundanese"; break; /: U+1B80-U+1BBF :/ - nStart = 0x1B80; - nCount = 0x1BBF - nStart + 1; - memset(this.m_pRanges, nStart, 16, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 17: sUCRName = "Lepcha"; break; /: U+1C00-U+1C4F :/ - nStart = 0x1C00; - nCount = 0x1C4F - nStart + 1; - memset(this.m_pRanges, nStart, 17, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 18: sUCRName = "Ol Chiki"; break; /: U+1C50-U+1C7F :/ - nStart = 0x1C50; - nCount = 0x1C7F - nStart + 1; - memset(this.m_pRanges, nStart, 18, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 19: sUCRName = "Saurashtra"; break; /: U+A880-U+A8DF :/ - nStart = 0xA880; - nCount = 0xA8DF - nStart + 1; - memset(this.m_pRanges, nStart, 19, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 20: sUCRName = "Kayah Li"; break; /: U+A900-U+A92F :/ - nStart = 0xA900; - nCount = 0xA92F - nStart + 1; - memset(this.m_pRanges, nStart, 20, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 21: sUCRName = "Rejang"; break; /: U+A930-U+A95F :/ - nStart = 0xA930; - nCount = 0xA95F - nStart + 1; - memset(this.m_pRanges, nStart, 21, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 22: sUCRName = "Cham"; break; /: U+AA00-U+AA5F :/ - nStart = 0xAA00; - nCount = 0xAA5F - nStart + 1; - memset(this.m_pRanges, nStart, 22, nCount); - memset(this.m_pRangesNums, nStart, 3, nCount); - - //case 23: sUCRName = "Ancient Symbols"; break; /:U+10190-U+101CF:/ - //case 24: sUCRName = "Phaistos Disc"; break; /:U+101D0-U+101FF:/ - //case 25: sUCRName = "Carian"; break; /:U+102A0-U+102DF:/ /:U+10280-U+1029F:/ /:U+10920-U+1093F:/ - //case 26: sUCRName = "Domino Tiles"; break; /:U+1F030-U+1F09F:/ /:U+1F000-U+1F02F:/ - //case 27: sUCRName = "Reserved for process-internal usage"; break; - //case 28: sUCRName = "Reserved for process-internal usage"; break; - //case 29: sUCRName = "Reserved for process-internal usage"; break; - //case 30: sUCRName = "Reserved for process-internal usage"; break; - //case 31: sUCRName = "Reserved for process-internal usage"; break; - - */ - } - }; - - function CApplicationFonts() - { - this.FontPickerMap = {}; - - this.g_fontDictionary = new FD_FontDictionary(); - this.g_fontSelections = new CFontSelectList(); - this.DefaultIndex = 0; - - this.NameToInterface = {}; - - this.Init = function() - { - this.g_fontDictionary.Init(); - this.g_fontSelections.Init(); - - var oSelect = new CFontSelectFormat(); - oSelect.wsName = "Arial"; - - this.DefaultIndex = this.g_fontDictionary.GetFontIndex(oSelect, this.g_fontSelections.List, undefined); - }; - - this.LoadFont = function(name, font_loader, fontManager, fEmSize, lStyle, dHorDpi, dVerDpi, transform, objDst) - { - var _font = this.GetFontFileWeb(name, lStyle); - var font_name_index = AscFonts.g_map_font_index[_font.m_wsFontName]; - if (undefined !== objDst) - { - objDst.Name = _font.m_wsFontName; - objDst.Replace = this.CheckReplaceGlyphsMap(name, objDst); - } - - // используем стиль, пришедший извне, а не стиль _font - // так как подвираем вез стиля в Web версии - return AscFonts.g_font_infos[font_name_index].LoadFont(AscCommon.g_font_loader, fontManager, fEmSize, /*_font.GetStyle()*/lStyle, dHorDpi, dVerDpi, transform); - }; - - this.CheckReplaceGlyphsMap = function(name, objDst) - { - var _replaceInfoArray = this.g_fontDictionary.ChangeGlyphsMap[name]; - if (!_replaceInfoArray) - return null; - - for (let i = 0, len = _replaceInfoArray.length; i < len; i++) - { - if (_replaceInfoArray[i].Name === objDst.Name || _replaceInfoArray[i].Name === "-") - return _replaceInfoArray[i]; - } - - return null; - }; - - this.GetReplaceGlyph = function(src, objDst) - { - // если исходный шрифт символьный (и все глифы там 0xF000+) - то вычетаем, так как - // если подобранный шрифт символьный - прибавится на CacheGlyph. а если нет - то надо вычитать. - if (objDst.IsSymbolDst) - return (0xF000 < src) ? (src - 0xF000) : src; - - // TODO: must be faster!!! - var _arr = objDst.MapSrc; - var _arrLen = _arr.length; - - for (var i = 0; i < _arrLen; i++) - { - if (_arr[i] === src) - return objDst.MapDst[i]; - - if (objDst.IsSymbolSrc && (src == (0xF000 + _arr[i]))) - { - return objDst.MapDst[i]; - } - } - return src; - }; - - this.GetFontFile = function(name, lStyle) - { - if (lStyle === undefined) - lStyle = 0; - - var _key = "s" + lStyle + "_"; - _key += name; - - if (undefined !== this.FontPickerMap[_key]) - { - return this.FontPickerMap[_key]; - } - else - { - var oSelect = new CFontSelectFormat(); - oSelect.wsName = name; - oSelect.bItalic = false; - oSelect.bBold = false; - - var _font = this.GetFontIndex(oSelect); - this.FontPickerMap[_key] = _font; - return _font; - } - }; - - this.GetFontFileWeb = function(name, lStyle) - { - // здесь не учитываем стиль. Иначе будет проблемой загрузка шрифтов, - if (undefined !== this.FontPickerMap[name]) - { - return this.FontPickerMap[name]; - } - else - { - var oSelect = new CFontSelectFormat(); - oSelect.wsName = name; - - var _font = this.GetFontIndex(oSelect, true); - this.FontPickerMap[name] = _font; - return _font; - } - }; - - this.GetFontInfo = function(name, lStyle, objDst) - { - var _font = this.GetFontFileWeb(name, lStyle); - var font_name_index = AscFonts.g_map_font_index[_font.m_wsFontName]; - - if (undefined !== objDst) - { - objDst.Name = _font.m_wsFontName; - objDst.Replace = this.CheckReplaceGlyphsMap(name, objDst); - } - - return AscFonts.g_font_infos[font_name_index]; - }; - this.GetFontInfoName = function(name, objDst) - { - var _font = this.GetFontFileWeb(name); - - if (undefined !== objDst) - { - objDst.Name = _font.m_wsFontName; - objDst.Replace = this.CheckReplaceGlyphsMap(name, objDst); - } - - return _font.m_wsFontName; - }; - - this.GetFontIndex = function(oSelect, isName0) - { - return this.g_fontDictionary.GetFontIndex(oSelect, this.g_fontSelections.List, this.DefaultIndex, isName0); - }; - - this.GetFontNameDictionary = function(sFontFamily, bDontReturnDef) - { - var sFontname; - var nIndex = sFontFamily.indexOf(","); - if(-1 != nIndex) - sFontname = sFontFamily.substring(0, nIndex); - else - sFontname = sFontFamily; - //trim { }, {'}, {"} - sFontname = sFontname.replace(/^[\s'"]+|[\s'"]+$/g, ''); - if (0 == sFontname.length) - { - if (true === bDontReturnDef) - sFontname = "Arial"; - } - else - { - var sFontnameLower = sFontname.toLowerCase(); - if("serif" == sFontnameLower) - sFontname = "Times New Roman"; - else if("sans-serif" == sFontnameLower) - sFontname = "Arial"; - else if("cursive" == sFontnameLower) - sFontname = "Comic Sans MS"; - else if("fantasy" == sFontnameLower) - sFontname = "Impact"; - else if("monospace" == sFontnameLower) - sFontname = "Courier New"; - else - { - var oSelect = new CFontSelectFormat(); - oSelect.wsName = sFontname; - this.g_fontDictionary.CorrectParamsFromDictionary(oSelect); - - if (null != oSelect.pPanose) - return oSelect.wsName; - else - { - return this.GetFontInfoName(sFontname); - } - } - } - return sFontname; - }; - - this.CheckNamesForInterface = function(language) - { - var lang = language.toLowerCase(); - var indexSubLang = lang.indexOf("-"); - if (-1 == indexSubLang) - indexSubLang = lang.indexOf("_"); - if (-1 != indexSubLang) - lang = lang.substr(0, indexSubLang); - - var isEA = false; - switch (lang) - { - case "zh": - case "ja": - case "ko": - isEA = true; - break; - default: - break; - } - - var fonts = this.g_fontSelections.List; - var font, isFontEA1, isFontEA2, j; - for (var i = 0, len = fonts.length; i < len; i++) - { - font = fonts[i]; - if (!font.m_names || !font.m_names[0]) - continue; - - isFontEA1 = false; - isFontEA2 = false; - - for (j = font.m_wsFontName.getUnicodeIterator(); j.check(); j.next()) - { - if (AscCommon.isEastAsianScript(j.value())) - { - isFontEA1 = true; - break; - } - } - - for (j = font.m_names[0].getUnicodeIterator(); j.check(); j.next()) - { - if (AscCommon.isEastAsianScript(j.value())) - { - isFontEA2 = true; - break; - } - } - - if (isFontEA1 === isFontEA2) - continue; - - if (isEA) - { - if (isFontEA1) - this.NameToInterface[font.m_names[0]] = font.m_wsFontName; - else - this.NameToInterface[font.m_wsFontName] = font.m_names[0]; - } - else - { - if (isFontEA1) - this.NameToInterface[font.m_wsFontName] = font.m_names[0]; - else - this.NameToInterface[font.m_names[0]] = font.m_wsFontName; - } - } - }; - } - - var g_fontApplication = new CApplicationFonts(); - - //------------------------------------------------------export------------------------------------------------------ - window['AscFonts'] = window['AscFonts'] || {}; - window['AscFonts'].FontStyle = FontStyle; - window['AscFonts'].CreateFontData2 = CreateFontData2; - window['AscFonts'].CreateFontData3 = CreateFontData3; - window['AscFonts'].CreateFontData4 = CreateFontData4; - window['AscFonts'].LanguagesFontSelectTypes = LanguagesFontSelectTypes; - - window['AscFonts'].g_fontApplication = g_fontApplication; - - window['AscFonts']['pickFont'] = function(name, style) { - var info = AscFonts.g_fontApplication.GetFontInfo(name, style); - var fontId = info.GetFontID(AscCommon.g_font_loader, style); - return fontId.file; - }; - window['AscFonts']['getFontStreams'] = function() { - return AscFonts.g_fonts_streams; - }; - window['AscFonts']['getFontStream'] = function(index) { - var s = AscFonts.g_fonts_streams[index]; - return { - "data" : s.data, - "size" : s.size - }; - }; - window['AscFonts']['updateFontStreamNative'] = function(pointer, size) { - return {"asc_marker":true, data:pointer, len:size}; - }; - -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/index.ts b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/index.ts deleted file mode 100644 index bf11e0f7b2..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import "./AllFonts.js"; - -import "./device_scale.js"; -import "./browser.js"; -import "./stringserialize.js"; -import "./skin.js"; - -import "./font/loader.js"; -import "./font/map.js"; -import "./font/character.js"; - -import "./SerializeCommonWordExcel.js"; -import "./Externals.js"; -import "./GlobalLoaders.js"; -import "./scroll.js"; -import "./WorkEvents.js"; -import "./Overlay.js"; - -// import "./bookmarks.js"; -import "./thumbnails.js"; - -import "./file.js"; -import "./api.js"; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/scroll.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/scroll.js deleted file mode 100644 index 1daa9de23d..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/scroll.js +++ /dev/null @@ -1,2175 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -( /** -* @param {Window} window -* @param {undefined} undefined -*/ -function (window, undefined) { - - var AscBrowser = window['AscCommon'].AscBrowser; - -var debug = false; - -var ArrowType = { - NONE: 0, - ARROW_TOP: 1, - ARROW_RIGHT: 2, - ARROW_BOTTOM: 3, - ARROW_LEFT: 4 -}; - -var AnimationType = { - NONE: 0, - SCROLL_HOVER: 1, - ARROW_HOVER: 2, - SCROLL_ACTIVE: 3, - ARROW_ACTIVE: 4 -}; - -function GetClientWidth( elem ) { - if (!elem) return 0; - var _w = elem.clientWidth; - if ( 0 != _w ) - return _w; - - var _string_w = "" + elem.style.width; - if ( -1 < _string_w.indexOf( "%" ) ) - return 0; - - var _intVal = parseInt( _string_w ); - if ( !isNaN( _intVal ) && 0 < _intVal ) - return _intVal; - - return 0; -} -function GetClientHeight( elem ) { - if (!elem) return 0; - var _w = elem.clientHeight; - if ( 0 != _w ) - return _w; - - var _string_w = "" + elem.style.height; - if ( -1 < _string_w.indexOf( "%" ) ) - return 0; - - var _intVal = parseInt( _string_w ); - if ( !isNaN( _intVal ) && 0 < _intVal ) - return _intVal; - - return 0; -} - -function CArrowDrawer( settings ) { - // размер квадратика в пикселах - this.Size = 16; - this.SizeW = 16; - this.SizeH = 16; - - this.SizeNaturalW = this.SizeW; - this.SizeNaturalH = this.SizeH; - - this.IsRetina = false; - - this.ColorGradStart = {R: _HEXTORGB_(settings.arrowColor).R, G: _HEXTORGB_(settings.arrowColor).G, B: _HEXTORGB_(settings.arrowColor).B}; - - // вот такие мега настройки для кастомизации) - this.IsDrawBorderInNoneMode = false; - this.IsDrawBorders = true; - - //arrow pixel size - this.pxCount = settings.slimScroll ? 4 : 6; - - // имя - направление стрелки - this.ImageLeft = null; - this.ImageTop = null; - this.ImageRight = null; - this.ImageBottom = null; - - this.fadeInFadeOutDelay = settings.fadeInFadeOutDelay || 30; -} -CArrowDrawer.prototype.checkSettings = function ( settings ) -{ - this.ColorGradStart = {R: _HEXTORGB_(settings.arrowColor).R, G: _HEXTORGB_(settings.arrowColor).G, B: _HEXTORGB_(settings.arrowColor).B}; -} - -CArrowDrawer.prototype.InitSize = function ( sizeW, sizeH, is_retina ) { - /* if ( ( sizeH == this.SizeH || sizeW == this.SizeW ) && is_retina == this.IsRetina && null != this.ImageLeft ) - return;*/ - var dPR = AscBrowser.retinaPixelRatio; - this.SizeW = Math.max( sizeW, 1 ); - this.SizeH = Math.max( sizeH, 1 ); - this.IsRetina = is_retina; - - this.SizeNaturalW = this.SizeW; - this.SizeNaturalH = this.SizeH; - - if (null == this.ImageLeft || null == this.ImageTop || null == this.ImageRight || null == this.ImageBottom) - { - this.ImageLeft = document.createElement('canvas'); - this.ImageTop = document.createElement('canvas'); - this.ImageRight = document.createElement('canvas'); - this.ImageBottom = document.createElement('canvas'); - } - - var len = Math.floor(this.pxCount * dPR); - if ( this.SizeH < this.pxCount ) - return; - - // теперь делаем нечетную длину - if ( 0 == (len & 1) ) - len += 1; - - var countPart = (len + 1) >> 1, - _data, px, - _x = ((this.SizeW - len) >> 1), - _y = this.SizeH - ((this.SizeH - countPart) >> 1), - r, g, b; - var __x = _x, __y = _y, _len = len; - r = this.ColorGradStart.R; - g = this.ColorGradStart.G; - b = this.ColorGradStart.B; - this.ImageTop.width = this.SizeW; - this.ImageTop.height = this.SizeH; - this.ImageBottom.width = this.SizeW; - this.ImageBottom.height = this.SizeH; - this.ImageLeft.width = this.SizeW; - this.ImageLeft.height = this.SizeH; - this.ImageRight.width = this.SizeW; - this.ImageRight.height = this.SizeH; - var ctx = this.ImageTop.getContext('2d'); - var ctxBottom = this.ImageBottom.getContext('2d'); - var ctxLeft = this.ImageLeft.getContext('2d'); - var ctxRight = this.ImageRight.getContext('2d'); - - _data = ctx.createImageData(this.SizeW, this.SizeH); - px = _data.data; - - while (_len > 0) { - var ind = 4 * (this.SizeW * __y + __x); - for (var i = 0; i < _len; i++) { - px[ind++] = r; - px[ind++] = g; - px[ind++] = b; - px[ind++] = 255; - } - - r = r >> 0; - g = g >> 0; - b = b >> 0; - - __x += 1; - __y -= 1; - _len -= 2; - } - var dy = dPR <= 1 ? -1 : 0; - - ctx.putImageData(_data, 0, dy); - - _data = ctxLeft.createImageData(this.SizeW, this.SizeH); - px = _data.data; - _len = len; - __x = _x, __y = _y; - while (_len > 0) { - var ind = 4 * (this.SizeH * __x + __y); - var xx = __x; - for (var i = 0; i < _len; i++) { - px[ind++] = r; - px[ind++] = g; - px[ind++] = b; - px[ind++] = 255; - ++xx; - ind = 4 * (this.SizeH * xx + __y); - } - r = r >> 0; - g = g >> 0; - b = b >> 0; - __x += 1; - __y -= 1; - _len -= 2; - } - var dx = dPR <= 1 ? -1 : 0; - var dy = this.SizeW % 2 === 0 ? 1 : 0; - ctxLeft.putImageData(_data, dx, dy); - - dx = this.SizeW % 2 === 0 ? 1 : 0; - ctxBottom.translate( this.SizeW / 2, this.SizeH / 2); - ctxBottom.rotate(Math.PI); - ctxBottom.translate(-this.SizeW / 2, -this.SizeH / 2); - ctxBottom.drawImage( this.ImageTop, dx, 0, this.ImageBottom.width, this.ImageBottom.height); - - dy = this.SizeH % 2 === 0 ? -1 : 0; - ctxRight.translate( this.SizeW / 2, this.SizeH / 2); - ctxRight.rotate(Math.PI); - ctxRight.translate(-this.SizeW / 2, -this.SizeH / 2); - ctxRight.drawImage( this.ImageLeft, 0, dy, this.ImageRight.width, this.ImageRight.height); -}; - - /** - * @constructor - */ - function ScrollSettings() { - this.showArrows = true; - this.screenW = -1; - this.screenH = -1; - this.screenAddH = 0; - - this.contentH = 0; - this.contentW = 0; - - //timeout when scroll move - this.initialDelay = 300; - this.arrowRepeatFreq = 50; - this.trackClickRepeatFreq = 70; - - this.scrollPagePercent = 1. / 8; - - //max and min scroll size - this.scrollerMinHeight = 34; - this.scrollerMaxHeight = 99999; - this.scrollerMinWidth = 34; - this.scrollerMaxWidth = 99999; - - //arrow dimension - this.arrowDim = Math.round(13 * AscBrowser.retinaPixelRatio); - - //scroll elements color - this.scrollerColor = "#f1f1f1"; - this.scrollerHoverColor = "#cfcfcf"; - this.scrollerActiveColor = "#adadad"; - this.scrollBackgroundColor = "#f4f4f4"; - this.scrollBackgroundColorHover = "#f4f4f4"; - this.scrollBackgroundColorActive = "#f4f4f4"; - this.strokeStyleNone = "#cfcfcf"; - this.strokeStyleOver = "#cfcfcf"; - this.strokeStyleActive = "#ADADAD"; - - //scroll speed - this.vscrollStep = 10; - this.hscrollStep = 10; - this.wheelScrollLines = 1; - - //arrow elements color - this.arrowColor = "#ADADAD"; - this.arrowHoverColor = "#f1f1f1"; - this.arrowActiveColor = "#f1f1f1"; - - this.arrowBorderColor = "#cfcfcf"; - this.arrowOverBorderColor = "#cfcfcf"; - this.arrowOverBackgroundColor = "#cfcfcf"; - this.arrowActiveBorderColor = "#ADADAD"; - this.arrowActiveBackgroundColor = "#ADADAD"; - - //scroll animation time delay - this.fadeInFadeOutDelay = 20; - - //stripes color - this.targetColor = "#cfcfcf"; - this.targetHoverColor = "#f1f1f1"; - this.targetActiveColor = "#f1f1f1"; - - this.defaultColor = 241; - this.hoverColor = 207; - this.activeColor = 173; - - this.arrowSizeW = Math.round(13 * AscBrowser.retinaPixelRatio); - this.arrowSizeH = Math.round(13 * AscBrowser.retinaPixelRatio); - this.cornerRadius = 0; - this.slimScroll = false; - this.alwaysVisible = false; - this.isVerticalScroll = true; - this.isHorizontalScroll = false; - } - - /** - * @constructor - */ - function ScrollObject( elemID, settings, dbg ) { - if ( dbg ) - debug = dbg; - this.that = this; - - this.settings = settings; - this.ArrowDrawer = new CArrowDrawer( this.settings ); - - this.mouseUp = false; - this.mouseDown = false; - - this.that.mouseover = false; - - this.scrollerMouseDown = false; - this.animState = AnimationType.NONE; - this.lastAnimState = this.animState; - this.arrowState = ArrowType.NONE; - this.lastArrowState = this.arrowState; - - this.moveble = false; - this.lock = false; - this.scrollTimeout = null; - - this.StartMousePosition = {x:0, y:0}; - this.EndMousePosition = {x:0, y:0}; - - this.dragMinY = 0; - this.dragMaxY = 0; - - this.scrollVCurrentY = 0; - this.scrollHCurrentX = 0; - this.arrowPosition = 0; - - this.verticalTrackHeight = 0; - this.horizontalTrackWidth = 0; - - this.paneHeight = 0; - this.paneWidth = 0; - - this.maxScrollY = 0; - this.maxScrollX = 0; - this.maxScrollY2 = 0; - this.maxScrollX2 = 0; - - this.scrollCoeff = 0; - this.isResizeArrows = false; - - this.scroller = {x:0, y:1, h:0, w:0}; - - this.canvas = null; - this.context = null; - - this.eventListeners = []; - - this.IsRetina = false; - this.canvasW = 1; - this.canvasH = 1; - this.canvasOriginalW = 1; - this.canvasOriginalH = 1; - - this.scrollColor = _HEXTORGB_(this.settings.scrollerColor).R; - this.arrowColor = _HEXTORGB_(this.settings.arrowColor).R; - this.firstArrow = {arrowColor: _HEXTORGB_(this.settings.arrowColor).R, arrowBackColor: _HEXTORGB_(this.settings.scrollerColor).R, arrowStrokeColor: _HEXTORGB_(this.settings.strokeStyleNone).R}; - this.secondArrow = {arrowColor: _HEXTORGB_(this.settings.arrowColor).R, arrowBackColor: _HEXTORGB_(this.settings.scrollerColor).R, arrowStrokeColor: _HEXTORGB_(this.settings.strokeStyleNone).R}; - - this.targetColor = _HEXTORGB_(this.settings.targetColor).R; - this.strokeColor = _HEXTORGB_(this.settings.strokeStyleNone).R; - - this.fadeTimeoutScroll = null; - this.fadeTimeoutArrows = null; - - this.IsRetina = AscBrowser.isRetina; - - this.disableCurrentScroll = false; - this._initPiperImg(); - - this._init( elemID ); - } - - ScrollObject.prototype._initPiperImg = function() { - var dPR = AscBrowser.retinaPixelRatio; - this.piperImgVert = document.createElement( 'canvas' ); - this.piperImgHor = document.createElement( 'canvas' ); - - this.piperImgVert.height = Math.round( 13 * dPR); - this.piperImgVert.width = Math.round(5 * dPR); - - this.piperImgHor.width = Math.round( 13 * dPR); - this.piperImgHor.height = Math.round(5 * dPR); - - if(this.settings.slimScroll){ - this.piperImgVert.width = - this.piperImgHor.height = Math.round(3 * dPR); - } - - var ctx_piperImg; - ctx_piperImg = this.piperImgVert.getContext('2d'); - ctx_piperImg.beginPath(); - ctx_piperImg.lineWidth = Math.floor(dPR); - var count = 0; - - var _dPR = dPR < 0.5 ? Math.ceil(dPR) : Math.round(dPR); - - for (var i = 0; i < this.piperImgVert.height; i += _dPR + Math.floor(dPR)) { - ctx_piperImg.moveTo(0, i + 0.5 * ctx_piperImg.lineWidth); - ctx_piperImg.lineTo(this.piperImgVert.width, i + 0.5 * ctx_piperImg.lineWidth); - ctx_piperImg.stroke(); - ++count; - if (count > 6 && dPR >= 1) break; - } - - ctx_piperImg = this.piperImgHor.getContext('2d'); - ctx_piperImg.beginPath(); - ctx_piperImg.lineWidth = Math.floor(dPR); - var count = 0; - for (var i = 0; i < this.piperImgHor.width; i += _dPR + Math.floor(dPR)) { - ctx_piperImg.moveTo(i + 0.5 * ctx_piperImg.lineWidth, 0); - ctx_piperImg.lineTo(i + 0.5 * ctx_piperImg.lineWidth, this.piperImgHor.height); - ctx_piperImg.stroke(); - ++count; - if (count > 6 && dPR >= 1) break; - } - } - - ScrollObject.prototype._init = function ( elemID ) { - if ( !elemID ) return false; - - var dPR = AscBrowser.retinaPixelRatio; - var holder = document.getElementById( elemID ); - - if ( holder.getElementsByTagName( 'canvas' ).length == 0 ){ - this.canvas = holder.appendChild( document.createElement( "CANVAS" ) ); - } - else { - this.canvas = holder.children[1]; - } - - this.canvas.style.width = "100%"; - this.canvas.style.height = "100%"; - - this.canvas.that = this; - this.canvas.style.zIndex = 100; - this.canvas.style.position = "absolute"; - this.canvas.style.top = "0px"; - this.canvas.style["msTouchAction"] = "none"; - if ( navigator.userAgent.toLowerCase().indexOf( "webkit" ) != -1 ){ - this.canvas.style.webkitUserSelect = "none"; - } - - this.context = this.canvas.getContext( '2d' ); - - this._setDimension( holder.clientHeight, holder.clientWidth ); - - this.maxScrollY = this.maxScrollY2 = this.settings.contentH - this.settings.screenH > 0 ? this.settings.contentH - this.settings.screenH : 0; - this.maxScrollX = this.maxScrollX2 = this.settings.contentW - this.settings.screenW > 0 ? this.settings.contentW - this.settings.screenW : 0; - - if(this.settings.isVerticalScroll && !this.settings.alwaysVisible) { - this.canvas.style.display = this.maxScrollY == 0 ? "none" : ""; - } - - if(this.settings.isHorizontalScroll && !this.settings.alwaysVisible) { - this.canvas.style.display = this.maxScrollX == 0 ? "none" : ""; - } - - this._setScrollerHW(); - this.settings.arrowDim = this.settings.slimScroll && this.settings.isVerticalScroll ? this.scroller.w : this.settings.arrowDim; - this.settings.arrowDim = this.settings.slimScroll && this.settings.isHorizontalScroll ? this.scroller.h : this.settings.arrowDim; - this.arrowPosition = this.settings.showArrows ? Math.round(this.settings.arrowDim + this._roundForScale(dPR) + this._roundForScale(dPR)) : Math.round(dPR); - - this.paneHeight = this.canvasH - this.arrowPosition * 2; - this.paneWidth = this.canvasW - this.arrowPosition * 2; - - this.RecalcScroller(); - - AscCommon.addMouseEvent(this.canvas, "down", this.evt_mousedown); - AscCommon.addMouseEvent(this.canvas, "move", this.evt_mousemove); - AscCommon.addMouseEvent(this.canvas, "up", this.evt_mouseup); - AscCommon.addMouseEvent(this.canvas, "over", this.evt_mouseover); - AscCommon.addMouseEvent(this.canvas, "out", this.evt_mouseout); - this.canvas.onmousewheel = this.evt_mousewheel; - - var _that = this; - this.canvas.ontouchstart = function ( e ) { - _that.evt_mousedown( e.touches[0] ); - return false; - }; - this.canvas.ontouchmove = function ( e ) { - _that.evt_mousemove( e.touches[0] ); - return false; - }; - this.canvas.ontouchend = function ( e ) { - _that.evt_mouseup( e.changedTouches[0] ); - return false; - }; - - if ( this.canvas.addEventListener ){ - this.canvas.addEventListener( 'DOMMouseScroll', this.evt_mousewheel, false ); - } - - this.context.fillStyle = this.settings.scrollBackgroundColor; - this.context.fillRect(0,0,this.canvasW,this.canvasH); - this._drawArrows(); - this._draw(); - - return true; - }; - ScrollObject.prototype.disableCurrentScroll = function() { - this.disableCurrentScroll = true; - }; - ScrollObject.prototype.checkDisableCurrentScroll = function() { - var ret = this.disableCurrentScroll; - this.disableCurrentScroll = false; - return ret; - }; - ScrollObject.prototype.getMousePosition = function ( evt ) { - // get canvas position - var obj = this.canvas; - var top = 0; - var left = 0; - while ( obj && obj.tagName != 'BODY' ) { - top += obj.offsetTop; - left += obj.offsetLeft; - obj = obj.offsetParent; - } - var dPR = AscBrowser.retinaPixelRatio; - // return relative mouse position - var mouseX = (((evt.clientX * AscBrowser.zoom) >> 0) - left + window.pageXOffset) * dPR; - var mouseY = (((evt.clientY * AscBrowser.zoom) >> 0) - top + window.pageYOffset) * dPR; - - return { - x:mouseX, - y:mouseY - }; - }; - ScrollObject.prototype.RecalcScroller = function ( startpos ) { - var dPR = AscBrowser.retinaPixelRatio; - if ( this.settings.isVerticalScroll ) { - if ( this.settings.showArrows ) { - this.verticalTrackHeight = this.canvasH - this.arrowPosition * 2; - this.scroller.y = this.arrowPosition; - } - else { - this.verticalTrackHeight = this.canvasH; - this.scroller.y = Math.round(dPR); - } - var percentInViewV; - - percentInViewV = (this.maxScrollY * dPR + this.paneHeight) / this.paneHeight; - this.scroller.h = Math.ceil(Math.ceil( 1 / percentInViewV * this.verticalTrackHeight / dPR) * dPR); - - var scrollMinH = Math.round(this.settings.scrollerMinHeight * dPR); - - if ( this.scroller.h < scrollMinH) - this.scroller.h = scrollMinH; - else if ( this.scroller.h > this.settings.scrollerMaxHeight ) - this.scroller.h = this.settings.scrollerMaxHeight; - this.scrollCoeff = this.maxScrollY / Math.max( 1, this.paneHeight - this.scroller.h ); - if ( startpos ) { - this.scroller.y = startpos / this.scrollCoeff + this.arrowPosition; - } - this.dragMaxY = this.canvasH - this.arrowPosition - this.scroller.h + 1; - this.dragMinY = this.arrowPosition; - } - - if ( this.settings.isHorizontalScroll ) { - if ( this.settings.showArrows ) { - this.horizontalTrackWidth = this.canvasW - this.arrowPosition * 2; - this.scroller.x = this.arrowPosition; - } - else { - this.horizontalTrackWidth = this.canvasW; - this.scroller.x = Math.round(dPR); - } - var percentInViewH; - percentInViewH = ( this.maxScrollX * dPR + this.paneWidth ) / this.paneWidth; - this.scroller.w = Math.ceil(Math.ceil( 1 / percentInViewH * this.horizontalTrackWidth / dPR) * dPR); - - var scrollMinW = Math.round(this.settings.scrollerMinWidth * dPR); - - if ( this.scroller.w < scrollMinW) - this.scroller.w = scrollMinW; - else if ( this.scroller.w > this.settings.scrollerMaxWidth ) - this.scroller.w = this.settings.scrollerMaxWidth; - this.scrollCoeff = this.maxScrollX / Math.max( 1, this.paneWidth - this.scroller.w ); - if ( typeof startpos !== "undefined" ) { - this.scroller.x = startpos / this.scrollCoeff + this.arrowPosition; - } - this.dragMaxX = this.canvasW - this.arrowPosition - this.scroller.w; - this.dragMinX = this.arrowPosition; - } - }; - ScrollObject.prototype.Repos = function ( settings, bIsHorAttack, bIsVerAttack, pos ) { - var dPR = AscBrowser.retinaPixelRatio; - - var isChangeTheme = settings && this.settings.scrollBackgroundColor !== settings.scrollBackgroundColor; - - if (isChangeTheme) - { - for ( var i in settings ) - this.settings[i] = settings[i]; - } - - if (this.settings.showArrows) { - this.settings.arrowSizeW = Math.round(13 * dPR); - this.settings.arrowSizeH = Math.round(13 * dPR); - this.ArrowDrawer.InitSize(this.settings.arrowSizeH, this.settings.arrowSizeW, this.IsRetina); - } - - if (bIsVerAttack) - { - var _canvasH = settings.screenH; - if (undefined !== _canvasH && settings.screenAddH) - _canvasH += settings.screenAddH; - - if (_canvasH == this.canvasH && undefined !== settings.contentH) - { - var _maxScrollY = settings.contentH - settings.screenH > 0 ? settings.contentH - settings.screenH : 0; - if (_maxScrollY == this.maxScrollY && !isChangeTheme) - return; - } - } - if (bIsHorAttack) - { - if (settings.screenW == this.canvasW && undefined !== settings.contentW) - { - var _maxScrollX = settings.contentW - settings.screenW > 0 ? settings.contentW - settings.screenW : 0; - if (_maxScrollX == this.maxScrollX && !isChangeTheme) - return; - } - } - var dPR = AscBrowser.retinaPixelRatio; - var _parentClientW = GetClientWidth( this.canvas.parentNode ); - var _parentClientH = GetClientHeight( this.canvas.parentNode ); - - var _firstChildW = settings.contentW; - var _firstChildH = settings.contentH; - - this.maxScrollY = this.maxScrollY2 = _firstChildH - settings.screenH > 0 ? _firstChildH - settings.screenH : 0; - this.maxScrollX = this.maxScrollX2 = _firstChildW - settings.screenW > 0 ? _firstChildW - settings.screenW : 0; - - this._setDimension( _parentClientH, _parentClientW ); - this._setScrollerHW(); - - this.settings.arrowDim = Math.round(13 * dPR); - this.settings.arrowDim = this.settings.slimScroll && this.settings.isVerticalScroll ? this.scroller.w : this.settings.arrowDim; - this.settings.arrowDim = this.settings.slimScroll && this.settings.isHorizontalScroll ? this.scroller.h : this.settings.arrowDim; - this.arrowPosition = this.settings.showArrows ? Math.round(this.settings.arrowDim + this._roundForScale(dPR) + this._roundForScale(dPR)) : Math.round(dPR); - this.paneHeight = this.canvasH - this.arrowPosition * 2; - this.paneWidth = this.canvasW - this.arrowPosition * 2; - this.RecalcScroller(); - if ( this.settings.isVerticalScroll && !this.settings.alwaysVisible) { - - if (this.scrollVCurrentY > this.maxScrollY) - this.scrollVCurrentY = this.maxScrollY; - - this.scrollToY( this.scrollVCurrentY ); - if(this.maxScrollY == 0){ - this.canvas.style.display = "none"; - } - else{ - this.canvas.style.display = ""; - } - } - else if ( this.settings.isHorizontalScroll ) { - - if (this.scrollHCurrentX > this.maxScrollX) - this.scrollHCurrentX = this.maxScrollX; - - this.scrollToX( this.scrollHCurrentX ); - if(this.maxScrollX == 0 && !this.settings.alwaysVisible){ - this.canvas.style.display = "none"; - } - else{ - this.canvas.style.display = ""; - } - } - - this.reinit = true; - if ( this.settings.isVerticalScroll && pos) { - pos !== undefined ? this.scrollByY( pos - this.scrollVCurrentY ) : this.scrollToY( this.scrollVCurrentY ); - } - - if ( this.settings.isHorizontalScroll && pos) { - pos !== undefined ? this.scrollByX( pos - this.scrollHCurrentX ) : this.scrollToX( this.scrollHCurrentX ); - } - this.reinit = false; - - if (this.isResizeArrows || isChangeTheme) { - this.context.fillStyle = this.settings.scrollBackgroundColor; - this.context.fillRect(0,0,this.canvasW,this.canvasH); - - this.firstArrow = {arrowColor: _HEXTORGB_(this.settings.arrowColor).R, arrowBackColor: _HEXTORGB_(this.settings.scrollerColor).R, arrowStrokeColor: _HEXTORGB_(this.settings.strokeStyleNone).R}; - this.secondArrow = {arrowColor: _HEXTORGB_(this.settings.arrowColor).R, arrowBackColor: _HEXTORGB_(this.settings.scrollerColor).R, arrowStrokeColor: _HEXTORGB_(this.settings.strokeStyleNone).R}; - this._drawArrows(); - } - this._initPiperImg(); - this._draw(); - }; - ScrollObject.prototype._scrollV = function ( that, evt, pos, isTop, isBottom, bIsAttack ) { - if ( !this.settings.isVerticalScroll ) { - return; - } - - if ( that.scrollVCurrentY !== pos || bIsAttack === true ) { - var oldPos = that.scrollVCurrentY; - that.scrollVCurrentY = pos; - evt.scrollD = evt.scrollPositionY = that.scrollVCurrentY; - evt.maxScrollY = that.maxScrollY; - that.handleEvents( "onscrollvertical", evt ); - if (that.checkDisableCurrentScroll()) { - // prevented... - that.scrollVCurrentY = oldPos; - return; - } - that._draw(); - } - else if ( that.scrollVCurrentY === pos && pos > 0 && !this.reinit && !this.moveble && !this.lock ) { - evt.pos = pos; - that.handleEvents( "onscrollVEnd", evt ); - } - }; - ScrollObject.prototype._correctScrollV = function ( that, yPos ) { - if ( !this.settings.isVerticalScroll ) - return null; - - var events = that.eventListeners["oncorrectVerticalScroll"]; - if ( events ) { - if ( events.length != 1 ) - return null; - - return events[0].handler.apply( that, [yPos] ); - } - return null; - }; - ScrollObject.prototype._correctScrollByYDelta = function ( that, delta ) { - if ( !this.settings.isVerticalScroll ) - return null; - - var events = that.eventListeners["oncorrectVerticalScrollDelta"]; - if ( events ) { - if ( events.length != 1 ) - return null; - - return events[0].handler.apply( that, [delta] ); - } - return null; - }; - ScrollObject.prototype._scrollH = function ( that, evt, pos, isTop, isBottom ) { - if ( !this.settings.isHorizontalScroll ) { - return; - } - if ( that.scrollHCurrentX !== pos ) { - that.scrollHCurrentX = pos; - evt.scrollD = evt.scrollPositionX = that.scrollHCurrentX; - evt.maxScrollX = that.maxScrollX; - - that._draw(); - that.handleEvents( "onscrollhorizontal", evt ); - } - else if ( that.scrollHCurrentX === pos && pos > 0 && !this.reinit && !this.moveble && !this.lock ) { - evt.pos = pos; - that.handleEvents( "onscrollHEnd", evt ); - } - }; - ScrollObject.prototype.scrollByY = function ( delta, isAttack) { - if ( !this.settings.isVerticalScroll ) { - return; - } - - var dPR = AscBrowser.retinaPixelRatio; - var result = this._correctScrollByYDelta( this, delta ); - if ( result != null && result.isChange === true ) - delta = result.Pos; - - var destY = this.scrollVCurrentY + delta, isTop = false, isBottom = false, vend = false; - - if ( this.scrollVCurrentY + delta < 0 ) { - destY = 0; - isTop = true; - isBottom = false; - } - else if ( this.scrollVCurrentY + delta > this.maxScrollY2 ) { - this.handleEvents( "onscrollVEnd", destY - this.maxScrollY ); - vend = true; - destY = this.maxScrollY2; - isTop = false; - isBottom = true; - } - var scrollCoeff = this.scrollCoeff === 0 ? 1 : this.scrollCoeff; - this.scroller.y = destY / scrollCoeff + this.arrowPosition; - if ( this.scroller.y < this.dragMinY ) - this.scroller.y = this.dragMinY + 1; - else if ( this.scroller.y > this.dragMaxY ) - this.scroller.y = this.dragMaxY; - - var arrow = this.settings.showArrows ? this.arrowPosition : 0; - if ( this.scroller.y + this.scroller.h > this.canvasH - arrow) { - this.scroller.y -= Math.abs( this.canvasH - arrow - this.scroller.y - this.scroller.h); - } - - this.scroller.y = Math.round(this.scroller.y); - - if ( vend ) { - this.moveble = true; - } - this._scrollV( this, {}, destY, isTop, isBottom, isAttack); - if ( vend ) { - this.moveble = false; - } - }; - ScrollObject.prototype.scrollToY = function ( destY ) { - if ( !this.settings.isVerticalScroll ) { - return; - } - - this.scroller.y = destY / Math.max( 1, this.scrollCoeff ) + this.arrowPosition; - if ( this.scroller.y < this.dragMinY ) - this.scroller.y = this.dragMinY + 1; - else if ( this.scroller.y > this.dragMaxY ) - this.scroller.y = this.dragMaxY; - - var arrow = this.settings.showArrows ? this.arrowPosition : 0; - if ( this.scroller.y + this.scroller.h > this.canvasH - arrow ) { - this.scroller.y -= Math.abs( this.canvasH - arrow - this.scroller.y - this.scroller.h ); - } - - this.scroller.y = Math.round(this.scroller.y); - - this._scrollV( this, {}, destY, false, false ); - }; - ScrollObject.prototype.scrollByX = function ( delta ) { - if ( !this.settings.isHorizontalScroll ) { - return; - } - var dPR = AscBrowser.retinaPixelRatio; - var destX = this.scrollHCurrentX + delta, isTop = false, isBottom = false, hend = false; - - if ( destX < 0 ) { - destX = 0; - isTop = true; - isBottom = false; - } - else if ( destX > this.maxScrollX2 ) { - this.handleEvents( "onscrollHEnd", destX - this.maxScrollX ); - hend = true; - destX = this.maxScrollX2; - isTop = false; - isBottom = true; - } - var scrollCoeff = this.scrollCoeff === 0 ? 1 : this.scrollCoeff; - this.scroller.x = destX / scrollCoeff + this.arrowPosition; - if ( this.scroller.x < this.dragMinX ) - this.scroller.x = this.dragMinX + 1; - else if ( this.scroller.x > this.dragMaxX ) - this.scroller.x = this.dragMaxX; - - var arrow = this.settings.showArrows ? this.arrowPosition : 0; - if ( this.scroller.x + this.scroller.w > this.canvasW - arrow) { - this.scroller.x -= Math.abs( this.canvasW - arrow - this.scroller.x - this.scroller.w); - } - - this.scroller.x = Math.round(this.scroller.x); - - if ( hend ) { - this.moveble = true; - } - this._scrollH( this, {}, destX, isTop, isBottom ); - if ( hend ) { - this.moveble = true; - } - }; - ScrollObject.prototype.scrollToX = function ( destX ) { - if ( !this.settings.isHorizontalScroll ) { - return; - } - this.scroller.x = destX / Math.max( 1, this.scrollCoeff ) + this.arrowPosition; - if ( this.scroller.x < this.dragMinX ) - this.scroller.x = this.dragMinX + 1; - else if ( this.scroller.x > this.dragMaxX ) - this.scroller.x = this.dragMaxX; - - var arrow = this.settings.showArrows ? this.arrowPosition : 0; - if ( this.scroller.x + this.scroller.w > this.canvasW - arrow) { - this.scroller.x -= Math.abs( this.canvasW - arrow - this.scroller.x - this.scroller.w); - } - - this.scroller.x = Math.round(this.scroller.x); - - this._scrollH( this, {}, destX, false, false ); - }; - ScrollObject.prototype.scrollTo = function ( destX, destY ) { - this.scrollToX( destX ); - this.scrollToY( destY ); - }; - ScrollObject.prototype.scrollBy = function ( deltaX, deltaY ) { - this.scrollByX( deltaX ); - this.scrollByY( deltaY ); - }; - - ScrollObject.prototype.roundRect = function ( x, y, width, height, radius ) { - if ( typeof radius === "undefined" ) { - radius = 1; - } - this.context.beginPath(); - this.context.moveTo( x + radius, y ); - this.context.lineTo( x + width - radius, y ); - this.context.quadraticCurveTo( x + width, y, x + width, y + radius ); - this.context.lineTo( x + width, y + height - radius ); - this.context.quadraticCurveTo( x + width, y + height, x + width - radius, y + height ); - this.context.lineTo( x + radius, y + height ); - this.context.quadraticCurveTo( x, y + height, x, y + height - radius ); - this.context.lineTo( x, y + radius ); - this.context.quadraticCurveTo( x, y, x + radius, y ); - this.context.closePath(); - }; - - ScrollObject.prototype._clearContent = function () { - this.context.clearRect( 0, 0, this.canvasW, this.canvasH ); - }; - - ScrollObject.prototype._drawArrows = function () { - var that = this; - if (!that.settings.showArrows) { - return; - } - var t = that.ArrowDrawer; - var xDeltaBORDER = 0.5, yDeltaBORDER = 1.5; - var roundDPR = that._roundForScale(AscBrowser.retinaPixelRatio); - var x1 = 0, y1 = 0, x2 = 0, y2 = 0; - var ctx = that.context; - - ctx.beginPath(); - ctx.fillStyle = that.settings.scrollerColor; - var arrowImage = that.ArrowDrawer.ImageTop; - var imgContext = arrowImage.getContext('2d'); - imgContext.globalCompositeOperation = "source-in"; - imgContext.fillStyle = that.settings.arrowColor; - ctx.lineWidth = roundDPR; - if (that.settings.isVerticalScroll) { - for (var i = 0; i < 2; i++) { - imgContext.fillRect( x1 + xDeltaBORDER * ctx.lineWidth, 0, t.SizeW - roundDPR, t.SizeH - roundDPR); - ctx.fillRect( x1, y1 + roundDPR, t.SizeW, t.SizeH); - ctx.drawImage(arrowImage, x1, y2, t.SizeW, t.SizeH); - - if (t.IsDrawBorders) { - ctx.strokeStyle = that.settings.strokeStyleNone; - ctx.rect(x1 + xDeltaBORDER * ctx.lineWidth, y1 + yDeltaBORDER * ctx.lineWidth, t.SizeW - roundDPR, t.SizeH - roundDPR); - ctx.stroke(); - } - - y1 = that.canvasH - t.SizeH - 2 * roundDPR; - y2 = that.canvasH - t.SizeH; - arrowImage = that.ArrowDrawer.ImageBottom; - imgContext = arrowImage.getContext('2d'); - imgContext.globalCompositeOperation = "source-in"; - imgContext.fillStyle = that.settings.arrowColor; - } - } - - var arrowImage = that.ArrowDrawer.ImageLeft; - var imgContext = arrowImage.getContext('2d'); - imgContext.globalCompositeOperation = "source-in"; - imgContext.fillStyle = that.settings.arrowColor; - if (that.settings.isHorizontalScroll) { - for (var i = 0; i < 2; i++) { - imgContext.fillRect( 0, y1 + yDeltaBORDER * ctx.lineWidth, t.SizeW - roundDPR, t.SizeH - roundDPR); - ctx.fillRect( x1 + roundDPR, y1, t.SizeW, t.SizeH); - ctx.drawImage(arrowImage, x2, y2, t.SizeW, t.SizeH); - - if (t.IsDrawBorders) { - ctx.strokeStyle = that.settings.strokeStyleNone; - ctx.lineWidth = roundDPR; - ctx.rect(x1 + yDeltaBORDER * ctx.lineWidth, y1 + xDeltaBORDER * ctx.lineWidth, t.SizeW - roundDPR, t.SizeH - roundDPR); - ctx.stroke(); - } - - x1 = that.canvasW - t.SizeW - 2 * roundDPR; - x2 = that.canvasW - t.SizeW; - y2 = 0; - arrowImage = that.ArrowDrawer.ImageRight; - imgContext = arrowImage.getContext('2d'); - imgContext.globalCompositeOperation = "source-in"; - imgContext.fillStyle = that.settings.arrowColor; - } - } - }; - - ScrollObject.prototype._drawScroll = function (fillColor, targetColor, strokeColor) { - fillColor = Math.round(fillColor); - targetColor = Math.round(targetColor); - strokeColor = Math.round(strokeColor); - - var that = this; - that.context.beginPath(); - var roundDPR = this._roundForScale(AscBrowser.retinaPixelRatio); - that.context.lineWidth = roundDPR; - - if (that.settings.isVerticalScroll) { - var _y = that.settings.showArrows ? that.arrowPosition : 0, - _h = that.canvasH - (_y << 1); - - if (_h > 0) { - that.context.rect(0, _y, that.canvasW, _h); - } - } else if (that.settings.isHorizontalScroll) { - var _x = that.settings.showArrows ? that.arrowPosition : 0, - _w = that.canvasW - (_x << 1); - - if (_w > 0) { - that.context.rect(_x, 0, _w, that.canvasH); - } - } - - switch (that.animState) { - - case AnimationType.SCROLL_HOVER: { - that.context.fillStyle = that.settings.scrollBackgroundColorHover; - break; - } - case AnimationType.SCROLL_ACTIVE: { - that.context.fillStyle = that.settings.scrollBackgroundColorActive; - break; - } - case AnimationType.NONE: - default: { - that.context.fillStyle = that.settings.scrollBackgroundColor; - break; - } - - } - - that.context.fill(); - that.context.beginPath(); - - if (that.settings.isVerticalScroll && that.maxScrollY != 0) { - var _y = that.scroller.y >> 0, arrow = that.settings.showArrows ? that.arrowPosition : 0; - if (_y < arrow) { - _y = arrow; - } - var _b = Math.round(that.scroller.y + that.scroller.h);// >> 0; - if (_b > (that.canvasH - arrow - 1)) { - _b = that.canvasH - arrow - 1; - } - - if (_b > _y) { - that.roundRect(that.scroller.x - 0.5 * that.context.lineWidth, _y + 0.5 * that.context.lineWidth, that.scroller.w - roundDPR, that.scroller.h - roundDPR, that.settings.cornerRadius * roundDPR); - } - } else if (that.settings.isHorizontalScroll && that.maxScrollX != 0) { - var _x = that.scroller.x >> 0, arrow = that.settings.showArrows ? that.arrowPosition : 0; - if (_x < arrow) { - _x = arrow; - } - var _r = (that.scroller.x + that.scroller.w) >> 0; - if (_r > (that.canvasW - arrow - 2)) { - _r = that.canvasW - arrow - 1; - } - - if (_r > _x) { - that.roundRect(_x + 0.5 * that.context.lineWidth, that.scroller.y - 0.5 * that.context.lineWidth, that.scroller.w - roundDPR, that.scroller.h - roundDPR, that.settings.cornerRadius * roundDPR); - } - } - - that.context.fillStyle = "rgb(" + fillColor + "," + fillColor + "," + fillColor + ")" - that.context.fill(); - - - - that.context.strokeStyle = "rgb(" + strokeColor + "," + strokeColor + "," + strokeColor + ")"; - that.strokeColor = strokeColor; - that.context.stroke(); - - var ctx_piperImg, _data, px, img, x, y; - - //drawing scroll stripes - if (that._checkPiperImagesV()) { - - x = Math.round((that.scroller.w - that.piperImgVert.width) / 2); - y = Math.floor((that.scroller.y + Math.floor(that.scroller.h / 2) - 6 * AscBrowser.retinaPixelRatio)); - - ctx_piperImg = that.piperImgVert.getContext('2d'); - ctx_piperImg.globalCompositeOperation = "source-in"; - ctx_piperImg.fillStyle = "rgb(" + targetColor + "," + - targetColor + "," + - targetColor + ")"; - ctx_piperImg.fillRect(0, 0, that.scroller.w - 1, that.scroller.h - 1); - - img = that.piperImgVert; - } else if (that._checkPiperImagesH()) { - x = Math.round(that.scroller.x + (that.scroller.w - that.piperImgHor.width) / 2); - y = Math.round((that.scroller.h - that.piperImgHor.height) / 2); - - ctx_piperImg = that.piperImgHor.getContext('2d'); - ctx_piperImg.globalCompositeOperation = "source-in"; - ctx_piperImg.fillStyle = "rgb(" + targetColor + "," + - targetColor + "," + - targetColor + ")"; - ctx_piperImg.fillRect(0, 0, that.scroller.w - 1, that.scroller.h - 1); - - img = that.piperImgHor; - } - - if (img) - that.context.drawImage(img, x, y); - - that.scrollColor = fillColor; - that.targetColor = targetColor; - }; - - ScrollObject.prototype._animateArrow = function (fadeIn, curArrowType, backgroundColorUnfade) { - var that = this; - var roundDPR = that._roundForScale(AscBrowser.retinaPixelRatio); - var sizeW = that.ArrowDrawer.SizeW, sizeH = that.ArrowDrawer.SizeH; - - if (!that.settings.showArrows || !curArrowType) { - return; - } - var cnvs = document.createElement('canvas'), arrowType, - ctx = cnvs.getContext('2d'), context = that.context, - hoverColor = _HEXTORGB_(that.settings.scrollerHoverColor).R, defaultColor = _HEXTORGB_(that.settings.scrollerColor).R, - arrowColor = _HEXTORGB_(that.settings.arrowColor).R, - arrowHoverColor = _HEXTORGB_(that.settings.arrowHoverColor).R, - strokeColor = _HEXTORGB_(that.settings.strokeStyleNone).R, - strokeHoverColor = _HEXTORGB_(that.settings.strokeStyleOver).R; - - cnvs.width = sizeW; - cnvs.height = sizeH; - - if (curArrowType === ArrowType.ARROW_TOP || curArrowType === ArrowType.ARROW_LEFT) { - arrowType = this.firstArrow; - } else if (curArrowType === ArrowType.ARROW_BOTTOM || curArrowType === ArrowType.ARROW_RIGHT) { - arrowType = this.secondArrow; - } else return; - - - var x = 0, y = 0, fillRectX = 0, fillRectY = 0, strokeRectX = 0, strokeRectY = 0; - var arrowImage = that.settings.isVerticalScroll ? that.ArrowDrawer.ImageTop : that.ArrowDrawer.ImageLeft; - - //what type of arrow to draw - switch (curArrowType) { - case ArrowType.ARROW_TOP: { - fillRectY = roundDPR; - break; - } - case ArrowType.ARROW_BOTTOM: { - y = that.canvasH - sizeH; - fillRectY = -roundDPR; - strokeRectY = -2 * roundDPR; - arrowImage = that.ArrowDrawer.ImageBottom; - break; - } - case ArrowType.ARROW_RIGHT: { - y = 0; - x = that.canvasW - sizeW; - fillRectX = -roundDPR; - strokeRectX = -roundDPR; - strokeRectY = -roundDPR; - arrowImage = that.ArrowDrawer.ImageRight; - break; - } - case ArrowType.ARROW_LEFT: { - y = 0; - x = 0; - fillRectX = roundDPR; - strokeRectX = roundDPR; - strokeRectY = -roundDPR; - break; - } - } - - var stepsCount = 17; - var step = Math.abs((defaultColor - hoverColor)) / stepsCount; - - //dimming the arrow - if (fadeIn) { - if(arrowType.arrowColor === arrowHoverColor && arrowType.arrowBackColor === hoverColor) { - return; - } - - if (arrowType.arrowBackColor - hoverColor > step) { - arrowType.arrowBackColor -= step; - } else if (arrowType.arrowBackColor - hoverColor < -step) { - arrowType.arrowBackColor += step; - } else { - arrowType.arrowBackColor = hoverColor; - } - - step = Math.abs((strokeColor - strokeHoverColor)) / stepsCount; - - if (arrowType.arrowStrokeColor - strokeHoverColor > step) { - arrowType.arrowStrokeColor -= step; - } else if (arrowType.arrowStrokeColor - strokeHoverColor < -step) { - arrowType.arrowStrokeColor += step; - } else { - arrowType.arrowStrokeColor = strokeHoverColor; - } - - step = Math.abs((arrowColor - arrowHoverColor)) / stepsCount; - - if (arrowType.arrowColor - arrowHoverColor > step) { - arrowType.arrowColor -= step; - } else if (arrowType.arrowColor - arrowHoverColor < -step) { - arrowType.arrowColor += step; - } else { - arrowType.arrowColor = arrowHoverColor; - } - } else - //reverse dimming - if (fadeIn === false) { - if(arrowType.arrowColor === arrowColor && arrowType.arrowBackColor === defaultColor) { - return; - } - - if (arrowType.arrowBackColor - defaultColor < -step) { - arrowType.arrowBackColor += step; - } else if (arrowType.arrowBackColor - defaultColor > step) { - arrowType.arrowBackColor -= step; - } else { - arrowType.arrowBackColor = defaultColor; - } - - step = Math.abs((arrowColor - arrowHoverColor)) / stepsCount; - - if (arrowType.arrowColor - arrowColor > step) { - arrowType.arrowColor -= step; - } else if (arrowType.arrowColor - arrowColor < -step) { - arrowType.arrowColor += step; - } else { - arrowType.arrowColor = arrowColor; - } - - step = Math.abs((strokeColor - strokeHoverColor)) / stepsCount; - - if (arrowType.arrowStrokeColor - strokeColor > step) { - arrowType.arrowStrokeColor -= step; - } else if (arrowType.arrowStrokeColor - strokeColor < -step) { - arrowType.arrowStrokeColor += step; - } else { - arrowType.arrowStrokeColor = strokeColor; - } - } else { - //instant change arrow color - arrowType.arrowBackColor = backgroundColorUnfade; - switch(backgroundColorUnfade) { - case _HEXTORGB_(that.settings.scrollerColor).R: - arrowType.arrowColor = _HEXTORGB_(that.settings.arrowColor).R; - arrowType.arrowStrokeColor = _HEXTORGB_(that.settings.strokeStyleNone).R; - break; - case _HEXTORGB_(that.settings.scrollerHoverColor).R: - arrowType.arrowColor = _HEXTORGB_(that.settings.arrowHoverColor).R; - arrowType.arrowStrokeColor = _HEXTORGB_(that.settings.strokeStyleOver).R; - break; - case _HEXTORGB_(that.settings.scrollerActiveColor).R: - arrowType.arrowColor = _HEXTORGB_(that.settings.arrowActiveColor).R; - arrowType.arrowStrokeColor = _HEXTORGB_(that.settings.strokeStyleActive).R; - break; - - } - } - - ctx = that.context; - - ctx.beginPath(); - var arrowBackColor = Math.round(arrowType.arrowBackColor); - ctx.fillStyle = "rgb(" + arrowBackColor + "," + - arrowBackColor + "," + - arrowBackColor + ")"; - - ctx.fillRect( x + fillRectX, y + fillRectY, sizeW, sizeH); - - if (that.ArrowDrawer.IsDrawBorders) { - var arrowStrokeColor = Math.round(arrowType.arrowStrokeColor) - ctx.strokeStyle = "rgb(" + arrowStrokeColor + "," + arrowStrokeColor + "," + arrowStrokeColor + ")"; - ctx.lineWidth = roundDPR; - ctx.rect(x + 0.5 * ctx.lineWidth + strokeRectX, y + 1.5 * ctx.lineWidth + strokeRectY, sizeW - roundDPR, sizeH - roundDPR); - ctx.stroke(); - } - - //drawing arrow icon - var imgContext = arrowImage.getContext('2d'); - imgContext.globalCompositeOperation = "source-in"; - var arrowColor = Math.round(arrowType.arrowColor); - imgContext.fillStyle = "rgb(" + arrowColor + "," + - arrowColor + "," + - arrowColor + ")"; - imgContext.fillRect(0.5, 1.5, sizeW , sizeH); - ctx.drawImage(arrowImage, x, y, sizeW, sizeH); - ctx.closePath(); - context.drawImage(cnvs, x, y); - - if (fadeIn === undefined) - return; - - that.fadeTimeoutArrows = setTimeout(function () { - that._animateArrow(fadeIn, curArrowType, backgroundColorUnfade) - }, that.settings.fadeInFadeOutDelay); - }; - - ScrollObject.prototype._animateScroll = function (fadeIn) { - var that = this; - var hoverColor = _HEXTORGB_(that.settings.scrollerHoverColor).R, - defaultColor = _HEXTORGB_(that.settings.scrollerColor).R, - targetDefaultColor = _HEXTORGB_(that.settings.targetColor).R, - targetHoverColor = _HEXTORGB_(that.settings.targetHoverColor).R, - strokeHoverColor = _HEXTORGB_(that.settings.strokeStyleOver).R, - strokeColor = _HEXTORGB_(that.settings.strokeStyleNone).R; - - that.context.beginPath(); - that._drawScroll(that.scrollColor, that.targetColor, that.strokeColor); - - //animation end condition - if ((fadeIn && that.scrollColor === hoverColor && that.targetColor === targetHoverColor) || (!fadeIn && that.scrollColor === defaultColor && that.targetColor === targetDefaultColor)) { - return; - } - - var stepsCount = 17; - var step = Math.abs((defaultColor - hoverColor)) / stepsCount; - - //dimming the scroll - if (fadeIn) { - - if (that.scrollColor - hoverColor > step) { - that.scrollColor -= step; - } else if (that.scrollColor - hoverColor < -step) { - that.scrollColor += step; - } else { - that.scrollColor = hoverColor; - } - - step = Math.abs((targetDefaultColor - targetHoverColor)) / stepsCount; - - if (that.targetColor - targetHoverColor > step) { - that.targetColor -= step; - } else if (that.targetColor - targetHoverColor < -step) { - that.targetColor += step; - } else { - that.targetColor = targetHoverColor; - } - - step = Math.abs((strokeColor - strokeHoverColor)) / stepsCount; - - if (that.strokeColor - strokeHoverColor > step) { - that.strokeColor -= step; - } else if (that.strokeColor - strokeHoverColor < -step) { - that.strokeColor += step; - } else { - that.strokeColor = strokeHoverColor; - } - - } else - //reverse dimming - if (fadeIn === false) { - if (that.scrollColor - defaultColor > step) { - that.scrollColor -= step; - } else if (that.scrollColor - defaultColor < -step) { - that.scrollColor += step; - } else { - that.scrollColor = defaultColor; - } - - step = Math.abs((targetDefaultColor - targetHoverColor)) / stepsCount; - - if (that.targetColor - targetDefaultColor > step) { - that.targetColor -= step; - } else if (that.targetColor - targetDefaultColor < -step) { - that.targetColor += step; - } else { - that.targetColor = targetDefaultColor; - that.strokeColor = strokeColor; - } - - step = Math.abs((strokeColor - strokeHoverColor)) / stepsCount; - - if (that.strokeColor - strokeColor > step) { - that.strokeColor -= step; - } else if (that.strokeColor - strokeColor < -step) { - that.strokeColor += step; - } else { - that.strokeColor = strokeColor; - } - - } - - that.fadeTimeoutScroll = setTimeout(function () { - that._animateScroll(fadeIn) - }, that.settings.fadeInFadeOutDelay); - }; - - ScrollObject.prototype._doAnimation = function (lastAnimState) { - var that = this, secondArrow, - hoverColor = _HEXTORGB_(that.settings.scrollerHoverColor).R, - defaultColor = _HEXTORGB_(that.settings.scrollerColor).R, - activeColor = _HEXTORGB_(that.settings.scrollerActiveColor).R, - targetColor = _HEXTORGB_(that.settings.targetColor).R, - targetHoverColor = _HEXTORGB_(that.settings.targetHoverColor).R, - targetActiveColor = _HEXTORGB_(that.settings.targetActiveColor).R, - strokeColor = _HEXTORGB_(that.settings.strokeStyleNone).R, - strokeHoverColor = _HEXTORGB_(that.settings.strokeStyleOver).R, - strokeActiveColor = _HEXTORGB_(that.settings.strokeStyleActive).R; - - switch(that.arrowState) { - case ArrowType.ARROW_TOP: - secondArrow = ArrowType.ARROW_BOTTOM; - break; - case ArrowType.ARROW_BOTTOM: - secondArrow = ArrowType.ARROW_TOP; - break; - case ArrowType.ARROW_LEFT: - secondArrow = ArrowType.ARROW_RIGHT; - break; - case ArrowType.ARROW_RIGHT: - secondArrow = ArrowType.ARROW_LEFT; - break; - } - - //current and previous scroll state - if (that.animState === AnimationType.NONE && lastAnimState === AnimationType.NONE) { - that._drawScroll(defaultColor, targetColor, strokeColor); - } else if (that.animState === AnimationType.SCROLL_HOVER && lastAnimState === AnimationType.SCROLL_HOVER) { - that._animateArrow(false, that.arrowState); - that._animateScroll(true); - } else if (that.animState === AnimationType.ARROW_HOVER && lastAnimState === AnimationType.NONE) { - that._animateArrow(false, secondArrow); - that._animateArrow(true, that.arrowState); - that._animateScroll(true); - } else if (that.animState === AnimationType.SCROLL_HOVER && lastAnimState === AnimationType.NONE) { - that._animateArrow(false, that.arrowState); - that._animateScroll(true); - } else if (that.animState === AnimationType.NONE && lastAnimState === AnimationType.ARROW_HOVER) { - that._animateArrow(false, that.arrowState); - that._animateScroll(false); - } else if (that.animState === AnimationType.NONE && lastAnimState === AnimationType.SCROLL_ACTIVE) { - that._animateArrow(false, that.arrowState); - that._drawScroll(defaultColor, targetColor, strokeColor); - } else if (that.animState === AnimationType.SCROLL_HOVER && lastAnimState === AnimationType.ARROW_HOVER) { - that._animateArrow(false, that.arrowState); - that._animateScroll(true); - } else if (that.animState === AnimationType.NONE && lastAnimState === AnimationType.SCROLL_HOVER) { - that._animateArrow(false, that.arrowState); - that._animateScroll(false); - } else if (that.animState === AnimationType.ARROW_HOVER && lastAnimState === AnimationType.SCROLL_HOVER) { - that._animateArrow(false, secondArrow); - that._animateArrow(true, that.arrowState); - that._animateScroll(true); - } else if (this.animState === AnimationType.SCROLL_HOVER && lastAnimState === AnimationType.SCROLL_ACTIVE) { - that._animateArrow(undefined, that.arrowState, defaultColor); - that._drawScroll(hoverColor, targetHoverColor, strokeHoverColor); - } else if (this.animState === AnimationType.SCROLL_HOVER && lastAnimState === AnimationType.ARROW_ACTIVE) { - that._animateArrow(undefined, that.arrowState, defaultColor); - that._drawScroll(hoverColor, targetHoverColor, strokeHoverColor); - } else if (this.animState === AnimationType.ARROW_ACTIVE) { - that._animateArrow(undefined, that.arrowState, activeColor); - that._animateScroll(true); - } else if (this.animState === AnimationType.ARROW_HOVER && lastAnimState === AnimationType.ARROW_ACTIVE) { - //if different arrows - if (this.lastArrowState && this.lastArrowState !== this.arrowState) { - that._animateArrow(undefined, secondArrow, defaultColor); - that._animateArrow(true, that.arrowState); - that._animateScroll(true); - } else { - that._animateArrow(undefined, that.arrowState, hoverColor); - that._animateScroll(true); - } - } else if (this.animState === AnimationType.NONE && lastAnimState === AnimationType.ARROW_ACTIVE) { - that._animateArrow(undefined, that.arrowState, defaultColor); - that._animateScroll(false); - } else if (this.animState === AnimationType.ARROW_HOVER && lastAnimState === AnimationType.SCROLL_ACTIVE) { - that._animateArrow(false, secondArrow); - that._animateArrow(true, that.arrowState); - - if (that.mouseUp && !that.mouseDown) { - that._drawScroll(hoverColor, targetHoverColor, strokeHoverColor); - } - else if(that.mouseDown && that.scrollerMouseDown) { - that._drawScroll(activeColor, targetActiveColor, strokeActiveColor); - } - } else if (this.animState === AnimationType.SCROLL_ACTIVE) { - that._animateArrow(false, that.arrowState); - that._drawScroll(activeColor, targetActiveColor, strokeActiveColor); - } else if (this.animState === AnimationType.ARROW_HOVER && lastAnimState === AnimationType.ARROW_HOVER) { - that._animateArrow(true, that.arrowState); - that._drawScroll(hoverColor, targetHoverColor, strokeHoverColor); - } else return; - }; - - ScrollObject.prototype._draw = function () { - - clearTimeout(this.fadeTimeoutScroll); - this.fadeTimeoutScroll = null; - clearTimeout(this.fadeTimeoutArrows); - this.fadeTimeoutArrows = null; - - //scroll animation - this._doAnimation(this.lastAnimState); - this.lastAnimState = this.animState; - }; - - ScrollObject.prototype._checkPiperImagesV = function() { - if ( this.settings.isVerticalScroll && this.maxScrollY != 0 && this.scroller.h >= Math.round(13 * AscBrowser.retinaPixelRatio) ) - return true; - return false; - }; - ScrollObject.prototype._checkPiperImagesH = function() { - if ( this.settings.isHorizontalScroll && this.maxScrollX != 0 && this.scroller.w >= Math.round(13 * AscBrowser.retinaPixelRatio) ) - return true; - return false; - }; - - ScrollObject.prototype._setDimension = function ( h, w ) { - - var dPR = AscBrowser.retinaPixelRatio; - if(this.canvasH === Math.round(h * dPR) && this.canvasW === Math.round(w * dPR)) { - this.isResizeArrows = false; - return; - } - this.isResizeArrows = true; - this.canvasH = Math.round(h * dPR); - this.canvasW = Math.round(w * dPR); - this.canvasOriginalH = h; - this.canvasOriginalW = w; - this.canvas.height = this.canvasH; - this.canvas.width = this.canvasW; - }; - ScrollObject.prototype._setScrollerHW = function () { - var dPR = AscBrowser.retinaPixelRatio; - if ( this.settings.isVerticalScroll ) { - this.scroller.x = this._roundForScale(dPR); - this.scroller.w = Math.round((this.canvasOriginalW - 1) * dPR); - if(this.settings.slimScroll) { - this.settings.arrowSizeW = this.settings.arrowSizeH = this.scroller.w; - } - if ( this.settings.showArrows ) - this.ArrowDrawer.InitSize( this.settings.arrowSizeW, this.settings.arrowSizeH, this.IsRetina ); - } - else if ( this.settings.isHorizontalScroll ) { - this.scroller.y = this._roundForScale(dPR); - this.scroller.h = Math.round((this.canvasOriginalH - 1) * dPR); - if(this.settings.slimScroll) { - this.settings.arrowSizeH = this.settings.arrowSizeW = this.scroller.h; - } - if ( this.settings.showArrows ) - this.ArrowDrawer.InitSize( this.settings.arrowSizeH, this.settings.arrowSizeW, this.IsRetina ); - } - }; - ScrollObject.prototype._MouseHoverOnScroller = function ( mp ) { - if(this.settings.isVerticalScroll && mp.x >= 0 && mp.x <= this.scroller.x + this.scroller.w && - mp.y >= this.scroller.y && mp.y <= this.scroller.y + this.scroller.h) { - return true; - } else if(this.settings.isHorizontalScroll && mp.x >= this.scroller.x && mp.x <= this.scroller.x + this.scroller.w && - mp.y >= 0 && mp.y <= this.scroller.y + this.scroller.h) { - return true; - } else { - return false; - } - }; - - ScrollObject.prototype._MouseArrowHover = function (mp) { - - var arrowDim =this.settings.arrowDim; - if (this.settings.isVerticalScroll) { - if ( - mp.x >= 0 && - mp.x <= this.canvasW && - mp.y >= 0 && - mp.y <= arrowDim - ) { - return ArrowType.ARROW_TOP; - } else if ( - mp.x >= 0 && - mp.x <= this.canvasW && - mp.y >= this.canvasH - arrowDim && - mp.y <= this.canvasH - ) { - return ArrowType.ARROW_BOTTOM; - } else return ArrowType.NONE; - } - if (this.settings.isHorizontalScroll) { - if ( - mp.x >= 0 && - mp.x <= arrowDim && - mp.y >= 0 && - mp.y <= this.canvasH - ) { - return ArrowType.ARROW_LEFT; - } else if ( - mp.x >= this.canvasW - arrowDim && - mp.x <= this.canvasW && - mp.y >= 0 && - mp.y <= this.canvasH - ) { - return ArrowType.ARROW_RIGHT; - } else return ArrowType.NONE; - } - }; - - ScrollObject.prototype._arrowDownMouseDown = function () { - var that = this, scrollTimeout, isFirst = true, - doScroll = function () { - if ( that.settings.isVerticalScroll ) - that.scrollByY( that.settings.vscrollStep ); - else if ( that.settings.isHorizontalScroll ) - that.scrollByX( that.settings.hscrollStep ); - - if(that.mouseDown) - scrollTimeout = setTimeout( doScroll, isFirst ? that.settings.initialDelay : that.settings.arrowRepeatFreq ); - isFirst = false; - }; - doScroll(); - this.bind( "mouseup.main mouseout", function () { - scrollTimeout && clearTimeout( scrollTimeout ); - scrollTimeout = null; - } ); - }; - ScrollObject.prototype._arrowUpMouseDown = function () { - var that = this, scrollTimeout, isFirst = true, - doScroll = function () { - if ( that.settings.isVerticalScroll ) - that.scrollByY( -that.settings.vscrollStep ); - else if ( that.settings.isHorizontalScroll ) - that.scrollByX( -that.settings.hscrollStep ); - - if(that.mouseDown) - scrollTimeout = setTimeout( doScroll, isFirst ? that.settings.initialDelay : that.settings.arrowRepeatFreq ); - isFirst = false; - }; - doScroll(); - this.bind( "mouseup.main mouseout", function () { - scrollTimeout && clearTimeout( scrollTimeout ); - scrollTimeout = null; - } ) - }; - - ScrollObject.prototype.getCurScrolledX = function () { - return this.scrollHCurrentX; - }; - ScrollObject.prototype.getCurScrolledY = function () { - return this.scrollVCurrentY; - }; - ScrollObject.prototype.getMaxScrolledY = function () { - return this.maxScrollY; - }; - ScrollObject.prototype.getMaxScrolledX = function () { - return this.maxScrollX; - }; - ScrollObject.prototype.getIsLockedMouse = function () { - return (this.that.mouseDownArrow || this.that.mouseDown); - }; - /************************************************************************/ - /*events*/ - ScrollObject.prototype.evt_mousemove = function ( e ) { - - if (this.style) - this.style.cursor = "default"; - - var evt = e || window.event; - - if ( evt.preventDefault ) - evt.preventDefault(); - else - evt.returnValue = false; - - var mousePos = this.that.getMousePosition( evt ); - this.that.EndMousePosition.x = mousePos.x; - this.that.EndMousePosition.y = mousePos.y; - var arrowHover = this.that._MouseArrowHover(mousePos); - var dPR = AscBrowser.retinaPixelRatio; - - //arrow pressed - if (this.that.settings.showArrows && this.that.mouseDownArrow) { - if (arrowHover && arrowHover === this.that.arrowState) { - this.that.arrowState = arrowHover; - } - this.that.animState = AnimationType.ARROW_ACTIVE; - } else if (!this.that.mouseDownArrow) { - if (!arrowHover || !this.that.settings.showArrows) { - this.that.animState = AnimationType.SCROLL_HOVER; - } else { - this.that.animState = AnimationType.ARROW_HOVER; - this.that.arrowState = arrowHover; - } - } - - if ( this.that.mouseDown && this.that.scrollerMouseDown ) { - this.that.moveble = true; - } - else { - this.that.moveble = false; - } - - if ( this.that.settings.isVerticalScroll ) { - if ( this.that.moveble && this.that.scrollerMouseDown ) { - var isTop = false, isBottom = false; - if (arrowHover && this.that.settings.showArrows) { - this.that.animState = AnimationType.ARROW_HOVER; - } else { - this.that.animState = AnimationType.SCROLL_ACTIVE; - } - var _dlt = this.that.EndMousePosition.y - this.that.StartMousePosition.y; - _dlt = _dlt >= 0 ? Math.floor(_dlt) : Math.ceil(_dlt); - - if ( this.that.EndMousePosition.y == this.that.StartMousePosition.y ) { - return; - } - else if ( this.that.EndMousePosition.y < this.that.arrowPosition ) { - this.that.EndMousePosition.y = this.that.arrowPosition; - this.that.scroller.y = this.that.arrowPosition; - } - else if ( this.that.EndMousePosition.y > this.that.canvasH - this.that.arrowPosition ) { - this.that.EndMousePosition.y = this.that.canvasH - this.that.arrowPosition; - this.that.scroller.y = this.that.canvasH - this.that.arrowPosition - this.that.scroller.h; - } - else { - var dltY = _dlt > 0 ? this.that.canvasH - this.that.arrowPosition - this.that.scroller.h - this.that.scroller.y : this.that.arrowPosition - this.that.scroller.y; - _dlt = (_dlt > 0) ? (dltY < _dlt ? dltY : _dlt) : (dltY > _dlt ? dltY : _dlt); - - if(_dlt > 0 && this.that.scroller.y + this.that.scroller.h + _dlt + Math.round(dPR) <= this.that.canvasH - this.that.arrowPosition || - (_dlt < 0 && this.that.scroller.y + _dlt >= this.that.arrowPosition)) { - this.that.scroller.y += _dlt; - } else if(_dlt > 0) { - this.that.scroller.y = this.that.canvasH - this.that.arrowPosition - this.that.scroller.h; - } else if(_dlt < 0) { - this.that.scroller.y = this.that.arrowPosition; - } - - } - - var destY = (this.that.scroller.y - this.that.arrowPosition) * this.that.scrollCoeff; - //var result = editor.WordControl.CorrectSpeedVerticalScroll(destY); - var result = this.that._correctScrollV( this.that, destY ); - if ( result != null && result.isChange === true ) { - destY = result.Pos; - } - - this.that._scrollV( this.that, evt, destY, isTop, isBottom ); - this.that.StartMousePosition.x = this.that.EndMousePosition.x; - this.that.StartMousePosition.y = this.that.EndMousePosition.y; - } - } - else if ( this.that.settings.isHorizontalScroll ) { - if ( this.that.moveble && this.that.scrollerMouseDown ) { - - var isTop = false, isBottom = false; - if (arrowHover && this.that.settings.showArrows) { - this.that.animState = AnimationType.ARROW_HOVER; - } else { - this.that.animState = AnimationType.SCROLL_ACTIVE; - } - var _dlt =this.that.EndMousePosition.x - this.that.StartMousePosition.x; - _dlt = _dlt >= 0 ? Math.floor(_dlt) : Math.ceil(_dlt); - - if ( this.that.EndMousePosition.x == this.that.StartMousePosition.x ) - return; - else if ( this.that.EndMousePosition.x < this.that.arrowPosition ) { - this.that.EndMousePosition.x = this.that.arrowPosition; - this.that.scroller.x = this.that.arrowPosition; - } - else if ( this.that.EndMousePosition.x > this.that.canvasW - this.that.arrowPosition ) { - this.that.EndMousePosition.x = this.that.canvasW - this.that.arrowPosition; - this.that.scroller.x = this.that.canvasW - this.that.arrowPosition - this.that.scroller.w; - } - else { - var dltX = _dlt > 0 ? this.that.canvasW - this.that.arrowPosition - this.that.scroller.w - this.that.scroller.x : this.that.arrowPosition - this.that.scroller.x; - _dlt = (_dlt > 0) ? (dltX < _dlt ? dltX : _dlt) : (dltX > _dlt ? dltX : _dlt); - - if(_dlt > 0 && this.that.scroller.x + this.that.scroller.w + _dlt <= this.that.canvasW - this.that.arrowPosition || - (_dlt < 0 && this.that.scroller.x + _dlt >= this.that.arrowPosition)) { - this.that.scroller.x += _dlt; - } else if(_dlt > 0) { - this.that.scroller.x = this.that.canvasW - this.that.arrowPosition - this.that.scroller.w; - } else if(_dlt < 0) { - this.that.scroller.x = this.that.arrowPosition; - } - } - var destX = (this.that.scroller.x - this.that.arrowPosition) * this.that.scrollCoeff; - - this.that._scrollH( this.that, evt, destX, isTop, isBottom ); - - this.that.StartMousePosition.x = this.that.EndMousePosition.x; - this.that.StartMousePosition.y = this.that.EndMousePosition.y; - } - } - - this.that.moveble = false; - - if ( this.that.lastAnimState != this.that.animState) { - this.that._draw(); - } - - }; - ScrollObject.prototype.evt_mouseout = function ( e ) { - - var evt = e || window.event; - - if ( this.that.settings.showArrows ) { - this.that.mouseDown = this.that.mouseDownArrow ? false : this.that.mouseDown; - this.that.mouseDownArrow = false; - this.that.handleEvents( "onmouseout", evt ); - } - - if (this.that.mouseDown && this.that.scrollerMouseDown) { - this.that.animState = AnimationType.SCROLL_ACTIVE; - } else this.that.animState = AnimationType.NONE; - - this.that._draw(); - - }; - ScrollObject.prototype.evt_mouseover = function ( e ) { - this.that.mouseover = true; - }; - - ScrollObject.prototype.evt_mouseup = function ( e ) { - var evt = e || window.event; - - this.that.handleEvents( "onmouseup", evt ); - - // prevent pointer events on all iframes (while only plugin!) - if (window.g_asc_plugins) - window.g_asc_plugins.enablePointerEvents(); - - if ( evt.preventDefault ) - evt.preventDefault(); - else - evt.returnValue = false; - - this.that.mouseDown = false; - var mousePos = this.that.getMousePosition( evt ); - var arrowHover = this.that._MouseArrowHover(mousePos); - var mouseHover = this.that._MouseHoverOnScroller( mousePos ); - this.that.scrollTimeout && clearTimeout( this.that.scrollTimeout ); - this.that.scrollTimeout = null; - - - if ( this.that.scrollerMouseDown ) { - this.that.mouseUp = true; - this.that.scrollerMouseDown = false; - this.that.mouseDownArrow = false; - if ( this.that._MouseHoverOnScroller( mousePos ) ) { - this.that.animState = AnimationType.SCROLL_HOVER; - } - else { - if(arrowHover && this.that.settings.showArrows) { - this.that.lastAnimState = AnimationType.SCROLL_ACTIVE; - this.that.animState = AnimationType.ARROW_HOVER; - } else { - if (mouseHover) - this.that.animState = AnimationType.SCROLL_HOVER; - else - this.that.animState = AnimationType.NONE; - } - } - } else { - if(arrowHover && this.that.settings.showArrows) { - this.that.lastArrowState = this.that.arrowState; - this.that.arrowState = arrowHover; - this.that.animState = AnimationType.ARROW_HOVER; - } else { - if (this.that._MouseHoverOnScroller(mousePos)) { - this.that.animState = AnimationType.SCROLL_HOVER; - } else { - this.that.animState = AnimationType.NONE; - } - } - this.that.mouseDownArrow = false; - } - this.that._draw(); - //for unlock global mouse event - if ( this.that.onLockMouse && this.that.offLockMouse ) { - this.that.offLockMouse( evt ); - } - }; - ScrollObject.prototype.evt_mousedown = function ( e ) { - var evt = e || window.event; - - // prevent pointer events on all iframes (while only plugin!) - if (window.g_asc_plugins) - window.g_asc_plugins.disablePointerEvents(); - - // если сделать превент дефолт - перестанет приходить mousemove от window - /* - if (evt.preventDefault) - evt.preventDefault(); - else - evt.returnValue = false; - */ - - var mousePos = this.that.getMousePosition( evt ), - arrowHover = this.that._MouseArrowHover(mousePos); - - this.that.mouseDown = true; - - //arrow pressed - if (this.that.settings.showArrows && arrowHover) { - this.that.mouseDownArrow = true; - this.that.arrowState = arrowHover; - this.that.animState = AnimationType.ARROW_ACTIVE; - if (arrowHover === ArrowType.ARROW_TOP || arrowHover === ArrowType.ARROW_LEFT) { - this.that._arrowUpMouseDown(); - } else if (arrowHover === ArrowType.ARROW_BOTTOM || arrowHover === ArrowType.ARROW_RIGHT) { - this.that._arrowDownMouseDown(); - } - this.that._draw(); - } else { - this.that.mouseUp = false; - - if ( this.that._MouseHoverOnScroller( mousePos ) ) { - this.that.scrollerMouseUp = false; - this.that.scrollerMouseDown = true; - - if ( this.that.onLockMouse ) { - this.that.onLockMouse( evt ); - } - this.that.StartMousePosition.x = mousePos.x; - this.that.StartMousePosition.y = mousePos.y; - this.that.animState = AnimationType.SCROLL_ACTIVE; - this.that._draw(); - } - else { - //scroll pressed, but not slider - if ( this.that.settings.isVerticalScroll ) { - var _tmp = this, - direction = mousePos.y - this.that.scroller.y - this.that.scroller.h / 2, - step = this.that.paneHeight * this.that.settings.scrollPagePercent, -// verticalDragPosition = this.that.scroller.y, - isFirst = true, - doScroll = function () { - _tmp.that.lock = true; - if ( direction > 0 ) { - if ( _tmp.that.scroller.y + _tmp.that.scroller.h / 2 + step < mousePos.y ) { - _tmp.that.scrollByY( step * _tmp.that.scrollCoeff ); - } - else { - var _step = Math.abs( _tmp.that.scroller.y + _tmp.that.scroller.h / 2 - mousePos.y ); - _tmp.that.scrollByY( _step * _tmp.that.scrollCoeff ); - cancelClick(); - return; - } - } - else if ( direction < 0 ) { - if ( _tmp.that.scroller.y + _tmp.that.scroller.h / 2 - step > mousePos.y ) { - _tmp.that.scrollByY( -step * _tmp.that.scrollCoeff ); - } - else { - var _step = Math.abs( _tmp.that.scroller.y + _tmp.that.scroller.h / 2 - mousePos.y ); - _tmp.that.scrollByY( -_step * _tmp.that.scrollCoeff ); - cancelClick(); - return; - } - } - _tmp.that.scrollTimeout = setTimeout( doScroll, isFirst ? _tmp.that.settings.initialDelay : _tmp.that.settings.trackClickRepeatFreq ); - isFirst = false; - }, - cancelClick = function () { - _tmp.that.scrollTimeout && clearTimeout( _tmp.that.scrollTimeout ); - _tmp.that.scrollTimeout = null; - _tmp.that.unbind( "mouseup.main", cancelClick ); - _tmp.that.lock = false; - }; - - if ( this.that.onLockMouse ) { - this.that.onLockMouse( evt ); - } - - doScroll(); - this.that.bind( "mouseup.main", cancelClick ); - } - if ( this.that.settings.isHorizontalScroll ) { - var _tmp = this, - direction = mousePos.x - this.that.scroller.x - this.that.scroller.w / 2, - step = this.that.paneWidth * this.that.settings.scrollPagePercent, -// horizontalDragPosition = this.that.scroller.x, - isFirst = true, - doScroll = function () { - _tmp.that.lock = true; - if ( direction > 0 ) { - if ( _tmp.that.scroller.x + _tmp.that.scroller.w / 2 + step < mousePos.x ) { - _tmp.that.scrollByX( step * _tmp.that.scrollCoeff ); - } - else { - var _step = Math.abs( _tmp.that.scroller.x + _tmp.that.scroller.w / 2 - mousePos.x ); - _tmp.that.scrollByX( _step * _tmp.that.scrollCoeff ); - cancelClick(); - return; - } - } - else if ( direction < 0 ) { - if ( _tmp.that.scroller.x + _tmp.that.scroller.w / 2 - step > mousePos.x ) { - _tmp.that.scrollByX( -step * _tmp.that.scrollCoeff ); - } - else { - var _step = Math.abs( _tmp.that.scroller.x + _tmp.that.scroller.w / 2 - mousePos.x ); - _tmp.that.scrollByX( -_step * _tmp.that.scrollCoeff ); - cancelClick(); - return; - } - } - _tmp.that.scrollTimeout = setTimeout( doScroll, isFirst ? _tmp.that.settings.initialDelay : _tmp.that.settings.trackClickRepeatFreq ); - isFirst = false; - // _tmp.that._drawArrow( ArrowStatus.arrowHover ); - }, - cancelClick = function () { - _tmp.that.scrollTimeout && clearTimeout( _tmp.that.scrollTimeout ); - _tmp.that.scrollTimeout = null; - _tmp.that.unbind( "mouseup.main", cancelClick ); - _tmp.that.lock = false; - }; - - if ( this.that.onLockMouse ) { - this.that.onLockMouse( evt ); - } - - doScroll(); - this.that.bind( "mouseup.main", cancelClick ); - } - } - } - }; - ScrollObject.prototype.evt_mousewheel = function ( e ) { - var evt = e || window.event; - /* if ( evt.preventDefault ) - evt.preventDefault(); - else - evt.returnValue = false;*/ - - var delta = 1; - if ( this.that.settings.isHorizontalScroll ) return; - if ( undefined != evt.wheelDelta ) - delta = (evt.wheelDelta > 0) ? -this.that.settings.vscrollStep : this.that.settings.vscrollStep; - else - delta = (evt.detail > 0) ? this.that.settings.vscrollStep : -this.that.settings.vscrollStep; - delta *= this.that.settings.wheelScrollLines; - this.that.scroller.y += delta; - if ( this.that.scroller.y < 0 ) { - this.that.scroller.y = 0; - } - else if ( this.that.scroller.y + this.that.scroller.h > this.that.canvasH ) { - this.that.scroller.y = this.that.canvasH - this.that.arrowPosition - this.that.scroller.h; - } - this.that.scrollByY( delta ) - }; - ScrollObject.prototype.evt_click = function ( e ) { - var evt = e || window.event; - var mousePos = this.that.getMousePosition( evt ); - if ( this.that.settings.isHorizontalScroll ) { - if ( mousePos.x > this.arrowPosition && mousePos.x < this.that.canvasW - this.that.arrowPosition ) { - if ( this.that.scroller.x > mousePos.x ) { - this.that.scrollByX( -this.that.settings.vscrollStep ); - } - if ( this.that.scroller.x < mousePos.x && this.that.scroller.x + this.that.scroller.w > mousePos.x ) { - return false; - } - if ( this.that.scroller.x + this.that.scroller.w < mousePos.x ) { - this.that.scrollByX( this.that.settings.hscrollStep ); - } - } - } - if ( this.that.settings.isVerticalScroll ) { - if ( mousePos.y > this.that.arrowPosition && mousePos.y < this.that.canvasH - this.that.arrowPosition ) { - if ( this.that.scroller.y > mousePos.y ) { - this.that.scrollByY( -this.that.settings.vscrollStep ); - } - if ( this.that.scroller.y < mousePos.y && this.that.scroller.y + this.that.scroller.h > mousePos.y ) { - return false; - } - if ( this.that.scroller.y + this.that.scroller.h < mousePos.y ) { - this.that.scrollByY( this.that.settings.hscrollStep ); - } - } - } - }; - - /************************************************************************/ - /*for events*/ - ScrollObject.prototype.bind = function ( typesStr, handler ) { - var types = typesStr.split( " " ); - /* - * loop through types and attach event listeners to - * each one. eg. "click mouseover.namespace mouseout" - * will create three event bindings - */ - for ( var n = 0; n < types.length; n++ ) { - var type = types[n]; - var event = (type.indexOf( 'touch' ) == -1) ? 'on' + type : type; - var parts = event.split( "." ); - var baseEvent = parts[0]; - var name = parts.length > 1 ? parts[1] : ""; - - if ( !this.eventListeners[baseEvent] ) { - this.eventListeners[baseEvent] = []; - } - - this.eventListeners[baseEvent].push( { - name:name, - handler:handler - } ); - } - }; - ScrollObject.prototype.unbind = function ( typesStr ) { - var types = typesStr.split( " " ); - - for ( var n = 0; n < types.length; n++ ) { - var type = types[n]; - var event = (type.indexOf( 'touch' ) == -1) ? 'on' + type : type; - var parts = event.split( "." ); - var baseEvent = parts[0]; - - if ( this.eventListeners[baseEvent] && parts.length > 1 ) { - var name = parts[1]; - - for ( var i = 0; i < this.eventListeners[baseEvent].length; i++ ) { - if ( this.eventListeners[baseEvent][i].name == name ) { - this.eventListeners[baseEvent].splice( i, 1 ); - if ( this.eventListeners[baseEvent].length === 0 ) { - this.eventListeners[baseEvent] = undefined; - } - break; - } - } - } - else { - this.eventListeners[baseEvent] = undefined; - } - } - }; - ScrollObject.prototype.handleEvents = function ( eventType, evt, p ) { - var that = this; - // generic events handler - function handle( obj ) { - var el = obj.eventListeners; - if ( el[eventType] ) { - var events = el[eventType]; - for ( var i = 0; i < events.length; i++ ) { - events[i].handler.apply( obj, [evt] ); - } - } - } - - /* - * simulate bubbling by handling shape events - * first, followed by group events, folulowed - * by layer events - */ - handle( that ); - }; - - function _HEXTORGB_( colorHEX ) { - return { - R:parseInt( colorHEX.substring( 1, 3 ), 16 ), - G:parseInt( colorHEX.substring( 3, 5 ), 16 ), - B:parseInt( colorHEX.substring( 5, 7 ), 16 ) - } - } - - ScrollObject.prototype._roundForScale = function (value) { - return ((value - Math.floor(value)) <= 0.5) ? Math.floor(value) : Math.round(value); - }; - //---------------------------------------------------------export--------------------------------------------------- - window["AscCommon"].ScrollSettings = ScrollSettings; - window["AscCommon"].ScrollObject = ScrollObject; -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/skin.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/skin.js deleted file mode 100644 index 9263154ed7..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/skin.js +++ /dev/null @@ -1,500 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -// не скрываем переменные, скин используется напрямую в sdk-all.js -// а экспорт в AscCommon - только для sdk-all-min.js -// если хочется скрыть - то везде GlobalSkin => AscCommon.GlobalSkin - -var EditorSkins = { - "theme-light": { - Name: "theme-light", - Type: "light", - - RulersButton: false, - NavigationButtons: false, - - BackgroundColor: "#EEEEEE", - PageOutline: "#BBBEC2", - - RulerDark: "#D9D9D9", - RulerLight: "#FFFFFF", - RulerOutline: "#CBCBCB", - RulerMarkersOutlineColor: "#555555", - RulerMarkersOutlineColorOld: "#AAAAAA", - RulerMarkersFillColor: "#FFFFFF", - RulerMarkersFillColorOld: "#FFFFFF", - RulerTextColor: "#555555", - RulerTabsColor: "#000000", - RulerTabsColorOld: "#828282", - RulerTableColor1: "#FFFFFF", - RulerTableColor2: "#555555", - - ScrollBackgroundColor: "#EEEEEE", - ScrollOutlineColor: "#CBCBCB", - ScrollOutlineHoverColor: "#CBCBCB", - ScrollOutlineActiveColor: "#ADADAD", - ScrollerColor: "#F7F7F7", - ScrollerHoverColor: "#C0C0C0", - ScrollerActiveColor: "#ADADAD", - ScrollArrowColor: "#ADADAD", - ScrollArrowHoverColor: "#F7F7F7", - ScrollArrowActiveColor: "#F7F7F7", - ScrollerTargetColor: "#CFCFCF", - ScrollerTargetHoverColor: "#F1F1F1", - ScrollerTargetActiveColor: "#F1F1F1", - - /* word */ - STYLE_THUMBNAIL_WIDTH: 104, - STYLE_THUMBNAIL_HEIGHT: 40, - - isNeedInvertOnActive: false, - ContentControlsBack: "#F1F1F1", - ContentControlsHover: "#D8DADC", - ContentControlsActive: "#7C838A", - ContentControlsText: "#444444", - ContentControlsTextActive: "#FFFFFF", - ContentControlsAnchorActive: "#CFCFCF", - FormsContentControlsOutlineHover: "rgba(0, 0, 0, 0.3)", - FormsContentControlsOutlineActive: "rgba(0, 0, 0, 0.3)", - FormsContentControlsOutlineBorderRadiusHover: 0, - FormsContentControlsOutlineBorderRadiusActive: 2, - FormsContentControlsMarkersBackground: "#FFFFFF", - FormsContentControlsMarkersBackgroundHover: "#E1E1E1", - FormsContentControlsMarkersBackgroundActive: "#CCCCCC", - FormsContentControlsOutlineMoverHover: "#444444", - FormsContentControlsOutlineMoverActive: "#444444", - - /* presentations */ - BackgroundColorThumbnails: "#F4F4F4", - BackgroundColorThumbnailsActive: "#F4F4F4", - BackgroundColorThumbnailsHover: "#F4F4F4", - ThumbnailsPageOutlineActive: "#848484", - ThumbnailsPageOutlineHover: "#CFCFCF", - ThumbnailsPageNumberText: "#000000", - ThumbnailsPageNumberTextActive: "#000000", - ThumbnailsPageNumberTextHover: "#000000", - ThumbnailsLockColor: "#D34F4F", - BackgroundColorNotes: "#F0F0F0", - - THEMES_THUMBNAIL_WIDTH: 88, - THEMES_THUMBNAIL_HEIGHT: 40, - THEMES_LAYOUT_THUMBNAIL_HEIGHT: 68, - - BorderSplitterColor: "#CBCBCB", - SupportNotes: true, - SplitterWidthMM: 1, - ThumbnailScrollWidthNullIfNoScrolling: false, - - // demonstration - DemBackgroundColor: "#F0F0F0", - DemButtonBackgroundColor: "#FFFFFF", - DemButtonBackgroundColorHover: "#D8DADC", - DemButtonBackgroundColorActive: "#7D858C", - DemButtonBorderColor: "#CFCFCF", - DemButtonTextColor: "#444444", - DemButtonTextColorActive: "#FFFFFF", - DemSplitterColor: "#CBCBCB", - DemTextColor: "#666666", - - /* spreadsheets */ - //TODO названия не менял. использую такие же как и были ранее. пересмотреть! - Background: "#F0F0F0", - BackgroundActive: "#c1c1c1", - BackgroundHighlighted: "#dfdfdf", - - Border: "#d5d5d5", - BorderActive: "#929292", - BorderHighlighted: "#afafaf", - - Color: "#363636", - ColorActive: "#363636", - ColorHighlighted: "#6a6a70", - ColorFiltering: "#008636", - - BackgroundDark: "#444444", - BackgroundDarkActive: "#111111", - BackgroundDarkHighlighted: "#666666", - - ColorDark: "#ffffff", - ColorDarkActive: "#ffffff", - ColorDarkHighlighted: "#c1c1c1", - ColorDarkFiltering: "#7AFFAF", - - GroupDataBorder: "#000000", - EditorBorder: "#cbcbcb", - }, - "theme-dark": { - Name: "theme-dark", - Type: "dark", - - RulersButton: false, - NavigationButtons: false, - - BackgroundColor: "#666666", - PageOutline: "#BBBEC2", - - RulerDark: "#373737", - RulerLight: "#555555", - RulerOutline: "#2A2A2A", - RulerMarkersOutlineColor: "#B6B6B6", - RulerMarkersOutlineColorOld: "#808080", - RulerMarkersFillColor: "#555555", - RulerMarkersFillColorOld: "#555555", - RulerTextColor: "#B6B6B6", - RulerTabsColor: "#FFFFFF", - RulerTabsColorOld: "#999999", - RulerTableColor1: "#FFFFFF", - RulerTableColor2: "#B2B2B2", - - ScrollBackgroundColor: "#666666", - ScrollOutlineColor: "#2A2A2A", - ScrollOutlineHoverColor: "#999999", - ScrollOutlineActiveColor: "#ADADAD", - ScrollerColor: "#404040", - ScrollerHoverColor: "#999999", - ScrollerActiveColor: "#ADADAD", - ScrollArrowColor: "#999999", - ScrollArrowHoverColor: "#404040", - ScrollArrowActiveColor: "#404040", - ScrollerTargetColor: "#999999", - ScrollerTargetHoverColor: "#404040", - ScrollerTargetActiveColor: "#404040", - - /* word */ - STYLE_THUMBNAIL_WIDTH: 104, - STYLE_THUMBNAIL_HEIGHT: 40, - THEMES_LAYOUT_THUMBNAIL_HEIGHT: 68, - - isNeedInvertOnActive: false, - ContentControlsBack: "#F1F1F1", - ContentControlsHover: "#D8DADC", - ContentControlsActive: "#7C838A", - ContentControlsText: "#444444", - ContentControlsTextActive: "#FFFFFF", - ContentControlsAnchorActive: "#CFCFCF", - FormsContentControlsOutlineHover: "rgba(0, 0, 0, 0.3)", - FormsContentControlsOutlineActive: "rgba(0, 0, 0, 0.3)", - FormsContentControlsOutlineBorderRadiusHover: 0, - FormsContentControlsOutlineBorderRadiusActive: 2, - FormsContentControlsMarkersBackground: "#FFFFFF", - FormsContentControlsMarkersBackgroundHover: "#E1E1E1", - FormsContentControlsMarkersBackgroundActive: "#CCCCCC", - FormsContentControlsOutlineMoverHover: "#444444", - FormsContentControlsOutlineMoverActive: "#444444", - - /* presentations */ - BackgroundColorThumbnails: "#404040", - BackgroundColorThumbnailsActive: "#404040", - BackgroundColorThumbnailsHover: "#404040", - ThumbnailsPageOutlineActive: "#848484", - ThumbnailsPageOutlineHover: "#CFCFCF", - ThumbnailsPageNumberText: "#FFFFFF", - ThumbnailsPageNumberTextActive: "#FFFFFF", - ThumbnailsPageNumberTextHover: "#FFFFFF", - ThumbnailsLockColor: "#D34F4F", - BackgroundColorNotes: "#666666", - - THEMES_THUMBNAIL_WIDTH: 88, - THEMES_THUMBNAIL_HEIGHT: 40, - - BorderSplitterColor: "#616161", - SupportNotes: true, - SplitterWidthMM: 1, - ThumbnailScrollWidthNullIfNoScrolling: false, - - // demonstration - DemBackgroundColor: "#666666", - DemButtonBackgroundColor: "#333333", - DemButtonBackgroundColorHover: "#555555", - DemButtonBackgroundColorActive: "#DDDDDD", - DemButtonBorderColor: "#CFCFCF", - DemButtonTextColor: "#FFFFFF", - DemButtonTextColorActive: "#333333", - DemSplitterColor: "#CBCBCB", - DemTextColor: "#FFFFFF", - - /* spreadsheets */ - Background: "#666666", - BackgroundActive: "#939393", - BackgroundHighlighted: "#787878", - - Border: "#757575", - BorderActive: "#9e9e9e", - BorderHighlighted: "#858585", - - Color: "#d9d9d9", - ColorActive: "#d9d9d9", - ColorHighlighted: "#d9d9d9", - ColorFiltering: "#6BEC9F", - - BackgroundDark: "#55B27B", - BackgroundDarkActive: "#7AFFAF", - BackgroundDarkHighlighted: "#6EE59F", - - ColorDark: "#333", - ColorDarkActive: "#333", - ColorDarkHighlighted: "#333", - ColorDarkFiltering: "#ffffff", - - GroupDataBorder: "#ffffff", - EditorBorder: "#2a2a2a", - }, -}; - -/* -функция для генерации "else" updateGlobalSkin -function setter_from_interface(obj) -{ - var code = ""; - for (var i in obj) { - code += ("if (obj[\"" + i + "\"]) GlobalSkin." + i + " = obj[\"" + i + "\"];\n"); - } - copy(code); -} -*/ - -export var GlobalSkin = EditorSkins["theme-light"]; - -function updateGlobalSkinColors(theme) { - var skin = GlobalSkin; - - var correctColor = function (c) { - return AscCommon.RgbaTextToRgbaHex(c); - }; - - var colorMap = { - BackgroundColor: "canvas-background", - PageOutline: "canvas-page-border", - - RulerDark: "canvas-ruler-margins-background", - RulerLight: "canvas-ruler-background", - RulerOutline: "canvas-ruler-border", - RulerMarkersOutlineColor: "canvas-ruler-handle-border", - RulerMarkersOutlineColorOld: "canvas-ruler-handle-border-disabled", - RulerMarkersFillColor: "background-normal", - RulerMarkersFillColorOld: "background-normal", - RulerTextColor: "canvas-ruler-mark", - RulerTabsColor: "canvas-high-contrast", - RulerTabsColorOld: "canvas-high-contrast-disabled", - RulerTableColor1: "background-normal", - RulerTableColor2: "canvas-ruler-handle-border", - - ScrollBackgroundColor: "canvas-background", - ScrollOutlineColor: "canvas-scroll-thumb-border", - ScrollOutlineHoverColor: "canvas-scroll-thumb-border-hover", - ScrollOutlineActiveColor: "canvas-scroll-thumb-border-pressed", - ScrollerColor: "canvas-scroll-thumb", - ScrollerHoverColor: "canvas-scroll-thumb-hover", - ScrollerActiveColor: "canvas-scroll-thumb-pressed", - ScrollArrowColor: "canvas-scroll-arrow", - ScrollArrowHoverColor: "canvas-scroll-arrow-hover", - ScrollArrowActiveColor: "canvas-scroll-arrow-pressed", - ScrollerTargetColor: "canvas-scroll-thumb-target", - ScrollerTargetHoverColor: "canvas-scroll-thumb-target-hover", - ScrollerTargetActiveColor: "canvas-scroll-thumb-target-pressed", - - /* presentations */ - BackgroundColorThumbnails: "background-toolbar", - BackgroundColorThumbnailsActive: "background-toolbar", - BackgroundColorThumbnailsHover: "background-toolbar", - ThumbnailsPageOutlineActive: "border-preview-select", - ThumbnailsPageOutlineHover: "border-preview-hover", - ThumbnailsPageNumberText: "text-normal", - ThumbnailsPageNumberTextActive: "text-normal", - ThumbnailsPageNumberTextHover: "text-normal", - BackgroundColorNotes: "canvas-background", - - BorderSplitterColor: "border-toolbar", - - // demonstration - DemBackgroundColor: "background-toolbar", - DemButtonBackgroundColor: "background-normal", - DemButtonBackgroundColorHover: "highlight-buttin-hover", - DemButtonBackgroundColorActive: "highlight-button-pressed", - DemButtonBorderColor: "border-regular-control", - DemButtonTextColor: "text-normal", - DemButtonTextColorActive: "text-normal-pressed", - DemSplitterColor: "border-divider", - DemTextColor: "text-normal", - - /* spreadsheets */ - Background: "canvas-background", - BackgroundActive: "canvas-cell-title-selected", - BackgroundHighlighted: "canvas-cell-title-hover", - - Border: "canvas-cell-title-border", - BorderActive: "canvas-cell-title-border-selected", - BorderHighlighted: "canvas-cell-title-border-hover", - - Color: "canvas-cell-title", - ColorActive: "canvas-cell-title", - ColorHighlighted: "canvas-cell-title", - - BackgroundDark: "canvas-dark-cell-title", - BackgroundDarkActive: "canvas-dark-cell-title-selected", - BackgroundDarkHighlighted: "canvas-dark-cell-title-hover", - - ColorDark: "canvas-dark-cell-title-text", - ColorDarkActive: "canvas-dark-cell-title-text", - ColorDarkHighlighted: "canvas-dark-cell-title-text", - - ColorDarkFiltering: "canvas-dark-cell-title-text-filtered", - - GroupDataBorder: "canvas-high-contrast", - EditorBorder: "border-toolbar", - }; - - // корректируем цвета для старого хрома: - // в старых хромах (desktop windows XP) - // если начинается цвет с цифры (#0-9) - то помечается символом \3 (конец текста) - for (var item in theme) { - var testValue = theme[item]; - if (typeof testValue !== "string") continue; - - if (0 === testValue.indexOf("#\\3")) { - testValue = testValue.replace("\\3", ""); - testValue = testValue.replace(" ", ""); - theme[item] = testValue; - } - } - - for (var color in colorMap) { - if (undefined === GlobalSkin[color]) continue; - if ("" === colorMap[color]) continue; - if (undefined === theme[colorMap[color]]) continue; - - if (0 === GlobalSkin[color].indexOf("rgb")) - GlobalSkin[color] = theme[colorMap[color]]; - else GlobalSkin[color] = correctColor(theme[colorMap[color]]); - } -} - -function updateGlobalSkin(obj) { - if (!obj) return; - - if (typeof obj === "string") { - var name = obj; - obj = { - name: name, - type: -1 !== name.indexOf("dark") ? "dark" : "light", - }; - } - - if (obj["name"] && undefined !== EditorSkins[obj["name"]]) - GlobalSkin = EditorSkins[obj["name"]]; - else if (obj["type"]) { - for (var item in EditorSkins) { - if (obj["type"] === EditorSkins[item].Type) { - GlobalSkin = EditorSkins[item]; - break; - } - } - } - - updateGlobalSkinColors(obj); - for (var item in obj) GlobalSkin[item] = obj[item]; - - if (window.g_asc_plugins) window.g_asc_plugins.onThemeChanged(GlobalSkin); - - window["AscCommon"].GlobalSkin = GlobalSkin; -} - -window["AscCommon"] = window["AscCommon"] || {}; -window["AscCommon"].GlobalSkin = GlobalSkin; -window["AscCommon"].updateGlobalSkin = updateGlobalSkin; - -window["AscCommon"].RgbaHexToRGBA = function (color) { - var index = 0; - if ("#".charCodeAt(0) === color.charCodeAt(0)) index++; - - var ret = { - R: 0, - G: 0, - B: 0, - A: 255, - }; - - if (6 <= color.length) { - ret.R = parseInt(color.substring(index, index + 2), 16); - ret.G = parseInt(color.substring(index + 2, index + 4), 16); - ret.B = parseInt(color.substring(index + 4, index + 6), 16); - } else { - ret.R = parseInt(color.substring(index, index + 1), 16); - ret.G = parseInt(color.substring(index + 1, index + 2), 16); - ret.B = parseInt(color.substring(index + 2, index + 3), 16); - - ret.R = (ret.R << 4) | ret.R; - ret.G = (ret.G << 4) | ret.G; - ret.B = (ret.B << 4) | ret.B; - } - - return ret; -}; -window["AscCommon"].RgbaTextToRgbaHex = function (color) { - var toHex = function (c) { - var res = Number(c).toString(16); - return res.length === 1 ? "0" + res : res; - }; - - if (0 !== color.indexOf("rgb")) { - if (color.length < 6) { - var rgba = AscCommon.RgbaHexToRGBA(color); - return "#" + toHex(rgba.R) + toHex(rgba.G) + toHex(rgba.B); - } - return color; - } - - var start = color.indexOf("("); - var end = color.indexOf(")"); - var tmp = color.substring(start + 1, end); - var colors = tmp.split(","); - - for (var i in colors) colors[i] = colors[i].trim(); - - var r = colors[0] || 0; - var g = colors[1] || 0; - var b = colors[2] || 0; - var a = colors[3] === undefined ? 255 : colors[3]; - - return "#" + toHex(r) + toHex(g) + toHex(b); -}; - -if ( - AscCommon.TEMP_STYLE_THUMBNAIL_WIDTH !== undefined && - AscCommon.TEMP_STYLE_THUMBNAIL_HEIGHT !== undefined -) { - // TODO: переделать. - GlobalSkin.STYLE_THUMBNAIL_WIDTH = AscCommon.TEMP_STYLE_THUMBNAIL_WIDTH; - GlobalSkin.STYLE_THUMBNAIL_HEIGHT = AscCommon.TEMP_STYLE_THUMBNAIL_HEIGHT; -} diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/stringserialize.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/stringserialize.js deleted file mode 100644 index dbe76c673f..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/stringserialize.js +++ /dev/null @@ -1,371 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -"use strict"; - -(function(window, undefined){ - - window["AscCommon"] = window.AscCommon = (window["AscCommon"] || {}); - - var charA = "A".charCodeAt(0); - var charZ = "Z".charCodeAt(0); - var chara = "a".charCodeAt(0); - var charz = "z".charCodeAt(0); - var char0 = "0".charCodeAt(0); - var char9 = "9".charCodeAt(0); - var charp = "+".charCodeAt(0); - var chars = "/".charCodeAt(0); - var char_break = ";".charCodeAt(0); - - function decodeBase64Char(ch) - { - if (ch >= charA && ch <= charZ) - return ch - charA + 0; - if (ch >= chara && ch <= charz) - return ch - chara + 26; - if (ch >= char0 && ch <= char9) - return ch - char0 + 52; - if (ch == charp) - return 62; - if (ch == chars) - return 63; - return -1; - } - - var stringBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var arrayBase64 = []; - for (var index64 = 0; index64 < stringBase64.length; index64++) - { - arrayBase64.push(stringBase64.charAt(index64)); - } - - window.AscCommon["Base64"] = window.AscCommon.Base64 = {}; - - /** - * Decode input base64 data to output array - * @memberof AscCommon.Base64 - * @alias decodeData - * @param {string|Array|TypedArray} input input data - * @param {number} [input_offset = undefined] offset in input data. 0 by default - * @param {number} [input_len = undefined] length input data (not length of needed data, this value does not depend on the offset. input.length by default - * @param {Array|TypedArray} output output data - * @param {number} [output_offset = undefined] output data offset. 0 by default - * @return {number} offset in output data (output_offset + count_write_bytes) - */ - window.AscCommon.Base64.decodeData = window.AscCommon.Base64["decodeData"] = function(input, input_offset, input_len, output, output_offset) - { - var isBase64 = typeof input === "string"; - if (undefined === input_len) input_len = input.length; - var writeIndex = (undefined === output_offset) ? 0 : output_offset; - var index = (undefined === input_offset) ? 0 : input_offset; - - while (index < input_len) - { - var dwCurr = 0; - var i; - var nBits = 0; - for (i=0; i<4; i++) - { - if (index >= input_len) - break; - var nCh = decodeBase64Char(isBase64 ? input.charCodeAt(index) : input[index]); - index++; - if (nCh == -1) - { - i--; - continue; - } - dwCurr <<= 6; - dwCurr |= nCh; - nBits += 6; - } - - dwCurr <<= 24-nBits; - for (i=0; i<(nBits>>3); i++) - { - output[writeIndex++] = ((dwCurr & 0x00ff0000) >>> 16); - dwCurr <<= 8; - } - } - return writeIndex; - }; - - /** - * Decode input base64 data to returned Uint8Array - * @memberof AscCommon.Base64 - * @alias decode - * @param {string|Array|TypedArray} input input data - * @param {boolean} [isUsePrefix = undefined] is detect destination size by prefix. false by default - * @param {number} [dstlen = undefined] destination length - * @param {number} [offset] offset of input data - * @return {Uint8Array} decoded data - */ - window.AscCommon.Base64.decode = window.AscCommon.Base64["decode"] = function(input, isUsePrefix, dstlen, offset) - { - var srcLen = input.length; - var index = (undefined === offset) ? 0 : offset; - var dstLen = (undefined === dstlen) ? srcLen : dstlen; - - var isBase64 = typeof input === "string"; - - if (isUsePrefix && isBase64) - { - // ищем длину - dstLen = 0; - var maxLen = Math.max(11, srcLen); // > 4 Gb - while (index < maxLen) - { - var c = input.charCodeAt(index++); - if (c == char_break) - break; - - dstLen *= 10; - dstLen += (c - char0); - } - - if (index == maxLen) - { - // длины нет - index = 0; - dstLen = srcLen; - } - } - - var dst = new Uint8Array(dstLen); - var writeIndex = window.AscCommon.Base64.decodeData(input, index, srcLen, dst, 0); - - if (writeIndex == dstLen) - return dst; - - return new Uint8Array(dst.buffer, 0, writeIndex); - }; - - /** - * Encode input data to base64 string - * @memberof AscCommon.Base64 - * @alias encode - * @param {Array|TypedArray} input input data - * @param {number} [offset = undefined] offset of input data. 0 by default - * @param {number} [length = undefined] length input data (last index: offset + length). input.length by default - * @param {boolean} [isUsePrefix = undefined] is add destination size by prefix. false by default - * @return {string} encoded data - */ - window.AscCommon.Base64.encode = window.AscCommon.Base64["encode"] = function(input, offset, length, isUsePrefix) - { - var srcLen = (undefined === length) ? input.length : length; - var index = (undefined === offset) ? 0 : offset; - - var len1 = (((srcLen / 3) >> 0) * 4); - var len2 = (len1 / 76) >> 0; - var len3 = 19; - var dstArray = []; - - var sTemp = ""; - var dwCurr = 0; - for (var i = 0; i <= len2; i++) - { - if (i == len2) - len3 = ((len1 % 76) / 4) >> 0; - - for (var j = 0; j < len3; j++) - { - dwCurr = 0; - for (var n = 0; n < 3; n++) - { - dwCurr |= input[index++]; - dwCurr <<= 8; - } - - sTemp = ""; - for (var k = 0; k < 4; k++) - { - var b = (dwCurr >>> 26) & 0xFF; - sTemp += arrayBase64[b]; - dwCurr <<= 6; - dwCurr &= 0xFFFFFFFF; - } - dstArray.push(sTemp); - } - } - len2 = (srcLen % 3 != 0) ? (srcLen % 3 + 1) : 0; - if (len2) - { - dwCurr = 0; - for (var n = 0; n < 3; n++) - { - if (n < (srcLen % 3)) - dwCurr |= input[index++]; - dwCurr <<= 8; - } - - sTemp = ""; - for (var k = 0; k < len2; k++) - { - var b = (dwCurr >>> 26) & 0xFF; - sTemp += arrayBase64[b]; - dwCurr <<= 6; - } - - len3 = (len2 != 0) ? 4 - len2 : 0; - for (var j = 0; j < len3; j++) - { - sTemp += '='; - } - dstArray.push(sTemp); - } - - return isUsePrefix ? (("" + srcLen + ";") + dstArray.join("")) : dstArray.join(""); - }; - - window.AscCommon["Hex"] = window.AscCommon.Hex = {}; - - /** - * Decode input hex data to Uint8Array - * @memberof AscCommon.Hex - * @alias decode - * @param {string} input input data - * @return {Uint8Array} decoded data - */ - window.AscCommon.Hex.decode = window.AscCommon.Hex["decode"] = function(input) - { - var hexToByte = function(c) { - if (c >= 48 && c <= 57) return c - 48; // 0..9 - if (c >= 97 && c <= 102) return c - 87; - if (c >= 65 && c <= 70) return c - 55; - return 0; - }; - - var len = input.length; - if (len & 0x01) len -= 1; - var result = new Uint8Array(len >> 1); - var resIndex = 0; - for (var i = 0; i < len; i += 2) - { - result[resIndex++] = hexToByte(input.charCodeAt(i)) << 4 | hexToByte(input.charCodeAt(i + 1)); - } - return result; - }; - - /** - * Encode Uint8Array to hex string - * @memberof AscCommon.Hex - * @alias encode - * @param {Array|TypedArray} input input data - * @param {boolean} [isUpperCase = false] is use upper case - * @return {string} encoded data - */ - window.AscCommon.Hex.encode = window.AscCommon.Hex["encode"] = function(input, isUpperCase) - { - var byteToHex = new Array(256); - for (var i = 0; i < 16; i++) - byteToHex[i] = "0" + (isUpperCase ? i.toString(16).toUpperCase() : i.toString(16)); - for (var i = 16; i < 256; i++) - byteToHex[i] = isUpperCase ? i.toString(16).toUpperCase() : i.toString(16); - - var result = ""; - for (var i = 0, len = input.length; i < len; i++) - result += byteToHex[input[i]]; - - return result; - }; - - window.AscCommon["Base58"] = window.AscCommon.Base58 = {}; - - /** - * Encode data to base58 string - * @memberof AscCommon.Base58 - * @alias encode - * @param {Array|TypedArray|string} input input data - * @return {string} encoded data - */ - window.AscCommon.Base58.encode = function(buf) - { - if(typeof buf === "string") - { - let old = buf; - buf = []; - for (let i = 0, len = old.length; i < len; i++) - buf.push(old.charCodeAt(i)); - } - - const chars = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - const chars_map = [ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1, - -1, 9, 10, 11, 12, 13, 14, 15, 16, -1, 17, 18, 19, 20, 21, -1, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, - -1, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - ]; - - let result = []; - for (let i = 0, len = buf.length; i < len; i++) - { - let carry = buf[i]; - for (let j = 0; j < result.length; ++j) - { - const x = (chars_map[result[j]] << 8) + carry; - result[j] = chars.charCodeAt(x % 58); - carry = (x / 58) >> 0; - } - while (carry) - { - result.push(chars.charCodeAt(carry % 58)); - carry = (carry / 58) >> 0; - } - } - - let char1 = "1".charCodeAt(0); - for (let i = 0, len = buf.length; i < len; i++) - { - if (buf[i]) - break; - else - result.push(char1); - } - - result.reverse(); - return String.fromCharCode.apply(null, result); - }; - - -})(window); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/thumbnails.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/thumbnails.js deleted file mode 100644 index 555ac31ac2..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/thumbnails.js +++ /dev/null @@ -1,976 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ - -(function(){ - - // SKIN - var PageStyle = { - emptyColor : "#FFFFFF", - - numberColor : "#000000", - numberFontSize : 10, - numberFont : "Arial", - numberFontOffset : 10, - - outlineColor : "#D9D9D9", - outlineColorOffset : 0, - outlineColorWidth : 1, - - hoverColor : "#BABABA", - hoverColorOffset : 3, - hoverColorWidth : 3, - - selectColor : "#888888", - selectColorOffset : 3, - selectColorWidth : 3, - - isDrawCurrentRect : true, - drawCurrentColor : "#888888", - drawCurrentWidth : 2 - }; - - var ThumbnailsStyle = { - backgroundColor : "#F1F1F1" - }; - - PageStyle.numberFontHeight = (function(){ - if (window["NATIVE_EDITOR_ENJINE"]) - return 7; - var testCanvas = document.createElement("canvas"); - var w = 100; - var h = 100; - testCanvas.width = w; - testCanvas.height = h; - var ctx = testCanvas.getContext("2d"); - ctx.font = PageStyle.numberFont; - ctx.fillStyle = "#FFFFFF"; - ctx.fillRect(0, 0, w, h); - ctx.fillStyle = "#000000"; - ctx.font = PageStyle.numberFont; - ctx.fillText("123456789", 0, h); - var pixels = ctx.getImageData(0, 0, w, h).data; - var index = 0; - var indexLast = 4 * w * h; - while (index < indexLast) - { - if (pixels[index] !== 255 || pixels[index + 1] !== 255 || pixels[index + 2] !== 255) - break; - index += 4; - } - return h - ((index / (4 * w)) >> 0); - })(); - - PageStyle.font = function() - { - var size = AscCommon.AscBrowser.convertToRetinaValue(this.numberFontSize, true); - return "" + size + "px " + this.numberFont; - }; - - // LOGIC PAGE - function CPage(w, h) - { - this.width = w; - this.height = h; - - this.image = null; - } - - CPage.prototype.draw = function(ctx, x, y, w, h) - { - if (null === this.image) - { - ctx.fillStyle = PageStyle.emptyColor; - ctx.fillRect(x, y, w, h); - } - else - { - ctx.drawImage(this.image, x, y, w, h); - } - if (null !== PageStyle.outlineColor) - { - var lineW = Math.max(1, (PageStyle.outlineColorWidth * AscCommon.AscBrowser.retinaPixelRatio) >> 0); - var offsetW = PageStyle.outlineColorOffset + 0.5 * lineW; - - ctx.lineWidth = lineW; - ctx.strokeStyle = PageStyle.outlineColor; - ctx.strokeRect(x - offsetW, y - offsetW, w + 2 * offsetW, h + 2 * offsetW); - } - }; - - // DRAWING PAGE - function CDrawingPage(num, page) - { - this.page = page; - this.pageRect = { x:0, y:0, w:0, h:0 }; - this.numRect = { x:0, y:0, w:0, h:0 }; - this.num = num; - } - - CDrawingPage.prototype.draw = function(ctx, offsetV, doc) - { - this.page.draw(ctx, this.pageRect.x, this.pageRect.y - offsetV, this.pageRect.w, this.pageRect.h); - - var lineW, offsetW, color = undefined; - if (this.num === doc.selectPage) - { - lineW = Math.max(1, (PageStyle.selectColorWidth * AscCommon.AscBrowser.retinaPixelRatio) >> 0); - offsetW = PageStyle.selectColorOffset + 0.5 * lineW; - color = PageStyle.selectColor; - } - else if (this.num === doc.hoverPage) - { - lineW = Math.max(1, (PageStyle.hoverColorWidth * AscCommon.AscBrowser.retinaPixelRatio) >> 0); - offsetW = PageStyle.hoverColorOffset + 0.5 * lineW; - color = PageStyle.hoverColor; - } - - if (color) - { - ctx.lineWidth = lineW; - ctx.strokeStyle = color; - ctx.strokeRect(this.pageRect.x - offsetW, this.pageRect.y - offsetV - offsetW, this.pageRect.w + 2 * offsetW, this.pageRect.h + 2 * offsetW); - } - - // currentRect - var currentRect = null; - if (PageStyle.isDrawCurrentRect && doc.selectPage === this.num) - currentRect = doc.selectPageRect; - if (currentRect) - { - var _x = currentRect.x; - var _y = currentRect.y; - var _r = currentRect.r; - var _b = currentRect.b; - - if (_x < 0 || _x > 1 || _y < 0 || _y > 1 || _r < 0 || _r > 1 || _b < 0 || _b > 1) - return; - - var pixX = (this.pageRect.x + _x * this.pageRect.w) >> 0; - var pixY = (this.pageRect.y - offsetV + _y * this.pageRect.h) >> 0; - var pixR = (this.pageRect.x + _r * this.pageRect.w) >> 0; - var pixB = (this.pageRect.y - offsetV + _b * this.pageRect.h) >> 0; - - if (pixR <= pixX) return; - if (pixB <= pixY) return; - - var lineW = Math.max(1, (PageStyle.drawCurrentWidth * AscCommon.AscBrowser.retinaPixelRatio) >> 0); - var offsetW = 0.5 * lineW; - - ctx.lineWidth = lineW; - ctx.strokeStyle = PageStyle.drawCurrentColor; - ctx.strokeRect(pixX + offsetW, pixY + offsetW, pixR - pixX - 2 * offsetW, pixB - pixY - 2 * offsetW); - } - - ctx.fillStyle = PageStyle.numberColor; - ctx.fillText("" + (this.num + 1), this.numRect.x + this.numRect.w / 2, this.numRect.y + this.numRect.h - offsetV); - }; - - // BLOCK OF DRAWING PAGES - function CBlock() - { - this.pages = []; - this.top; - this.bottom; - } - - CBlock.prototype.getHeight = function(columnW, startOffset, betweenPages, zoom) - { - var maxPageHeight = 0; - for (var i = 0, len = this.pages.length; i < len; i++) - { - if (this.pages[i].page.height > maxPageHeight) - maxPageHeight = this.pages[i].page.height; - } - - var blockHeight = (maxPageHeight * zoom) >> 0; - var numberBlockH = AscCommon.AscBrowser.convertToRetinaValue(PageStyle.numberFontOffset + PageStyle.numberFontHeight, true); - blockHeight += numberBlockH; - - var currentPosX = startOffset; - for (var i = 0, len = this.pages.length; i < len; i++) - { - var drPage = this.pages[i]; - var pW = (drPage.page.width * zoom) >> 0; - var pH = (drPage.page.height * zoom) >> 0; - var curPageHeight = pH + PageStyle.numberFontOffset + PageStyle.numberFontHeight; - - drPage.pageRect.y = this.top + ((blockHeight - curPageHeight) >> 1); - drPage.pageRect.h = pH; - drPage.pageRect.x = currentPosX + ((columnW - pW) >> 1); - drPage.pageRect.w = pW; - - drPage.numRect.y = (drPage.pageRect.y + drPage.pageRect.h); - drPage.numRect.h = numberBlockH; - drPage.numRect.x = drPage.pageRect.x; - drPage.numRect.w = drPage.pageRect.w; - - currentPosX += (columnW + betweenPages); - } - - return blockHeight; - }; - - CBlock.prototype.draw = function(ctx, offsetV, doc) - { - for (var i = 0, len = this.pages.length; i < len; i++) - { - this.pages[i].draw(ctx, offsetV, doc); - } - }; - - // ГЛАВНЫЙ КЛАСС - function CDocument(id) - { - this.id = id; - this.viewer = null; - this.isEnabled = true; - - this.coordsOffset = {x: 0, y: 0}; - - this.pages = []; - this.countPagesInBlock = 1; - - this.blocks = []; - - this.settings = { - marginW : 20, - marginH : 10, - betweenW : 30, - betweenH : 20 - }; - - this.marginW = 20; - this.marginH = 10; - - this.betweenW = 30; - this.betweenH = 20; - - this.startBlock = -1; - this.endBlock = -1; - - this.documentWidth = 0; - this.documentHeight = 0; - - this.panelWidth = 0; - this.panelHeight = 0; - - this.scrollY = 0; - this.scrollMaxY = 0; - - this.minSizePage = 20; - this.defaultPageW = 150; - this.zoomMin = 1; - this.zoomMax = 1; - this.zoom = 1; - - this.canvas = null; - this.canvasOverlay = null; - this.isRepaint = false; - - this.scrollWidth = 10; - this.m_oScrollVerApi = null; - - this.selectPage = -1; - this.selectPageRect = null; - this.hoverPage = -1; - - this.handlers = {}; - - this.createComponents(); - } - - // INTERFACE - CDocument.prototype.repaint = function() - { - this.isRepaint = true; - }; - CDocument.prototype.setZoom = function(zoom) - { - this.zoom = this.zoomMin + zoom * (this.zoomMax - this.zoomMin); - this.resize(false); - }; - CDocument.prototype.resize = function(isZoomUpdated) - { - this._resize(isZoomUpdated); - }; - CDocument.prototype.setIsDrawCurrentRect = function(isDrawCurrentRect) - { - PageStyle.isDrawCurrentRect = isDrawCurrentRect; - this.repaint(); - }; - CDocument.prototype.setEnabled = function(isEnabled) - { - this.isEnabled = isEnabled; - if (this.isEnabled) - this.repaint(); - }; - CDocument.prototype.registerEvent = function(name, handler) - { - if (this.handlers[name] === undefined) - this.handlers[name] = []; - this.handlers[name].push(handler); - }; - - // HTML/INTERFACE - CDocument.prototype.createComponents = function() - { - this.updateSkin(); - - var parent = document.getElementById(this.id); - var elements = ""; - elements += ""; - elements += ""; - elements += "
"; - - parent.style.backgroundColor = ThumbnailsStyle.backgroundColor; - parent.innerHTML = elements; - - this.canvas = document.getElementById("id_viewer_th"); - this.canvas.backgroundColor = ThumbnailsStyle.backgroundColor; - - this.canvasOverlay = document.getElementById("id_overlay_th"); - this.canvasOverlay.style.pointerEvents = "none"; - - parent.onmousewheel = this.onMouseWhell.bind(this); - if (parent.addEventListener) - parent.addEventListener("DOMMouseScroll", this.onMouseWhell.bind(this), false); - - AscCommon.addMouseEvent(this.canvas, "down", this.onMouseDown.bind(this)); - AscCommon.addMouseEvent(this.canvas, "move", this.onMouseMove.bind(this)); - AscCommon.addMouseEvent(this.canvas, "up", this.onMouseUp.bind(this)); - }; - - CDocument.prototype.sendEvent = function() - { - var name = arguments[0]; - if (this.handlers.hasOwnProperty(name)) - { - for (var i = 0; i < this.handlers[name].length; ++i) - { - this.handlers[name][i].apply(this || window, Array.prototype.slice.call(arguments, 1)); - } - return true; - } - }; - - // SCROLL - CDocument.prototype.CreateScrollSettings = function() - { - var settings = new AscCommon.ScrollSettings(); - settings.screenW = this.panelWidth; - settings.screenH = this.panelHeight; - settings.vscrollStep = 45; - settings.hscrollStep = 45; - - //settings.isNeedInvertOnActive = GlobalSkin.isNeedInvertOnActive; - settings.showArrows = false; - settings.cornerRadius = 1; - settings.slimScroll = true; - - settings.scrollBackgroundColor = GlobalSkin.ScrollBackgroundColor; - settings.scrollBackgroundColorHover = GlobalSkin.ScrollBackgroundColor; - settings.scrollBackgroundColorActive = GlobalSkin.ScrollBackgroundColor; - - settings.scrollerColor = GlobalSkin.ScrollerColor; - settings.scrollerHoverColor = GlobalSkin.ScrollerHoverColor; - settings.scrollerActiveColor = GlobalSkin.ScrollerActiveColor; - - settings.arrowColor = GlobalSkin.ScrollArrowColor; - settings.arrowHoverColor = GlobalSkin.ScrollArrowHoverColor; - settings.arrowActiveColor = GlobalSkin.ScrollArrowActiveColor; - - settings.strokeStyleNone = GlobalSkin.ScrollOutlineColor; - settings.strokeStyleOver = GlobalSkin.ScrollOutlineHoverColor; - settings.strokeStyleActive = GlobalSkin.ScrollOutlineActiveColor; - - settings.targetColor = GlobalSkin.ScrollerTargetColor; - settings.targetHoverColor = GlobalSkin.ScrollerTargetHoverColor; - settings.targetActiveColor = GlobalSkin.ScrollerTargetActiveColor; - return settings; - }; - - CDocument.prototype.scrollVertical = function(pos, maxPos) - { - this.scrollY = pos; - this.scrollMaxY = maxPos; - this.calculateVisibleBlocks(); - this.repaint(); - }; - - CDocument.prototype.updateScroll = function(scrollV) - { - scrollV.style.display = (this.documentHeight > this.panelHeight) ? "block" : "none"; - - var settings = this.CreateScrollSettings(); - settings.isHorizontalScroll = false; - settings.isVerticalScroll = true; - settings.contentH = this.documentHeight; - if (this.m_oScrollVerApi) - this.m_oScrollVerApi.Repos(settings, undefined, true); - else - { - this.m_oScrollVerApi = new AscCommon.ScrollObject("id_vertical_scroll_th", settings); - - this.m_oScrollVerApi.onLockMouse = function(evt) { - AscCommon.check_MouseDownEvent(evt, true); - AscCommon.global_mouseEvent.LockMouse(); - }; - this.m_oScrollVerApi.offLockMouse = function(evt) { - AscCommon.check_MouseUpEvent(evt); - }; - var _t = this; - this.m_oScrollVerApi.bind("scrollvertical", function(evt) { - _t.scrollVertical(evt.scrollD, evt.maxScrollY); - }); - } - - this.scrollMaxY = this.m_oScrollVerApi.getMaxScrolledY(); - if (this.scrollY >= this.scrollMaxY) - this.scrollY = this.scrollMaxY; - }; - - // очередь задач - нужно ли перерисоваться и/или перерисовать страницу - CDocument.prototype.checkTasks = function(isViewerTask) - { - var isNeedTasks = false; - if (!this.isEnabled) - return isNeedTasks; - - if (!isViewerTask && -1 != this.startBlock) - { - // смотрим, какие страницы нужно перерисовать. - // делаем это по одной, так как задачи вьюера важнее - var needPage = null; - var drPage, block; - for (var blockNum = this.startBlock; (blockNum <= this.endBlock) && !needPage; blockNum++) - { - block = this.blocks[blockNum]; - - for (var pageNum = 0, pagesCount = block.pages.length; pageNum < pagesCount; pageNum++) - { - drPage = block.pages[pageNum]; - if (drPage.page.image === null || - (drPage.page.image.requestWidth != drPage.pageRect.w || drPage.page.image.requestHeight != drPage.pageRect.h)) - { - needPage = drPage; - break; - } - } - } - - if (needPage) - { - isNeedTasks = true; - needPage.page.image = this.viewer.file.getPage(needPage.num, needPage.pageRect.w, needPage.pageRect.h, undefined, this.viewer.Api.isDarkMode ? 0x3A3A3A : 0xFFFFFF); - this.isRepaint = true; - } - } - - // проверяем, нужна ли перерисовка - if (this.isRepaint) - { - this._paint(); - this.isRepaint = false; - } - - return isNeedTasks; - }; - - CDocument.prototype.updateCurrentPage = function(pageObject) - { - this.selectPageRect = pageObject; - if (this.selectPage != pageObject.num) - { - this.selectPage = pageObject.num; - var drPage = this.getDrawingPage(this.selectPage); - if (!drPage) - return; - - // или подскролливаем, или просто перерисовываем - if (drPage.pageRect.y < this.scrollY) - this.m_oScrollVerApi.scrollToY(drPage.pageRect.y - this.betweenH); - else - { - var b = drPage.pageRect.y + drPage.pageRect.h + drPage.numRect.h; - if (b > (this.scrollY + this.panelHeight)) - this.m_oScrollVerApi.scrollToY(b - this.panelHeight + this.betweenH); - else - this.repaint(); - } - } - else if (PageStyle.isDrawCurrentRect) - this.repaint(); - }; - - // сама отрисовка - CDocument.prototype._paint = function() - { - this.canvas.width = this.canvas.width; - var ctx = this.canvas.getContext("2d"); - ctx.fillStyle = ThumbnailsStyle.backgroundColor; - ctx.fillRect(0, 0, this.panelWidth, this.panelHeight); - - if (-1 == this.startBlock) - return; - - ctx.font = PageStyle.font(); - ctx.textAlign = "center"; - for (var block = this.startBlock; block <= this.endBlock; block++) - { - this.blocks[block].draw(ctx, this.scrollY >> 0, this); - } - }; - - CDocument.prototype.init = function() - { - this.pages = []; - if (this.viewer.file && this.viewer.file.isValid()) - { - var pages = this.viewer.file.pages; - let koef = 1; - for (let i = 0, len = pages.length; i < len; i++) - { - koef = 1; - if (pages[i].Dpi > 1) - koef = 100 / pages[i].Dpi; - this.pages.push(new CPage(koef * pages[i].W, koef * pages[i].H)); - } - } - - this.resize(); - }; - - CDocument.prototype._resize = function(isZoomUpdated) - { - var element = document.getElementById(this.id); - - if (0 === element.offsetWidth || !this.canvas) - return; - - // размер панели - this.panelWidth = element.offsetWidth; - this.panelHeight = element.offsetHeight; - - this.canvas.style.width = this.panelWidth + "px"; - this.canvas.style.height = this.panelHeight + "px"; - this.canvasOverlay.style.width = this.panelWidth + "px"; - this.canvasOverlay.style.height = this.panelHeight + "px"; - - AscCommon.calculateCanvasSize(this.canvas); - AscCommon.calculateCanvasSize(this.canvasOverlay); - - var canvasBounds = this.canvas.getBoundingClientRect(); - this.coordsOffset.x = canvasBounds ? canvasBounds.left : 0; - this.coordsOffset.y = canvasBounds ? canvasBounds.top : 0; - - var scrollV = document.getElementById("id_vertical_scroll_th"); - scrollV.style.display = "none"; - scrollV.style.left = this.panelWidth - this.scrollWidth + "px"; - scrollV.style.top = "0px"; - scrollV.style.width = this.scrollWidth + "px"; - scrollV.style.height = this.panelHeight + "px"; - - this.panelWidth = AscCommon.AscBrowser.convertToRetinaValue(this.panelWidth, true); - this.panelHeight = AscCommon.AscBrowser.convertToRetinaValue(this.panelHeight, true); - - this.marginW = AscCommon.AscBrowser.convertToRetinaValue(this.settings.marginW, true); - this.marginH = AscCommon.AscBrowser.convertToRetinaValue(this.settings.marginH, true); - this.betweenW = AscCommon.AscBrowser.convertToRetinaValue(this.settings.betweenW, true); - this.betweenH = AscCommon.AscBrowser.convertToRetinaValue(this.settings.betweenH, true); - - if (this.pages.length == 0) - return; - - // делим страницы на колонки одинаковой ширины (по максимальной странице) - - var pageWidthMax = this.getMaxPageWidth(); - var sizeMax = Math.max(pageWidthMax, this.getMaxPageHeight()); - - // максимальные/минимальные зумы - this.zoomMin = this.minSizePage / sizeMax; - this.zoomMax = (this.panelWidth - (2 * this.marginW)) / pageWidthMax; - - if (this.defaultPageW != 0) - { - // зум "по умолчанию" - this.zoom = AscCommon.AscBrowser.convertToRetinaValue(this.defaultPageW, true) / pageWidthMax; - - if (0 != this.panelWidth) - this.defaultPageW = 0; - } - - // корректировка зумов - if (this.zoomMax < this.zoomMin) - this.zoomMax = this.zoomMin; - if (this.zoom < this.zoomMin) - this.zoom = this.zoomMin; - if (this.zoom > this.zoomMax) - this.zoom = this.zoomMax; - - if (isZoomUpdated !== false) - { - var interfaceZoom = (this.zoomMax - this.zoomMin) < 0.001 ? 0 : (this.zoom - this.zoomMin) / (this.zoomMax - this.zoomMin); - this.sendEvent("onZoomChanged", interfaceZoom); - } - - // смотрим, сколько столбцов влезает - // уравнение: - // (pageWidthMax * this.zoom) * x + this.betweenW * (x - 1) = this.panelWidth - 2 * this.marginW; - var blockW = (pageWidthMax * this.zoom) >> 0; - this.countPagesInBlock = (this.panelWidth - 2 * this.marginW + this.betweenW) / (blockW + this.betweenW); - this.countPagesInBlock >>= 0; - if (this.countPagesInBlock < 1) - this.countPagesInBlock = 1; - - if (this.countPagesInBlock > this.pages.length) - this.countPagesInBlock = this.pages.length; - - this.documentWidth = this.countPagesInBlock * blockW + 2 * this.marginW + this.betweenW * (this.countPagesInBlock - 1); - - // теперь набиваем блоки - this.blocks = []; - var blocksCount = 0; - var countInCurrentBlock = this.countPagesInBlock; - for (let i = 0, len = this.pages.length; i < len; i++) - { - if (countInCurrentBlock == this.countPagesInBlock) - { - this.blocks[blocksCount++] = new CBlock(); - countInCurrentBlock = 0; - } - this.blocks[blocksCount - 1].pages.push(new CDrawingPage(i, this.pages[i])); - ++countInCurrentBlock; - } - - // теперь считаем позиции страниц в блоке (координаты сквозные) - var blockTop = this.betweenH; - var startOffsetX = this.marginW + ((this.panelWidth - this.documentWidth) >> 1); - for (let i = 0, len = this.blocks.length; i < len; i++) - { - var block = this.blocks[i]; - block.top = blockTop; - block.bottom = block.top + block.getHeight(blockW, startOffsetX, this.betweenW, this.zoom); - blockTop = block.bottom + this.betweenH; - } - - this.documentHeight = blockTop; - - this.updateScroll(scrollV); - this.calculateVisibleBlocks(); - this.repaint(); - }; - - CDocument.prototype.calculateVisibleBlocks = function() - { - this.startBlock = -1; - this.endBlock = -1; - var blocksCount = this.blocks.length; - var block; - for (var i = 0; i < blocksCount; i++) - { - block = this.blocks[i]; - if (block.bottom > this.scrollY) - { - // первый видимый блок! - this.startBlock = i; - break; - } - else - { - // выкидываем страницу из кэша - for (var pageNum = 0, pagesCount = block.pages.length; pageNum < pagesCount; pageNum++) - { - this.pages[block.pages[pageNum].num].image = null; - } - } - } - - if (this.startBlock != -1) - { - for (var i = this.startBlock; i < blocksCount; i++) - { - block = this.blocks[i]; - if (block.top > (this.scrollY + this.panelHeight)) - { - // уже невидимый блок! - this.endBlock = i - 1; - break; - } - } - } - - // проверяем - могли дойти до конца - if (this.startBlock >= 0 && this.endBlock == -1) - this.endBlock = blocksCount - 1; - - for (var i = this.endBlock + 1; i < blocksCount; i++) - { - block = this.blocks[i]; - // выкидываем страницу из кэша - for (var pageNum = 0, pagesCount = block.pages.length; pageNum < pagesCount; pageNum++) - { - this.pages[block.pages[pageNum].num].image = null; - } - } - }; - - CDocument.prototype.getMaxPageWidth = function() - { - var size = 0, page = null; - for (var i = 0, count = this.pages.length; i < count; i++) - { - page = this.pages[i]; - if (size < page.width) - size = page.width; - } - return size; - }; - CDocument.prototype.getMaxPageHeight = function() - { - var size = 0, page = null; - for (var i = 0, count = this.pages.length; i < count; i++) - { - page = this.pages[i]; - if (size < page.height) - size = page.height; - } - return size; - }; - - CDocument.prototype.getPageByCoords = function(x, y) - { - // тут ТОЛЬКО для попадания. поэтому смотрим только видимые блоки - if (-1 === this.startBlock || -1 === this.endBlock) - return null; - - x -= this.coordsOffset.x; - y -= this.coordsOffset.y; - - x = AscCommon.AscBrowser.convertToRetinaValue(x, true); - y = AscCommon.AscBrowser.convertToRetinaValue(y, true); - - y += this.scrollY; - - var pages = null; - for (var block = this.startBlock; block <= this.endBlock; block++) - { - if (y >= this.blocks[block].top && y <= this.blocks[block].bottom) - { - pages = this.blocks[block].pages; - break; - } - } - - if (!pages) - return null; - - var drPage; - for (var pageNum = 0, count = pages.length; pageNum < count; pageNum++) - { - drPage = pages[pageNum]; - if (x >= drPage.pageRect.x && x <= (drPage.pageRect.x + drPage.pageRect.w) && - y >= drPage.pageRect.y && y <= (drPage.pageRect.y + drPage.pageRect.h)) - { - return drPage; - } - } - - return null; - }; - - CDocument.prototype.getDrawingPage = function(pageNum) - { - if (pageNum < 0 || pageNum >= this.pages.length) - return null; - - var block = (pageNum / this.countPagesInBlock) >> 0; - if (!this.blocks[block]) - return null; - - var pageInBlock = pageNum - block * this.countPagesInBlock; - return this.blocks[block].pages[pageInBlock]; - }; - - // UI-EVENTS - CDocument.prototype.onMouseDown = function(e) - { - AscCommon.check_MouseDownEvent(e, true); - AscCommon.global_mouseEvent.LockMouse(); - this.viewer.isFocusOnThumbnails = true; - - var drPage = this.getPageByCoords(AscCommon.global_mouseEvent.X, AscCommon.global_mouseEvent.Y); - if (drPage && drPage.num !== this.selectPage) - { - this.viewer.navigateToPage(drPage.num); - } - - AscCommon.stopEvent(e); - return false; - }; - - CDocument.prototype.onMouseUp = function(e) - { - AscCommon.check_MouseUpEvent(e); - if (e && e.preventDefault) - e.preventDefault(); - return false; - }; - - CDocument.prototype.onMouseMove = function(e) - { - AscCommon.check_MouseMoveEvent(e); - - if (AscCommon.global_mouseEvent.IsLocked && - this.canvas != AscCommon.global_mouseEvent.Sender) - { - return; - } - - if (!AscCommon.global_mouseEvent.IsLocked) - { - var drPage = this.getPageByCoords(AscCommon.global_mouseEvent.X, AscCommon.global_mouseEvent.Y); - var hoverNum = drPage ? drPage.num : -1; - if (hoverNum !== this.hoverPage) - { - this.hoverPage = hoverNum; - this._paint(); - } - } - - if (e && e.preventDefault) - e.preventDefault(); - return false; - }; - - CDocument.prototype.onMouseWhell = function(e) - { - AscCommon.stopEvent(e); - if (this.scrollMaxY == 0) - return false; - - var _ctrl = false; - if (e.metaKey !== undefined) - _ctrl = e.ctrlKey || e.metaKey; - else - _ctrl = e.ctrlKey; - - if (true === _ctrl) - return false; - - var delta = 0; - if (undefined != e.wheelDelta && e.wheelDelta != 0) - { - //delta = (e.wheelDelta > 0) ? -45 : 45; - delta = -45 * e.wheelDelta / 120; - } - else if (undefined != e.detail && e.detail != 0) - { - //delta = (e.detail > 0) ? 45 : -45; - delta = 45 * e.detail / 3; - } - - delta = delta >> 0; - if (0 != delta) - this.m_oScrollVerApi.scrollBy(0, delta, false); - - // здесь - имитируем моус мув --------------------------- - var _e = {}; - _e.pageX = AscCommon.global_mouseEvent.X; - _e.pageY = AscCommon.global_mouseEvent.Y; - - _e.clientX = AscCommon.global_mouseEvent.X; - _e.clientY = AscCommon.global_mouseEvent.Y; - - _e.altKey = AscCommon.global_mouseEvent.AltKey; - _e.shiftKey = AscCommon.global_mouseEvent.ShiftKey; - _e.ctrlKey = AscCommon.global_mouseEvent.CtrlKey; - _e.metaKey = AscCommon.global_mouseEvent.CtrlKey; - - _e.srcElement = AscCommon.global_mouseEvent.Sender; - - this.onMouseMove(_e); - // ------------------------------------------------------ - return false; - }; - - CDocument.prototype.updateSkin = function() - { - ThumbnailsStyle.backgroundColor = AscCommon.GlobalSkin.BackgroundColorThumbnails; - PageStyle.hoverColor = AscCommon.GlobalSkin.ThumbnailsPageOutlineHover; - PageStyle.selectColor = AscCommon.GlobalSkin.ThumbnailsPageOutlineActive; - PageStyle.numberColor = AscCommon.GlobalSkin.ThumbnailsPageNumberText; - - if (this.canvas) - this.canvas.style.backgroundColor = ThumbnailsStyle.backgroundColor; - - this.resize(); - }; - - CDocument.prototype.checkPageEmptyStyle = function() - { - PageStyle.emptyColor = "#FFFFFF"; - if (this.viewer) - { - var backColor = this.viewer.Api.getPageBackgroundColor(); - PageStyle.emptyColor = "#" + backColor[0].toString(16) + backColor[1].toString(16) + backColor[2].toString(16); - } - } - - CDocument.prototype.clearCachePages = function() - { - this.checkPageEmptyStyle(); - - for (var blockNum = 0, blocksCount = this.blocks.length; blockNum < blocksCount; blockNum++) - { - var block = this.blocks[blockNum]; - - for (var pageNum = 0, pagesCount = block.pages.length; pageNum < pagesCount; pageNum++) - { - var drPage = block.pages[pageNum]; - if (drPage.page.image) - { - drPage.page.image = null; - } - } - } - }; - - // export - AscCommon.ThumbnailsControl = CDocument; - AscCommon["ThumbnailsControl"] = AscCommon.ThumbnailsControl; - var prot = AscCommon["ThumbnailsControl"].prototype; - prot["repaint"] = prot.repaint; - prot["setZoom"] = prot.setZoom; - prot["resize"] = prot.resize; - prot["setEnabled"] = prot.setEnabled; - prot["registerEvent"] = prot.registerEvent; -})(); diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/viewer.js b/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/viewer.js deleted file mode 100644 index 2297a3bbc9..0000000000 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/lib/viewer.js +++ /dev/null @@ -1,2409 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2023 - * - * This program is a free software product. You can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License (AGPL) - * version 3 as published by the Free Software Foundation. In accordance with - * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect - * that Ascensio System SIA expressly excludes the warranty of non-infringement - * of any third-party rights. - * - * This program is distributed WITHOUT ANY WARRANTY; without even the implied - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For - * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html - * - * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish - * street, Riga, Latvia, EU, LV-1050. - * - * The interactive user interfaces in modified source and object code versions - * of the Program must display Appropriate Legal Notices, as required under - * Section 5 of the GNU AGPL version 3. - * - * Pursuant to Section 7(b) of the License you must retain the original Product - * logo when distributing the program. Pursuant to Section 7(e) we decline to - * grant you any rights under trademark law for use of our trademarks. - * - * All the Product's GUI elements, including illustrations and icon sets, as - * well as technical writing content are licensed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International. See the License - * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - * - */ -import { GlobalSkin } from "./skin"; - -(function () { - function CCacheManager() { - this.images = []; - - this.lock = function (w, h) { - for (let i = 0; i < this.images.length; i++) { - if (this.images[i].locked) continue; - - let canvas = this.images[i].canvas; - let testW = canvas.width; - let testH = canvas.height; - if (w > testW || h > testH || 4 * w * h < testW * testH) { - this.images.splice(i, 1); - continue; - } - - this.images[i].locked = true; - return canvas; - } - - let newImage = { canvas: document.createElement("canvas"), locked: true }; - newImage.canvas.width = w + 100; - newImage.canvas.height = h + 100; - this.images.push(newImage); - return newImage.canvas; - }; - - this.unlock = function (canvas) { - for (let i = 0, len = this.images.length; i < len; i++) { - if (this.images[i].canvas === canvas) { - this.images[i].locked = false; - return; - } - } - }; - - this.clear = function () { - this.images = []; - }; - } - - // wasm/asmjs module state - var ModuleState = { - None: 0, - Loading: 1, - Loaded: 2, - }; - - // zoom mode - var ZoomMode = { - Custom: 0, - Width: 1, - Page: 2, - }; - - // класс страницы. - // isPainted - значит она когда-либо рисовалась и дорисовалась до конца (шрифты загружены) - // links - гиперссылки. они запрашиваются ТОЛЬКО у страниц на экране и у отрисованных страниц. - // так как нет смысла запрашивать ссылки у невидимых страниц и у страниц, которые мы в данный момент не можем отрисовать - // text - текстовые команды. они запрашиваются всегда, если есть какая-то страница без текстовых команд - // страницы на экране в приоритете. - function CPageInfo() { - this.isPainted = false; - this.links = null; - } - function CDocumentPagesInfo() { - this.pages = []; - - // все страницы ДО this.countCurrentPage должны иметь текстовые команды - this.countTextPages = 0; - } - CDocumentPagesInfo.prototype.setCount = function (count) { - this.pages = new Array(count); - for (var i = 0; i < count; i++) { - this.pages[i] = new CPageInfo(); - } - this.countTextPages = 0; - }; - CDocumentPagesInfo.prototype.setPainted = function (index) { - this.pages[index].isPainted = true; - }; - - function CHtmlPage(id, api) { - this.Api = api; - this.parent = document.getElementById(id); - this.thumbnails = null; - - this.x = 0; - this.y = 0; - this.width = 0; - this.height = 0; - - this.documentWidth = 0; - this.documentHeight = 0; - - this.scrollY = 0; - this.scrollMaxY = 0; - this.scrollX = 0; - this.scrollMaxX = 0; - - this.zoomMode = ZoomMode.Custom; - this.zoom = 1; - this.zoomCoordinate = null; - this.skipClearZoomCoord = false; - - this.drawingPages = []; - this.isRepaint = false; - - this.canvas = null; - this.canvasOverlay = null; - - this.Selection = null; - - this.file = null; - this.isStarted = false; - this.isCMapLoading = false; - this.savedPassword = ""; - - this.scrollWidth = this.Api.isMobileVersion ? 0 : 14; - this.isVisibleHorScroll = false; - - this.m_oScrollHorApi = null; - this.m_oScrollVerApi = null; - - this.backgroundColor = "#E6E6E6"; - this.backgroundPageColor = "#FFFFFF"; - this.outlinePageColor = "#000000"; - - this.betweenPages = 20; - - this.moduleState = ModuleState.None; - - this.structure = null; - this.currentPage = -1; - - this.startVisiblePage = -1; - this.endVisiblePage = -1; - this.pagesInfo = new CDocumentPagesInfo(); - - this.statistics = { - paragraph: 0, - words: 0, - symbols: 0, - spaces: 0, - process: false, - }; - - this.handlers = {}; - - this.overlay = null; - this.timerScrollSelect = -1; - - this.SearchResults = null; - this.isClearPages = false; - - this.isFullText = false; - this.isFullTextMessage = false; - this.fullTextMessageCallback = null; - this.fullTextMessageCallbackArgs = null; - - this.isMouseDown = false; - this.isMouseMoveBetweenDownUp = false; - this.mouseMoveEpsilon = 5; - this.mouseDownCoords = { X: 0, Y: 0 }; - this.mouseDownLinkObject = null; - - this.isFocusOnThumbnails = false; - this.isDocumentContentReady = false; - - this.isXP = - AscCommon.AscBrowser.userAgent.indexOf("windowsxp") > -1 || - AscCommon.AscBrowser.userAgent.indexOf("chrome/49") > -1 - ? true - : false; - if ( - !this.isXP && - AscCommon.AscBrowser.isIE && - !AscCommon.AscBrowser.isIeEdge - ) - this.isXP = true; - - if (this.isXP) { - AscCommon.g_oHtmlCursor.register("grab", "grab", "7 8", "pointer"); - AscCommon.g_oHtmlCursor.register( - "grabbing", - "grabbing", - "6 6", - "pointer" - ); - } - - var oThis = this; - - this.updateSkin = function () { - this.backgroundColor = AscCommon.GlobalSkin.BackgroundColor; - this.backgroundPageColor = - AscCommon.GlobalSkin.Type === "dark" - ? AscCommon.GlobalSkin.BackgroundColor - : "#FFFFFF"; - this.outlinePageColor = AscCommon.GlobalSkin.PageOutline; - - if (this.canvas) this.canvas.style.backgroundColor = this.backgroundColor; - - if (this.thumbnails) this.thumbnails.updateSkin(); - - if (this.resize) this.resize(); - }; - - this.updateDarkMode = function () { - this.isClearPages = true; - - if (this.thumbnails) { - this.thumbnails.updateSkin(); - this.thumbnails.clearCachePages(); - } - - if (this.resize) this.resize(); - }; - - this.createComponents = function () { - var elements = ""; - elements += - ''; - elements += - ''; - elements += - ''; - elements += - ''; - - //this.parent.style.backgroundColor = this.backgroundColor; <= this color from theme - this.parent.innerHTML = elements; - - this.canvas = document.getElementById("id_viewer"); - this.canvas.style.backgroundColor = this.backgroundColor; - - this.canvasOverlay = document.getElementById("id_overlay"); - this.canvasOverlay.style.pointerEvents = "none"; - - this.overlay = new AscCommon.COverlay(); - this.overlay.m_oControl = { HtmlElement: this.canvasOverlay }; - this.overlay.m_bIsShow = true; - - this.updateSkin(); - }; - - this.setThumbnailsControl = function (thumbnails) { - this.thumbnails = thumbnails; - this.thumbnails.viewer = this; - this.thumbnails.checkPageEmptyStyle(); - if (this.isStarted) { - this.thumbnails.init(); - } - }; - - // events - this.registerEvent = function (name, handler) { - if (this.handlers[name] === undefined) this.handlers[name] = []; - this.handlers[name].push(handler); - }; - this.sendEvent = function () { - var name = arguments[0]; - if (this.handlers.hasOwnProperty(name)) { - for (var i = 0; i < this.handlers[name].length; ++i) { - this.handlers[name][i].apply( - this || window, - Array.prototype.slice.call(arguments, 1) - ); - } - return true; - } - }; - - /* - [TIMER START] - */ - this.UseRequestAnimationFrame = AscCommon.AscBrowser.isChrome; - this.RequestAnimationFrame = (function () { - return ( - window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - null - ); - })(); - this.CancelAnimationFrame = (function () { - return ( - window.cancelRequestAnimationFrame || - window.webkitCancelAnimationFrame || - window.webkitCancelRequestAnimationFrame || - window.mozCancelRequestAnimationFrame || - window.oCancelRequestAnimationFrame || - window.msCancelRequestAnimationFrame || - null - ); - })(); - if (this.UseRequestAnimationFrame) { - if (null == this.RequestAnimationFrame) - this.UseRequestAnimationFrame = false; - } - this.RequestAnimationOldTime = -1; - - this.startTimer = function () { - this.isStarted = true; - if (this.UseRequestAnimationFrame) this.timerAnimation(); - else this.timer(); - }; - /* - [TIMER END] - */ - - this.log = function (message) { - //console.log(message); - }; - - this.timerAnimation = function () { - var now = Date.now(); - if ( - -1 == oThis.RequestAnimationOldTime || - now >= oThis.RequestAnimationOldTime + 40 || - now < oThis.RequestAnimationOldTime - ) { - oThis.RequestAnimationOldTime = now; - oThis.timer(); - } - oThis.RequestAnimationFrame.call(window, oThis.timerAnimation); - }; - - this.timer = function () { - // в порядке важности - - // 1) отрисовка - // 2) гиперссылки для видимых (и уже отрисованных!) страниц - // 3) табнейлы (если надо) - // 4) текстовые команды - - var isViewerTask = oThis.isRepaint; - if (oThis.isRepaint) { - oThis._paint(); - oThis.onUpdateOverlay(); - oThis.isRepaint = false; - } else if (oThis.checkPagesLinks()) { - isViewerTask = true; - } - - if (oThis.thumbnails) { - isViewerTask = oThis.thumbnails.checkTasks(isViewerTask); - } - - if (!isViewerTask && !oThis.Api.WordControl.NoneRepaintPages) { - oThis.checkPagesText(); - - if (this.isFullTextMessage) { - var countSync = 10; - while (countSync > 0 && !this.isFullText) { - oThis.checkPagesText(); - --countSync; - } - } - } - - if (!oThis.UseRequestAnimationFrame) { - setTimeout(oThis.timer, 40); - } - }; - - this.timerSync = function () { - this.timer(); - }; - - this.CreateScrollSettings = function () { - var settings = new AscCommon.ScrollSettings(); - settings.screenW = this.width; - settings.screenH = this.height; - settings.vscrollStep = 45; - settings.hscrollStep = 45; - - settings.isNeedInvertOnActive = GlobalSkin.isNeedInvertOnActive; - - settings.scrollBackgroundColor = GlobalSkin.ScrollBackgroundColor; - settings.scrollBackgroundColorHover = GlobalSkin.ScrollBackgroundColor; - settings.scrollBackgroundColorActive = GlobalSkin.ScrollBackgroundColor; - - settings.scrollerColor = GlobalSkin.ScrollerColor; - settings.scrollerHoverColor = GlobalSkin.ScrollerHoverColor; - settings.scrollerActiveColor = GlobalSkin.ScrollerActiveColor; - - settings.arrowColor = GlobalSkin.ScrollArrowColor; - settings.arrowHoverColor = GlobalSkin.ScrollArrowHoverColor; - settings.arrowActiveColor = GlobalSkin.ScrollArrowActiveColor; - - settings.strokeStyleNone = GlobalSkin.ScrollOutlineColor; - settings.strokeStyleOver = GlobalSkin.ScrollOutlineHoverColor; - settings.strokeStyleActive = GlobalSkin.ScrollOutlineActiveColor; - - settings.targetColor = GlobalSkin.ScrollerTargetColor; - settings.targetHoverColor = GlobalSkin.ScrollerTargetHoverColor; - settings.targetActiveColor = GlobalSkin.ScrollerTargetActiveColor; - return settings; - }; - - this.scrollHorizontal = function (pos, maxPos) { - this.scrollX = pos; - this.scrollMaxX = maxPos; - if ( - this.Api.WordControl.MobileTouchManager && - this.Api.WordControl.MobileTouchManager.iScroll - ) - this.Api.WordControl.MobileTouchManager.iScroll.x = -Math.max( - 0, - Math.min(pos, maxPos) - ); - - this.paint(); - }; - this.scrollVertical = function (pos, maxPos) { - this.scrollY = pos; - this.scrollMaxY = maxPos; - if ( - this.Api.WordControl.MobileTouchManager && - this.Api.WordControl.MobileTouchManager.iScroll - ) - this.Api.WordControl.MobileTouchManager.iScroll.y = -Math.max( - 0, - Math.min(pos, maxPos) - ); - - this.paint(); - }; - - this.resize = function (isDisablePaint) { - this.isFocusOnThumbnails = false; - - var rect = this.canvas.getBoundingClientRect(); - this.x = rect.left; - this.y = rect.top; - - var oldsize = { w: this.width, h: this.height }; - this.width = this.parent.offsetWidth - this.scrollWidth; - this.height = this.parent.offsetHeight; - - if (this.zoomMode === ZoomMode.Width) - this.zoom = this.calculateZoomToWidth(); - else if (this.zoomMode === ZoomMode.Page) - this.zoom = this.calculateZoomToHeight(); - - // в мобильной версии мы будем получать координаты от MobileTouchManager (до этого момента они уже должны быть) и не нужно их запоминать, так как мы перетрём нужные нам значения - // ну а если их нет и зум произошёл не от тача, то запоминаем их как при обычном зуме - if (!this.zoomCoordinate) - this.fixZoomCoord(this.width >> 1, this.height >> 1); - - this.sendEvent("onZoom", this.zoom, this.zoomMode); - - this.recalculatePlaces(); - - this.isVisibleHorScroll = this.documentWidth > this.width ? true : false; - if (this.isVisibleHorScroll) this.height -= this.scrollWidth; - - this.canvas.style.width = this.width + "px"; - this.canvas.style.height = this.height + "px"; - AscCommon.calculateCanvasSize(this.canvas); - - this.canvasOverlay.style.width = this.width + "px"; - this.canvasOverlay.style.height = this.height + "px"; - AscCommon.calculateCanvasSize(this.canvasOverlay); - - var scrollV = document.getElementById("id_vertical_scroll"); - scrollV.style.display = "block"; - scrollV.style.left = this.width + "px"; - scrollV.style.top = "0px"; - scrollV.style.width = this.scrollWidth + "px"; - scrollV.style.height = this.height + "px"; - - var scrollH = document.getElementById("id_horizontal_scroll"); - scrollH.style.display = this.isVisibleHorScroll ? "block" : "none"; - scrollH.style.left = "0px"; - scrollH.style.top = this.height + "px"; - scrollH.style.width = this.width + "px"; - scrollH.style.height = this.scrollWidth + "px"; - - var settings = this.CreateScrollSettings(); - settings.isHorizontalScroll = true; - settings.isVerticalScroll = false; - settings.contentW = this.documentWidth; - - if (this.m_oScrollHorApi) - this.m_oScrollHorApi.Repos(settings, this.isVisibleHorScroll); - else { - this.m_oScrollHorApi = new AscCommon.ScrollObject( - "id_horizontal_scroll", - settings - ); - - this.m_oScrollHorApi.onLockMouse = function (evt) { - AscCommon.check_MouseDownEvent(evt, true); - AscCommon.global_mouseEvent.LockMouse(); - }; - this.m_oScrollHorApi.offLockMouse = function (evt) { - AscCommon.check_MouseUpEvent(evt); - }; - this.m_oScrollHorApi.bind("scrollhorizontal", function (evt) { - oThis.scrollHorizontal(evt.scrollD, evt.maxScrollX); - }); - } - - settings = this.CreateScrollSettings(); - settings.isHorizontalScroll = false; - settings.isVerticalScroll = true; - settings.contentH = this.documentHeight; - if (this.m_oScrollVerApi) - this.m_oScrollVerApi.Repos(settings, undefined, true); - else { - this.m_oScrollVerApi = new AscCommon.ScrollObject( - "id_vertical_scroll", - settings - ); - - this.m_oScrollVerApi.onLockMouse = function (evt) { - AscCommon.check_MouseDownEvent(evt, true); - AscCommon.global_mouseEvent.LockMouse(); - }; - this.m_oScrollVerApi.offLockMouse = function (evt) { - AscCommon.check_MouseUpEvent(evt); - }; - this.m_oScrollVerApi.bind("scrollvertical", function (evt) { - oThis.scrollVertical(evt.scrollD, evt.maxScrollY); - }); - } - - this.scrollMaxX = this.m_oScrollHorApi.getMaxScrolledX(); - this.scrollMaxY = this.m_oScrollVerApi.getMaxScrolledY(); - - if (this.scrollX >= this.scrollMaxX) this.scrollX = this.scrollMaxX; - if (this.scrollY >= this.scrollMaxY) this.scrollY = this.scrollMaxY; - - if (this.zoomCoordinate && this.isDocumentContentReady) { - var newPoint = this.ConvertCoordsToCursor( - this.zoomCoordinate.x, - this.zoomCoordinate.y, - this.zoomCoordinate.index - ); - // oldsize используется чтобы при смене ориентации экрана был небольшой скролл - var shiftX = this.Api.isMobileVersion - ? (oldsize.w - this.width) >> 1 - : 0; - var shiftY = this.Api.isMobileVersion - ? (oldsize.h - this.height) >> 1 - : 0; - var newScrollX = - this.scrollX + newPoint.x - this.zoomCoordinate.xShift + shiftX; - var newScrollY = - this.scrollY + newPoint.y - this.zoomCoordinate.yShift + shiftY; - newScrollX = Math.max(0, Math.min(newScrollX, this.scrollMaxX)); - newScrollY = Math.max(0, Math.min(newScrollY, this.scrollMaxY)); - if (this.scrollY == 0 && !this.Api.isMobileVersion) newScrollY = 0; - - this.m_oScrollVerApi.scrollToY(newScrollY); - this.m_oScrollHorApi.scrollToX(newScrollX); - } - - if (this.thumbnails) this.thumbnails.resize(); - - if (true !== isDisablePaint) this.timerSync(); - - if (this.Api.WordControl.MobileTouchManager) - this.Api.WordControl.MobileTouchManager.Resize(); - - if (!this.Api.isMobileVersion || !this.skipClearZoomCoord) - this.clearZoomCoord(); - }; - - this.onLoadModule = function () { - this.moduleState = ModuleState.Loaded; - window["AscViewer"]["InitializeFonts"]( - this.Api.baseFontsPath !== undefined - ? this.Api.baseFontsPath - : undefined - ); - - if (this._fileData != null) { - this.open(this._fileData); - delete this._fileData; - } - }; - - this.checkModule = function () { - if (this.moduleState == ModuleState.Loaded) { - // все загружено - ок - return true; - } - - if (this.moduleState == ModuleState.Loading) { - // загружается - return false; - } - - this.moduleState = ModuleState.Loading; - - var scriptElem = document.createElement("script"); - scriptElem.onerror = function () { - // TODO: пробуем грузить несколько раз - }; - - var _t = this; - window["AscViewer"]["onLoadModule"] = function () { - _t.onLoadModule(); - }; - - var basePath = window["AscViewer"]["baseEngineUrl"]; - - var useWasm = false; - var webAsmObj = window["WebAssembly"]; - if (typeof webAsmObj === "object") { - if (typeof webAsmObj["Memory"] === "function") { - if ( - typeof webAsmObj["instantiateStreaming"] === "function" || - typeof webAsmObj["instantiate"] === "function" - ) - useWasm = true; - } - } - - console.log({ basePath, useWasm }); - - var src = basePath; - console.log({ src }); - - if (useWasm) src += "drawingfile.js"; - else src += "drawingfile_ie.js"; - - scriptElem.setAttribute("src", src); - scriptElem.setAttribute("type", "text/javascript"); - // document.getElementsByTagName("head")[0].appendChild(scriptElem); - - return false; - }; - - this.onUpdatePages = function (pages) { - if (this.startVisiblePage < 0 || this.endVisiblePage < 0) return false; - - var isRepaint = false; - for (var i = 0, len = pages.length; i < len; i++) { - if ( - pages[i] >= this.startVisiblePage && - pages[i] <= this.endVisiblePage - ) { - isRepaint = true; - break; - } - } - - this.paint(); - - if (this.Api && this.Api.printPreview) this.Api.printPreview.update(); - }; - - this.onUpdateStatistics = function ( - countParagraph, - countWord, - countSymbol, - countSpace - ) { - this.statistics.paragraph += countParagraph; - this.statistics.words += countWord; - this.statistics.symbols += countSymbol; - this.statistics.spaces += countSpace; - - if (this.statistics.process) { - this.Api.sync_DocInfoCallback({ - PageCount: this.getPagesCount(), - WordsCount: this.statistics.words, - ParagraphCount: this.statistics.paragraph, - SymbolsCount: this.statistics.symbols, - SymbolsWSCount: this.statistics.symbols + this.statistics.spaces, - }); - } - }; - - this.startStatistics = function () { - this.statistics.process = true; - }; - - this.endStatistics = function () { - this.statistics.process = false; - }; - - this.checkLoadCMap = function () { - if (false === this.isCMapLoading) { - if (!this.file.isNeedCMap()) { - this.onDocumentReady(); - return; - } - - this.isCMapLoading = true; - - this.cmap_load_index = 0; - this.cmap_load_max = 3; - } - - var xhr = new XMLHttpRequest(); - let urlCmap = "../../../../sdkjs/pdf/src/engine/cmap.bin"; - if (this.Api.isSeparateModule === true) - urlCmap = window["AscViewer"]["baseEngineUrl"] + "cmap.bin"; - - xhr.open("GET", urlCmap, true); - xhr.responseType = "arraybuffer"; - - if (xhr.overrideMimeType) - xhr.overrideMimeType("text/plain; charset=x-user-defined"); - else xhr.setRequestHeader("Accept-Charset", "x-user-defined"); - - var _t = this; - xhr.onload = function () { - if (this.status === 200 || location.href.indexOf("file:") == 0) { - _t.isCMapLoading = false; - _t.file.setCMap(new Uint8Array(this.response)); - _t.onDocumentReady(); - } - }; - xhr.onerror = function () { - _t.cmap_load_index++; - if (_t.cmap_load_index < _t.cmap_load_max) { - _t.checkLoadCMap(); - return; - } - - // error! - _t.isCMapLoading = false; - _t.onDocumentReady(); - }; - - xhr.send(null); - }; - - this.onDocumentReady = function () { - var _t = this; - // в интерфейсе есть проблема - нужно посылать onDocumentContentReady после setAdvancedOptions - setTimeout(function () { - if (!_t.isStarted) { - AscCommon.addMouseEvent(_t.canvas, "down", _t.onMouseDown); - AscCommon.addMouseEvent(_t.canvas, "move", _t.onMouseMove); - AscCommon.addMouseEvent(_t.canvas, "up", _t.onMouseUp); - - _t.parent.onmousewheel = _t.onMouseWhell; - if (_t.parent.addEventListener) - _t.parent.addEventListener( - "DOMMouseScroll", - _t.onMouseWhell, - false - ); - - _t.startTimer(); - } - - _t.sendEvent("onFileOpened"); - - _t.sendEvent("onPagesCount", _t.file.pages.length); - _t.sendEvent("onCurrentPageChanged", 0); - - _t.sendEvent("onStructure", _t.structure); - }, 0); - - this.file.onRepaintPages = this.onUpdatePages.bind(this); - this.file.onUpdateStatistics = this.onUpdateStatistics.bind(this); - this.currentPage = -1; - this.structure = this.file.getStructure(); - - this.resize(true); - - if (this.thumbnails) this.thumbnails.init(this); - - this.setMouseLockMode(true); - }; - - this.open = function (data, password) { - if (!this.checkModule()) { - this._fileData = data; - return; - } - - if (undefined !== password) { - if (!this.file) { - this.file = window["AscViewer"].createFile(data); - - if (this.file) { - this.SearchResults = this.file.SearchResults; - this.file.viewer = this; - } - } - - if (this.file && this.file.isNeedPassword()) { - window["AscViewer"].setFilePassword(this.file, password); - this.Api.currentPassword = password; - } - } else { - if (this.file) this.close(); - - this.file = window["AscViewer"].createFile(data); - - if (this.file) { - this.SearchResults = this.file.SearchResults; - this.file.viewer = this; - } - } - - if (!this.file) { - this.Api.sendEvent( - "asc_onError", - Asc.c_oAscError.ID.ConvertationOpenError, - Asc.c_oAscError.Level.Critical - ); - return; - } - - var _t = this; - if (this.file.isNeedPassword()) { - // при повторном вводе пароля - проблемы в интерфейсе, если синхронно - setTimeout(function () { - _t.sendEvent("onNeedPassword"); - }, 100); - return; - } - - if (window["AscDesktopEditor"]) this.savedPassword = password; - - this.pagesInfo.setCount(this.file.pages.length); - this.checkLoadCMap(); - }; - - this.close = function () { - this.file.close(); - - this.structure = null; - this.currentPage = -1; - - this.startVisiblePage = -1; - this.endVisiblePage = -1; - this.pagesInfo = new CDocumentPagesInfo(); - this.drawingPages = []; - - this.statistics = { - paragraph: 0, - words: 0, - symbols: 0, - spaces: 0, - process: false, - }; - - this._paint(); - }; - - this.getFileNativeBinary = function () { - if (!this.file || !this.file.isValid()) return null; - return this.file.getFileBinary(); - }; - - this.setZoom = function (value) { - var oldZoom = this.zoom; - this.zoom = value; - this.zoomMode = ZoomMode.Custom; - this.sendEvent("onZoom", this.zoom); - this.resize(oldZoom); - }; - this.setZoomMode = function (value) { - this.zoomMode = value; - this.resize(); - }; - this.calculateZoomToWidth = function () { - if (!this.file || !this.file.isValid()) return 1; - - var maxWidth = 0; - for (let i = 0, len = this.file.pages.length; i < len; i++) { - var pageW = (this.file.pages[i].W * 96) / this.file.pages[i].Dpi; - if (pageW > maxWidth) maxWidth = pageW; - } - - if (maxWidth < 1) return 1; - - return (this.width - 2 * this.betweenPages) / maxWidth; - }; - this.calculateZoomToHeight = function () { - if (!this.file || !this.file.isValid()) return 1; - - var maxHeight = 0; - var maxWidth = 0; - for (let i = 0, len = this.file.pages.length; i < len; i++) { - var pageW = (this.file.pages[i].W * 96) / this.file.pages[i].Dpi; - var pageH = (this.file.pages[i].H * 96) / this.file.pages[i].Dpi; - if (pageW > maxWidth) maxWidth = pageW; - if (pageH > maxHeight) maxHeight = pageH; - } - - if (maxWidth < 1 || maxHeight < 1) return 1; - - var zoom1 = (this.width - 2 * this.betweenPages) / maxWidth; - var zoom2 = (this.height - 2 * this.betweenPages) / maxHeight; - - return Math.min(zoom1, zoom2); - }; - this.fixZoomCoord = function (x, y) { - if (this.Api.isMobileVersion) { - x -= this.x; - y -= this.y; - } - this.zoomCoordinate = this.getPageByCoords2(x, y); - if (this.zoomCoordinate) { - this.zoomCoordinate.xShift = x; - this.zoomCoordinate.yShift = y; - } - }; - - this.clearZoomCoord = function () { - // нужно очищать, чтобы при любом ресайзе мы не скролились к последней сохранённой точке - this.zoomCoordinate = null; - }; - - this.getFirstPagePosition = function () { - let lPagesCount = this.drawingPages.length; - for (let i = 0; i < lPagesCount; i++) { - let page = this.drawingPages[i]; - if (page.Y + page.H > this.scrollY) { - return { - page: i, - x: page.X, - y: page.Y, - scrollX: this.scrollX, - scrollY: this.scrollY, - }; - } - } - return null; - }; - - this.setMouseLockMode = function (isEnabled) { - this.MouseHandObject = isEnabled ? {} : null; - }; - - this.getPagesCount = function () { - if (!this.file || !this.file.isValid()) return 0; - return this.file.pages.length; - }; - - this.getDocumentInfo = function () { - if (!this.file || !this.file.isValid()) return 0; - return this.file.getDocumentInfo(); - }; - - this.navigate = function (id) { - var item = this.structure[id]; - if (!item) return; - - var pageIndex = item["page"]; - var drawingPage = this.drawingPages[pageIndex]; - if (!drawingPage) return; - - var posY = drawingPage.Y; - posY -= this.betweenPages; - - var yOffset = item["y"]; - if (yOffset) { - yOffset *= drawingPage.H / this.file.pages[pageIndex].H; - yOffset = yOffset >> 0; - posY += yOffset; - } - - if (posY > this.scrollMaxY) posY = this.scrollMaxY; - this.m_oScrollVerApi.scrollToY(posY); - }; - - this.navigateToPage = function (pageNum, yOffset) { - var drawingPage = this.drawingPages[pageNum]; - if (!drawingPage) return; - - var posY = drawingPage.Y; - posY -= this.betweenPages; - - if (yOffset) { - yOffset *= drawingPage.H / this.file.pages[pageNum].H; - yOffset = yOffset >> 0; - posY += yOffset; - } - - if (posY > this.scrollMaxY) posY = this.scrollMaxY; - this.m_oScrollVerApi.scrollToY(posY); - }; - - this.navigateToLink = function (link) { - if ("" === link["link"]) return; - - if ("#" === link["link"].charAt(0)) { - this.navigateToPage(parseInt(link["link"].substring(1)), link["dest"]); - } else { - var url = link["link"]; - var typeUrl = AscCommon.getUrlType(url); - url = AscCommon.prepareUrl(url, typeUrl); - this.sendEvent("onHyperlinkClick", url); - } - - //console.log(link["link"]); - }; - - this.setTargetType = function (type) { - this.setMouseLockMode(type == "hand"); - }; - - this.updateCurrentPage = function (pageObject) { - if (this.currentPage != pageObject.num) { - this.currentPage = pageObject.num; - this.sendEvent("onCurrentPageChanged", this.currentPage); - } - - if (this.thumbnails) this.thumbnails.updateCurrentPage(pageObject); - }; - - this.recalculatePlaces = function () { - if (!this.file || !this.file.isValid()) return; - - // здесь картинки не обнуляем - for (let i = 0, len = this.file.pages.length; i < len; i++) { - if (!this.drawingPages[i]) { - this.drawingPages[i] = { - X: 0, - Y: 0, - W: - ((this.file.pages[i].W * 96 * this.zoom) / - this.file.pages[i].Dpi) >> - 0, - H: - ((this.file.pages[i].H * 96 * this.zoom) / - this.file.pages[i].Dpi) >> - 0, - Image: undefined, - }; - } else { - this.drawingPages[i].X = 0; - this.drawingPages[i].Y = 0; - this.drawingPages[i].W = - ((this.file.pages[i].W * 96 * this.zoom) / - this.file.pages[i].Dpi) >> - 0; - this.drawingPages[i].H = - ((this.file.pages[i].H * 96 * this.zoom) / - this.file.pages[i].Dpi) >> - 0; - } - } - - this.documentWidth = 0; - for (let i = 0, len = this.drawingPages.length; i < len; i++) { - if (this.drawingPages[i].W > this.documentWidth) - this.documentWidth = this.drawingPages[i].W; - } - // прибавим немного - this.documentWidth += (4 * AscCommon.AscBrowser.retinaPixelRatio) >> 0; - - var curTop = this.betweenPages; - for (let i = 0, len = this.drawingPages.length; i < len; i++) { - this.drawingPages[i].X = - (this.documentWidth - this.drawingPages[i].W) >> 1; - this.drawingPages[i].Y = curTop; - - curTop += this.drawingPages[i].H; - curTop += this.betweenPages; - } - - this.documentHeight = curTop; - this.paint(); - }; - - this.setCursorType = function (cursor) { - if (this.isXP) { - this.canvas.style.cursor = AscCommon.g_oHtmlCursor.value(cursor); - return; - } - - this.canvas.style.cursor = cursor; - }; - - this.getPageLinkByMouse = function () { - var pageObject = this.getPageByCoords( - AscCommon.global_mouseEvent.X - this.x, - AscCommon.global_mouseEvent.Y - this.y - ); - if (!pageObject) return null; - - var pageLinks = this.pagesInfo.pages[pageObject.index]; - if (pageLinks.links) { - for (var i = 0, len = pageLinks.links.length; i < len; i++) { - if ( - pageObject.x >= pageLinks.links[i]["x"] && - pageObject.x <= pageLinks.links[i]["x"] + pageLinks.links[i]["w"] && - pageObject.y >= pageLinks.links[i]["y"] && - pageObject.y <= pageLinks.links[i]["y"] + pageLinks.links[i]["h"] - ) { - return pageLinks.links[i]; - } - } - } - return null; - }; - - this.onMouseDown = function (e) { - oThis.isFocusOnThumbnails = false; - AscCommon.stopEvent(e); - - var mouseButton = AscCommon.getMouseButton(e || {}); - if (mouseButton !== 0) { - if (2 === mouseButton) { - var posX = e.pageX || e.clientX; - var posY = e.pageY || e.clientY; - - var x = posX - oThis.x; - var y = posY - oThis.y; - - var isInSelection = false; - if (oThis.overlay.m_oContext) { - var pixX = AscCommon.AscBrowser.convertToRetinaValue(x, true); - var pixY = AscCommon.AscBrowser.convertToRetinaValue(y, true); - - if ( - pixX >= 0 && - pixY >= 0 && - pixX < oThis.canvasOverlay.width && - pixY < oThis.canvasOverlay.height - ) { - var pixelOnOverlay = oThis.overlay.m_oContext.getImageData( - pixX, - pixY, - 1, - 1 - ); - if ( - Math.abs(pixelOnOverlay.data[0] - 51) < 10 && - Math.abs(pixelOnOverlay.data[1] - 102) < 10 && - Math.abs(pixelOnOverlay.data[2] - 204) < 10 - ) { - isInSelection = true; - } - } - } - - if (isInSelection) { - oThis.Api.sync_BeginCatchSelectedElements(); - oThis.Api.sync_ChangeLastSelectedElement( - Asc.c_oAscTypeSelectElement.Text, - undefined - ); - oThis.Api.sync_EndCatchSelectedElements(); - - oThis.Api.sync_ContextMenuCallback({ - Type: Asc.c_oAscContextMenuTypes.Common, - X_abs: x, - Y_abs: y, - }); - } else { - oThis.Api.sync_BeginCatchSelectedElements(); - oThis.Api.sync_EndCatchSelectedElements(); - oThis.removeSelection(); - oThis.Api.sendEvent("asc_onContextMenu", undefined); - } - } - return; - } - - oThis.isMouseDown = true; - - if (!oThis.file || !oThis.file.isValid()) return; - - AscCommon.check_MouseDownEvent(e, true); - AscCommon.global_mouseEvent.LockMouse(); - - oThis.mouseDownCoords.X = AscCommon.global_mouseEvent.X; - oThis.mouseDownCoords.Y = AscCommon.global_mouseEvent.Y; - - oThis.isMouseMoveBetweenDownUp = false; - oThis.mouseDownLinkObject = oThis.getPageLinkByMouse(); - - // нажали мышь - запомнили координаты и находимся ли на ссылке - // при выходе за epsilon на mouseMove - сэмулируем нажатие - // так что тут только курсор - - var cursorType; - if (oThis.mouseDownLinkObject) cursorType = "pointer"; - else { - if (oThis.MouseHandObject) cursorType = "grabbing"; - else cursorType = "default"; - } - - oThis.setCursorType(cursorType); - - if (!oThis.MouseHandObject && !oThis.mouseDownLinkObject) { - // ждать смысла нет - oThis.isMouseMoveBetweenDownUp = true; - oThis.onMouseDownEpsilon(); - } - }; - - this.onMouseDownEpsilon = function () { - if (oThis.MouseHandObject) { - if (oThis.mouseDownLinkObject) { - // если нажали на ссылке - то не зажимаем лапу - oThis.setCursorType("pointer"); - return; - } - // режим лапы. просто начинаем режим Active - зажимаем лапу - oThis.setCursorType("grabbing"); - oThis.MouseHandObject.X = oThis.mouseDownCoords.X; - oThis.MouseHandObject.Y = oThis.mouseDownCoords.Y; - oThis.MouseHandObject.Active = true; - oThis.MouseHandObject.ScrollX = oThis.scrollX; - oThis.MouseHandObject.ScrollY = oThis.scrollY; - return; - } - - var pageObjectLogic = this.getPageByCoords2( - oThis.mouseDownCoords.X - oThis.x, - oThis.mouseDownCoords.Y - oThis.y - ); - this.file.onMouseDown( - pageObjectLogic.index, - pageObjectLogic.x, - pageObjectLogic.y - ); - - if ( - -1 === this.timerScrollSelect && - AscCommon.global_mouseEvent.IsLocked - ) { - this.timerScrollSelect = setInterval(this.selectWheel, 20); - } - }; - - this.onMouseUp = function (e) { - oThis.isFocusOnThumbnails = false; - if (e && e.preventDefault) e.preventDefault(); - - var mouseButton = AscCommon.getMouseButton(e || {}); - if (mouseButton !== 0) return; - - oThis.isMouseDown = false; - - if (!oThis.file || !oThis.file.isValid()) return; - - if (!e) { - // здесь - имитируем моус мув --------------------------- - e = {}; - e.pageX = AscCommon.global_mouseEvent.X; - e.pageY = AscCommon.global_mouseEvent.Y; - - e.clientX = AscCommon.global_mouseEvent.X; - e.clientY = AscCommon.global_mouseEvent.Y; - - e.altKey = AscCommon.global_mouseEvent.AltKey; - e.shiftKey = AscCommon.global_mouseEvent.ShiftKey; - e.ctrlKey = AscCommon.global_mouseEvent.CtrlKey; - e.metaKey = AscCommon.global_mouseEvent.CtrlKey; - - e.srcElement = AscCommon.global_mouseEvent.Sender; - // ------------------------------------------------------ - - AscCommon.Window_OnMouseUp(e); - } - - AscCommon.check_MouseUpEvent(e); - - if (oThis.MouseHandObject) { - if (oThis.mouseDownLinkObject) { - // смотрим - если совпало со ссылкой при нажатии - то переходим по ней - var mouseUpLinkObject = oThis.getPageLinkByMouse(); - if (mouseUpLinkObject === oThis.mouseDownLinkObject) { - oThis.navigateToLink(mouseUpLinkObject); - } - - // если нет - то ничего не делаем - if (mouseUpLinkObject) oThis.setCursorType("pointer"); - else oThis.setCursorType("grab"); - } else if (!oThis.isMouseMoveBetweenDownUp) { - oThis.setCursorType("grab"); - - // делаем клик в логическом документе, чтобы сбросить селект, если он был - var pageObjectLogic = oThis.getPageByCoords2( - AscCommon.global_mouseEvent.X - oThis.x, - AscCommon.global_mouseEvent.Y - oThis.y - ); - oThis.file.onMouseDown( - pageObjectLogic.index, - pageObjectLogic.x, - pageObjectLogic.y - ); - oThis.file.onMouseUp( - pageObjectLogic.index, - pageObjectLogic.x, - pageObjectLogic.y - ); - } else { - oThis.setCursorType("grab"); - } - - oThis.isMouseMoveBetweenDownUp = false; - oThis.MouseHandObject.Active = false; - oThis.mouseDownLinkObject = null; - return; - } - - if (oThis.mouseDownLinkObject) { - // значит не уходили с ссылки - // проверим - остались ли на ней - var mouseUpLinkObject = oThis.getPageLinkByMouse(); - if (mouseUpLinkObject === oThis.mouseDownLinkObject) { - oThis.navigateToLink(mouseUpLinkObject); - } - } - - // если было нажатие - то отжимаем - if (oThis.isMouseMoveBetweenDownUp) oThis.file.onMouseUp(); - - oThis.isMouseMoveBetweenDownUp = false; - oThis.mouseDownLinkObject = null; - - if (-1 !== oThis.timerScrollSelect) { - clearInterval(oThis.timerScrollSelect); - oThis.timerScrollSelect = -1; - } - }; - - this.onMouseMove = function (e) { - if (!oThis.file || !oThis.file.isValid()) return; - - AscCommon.check_MouseMoveEvent(e); - if (e && e.preventDefault) e.preventDefault(); - - // если мышка нажата и еще не вышли за eps - то проверяем, модет вышли сейчас? - // и, если вышли - то эмулируем - if (oThis.isMouseDown && !oThis.isMouseMoveBetweenDownUp) { - var offX = Math.abs( - oThis.mouseDownCoords.X - AscCommon.global_mouseEvent.X - ); - var offY = Math.abs( - oThis.mouseDownCoords.Y - AscCommon.global_mouseEvent.Y - ); - - if (offX > oThis.mouseMoveEpsilon || offY > oThis.mouseMoveEpsilon) { - oThis.isMouseMoveBetweenDownUp = true; - oThis.onMouseDownEpsilon(); - } - } - - if (oThis.MouseHandObject) { - if (oThis.MouseHandObject.Active) { - // двигаем рукой - oThis.setCursorType("grabbing"); - - var scrollX = AscCommon.global_mouseEvent.X - oThis.MouseHandObject.X; - var scrollY = AscCommon.global_mouseEvent.Y - oThis.MouseHandObject.Y; - - if (0 != scrollX && oThis.isVisibleHorScroll) { - var pos = oThis.MouseHandObject.ScrollX - scrollX; - if (pos < 0) pos = 0; - if (pos > oThis.scrollMaxX) pos = oThis.scrollMaxX; - oThis.m_oScrollHorApi.scrollToX(pos); - } - if (0 != scrollY) { - var pos = oThis.MouseHandObject.ScrollY - scrollY; - if (pos < 0) pos = 0; - if (pos > oThis.scrollMaxY) pos = oThis.scrollMaxY; - oThis.m_oScrollVerApi.scrollToY(pos); - } - - return; - } else { - if (oThis.isMouseDown) { - if (oThis.mouseDownLinkObject) { - // не меняем курсор с "ссылочного", если зажимали на ссылке - oThis.setCursorType("pointer"); - } else { - // даже если не двигали еще и ждем eps, все равно курсор меняем на зажатый - oThis.setCursorType("grabbing"); - } - } else { - // просто водим мышкой - тогда смотрим, на ссылке или нет, чтобы выставить курсор - var mouseMoveLinkObject = oThis.getPageLinkByMouse(); - if (mouseMoveLinkObject) oThis.setCursorType("pointer"); - else oThis.setCursorType("grab"); - } - } - return; - } else { - if (oThis.mouseDownLinkObject) { - // селект начат на ссылке. смотрим, нужно ли начать реально селект - if (oThis.isMouseMoveBetweenDownUp) { - // вышли за eps - oThis.mouseDownLinkObject = null; - oThis.setCursorType("default"); - } else { - oThis.setCursorType("pointer"); - } - } - - if (oThis.isMouseDown) { - if (oThis.isMouseMoveBetweenDownUp) { - // нажатая мышка - курсор всегда default (так как за eps вышли) - oThis.setCursorType("default"); - - var pageObjectLogic = oThis.getPageByCoords2( - AscCommon.global_mouseEvent.X - oThis.x, - AscCommon.global_mouseEvent.Y - oThis.y - ); - oThis.file.onMouseMove( - pageObjectLogic.index, - pageObjectLogic.x, - pageObjectLogic.y - ); - } else { - // пока на ссылке - oThis.setCursorType("pointer"); - } - } else { - var mouseMoveLinkObject = oThis.getPageLinkByMouse(); - if (mouseMoveLinkObject) oThis.setCursorType("pointer"); - else oThis.setCursorType("default"); - } - } - return false; - }; - - this.onMouseWhell = function (e) { - if (!oThis.file || !oThis.file.isValid()) return; - - if (oThis.MouseHandObject && oThis.MouseHandObject.IsActive) return; - - var _ctrl = false; - if (e.metaKey !== undefined) _ctrl = e.ctrlKey || e.metaKey; - else _ctrl = e.ctrlKey; - - AscCommon.stopEvent(e); - - if (true === _ctrl) { - return false; - } - - var delta = 0; - var deltaX = 0; - var deltaY = 0; - - if (undefined != e.wheelDelta && e.wheelDelta != 0) { - //delta = (e.wheelDelta > 0) ? -45 : 45; - delta = (-45 * e.wheelDelta) / 120; - } else if (undefined != e.detail && e.detail != 0) { - //delta = (e.detail > 0) ? 45 : -45; - delta = (45 * e.detail) / 3; - } - - // New school multidimensional scroll (touchpads) deltas - deltaY = delta; - - if (oThis.isVisibleHorScroll) { - if (e.axis !== undefined && e.axis === e.HORIZONTAL_AXIS) { - deltaY = 0; - deltaX = delta; - } - - // Webkit - if (undefined !== e.wheelDeltaY && 0 !== e.wheelDeltaY) { - //deltaY = (e.wheelDeltaY > 0) ? -45 : 45; - deltaY = (-45 * e.wheelDeltaY) / 120; - } - if (undefined !== e.wheelDeltaX && 0 !== e.wheelDeltaX) { - //deltaX = (e.wheelDeltaX > 0) ? -45 : 45; - deltaX = (-45 * e.wheelDeltaX) / 120; - } - } - - deltaX >>= 0; - deltaY >>= 0; - - if (0 != deltaX) oThis.m_oScrollHorApi.scrollBy(deltaX, 0, false); - else if (0 != deltaY) oThis.m_oScrollVerApi.scrollBy(0, deltaY, false); - - // здесь - имитируем моус мув --------------------------- - var _e = {}; - _e.pageX = AscCommon.global_mouseEvent.X; - _e.pageY = AscCommon.global_mouseEvent.Y; - - _e.clientX = AscCommon.global_mouseEvent.X; - _e.clientY = AscCommon.global_mouseEvent.Y; - - _e.altKey = AscCommon.global_mouseEvent.AltKey; - _e.shiftKey = AscCommon.global_mouseEvent.ShiftKey; - _e.ctrlKey = AscCommon.global_mouseEvent.CtrlKey; - _e.metaKey = AscCommon.global_mouseEvent.CtrlKey; - - _e.srcElement = AscCommon.global_mouseEvent.Sender; - - oThis.onMouseMove(_e); - // ------------------------------------------------------ - - return false; - }; - - this.selectWheel = function () { - if (!oThis.file || !oThis.file.isValid()) return; - - if (oThis.MouseHandObject) return; - - var positionMinY = oThis.y; - var positionMaxY = oThis.y + oThis.height; - - var scrollYVal = 0; - if (AscCommon.global_mouseEvent.Y < positionMinY) { - var delta = 30; - if (20 > positionMinY - AscCommon.global_mouseEvent.Y) delta = 10; - - scrollYVal = -delta; - } else if (AscCommon.global_mouseEvent.Y > positionMaxY) { - var delta = 30; - if (20 > AscCommon.global_mouseEvent.Y - positionMaxY) delta = 10; - - scrollYVal = delta; - } - - var scrollXVal = 0; - if (oThis.isVisibleHorScroll) { - var positionMinX = oThis.x; - var positionMaxX = oThis.x + oThis.width; - - if (AscCommon.global_mouseEvent.X < positionMinX) { - var delta = 30; - if (20 > positionMinX - AscCommon.global_mouseEvent.X) delta = 10; - - scrollXVal = -delta; - } else if (AscCommon.global_mouseEvent.X > positionMaxX) { - var delta = 30; - if (20 > AscCommon.global_mouseEvent.X - positionMaxX) delta = 10; - - scrollXVal = delta; - } - } - - if (0 != scrollYVal) oThis.m_oScrollVerApi.scrollByY(scrollYVal, false); - if (0 != scrollXVal) oThis.m_oScrollHorApi.scrollByX(scrollXVal, false); - - if (scrollXVal != 0 || scrollYVal != 0) { - // здесь - имитируем моус мув --------------------------- - var _e = {}; - _e.pageX = AscCommon.global_mouseEvent.X; - _e.pageY = AscCommon.global_mouseEvent.Y; - - _e.clientX = AscCommon.global_mouseEvent.X; - _e.clientY = AscCommon.global_mouseEvent.Y; - - _e.altKey = AscCommon.global_mouseEvent.AltKey; - _e.shiftKey = AscCommon.global_mouseEvent.ShiftKey; - _e.ctrlKey = AscCommon.global_mouseEvent.CtrlKey; - _e.metaKey = AscCommon.global_mouseEvent.CtrlKey; - - _e.srcElement = AscCommon.global_mouseEvent.Sender; - - oThis.onMouseMove(_e); - // ------------------------------------------------------ - } - }; - - this.paint = function () { - this.isRepaint = true; - }; - - this.getStructure = function () { - if (!this.file || !this.file.isValid()) return null; - var res = this.file.structure(); - return res; - }; - - this.drawSearchPlaces = function (dKoefX, dKoefY, xDst, yDst, places) { - var rPR = 1; //AscCommon.AscBrowser.retinaPixelRatio; - var len = places.length; - - var ctx = this.overlay.m_oContext; - - for (var i = 0; i < len; i++) { - var place = places[i]; - if (undefined === place.Ex) { - var _x = (rPR * (xDst + dKoefX * place.X)) >> 0; - var _y = (rPR * (yDst + dKoefY * place.Y)) >> 0; - - var _w = (rPR * (dKoefX * place.W)) >> 0; - var _h = (rPR * (dKoefY * place.H)) >> 0; - - if (_x < this.overlay.min_x) this.overlay.min_x = _x; - if (_x + _w > this.overlay.max_x) this.overlay.max_x = _x + _w; - - if (_y < this.overlay.min_y) this.overlay.min_y = _y; - if (_y + _h > this.overlay.max_y) this.overlay.max_y = _y + _h; - - ctx.rect(_x, _y, _w, _h); - } else { - var _x1 = (rPR * (xDst + dKoefX * place.X)) >> 0; - var _y1 = (rPR * (yDst + dKoefY * place.Y)) >> 0; - - var x2 = place.X + place.W * place.Ex; - var y2 = place.Y + place.W * place.Ey; - var _x2 = (rPR * (xDst + dKoefX * x2)) >> 0; - var _y2 = (rPR * (yDst + dKoefY * y2)) >> 0; - - var x3 = x2 - place.H * place.Ey; - var y3 = y2 + place.H * place.Ex; - var _x3 = (rPR * (xDst + dKoefX * x3)) >> 0; - var _y3 = (rPR * (yDst + dKoefY * y3)) >> 0; - - var x4 = place.X - place.H * place.Ey; - var y4 = place.Y + place.H * place.Ex; - var _x4 = (rPR * (xDst + dKoefX * x4)) >> 0; - var _y4 = (rPR * (yDst + dKoefY * y4)) >> 0; - - this.overlay.CheckPoint(_x1, _y1); - this.overlay.CheckPoint(_x2, _y2); - this.overlay.CheckPoint(_x3, _y3); - this.overlay.CheckPoint(_x4, _y4); - - ctx.moveTo(_x1, _y1); - ctx.lineTo(_x2, _y2); - ctx.lineTo(_x3, _y3); - ctx.lineTo(_x4, _y4); - ctx.lineTo(_x1, _y1); - } - } - - ctx.fill(); - ctx.beginPath(); - }; - - this.drawSearchCur = function (pageIndex, places) { - var pageCoords = - this.pageDetector.pages[pageIndex - this.startVisiblePage]; - if (!pageCoords) return; - - var scale = this.file.pages[pageIndex].Dpi / 25.4; - var dKoefX = (scale * pageCoords.w) / this.file.pages[pageIndex].W; - var dKoefY = (scale * pageCoords.h) / this.file.pages[pageIndex].H; - - var ctx = this.overlay.m_oContext; - ctx.fillStyle = "rgba(51,102,204,255)"; - - this.drawSearchPlaces(dKoefX, dKoefY, pageCoords.x, pageCoords.y, places); - - ctx.fill(); - ctx.beginPath(); - }; - - this.drawSearch = function (pageIndex, searchingObj) { - var pageCoords = - this.pageDetector.pages[pageIndex - this.startVisiblePage]; - if (!pageCoords) return; - - var scale = this.file.pages[pageIndex].Dpi / 25.4; - var dKoefX = (scale * pageCoords.w) / this.file.pages[pageIndex].W; - var dKoefY = (scale * pageCoords.h) / this.file.pages[pageIndex].H; - - for (var i = 0; i < searchingObj.length; i++) { - this.drawSearchPlaces( - dKoefX, - dKoefY, - pageCoords.x, - pageCoords.y, - searchingObj[i] - ); - } - }; - - this.onUpdateOverlay = function () { - this.overlay.Clear(); - - if (!this.file) return; - - if (this.startVisiblePage < 0 || this.endVisiblePage < 0) return; - - // seletion - var ctx = this.overlay.m_oContext; - ctx.globalAlpha = 0.2; - - if (this.file.SearchResults.IsSearch) { - if (this.file.SearchResults.Show) { - ctx.globalAlpha = 0.5; - ctx.fillStyle = "rgba(255,200,0,1)"; - ctx.beginPath(); - - for (let i = this.startVisiblePage; i <= this.endVisiblePage; i++) { - var searchingObj = this.file.SearchResults.Pages[i]; - if (0 != searchingObj.length) this.drawSearch(i, searchingObj); - } - - ctx.fill(); - ctx.globalAlpha = 0.2; - } - ctx.beginPath(); - - if (this.CurrentSearchNavi && this.file.SearchResults.Show) { - var pageNum = this.CurrentSearchNavi[0].PageNum; - ctx.fillStyle = "rgba(51,102,204,255)"; - if ( - pageNum >= this.startVisiblePage && - pageNum <= this.endVisiblePage - ) { - this.drawSearchCur(pageNum, this.CurrentSearchNavi); - } - } - } - - //if (!this.MouseHandObject) - { - ctx.fillStyle = "rgba(51,102,204,255)"; - ctx.beginPath(); - - for (let i = this.startVisiblePage; i <= this.endVisiblePage; i++) { - var pageCoords = this.pageDetector.pages[i - this.startVisiblePage]; - this.file.drawSelection( - i, - this.overlay, - pageCoords.x, - pageCoords.y, - pageCoords.w, - pageCoords.h - ); - } - - ctx.fill(); - ctx.beginPath(); - } - ctx.globalAlpha = 1.0; - }; - - this._paint = function () { - if (!this.file || !this.file.isValid()) return; - - this.canvas.width = this.canvas.width; - let ctx = this.canvas.getContext("2d"); - ctx.strokeStyle = AscCommon.GlobalSkin.PageOutline; - let lineW = AscCommon.AscBrowser.retinaPixelRatio >> 0; - ctx.lineWidth = lineW; - - let yPos = this.scrollY >> 0; - let yMax = yPos + this.height; - let xCenter = this.width >> 1; - if (this.documentWidth > this.width) { - xCenter = ((this.documentWidth >> 1) - this.scrollX) >> 0; - } - - let lStartPage = -1; - let lEndPage = -1; - - let lPagesCount = this.drawingPages.length; - for (let i = 0; i < lPagesCount; i++) { - let page = this.drawingPages[i]; - let pageT = page.Y; - let pageB = page.Y + page.H; - - if (yPos < pageB && yMax > pageT) { - // страница на экране - - if (-1 == lStartPage) lStartPage = i; - lEndPage = i; - } else { - // страница не видна - выкидываем из кэша - if (page.Image) { - if (this.file.cacheManager) - this.file.cacheManager.unlock(page.Image); - - delete page.Image; - } - } - } - - this.pageDetector = new CCurrentPageDetector( - this.canvas.width, - this.canvas.height - ); - - this.startVisiblePage = lStartPage; - this.endVisiblePage = lEndPage; - - var isStretchPaint = this.Api.WordControl.NoneRepaintPages; - if (this.isClearPages) isStretchPaint = false; - - for (let i = lStartPage; i <= lEndPage; i++) { - // отрисовываем страницу - let page = this.drawingPages[i]; - if (!page) break; - - let w = (page.W * AscCommon.AscBrowser.retinaPixelRatio) >> 0; - let h = (page.H * AscCommon.AscBrowser.retinaPixelRatio) >> 0; - - if (!isStretchPaint) { - if (!this.file.cacheManager) { - if ( - this.isClearPages || - (page.Image && - (page.Image.requestWidth != w || page.Image.requestHeight != h)) - ) - delete page.Image; - } else { - if ( - this.isClearPages || - (page.Image && - (page.Image.requestWidth < w || page.Image.requestHeight < h)) - ) { - if (this.file.cacheManager) - this.file.cacheManager.unlock(page.Image); - - delete page.Image; - } - } - } - - if (!page.Image && !isStretchPaint) { - page.Image = this.file.getPage( - i, - w, - h, - undefined, - this.Api.isDarkMode ? 0x3a3a3a : 0xffffff - ); - if (this.Api.watermarkDraw) - this.Api.watermarkDraw.Draw(page.Image.getContext("2d"), w, h); - } - - let x = - ((xCenter * AscCommon.AscBrowser.retinaPixelRatio) >> 0) - (w >> 1); - let y = ((page.Y - yPos) * AscCommon.AscBrowser.retinaPixelRatio) >> 0; - - if (page.Image) { - ctx.drawImage( - page.Image, - 0, - 0, - page.Image.width, - page.Image.height, - x, - y, - w, - h - ); - this.pagesInfo.setPainted(i); - } else { - ctx.fillStyle = "#FFFFFF"; - ctx.fillRect(x, y, w, h); - } - ctx.strokeRect(x + lineW / 2, y + lineW / 2, w - lineW, h - lineW); - - this.pageDetector.addPage(i, x, y, w, h); - } - - this.isClearPages = false; - this.updateCurrentPage( - this.pageDetector.getCurrentPage(this.currentPage) - ); - }; - - this.checkPagesLinks = function () { - if (this.startVisiblePage < 0 || this.endVisiblePage < 0) return false; - - for (var i = this.startVisiblePage; i <= this.endVisiblePage; i++) { - var page = this.pagesInfo.pages[i]; - if (page.isPainted && null === page.links) { - page.links = this.file.getLinks(i); - return true; - } - } - - return false; - }; - - this.checkPagesText = function () { - if (this.startVisiblePage < 0 || this.endVisiblePage < 0) return false; - - if (this.isFullText) return; - - var pagesCount = this.file.pages.length; - var isCommands = false; - for (var i = this.startVisiblePage; i <= this.endVisiblePage; i++) { - if (null == this.file.pages[i].text) { - this.file.pages[i].text = this.file.getText(i); - isCommands = true; - } - } - - if (!isCommands) { - while (this.pagesInfo.countTextPages < pagesCount) { - // мы могли уже получить команды, так как видимые страницы в приоритете - if (null != this.file.pages[this.pagesInfo.countTextPages].text) { - this.pagesInfo.countTextPages++; - continue; - } - - this.file.pages[this.pagesInfo.countTextPages].text = - this.file.getText(this.pagesInfo.countTextPages); - if (null != this.file.pages[this.pagesInfo.countTextPages].text) { - this.pagesInfo.countTextPages++; - isCommands = true; - } - - break; - } - } - - if (this.pagesInfo.countTextPages === pagesCount) { - this.file.destroyText(); - - this.isFullText = true; - if (this.isFullTextMessage) this.unshowTextMessage(); - - if (this.statistics.process) { - this.endStatistics(); - this.Api.sync_GetDocInfoEndCallback(); - } - } - - return isCommands; - }; - - this.getPageByCoords = function (xInp, yInp) { - if (this.startVisiblePage < 0 || this.endVisiblePage < 0) return null; - - var x = xInp * AscCommon.AscBrowser.retinaPixelRatio; - var y = yInp * AscCommon.AscBrowser.retinaPixelRatio; - for (var i = this.startVisiblePage; i <= this.endVisiblePage; i++) { - var pageCoords = this.pageDetector.pages[i - this.startVisiblePage]; - if (!pageCoords) continue; - if ( - x >= pageCoords.x && - x <= pageCoords.x + pageCoords.w && - y >= pageCoords.y && - y <= pageCoords.y + pageCoords.h - ) { - return { - index: i, - x: (this.file.pages[i].W * (x - pageCoords.x)) / pageCoords.w, - y: (this.file.pages[i].H * (y - pageCoords.y)) / pageCoords.h, - }; - } - } - return null; - }; - - this.getPageByCoords2 = function (x, y) { - if (this.startVisiblePage < 0 || this.endVisiblePage < 0) return null; - - var pageCoords = null; - var pageIndex = 0; - for ( - pageIndex = this.startVisiblePage; - pageIndex <= this.endVisiblePage; - pageIndex++ - ) { - pageCoords = this.pageDetector.pages[pageIndex - this.startVisiblePage]; - if (pageCoords.y + pageCoords.h > y) break; - } - if (pageIndex > this.endVisiblePage) pageIndex = this.endVisiblePage; - - if (!pageCoords) pageCoords = { x: 0, y: 0, w: 1, h: 1 }; - - var pixToMM = 25.4 / this.file.pages[pageIndex].Dpi; - return { - index: pageIndex, - x: - (this.file.pages[pageIndex].W * - pixToMM * - (x * AscCommon.AscBrowser.retinaPixelRatio - pageCoords.x)) / - pageCoords.w, - y: - (this.file.pages[pageIndex].H * - pixToMM * - (y * AscCommon.AscBrowser.retinaPixelRatio - pageCoords.y)) / - pageCoords.h, - }; - }; - - this.ConvertCoordsToCursor = function (x, y, pageIndex) { - var dKoef = this.zoom * g_dKoef_mm_to_pix; - var rPR = 1; //AscCommon.AscBrowser.retinaPixelRatio; - let yPos = this.scrollY >> 0; - let xCenter = this.width >> 1; - if (this.documentWidth > this.width) { - xCenter = ((this.documentWidth >> 1) - this.scrollX) >> 0; - } - - let page = this.drawingPages[pageIndex]; - - let _w = (page.W * rPR) >> 0; - let _h = (page.H * rPR) >> 0; - let _x = ((xCenter * rPR) >> 0) - (_w >> 1); - let _y = ((page.Y - yPos) * rPR) >> 0; - - var x_pix = (_x + x * dKoef) >> 0; - var y_pix = (_y + y * dKoef) >> 0; - var w_pix = (_w * dKoef) >> 0; - var h_pix = (_h * dKoef) >> 0; - - return { x: x_pix, y: y_pix, w: w_pix, h: h_pix }; - }; - - this.Copy = function (_text_format) { - return this.file.copy(_text_format); - }; - this.selectAll = function () { - return this.file.selectAll(); - }; - this.removeSelection = function () { - var pageObjectLogic = this.getPageByCoords2( - AscCommon.global_mouseEvent.X - this.x, - AscCommon.global_mouseEvent.Y - this.y - ); - this.file.onMouseDown( - pageObjectLogic.index, - pageObjectLogic.x, - pageObjectLogic.y - ); - this.file.onMouseUp( - pageObjectLogic.index, - pageObjectLogic.x, - pageObjectLogic.y - ); - }; - - this.isCanCopy = function () { - // TODO: нужно прерываться после первого же символа - var text_format = { Text: "" }; - this.Copy(text_format); - text_format.Text = text_format.Text.replace(new RegExp("\n", "g"), ""); - return text_format.Text === "" ? false : true; - }; - - this.findText = function ( - text, - isMachingCase, - isWholeWords, - isNext, - callback - ) { - if (!this.isFullText) { - this.fullTextMessageCallbackArgs = [ - text, - isMachingCase, - isWholeWords, - isNext, - callback, - ]; - this.fullTextMessageCallback = function () { - this.file.findText( - this.fullTextMessageCallbackArgs[0], - this.fullTextMessageCallbackArgs[1], - this.fullTextMessageCallbackArgs[2], - this.fullTextMessageCallbackArgs[3] - ); - this.onUpdateOverlay(); - - if (this.fullTextMessageCallbackArgs[4]) - this.fullTextMessageCallbackArgs[4].call( - this.Api, - this.SearchResults.Current, - this.SearchResults.Count - ); - }; - this.showTextMessage(); - return true; // async - } - - this.file.findText(text, isMachingCase, isWholeWords, isNext); - this.onUpdateOverlay(); - return false; - }; - - this.ToSearchResult = function () { - var naviG = this.CurrentSearchNavi; - - var navi = naviG[0]; - var x = navi.X; - var y = navi.Y; - - if (navi.Transform) { - var xx = navi.Transform.TransformPointX(x, y); - var yy = navi.Transform.TransformPointY(x, y); - - x = xx; - y = yy; - } - - var drawingPage = this.drawingPages[navi.PageNum]; - if (!drawingPage) return; - - var offsetBorder = 30; - - var scale = this.file.pages[navi.PageNum].Dpi / 25.4; - var dKoefX = (scale * drawingPage.W) / this.file.pages[navi.PageNum].W; - var dKoefY = (scale * drawingPage.H) / this.file.pages[navi.PageNum].H; - - var nX = drawingPage.X + dKoefX * x; - var nY = drawingPage.Y + dKoefY * y; - var nY2 = drawingPage.Y + dKoefY * (y + navi.H); - - if (this.m_oScrollHorApi) nX -= this.m_oScrollHorApi.scrollHCurrentX; - nY -= this.m_oScrollVerApi.scrollVCurrentY; - nY2 -= this.m_oScrollVerApi.scrollVCurrentY; - - var boxX = 0; - var boxY = 0; - var boxR = this.width; - var boxB = this.height; - - var nValueScrollHor = 0; - if (nX < boxX) { - nValueScrollHor = nX - boxX - offsetBorder; - } - if (nX > boxR) { - nValueScrollHor = nX - boxR + offsetBorder; - } - - var nValueScrollVer = 0; - if (nY < boxY) { - nValueScrollVer = nY - boxY - offsetBorder; - } - if (nY2 > boxB) { - nValueScrollVer = nY2 - boxB + offsetBorder; - } - - if (0 !== nValueScrollHor) { - this.m_bIsUpdateTargetNoAttack = true; - this.m_oScrollHorApi.scrollByX(nValueScrollHor); - } - if (0 !== nValueScrollVer) { - this.m_oScrollVerApi.scrollByY(nValueScrollVer); - } - }; - - this.SelectSearchElement = function (elmId) { - var nSearchedId = 0, - nPage; - var nMatchesCount = 0; - for (nPage = 0; nPage < this.SearchResults.Pages.length; nPage++) { - for ( - var nMatch = 0; - nMatch < this.SearchResults.Pages[nPage].length; - nMatch++ - ) { - nMatchesCount++; - - if (nMatchesCount - 1 == elmId) { - nSearchedId = nMatch; - break; - } - } - if (nMatchesCount - 1 == elmId) { - nSearchedId = nMatch; - break; - } - } - - this.CurrentSearchNavi = this.SearchResults.Pages[nPage][nSearchedId]; - this.SearchResults.CurrentPage = nPage; - this.SearchResults.Current = nSearchedId; - this.SearchResults.CurMatchIdx = elmId; - this.ToSearchResult(); - this.onUpdateOverlay(); - this.Api.sync_setSearchCurrent(elmId, this.SearchResults.Count); - }; - - this.OnKeyDown = function (e) { - var bRetValue = false; - - if (e.KeyCode == 33) { - // PgUp - this.m_oScrollVerApi.scrollByY(-this.height, false); - this.timerSync(); - } else if (e.KeyCode == 34) { - // PgDn - this.m_oScrollVerApi.scrollByY(this.height, false); - this.timerSync(); - } else if (e.KeyCode == 35) { - // End - if (true === e.CtrlKey) { - // Ctrl + End - this.m_oScrollVerApi.scrollToY( - this.m_oScrollVerApi.maxScrollY, - false - ); - } - this.timerSync(); - bRetValue = true; - } else if (e.KeyCode == 36) { - // клавиша Home - if (true === e.CtrlKey) { - // Ctrl + Home - this.m_oScrollVerApi.scrollToY(0, false); - } - this.timerSync(); - bRetValue = true; - } else if (e.KeyCode == 37) { - // Left Arrow - if (!this.isFocusOnThumbnails && this.isVisibleHorScroll) { - this.m_oScrollHorApi.scrollByX(-40); - } else if (this.isFocusOnThumbnails) { - if (this.currentPage > 0) this.navigateToPage(this.currentPage - 1); - } - bRetValue = true; - } else if (e.KeyCode == 38) { - // Top Arrow - if (!this.isFocusOnThumbnails) { - this.m_oScrollVerApi.scrollByY(-40); - } else { - var nextPage = -1; - if (this.thumbnails) - nextPage = this.currentPage - this.thumbnails.countPagesInBlock; - if (nextPage < 0) nextPage = this.currentPage - 1; - - if (nextPage >= 0) this.navigateToPage(nextPage); - } - bRetValue = true; - } else if (e.KeyCode == 39) { - // Right Arrow - if (!this.isFocusOnThumbnails && this.isVisibleHorScroll) { - this.m_oScrollHorApi.scrollByX(40); - } else if (this.isFocusOnThumbnails) { - if (this.currentPage < this.getPagesCount() - 1) - this.navigateToPage(this.currentPage + 1); - } - bRetValue = true; - } else if (e.KeyCode == 40) { - // Bottom Arrow - if (!this.isFocusOnThumbnails) { - this.m_oScrollVerApi.scrollByY(40); - } else { - var pagesCount = this.getPagesCount(); - var nextPage = pagesCount; - if (this.thumbnails) { - nextPage = this.currentPage + this.thumbnails.countPagesInBlock; - if (nextPage >= pagesCount) nextPage = pagesCount - 1; - } - if (nextPage >= pagesCount) nextPage = this.currentPage + 1; - - if (nextPage < pagesCount) this.navigateToPage(nextPage); - } - bRetValue = true; - } else if (e.KeyCode == 65 && true === e.CtrlKey) { - // Ctrl + A - bRetValue = true; - if (this.isFullTextMessage) return bRetValue; - - if (!this.isFullText) { - this.fullTextMessageCallbackArgs = []; - this.fullTextMessageCallback = function () { - this.file.selectAll(); - }; - this.showTextMessage(); - } else { - this.file.selectAll(); - } - } else if (e.KeyCode == 80 && true === e.CtrlKey) { - // Ctrl + P + ... - this.Api.onPrint(); - bRetValue = true; - } else if (e.KeyCode == 83 && true === e.CtrlKey) { - // Ctrl + S + ... - // nothing - bRetValue = true; - } - - return bRetValue; - }; - - this.showTextMessage = function () { - if (this.isFullTextMessage) return; - - this.isFullTextMessage = true; - this.Api.sync_StartAction( - Asc.c_oAscAsyncActionType.BlockInteraction, - Asc.c_oAscAsyncAction.Waiting - ); - }; - - this.unshowTextMessage = function () { - this.isFullTextMessage = false; - this.Api.sync_EndAction( - Asc.c_oAscAsyncActionType.BlockInteraction, - Asc.c_oAscAsyncAction.Waiting - ); - - if (this.fullTextMessageCallback) { - this.fullTextMessageCallback.apply( - this, - this.fullTextMessageCallbackArgs - ); - this.fullTextMessageCallback = null; - this.fullTextMessageCallbackArgs = null; - } - }; - - this.getTextCommandsSize = function () { - var result = 0; - for (var i = 0; i < this.file.pages.length; i++) { - if (this.file.pages[i].text) result += this.file.pages[i].text.length; - } - return result; - }; - - this.createComponents(); - } - - function CCurrentPageDetector(w, h) { - // размеры окна - this.width = w; - this.height = h; - - this.pages = []; - } - CCurrentPageDetector.prototype.addPage = function (num, x, y, w, h) { - this.pages.push({ num: num, x: x, y: y, w: w, h: h }); - }; - CCurrentPageDetector.prototype.getCurrentPage = function (currentPage) { - var count = this.pages.length; - var visibleH = 0; - var page, currentVisibleH; - var pageNum = 0; - for (var i = 0; i < count; i++) { - page = this.pages[i]; - currentVisibleH = - Math.min(this.height, page.y + page.h) - Math.max(0, page.y); - if (currentVisibleH == page.h) { - // первая полностью видимая страница - pageNum = i; - break; - } - - if (currentVisibleH > visibleH) { - visibleH = currentVisibleH; - pageNum = i; - } - } - - page = this.pages[pageNum]; - if (!page) { - return { - num: currentPage, - x: 0, - y: 0, - r: 1, - b: 1, - }; - } - - var x = 0; - if (page.x < 0) x = -page.x / page.w; - - var y = 0; - if (page.y < 0) y = -page.y / page.h; - - var r = 1; - if (page.x + page.w > this.width) - r -= (page.x + page.w - this.width) / page.w; - - var b = 1; - if (page.y + page.h > this.height) - b -= (page.y + page.h - this.height) / page.h; - - return { - num: page.num, - x: x, - y: y, - r: r, - b: b, - }; - }; - - window.AscCommon.CViewer = CHtmlPage; - window.AscCommon.ViewerZoomMode = ZoomMode; - window.AscCommon.CCacheManager = CCacheManager; -})();